From 9dd68dadc467424ccfb6683847b53b4368deab05 Mon Sep 17 00:00:00 2001 From: Manuel Rego Casasnovas Date: Wed, 11 Apr 2012 08:34:29 +0200 Subject: [PATCH 001/108] i18n: Update keys.pot files FEA: ItEr76S03Community --- ganttzk/src/main/resources/i18n/keys.pot | 42 +- .../src/main/resources/i18n/keys.pot | 559 ++++++++++-------- 2 files changed, 334 insertions(+), 267 deletions(-) diff --git a/ganttzk/src/main/resources/i18n/keys.pot b/ganttzk/src/main/resources/i18n/keys.pot index f0bff0848..1a555cf52 100644 --- a/ganttzk/src/main/resources/i18n/keys.pot +++ b/ganttzk/src/main/resources/i18n/keys.pot @@ -7,9 +7,9 @@ #, fuzzy msgid "" msgstr "" -"Project-Id-Version: 1.2.2\n" +"Project-Id-Version: libreplan-1.2.3\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-02-24 09:08+0100\n" +"POT-Creation-Date: 2012-04-11 08:32+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -31,11 +31,15 @@ msgstr "" msgid "Worker" msgstr "" +#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:682 +msgid "Show money cost bar" +msgstr "" + #: ganttzk/src/main/resources/web/ganttz/zul/leftTasksTree.zul:29 msgid "Start" msgstr "" -#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:635 +#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:661 msgid "Show reported hours" msgstr "" @@ -84,6 +88,10 @@ msgstr "" msgid "Criterion" msgstr "" +#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:688 +msgid "Hide money cost bar" +msgstr "" + #: ganttzk/src/main/resources/web/ganttz/zul/plannerLayout.zul:44 msgid "Print" msgstr "" @@ -112,6 +120,10 @@ msgstr "" msgid "changing zoom" msgstr "" +#: ganttzk/src/main/resources/web/ganttz/zul/plannerLayout.zul:91 +msgid "Show/Hide money cost bar" +msgstr "" + #: ganttzk/src/main/java/org/zkoss/ganttz/timetracker/zoom/ZoomLevel.java:45 msgid "Quarter" msgstr "" @@ -137,7 +149,7 @@ msgstr "" msgid "Name filter" msgstr "" -#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:615 +#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:641 msgid "Show progress" msgstr "" @@ -149,14 +161,14 @@ msgstr "" msgid "Show/Hide critical path" msgstr "" -#: ganttzk/src/main/java/org/zkoss/ganttz/timetracker/zoom/ZoomLevel.java:32 -msgid "Year" -msgstr "" - #: ganttzk/src/main/java/org/zkoss/ganttz/resourceload/ResourcesLoadPanel.java:150 msgid "showing criteria" msgstr "" +#: ganttzk/src/main/java/org/zkoss/ganttz/timetracker/zoom/ZoomLevel.java:32 +msgid "Year" +msgstr "" + #: ganttzk/src/main/java/org/zkoss/ganttz/timetracker/zoom/ZoomLevel.java:58 msgid "Month" msgstr "" @@ -169,11 +181,11 @@ msgstr "" msgid "Set End-Start" msgstr "" -#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:297 +#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:308 msgid "decreasing zoom" msgstr "" -#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:596 +#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:622 msgid "Hide critical path" msgstr "" @@ -181,7 +193,7 @@ msgstr "" msgid "Day" msgstr "" -#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:642 +#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:668 msgid "Hide reported hours" msgstr "" @@ -202,7 +214,7 @@ msgid "Hour" msgstr "" #: ganttzk/src/main/resources/web/ganttz/zul/resourcesLoadLayout.zul:90 -#: ganttzk/src/main/resources/web/ganttz/zul/plannerLayout.zul:114 +#: ganttzk/src/main/resources/web/ganttz/zul/plannerLayout.zul:120 msgid "Graphics" msgstr "" @@ -214,7 +226,7 @@ msgstr "" msgid "See resource allocation" msgstr "" -#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:280 +#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:291 msgid "increasing zoom" msgstr "" @@ -230,10 +242,10 @@ msgstr "" msgid "Refresh" msgstr "" -#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:591 +#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:617 msgid "Show critical path" msgstr "" -#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:620 +#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:646 msgid "Hide progress" msgstr "" diff --git a/libreplan-webapp/src/main/resources/i18n/keys.pot b/libreplan-webapp/src/main/resources/i18n/keys.pot index 2616c15e4..d2d466d9d 100644 --- a/libreplan-webapp/src/main/resources/i18n/keys.pot +++ b/libreplan-webapp/src/main/resources/i18n/keys.pot @@ -7,9 +7,9 @@ #, fuzzy msgid "" msgstr "" -"Project-Id-Version: 1.2.2\n" +"Project-Id-Version: libreplan-1.2.3\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-02-24 09:08+0100\n" +"POT-Creation-Date: 2012-04-11 08:32+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -148,7 +148,7 @@ msgstr "" #: libreplan-webapp/src/main/java/org/libreplan/web/common/CustomMenuController.java:324 #: libreplan-webapp/src/main/webapp/materials/materials.zul:33 -#: libreplan-webapp/src/main/webapp/templates/templates.zul:66 +#: libreplan-webapp/src/main/webapp/templates/templates.zul:67 #: libreplan-webapp/src/main/webapp/templates/_editTemplateWindow.zul:52 #: libreplan-webapp/src/main/webapp/templates/_materialAssignmentsBox.zul:22 #: libreplan-webapp/src/main/webapp/orders/_editOrderElement.zul:54 @@ -157,7 +157,7 @@ msgstr "" msgid "Materials" msgstr "" -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/reassign/ReassignCommand.java:361 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/reassign/ReassignCommand.java:357 msgid "Reassign" msgstr "" @@ -198,7 +198,7 @@ msgstr "" #: libreplan-webapp/src/main/java/org/libreplan/web/qualityforms/QualityFormCRUDController.java:344 #: libreplan-webapp/src/main/java/org/libreplan/web/common/CustomMenuController.java:325 -#: libreplan-webapp/src/main/webapp/templates/templates.zul:67 +#: libreplan-webapp/src/main/webapp/templates/templates.zul:68 #: libreplan-webapp/src/main/webapp/templates/_editTemplateWindow.zul:53 msgid "Quality Forms" msgstr "" @@ -207,11 +207,15 @@ msgstr "" msgid "Reports" msgstr "" +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/assigntemplates/TemplateFinderPopup.java:117 +msgid "Create task" +msgstr "" + #: libreplan-webapp/src/main/webapp/planner/advance_allocation.zul:22 msgid "LibrePlan: Advanced allocation" msgstr "" -#: libreplan-webapp/src/main/java/org/libreplan/web/common/ConfigurationModel.java:172 +#: libreplan-webapp/src/main/java/org/libreplan/web/common/ConfigurationModel.java:177 msgid "The {0} sequence prefixes can not be repeated" msgstr "" @@ -298,7 +302,7 @@ msgid "generic workers allocation" msgstr "" #: libreplan-webapp/src/main/java/org/libreplan/web/resourceload/ResourceLoadController.java:310 -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:895 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:899 msgid "The project has no scheduled elements" msgstr "" @@ -376,17 +380,17 @@ msgstr "" msgid "Project Name" msgstr "" -#: libreplan-webapp/src/main/java/org/libreplan/web/tree/TreeController.java:967 +#: libreplan-webapp/src/main/java/org/libreplan/web/tree/TreeController.java:1084 #: libreplan-webapp/src/main/java/org/libreplan/web/resources/criterion/CriterionTreeController.java:306 msgid "Indent" msgstr "" -#: libreplan-webapp/src/main/webapp/common/configuration.zul:327 -msgid "Save passwords in database" +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/reassign/ReassignCommand.java:252 +msgid "Reassignation" msgstr "" -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/reassign/ReassignCommand.java:256 -msgid "Reassignation" +#: libreplan-webapp/src/main/webapp/common/configuration.zul:327 +msgid "Save passwords in database" msgstr "" #: libreplan-webapp/src/main/java/org/libreplan/web/templates/TemplatesTree.java:42 @@ -457,7 +461,7 @@ msgid "" "applicable to this resource" msgstr "" -#: libreplan-webapp/src/main/webapp/templates/templates.zul:65 +#: libreplan-webapp/src/main/webapp/templates/templates.zul:66 #: libreplan-webapp/src/main/webapp/orders/_editOrderElement.zul:52 #: libreplan-webapp/src/main/webapp/orders/_edition.zul:50 msgid "Criterion Requirement" @@ -592,7 +596,7 @@ msgstr "" msgid "First name" msgstr "" -#: libreplan-webapp/src/main/java/org/libreplan/web/print/CutyPrint.java:256 +#: libreplan-webapp/src/main/java/org/libreplan/web/print/CutyPrint.java:250 msgid "Could not execute print command" msgstr "" @@ -605,7 +609,7 @@ msgstr "" #: libreplan-webapp/src/main/java/org/libreplan/web/workreports/WorkReportCRUDController.java:1226 #: libreplan-webapp/src/main/java/org/libreplan/web/calendars/BaseCalendarCRUDController.java:452 #: libreplan-webapp/src/main/java/org/libreplan/web/orders/AssignedTaskQualityFormsToOrderElementController.java:200 -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:832 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:836 msgid "Confirm deleting {0}. Are you sure?" msgstr "" @@ -732,7 +736,7 @@ msgstr "" msgid "The task code cannot be null" msgstr "" -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderElementTreeController.java:594 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderElementTreeController.java:596 #: libreplan-webapp/src/main/java/org/libreplan/web/common/CustomMenuController.java:329 #: libreplan-webapp/src/main/webapp/planner/taskpanels/_taskInformation.zul:32 #: libreplan-webapp/src/main/webapp/resources/search/allocation_selector.zul:39 @@ -809,7 +813,7 @@ msgstr "" msgid "{0} annotation required on {1}" msgstr "" -#: libreplan-webapp/src/main/java/org/libreplan/web/tree/TreeController.java:1067 +#: libreplan-webapp/src/main/java/org/libreplan/web/tree/TreeController.java:1193 msgid "Modified" msgstr "" @@ -874,7 +878,7 @@ msgstr "" msgid "Work done from starting date" msgstr "" -#: libreplan-webapp/src/main/webapp/templates/templates.zul:69 +#: libreplan-webapp/src/main/webapp/templates/templates.zul:70 msgid "Statistics log" msgstr "" @@ -883,7 +887,7 @@ msgstr "" msgid "Edit Calendar" msgstr "" -#: libreplan-webapp/src/main/java/org/libreplan/web/users/ProfileCRUDController.java:112 +#: libreplan-webapp/src/main/java/org/libreplan/web/users/ProfileCRUDController.java:117 msgid "Profile" msgstr "" @@ -906,7 +910,7 @@ msgstr "" msgid "{0} \"{1}\" saved" msgstr "" -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/OrderPlanningController.java:299 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/OrderPlanningController.java:301 msgid "filtering" msgstr "" @@ -963,6 +967,12 @@ msgstr "" msgid "add" msgstr "" +#: libreplan-webapp/src/main/java/org/libreplan/web/tree/TreeController.java:860 +#: libreplan-webapp/src/main/webapp/templates/templates.zul:111 +#: libreplan-webapp/src/main/webapp/orders/_orderElementDetails.zul:69 +msgid "Budget value cannot be negative" +msgstr "" + #: libreplan-webapp/src/main/java/org/libreplan/web/orders/TreeElementOperationsController.java:239 msgid "Unsaved changes will be lost. Would you like to continue?" msgstr "" @@ -1040,8 +1050,8 @@ msgstr "" msgid "Exception end date should be greater or equals than start date" msgstr "" -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/SaveCommandBuilder.java:476 -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/SaveCommandBuilder.java:486 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/SaveCommandBuilder.java:474 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/SaveCommandBuilder.java:484 msgid "Repeated Project code {0} in Project {1}" msgstr "" @@ -1071,7 +1081,7 @@ msgstr "" msgid "Type data" msgstr "" -#: libreplan-webapp/src/main/java/org/libreplan/web/users/ProfileCRUDController.java:117 +#: libreplan-webapp/src/main/java/org/libreplan/web/users/ProfileCRUDController.java:122 #: libreplan-webapp/src/main/java/org/libreplan/web/common/CustomMenuController.java:322 msgid "Profiles" msgstr "" @@ -1216,13 +1226,13 @@ msgstr "" msgid "both {0} of category {1} and {2} of category {3} have the same code" msgstr "" -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/TaskElementAdapter.java:958 -#: libreplan-webapp/src/main/java/org/libreplan/web/templates/TemplatesTreeController.java:236 -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderModel.java:690 -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderElementTreeController.java:581 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/TaskElementAdapter.java:1039 +#: libreplan-webapp/src/main/java/org/libreplan/web/templates/TemplatesTreeController.java:240 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderModel.java:696 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderElementTreeController.java:583 #: libreplan-webapp/src/main/java/org/libreplan/web/common/CustomMenuController.java:331 #: libreplan-webapp/src/main/webapp/planner/taskpanels/_tabPanelSubcontract.zul:68 -#: libreplan-webapp/src/main/webapp/templates/templates.zul:64 +#: libreplan-webapp/src/main/webapp/templates/templates.zul:65 #: libreplan-webapp/src/main/webapp/templates/_editTemplateWindow.zul:50 #: libreplan-webapp/src/main/webapp/orders/_editOrderElement.zul:50 msgid "Labels" @@ -1232,7 +1242,7 @@ msgstr "" msgid "Data Types" msgstr "" -#: libreplan-webapp/src/main/webapp/orders/_edition.zul:157 +#: libreplan-webapp/src/main/webapp/orders/_edition.zul:161 #: libreplan-webapp/src/main/webapp/orders/_listOrderElementHours.zul:68 msgid "Total hours" msgstr "" @@ -1249,8 +1259,8 @@ msgstr "" msgid "Filter by task status" msgstr "" -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/OrderPlanningModel.java:528 -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/company/CompanyPlanningModel.java:419 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/OrderPlanningModel.java:529 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/company/CompanyPlanningModel.java:416 msgid "Select date" msgstr "" @@ -1267,19 +1277,23 @@ msgstr "" msgid "Company code" msgstr "" +#: libreplan-webapp/src/main/webapp/orders/_listOrderElementHours.zul:62 +msgid "Sum of imputed hours in children tasks" +msgstr "" + #: libreplan-webapp/src/main/java/org/libreplan/web/common/components/TwoWaySelector.java:110 msgid "Unknown attribute '{0}' in class {1}" msgstr "" +#: libreplan-webapp/src/main/java/org/libreplan/web/users/settings/PasswordController.java:96 +msgid "passwords can not be empty" +msgstr "" + #: libreplan-webapp/src/main/java/org/libreplan/web/resources/worker/WorkerCRUDController.java:699 #: libreplan-business/src/main/java/org/libreplan/business/resources/entities/ResourceType.java:33 msgid "NON LIMITING RESOURCE" msgstr "" -#: libreplan-webapp/src/main/java/org/libreplan/web/users/settings/PasswordController.java:96 -msgid "passwords can not be empty" -msgstr "" - #: libreplan-webapp/src/main/java/org/libreplan/web/orders/labels/AssignedLabelsController.java:88 #: libreplan-webapp/src/main/java/org/libreplan/web/orders/labels/AssignedLabelsController.java:128 #: libreplan-webapp/src/main/java/org/libreplan/web/orders/AssignedTaskQualityFormsToOrderElementController.java:176 @@ -1428,11 +1442,15 @@ msgstr "" msgid "Enable scenarios module" msgstr "" +#: libreplan-webapp/src/main/java/org/libreplan/web/calendars/BaseCalendarEditionController.java:312 +msgid "to {0}" +msgstr "" + #: libreplan-webapp/src/main/webapp/limitingresources/limitingResourcesLayout.zul:59 msgid "Zoom" msgstr "" -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/SaveCommandBuilder.java:865 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/SaveCommandBuilder.java:863 #: libreplan-webapp/src/main/webapp/labels/_editLabelType.zul:112 #: libreplan-webapp/src/main/webapp/advance/advanceTypes.zul:37 #: libreplan-webapp/src/main/webapp/excetiondays/_editExceptionDayType.zul:91 @@ -1448,9 +1466,9 @@ msgstr "" #: libreplan-webapp/src/main/webapp/qualityforms/_editQualityForm.zul:131 #: libreplan-webapp/src/main/webapp/settings/changePassword.zul:81 #: libreplan-webapp/src/main/webapp/settings/settings.zul:124 -#: libreplan-webapp/src/main/webapp/users/_editProfile.zul:81 -#: libreplan-webapp/src/main/webapp/users/_editUser.zul:162 -#: libreplan-webapp/src/main/webapp/templates/templates.zul:135 +#: libreplan-webapp/src/main/webapp/users/_editProfile.zul:70 +#: libreplan-webapp/src/main/webapp/users/_editUser.zul:151 +#: libreplan-webapp/src/main/webapp/templates/templates.zul:143 #: libreplan-webapp/src/main/webapp/calendars/calendars.zul:44 #: libreplan-webapp/src/main/webapp/resources/worker/virtualWorkers.zul:40 #: libreplan-webapp/src/main/webapp/resources/worker/worker.zul:41 @@ -1509,7 +1527,7 @@ msgstr "" msgid "Entity type" msgstr "" -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/OrderPlanningModel.java:1101 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/OrderPlanningModel.java:1127 #: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:268 msgid "Unsaved changes will be lost. Are you sure?" msgstr "" @@ -1550,13 +1568,13 @@ msgstr "" msgid "ResourceType must be not-null" msgstr "" -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrdersTreeComponent.java:95 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrdersTreeComponent.java:105 msgid "" "Estimated end date for the task (press enter in textbox to open calendar " "popup or type in date directly)" msgstr "" -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderElementTreeController.java:292 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderElementTreeController.java:293 msgid "Expand/Collapse all" msgstr "" @@ -1564,11 +1582,11 @@ msgstr "" msgid "Overload due to current project" msgstr "" -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/TaskElementAdapter.java:946 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/TaskElementAdapter.java:1017 msgid "Name: {0}" msgstr "" -#: libreplan-webapp/src/main/java/org/libreplan/web/tree/TreeController.java:903 +#: libreplan-webapp/src/main/java/org/libreplan/web/tree/TreeController.java:1020 msgid "Move down" msgstr "" @@ -1615,7 +1633,7 @@ msgstr "" msgid "missing code in a criterion" msgstr "" -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:1278 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:1282 msgid "Create Template" msgstr "" @@ -1632,7 +1650,7 @@ msgstr "" msgid "Filter by labels" msgstr "" -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/taskedition/TaskPropertiesController.java:577 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/taskedition/TaskPropertiesController.java:586 msgid "" "IMPORTANT: Don't forget to communicate to subcontractor that his contract " "has been cancelled" @@ -1663,10 +1681,10 @@ msgstr "" #: libreplan-webapp/src/main/java/org/libreplan/web/costcategories/TypeOfWorkHoursCRUDController.java:103 #: libreplan-webapp/src/main/java/org/libreplan/web/qualityforms/QualityFormCRUDController.java:391 #: libreplan-webapp/src/main/java/org/libreplan/web/planner/taskedition/AdvancedAllocationTaskController.java:73 -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/taskedition/TaskPropertiesController.java:509 -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/taskedition/TaskPropertiesController.java:547 -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/taskedition/TaskPropertiesController.java:578 -#: libreplan-webapp/src/main/java/org/libreplan/web/users/ProfileCRUDController.java:148 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/taskedition/TaskPropertiesController.java:518 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/taskedition/TaskPropertiesController.java:556 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/taskedition/TaskPropertiesController.java:587 +#: libreplan-webapp/src/main/java/org/libreplan/web/users/ProfileCRUDController.java:153 #: libreplan-webapp/src/main/java/org/libreplan/web/calendars/BaseCalendarCRUDController.java:476 msgid "Warning" msgstr "" @@ -1783,8 +1801,8 @@ msgstr "" msgid "Add From Template" msgstr "" -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/taskedition/TaskPropertiesController.java:508 -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/taskedition/TaskPropertiesController.java:546 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/taskedition/TaskPropertiesController.java:517 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/taskedition/TaskPropertiesController.java:555 msgid "Assigned resources for this task will be deleted. Are you sure?" msgstr "" @@ -1819,7 +1837,7 @@ msgstr "" msgid "Enable LDAP authentication" msgstr "" -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/consolidations/AdvanceConsolidationModel.java:493 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/consolidations/AdvanceConsolidationModel.java:490 msgid "( max: {0} )" msgstr "" @@ -1840,7 +1858,7 @@ msgid "Cannot calculate charts for current data" msgstr "" #: libreplan-webapp/src/main/java/org/libreplan/web/orders/ProjectDetailsController.java:176 -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:1495 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:1499 msgid "project name already being used" msgstr "" @@ -1857,7 +1875,7 @@ msgstr "" msgid "You can not remove the default scenario called \"{0}\"" msgstr "" -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/consolidations/AdvanceConsolidationModel.java:522 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/consolidations/AdvanceConsolidationModel.java:519 msgid "There are not any assigned progress to current task" msgstr "" @@ -1886,7 +1904,7 @@ msgstr "" msgid "Label" msgstr "" -#: libreplan-webapp/src/main/java/org/libreplan/web/tree/TreeController.java:870 +#: libreplan-webapp/src/main/java/org/libreplan/web/tree/TreeController.java:987 msgid "Value is not valid, taking into account the current list of HoursGroup" msgstr "" @@ -1903,8 +1921,8 @@ msgstr "" msgid "Quality forms" msgstr "" -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/SaveCommandBuilder.java:499 -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/SaveCommandBuilder.java:509 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/SaveCommandBuilder.java:497 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/SaveCommandBuilder.java:507 msgid "Repeated Hours Group code {0} in Project {1}" msgstr "" @@ -1916,7 +1934,7 @@ msgstr "" msgid "LibrePlan: Accounts" msgstr "" -#: libreplan-webapp/src/main/webapp/templates/templates.zul:96 +#: libreplan-webapp/src/main/webapp/templates/templates.zul:97 #: libreplan-webapp/src/main/webapp/templates/_list.zul:30 msgid "Days from Beginning to Deadline" msgstr "" @@ -1949,7 +1967,7 @@ msgstr "" msgid "Pessimistic" msgstr "" -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/taskedition/TaskPropertiesController.java:376 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/taskedition/TaskPropertiesController.java:385 msgid "Limiting resource assignation" msgstr "" @@ -1980,7 +1998,7 @@ msgstr "" msgid "Entity sequences" msgstr "" -#: libreplan-webapp/src/main/webapp/templates/templates.zul:91 +#: libreplan-webapp/src/main/webapp/templates/templates.zul:92 #: libreplan-webapp/src/main/webapp/templates/_list.zul:28 msgid "Delay from beginning (days)" msgstr "" @@ -2010,7 +2028,7 @@ msgstr "" msgid "Work And Progress Per Task" msgstr "" -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:1519 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:1523 msgid "project code already being used" msgstr "" @@ -2029,8 +2047,8 @@ msgstr "" #: libreplan-webapp/src/main/java/org/libreplan/web/calendars/BaseCalendarCRUDController.java:457 #: libreplan-webapp/src/main/java/org/libreplan/web/orders/AssignedTaskQualityFormsToOrderElementController.java:208 #: libreplan-webapp/src/main/java/org/libreplan/web/orders/criterionrequirements/AssignedCriterionRequirementController.java:264 -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:840 -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:875 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:844 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:879 msgid "Error on showing removing element: " msgstr "" @@ -2091,7 +2109,7 @@ msgid "Overload" msgstr "" #: libreplan-webapp/src/main/webapp/templates/_historicalAssignment.zul:30 -#: libreplan-webapp/src/main/webapp/templates/templates.zul:68 +#: libreplan-webapp/src/main/webapp/templates/templates.zul:69 msgid "Assignment log" msgstr "" @@ -2100,10 +2118,6 @@ msgstr "" msgid "Work Report Models" msgstr "" -#: libreplan-webapp/src/main/java/org/libreplan/web/print/CutyCaptTimeout.java:45 -msgid "CutycaptTimeout thread exception" -msgstr "" - #: libreplan-webapp/src/main/webapp/materials/materials.zul:73 msgid "New" msgstr "" @@ -2112,7 +2126,7 @@ msgstr "" msgid "Date last progress measurement" msgstr "" -#: libreplan-webapp/src/main/java/org/libreplan/web/templates/TemplatesTreeComponent.java:103 +#: libreplan-webapp/src/main/java/org/libreplan/web/templates/TemplatesTreeComponent.java:112 msgid "Deadline (days since beggining project)" msgstr "" @@ -2142,12 +2156,12 @@ msgstr "" msgid "Task code cannot be null" msgstr "" -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/consolidations/AdvanceConsolidationModel.java:520 -msgid "It is not allowed to consolidate progress." +#: libreplan-webapp/src/main/java/org/libreplan/web/calendars/BaseCalendarEditionController.java:302 +msgid "Derived of calendar {0}" msgstr "" -#: libreplan-webapp/src/main/webapp/orders/components/_orderElementTree.zul:32 -msgid "Create Task" +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/consolidations/AdvanceConsolidationModel.java:517 +msgid "It is not allowed to consolidate progress." msgstr "" #: libreplan-webapp/src/main/webapp/planner/taskpanels/_tabPanelSubcontract.zul:27 @@ -2158,10 +2172,10 @@ msgstr "" #: libreplan-webapp/src/main/webapp/costcategories/_listTypesOfWorkHours.zul:30 #: libreplan-webapp/src/main/webapp/costcategories/_listCostCategories.zul:28 #: libreplan-webapp/src/main/webapp/users/_listUsers.zul:30 -#: libreplan-webapp/src/main/webapp/users/_editProfile.zul:60 +#: libreplan-webapp/src/main/webapp/users/_editProfile.zul:61 #: libreplan-webapp/src/main/webapp/users/_listProfiles.zul:27 -#: libreplan-webapp/src/main/webapp/users/_editUser.zul:107 -#: libreplan-webapp/src/main/webapp/users/_editUser.zul:140 +#: libreplan-webapp/src/main/webapp/users/_editUser.zul:108 +#: libreplan-webapp/src/main/webapp/users/_editUser.zul:129 #: libreplan-webapp/src/main/webapp/orders/_listOrderElementAuthorizations.zul:44 #: libreplan-webapp/src/main/webapp/orders/_listOrderElementAuthorizations.zul:68 msgid "Actions" @@ -2234,11 +2248,15 @@ msgstr "" msgid "Hours Group" msgstr "" +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/TaskElementAdapter.java:1029 +msgid "Budget: {0}€, Consumed: {1}€ ({2}%)" +msgstr "" + #: libreplan-webapp/src/main/java/org/libreplan/web/workreports/WorkReportTypeCRUDController.java:825 msgid "Unallocated name" msgstr "" -#: libreplan-webapp/src/main/java/org/libreplan/web/tree/TreeController.java:924 +#: libreplan-webapp/src/main/java/org/libreplan/web/tree/TreeController.java:1041 msgid "Move up" msgstr "" @@ -2252,7 +2270,7 @@ msgstr "" #: libreplan-webapp/src/main/java/org/libreplan/web/planner/tabs/MultipleTabsPlannerController.java:131 #: libreplan-webapp/src/main/java/org/libreplan/web/planner/tabs/MultipleTabsPlannerController.java:134 -#: libreplan-webapp/src/main/java/org/libreplan/web/templates/OrderTemplatesController.java:281 +#: libreplan-webapp/src/main/java/org/libreplan/web/templates/OrderTemplatesController.java:301 #: libreplan-webapp/src/main/java/org/libreplan/web/common/CustomMenuController.java:269 #: libreplan-webapp/src/main/java/org/libreplan/web/common/CustomMenuController.java:367 msgid "Scheduling" @@ -2288,17 +2306,17 @@ msgstr "" msgid "Create new project" msgstr "" -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/TaskElementAdapter.java:954 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/TaskElementAdapter.java:1026 #: libreplan-webapp/src/main/java/org/libreplan/web/common/components/finders/TaskGroupFilterEnum.java:31 #: libreplan-webapp/src/main/java/org/libreplan/web/common/components/finders/OrderFilterEnum.java:31 #: libreplan-webapp/src/main/webapp/subcontract/subcontractedTasks.zul:53 #: libreplan-webapp/src/main/webapp/subcontract/reportAdvances.zul:50 -#: libreplan-webapp/src/main/webapp/orders/_edition.zul:161 +#: libreplan-webapp/src/main/webapp/orders/_edition.zul:165 #: libreplan-webapp/src/main/webapp/orders/_list.zul:35 msgid "State" msgstr "" -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrdersTreeComponent.java:80 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrdersTreeComponent.java:90 msgid "Must start after" msgstr "" @@ -2306,7 +2324,7 @@ msgstr "" msgid "Confirm change" msgstr "" -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:845 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:849 msgid "You don't have permissions to edit this project" msgstr "" @@ -2345,7 +2363,7 @@ msgstr "" msgid "New task" msgstr "" -#: libreplan-webapp/src/main/java/org/libreplan/web/users/UserCRUDController.java:191 +#: libreplan-webapp/src/main/java/org/libreplan/web/users/UserCRUDController.java:197 msgid "The password for a new user cannot be empty" msgstr "" @@ -2397,7 +2415,7 @@ msgstr "" msgid "Workers List" msgstr "" -#: libreplan-webapp/src/main/java/org/libreplan/web/templates/OrderTemplatesController.java:355 +#: libreplan-webapp/src/main/java/org/libreplan/web/templates/OrderTemplatesController.java:375 msgid "Delete project template. Are you sure?" msgstr "" @@ -2478,18 +2496,18 @@ msgstr "" msgid "Tasks input buffer" msgstr "" -#: libreplan-webapp/src/main/java/org/libreplan/web/common/ConfigurationModel.java:168 +#: libreplan-webapp/src/main/java/org/libreplan/web/common/ConfigurationModel.java:173 msgid "At least one {0} sequence must be active" msgstr "" #: libreplan-webapp/src/main/webapp/users/_listProfiles.zul:26 -#: libreplan-webapp/src/main/webapp/users/_editUser.zul:139 +#: libreplan-webapp/src/main/webapp/users/_editUser.zul:128 #: libreplan-webapp/src/main/webapp/orders/_listOrderElementAuthorizations.zul:42 #: libreplan-webapp/src/main/webapp/orders/_listOrderElementAuthorizations.zul:66 msgid "Profile name" msgstr "" -#: libreplan-webapp/src/main/java/org/libreplan/web/print/CutyPrint.java:252 +#: libreplan-webapp/src/main/java/org/libreplan/web/print/CutyPrint.java:246 msgid "Could open generated PDF" msgstr "" @@ -2501,7 +2519,7 @@ msgstr "" msgid "You should select a source scenario" msgstr "" -#: libreplan-webapp/src/main/java/org/libreplan/web/common/ConfigurationModel.java:163 +#: libreplan-webapp/src/main/java/org/libreplan/web/common/ConfigurationModel.java:168 msgid "At least one {0} sequence is needed" msgstr "" @@ -2536,17 +2554,17 @@ msgid "" "to generate usage statistics" msgstr "" -#: libreplan-webapp/src/main/webapp/resources/search/_resourceFilter.zul:36 -msgid "More options" +#: libreplan-webapp/src/main/java/org/libreplan/web/subcontract/ReportAdvancesModel.java:219 +#: libreplan-webapp/src/main/java/org/libreplan/web/subcontract/SubcontractedTasksModel.java:179 +msgid "Error: {0}" msgstr "" #: libreplan-webapp/src/main/webapp/subcontract/subcontractedTasks.zul:45 msgid "Communication" msgstr "" -#: libreplan-webapp/src/main/java/org/libreplan/web/subcontract/ReportAdvancesModel.java:219 -#: libreplan-webapp/src/main/java/org/libreplan/web/subcontract/SubcontractedTasksModel.java:179 -msgid "Error: {0}" +#: libreplan-webapp/src/main/webapp/resources/search/_resourceFilter.zul:36 +msgid "More options" msgstr "" #: libreplan-webapp/src/main/java/org/libreplan/web/orders/TreeElementOperationsController.java:240 @@ -2579,7 +2597,7 @@ msgstr "" msgid "Projects" msgstr "" -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/OrderPlanningModel.java:1102 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/OrderPlanningModel.java:1128 #: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:269 msgid "Confirm exit dialog" msgstr "" @@ -2657,7 +2675,7 @@ msgstr "" msgid "Output format" msgstr "" -#: libreplan-webapp/src/main/webapp/planner/print_configuration.zul:47 +#: libreplan-webapp/src/main/webapp/planner/print_configuration.zul:49 msgid "Print" msgstr "" @@ -2677,8 +2695,8 @@ msgstr "" msgid "Effort cannot be null" msgstr "" -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/OrderPlanningModel.java:1093 -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/assigntemplates/TemplateFinderPopup.java:52 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/OrderPlanningModel.java:1119 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/assigntemplates/TemplateFinderPopup.java:126 #: libreplan-webapp/src/main/webapp/labels/_editLabelType.zul:116 #: libreplan-webapp/src/main/webapp/excetiondays/_editExceptionDayType.zul:97 #: libreplan-webapp/src/main/webapp/externalcompanies/_editExternalCompany.zul:106 @@ -2690,16 +2708,16 @@ msgstr "" #: libreplan-webapp/src/main/webapp/costcategories/_editCostCategory.zul:98 #: libreplan-webapp/src/main/webapp/costcategories/_editTypeOfWorkHours.zul:80 #: libreplan-webapp/src/main/webapp/qualityforms/_editQualityForm.zul:137 -#: libreplan-webapp/src/main/webapp/planner/print_configuration.zul:48 +#: libreplan-webapp/src/main/webapp/planner/print_configuration.zul:50 #: libreplan-webapp/src/main/webapp/planner/editTask.zul:81 #: libreplan-webapp/src/main/webapp/planner/reassign.zul:50 #: libreplan-webapp/src/main/webapp/planner/stretches_function.zul:91 #: libreplan-webapp/src/main/webapp/planner/advance_allocation.zul:42 #: libreplan-webapp/src/main/webapp/planner/order.zul:131 #: libreplan-webapp/src/main/webapp/planner/order.zul:166 -#: libreplan-webapp/src/main/webapp/users/_editProfile.zul:85 -#: libreplan-webapp/src/main/webapp/users/_editUser.zul:166 -#: libreplan-webapp/src/main/webapp/templates/templates.zul:139 +#: libreplan-webapp/src/main/webapp/users/_editProfile.zul:74 +#: libreplan-webapp/src/main/webapp/users/_editUser.zul:155 +#: libreplan-webapp/src/main/webapp/templates/templates.zul:147 #: libreplan-webapp/src/main/webapp/calendars/_createNewVersion.zul:58 #: libreplan-webapp/src/main/webapp/calendars/calendars.zul:47 #: libreplan-webapp/src/main/webapp/resources/machine/_editMachine.zul:103 @@ -2735,8 +2753,8 @@ msgid "Machines List" msgstr "" #: libreplan-webapp/src/main/java/org/libreplan/web/resourceload/ResourceLoadController.java:320 -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:692 -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:904 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:696 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:908 msgid "You don't have read access to this project" msgstr "" @@ -2812,7 +2830,7 @@ msgstr "" msgid "Cost Category" msgstr "" -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderElementTreeController.java:471 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderElementTreeController.java:473 msgid "end" msgstr "" @@ -2833,7 +2851,7 @@ msgstr "" msgid "Continue" msgstr "" -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderElementController.java:121 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderElementController.java:122 msgid "Edit task {0}" msgstr "" @@ -2866,7 +2884,7 @@ msgstr "" msgid "Add criterion requirement" msgstr "" -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:860 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:864 msgid "" "You can not remove the project \"{0}\" because of any of its tasks are " "already in use in some work reports and the project just exists in the " @@ -2906,7 +2924,7 @@ msgstr "" msgid "please, select a label" msgstr "" -#: libreplan-webapp/src/main/webapp/users/_editUser.zul:134 +#: libreplan-webapp/src/main/webapp/users/_editUser.zul:123 msgid "Add profile" msgstr "" @@ -2985,8 +3003,8 @@ msgstr "" msgid "Disabled" msgstr "" -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/OrderPlanningModel.java:738 -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/company/CompanyPlanningModel.java:325 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/OrderPlanningModel.java:764 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/company/CompanyPlanningModel.java:322 msgid "Earned value" msgstr "" @@ -3016,8 +3034,8 @@ msgid "" "Please save your project before proceeding." msgstr "" -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/TaskElementAdapter.java:1163 -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/TaskElementAdapter.java:1178 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/TaskElementAdapter.java:1243 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/TaskElementAdapter.java:1258 msgid "{0} not supported yet" msgstr "" @@ -3039,7 +3057,7 @@ msgstr "" msgid "Resources Load" msgstr "" -#: libreplan-webapp/src/main/java/org/libreplan/web/common/ConfigurationModel.java:220 +#: libreplan-webapp/src/main/java/org/libreplan/web/common/ConfigurationModel.java:225 msgid "Some sequences to remove not existed" msgstr "" @@ -3114,11 +3132,11 @@ msgid "Select start date" msgstr "" #: libreplan-webapp/src/main/java/org/libreplan/web/costcategories/TypeOfWorkHoursCRUDController.java:106 -#: libreplan-webapp/src/main/java/org/libreplan/web/users/ProfileCRUDController.java:152 +#: libreplan-webapp/src/main/java/org/libreplan/web/users/ProfileCRUDController.java:157 msgid "Error on showing warning message removing typeOfWorkHours: " msgstr "" -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:882 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:886 msgid "Removed {0}" msgstr "" @@ -3130,8 +3148,8 @@ msgstr "" msgid "Group name" msgstr "" -#: libreplan-webapp/src/main/webapp/users/_editProfile.zul:59 -#: libreplan-webapp/src/main/webapp/users/_editUser.zul:106 +#: libreplan-webapp/src/main/webapp/users/_editProfile.zul:60 +#: libreplan-webapp/src/main/webapp/users/_editUser.zul:107 msgid "Role name" msgstr "" @@ -3147,8 +3165,8 @@ msgstr "" msgid "Value is not valid, the precision value must not be empty" msgstr "" -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/OrderPlanningModel.java:863 -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/company/CompanyPlanningModel.java:473 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/OrderPlanningModel.java:889 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/company/CompanyPlanningModel.java:470 msgid "h" msgstr "" @@ -3173,7 +3191,7 @@ msgstr "" msgid "Assign selected items" msgstr "" -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderElementTreeController.java:450 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderElementTreeController.java:452 msgid "init" msgstr "" @@ -3250,6 +3268,10 @@ msgstr "" msgid "Hours type" msgstr "" +#: libreplan-webapp/src/main/webapp/planner/print_configuration.zul:43 +msgid "Show money cost bar" +msgstr "" + #: libreplan-webapp/src/main/java/org/libreplan/ws/resources/impl/ResourceConverter.java:156 #: libreplan-business/src/main/java/org/libreplan/business/resources/entities/CriterionType.java:211 msgid "criterion type name not specified" @@ -3263,11 +3285,11 @@ msgstr "" msgid "Add Exception" msgstr "" -#: libreplan-webapp/src/main/java/org/libreplan/web/tree/TreeController.java:220 +#: libreplan-webapp/src/main/java/org/libreplan/web/tree/TreeController.java:222 #: libreplan-webapp/src/main/java/org/libreplan/web/qualityforms/QualityFormCRUDController.java:202 #: libreplan-webapp/src/main/java/org/libreplan/web/qualityforms/QualityFormCRUDController.java:223 #: libreplan-webapp/src/main/java/org/libreplan/web/qualityforms/QualityFormCRUDController.java:247 -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderElementTreeController.java:378 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderElementTreeController.java:379 msgid "cannot be empty" msgstr "" @@ -3391,7 +3413,7 @@ msgstr "" #: libreplan-webapp/src/main/webapp/reports/workingArrangementsPerOrderReport.zul:145 #: libreplan-webapp/src/main/webapp/reports/timeLineMaterialReport.zul:94 #: libreplan-webapp/src/main/webapp/users/_editProfile.zul:40 -#: libreplan-webapp/src/main/webapp/templates/templates.zul:80 +#: libreplan-webapp/src/main/webapp/templates/templates.zul:81 #: libreplan-webapp/src/main/webapp/templates/_list.zul:27 #: libreplan-webapp/src/main/webapp/templates/_assignedQualityForms.zul:48 #: libreplan-webapp/src/main/webapp/subcontract/reportAdvances.zul:45 @@ -3460,7 +3482,7 @@ msgstr "" msgid "The end date cannot be before the init date" msgstr "" -#: libreplan-webapp/src/main/webapp/users/_editUser.zul:128 +#: libreplan-webapp/src/main/webapp/users/_editUser.zul:117 msgid "" "Profiles of LDAP users cannot be managed because LDAP roles are being used." msgstr "" @@ -3556,7 +3578,7 @@ msgstr "" msgid "Changes saved" msgstr "" -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:1263 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:1267 msgid "See scheduling" msgstr "" @@ -3585,7 +3607,7 @@ msgid "Work report saved" msgstr "" #: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/SubcontractCommand.java:53 -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/taskedition/TaskPropertiesController.java:377 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/taskedition/TaskPropertiesController.java:386 #: libreplan-webapp/src/main/webapp/planner/editTask.zul:68 msgid "Subcontract" msgstr "" @@ -3621,10 +3643,6 @@ msgstr "" msgid "April" msgstr "" -#: libreplan-webapp/src/main/java/org/libreplan/web/calendars/BaseCalendarEditionController.java:302 -msgid "Derived of Calendar " -msgstr "" - #: libreplan-webapp/src/main/webapp/users/_listUsers.zul:22 msgid "Users List" msgstr "" @@ -3682,14 +3700,14 @@ msgstr "" msgid "Unindent selected task" msgstr "" -#: libreplan-webapp/src/main/webapp/planner/taskpanels/_tabPanelTaskProperties.zul:62 -msgid "Constraint" -msgstr "" - #: libreplan-webapp/src/main/webapp/subcontract/reportAdvances.zul:44 msgid "Customer reference code" msgstr "" +#: libreplan-webapp/src/main/webapp/planner/taskpanels/_tabPanelTaskProperties.zul:66 +msgid "Constraint" +msgstr "" + #: libreplan-webapp/src/main/webapp/workreports/_editWorkReportType.zul:150 msgid "Add New Label Type Field" msgstr "" @@ -3708,16 +3726,16 @@ msgstr "" #: libreplan-webapp/src/main/java/org/libreplan/web/templates/historicalAssignment/OrderElementHistoricalAssignmentComponent.java:146 #: libreplan-webapp/src/main/java/org/libreplan/web/resourceload/ResourceLoadController.java:311 #: libreplan-webapp/src/main/java/org/libreplan/web/resourceload/ResourceLoadController.java:321 -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:693 -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:846 -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:896 -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:905 -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:932 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:697 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:850 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:900 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:909 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:936 #: libreplan-webapp/src/main/java/org/libreplan/web/limitingresources/LimitingResourcesController.java:333 msgid "Information" msgstr "" -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:931 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:935 msgid "Sorry, you do not have permissions to access this project" msgstr "" @@ -3741,7 +3759,7 @@ msgstr "" msgid "Assign element to queue manually" msgstr "" -#: libreplan-webapp/src/main/webapp/planner/print_configuration.zul:45 +#: libreplan-webapp/src/main/webapp/planner/print_configuration.zul:47 msgid "Please remember that only saved changes will be printed" msgstr "" @@ -3786,6 +3804,10 @@ msgstr "" msgid "Unable to convert value to {0} type" msgstr "" +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrdersTreeComponent.java:81 +msgid "Total task budget" +msgstr "" + #: libreplan-webapp/src/main/java/org/libreplan/web/resources/worker/WorkerModel.java:222 msgid "Worker must be not-null" msgstr "" @@ -3794,14 +3816,14 @@ msgstr "" msgid "Some criterion satisfactions overlap in time" msgstr "" -#: libreplan-webapp/src/main/webapp/reports/timeLineMaterialReport.zul:21 -msgid "LibrePlan: Materials Needs At Date" -msgstr "" - #: libreplan-webapp/src/main/webapp/subcontract/reportAdvances.zul:49 msgid "Value last progress measurement" msgstr "" +#: libreplan-webapp/src/main/webapp/reports/timeLineMaterialReport.zul:21 +msgid "LibrePlan: Materials Needs At Date" +msgstr "" + #: libreplan-webapp/src/main/webapp/resources/machine/_machineConfigurationUnits.zul:44 msgid "Worker assignments" msgstr "" @@ -4030,7 +4052,7 @@ msgid "Check consolidated progresses" msgstr "" #: libreplan-webapp/src/main/java/org/libreplan/web/workreports/WorkReportCRUDController.java:1469 -#: libreplan-webapp/src/main/java/org/libreplan/web/workreports/WorkReportModel.java:585 +#: libreplan-webapp/src/main/java/org/libreplan/web/workreports/WorkReportModel.java:587 msgid "Show all" msgstr "" @@ -4048,7 +4070,7 @@ msgid "Apply tab changes" msgstr "" #: libreplan-webapp/src/main/java/org/libreplan/web/users/settings/PasswordController.java:99 -#: libreplan-webapp/src/main/java/org/libreplan/web/users/UserCRUDController.java:170 +#: libreplan-webapp/src/main/java/org/libreplan/web/users/UserCRUDController.java:176 msgid "passwords don't match" msgstr "" @@ -4168,7 +4190,7 @@ msgstr "" msgid "List of materials for all categories (select one to filter)" msgstr "" -#: libreplan-webapp/src/main/webapp/planner/taskpanels/_tabPanelTaskProperties.zul:69 +#: libreplan-webapp/src/main/webapp/planner/taskpanels/_tabPanelTaskProperties.zul:73 msgid "Resource allocation type" msgstr "" @@ -4185,7 +4207,7 @@ msgstr "" msgid "In the available periods {0} only {1} hours are available." msgstr "" -#: libreplan-webapp/src/main/webapp/users/_editUser.zul:126 +#: libreplan-webapp/src/main/webapp/users/_editUser.zul:115 msgid "Association with profiles" msgstr "" @@ -4227,7 +4249,7 @@ msgstr "" msgid "Total dedication" msgstr "" -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderElementTreeController.java:683 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderElementTreeController.java:686 msgid "" "You can not remove the task \"{0}\" because of this or any of its children " "are already in use in some work reports" @@ -4428,8 +4450,8 @@ msgstr "" msgid "Select type" msgstr "" -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/TaskElementAdapter.java:950 -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderModel.java:679 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/TaskElementAdapter.java:1021 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderModel.java:685 msgid "Hours invested" msgstr "" @@ -4499,7 +4521,7 @@ msgstr "" msgid "Both" msgstr "" -#: libreplan-webapp/src/main/java/org/libreplan/web/tree/TreeController.java:765 +#: libreplan-webapp/src/main/java/org/libreplan/web/tree/TreeController.java:882 msgid "Not editable for containing more that an hours group." msgstr "" @@ -4573,6 +4595,7 @@ msgid "LibrePlan: Transfer Projects Between Scenarios" msgstr "" #: libreplan-webapp/src/main/webapp/orders/_listOrderElementHours.zul:118 +#: libreplan-webapp/src/main/webapp/orders/_listOrderElementHours.zul:166 msgid "%" msgstr "" @@ -4583,14 +4606,14 @@ msgstr "" #: libreplan-webapp/src/main/java/org/libreplan/web/workreports/WorkReportCRUDController.java:1536 #: libreplan-webapp/src/main/java/org/libreplan/web/workreports/WorkReportCRUDController.java:1700 -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/OrderPlanningController.java:336 -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/company/CompanyPlanningController.java:273 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/OrderPlanningController.java:338 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/company/CompanyPlanningController.java:274 #: libreplan-webapp/src/main/java/org/libreplan/web/reports/OrderCostsPerResourceController.java:141 #: libreplan-webapp/src/main/java/org/libreplan/web/resources/worker/WorkerCRUDController.java:633 #: libreplan-webapp/src/main/java/org/libreplan/web/resources/machine/MachineCRUDController.java:425 #: libreplan-webapp/src/main/java/org/libreplan/web/orders/ProjectDetailsController.java:257 -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderElementTreeController.java:670 -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:1328 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderElementTreeController.java:673 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:1332 msgid "must be lower than finish date" msgstr "" @@ -4611,14 +4634,14 @@ msgstr "" msgid "Total task hours" msgstr "" -#: libreplan-webapp/src/main/java/org/libreplan/web/common/entrypoints/RedirectorSynthetiser.java:125 -msgid "Could not load any resource" -msgstr "" - #: libreplan-webapp/src/main/webapp/subcontract/reportAdvances.zul:46 msgid "Date last progress reported" msgstr "" +#: libreplan-webapp/src/main/java/org/libreplan/web/common/entrypoints/RedirectorSynthetiser.java:125 +msgid "Could not load any resource" +msgstr "" + #: libreplan-webapp/src/main/java/org/libreplan/web/common/CustomMenuController.java:343 #: libreplan-webapp/src/main/webapp/reports/schedulingProgressPerOrderReport.zul:37 msgid "Work And Progress Per Project" @@ -4681,7 +4704,7 @@ msgstr "" msgid "Unit type code cannot be empty" msgstr "" -#: libreplan-webapp/src/main/java/org/libreplan/web/users/UserCRUDController.java:183 +#: libreplan-webapp/src/main/java/org/libreplan/web/users/UserCRUDController.java:189 #: libreplan-webapp/src/main/java/org/libreplan/web/common/CustomMenuController.java:320 msgid "Users" msgstr "" @@ -4714,8 +4737,8 @@ msgid "" "completed." msgstr "" -#: libreplan-webapp/src/main/java/org/libreplan/web/templates/OrderTemplatesController.java:218 -#: libreplan-webapp/src/main/java/org/libreplan/web/templates/OrderTemplatesController.java:232 +#: libreplan-webapp/src/main/java/org/libreplan/web/templates/OrderTemplatesController.java:223 +#: libreplan-webapp/src/main/java/org/libreplan/web/templates/OrderTemplatesController.java:244 msgid "Template saved" msgstr "" @@ -4754,7 +4777,7 @@ msgstr "" #: libreplan-webapp/src/main/webapp/resources/worker/_localizations.zul:31 #: libreplan-webapp/src/main/webapp/resources/worker/_localizations.zul:53 #: libreplan-webapp/src/main/webapp/resources/worker/_localizations.zul:67 -#: libreplan-business/src/main/java/org/libreplan/business/templates/entities/OrderLineGroupTemplate.java:243 +#: libreplan-business/src/main/java/org/libreplan/business/templates/entities/OrderLineGroupTemplate.java:244 msgid "Group" msgstr "" @@ -4819,9 +4842,9 @@ msgstr "" #: libreplan-webapp/src/main/webapp/costcategories/_editCostCategory.zul:96 #: libreplan-webapp/src/main/webapp/costcategories/_editTypeOfWorkHours.zul:78 #: libreplan-webapp/src/main/webapp/qualityforms/_editQualityForm.zul:134 -#: libreplan-webapp/src/main/webapp/users/_editProfile.zul:83 -#: libreplan-webapp/src/main/webapp/users/_editUser.zul:164 -#: libreplan-webapp/src/main/webapp/templates/templates.zul:137 +#: libreplan-webapp/src/main/webapp/users/_editProfile.zul:72 +#: libreplan-webapp/src/main/webapp/users/_editUser.zul:153 +#: libreplan-webapp/src/main/webapp/templates/templates.zul:145 #: libreplan-webapp/src/main/webapp/resources/worker/_edition.zul:114 #: libreplan-webapp/src/main/webapp/resources/machine/_editMachine.zul:100 #: libreplan-webapp/src/main/webapp/resources/criterions/_edition.zul:92 @@ -4889,7 +4912,7 @@ msgstr "" msgid "generic machines allocation" msgstr "" -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/taskedition/TaskPropertiesController.java:375 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/taskedition/TaskPropertiesController.java:384 msgid "Non limiting resource assignation" msgstr "" @@ -4912,13 +4935,13 @@ msgstr "" #: libreplan-webapp/src/main/java/org/libreplan/web/workreports/WorkReportCRUDController.java:1519 #: libreplan-webapp/src/main/java/org/libreplan/web/workreports/WorkReportCRUDController.java:1682 -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/OrderPlanningController.java:317 -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/company/CompanyPlanningController.java:255 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/OrderPlanningController.java:319 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/company/CompanyPlanningController.java:256 #: libreplan-webapp/src/main/java/org/libreplan/web/resources/worker/WorkerCRUDController.java:616 #: libreplan-webapp/src/main/java/org/libreplan/web/resources/machine/MachineCRUDController.java:408 #: libreplan-webapp/src/main/java/org/libreplan/web/orders/ProjectDetailsController.java:240 -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderElementTreeController.java:652 -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:1311 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderElementTreeController.java:655 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:1315 msgid "must be greater than start date" msgstr "" @@ -4931,6 +4954,10 @@ msgstr "" msgid "Assign quality form" msgstr "" +#: libreplan-webapp/src/main/webapp/orders/_edition.zul:157 +msgid "Calculated budget" +msgstr "" + #: libreplan-webapp/src/main/java/org/libreplan/web/orders/materials/AssignedMaterialsController.java:387 msgid "Delete item {0}. Are you sure?" msgstr "" @@ -4956,6 +4983,10 @@ msgstr "" msgid "Allocations" msgstr "" +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/assigntemplates/TemplateFinderPopup.java:137 +msgid "Choosing Template" +msgstr "" + #: libreplan-webapp/src/main/webapp/calendars/_edition.zul:66 #: libreplan-webapp/src/main/webapp/resources/worker/_listVirtualWorkers.zul:35 msgid "Capacity" @@ -5000,7 +5031,7 @@ msgstr "" msgid "Removed calendar \"{0}\"" msgstr "" -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:1068 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:1072 msgid "Create project" msgstr "" @@ -5041,29 +5072,29 @@ msgstr "" msgid "New work report" msgstr "" +#: libreplan-webapp/src/main/java/org/libreplan/web/calendars/BaseCalendarEditionController.java:305 +msgid "Root calendar" +msgstr "" + #: libreplan-webapp/src/main/java/org/libreplan/web/resources/worker/WorkerCRUDController.java:847 #: libreplan-webapp/src/main/java/org/libreplan/web/resources/machine/MachineCRUDController.java:578 msgid "yes" msgstr "" -#: libreplan-webapp/src/main/java/org/libreplan/web/calendars/BaseCalendarEditionController.java:305 -msgid "Root calendar" -msgstr "" - -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:867 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:871 msgid "" "Deleting this subcontracted project, you are going to lose the relation to " "report progress. Are you sure?" msgstr "" -#: libreplan-webapp/src/main/webapp/common/configuration.zul:278 -msgid "Port" -msgstr "" - #: libreplan-webapp/src/main/webapp/limitingresources/manualAllocation.zul:113 msgid "Select gap" msgstr "" +#: libreplan-webapp/src/main/webapp/common/configuration.zul:278 +msgid "Port" +msgstr "" + #: libreplan-webapp/src/main/webapp/workreports/workReport.zul:63 msgid "Date Finish" msgstr "" @@ -5091,7 +5122,11 @@ msgstr "" msgid "missing code in a hour cost" msgstr "" -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/TaskElementAdapter.java:902 +#: libreplan-webapp/src/main/java/org/libreplan/web/exceptionDays/CalendarExceptionTypeCRUDController.java:247 +msgid "Exception Day Type" +msgstr "" + +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/TaskElementAdapter.java:973 msgid "All workers" msgstr "" @@ -5115,14 +5150,16 @@ msgstr "" #: libreplan-webapp/src/main/java/org/libreplan/web/materials/MaterialsController.java:311 #: libreplan-webapp/src/main/java/org/libreplan/web/costcategories/CostCategoryCRUDController.java:207 #: libreplan-webapp/src/main/java/org/libreplan/web/costcategories/CostCategoryCRUDController.java:307 +#: libreplan-webapp/src/main/java/org/libreplan/web/templates/TemplatesTreeController.java:110 +#: libreplan-webapp/src/main/java/org/libreplan/web/templates/TemplatesTreeController.java:130 #: libreplan-webapp/src/main/java/org/libreplan/web/calendars/BaseCalendarEditionController.java:994 #: libreplan-webapp/src/main/java/org/libreplan/web/calendars/BaseCalendarEditionController.java:1184 #: libreplan-webapp/src/main/java/org/libreplan/web/calendars/BaseCalendarEditionController.java:1441 #: libreplan-webapp/src/main/java/org/libreplan/web/resources/criterion/CriterionTreeController.java:135 #: libreplan-webapp/src/main/java/org/libreplan/web/orders/ProjectDetailsController.java:171 #: libreplan-webapp/src/main/java/org/libreplan/web/orders/labels/AssignedLabelsController.java:115 -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:1488 -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:1512 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:1492 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:1516 #: libreplan-webapp/src/main/java/org/libreplan/web/common/ConfigurationController.java:757 #: libreplan-webapp/src/main/webapp/labels/_editLabelType.zul:45 #: libreplan-webapp/src/main/webapp/labels/_editLabelType.zul:53 @@ -5189,10 +5226,6 @@ msgstr "" msgid "Load due to other assignments" msgstr "" -#: libreplan-webapp/src/main/webapp/orders/_listOrderElementHours.zul:62 -msgid "Sum of all task leafs imputed hours" -msgstr "" - #: libreplan-webapp/src/main/java/org/libreplan/web/resources/machine/MachineCRUDController.java:554 msgid "This machine was already removed by other user" msgstr "" @@ -5265,11 +5298,11 @@ msgstr "" msgid "Filter work reports" msgstr "" -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/TaskElementAdapter.java:947 -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderModel.java:678 -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderElementTreeController.java:601 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/TaskElementAdapter.java:1018 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderModel.java:684 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderElementTreeController.java:603 #: libreplan-webapp/src/main/java/org/libreplan/web/common/CustomMenuController.java:328 -#: libreplan-webapp/src/main/webapp/templates/templates.zul:63 +#: libreplan-webapp/src/main/webapp/templates/templates.zul:64 #: libreplan-webapp/src/main/webapp/templates/_editTemplateWindow.zul:49 #: libreplan-webapp/src/main/webapp/orders/_editOrderElement.zul:48 #: libreplan-webapp/src/main/webapp/orders/_edition.zul:46 @@ -5332,7 +5365,7 @@ msgstr "" msgid "LibrePlan: Work Reports" msgstr "" -#: libreplan-webapp/src/main/java/org/libreplan/web/templates/OrderTemplatesController.java:373 +#: libreplan-webapp/src/main/java/org/libreplan/web/templates/OrderTemplatesController.java:393 #: libreplan-webapp/src/main/java/org/libreplan/web/orders/materials/AssignedMaterialsController.java:393 msgid "Error on showing delete confirm" msgstr "" @@ -5357,7 +5390,7 @@ msgstr "" msgid "Finish hour" msgstr "" -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/reassign/ReassignCommand.java:200 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/reassign/ReassignCommand.java:196 msgid "Done {0} of {1}" msgstr "" @@ -5413,16 +5446,16 @@ msgstr "" msgid "Inherited labels" msgstr "" -#: libreplan-webapp/src/main/java/org/libreplan/web/tree/TreeController.java:946 -#: libreplan-webapp/src/main/java/org/libreplan/web/resources/criterion/CriterionTreeController.java:292 -msgid "Unindent" -msgstr "" - #: libreplan-webapp/src/main/java/org/libreplan/web/orders/ManageOrderElementAdvancesController.java:939 #: libreplan-webapp/src/main/java/org/libreplan/web/orders/ManageOrderElementAdvancesController.java:1406 msgid "Value is not valid, the current value must be not empty" msgstr "" +#: libreplan-webapp/src/main/java/org/libreplan/web/tree/TreeController.java:1063 +#: libreplan-webapp/src/main/java/org/libreplan/web/resources/criterion/CriterionTreeController.java:292 +msgid "Unindent" +msgstr "" + #: libreplan-webapp/src/main/webapp/orders/components/_listOrderElementLabels.zul:50 msgid "Direct labels" msgstr "" @@ -5486,7 +5519,7 @@ msgstr "" msgid "Scheduling state" msgstr "" -#: libreplan-webapp/src/main/java/org/libreplan/web/templates/OrderTemplatesController.java:369 +#: libreplan-webapp/src/main/java/org/libreplan/web/templates/OrderTemplatesController.java:389 msgid "This template can not be removed because it has applications." msgstr "" @@ -5506,6 +5539,10 @@ msgstr "" msgid "Number of iterations should be between 1 and " msgstr "" +#: libreplan-webapp/src/main/webapp/orders/_listOrderElementHours.zul:151 +msgid "Budget in money" +msgstr "" + #: libreplan-webapp/src/main/java/org/libreplan/web/common/ConfigurationController.java:145 msgid "Scenarios must be enabled as more elements than master exist" msgstr "" @@ -5548,7 +5585,7 @@ msgstr "" msgid "Administrator" msgstr "" -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/reassign/ReassignCommand.java:190 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/reassign/ReassignCommand.java:186 msgid "Doing {0} reassignations" msgstr "" @@ -5584,7 +5621,7 @@ msgstr "" msgid "Criterion Type List" msgstr "" -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/OrderPlanningModel.java:739 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/OrderPlanningModel.java:765 msgid "Overall progress" msgstr "" @@ -5608,7 +5645,7 @@ msgstr "" msgid "Observations" msgstr "" -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:947 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:951 msgid "Edit project" msgstr "" @@ -5663,7 +5700,6 @@ msgstr "" msgid "Only {0} resources per day were achieved for current allocation" msgstr "" -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/assigntemplates/TemplateFinderPopup.java:51 #: libreplan-webapp/src/main/webapp/planner/editTask.zul:79 #: libreplan-webapp/src/main/webapp/planner/reassign.zul:48 #: libreplan-webapp/src/main/webapp/planner/stretches_function.zul:89 @@ -5710,6 +5746,10 @@ msgstr "" msgid "Calculated progress measurement can not be removed" msgstr "" +#: libreplan-webapp/src/main/java/org/libreplan/web/exceptionDays/CalendarExceptionTypeCRUDController.java:252 +msgid "Exception Day Types" +msgstr "" + #: libreplan-webapp/src/main/java/org/libreplan/web/resources/worker/AssignedCriterionsModel.java:335 #: libreplan-webapp/src/main/java/org/libreplan/web/resources/worker/AssignedCriterionsModel.java:341 msgid " The " @@ -5753,6 +5793,10 @@ msgstr "" msgid "Infinitely Over Assignable" msgstr "" +#: libreplan-webapp/src/main/webapp/orders/_listOrderElementHours.zul:157 +msgid "Money spent" +msgstr "" + #: libreplan-business/src/main/java/org/libreplan/business/resources/entities/CriterionType.java:426 msgid "criterion names must be unique inside a criterion type" msgstr "" @@ -5788,7 +5832,7 @@ msgstr "" #: libreplan-webapp/src/main/webapp/reports/hoursWorkedPerWorkerReport.zul:86 #: libreplan-webapp/src/main/webapp/reports/schedulingProgressPerOrderReport.zul:116 #: libreplan-webapp/src/main/webapp/reports/timeLineMaterialReport.zul:95 -#: libreplan-webapp/src/main/webapp/templates/templates.zul:85 +#: libreplan-webapp/src/main/webapp/templates/templates.zul:86 #: libreplan-webapp/src/main/webapp/templates/_list.zul:26 #: libreplan-webapp/src/main/webapp/templates/_materialAssignmentsBox.zul:28 #: libreplan-webapp/src/main/webapp/calendars/_edition.zul:54 @@ -5845,15 +5889,20 @@ msgstr "" msgid "Update exception" msgstr "" -#: libreplan-webapp/src/main/webapp/subcontract/subcontractedTasks.zul:52 -#: libreplan-webapp/src/main/webapp/orders/_edition.zul:140 -msgid "Budget" -msgstr "" - #: libreplan-webapp/src/main/java/org/libreplan/web/orders/TreeElementOperationsController.java:253 msgid "Operation cannot be done" msgstr "" +#: libreplan-webapp/src/main/java/org/libreplan/web/templates/TemplatesTreeComponent.java:91 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrdersTreeComponent.java:80 +#: libreplan-webapp/src/main/webapp/planner/taskpanels/_tabPanelTaskProperties.zul:62 +#: libreplan-webapp/src/main/webapp/templates/templates.zul:107 +#: libreplan-webapp/src/main/webapp/subcontract/subcontractedTasks.zul:52 +#: libreplan-webapp/src/main/webapp/orders/_orderElementDetails.zul:65 +#: libreplan-webapp/src/main/webapp/orders/_edition.zul:140 +msgid "Budget" +msgstr "" + #: libreplan-webapp/src/main/java/org/libreplan/web/reports/HoursWorkedPerWorkerInAMonthController.java:44 msgid "May" msgstr "" @@ -5887,7 +5936,7 @@ msgstr "" msgid "Assign element to queue automatically" msgstr "" -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrdersTreeComponent.java:82 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrdersTreeComponent.java:92 msgid "" "Date which the task must start after (press enter in textbox to open " "calendar popup or type in date directly)" @@ -5923,8 +5972,8 @@ msgstr "" msgid "Probability %" msgstr "" -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/OrderPlanningModel.java:737 -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/company/CompanyPlanningModel.java:324 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/OrderPlanningModel.java:763 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/company/CompanyPlanningModel.java:321 #: libreplan-webapp/src/main/java/org/libreplan/web/resourceload/ResourceLoadController.java:815 #: libreplan-webapp/src/main/webapp/planner/_legendLoadChartOrder.zul:49 msgid "Load" @@ -5935,12 +5984,12 @@ msgstr "" msgid "New criterion" msgstr "" -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderModel.java:683 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderModel.java:689 #: libreplan-webapp/src/main/webapp/materials/materials.zul:81 #: libreplan-webapp/src/main/webapp/scenarios/_edition.zul:43 #: libreplan-webapp/src/main/webapp/qualityforms/_listQualityForm.zul:37 #: libreplan-webapp/src/main/webapp/qualityforms/_editQualityForm.zul:49 -#: libreplan-webapp/src/main/webapp/templates/templates.zul:101 +#: libreplan-webapp/src/main/webapp/templates/templates.zul:102 #: libreplan-webapp/src/main/webapp/templates/_list.zul:32 #: libreplan-webapp/src/main/webapp/subcontract/subcontractedTasks.zul:51 #: libreplan-webapp/src/main/webapp/resources/machine/_listMachines.zul:36 @@ -5964,7 +6013,7 @@ msgstr "" msgid "already exists an allocation for criteria {0}" msgstr "" -#: libreplan-webapp/src/main/java/org/libreplan/web/templates/OrderTemplatesController.java:283 +#: libreplan-webapp/src/main/java/org/libreplan/web/templates/OrderTemplatesController.java:303 #: libreplan-webapp/src/main/java/org/libreplan/web/common/CustomMenuController.java:294 msgid "Project Templates" msgstr "" @@ -5991,7 +6040,7 @@ msgstr "" msgid "At least one HoursGroup is needed" msgstr "" -#: libreplan-webapp/src/main/java/org/libreplan/web/users/UserCRUDController.java:178 +#: libreplan-webapp/src/main/java/org/libreplan/web/users/UserCRUDController.java:184 #: libreplan-webapp/src/main/webapp/externalcompanies/_editExternalCompany.zul:63 #: libreplan-webapp/src/main/webapp/common/layout/login.zul:74 #: libreplan-business/src/main/java/org/libreplan/business/advance/entities/AdvanceType.java:165 @@ -6055,8 +6104,8 @@ msgstr "" msgid "Function" msgstr "" -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/OrderPlanningModel.java:799 -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/company/CompanyPlanningModel.java:363 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/OrderPlanningModel.java:825 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/company/CompanyPlanningModel.java:360 msgid "date in future" msgstr "" @@ -6071,14 +6120,14 @@ msgstr "" msgid "Format" msgstr "" -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/SaveCommandBuilder.java:887 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/SaveCommandBuilder.java:885 msgid "New project version" msgstr "" -#: libreplan-webapp/src/main/java/org/libreplan/web/templates/TemplatesTreeController.java:77 +#: libreplan-webapp/src/main/java/org/libreplan/web/templates/TemplatesTreeController.java:79 #: libreplan-webapp/src/main/java/org/libreplan/web/calendars/BaseCalendarCRUDController.java:366 -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderElementTreeController.java:484 -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:1231 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderElementTreeController.java:486 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:1235 #: libreplan-webapp/src/main/java/org/libreplan/web/limitingresources/QueueComponent.java:478 #: libreplan-webapp/src/main/java/org/libreplan/web/common/Util.java:537 #: libreplan-webapp/src/main/webapp/labels/_listLabelTypes.zul:37 @@ -6249,7 +6298,7 @@ msgstr "" msgid "BCWS" msgstr "" -#: libreplan-webapp/src/main/java/org/libreplan/web/print/CutyPrint.java:351 +#: libreplan-webapp/src/main/java/org/libreplan/web/print/CutyPrint.java:343 msgid " in the specified directory." msgstr "" @@ -6302,7 +6351,7 @@ msgstr "" msgid "Create project from Template" msgstr "" -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderElementTreeController.java:418 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderElementTreeController.java:420 msgid "" "Value is not valid.\n" " Code cannot contain chars like '_' \n" @@ -6313,11 +6362,15 @@ msgstr "" msgid "an authorization type must be set" msgstr "" -#: libreplan-webapp/src/main/java/org/libreplan/web/templates/TemplatesTreeComponent.java:92 +#: libreplan-webapp/src/main/java/org/libreplan/web/templates/TemplatesTreeComponent.java:101 msgid "Must start after (days since beginning project)" msgstr "" -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/SaveCommandBuilder.java:886 +#: libreplan-webapp/src/main/webapp/orders/_listOrderElementHours.zul:134 +msgid "Percentage of estimated budget in money / money spent" +msgstr "" + +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/SaveCommandBuilder.java:884 msgid "" "Confirm creating a new project version for this scenario and derived. Are " "you sure?" @@ -6365,7 +6418,7 @@ msgstr "" msgid "You should select the type of exception" msgstr "" -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrdersTreeComponent.java:93 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrdersTreeComponent.java:103 #: libreplan-webapp/src/main/webapp/planner/taskpanels/_tabPanelTaskProperties.zul:46 #: libreplan-webapp/src/main/webapp/orders/_projectDetails.zul:63 #: libreplan-webapp/src/main/webapp/orders/_orderElementDetails.zul:52 @@ -6417,7 +6470,7 @@ msgstr "" msgid "Number of iterations" msgstr "" -#: libreplan-webapp/src/main/webapp/templates/templates.zul:60 +#: libreplan-webapp/src/main/webapp/templates/templates.zul:61 msgid "Template Tree" msgstr "" @@ -6444,11 +6497,15 @@ msgstr "" msgid "Status" msgstr "" +#: libreplan-webapp/src/main/java/org/libreplan/web/calendars/BaseCalendarEditionController.java:321 +msgid "from {0}" +msgstr "" + #: libreplan-webapp/src/main/webapp/settings/settings.zul:111 msgid "Resource load view" msgstr "" -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/OrderPlanningModel.java:787 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/OrderPlanningModel.java:813 msgid "the date must be inside the visualization area" msgstr "" @@ -6598,8 +6655,8 @@ msgid "Task Scheduling Status In Project" msgstr "" #: libreplan-webapp/src/main/java/org/libreplan/web/qualityforms/QualityFormCRUDController.java:162 -#: libreplan-webapp/src/main/java/org/libreplan/web/templates/OrderTemplatesController.java:356 -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:868 +#: libreplan-webapp/src/main/java/org/libreplan/web/templates/OrderTemplatesController.java:376 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:872 #: libreplan-webapp/src/main/java/org/libreplan/web/common/BaseCRUDController.java:313 msgid "Confirm" msgstr "" @@ -6651,8 +6708,8 @@ msgstr "" #: libreplan-webapp/src/main/java/org/libreplan/web/workreports/WorkReportCRUDController.java:1214 #: libreplan-webapp/src/main/java/org/libreplan/web/workreports/WorkReportCRUDController.java:1226 #: libreplan-webapp/src/main/java/org/libreplan/web/workreports/WorkReportTypeCRUDController.java:346 -#: libreplan-webapp/src/main/java/org/libreplan/web/tree/TreeController.java:984 -#: libreplan-webapp/src/main/java/org/libreplan/web/tree/TreeController.java:990 +#: libreplan-webapp/src/main/java/org/libreplan/web/tree/TreeController.java:1101 +#: libreplan-webapp/src/main/java/org/libreplan/web/tree/TreeController.java:1107 #: libreplan-webapp/src/main/java/org/libreplan/web/costcategories/CostCategoryCRUDController.java:289 #: libreplan-webapp/src/main/java/org/libreplan/web/costcategories/CostCategoryCRUDController.java:457 #: libreplan-webapp/src/main/java/org/libreplan/web/costcategories/ResourcesCostCategoryAssignmentController.java:143 @@ -6671,7 +6728,7 @@ msgstr "" #: libreplan-webapp/src/main/java/org/libreplan/web/orders/AssignedTaskQualityFormsToOrderElementController.java:201 #: libreplan-webapp/src/main/java/org/libreplan/web/orders/AssignedTaskQualityFormsToOrderElementController.java:333 #: libreplan-webapp/src/main/java/org/libreplan/web/orders/AssignedTaskQualityFormsToOrderElementController.java:406 -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:1247 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:1251 #: libreplan-webapp/src/main/webapp/labels/_editLabelType.zul:99 #: libreplan-webapp/src/main/webapp/labels/_listLabelTypes.zul:42 #: libreplan-webapp/src/main/webapp/externalcompanies/_listExternalCompanies.zul:49 @@ -6696,10 +6753,8 @@ msgstr "" #: libreplan-webapp/src/main/webapp/reports/workingArrangementsPerOrderReport.zul:154 #: libreplan-webapp/src/main/webapp/reports/timeLineMaterialReport.zul:106 #: libreplan-webapp/src/main/webapp/users/_listUsers.zul:46 -#: libreplan-webapp/src/main/webapp/users/_editProfile.zul:68 #: libreplan-webapp/src/main/webapp/users/_listProfiles.zul:40 -#: libreplan-webapp/src/main/webapp/users/_editUser.zul:115 -#: libreplan-webapp/src/main/webapp/users/_editUser.zul:148 +#: libreplan-webapp/src/main/webapp/users/_editUser.zul:137 #: libreplan-webapp/src/main/webapp/templates/_list.zul:53 #: libreplan-webapp/src/main/webapp/templates/_materialAssignmentsBox.zul:55 #: libreplan-webapp/src/main/webapp/resources/worker/_listVirtualWorkers.zul:52 @@ -6799,7 +6854,7 @@ msgid "Stretches" msgstr "" #: libreplan-business/src/main/java/org/libreplan/business/planner/entities/AssignmentFunction.java:79 -msgid "Interporlation" +msgid "Interpolation" msgstr "" #: libreplan-business/src/main/java/org/libreplan/business/planner/entities/AssignmentFunction.java:80 @@ -6863,23 +6918,23 @@ msgstr "" msgid "Blocked" msgstr "" -#: libreplan-business/src/main/java/org/libreplan/business/planner/entities/PositionConstraintType.java:29 +#: libreplan-business/src/main/java/org/libreplan/business/planner/entities/PositionConstraintType.java:31 msgid "as soon as possible" msgstr "" -#: libreplan-business/src/main/java/org/libreplan/business/planner/entities/PositionConstraintType.java:41 +#: libreplan-business/src/main/java/org/libreplan/business/planner/entities/PositionConstraintType.java:38 msgid "start not earlier than" msgstr "" -#: libreplan-business/src/main/java/org/libreplan/business/planner/entities/PositionConstraintType.java:53 +#: libreplan-business/src/main/java/org/libreplan/business/planner/entities/PositionConstraintType.java:45 msgid "start in fixed date" msgstr "" -#: libreplan-business/src/main/java/org/libreplan/business/planner/entities/PositionConstraintType.java:65 +#: libreplan-business/src/main/java/org/libreplan/business/planner/entities/PositionConstraintType.java:57 msgid "as late as possible" msgstr "" -#: libreplan-business/src/main/java/org/libreplan/business/planner/entities/PositionConstraintType.java:77 +#: libreplan-business/src/main/java/org/libreplan/business/planner/entities/PositionConstraintType.java:64 msgid "finish not later than" msgstr "" @@ -6919,7 +6974,7 @@ msgstr "" msgid "Project creation allowed" msgstr "" -#: libreplan-business/src/main/java/org/libreplan/business/templates/entities/OrderLineTemplate.java:122 +#: libreplan-business/src/main/java/org/libreplan/business/templates/entities/OrderLineTemplate.java:132 msgid "Line" msgstr "" @@ -7087,23 +7142,23 @@ msgstr "" msgid "U" msgstr "" -#: libreplan-business/src/main/java/org/libreplan/business/orders/entities/OrderElement.java:618 +#: libreplan-business/src/main/java/org/libreplan/business/orders/entities/OrderElement.java:629 msgid "" "Some ancestor has the same label assigned, so this element is already " "inheriting this label" msgstr "" -#: libreplan-business/src/main/java/org/libreplan/business/orders/entities/OrderElement.java:717 +#: libreplan-business/src/main/java/org/libreplan/business/orders/entities/OrderElement.java:728 #: libreplan-business/src/main/java/org/libreplan/business/orders/entities/OrderLineGroup.java:963 msgid "Cannot spread two progress in the same task" msgstr "" -#: libreplan-business/src/main/java/org/libreplan/business/orders/entities/OrderElement.java:741 -#: libreplan-business/src/main/java/org/libreplan/business/orders/entities/OrderElement.java:767 +#: libreplan-business/src/main/java/org/libreplan/business/orders/entities/OrderElement.java:752 +#: libreplan-business/src/main/java/org/libreplan/business/orders/entities/OrderElement.java:778 msgid "Duplicate Progress Assignment For Task" msgstr "" -#: libreplan-business/src/main/java/org/libreplan/business/orders/entities/OrderElement.java:1094 +#: libreplan-business/src/main/java/org/libreplan/business/orders/entities/OrderElement.java:1105 msgid "Quality form already exists" msgstr "" From 8b883f701cf2c4fdc598a1ab05f29c42fe718ddd Mon Sep 17 00:00:00 2001 From: Manuel Rego Casasnovas Date: Wed, 11 Apr 2012 12:31:45 +0200 Subject: [PATCH 002/108] i18n: Update Spanish and Galician translations FEA: ItEr76S03Community --- ganttzk/src/main/resources/i18n/es.po | 56 +- ganttzk/src/main/resources/i18n/gl.po | 58 +- .../src/main/resources/i18n/es.po | 567 ++++++++++-------- .../src/main/resources/i18n/gl.po | 567 ++++++++++-------- 4 files changed, 691 insertions(+), 557 deletions(-) diff --git a/ganttzk/src/main/resources/i18n/es.po b/ganttzk/src/main/resources/i18n/es.po index 3573626b7..038e570f1 100644 --- a/ganttzk/src/main/resources/i18n/es.po +++ b/ganttzk/src/main/resources/i18n/es.po @@ -10,10 +10,10 @@ # Manuel Rego Casasnovas , 2010, 2011, 2012. msgid "" msgstr "" -"Project-Id-Version: 1.2.1\n" +"Project-Id-Version: libreplan-1.2.3\n" "Report-Msgid-Bugs-To: http://bugs.libreplan.org/\n" -"POT-Creation-Date: 2012-01-13 16:49+0100\n" -"PO-Revision-Date: 2012-01-13 16:00+0000\n" +"POT-Creation-Date: 2012-04-11 08:32+0200\n" +"PO-Revision-Date: 2012-04-11 08:35+0000\n" "Last-Translator: Manuel Rego Casasnovas \n" "Language-Team: Español\n" "MIME-Version: 1.0\n" @@ -22,12 +22,12 @@ msgstr "" "Language: es\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" -#: ganttzk/src/main/java/org/zkoss/ganttz/DependencyList.java:215 -#: ganttzk/src/main/java/org/zkoss/ganttz/DependencyList.java:234 +#: ganttzk/src/main/java/org/zkoss/ganttz/DependencyList.java:216 +#: ganttzk/src/main/java/org/zkoss/ganttz/DependencyList.java:235 msgid "Erase" msgstr "Borrar" -#: ganttzk/src/main/java/org/zkoss/ganttz/TaskList.java:300 +#: ganttzk/src/main/java/org/zkoss/ganttz/TaskList.java:299 msgid "Add Dependency" msgstr "Añadir dependencia" @@ -35,11 +35,15 @@ msgstr "Añadir dependencia" msgid "Worker" msgstr "Trabajador" +#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:682 +msgid "Show money cost bar" +msgstr "Mostrar barra de coste monetario" + #: ganttzk/src/main/resources/web/ganttz/zul/leftTasksTree.zul:29 msgid "Start" msgstr "Inicio" -#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:635 +#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:661 msgid "Show reported hours" msgstr "Mostrar horas reportadas" @@ -64,7 +68,7 @@ msgstr "Recursos limitantes" msgid "The specified dependency is not allowed" msgstr "La dependencia especificada no está permitida" -#: ganttzk/src/main/java/org/zkoss/ganttz/DependencyList.java:254 +#: ganttzk/src/main/java/org/zkoss/ganttz/DependencyList.java:255 msgid "Set End-End" msgstr "Definir Fin-Fin" @@ -88,6 +92,10 @@ msgstr "esfuerzo disponible: {0}, esfuerzo asignado: {1}" msgid "Criterion" msgstr "Criterio" +#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:688 +msgid "Hide money cost bar" +msgstr "Ocultar barra de coste monetario" + #: ganttzk/src/main/resources/web/ganttz/zul/plannerLayout.zul:44 msgid "Print" msgstr "Imprimir" @@ -116,6 +124,10 @@ msgstr "Fin" msgid "changing zoom" msgstr "cambiando zoom" +#: ganttzk/src/main/resources/web/ganttz/zul/plannerLayout.zul:91 +msgid "Show/Hide money cost bar" +msgstr "Mostrar/Ocultar barra de coste monetario" + #: ganttzk/src/main/java/org/zkoss/ganttz/timetracker/zoom/ZoomLevel.java:45 msgid "Quarter" msgstr "Trimestre" @@ -141,7 +153,7 @@ msgstr "Nombre" msgid "Name filter" msgstr "Filtro por nombres" -#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:615 +#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:641 msgid "Show progress" msgstr "Mostrar progreso" @@ -153,14 +165,14 @@ msgstr "Expandir/Plegar todo" msgid "Show/Hide critical path" msgstr "Mostrar/Ocultar camino crítico" -#: ganttzk/src/main/java/org/zkoss/ganttz/timetracker/zoom/ZoomLevel.java:32 -msgid "Year" -msgstr "Año" - #: ganttzk/src/main/java/org/zkoss/ganttz/resourceload/ResourcesLoadPanel.java:150 msgid "showing criteria" msgstr "mostrando criterios" +#: ganttzk/src/main/java/org/zkoss/ganttz/timetracker/zoom/ZoomLevel.java:32 +msgid "Year" +msgstr "Año" + #: ganttzk/src/main/java/org/zkoss/ganttz/timetracker/zoom/ZoomLevel.java:58 msgid "Month" msgstr "Mes" @@ -169,15 +181,15 @@ msgstr "Mes" msgid "Show/Hide resources" msgstr "Mostrar/Ocultar recursos" -#: ganttzk/src/main/java/org/zkoss/ganttz/DependencyList.java:246 +#: ganttzk/src/main/java/org/zkoss/ganttz/DependencyList.java:247 msgid "Set End-Start" msgstr "Definir Fin-Inicio" -#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:297 +#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:308 msgid "decreasing zoom" msgstr "reduciendo zoom" -#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:596 +#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:622 msgid "Hide critical path" msgstr "Ocultar camino crítico" @@ -185,7 +197,7 @@ msgstr "Ocultar camino crítico" msgid "Day" msgstr "Día" -#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:642 +#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:668 msgid "Hide reported hours" msgstr "Ocultar horas reportadas" @@ -206,11 +218,11 @@ msgid "Hour" msgstr "Hora" #: ganttzk/src/main/resources/web/ganttz/zul/resourcesLoadLayout.zul:90 -#: ganttzk/src/main/resources/web/ganttz/zul/plannerLayout.zul:114 +#: ganttzk/src/main/resources/web/ganttz/zul/plannerLayout.zul:120 msgid "Graphics" msgstr "Gráficas" -#: ganttzk/src/main/java/org/zkoss/ganttz/DependencyList.java:250 +#: ganttzk/src/main/java/org/zkoss/ganttz/DependencyList.java:251 msgid "Set Start-Start" msgstr "Definir Inicio-Inicio" @@ -218,7 +230,7 @@ msgstr "Definir Inicio-Inicio" msgid "See resource allocation" msgstr "Ver asignación de recursos" -#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:280 +#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:291 msgid "increasing zoom" msgstr "aumentando zoom" @@ -234,10 +246,10 @@ msgstr "Todos" msgid "Refresh" msgstr "Actualizar" -#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:591 +#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:617 msgid "Show critical path" msgstr "Mostrar camino crítico" -#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:620 +#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:646 msgid "Hide progress" msgstr "Ocultar progreso" diff --git a/ganttzk/src/main/resources/i18n/gl.po b/ganttzk/src/main/resources/i18n/gl.po index 1f90df997..57515165c 100644 --- a/ganttzk/src/main/resources/i18n/gl.po +++ b/ganttzk/src/main/resources/i18n/gl.po @@ -10,11 +10,11 @@ # Manuel Rego Casasnovas , 2010, 2011, 2012. msgid "" msgstr "" -"Project-Id-Version: 1.2.1\n" +"Project-Id-Version: libreplan-1.2.3\n" "Report-Msgid-Bugs-To: http://bugs.libreplan.org/\n" -"POT-Creation-Date: 2012-01-13 16:49+0100\n" -"PO-Revision-Date: 2012-01-13 16:01+0000\n" -"Last-Translator: Manuel Rego Casasnovas\n" +"POT-Creation-Date: 2012-04-11 08:32+0200\n" +"PO-Revision-Date: 2012-04-11 08:34+0000\n" +"Last-Translator: Manuel Rego Casasnovas \n" "Language-Team: Galego\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -22,12 +22,12 @@ msgstr "" "Language: gl\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" -#: ganttzk/src/main/java/org/zkoss/ganttz/DependencyList.java:215 -#: ganttzk/src/main/java/org/zkoss/ganttz/DependencyList.java:234 +#: ganttzk/src/main/java/org/zkoss/ganttz/DependencyList.java:216 +#: ganttzk/src/main/java/org/zkoss/ganttz/DependencyList.java:235 msgid "Erase" msgstr "Borrar" -#: ganttzk/src/main/java/org/zkoss/ganttz/TaskList.java:300 +#: ganttzk/src/main/java/org/zkoss/ganttz/TaskList.java:299 msgid "Add Dependency" msgstr "Engadir dependencia" @@ -35,11 +35,15 @@ msgstr "Engadir dependencia" msgid "Worker" msgstr "Traballador" +#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:682 +msgid "Show money cost bar" +msgstr "Mostrar barra de coste monetario" + #: ganttzk/src/main/resources/web/ganttz/zul/leftTasksTree.zul:29 msgid "Start" msgstr "Inicio" -#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:635 +#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:661 msgid "Show reported hours" msgstr "Mostrar horas reportadas" @@ -64,7 +68,7 @@ msgstr "Recursos limitantes" msgid "The specified dependency is not allowed" msgstr "A dependencia especificada non está permitida" -#: ganttzk/src/main/java/org/zkoss/ganttz/DependencyList.java:254 +#: ganttzk/src/main/java/org/zkoss/ganttz/DependencyList.java:255 msgid "Set End-End" msgstr "Definir Fin-Fin" @@ -88,6 +92,10 @@ msgstr "esforzo dispoñible: {0}, esforzo asignado: {1}" msgid "Criterion" msgstr "Criterio" +#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:688 +msgid "Hide money cost bar" +msgstr "Ocultar barra de coste monetario" + #: ganttzk/src/main/resources/web/ganttz/zul/plannerLayout.zul:44 msgid "Print" msgstr "Imprimir" @@ -116,6 +124,10 @@ msgstr "Fin" msgid "changing zoom" msgstr "cambiando zoom" +#: ganttzk/src/main/resources/web/ganttz/zul/plannerLayout.zul:91 +msgid "Show/Hide money cost bar" +msgstr "Mostrar/Ocultar barra de coste monetario" + #: ganttzk/src/main/java/org/zkoss/ganttz/timetracker/zoom/ZoomLevel.java:45 msgid "Quarter" msgstr "Trimestre" @@ -141,7 +153,7 @@ msgstr "Nome" msgid "Name filter" msgstr "Filtro por nomes" -#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:615 +#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:641 msgid "Show progress" msgstr "Mostrar progreso" @@ -153,14 +165,14 @@ msgstr "Expandir/Pregar todo" msgid "Show/Hide critical path" msgstr "Mostrar/Ocultar camiño crítico" -#: ganttzk/src/main/java/org/zkoss/ganttz/timetracker/zoom/ZoomLevel.java:32 -msgid "Year" -msgstr "Ano" - #: ganttzk/src/main/java/org/zkoss/ganttz/resourceload/ResourcesLoadPanel.java:150 msgid "showing criteria" msgstr "mostrando criterios" +#: ganttzk/src/main/java/org/zkoss/ganttz/timetracker/zoom/ZoomLevel.java:32 +msgid "Year" +msgstr "Ano" + #: ganttzk/src/main/java/org/zkoss/ganttz/timetracker/zoom/ZoomLevel.java:58 msgid "Month" msgstr "Mes" @@ -169,15 +181,15 @@ msgstr "Mes" msgid "Show/Hide resources" msgstr "Mostrar/Ocultar recursos" -#: ganttzk/src/main/java/org/zkoss/ganttz/DependencyList.java:246 +#: ganttzk/src/main/java/org/zkoss/ganttz/DependencyList.java:247 msgid "Set End-Start" msgstr "Definir Fin-Inicio" -#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:297 +#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:308 msgid "decreasing zoom" msgstr "reducindo zoom" -#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:596 +#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:622 msgid "Hide critical path" msgstr "Ocultar camiño crítico" @@ -185,7 +197,7 @@ msgstr "Ocultar camiño crítico" msgid "Day" msgstr "Día" -#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:642 +#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:668 msgid "Hide reported hours" msgstr "Ocultar horas reportadas" @@ -206,11 +218,11 @@ msgid "Hour" msgstr "Hora" #: ganttzk/src/main/resources/web/ganttz/zul/resourcesLoadLayout.zul:90 -#: ganttzk/src/main/resources/web/ganttz/zul/plannerLayout.zul:114 +#: ganttzk/src/main/resources/web/ganttz/zul/plannerLayout.zul:120 msgid "Graphics" msgstr "Gráficas" -#: ganttzk/src/main/java/org/zkoss/ganttz/DependencyList.java:250 +#: ganttzk/src/main/java/org/zkoss/ganttz/DependencyList.java:251 msgid "Set Start-Start" msgstr "Definir Inicio-Inicio" @@ -218,7 +230,7 @@ msgstr "Definir Inicio-Inicio" msgid "See resource allocation" msgstr "Ver asignación de recursoss" -#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:280 +#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:291 msgid "increasing zoom" msgstr "aumentando zoom" @@ -234,10 +246,10 @@ msgstr "Todos" msgid "Refresh" msgstr "Actualizar" -#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:591 +#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:617 msgid "Show critical path" msgstr "Mostrar camiño crítico" -#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:620 +#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:646 msgid "Hide progress" msgstr "Ocultar progreso" diff --git a/libreplan-webapp/src/main/resources/i18n/es.po b/libreplan-webapp/src/main/resources/i18n/es.po index e41fc6772..5eba0560d 100644 --- a/libreplan-webapp/src/main/resources/i18n/es.po +++ b/libreplan-webapp/src/main/resources/i18n/es.po @@ -10,10 +10,10 @@ # Manuel Rego Casasnovas , 2010, 2011, 2012. msgid "" msgstr "" -"Project-Id-Version: 1.2.2\n" +"Project-Id-Version: libreplan-1.2.3\n" "Report-Msgid-Bugs-To: http://bugs.libreplan.org/\n" -"POT-Creation-Date: 2012-02-24 09:08+0100\n" -"PO-Revision-Date: 2012-02-24 10:05+0000\n" +"POT-Creation-Date: 2012-04-11 08:32+0200\n" +"PO-Revision-Date: 2012-04-11 08:35+0000\n" "Last-Translator: Manuel Rego Casasnovas \n" "Language-Team: Español\n" "MIME-Version: 1.0\n" @@ -152,7 +152,7 @@ msgstr "No puede estar vacío" #: libreplan-webapp/src/main/java/org/libreplan/web/common/CustomMenuController.java:324 #: libreplan-webapp/src/main/webapp/materials/materials.zul:33 -#: libreplan-webapp/src/main/webapp/templates/templates.zul:66 +#: libreplan-webapp/src/main/webapp/templates/templates.zul:67 #: libreplan-webapp/src/main/webapp/templates/_editTemplateWindow.zul:52 #: libreplan-webapp/src/main/webapp/templates/_materialAssignmentsBox.zul:22 #: libreplan-webapp/src/main/webapp/orders/_editOrderElement.zul:54 @@ -161,7 +161,7 @@ msgstr "No puede estar vacío" msgid "Materials" msgstr "Materiales" -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/reassign/ReassignCommand.java:361 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/reassign/ReassignCommand.java:357 msgid "Reassign" msgstr "Reasignar" @@ -202,7 +202,7 @@ msgstr "Predefinido" #: libreplan-webapp/src/main/java/org/libreplan/web/qualityforms/QualityFormCRUDController.java:344 #: libreplan-webapp/src/main/java/org/libreplan/web/common/CustomMenuController.java:325 -#: libreplan-webapp/src/main/webapp/templates/templates.zul:67 +#: libreplan-webapp/src/main/webapp/templates/templates.zul:68 #: libreplan-webapp/src/main/webapp/templates/_editTemplateWindow.zul:53 msgid "Quality Forms" msgstr "Formularios de calidad" @@ -211,11 +211,15 @@ msgstr "Formularios de calidad" msgid "Reports" msgstr "Informes" +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/assigntemplates/TemplateFinderPopup.java:117 +msgid "Create task" +msgstr "Crear tarea" + #: libreplan-webapp/src/main/webapp/planner/advance_allocation.zul:22 msgid "LibrePlan: Advanced allocation" msgstr "LibrePlan: Asignación avanzada" -#: libreplan-webapp/src/main/java/org/libreplan/web/common/ConfigurationModel.java:172 +#: libreplan-webapp/src/main/java/org/libreplan/web/common/ConfigurationModel.java:177 msgid "The {0} sequence prefixes can not be repeated" msgstr "Los prefijos de secuencia de {0} no pueden repetirse" @@ -302,7 +306,7 @@ msgid "generic workers allocation" msgstr "asignación genérica de trabajadores" #: libreplan-webapp/src/main/java/org/libreplan/web/resourceload/ResourceLoadController.java:310 -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:895 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:899 msgid "The project has no scheduled elements" msgstr "El proyecto no tiene elementos planificados" @@ -380,19 +384,19 @@ msgstr "Haz click en este" msgid "Project Name" msgstr "Nombre del proyecto" -#: libreplan-webapp/src/main/java/org/libreplan/web/tree/TreeController.java:967 +#: libreplan-webapp/src/main/java/org/libreplan/web/tree/TreeController.java:1084 #: libreplan-webapp/src/main/java/org/libreplan/web/resources/criterion/CriterionTreeController.java:306 msgid "Indent" msgstr "Indentar" +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/reassign/ReassignCommand.java:252 +msgid "Reassignation" +msgstr "Reasignación" + #: libreplan-webapp/src/main/webapp/common/configuration.zul:327 msgid "Save passwords in database" msgstr "Guardar contraseñas en la base de datos" -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/reassign/ReassignCommand.java:256 -msgid "Reassignation" -msgstr "Reasignación" - #: libreplan-webapp/src/main/java/org/libreplan/web/templates/TemplatesTree.java:42 msgid "New template" msgstr "Plantilla nueva" @@ -461,7 +465,7 @@ msgid "" "applicable to this resource" msgstr "existen criterios satisfechos que pertenecen a tipos de criterio no aplicables a este recurso" -#: libreplan-webapp/src/main/webapp/templates/templates.zul:65 +#: libreplan-webapp/src/main/webapp/templates/templates.zul:66 #: libreplan-webapp/src/main/webapp/orders/_editOrderElement.zul:52 #: libreplan-webapp/src/main/webapp/orders/_edition.zul:50 msgid "Criterion Requirement" @@ -596,7 +600,7 @@ msgstr "Octubre" msgid "First name" msgstr "Nombre" -#: libreplan-webapp/src/main/java/org/libreplan/web/print/CutyPrint.java:256 +#: libreplan-webapp/src/main/java/org/libreplan/web/print/CutyPrint.java:250 msgid "Could not execute print command" msgstr "No se pudo ejecutar el comando de impresión" @@ -609,7 +613,7 @@ msgstr "Campos de texto complementario" #: libreplan-webapp/src/main/java/org/libreplan/web/workreports/WorkReportCRUDController.java:1226 #: libreplan-webapp/src/main/java/org/libreplan/web/calendars/BaseCalendarCRUDController.java:452 #: libreplan-webapp/src/main/java/org/libreplan/web/orders/AssignedTaskQualityFormsToOrderElementController.java:200 -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:832 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:836 msgid "Confirm deleting {0}. Are you sure?" msgstr "Confirmar el borrado de {0}. ¿Está seguro?" @@ -736,7 +740,7 @@ msgstr "Este proyecto ya ha sido añadido." msgid "The task code cannot be null" msgstr "El código de la tarea no puede ser nulo" -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderElementTreeController.java:594 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderElementTreeController.java:596 #: libreplan-webapp/src/main/java/org/libreplan/web/common/CustomMenuController.java:329 #: libreplan-webapp/src/main/webapp/planner/taskpanels/_taskInformation.zul:32 #: libreplan-webapp/src/main/webapp/resources/search/allocation_selector.zul:39 @@ -813,7 +817,7 @@ msgstr "Junio" msgid "{0} annotation required on {1}" msgstr "{0} anotación obligatoria en {1}" -#: libreplan-webapp/src/main/java/org/libreplan/web/tree/TreeController.java:1067 +#: libreplan-webapp/src/main/java/org/libreplan/web/tree/TreeController.java:1193 msgid "Modified" msgstr "Modificado" @@ -878,7 +882,7 @@ msgstr "El progreso calculado no se puede modificar" msgid "Work done from starting date" msgstr "Trabajo realizado desde la fecha de inicio" -#: libreplan-webapp/src/main/webapp/templates/templates.zul:69 +#: libreplan-webapp/src/main/webapp/templates/templates.zul:70 msgid "Statistics log" msgstr "Histórico de estadísticas" @@ -887,7 +891,7 @@ msgstr "Histórico de estadísticas" msgid "Edit Calendar" msgstr "Editar calendario" -#: libreplan-webapp/src/main/java/org/libreplan/web/users/ProfileCRUDController.java:112 +#: libreplan-webapp/src/main/java/org/libreplan/web/users/ProfileCRUDController.java:117 msgid "Profile" msgstr "Perfil" @@ -910,7 +914,7 @@ msgstr "No puede ser vacío o nulo" msgid "{0} \"{1}\" saved" msgstr "{0} \"{1}\" guardado" -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/OrderPlanningController.java:299 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/OrderPlanningController.java:301 msgid "filtering" msgstr "filtrado" @@ -967,6 +971,12 @@ msgstr "Este criterio ya ha sido añadido." msgid "add" msgstr "añadir" +#: libreplan-webapp/src/main/java/org/libreplan/web/tree/TreeController.java:860 +#: libreplan-webapp/src/main/webapp/templates/templates.zul:111 +#: libreplan-webapp/src/main/webapp/orders/_orderElementDetails.zul:69 +msgid "Budget value cannot be negative" +msgstr "El valor del presupuesto no puede ser negativo" + #: libreplan-webapp/src/main/java/org/libreplan/web/orders/TreeElementOperationsController.java:239 msgid "Unsaved changes will be lost. Would you like to continue?" msgstr "Se perderán los cambios sin guardar. ¿Le gustaría continuar?" @@ -1044,8 +1054,8 @@ msgstr "Añadir rol" msgid "Exception end date should be greater or equals than start date" msgstr "La fecha de fin de una excepción debe ser mayor o igual que la fecha de inicio" -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/SaveCommandBuilder.java:476 -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/SaveCommandBuilder.java:486 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/SaveCommandBuilder.java:474 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/SaveCommandBuilder.java:484 msgid "Repeated Project code {0} in Project {1}" msgstr "Código {0} de proyecto repetdio en proyecto {1}" @@ -1075,7 +1085,7 @@ msgstr "Fecha de inicio más temprana" msgid "Type data" msgstr "Datos del tipo" -#: libreplan-webapp/src/main/java/org/libreplan/web/users/ProfileCRUDController.java:117 +#: libreplan-webapp/src/main/java/org/libreplan/web/users/ProfileCRUDController.java:122 #: libreplan-webapp/src/main/java/org/libreplan/web/common/CustomMenuController.java:322 msgid "Profiles" msgstr "Perfiles" @@ -1221,13 +1231,13 @@ msgstr "Lista de Perfiles" msgid "both {0} of category {1} and {2} of category {3} have the same code" msgstr "{0} de la categoría {1} y {2} de la categoría {3} tienen el mismo código" -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/TaskElementAdapter.java:958 -#: libreplan-webapp/src/main/java/org/libreplan/web/templates/TemplatesTreeController.java:236 -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderModel.java:690 -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderElementTreeController.java:581 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/TaskElementAdapter.java:1039 +#: libreplan-webapp/src/main/java/org/libreplan/web/templates/TemplatesTreeController.java:240 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderModel.java:696 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderElementTreeController.java:583 #: libreplan-webapp/src/main/java/org/libreplan/web/common/CustomMenuController.java:331 #: libreplan-webapp/src/main/webapp/planner/taskpanels/_tabPanelSubcontract.zul:68 -#: libreplan-webapp/src/main/webapp/templates/templates.zul:64 +#: libreplan-webapp/src/main/webapp/templates/templates.zul:65 #: libreplan-webapp/src/main/webapp/templates/_editTemplateWindow.zul:50 #: libreplan-webapp/src/main/webapp/orders/_editOrderElement.zul:50 msgid "Labels" @@ -1237,7 +1247,7 @@ msgstr "Etiquetas" msgid "Data Types" msgstr "Tipos de datos" -#: libreplan-webapp/src/main/webapp/orders/_edition.zul:157 +#: libreplan-webapp/src/main/webapp/orders/_edition.zul:161 #: libreplan-webapp/src/main/webapp/orders/_listOrderElementHours.zul:68 msgid "Total hours" msgstr "Total de horas" @@ -1254,8 +1264,8 @@ msgstr "Reasignando {0} proyectos" msgid "Filter by task status" msgstr "Filtrar por estado de tarea" -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/OrderPlanningModel.java:528 -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/company/CompanyPlanningModel.java:419 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/OrderPlanningModel.java:529 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/company/CompanyPlanningModel.java:416 msgid "Select date" msgstr "Seleccione fecha" @@ -1272,19 +1282,23 @@ msgstr "Por favor, inténtelo de nuevo." msgid "Company code" msgstr "Código de la empresa" +#: libreplan-webapp/src/main/webapp/orders/_listOrderElementHours.zul:62 +msgid "Sum of imputed hours in children tasks" +msgstr "Suma de horas imputadas en las tareas hijas" + #: libreplan-webapp/src/main/java/org/libreplan/web/common/components/TwoWaySelector.java:110 msgid "Unknown attribute '{0}' in class {1}" msgstr "Atributo desconocido '{0}' en la clase {1}" +#: libreplan-webapp/src/main/java/org/libreplan/web/users/settings/PasswordController.java:96 +msgid "passwords can not be empty" +msgstr "las conraseñas no pueden estar vacías" + #: libreplan-webapp/src/main/java/org/libreplan/web/resources/worker/WorkerCRUDController.java:699 #: libreplan-business/src/main/java/org/libreplan/business/resources/entities/ResourceType.java:33 msgid "NON LIMITING RESOURCE" msgstr "RECURSO NO LIMITANTE" -#: libreplan-webapp/src/main/java/org/libreplan/web/users/settings/PasswordController.java:96 -msgid "passwords can not be empty" -msgstr "las conraseñas no pueden estar vacías" - #: libreplan-webapp/src/main/java/org/libreplan/web/orders/labels/AssignedLabelsController.java:88 #: libreplan-webapp/src/main/java/org/libreplan/web/orders/labels/AssignedLabelsController.java:128 #: libreplan-webapp/src/main/java/org/libreplan/web/orders/AssignedTaskQualityFormsToOrderElementController.java:176 @@ -1433,11 +1447,15 @@ msgstr "Lista de tramos" msgid "Enable scenarios module" msgstr "Habilitar módulo de escenarios" +#: libreplan-webapp/src/main/java/org/libreplan/web/calendars/BaseCalendarEditionController.java:312 +msgid "to {0}" +msgstr "hasta {0}" + #: libreplan-webapp/src/main/webapp/limitingresources/limitingResourcesLayout.zul:59 msgid "Zoom" msgstr "Zoom" -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/SaveCommandBuilder.java:865 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/SaveCommandBuilder.java:863 #: libreplan-webapp/src/main/webapp/labels/_editLabelType.zul:112 #: libreplan-webapp/src/main/webapp/advance/advanceTypes.zul:37 #: libreplan-webapp/src/main/webapp/excetiondays/_editExceptionDayType.zul:91 @@ -1453,9 +1471,9 @@ msgstr "Zoom" #: libreplan-webapp/src/main/webapp/qualityforms/_editQualityForm.zul:131 #: libreplan-webapp/src/main/webapp/settings/changePassword.zul:81 #: libreplan-webapp/src/main/webapp/settings/settings.zul:124 -#: libreplan-webapp/src/main/webapp/users/_editProfile.zul:81 -#: libreplan-webapp/src/main/webapp/users/_editUser.zul:162 -#: libreplan-webapp/src/main/webapp/templates/templates.zul:135 +#: libreplan-webapp/src/main/webapp/users/_editProfile.zul:70 +#: libreplan-webapp/src/main/webapp/users/_editUser.zul:151 +#: libreplan-webapp/src/main/webapp/templates/templates.zul:143 #: libreplan-webapp/src/main/webapp/calendars/calendars.zul:44 #: libreplan-webapp/src/main/webapp/resources/worker/virtualWorkers.zul:40 #: libreplan-webapp/src/main/webapp/resources/worker/worker.zul:41 @@ -1514,7 +1532,7 @@ msgstr "Problemas conectando con el servicio web subcontratista" msgid "Entity type" msgstr "Tipo de entidad" -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/OrderPlanningModel.java:1101 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/OrderPlanningModel.java:1127 #: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:268 msgid "Unsaved changes will be lost. Are you sure?" msgstr "Se perderán los cambios sin guardar. ¿Está seguro?" @@ -1555,13 +1573,13 @@ msgstr "Recursos por día" msgid "ResourceType must be not-null" msgstr "El tipo de recurso no puede ser nulo" -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrdersTreeComponent.java:95 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrdersTreeComponent.java:105 msgid "" "Estimated end date for the task (press enter in textbox to open calendar " "popup or type in date directly)" msgstr "Fecha de fin estimada para la tarea (presione enter en el cuadro de texto para abrir el calendario o escriba la fecha directamente)" -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderElementTreeController.java:292 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderElementTreeController.java:293 msgid "Expand/Collapse all" msgstr "Expandir/Plegar todo" @@ -1569,11 +1587,11 @@ msgstr "Expandir/Plegar todo" msgid "Overload due to current project" msgstr "Sobrecarga debido al proyecto actual" -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/TaskElementAdapter.java:946 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/TaskElementAdapter.java:1017 msgid "Name: {0}" msgstr "Nombre: {0}" -#: libreplan-webapp/src/main/java/org/libreplan/web/tree/TreeController.java:903 +#: libreplan-webapp/src/main/java/org/libreplan/web/tree/TreeController.java:1020 msgid "Move down" msgstr "Mover abajo" @@ -1620,7 +1638,7 @@ msgstr "Asignar" msgid "missing code in a criterion" msgstr "falta código en un criterio" -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:1278 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:1282 msgid "Create Template" msgstr "Crear plantilla" @@ -1637,7 +1655,7 @@ msgstr "Búsqueda avanzada" msgid "Filter by labels" msgstr "Filtrar por etiquetas" -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/taskedition/TaskPropertiesController.java:577 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/taskedition/TaskPropertiesController.java:586 msgid "" "IMPORTANT: Don't forget to communicate to subcontractor that his contract " "has been cancelled" @@ -1668,10 +1686,10 @@ msgstr "Código de estado" #: libreplan-webapp/src/main/java/org/libreplan/web/costcategories/TypeOfWorkHoursCRUDController.java:103 #: libreplan-webapp/src/main/java/org/libreplan/web/qualityforms/QualityFormCRUDController.java:391 #: libreplan-webapp/src/main/java/org/libreplan/web/planner/taskedition/AdvancedAllocationTaskController.java:73 -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/taskedition/TaskPropertiesController.java:509 -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/taskedition/TaskPropertiesController.java:547 -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/taskedition/TaskPropertiesController.java:578 -#: libreplan-webapp/src/main/java/org/libreplan/web/users/ProfileCRUDController.java:148 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/taskedition/TaskPropertiesController.java:518 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/taskedition/TaskPropertiesController.java:556 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/taskedition/TaskPropertiesController.java:587 +#: libreplan-webapp/src/main/java/org/libreplan/web/users/ProfileCRUDController.java:153 #: libreplan-webapp/src/main/java/org/libreplan/web/calendars/BaseCalendarCRUDController.java:476 msgid "Warning" msgstr "Advertencia" @@ -1788,8 +1806,8 @@ msgstr "el nombre no puede ser nulo o vacío" msgid "Add From Template" msgstr "Añadir a partir de plantilla" -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/taskedition/TaskPropertiesController.java:508 -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/taskedition/TaskPropertiesController.java:546 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/taskedition/TaskPropertiesController.java:517 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/taskedition/TaskPropertiesController.java:555 msgid "Assigned resources for this task will be deleted. Are you sure?" msgstr "Los recursos asignados para esta tarea serán borrados. ¿Está seguro?" @@ -1824,7 +1842,7 @@ msgstr "Julio" msgid "Enable LDAP authentication" msgstr "Habilitar la autenticación LDAP" -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/consolidations/AdvanceConsolidationModel.java:493 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/consolidations/AdvanceConsolidationModel.java:490 msgid "( max: {0} )" msgstr "( máx: {0} )" @@ -1845,7 +1863,7 @@ msgid "Cannot calculate charts for current data" msgstr "No se pueden calcular gráficos para los datos actuales" #: libreplan-webapp/src/main/java/org/libreplan/web/orders/ProjectDetailsController.java:176 -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:1495 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:1499 msgid "project name already being used" msgstr "el nombre de proyecto ya está siendo usado" @@ -1862,7 +1880,7 @@ msgstr "Dividir asignación" msgid "You can not remove the default scenario called \"{0}\"" msgstr "No se puede borrar el escenario por defecto, llamado \"{0}\"" -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/consolidations/AdvanceConsolidationModel.java:522 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/consolidations/AdvanceConsolidationModel.java:519 msgid "There are not any assigned progress to current task" msgstr "No hay ningún progreso asignado a la tarea actual" @@ -1891,7 +1909,7 @@ msgstr "Abajo" msgid "Label" msgstr "Etiqueta" -#: libreplan-webapp/src/main/java/org/libreplan/web/tree/TreeController.java:870 +#: libreplan-webapp/src/main/java/org/libreplan/web/tree/TreeController.java:987 msgid "Value is not valid, taking into account the current list of HoursGroup" msgstr "El valor no es válido, teniendo en cuenta la lista actual de grupos de horas" @@ -1908,8 +1926,8 @@ msgstr "falta el tipo de horas en una línea del parte de trabajo" msgid "Quality forms" msgstr "Formularios de calidad" -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/SaveCommandBuilder.java:499 -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/SaveCommandBuilder.java:509 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/SaveCommandBuilder.java:497 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/SaveCommandBuilder.java:507 msgid "Repeated Hours Group code {0} in Project {1}" msgstr "Código {0} de grupo de horas repetido en proyecto {1}" @@ -1921,7 +1939,7 @@ msgstr "Grupo de horas" msgid "LibrePlan: Accounts" msgstr "LibrePlan: Cuentas" -#: libreplan-webapp/src/main/webapp/templates/templates.zul:96 +#: libreplan-webapp/src/main/webapp/templates/templates.zul:97 #: libreplan-webapp/src/main/webapp/templates/_list.zul:30 msgid "Days from Beginning to Deadline" msgstr "Días desde el comienzo hasta la fecha límite" @@ -1954,7 +1972,7 @@ msgstr "Op." msgid "Pessimistic" msgstr "Pesimista" -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/taskedition/TaskPropertiesController.java:376 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/taskedition/TaskPropertiesController.java:385 msgid "Limiting resource assignation" msgstr "Asignación de recursos limitantes" @@ -1985,7 +2003,7 @@ msgstr "El nombre del tipo de unidad no puede ser vacío" msgid "Entity sequences" msgstr "Secuencias de entidad" -#: libreplan-webapp/src/main/webapp/templates/templates.zul:91 +#: libreplan-webapp/src/main/webapp/templates/templates.zul:92 #: libreplan-webapp/src/main/webapp/templates/_list.zul:28 msgid "Delay from beginning (days)" msgstr "Retraso desde el comienzo (en días)" @@ -2015,7 +2033,7 @@ msgstr "Confirmar cancelación" msgid "Work And Progress Per Task" msgstr "Trabajo y progreso por tarea" -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:1519 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:1523 msgid "project code already being used" msgstr "el código del proyecto ya está siendo usado" @@ -2034,8 +2052,8 @@ msgstr "Borrando secuencia" #: libreplan-webapp/src/main/java/org/libreplan/web/calendars/BaseCalendarCRUDController.java:457 #: libreplan-webapp/src/main/java/org/libreplan/web/orders/AssignedTaskQualityFormsToOrderElementController.java:208 #: libreplan-webapp/src/main/java/org/libreplan/web/orders/criterionrequirements/AssignedCriterionRequirementController.java:264 -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:840 -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:875 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:844 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:879 msgid "Error on showing removing element: " msgstr "Error al mostrar el elemento a borrar: " @@ -2096,7 +2114,7 @@ msgid "Overload" msgstr "Sobrecarga" #: libreplan-webapp/src/main/webapp/templates/_historicalAssignment.zul:30 -#: libreplan-webapp/src/main/webapp/templates/templates.zul:68 +#: libreplan-webapp/src/main/webapp/templates/templates.zul:69 msgid "Assignment log" msgstr "Histórico de asignación" @@ -2105,10 +2123,6 @@ msgstr "Histórico de asignación" msgid "Work Report Models" msgstr "Modelos de partes de trabajo" -#: libreplan-webapp/src/main/java/org/libreplan/web/print/CutyCaptTimeout.java:45 -msgid "CutycaptTimeout thread exception" -msgstr "Excepción de thread CutycaptTimeout" - #: libreplan-webapp/src/main/webapp/materials/materials.zul:73 msgid "New" msgstr "Nuevo" @@ -2117,7 +2131,7 @@ msgstr "Nuevo" msgid "Date last progress measurement" msgstr "Fecha de la última medida de progreso" -#: libreplan-webapp/src/main/java/org/libreplan/web/templates/TemplatesTreeComponent.java:103 +#: libreplan-webapp/src/main/java/org/libreplan/web/templates/TemplatesTreeComponent.java:112 msgid "Deadline (days since beggining project)" msgstr "Fecha límite (días desde el inicio del proyecto)" @@ -2147,14 +2161,14 @@ msgstr "el nombre de tipo de criterio está siendo usado" msgid "Task code cannot be null" msgstr "El código de la tarea no puede ser nulo" -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/consolidations/AdvanceConsolidationModel.java:520 +#: libreplan-webapp/src/main/java/org/libreplan/web/calendars/BaseCalendarEditionController.java:302 +msgid "Derived of calendar {0}" +msgstr "Derivado del calendario {0}" + +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/consolidations/AdvanceConsolidationModel.java:517 msgid "It is not allowed to consolidate progress." msgstr "No se permite consolidar progreso." -#: libreplan-webapp/src/main/webapp/orders/components/_orderElementTree.zul:32 -msgid "Create Task" -msgstr "Crear tarea" - #: libreplan-webapp/src/main/webapp/planner/taskpanels/_tabPanelSubcontract.zul:27 msgid "External company" msgstr "Empresa externa" @@ -2163,10 +2177,10 @@ msgstr "Empresa externa" #: libreplan-webapp/src/main/webapp/costcategories/_listTypesOfWorkHours.zul:30 #: libreplan-webapp/src/main/webapp/costcategories/_listCostCategories.zul:28 #: libreplan-webapp/src/main/webapp/users/_listUsers.zul:30 -#: libreplan-webapp/src/main/webapp/users/_editProfile.zul:60 +#: libreplan-webapp/src/main/webapp/users/_editProfile.zul:61 #: libreplan-webapp/src/main/webapp/users/_listProfiles.zul:27 -#: libreplan-webapp/src/main/webapp/users/_editUser.zul:107 -#: libreplan-webapp/src/main/webapp/users/_editUser.zul:140 +#: libreplan-webapp/src/main/webapp/users/_editUser.zul:108 +#: libreplan-webapp/src/main/webapp/users/_editUser.zul:129 #: libreplan-webapp/src/main/webapp/orders/_listOrderElementAuthorizations.zul:44 #: libreplan-webapp/src/main/webapp/orders/_listOrderElementAuthorizations.zul:68 msgid "Actions" @@ -2239,11 +2253,15 @@ msgstr "El valor no es válido.\n El código no puede contener caracteres como ' msgid "Hours Group" msgstr "Grupo de horas" +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/TaskElementAdapter.java:1029 +msgid "Budget: {0}€, Consumed: {1}€ ({2}%)" +msgstr "Presupuesto: {0}€, Consumido: {1}€ ({2}%)" + #: libreplan-webapp/src/main/java/org/libreplan/web/workreports/WorkReportTypeCRUDController.java:825 msgid "Unallocated name" msgstr "Nombre no asignado" -#: libreplan-webapp/src/main/java/org/libreplan/web/tree/TreeController.java:924 +#: libreplan-webapp/src/main/java/org/libreplan/web/tree/TreeController.java:1041 msgid "Move up" msgstr "Mover arriba" @@ -2257,7 +2275,7 @@ msgstr "Fecha de comunicación de la subcontratación" #: libreplan-webapp/src/main/java/org/libreplan/web/planner/tabs/MultipleTabsPlannerController.java:131 #: libreplan-webapp/src/main/java/org/libreplan/web/planner/tabs/MultipleTabsPlannerController.java:134 -#: libreplan-webapp/src/main/java/org/libreplan/web/templates/OrderTemplatesController.java:281 +#: libreplan-webapp/src/main/java/org/libreplan/web/templates/OrderTemplatesController.java:301 #: libreplan-webapp/src/main/java/org/libreplan/web/common/CustomMenuController.java:269 #: libreplan-webapp/src/main/java/org/libreplan/web/common/CustomMenuController.java:367 msgid "Scheduling" @@ -2293,17 +2311,17 @@ msgstr "Página arriba" msgid "Create new project" msgstr "Crear nuevo proyecto" -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/TaskElementAdapter.java:954 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/TaskElementAdapter.java:1026 #: libreplan-webapp/src/main/java/org/libreplan/web/common/components/finders/TaskGroupFilterEnum.java:31 #: libreplan-webapp/src/main/java/org/libreplan/web/common/components/finders/OrderFilterEnum.java:31 #: libreplan-webapp/src/main/webapp/subcontract/subcontractedTasks.zul:53 #: libreplan-webapp/src/main/webapp/subcontract/reportAdvances.zul:50 -#: libreplan-webapp/src/main/webapp/orders/_edition.zul:161 +#: libreplan-webapp/src/main/webapp/orders/_edition.zul:165 #: libreplan-webapp/src/main/webapp/orders/_list.zul:35 msgid "State" msgstr "Estado" -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrdersTreeComponent.java:80 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrdersTreeComponent.java:90 msgid "Must start after" msgstr "Debe empezar después" @@ -2311,7 +2329,7 @@ msgstr "Debe empezar después" msgid "Confirm change" msgstr "Confirmar cambio" -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:845 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:849 msgid "You don't have permissions to edit this project" msgstr "No tiene permisos para editar este proyecto" @@ -2350,7 +2368,7 @@ msgstr "LibrePlan: Materiales" msgid "New task" msgstr "Nueva tarea" -#: libreplan-webapp/src/main/java/org/libreplan/web/users/UserCRUDController.java:191 +#: libreplan-webapp/src/main/java/org/libreplan/web/users/UserCRUDController.java:197 msgid "The password for a new user cannot be empty" msgstr "La contraseña no puede ser vacía para un usuario nuevo" @@ -2402,7 +2420,7 @@ msgstr "Detalles personales" msgid "Workers List" msgstr "Lista de trabajadores" -#: libreplan-webapp/src/main/java/org/libreplan/web/templates/OrderTemplatesController.java:355 +#: libreplan-webapp/src/main/java/org/libreplan/web/templates/OrderTemplatesController.java:375 msgid "Delete project template. Are you sure?" msgstr "Borrar plantilla de proyecto. ¿Está seguro?" @@ -2483,18 +2501,18 @@ msgstr "Otros proyectos" msgid "Tasks input buffer" msgstr "Buffer de tareas de entrada" -#: libreplan-webapp/src/main/java/org/libreplan/web/common/ConfigurationModel.java:168 +#: libreplan-webapp/src/main/java/org/libreplan/web/common/ConfigurationModel.java:173 msgid "At least one {0} sequence must be active" msgstr "Al menos una secuencia de {0} debe estar activa" #: libreplan-webapp/src/main/webapp/users/_listProfiles.zul:26 -#: libreplan-webapp/src/main/webapp/users/_editUser.zul:139 +#: libreplan-webapp/src/main/webapp/users/_editUser.zul:128 #: libreplan-webapp/src/main/webapp/orders/_listOrderElementAuthorizations.zul:42 #: libreplan-webapp/src/main/webapp/orders/_listOrderElementAuthorizations.zul:66 msgid "Profile name" msgstr "Nombre del perfil" -#: libreplan-webapp/src/main/java/org/libreplan/web/print/CutyPrint.java:252 +#: libreplan-webapp/src/main/java/org/libreplan/web/print/CutyPrint.java:246 msgid "Could open generated PDF" msgstr "No se pudo abrir el PDF generado" @@ -2506,7 +2524,7 @@ msgstr "Deshabilitar borrado" msgid "You should select a source scenario" msgstr "Debe seleccionar un escenario de origen" -#: libreplan-webapp/src/main/java/org/libreplan/web/common/ConfigurationModel.java:163 +#: libreplan-webapp/src/main/java/org/libreplan/web/common/ConfigurationModel.java:168 msgid "At least one {0} sequence is needed" msgstr "Se necesita al menos una secuencia de {0}" @@ -2541,18 +2559,18 @@ msgid "" "to generate usage statistics" msgstr "Marca esta opción para enviar información a los desarroladores de LibrePlan para generar estadísticas de uso" -#: libreplan-webapp/src/main/webapp/resources/search/_resourceFilter.zul:36 -msgid "More options" -msgstr "Más opciones" +#: libreplan-webapp/src/main/java/org/libreplan/web/subcontract/ReportAdvancesModel.java:219 +#: libreplan-webapp/src/main/java/org/libreplan/web/subcontract/SubcontractedTasksModel.java:179 +msgid "Error: {0}" +msgstr "Error: {0}" #: libreplan-webapp/src/main/webapp/subcontract/subcontractedTasks.zul:45 msgid "Communication" msgstr "Comunicación" -#: libreplan-webapp/src/main/java/org/libreplan/web/subcontract/ReportAdvancesModel.java:219 -#: libreplan-webapp/src/main/java/org/libreplan/web/subcontract/SubcontractedTasksModel.java:179 -msgid "Error: {0}" -msgstr "Error: {0}" +#: libreplan-webapp/src/main/webapp/resources/search/_resourceFilter.zul:36 +msgid "More options" +msgstr "Más opciones" #: libreplan-webapp/src/main/java/org/libreplan/web/orders/TreeElementOperationsController.java:240 msgid "Confirm create template" @@ -2584,7 +2602,7 @@ msgstr "LibrePlan: trabajo y progreso por tarea" msgid "Projects" msgstr "Proyectos" -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/OrderPlanningModel.java:1102 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/OrderPlanningModel.java:1128 #: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:269 msgid "Confirm exit dialog" msgstr "Diálogo para confirmar la salida" @@ -2662,7 +2680,7 @@ msgstr "Registro de trabajo" msgid "Output format" msgstr "Formato de salida" -#: libreplan-webapp/src/main/webapp/planner/print_configuration.zul:47 +#: libreplan-webapp/src/main/webapp/planner/print_configuration.zul:49 msgid "Print" msgstr "Imprimir" @@ -2682,8 +2700,8 @@ msgstr "el tipo de recurso no permite criterios habilitados" msgid "Effort cannot be null" msgstr "El esfuerzo no puede ser nulo" -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/OrderPlanningModel.java:1093 -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/assigntemplates/TemplateFinderPopup.java:52 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/OrderPlanningModel.java:1119 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/assigntemplates/TemplateFinderPopup.java:126 #: libreplan-webapp/src/main/webapp/labels/_editLabelType.zul:116 #: libreplan-webapp/src/main/webapp/excetiondays/_editExceptionDayType.zul:97 #: libreplan-webapp/src/main/webapp/externalcompanies/_editExternalCompany.zul:106 @@ -2695,16 +2713,16 @@ msgstr "El esfuerzo no puede ser nulo" #: libreplan-webapp/src/main/webapp/costcategories/_editCostCategory.zul:98 #: libreplan-webapp/src/main/webapp/costcategories/_editTypeOfWorkHours.zul:80 #: libreplan-webapp/src/main/webapp/qualityforms/_editQualityForm.zul:137 -#: libreplan-webapp/src/main/webapp/planner/print_configuration.zul:48 +#: libreplan-webapp/src/main/webapp/planner/print_configuration.zul:50 #: libreplan-webapp/src/main/webapp/planner/editTask.zul:81 #: libreplan-webapp/src/main/webapp/planner/reassign.zul:50 #: libreplan-webapp/src/main/webapp/planner/stretches_function.zul:91 #: libreplan-webapp/src/main/webapp/planner/advance_allocation.zul:42 #: libreplan-webapp/src/main/webapp/planner/order.zul:131 #: libreplan-webapp/src/main/webapp/planner/order.zul:166 -#: libreplan-webapp/src/main/webapp/users/_editProfile.zul:85 -#: libreplan-webapp/src/main/webapp/users/_editUser.zul:166 -#: libreplan-webapp/src/main/webapp/templates/templates.zul:139 +#: libreplan-webapp/src/main/webapp/users/_editProfile.zul:74 +#: libreplan-webapp/src/main/webapp/users/_editUser.zul:155 +#: libreplan-webapp/src/main/webapp/templates/templates.zul:147 #: libreplan-webapp/src/main/webapp/calendars/_createNewVersion.zul:58 #: libreplan-webapp/src/main/webapp/calendars/calendars.zul:47 #: libreplan-webapp/src/main/webapp/resources/machine/_editMachine.zul:103 @@ -2740,8 +2758,8 @@ msgid "Machines List" msgstr "Lista de máquinas" #: libreplan-webapp/src/main/java/org/libreplan/web/resourceload/ResourceLoadController.java:320 -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:692 -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:904 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:696 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:908 msgid "You don't have read access to this project" msgstr "No tiene acceso de lectura a este proyecto" @@ -2817,7 +2835,7 @@ msgstr "{0} (máx: {1})" msgid "Cost Category" msgstr "Categoría de coste" -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderElementTreeController.java:471 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderElementTreeController.java:473 msgid "end" msgstr "fin" @@ -2838,7 +2856,7 @@ msgstr "Autorizaciones" msgid "Continue" msgstr "Continuar" -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderElementController.java:121 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderElementController.java:122 msgid "Edit task {0}" msgstr "Editar tarea {0}" @@ -2871,7 +2889,7 @@ msgstr "Valor máximo por defecto" msgid "Add criterion requirement" msgstr "Añadir criterio requerido" -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:860 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:864 msgid "" "You can not remove the project \"{0}\" because of any of its tasks are " "already in use in some work reports and the project just exists in the " @@ -2911,7 +2929,7 @@ msgstr "LibrePlan: Cambiar la contraseña" msgid "please, select a label" msgstr "por favor, seleccione una etiqueta" -#: libreplan-webapp/src/main/webapp/users/_editUser.zul:134 +#: libreplan-webapp/src/main/webapp/users/_editUser.zul:123 msgid "Add profile" msgstr "Añadir perfil" @@ -2990,8 +3008,8 @@ msgstr "el nombre no puede ser vacío" msgid "Disabled" msgstr "Deshabilitado" -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/OrderPlanningModel.java:738 -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/company/CompanyPlanningModel.java:325 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/OrderPlanningModel.java:764 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/company/CompanyPlanningModel.java:322 msgid "Earned value" msgstr "Valor ganado" @@ -3020,8 +3038,8 @@ msgid "" "Please save your project before proceeding." msgstr "Las plantillas sólo pueden ser creadas a partir de tareas existentes. Está intentando crear unha plantilla a partir de una tarea nueva.\nPor favor guarde su proyecto antes de continuar." -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/TaskElementAdapter.java:1163 -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/TaskElementAdapter.java:1178 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/TaskElementAdapter.java:1243 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/TaskElementAdapter.java:1258 msgid "{0} not supported yet" msgstr "{0} aún no soportado" @@ -3043,7 +3061,7 @@ msgstr "Entrada nueva" msgid "Resources Load" msgstr "Carga de recursos" -#: libreplan-webapp/src/main/java/org/libreplan/web/common/ConfigurationModel.java:220 +#: libreplan-webapp/src/main/java/org/libreplan/web/common/ConfigurationModel.java:225 msgid "Some sequences to remove not existed" msgstr "Algunas secuencias para borrar no existen" @@ -3118,11 +3136,11 @@ msgid "Select start date" msgstr "Seleccionar fecha de inicio" #: libreplan-webapp/src/main/java/org/libreplan/web/costcategories/TypeOfWorkHoursCRUDController.java:106 -#: libreplan-webapp/src/main/java/org/libreplan/web/users/ProfileCRUDController.java:152 +#: libreplan-webapp/src/main/java/org/libreplan/web/users/ProfileCRUDController.java:157 msgid "Error on showing warning message removing typeOfWorkHours: " msgstr "Error al mostrar mensaje de advertencia borrando tipo de horas de trabajo: " -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:882 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:886 msgid "Removed {0}" msgstr "{0} borrado" @@ -3134,8 +3152,8 @@ msgstr "Confirmar el borrado de este trabajador. ¿Está seguro?" msgid "Group name" msgstr "Nombre del grupo" -#: libreplan-webapp/src/main/webapp/users/_editProfile.zul:59 -#: libreplan-webapp/src/main/webapp/users/_editUser.zul:106 +#: libreplan-webapp/src/main/webapp/users/_editProfile.zul:60 +#: libreplan-webapp/src/main/webapp/users/_editUser.zul:107 msgid "Role name" msgstr "Nombre del rol" @@ -3151,8 +3169,8 @@ msgstr "Crear parte de trabajo" msgid "Value is not valid, the precision value must not be empty" msgstr "El valor no es válido, el valor de precisión no debe ser vacío" -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/OrderPlanningModel.java:863 -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/company/CompanyPlanningModel.java:473 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/OrderPlanningModel.java:889 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/company/CompanyPlanningModel.java:470 msgid "h" msgstr "h" @@ -3177,7 +3195,7 @@ msgstr "Añadir hito" msgid "Assign selected items" msgstr "Asignar elementos seleccionados" -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderElementTreeController.java:450 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderElementTreeController.java:452 msgid "init" msgstr "inicio" @@ -3254,6 +3272,10 @@ msgstr "Cliente" msgid "Hours type" msgstr "Tipo de horas" +#: libreplan-webapp/src/main/webapp/planner/print_configuration.zul:43 +msgid "Show money cost bar" +msgstr "Monstrar barra de coste monetario" + #: libreplan-webapp/src/main/java/org/libreplan/ws/resources/impl/ResourceConverter.java:156 #: libreplan-business/src/main/java/org/libreplan/business/resources/entities/CriterionType.java:211 msgid "criterion type name not specified" @@ -3267,11 +3289,11 @@ msgstr "No se puede conectar al servidor de LDAP" msgid "Add Exception" msgstr "Añadir excepción" -#: libreplan-webapp/src/main/java/org/libreplan/web/tree/TreeController.java:220 +#: libreplan-webapp/src/main/java/org/libreplan/web/tree/TreeController.java:222 #: libreplan-webapp/src/main/java/org/libreplan/web/qualityforms/QualityFormCRUDController.java:202 #: libreplan-webapp/src/main/java/org/libreplan/web/qualityforms/QualityFormCRUDController.java:223 #: libreplan-webapp/src/main/java/org/libreplan/web/qualityforms/QualityFormCRUDController.java:247 -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderElementTreeController.java:378 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderElementTreeController.java:379 msgid "cannot be empty" msgstr "no puede ser vacío" @@ -3395,7 +3417,7 @@ msgstr "Opciones de exportación" #: libreplan-webapp/src/main/webapp/reports/workingArrangementsPerOrderReport.zul:145 #: libreplan-webapp/src/main/webapp/reports/timeLineMaterialReport.zul:94 #: libreplan-webapp/src/main/webapp/users/_editProfile.zul:40 -#: libreplan-webapp/src/main/webapp/templates/templates.zul:80 +#: libreplan-webapp/src/main/webapp/templates/templates.zul:81 #: libreplan-webapp/src/main/webapp/templates/_list.zul:27 #: libreplan-webapp/src/main/webapp/templates/_assignedQualityForms.zul:48 #: libreplan-webapp/src/main/webapp/subcontract/reportAdvances.zul:45 @@ -3464,7 +3486,7 @@ msgstr "Horas trabajadas por recurso" msgid "The end date cannot be before the init date" msgstr "La fecha de fin no puede ser anterior a la fecha de inicio" -#: libreplan-webapp/src/main/webapp/users/_editUser.zul:128 +#: libreplan-webapp/src/main/webapp/users/_editUser.zul:117 msgid "" "Profiles of LDAP users cannot be managed because LDAP roles are being used." msgstr "Los perfiles de los usuarios de LDAP no se pueden gestionar porque los roles de LDAP están siendo usados." @@ -3560,7 +3582,7 @@ msgstr "Grupo de trabajadores virtuales" msgid "Changes saved" msgstr "Cambios guardados" -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:1263 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:1267 msgid "See scheduling" msgstr "Ver planificación" @@ -3589,7 +3611,7 @@ msgid "Work report saved" msgstr "Parte de trabajo guardado" #: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/SubcontractCommand.java:53 -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/taskedition/TaskPropertiesController.java:377 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/taskedition/TaskPropertiesController.java:386 #: libreplan-webapp/src/main/webapp/planner/editTask.zul:68 msgid "Subcontract" msgstr "Subcontratar" @@ -3625,10 +3647,6 @@ msgstr "no puede ser vacío" msgid "April" msgstr "Abril" -#: libreplan-webapp/src/main/java/org/libreplan/web/calendars/BaseCalendarEditionController.java:302 -msgid "Derived of Calendar " -msgstr "Derivado del calendario " - #: libreplan-webapp/src/main/webapp/users/_listUsers.zul:22 msgid "Users List" msgstr "Lista de usuarios" @@ -3686,14 +3704,14 @@ msgstr "Filtrar formularios de calidad por" msgid "Unindent selected task" msgstr "Desindentar tarea seleccionada" -#: libreplan-webapp/src/main/webapp/planner/taskpanels/_tabPanelTaskProperties.zul:62 -msgid "Constraint" -msgstr "Restricción" - #: libreplan-webapp/src/main/webapp/subcontract/reportAdvances.zul:44 msgid "Customer reference code" msgstr "Código de referencia del cliente" +#: libreplan-webapp/src/main/webapp/planner/taskpanels/_tabPanelTaskProperties.zul:66 +msgid "Constraint" +msgstr "Restricción" + #: libreplan-webapp/src/main/webapp/workreports/_editWorkReportType.zul:150 msgid "Add New Label Type Field" msgstr "Añadir nuevo campo de tipo de etiqueta" @@ -3712,16 +3730,16 @@ msgstr "Referencia de cliente" #: libreplan-webapp/src/main/java/org/libreplan/web/templates/historicalAssignment/OrderElementHistoricalAssignmentComponent.java:146 #: libreplan-webapp/src/main/java/org/libreplan/web/resourceload/ResourceLoadController.java:311 #: libreplan-webapp/src/main/java/org/libreplan/web/resourceload/ResourceLoadController.java:321 -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:693 -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:846 -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:896 -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:905 -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:932 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:697 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:850 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:900 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:909 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:936 #: libreplan-webapp/src/main/java/org/libreplan/web/limitingresources/LimitingResourcesController.java:333 msgid "Information" msgstr "Información" -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:931 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:935 msgid "Sorry, you do not have permissions to access this project" msgstr "Lo sentimos, no tiene permisos para acceder a este proyecto" @@ -3745,7 +3763,7 @@ msgstr "Nuevo grupo de horas " msgid "Assign element to queue manually" msgstr "Asignar elemento a cola manualmente" -#: libreplan-webapp/src/main/webapp/planner/print_configuration.zul:45 +#: libreplan-webapp/src/main/webapp/planner/print_configuration.zul:47 msgid "Please remember that only saved changes will be printed" msgstr "Por favor recuerda que sólo los cambios guardados serán impresos" @@ -3790,6 +3808,10 @@ msgstr "Tipo de excepción de calendario no encontrado" msgid "Unable to convert value to {0} type" msgstr "No se pudo convertir el valor a tipo {0}" +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrdersTreeComponent.java:81 +msgid "Total task budget" +msgstr "Presupuesto total de la tarea" + #: libreplan-webapp/src/main/java/org/libreplan/web/resources/worker/WorkerModel.java:222 msgid "Worker must be not-null" msgstr "El trabajador no debe ser nulo" @@ -3798,14 +3820,14 @@ msgstr "El trabajador no debe ser nulo" msgid "Some criterion satisfactions overlap in time" msgstr "Algunos criterios satisfechos se solapan en el tiempo" -#: libreplan-webapp/src/main/webapp/reports/timeLineMaterialReport.zul:21 -msgid "LibrePlan: Materials Needs At Date" -msgstr "LibrePlan: Necesidad de materiales en fecha" - #: libreplan-webapp/src/main/webapp/subcontract/reportAdvances.zul:49 msgid "Value last progress measurement" msgstr "Valor última medida de progreso" +#: libreplan-webapp/src/main/webapp/reports/timeLineMaterialReport.zul:21 +msgid "LibrePlan: Materials Needs At Date" +msgstr "LibrePlan: Necesidad de materiales en fecha" + #: libreplan-webapp/src/main/webapp/resources/machine/_machineConfigurationUnits.zul:44 msgid "Worker assignments" msgstr "Asignaciones de trabajador" @@ -4034,7 +4056,7 @@ msgid "Check consolidated progresses" msgstr "Marcar progresos consolidados" #: libreplan-webapp/src/main/java/org/libreplan/web/workreports/WorkReportCRUDController.java:1469 -#: libreplan-webapp/src/main/java/org/libreplan/web/workreports/WorkReportModel.java:585 +#: libreplan-webapp/src/main/java/org/libreplan/web/workreports/WorkReportModel.java:587 msgid "Show all" msgstr "Mostrar todo" @@ -4052,7 +4074,7 @@ msgid "Apply tab changes" msgstr "Aplicar cambios de la pestaña" #: libreplan-webapp/src/main/java/org/libreplan/web/users/settings/PasswordController.java:99 -#: libreplan-webapp/src/main/java/org/libreplan/web/users/UserCRUDController.java:170 +#: libreplan-webapp/src/main/java/org/libreplan/web/users/UserCRUDController.java:176 msgid "passwords don't match" msgstr "las contraseñas no conciden" @@ -4172,7 +4194,7 @@ msgstr "No indentable" msgid "List of materials for all categories (select one to filter)" msgstr "Lista de materiales para todas las categorías (seleccione una para filtrar)" -#: libreplan-webapp/src/main/webapp/planner/taskpanels/_tabPanelTaskProperties.zul:69 +#: libreplan-webapp/src/main/webapp/planner/taskpanels/_tabPanelTaskProperties.zul:73 msgid "Resource allocation type" msgstr "Tipo de asignación de recursos" @@ -4189,7 +4211,7 @@ msgstr "Tipo de excepción" msgid "In the available periods {0} only {1} hours are available." msgstr "En los períodos disponibles {0} solo {1} horas están disponibles." -#: libreplan-webapp/src/main/webapp/users/_editUser.zul:126 +#: libreplan-webapp/src/main/webapp/users/_editUser.zul:115 msgid "Association with profiles" msgstr "Asociación con perfiles" @@ -4231,7 +4253,7 @@ msgstr "Base" msgid "Total dedication" msgstr "Dedicación total" -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderElementTreeController.java:683 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderElementTreeController.java:686 msgid "" "You can not remove the task \"{0}\" because of this or any of its children " "are already in use in some work reports" @@ -4432,8 +4454,8 @@ msgstr "Habilitar/Deshabilitar la advertencia sobre nuevas versiones de LibrePla msgid "Select type" msgstr "Seleccione tipo" -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/TaskElementAdapter.java:950 -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderModel.java:679 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/TaskElementAdapter.java:1021 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderModel.java:685 msgid "Hours invested" msgstr "Horas invertidas" @@ -4503,7 +4525,7 @@ msgstr "Vista de la compañía" msgid "Both" msgstr "Ambos" -#: libreplan-webapp/src/main/java/org/libreplan/web/tree/TreeController.java:765 +#: libreplan-webapp/src/main/java/org/libreplan/web/tree/TreeController.java:882 msgid "Not editable for containing more that an hours group." msgstr "No editable por contener más de un grupo de horas." @@ -4577,6 +4599,7 @@ msgid "LibrePlan: Transfer Projects Between Scenarios" msgstr "LibrePlan: transferir proyectos entre escenarios" #: libreplan-webapp/src/main/webapp/orders/_listOrderElementHours.zul:118 +#: libreplan-webapp/src/main/webapp/orders/_listOrderElementHours.zul:166 msgid "%" msgstr "%" @@ -4587,14 +4610,14 @@ msgstr "Borrar calendario" #: libreplan-webapp/src/main/java/org/libreplan/web/workreports/WorkReportCRUDController.java:1536 #: libreplan-webapp/src/main/java/org/libreplan/web/workreports/WorkReportCRUDController.java:1700 -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/OrderPlanningController.java:336 -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/company/CompanyPlanningController.java:273 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/OrderPlanningController.java:338 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/company/CompanyPlanningController.java:274 #: libreplan-webapp/src/main/java/org/libreplan/web/reports/OrderCostsPerResourceController.java:141 #: libreplan-webapp/src/main/java/org/libreplan/web/resources/worker/WorkerCRUDController.java:633 #: libreplan-webapp/src/main/java/org/libreplan/web/resources/machine/MachineCRUDController.java:425 #: libreplan-webapp/src/main/java/org/libreplan/web/orders/ProjectDetailsController.java:257 -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderElementTreeController.java:670 -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:1328 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderElementTreeController.java:673 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:1332 msgid "must be lower than finish date" msgstr "debe ser menor que la fecha de fin" @@ -4615,14 +4638,14 @@ msgstr "Recurso" msgid "Total task hours" msgstr "Total de horas de tarea" -#: libreplan-webapp/src/main/java/org/libreplan/web/common/entrypoints/RedirectorSynthetiser.java:125 -msgid "Could not load any resource" -msgstr "No se pudo cargar un recurso" - #: libreplan-webapp/src/main/webapp/subcontract/reportAdvances.zul:46 msgid "Date last progress reported" msgstr "Fecha último progreso notificado" +#: libreplan-webapp/src/main/java/org/libreplan/web/common/entrypoints/RedirectorSynthetiser.java:125 +msgid "Could not load any resource" +msgstr "No se pudo cargar un recurso" + #: libreplan-webapp/src/main/java/org/libreplan/web/common/CustomMenuController.java:343 #: libreplan-webapp/src/main/webapp/reports/schedulingProgressPerOrderReport.zul:37 msgid "Work And Progress Per Project" @@ -4685,7 +4708,7 @@ msgstr "Lista de líneas de parte de trabajo" msgid "Unit type code cannot be empty" msgstr "El código del tipo de unidad no puede ser vacío" -#: libreplan-webapp/src/main/java/org/libreplan/web/users/UserCRUDController.java:183 +#: libreplan-webapp/src/main/java/org/libreplan/web/users/UserCRUDController.java:189 #: libreplan-webapp/src/main/java/org/libreplan/web/common/CustomMenuController.java:320 msgid "Users" msgstr "Usuarios" @@ -4718,8 +4741,8 @@ msgid "" "completed." msgstr "Otro usuario ha modificado los mismos datos, por tanto la operación no se puede completar de manera segura." -#: libreplan-webapp/src/main/java/org/libreplan/web/templates/OrderTemplatesController.java:218 -#: libreplan-webapp/src/main/java/org/libreplan/web/templates/OrderTemplatesController.java:232 +#: libreplan-webapp/src/main/java/org/libreplan/web/templates/OrderTemplatesController.java:223 +#: libreplan-webapp/src/main/java/org/libreplan/web/templates/OrderTemplatesController.java:244 msgid "Template saved" msgstr "Plantilla guardada" @@ -4758,7 +4781,7 @@ msgstr "Salir de la sesión" #: libreplan-webapp/src/main/webapp/resources/worker/_localizations.zul:31 #: libreplan-webapp/src/main/webapp/resources/worker/_localizations.zul:53 #: libreplan-webapp/src/main/webapp/resources/worker/_localizations.zul:67 -#: libreplan-business/src/main/java/org/libreplan/business/templates/entities/OrderLineGroupTemplate.java:243 +#: libreplan-business/src/main/java/org/libreplan/business/templates/entities/OrderLineGroupTemplate.java:244 msgid "Group" msgstr "Grupo" @@ -4823,9 +4846,9 @@ msgstr "Actualización incompatible: el recurso almacenado no es de tipo: {0}" #: libreplan-webapp/src/main/webapp/costcategories/_editCostCategory.zul:96 #: libreplan-webapp/src/main/webapp/costcategories/_editTypeOfWorkHours.zul:78 #: libreplan-webapp/src/main/webapp/qualityforms/_editQualityForm.zul:134 -#: libreplan-webapp/src/main/webapp/users/_editProfile.zul:83 -#: libreplan-webapp/src/main/webapp/users/_editUser.zul:164 -#: libreplan-webapp/src/main/webapp/templates/templates.zul:137 +#: libreplan-webapp/src/main/webapp/users/_editProfile.zul:72 +#: libreplan-webapp/src/main/webapp/users/_editUser.zul:153 +#: libreplan-webapp/src/main/webapp/templates/templates.zul:145 #: libreplan-webapp/src/main/webapp/resources/worker/_edition.zul:114 #: libreplan-webapp/src/main/webapp/resources/machine/_editMachine.zul:100 #: libreplan-webapp/src/main/webapp/resources/criterions/_edition.zul:92 @@ -4893,7 +4916,7 @@ msgstr "Planificar desde la fecha límite al principio" msgid "generic machines allocation" msgstr "asignación genérica de máquinas" -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/taskedition/TaskPropertiesController.java:375 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/taskedition/TaskPropertiesController.java:384 msgid "Non limiting resource assignation" msgstr "Asignación de recursos no limitantes" @@ -4916,13 +4939,13 @@ msgstr "Administración" #: libreplan-webapp/src/main/java/org/libreplan/web/workreports/WorkReportCRUDController.java:1519 #: libreplan-webapp/src/main/java/org/libreplan/web/workreports/WorkReportCRUDController.java:1682 -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/OrderPlanningController.java:317 -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/company/CompanyPlanningController.java:255 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/OrderPlanningController.java:319 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/company/CompanyPlanningController.java:256 #: libreplan-webapp/src/main/java/org/libreplan/web/resources/worker/WorkerCRUDController.java:616 #: libreplan-webapp/src/main/java/org/libreplan/web/resources/machine/MachineCRUDController.java:408 #: libreplan-webapp/src/main/java/org/libreplan/web/orders/ProjectDetailsController.java:240 -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderElementTreeController.java:652 -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:1311 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderElementTreeController.java:655 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:1315 msgid "must be greater than start date" msgstr "debe ser mayor que la fecha de inicio" @@ -4935,6 +4958,10 @@ msgstr "Cancelar y volver" msgid "Assign quality form" msgstr "Asignar formulario de calidad" +#: libreplan-webapp/src/main/webapp/orders/_edition.zul:157 +msgid "Calculated budget" +msgstr "Presupuesto calculado" + #: libreplan-webapp/src/main/java/org/libreplan/web/orders/materials/AssignedMaterialsController.java:387 msgid "Delete item {0}. Are you sure?" msgstr "Borrar elemento {0}. ¿Está seguro?" @@ -4960,6 +4987,10 @@ msgstr "una línea de parte de trabajo no tiene este tipo de etiqueta asignada" msgid "Allocations" msgstr "Asignaciones" +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/assigntemplates/TemplateFinderPopup.java:137 +msgid "Choosing Template" +msgstr "Eligiendo plantilla" + #: libreplan-webapp/src/main/webapp/calendars/_edition.zul:66 #: libreplan-webapp/src/main/webapp/resources/worker/_listVirtualWorkers.zul:35 msgid "Capacity" @@ -5004,7 +5035,7 @@ msgstr "No se han hecho asignaciones" msgid "Removed calendar \"{0}\"" msgstr "Borrado calendario \"{0}\"" -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:1068 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:1072 msgid "Create project" msgstr "Crear proyecto" @@ -5045,29 +5076,29 @@ msgstr "No se pudieron añadir esas autorizaciones al usuario {0} porque ya esta msgid "New work report" msgstr "Nuevo parte de trabajo" +#: libreplan-webapp/src/main/java/org/libreplan/web/calendars/BaseCalendarEditionController.java:305 +msgid "Root calendar" +msgstr "Calendario raíz" + #: libreplan-webapp/src/main/java/org/libreplan/web/resources/worker/WorkerCRUDController.java:847 #: libreplan-webapp/src/main/java/org/libreplan/web/resources/machine/MachineCRUDController.java:578 msgid "yes" msgstr "sí" -#: libreplan-webapp/src/main/java/org/libreplan/web/calendars/BaseCalendarEditionController.java:305 -msgid "Root calendar" -msgstr "Calendario raíz" - -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:867 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:871 msgid "" "Deleting this subcontracted project, you are going to lose the relation to " "report progress. Are you sure?" msgstr "Borrando este proyecto subcontratado, perderá la relación para notificar progresos. ¿Está seguro?" -#: libreplan-webapp/src/main/webapp/common/configuration.zul:278 -msgid "Port" -msgstr "Puerto" - #: libreplan-webapp/src/main/webapp/limitingresources/manualAllocation.zul:113 msgid "Select gap" msgstr "Seleccionar intervalo" +#: libreplan-webapp/src/main/webapp/common/configuration.zul:278 +msgid "Port" +msgstr "Puerto" + #: libreplan-webapp/src/main/webapp/workreports/workReport.zul:63 msgid "Date Finish" msgstr "Fecha de fin" @@ -5095,7 +5126,11 @@ msgstr "Asignación de categoría de coste" msgid "missing code in a hour cost" msgstr "falta código en un coste por hora" -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/TaskElementAdapter.java:902 +#: libreplan-webapp/src/main/java/org/libreplan/web/exceptionDays/CalendarExceptionTypeCRUDController.java:247 +msgid "Exception Day Type" +msgstr "Tipo de día de excepción" + +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/TaskElementAdapter.java:973 msgid "All workers" msgstr "Todos los trabajadores" @@ -5119,14 +5154,16 @@ msgstr "Grupo de horas {0} : Código duplicado en BD" #: libreplan-webapp/src/main/java/org/libreplan/web/materials/MaterialsController.java:311 #: libreplan-webapp/src/main/java/org/libreplan/web/costcategories/CostCategoryCRUDController.java:207 #: libreplan-webapp/src/main/java/org/libreplan/web/costcategories/CostCategoryCRUDController.java:307 +#: libreplan-webapp/src/main/java/org/libreplan/web/templates/TemplatesTreeController.java:110 +#: libreplan-webapp/src/main/java/org/libreplan/web/templates/TemplatesTreeController.java:130 #: libreplan-webapp/src/main/java/org/libreplan/web/calendars/BaseCalendarEditionController.java:994 #: libreplan-webapp/src/main/java/org/libreplan/web/calendars/BaseCalendarEditionController.java:1184 #: libreplan-webapp/src/main/java/org/libreplan/web/calendars/BaseCalendarEditionController.java:1441 #: libreplan-webapp/src/main/java/org/libreplan/web/resources/criterion/CriterionTreeController.java:135 #: libreplan-webapp/src/main/java/org/libreplan/web/orders/ProjectDetailsController.java:171 #: libreplan-webapp/src/main/java/org/libreplan/web/orders/labels/AssignedLabelsController.java:115 -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:1488 -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:1512 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:1492 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:1516 #: libreplan-webapp/src/main/java/org/libreplan/web/common/ConfigurationController.java:757 #: libreplan-webapp/src/main/webapp/labels/_editLabelType.zul:45 #: libreplan-webapp/src/main/webapp/labels/_editLabelType.zul:53 @@ -5193,10 +5230,6 @@ msgstr "Tipo de unidad" msgid "Load due to other assignments" msgstr "Carga debido a otras asignaciones" -#: libreplan-webapp/src/main/webapp/orders/_listOrderElementHours.zul:62 -msgid "Sum of all task leafs imputed hours" -msgstr "Suma de horas imputadas por todas las tareas hoja" - #: libreplan-webapp/src/main/java/org/libreplan/web/resources/machine/MachineCRUDController.java:554 msgid "This machine was already removed by other user" msgstr "Esta máquina ya ha sido borrada por otro usuario" @@ -5269,11 +5302,11 @@ msgstr "Nombre de usuario de nuestra empresa" msgid "Filter work reports" msgstr "Filtrar partes de trabajo" -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/TaskElementAdapter.java:947 -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderModel.java:678 -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderElementTreeController.java:601 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/TaskElementAdapter.java:1018 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderModel.java:684 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderElementTreeController.java:603 #: libreplan-webapp/src/main/java/org/libreplan/web/common/CustomMenuController.java:328 -#: libreplan-webapp/src/main/webapp/templates/templates.zul:63 +#: libreplan-webapp/src/main/webapp/templates/templates.zul:64 #: libreplan-webapp/src/main/webapp/templates/_editTemplateWindow.zul:49 #: libreplan-webapp/src/main/webapp/orders/_editOrderElement.zul:48 #: libreplan-webapp/src/main/webapp/orders/_edition.zul:46 @@ -5336,7 +5369,7 @@ msgstr "opciones" msgid "LibrePlan: Work Reports" msgstr "LibrePlan: Partes de trabajo" -#: libreplan-webapp/src/main/java/org/libreplan/web/templates/OrderTemplatesController.java:373 +#: libreplan-webapp/src/main/java/org/libreplan/web/templates/OrderTemplatesController.java:393 #: libreplan-webapp/src/main/java/org/libreplan/web/orders/materials/AssignedMaterialsController.java:393 msgid "Error on showing delete confirm" msgstr "Error al mostrar la confirmación de borrado" @@ -5361,7 +5394,7 @@ msgstr "Agrupar por semanas" msgid "Finish hour" msgstr "Hora de fin" -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/reassign/ReassignCommand.java:200 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/reassign/ReassignCommand.java:196 msgid "Done {0} of {1}" msgstr "Hecho {0} de {1}" @@ -5417,16 +5450,16 @@ msgstr "Esta medida de progreso no puede estar en " msgid "Inherited labels" msgstr "Etiquetas heredadas" -#: libreplan-webapp/src/main/java/org/libreplan/web/tree/TreeController.java:946 -#: libreplan-webapp/src/main/java/org/libreplan/web/resources/criterion/CriterionTreeController.java:292 -msgid "Unindent" -msgstr "Desindentar" - #: libreplan-webapp/src/main/java/org/libreplan/web/orders/ManageOrderElementAdvancesController.java:939 #: libreplan-webapp/src/main/java/org/libreplan/web/orders/ManageOrderElementAdvancesController.java:1406 msgid "Value is not valid, the current value must be not empty" msgstr "El valor no es válido, el valor actual no debe ser vacío" +#: libreplan-webapp/src/main/java/org/libreplan/web/tree/TreeController.java:1063 +#: libreplan-webapp/src/main/java/org/libreplan/web/resources/criterion/CriterionTreeController.java:292 +msgid "Unindent" +msgstr "Desindentar" + #: libreplan-webapp/src/main/webapp/orders/components/_listOrderElementLabels.zul:50 msgid "Direct labels" msgstr "Etiquetas directas" @@ -5490,7 +5523,7 @@ msgstr "El código de secuencia ya está en uso y no se puede actualizar." msgid "Scheduling state" msgstr "Estado de planificación" -#: libreplan-webapp/src/main/java/org/libreplan/web/templates/OrderTemplatesController.java:369 +#: libreplan-webapp/src/main/java/org/libreplan/web/templates/OrderTemplatesController.java:389 msgid "This template can not be removed because it has applications." msgstr "Esta plantilla no se puede borrar porque tiene aplicaciones." @@ -5510,6 +5543,10 @@ msgstr "LibrePlan: Horas Trabajadas Por Recurso" msgid "Number of iterations should be between 1 and " msgstr "El número de iteraciones debería estar entre 1 y " +#: libreplan-webapp/src/main/webapp/orders/_listOrderElementHours.zul:151 +msgid "Budget in money" +msgstr "Presupuesto en dinero" + #: libreplan-webapp/src/main/java/org/libreplan/web/common/ConfigurationController.java:145 msgid "Scenarios must be enabled as more elements than master exist" msgstr "Los escenarios deben estar habilitados ya que existen más elementos que master" @@ -5552,7 +5589,7 @@ msgstr "Her" msgid "Administrator" msgstr "Administrador" -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/reassign/ReassignCommand.java:190 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/reassign/ReassignCommand.java:186 msgid "Doing {0} reassignations" msgstr "Realizando {0} reasignaciones" @@ -5588,7 +5625,7 @@ msgstr "No se puede borrar el tipo de parte de trabajo. Hay algún parte de trab msgid "Criterion Type List" msgstr "Lista de tipos de criterio" -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/OrderPlanningModel.java:739 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/OrderPlanningModel.java:765 msgid "Overall progress" msgstr "Progreso global" @@ -5612,7 +5649,7 @@ msgstr "Contraseña" msgid "Observations" msgstr "Observaciones" -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:947 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:951 msgid "Edit project" msgstr "Editar proyecto" @@ -5667,7 +5704,6 @@ msgstr "Borrar {0} \"{1}\". ¿Está seguro?" msgid "Only {0} resources per day were achieved for current allocation" msgstr "Sólo se han logrado {0} recursos por día para la asignación actual" -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/assigntemplates/TemplateFinderPopup.java:51 #: libreplan-webapp/src/main/webapp/planner/editTask.zul:79 #: libreplan-webapp/src/main/webapp/planner/reassign.zul:48 #: libreplan-webapp/src/main/webapp/planner/stretches_function.zul:89 @@ -5714,6 +5750,10 @@ msgstr "Completado: {0}% " msgid "Calculated progress measurement can not be removed" msgstr "Las medidas de progreso calculadas no se pueden borrar" +#: libreplan-webapp/src/main/java/org/libreplan/web/exceptionDays/CalendarExceptionTypeCRUDController.java:252 +msgid "Exception Day Types" +msgstr "Tipos de día de excepción" + #: libreplan-webapp/src/main/java/org/libreplan/web/resources/worker/AssignedCriterionsModel.java:335 #: libreplan-webapp/src/main/java/org/libreplan/web/resources/worker/AssignedCriterionsModel.java:341 msgid " The " @@ -5757,6 +5797,10 @@ msgstr "Aplicar cambios y continuar la edición" msgid "Infinitely Over Assignable" msgstr "Sobreasignable infinitamente" +#: libreplan-webapp/src/main/webapp/orders/_listOrderElementHours.zul:157 +msgid "Money spent" +msgstr "Dinero gastado" + #: libreplan-business/src/main/java/org/libreplan/business/resources/entities/CriterionType.java:426 msgid "criterion names must be unique inside a criterion type" msgstr "el nombre del criterio debe ser único dentro de un tipo de criterio" @@ -5792,7 +5836,7 @@ msgstr "Los períodos disponibles dependen de la satisfacción de criterios por #: libreplan-webapp/src/main/webapp/reports/hoursWorkedPerWorkerReport.zul:86 #: libreplan-webapp/src/main/webapp/reports/schedulingProgressPerOrderReport.zul:116 #: libreplan-webapp/src/main/webapp/reports/timeLineMaterialReport.zul:95 -#: libreplan-webapp/src/main/webapp/templates/templates.zul:85 +#: libreplan-webapp/src/main/webapp/templates/templates.zul:86 #: libreplan-webapp/src/main/webapp/templates/_list.zul:26 #: libreplan-webapp/src/main/webapp/templates/_materialAssignmentsBox.zul:28 #: libreplan-webapp/src/main/webapp/calendars/_edition.zul:54 @@ -5849,15 +5893,20 @@ msgstr "Fecha de inicio" msgid "Update exception" msgstr "Actualizar excepción" -#: libreplan-webapp/src/main/webapp/subcontract/subcontractedTasks.zul:52 -#: libreplan-webapp/src/main/webapp/orders/_edition.zul:140 -msgid "Budget" -msgstr "Presupuesto" - #: libreplan-webapp/src/main/java/org/libreplan/web/orders/TreeElementOperationsController.java:253 msgid "Operation cannot be done" msgstr "No se puede efectuar la operación" +#: libreplan-webapp/src/main/java/org/libreplan/web/templates/TemplatesTreeComponent.java:91 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrdersTreeComponent.java:80 +#: libreplan-webapp/src/main/webapp/planner/taskpanels/_tabPanelTaskProperties.zul:62 +#: libreplan-webapp/src/main/webapp/templates/templates.zul:107 +#: libreplan-webapp/src/main/webapp/subcontract/subcontractedTasks.zul:52 +#: libreplan-webapp/src/main/webapp/orders/_orderElementDetails.zul:65 +#: libreplan-webapp/src/main/webapp/orders/_edition.zul:140 +msgid "Budget" +msgstr "Presupuesto" + #: libreplan-webapp/src/main/java/org/libreplan/web/reports/HoursWorkedPerWorkerInAMonthController.java:44 msgid "May" msgstr "Mayo" @@ -5891,7 +5940,7 @@ msgstr "Número de aplicaciones" msgid "Assign element to queue automatically" msgstr "Asignar elemento a la cola automáticamente" -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrdersTreeComponent.java:82 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrdersTreeComponent.java:92 msgid "" "Date which the task must start after (press enter in textbox to open " "calendar popup or type in date directly)" @@ -5927,8 +5976,8 @@ msgstr "Este tipo de etiqueta ya está asignado al tipo de parte de trabajo." msgid "Probability %" msgstr "Probabilidad %" -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/OrderPlanningModel.java:737 -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/company/CompanyPlanningModel.java:324 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/OrderPlanningModel.java:763 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/company/CompanyPlanningModel.java:321 #: libreplan-webapp/src/main/java/org/libreplan/web/resourceload/ResourceLoadController.java:815 #: libreplan-webapp/src/main/webapp/planner/_legendLoadChartOrder.zul:49 msgid "Load" @@ -5939,12 +5988,12 @@ msgstr "Carga" msgid "New criterion" msgstr "Criterio nuevo" -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderModel.java:683 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderModel.java:689 #: libreplan-webapp/src/main/webapp/materials/materials.zul:81 #: libreplan-webapp/src/main/webapp/scenarios/_edition.zul:43 #: libreplan-webapp/src/main/webapp/qualityforms/_listQualityForm.zul:37 #: libreplan-webapp/src/main/webapp/qualityforms/_editQualityForm.zul:49 -#: libreplan-webapp/src/main/webapp/templates/templates.zul:101 +#: libreplan-webapp/src/main/webapp/templates/templates.zul:102 #: libreplan-webapp/src/main/webapp/templates/_list.zul:32 #: libreplan-webapp/src/main/webapp/subcontract/subcontractedTasks.zul:51 #: libreplan-webapp/src/main/webapp/resources/machine/_listMachines.zul:36 @@ -5968,7 +6017,7 @@ msgstr "Nodo seleccionado" msgid "already exists an allocation for criteria {0}" msgstr "ya existe una asignación para los criterios {0}" -#: libreplan-webapp/src/main/java/org/libreplan/web/templates/OrderTemplatesController.java:283 +#: libreplan-webapp/src/main/java/org/libreplan/web/templates/OrderTemplatesController.java:303 #: libreplan-webapp/src/main/java/org/libreplan/web/common/CustomMenuController.java:294 msgid "Project Templates" msgstr "Plantillas de proyectos" @@ -5995,7 +6044,7 @@ msgstr "No asignado" msgid "At least one HoursGroup is needed" msgstr "Es necesario al menos un grupo de horas" -#: libreplan-webapp/src/main/java/org/libreplan/web/users/UserCRUDController.java:178 +#: libreplan-webapp/src/main/java/org/libreplan/web/users/UserCRUDController.java:184 #: libreplan-webapp/src/main/webapp/externalcompanies/_editExternalCompany.zul:63 #: libreplan-webapp/src/main/webapp/common/layout/login.zul:74 #: libreplan-business/src/main/java/org/libreplan/business/advance/entities/AdvanceType.java:165 @@ -6059,8 +6108,8 @@ msgstr "Carga 100%" msgid "Function" msgstr "Función" -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/OrderPlanningModel.java:799 -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/company/CompanyPlanningModel.java:363 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/OrderPlanningModel.java:825 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/company/CompanyPlanningModel.java:360 msgid "date in future" msgstr "fecha en el futuro" @@ -6075,14 +6124,14 @@ msgstr "fecha en el futuro" msgid "Format" msgstr "Formato" -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/SaveCommandBuilder.java:887 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/SaveCommandBuilder.java:885 msgid "New project version" msgstr "Nueva versión de proyecto" -#: libreplan-webapp/src/main/java/org/libreplan/web/templates/TemplatesTreeController.java:77 +#: libreplan-webapp/src/main/java/org/libreplan/web/templates/TemplatesTreeController.java:79 #: libreplan-webapp/src/main/java/org/libreplan/web/calendars/BaseCalendarCRUDController.java:366 -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderElementTreeController.java:484 -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:1231 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderElementTreeController.java:486 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:1235 #: libreplan-webapp/src/main/java/org/libreplan/web/limitingresources/QueueComponent.java:478 #: libreplan-webapp/src/main/java/org/libreplan/web/common/Util.java:537 #: libreplan-webapp/src/main/webapp/labels/_listLabelTypes.zul:37 @@ -6253,7 +6302,7 @@ msgstr "El valor no es válido, el valor debe ser mayor que el valor del progres msgid "BCWS" msgstr "BCWS" -#: libreplan-webapp/src/main/java/org/libreplan/web/print/CutyPrint.java:351 +#: libreplan-webapp/src/main/java/org/libreplan/web/print/CutyPrint.java:343 msgid " in the specified directory." msgstr " en el directorio especificado." @@ -6306,7 +6355,7 @@ msgstr "Coste de trabajo realizado" msgid "Create project from Template" msgstr "Crear proyecto a partir de plantilla" -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderElementTreeController.java:418 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderElementTreeController.java:420 msgid "" "Value is not valid.\n" " Code cannot contain chars like '_' \n" @@ -6317,11 +6366,15 @@ msgstr "El valor no es válido.\n El código no puede contener caracteres como ' msgid "an authorization type must be set" msgstr "debe seleccionar un tipo de autorización" -#: libreplan-webapp/src/main/java/org/libreplan/web/templates/TemplatesTreeComponent.java:92 +#: libreplan-webapp/src/main/java/org/libreplan/web/templates/TemplatesTreeComponent.java:101 msgid "Must start after (days since beginning project)" msgstr "Debe empezar después de (días desde el inicio del proyecto)" -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/SaveCommandBuilder.java:886 +#: libreplan-webapp/src/main/webapp/orders/_listOrderElementHours.zul:134 +msgid "Percentage of estimated budget in money / money spent" +msgstr "Porcentaje de presupuesto estimado / dinero gastado" + +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/SaveCommandBuilder.java:884 msgid "" "Confirm creating a new project version for this scenario and derived. Are " "you sure?" @@ -6369,7 +6422,7 @@ msgstr "Deseleccionar" msgid "You should select the type of exception" msgstr "Debe seleccionar el tipo de excepción" -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrdersTreeComponent.java:93 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrdersTreeComponent.java:103 #: libreplan-webapp/src/main/webapp/planner/taskpanels/_tabPanelTaskProperties.zul:46 #: libreplan-webapp/src/main/webapp/orders/_projectDetails.zul:63 #: libreplan-webapp/src/main/webapp/orders/_orderElementDetails.zul:52 @@ -6421,7 +6474,7 @@ msgstr "Asignación avanzada" msgid "Number of iterations" msgstr "Número de iteraciones" -#: libreplan-webapp/src/main/webapp/templates/templates.zul:60 +#: libreplan-webapp/src/main/webapp/templates/templates.zul:61 msgid "Template Tree" msgstr "Árbol de plantillas" @@ -6448,11 +6501,15 @@ msgstr "el esfuerzo no está bien calculado basándose en el reloj" msgid "Status" msgstr "Estado" +#: libreplan-webapp/src/main/java/org/libreplan/web/calendars/BaseCalendarEditionController.java:321 +msgid "from {0}" +msgstr "desde {0}" + #: libreplan-webapp/src/main/webapp/settings/settings.zul:111 msgid "Resource load view" msgstr "Vista de carga de recursos" -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/OrderPlanningModel.java:787 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/OrderPlanningModel.java:813 msgid "the date must be inside the visualization area" msgstr "la fecha debe estar dentro del área de visualización" @@ -6602,8 +6659,8 @@ msgid "Task Scheduling Status In Project" msgstr "Estado de planificación de tareas en un proyecto" #: libreplan-webapp/src/main/java/org/libreplan/web/qualityforms/QualityFormCRUDController.java:162 -#: libreplan-webapp/src/main/java/org/libreplan/web/templates/OrderTemplatesController.java:356 -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:868 +#: libreplan-webapp/src/main/java/org/libreplan/web/templates/OrderTemplatesController.java:376 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:872 #: libreplan-webapp/src/main/java/org/libreplan/web/common/BaseCRUDController.java:313 msgid "Confirm" msgstr "Confirmar" @@ -6655,8 +6712,8 @@ msgstr "Precio total" #: libreplan-webapp/src/main/java/org/libreplan/web/workreports/WorkReportCRUDController.java:1214 #: libreplan-webapp/src/main/java/org/libreplan/web/workreports/WorkReportCRUDController.java:1226 #: libreplan-webapp/src/main/java/org/libreplan/web/workreports/WorkReportTypeCRUDController.java:346 -#: libreplan-webapp/src/main/java/org/libreplan/web/tree/TreeController.java:984 -#: libreplan-webapp/src/main/java/org/libreplan/web/tree/TreeController.java:990 +#: libreplan-webapp/src/main/java/org/libreplan/web/tree/TreeController.java:1101 +#: libreplan-webapp/src/main/java/org/libreplan/web/tree/TreeController.java:1107 #: libreplan-webapp/src/main/java/org/libreplan/web/costcategories/CostCategoryCRUDController.java:289 #: libreplan-webapp/src/main/java/org/libreplan/web/costcategories/CostCategoryCRUDController.java:457 #: libreplan-webapp/src/main/java/org/libreplan/web/costcategories/ResourcesCostCategoryAssignmentController.java:143 @@ -6675,7 +6732,7 @@ msgstr "Precio total" #: libreplan-webapp/src/main/java/org/libreplan/web/orders/AssignedTaskQualityFormsToOrderElementController.java:201 #: libreplan-webapp/src/main/java/org/libreplan/web/orders/AssignedTaskQualityFormsToOrderElementController.java:333 #: libreplan-webapp/src/main/java/org/libreplan/web/orders/AssignedTaskQualityFormsToOrderElementController.java:406 -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:1247 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:1251 #: libreplan-webapp/src/main/webapp/labels/_editLabelType.zul:99 #: libreplan-webapp/src/main/webapp/labels/_listLabelTypes.zul:42 #: libreplan-webapp/src/main/webapp/externalcompanies/_listExternalCompanies.zul:49 @@ -6700,10 +6757,8 @@ msgstr "Precio total" #: libreplan-webapp/src/main/webapp/reports/workingArrangementsPerOrderReport.zul:154 #: libreplan-webapp/src/main/webapp/reports/timeLineMaterialReport.zul:106 #: libreplan-webapp/src/main/webapp/users/_listUsers.zul:46 -#: libreplan-webapp/src/main/webapp/users/_editProfile.zul:68 #: libreplan-webapp/src/main/webapp/users/_listProfiles.zul:40 -#: libreplan-webapp/src/main/webapp/users/_editUser.zul:115 -#: libreplan-webapp/src/main/webapp/users/_editUser.zul:148 +#: libreplan-webapp/src/main/webapp/users/_editUser.zul:137 #: libreplan-webapp/src/main/webapp/templates/_list.zul:53 #: libreplan-webapp/src/main/webapp/templates/_materialAssignmentsBox.zul:55 #: libreplan-webapp/src/main/webapp/resources/worker/_listVirtualWorkers.zul:52 @@ -6803,7 +6858,7 @@ msgid "Stretches" msgstr "Tramos" #: libreplan-business/src/main/java/org/libreplan/business/planner/entities/AssignmentFunction.java:79 -msgid "Interporlation" +msgid "Interpolation" msgstr "Interpolación" #: libreplan-business/src/main/java/org/libreplan/business/planner/entities/AssignmentFunction.java:80 @@ -6867,23 +6922,23 @@ msgstr "En progreso" msgid "Blocked" msgstr "Bloqueado" -#: libreplan-business/src/main/java/org/libreplan/business/planner/entities/PositionConstraintType.java:29 +#: libreplan-business/src/main/java/org/libreplan/business/planner/entities/PositionConstraintType.java:31 msgid "as soon as possible" msgstr "tan pronto como sea posible" -#: libreplan-business/src/main/java/org/libreplan/business/planner/entities/PositionConstraintType.java:41 +#: libreplan-business/src/main/java/org/libreplan/business/planner/entities/PositionConstraintType.java:38 msgid "start not earlier than" msgstr "empezar no antes de" -#: libreplan-business/src/main/java/org/libreplan/business/planner/entities/PositionConstraintType.java:53 +#: libreplan-business/src/main/java/org/libreplan/business/planner/entities/PositionConstraintType.java:45 msgid "start in fixed date" msgstr "comenzar en fecha fija" -#: libreplan-business/src/main/java/org/libreplan/business/planner/entities/PositionConstraintType.java:65 +#: libreplan-business/src/main/java/org/libreplan/business/planner/entities/PositionConstraintType.java:57 msgid "as late as possible" msgstr "tan tarde como sea posible" -#: libreplan-business/src/main/java/org/libreplan/business/planner/entities/PositionConstraintType.java:77 +#: libreplan-business/src/main/java/org/libreplan/business/planner/entities/PositionConstraintType.java:64 msgid "finish not later than" msgstr "acabar no después de" @@ -6923,7 +6978,7 @@ msgstr "Permiso de edición para todos los proyectos" msgid "Project creation allowed" msgstr "Permiso de creación de proyectos" -#: libreplan-business/src/main/java/org/libreplan/business/templates/entities/OrderLineTemplate.java:122 +#: libreplan-business/src/main/java/org/libreplan/business/templates/entities/OrderLineTemplate.java:132 msgid "Line" msgstr "Línea" @@ -7091,23 +7146,23 @@ msgstr "P" msgid "U" msgstr "D" -#: libreplan-business/src/main/java/org/libreplan/business/orders/entities/OrderElement.java:618 +#: libreplan-business/src/main/java/org/libreplan/business/orders/entities/OrderElement.java:629 msgid "" "Some ancestor has the same label assigned, so this element is already " "inheriting this label" msgstr "Algún ancestro tiene la misma etiqueta asignada, por lo que este elemento ya está heredando esa etiqueta" -#: libreplan-business/src/main/java/org/libreplan/business/orders/entities/OrderElement.java:717 +#: libreplan-business/src/main/java/org/libreplan/business/orders/entities/OrderElement.java:728 #: libreplan-business/src/main/java/org/libreplan/business/orders/entities/OrderLineGroup.java:963 msgid "Cannot spread two progress in the same task" msgstr "No pueden propagar dos progresos en la misma tarea" -#: libreplan-business/src/main/java/org/libreplan/business/orders/entities/OrderElement.java:741 -#: libreplan-business/src/main/java/org/libreplan/business/orders/entities/OrderElement.java:767 +#: libreplan-business/src/main/java/org/libreplan/business/orders/entities/OrderElement.java:752 +#: libreplan-business/src/main/java/org/libreplan/business/orders/entities/OrderElement.java:778 msgid "Duplicate Progress Assignment For Task" msgstr "Asignación de progreso duplicada para la tarea" -#: libreplan-business/src/main/java/org/libreplan/business/orders/entities/OrderElement.java:1094 +#: libreplan-business/src/main/java/org/libreplan/business/orders/entities/OrderElement.java:1105 msgid "Quality form already exists" msgstr "El formulario de calidad ya existe" diff --git a/libreplan-webapp/src/main/resources/i18n/gl.po b/libreplan-webapp/src/main/resources/i18n/gl.po index e8f72411c..26ecdc1e4 100644 --- a/libreplan-webapp/src/main/resources/i18n/gl.po +++ b/libreplan-webapp/src/main/resources/i18n/gl.po @@ -9,10 +9,10 @@ # Manuel Rego Casasnovas , 2010, 2011, 2012. msgid "" msgstr "" -"Project-Id-Version: 1.2.2\n" +"Project-Id-Version: libreplan-1.2.3\n" "Report-Msgid-Bugs-To: http://bugs.libreplan.org/\n" -"POT-Creation-Date: 2012-02-24 09:08+0100\n" -"PO-Revision-Date: 2012-02-24 10:02+0000\n" +"POT-Creation-Date: 2012-04-11 08:32+0200\n" +"PO-Revision-Date: 2012-04-11 08:34+0000\n" "Last-Translator: Manuel Rego Casasnovas \n" "Language-Team: Galego\n" "MIME-Version: 1.0\n" @@ -151,7 +151,7 @@ msgstr "Non pode estar baleiro" #: libreplan-webapp/src/main/java/org/libreplan/web/common/CustomMenuController.java:324 #: libreplan-webapp/src/main/webapp/materials/materials.zul:33 -#: libreplan-webapp/src/main/webapp/templates/templates.zul:66 +#: libreplan-webapp/src/main/webapp/templates/templates.zul:67 #: libreplan-webapp/src/main/webapp/templates/_editTemplateWindow.zul:52 #: libreplan-webapp/src/main/webapp/templates/_materialAssignmentsBox.zul:22 #: libreplan-webapp/src/main/webapp/orders/_editOrderElement.zul:54 @@ -160,7 +160,7 @@ msgstr "Non pode estar baleiro" msgid "Materials" msgstr "Materiais" -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/reassign/ReassignCommand.java:361 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/reassign/ReassignCommand.java:357 msgid "Reassign" msgstr "Reasignar" @@ -201,7 +201,7 @@ msgstr "Predefinido" #: libreplan-webapp/src/main/java/org/libreplan/web/qualityforms/QualityFormCRUDController.java:344 #: libreplan-webapp/src/main/java/org/libreplan/web/common/CustomMenuController.java:325 -#: libreplan-webapp/src/main/webapp/templates/templates.zul:67 +#: libreplan-webapp/src/main/webapp/templates/templates.zul:68 #: libreplan-webapp/src/main/webapp/templates/_editTemplateWindow.zul:53 msgid "Quality Forms" msgstr "Formularios de calidade" @@ -210,11 +210,15 @@ msgstr "Formularios de calidade" msgid "Reports" msgstr "Informes" +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/assigntemplates/TemplateFinderPopup.java:117 +msgid "Create task" +msgstr "Crear tarefa" + #: libreplan-webapp/src/main/webapp/planner/advance_allocation.zul:22 msgid "LibrePlan: Advanced allocation" msgstr "LibrePlan: Asignación avanzada" -#: libreplan-webapp/src/main/java/org/libreplan/web/common/ConfigurationModel.java:172 +#: libreplan-webapp/src/main/java/org/libreplan/web/common/ConfigurationModel.java:177 msgid "The {0} sequence prefixes can not be repeated" msgstr "Os prefixos da secuencia de {0} non poden repetirse" @@ -301,7 +305,7 @@ msgid "generic workers allocation" msgstr "Asignación xenérica de traballadores" #: libreplan-webapp/src/main/java/org/libreplan/web/resourceload/ResourceLoadController.java:310 -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:895 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:899 msgid "The project has no scheduled elements" msgstr "O proxecto no ten elementos planificados" @@ -379,19 +383,19 @@ msgstr "Fai clic neste" msgid "Project Name" msgstr "Nome do proxecto" -#: libreplan-webapp/src/main/java/org/libreplan/web/tree/TreeController.java:967 +#: libreplan-webapp/src/main/java/org/libreplan/web/tree/TreeController.java:1084 #: libreplan-webapp/src/main/java/org/libreplan/web/resources/criterion/CriterionTreeController.java:306 msgid "Indent" msgstr "Indentar" +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/reassign/ReassignCommand.java:252 +msgid "Reassignation" +msgstr "Reasignación" + #: libreplan-webapp/src/main/webapp/common/configuration.zul:327 msgid "Save passwords in database" msgstr "Gardar contrasinais na base de datos" -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/reassign/ReassignCommand.java:256 -msgid "Reassignation" -msgstr "Reasignación" - #: libreplan-webapp/src/main/java/org/libreplan/web/templates/TemplatesTree.java:42 msgid "New template" msgstr "Novo modelo" @@ -460,7 +464,7 @@ msgid "" "applicable to this resource" msgstr "existen criterios satisfeitos que pertencen a tipos de criterio non aplicables a este recurso" -#: libreplan-webapp/src/main/webapp/templates/templates.zul:65 +#: libreplan-webapp/src/main/webapp/templates/templates.zul:66 #: libreplan-webapp/src/main/webapp/orders/_editOrderElement.zul:52 #: libreplan-webapp/src/main/webapp/orders/_edition.zul:50 msgid "Criterion Requirement" @@ -595,7 +599,7 @@ msgstr "Outubro" msgid "First name" msgstr "Nome" -#: libreplan-webapp/src/main/java/org/libreplan/web/print/CutyPrint.java:256 +#: libreplan-webapp/src/main/java/org/libreplan/web/print/CutyPrint.java:250 msgid "Could not execute print command" msgstr "Non se puido executar o comando de impresión" @@ -608,7 +612,7 @@ msgstr "Campos de texto complementario" #: libreplan-webapp/src/main/java/org/libreplan/web/workreports/WorkReportCRUDController.java:1226 #: libreplan-webapp/src/main/java/org/libreplan/web/calendars/BaseCalendarCRUDController.java:452 #: libreplan-webapp/src/main/java/org/libreplan/web/orders/AssignedTaskQualityFormsToOrderElementController.java:200 -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:832 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:836 msgid "Confirm deleting {0}. Are you sure?" msgstr "Confirmar o borrado de {0}. ¿Está seguro?" @@ -735,7 +739,7 @@ msgstr "Este proxecto xa fora engadido." msgid "The task code cannot be null" msgstr "O código da tarefa non pode ser nulo" -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderElementTreeController.java:594 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderElementTreeController.java:596 #: libreplan-webapp/src/main/java/org/libreplan/web/common/CustomMenuController.java:329 #: libreplan-webapp/src/main/webapp/planner/taskpanels/_taskInformation.zul:32 #: libreplan-webapp/src/main/webapp/resources/search/allocation_selector.zul:39 @@ -812,7 +816,7 @@ msgstr "Xuño" msgid "{0} annotation required on {1}" msgstr "{0} anotación obrigatoria en {1}" -#: libreplan-webapp/src/main/java/org/libreplan/web/tree/TreeController.java:1067 +#: libreplan-webapp/src/main/java/org/libreplan/web/tree/TreeController.java:1193 msgid "Modified" msgstr "Modificado" @@ -877,7 +881,7 @@ msgstr "O progreso calculado non se pode modificar" msgid "Work done from starting date" msgstr "Traballo realizado desde a data de inicio" -#: libreplan-webapp/src/main/webapp/templates/templates.zul:69 +#: libreplan-webapp/src/main/webapp/templates/templates.zul:70 msgid "Statistics log" msgstr "Histórico de estadísticas" @@ -886,7 +890,7 @@ msgstr "Histórico de estadísticas" msgid "Edit Calendar" msgstr "Editar calendario" -#: libreplan-webapp/src/main/java/org/libreplan/web/users/ProfileCRUDController.java:112 +#: libreplan-webapp/src/main/java/org/libreplan/web/users/ProfileCRUDController.java:117 msgid "Profile" msgstr "Perfil" @@ -909,7 +913,7 @@ msgstr "Non pode ser baleiro ou nulo" msgid "{0} \"{1}\" saved" msgstr "{0} \"{1}\" gardado" -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/OrderPlanningController.java:299 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/OrderPlanningController.java:301 msgid "filtering" msgstr "filtrado" @@ -966,6 +970,12 @@ msgstr "Este criterio xa fora engadido." msgid "add" msgstr "engadir" +#: libreplan-webapp/src/main/java/org/libreplan/web/tree/TreeController.java:860 +#: libreplan-webapp/src/main/webapp/templates/templates.zul:111 +#: libreplan-webapp/src/main/webapp/orders/_orderElementDetails.zul:69 +msgid "Budget value cannot be negative" +msgstr "O valor do orzamento non pode ser negativo" + #: libreplan-webapp/src/main/java/org/libreplan/web/orders/TreeElementOperationsController.java:239 msgid "Unsaved changes will be lost. Would you like to continue?" msgstr "Perderánse os cambios sen gardar. Gustaríalle continuar?" @@ -1043,8 +1053,8 @@ msgstr "Engadir rol" msgid "Exception end date should be greater or equals than start date" msgstr "A data de fin dunha excepción debe ser maior ou igual cá data de inicio" -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/SaveCommandBuilder.java:476 -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/SaveCommandBuilder.java:486 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/SaveCommandBuilder.java:474 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/SaveCommandBuilder.java:484 msgid "Repeated Project code {0} in Project {1}" msgstr "Código {0} de proxecto repetedio no proxecto {1}" @@ -1074,7 +1084,7 @@ msgstr "Data de inicio máis cedo" msgid "Type data" msgstr "Datos do tipo" -#: libreplan-webapp/src/main/java/org/libreplan/web/users/ProfileCRUDController.java:117 +#: libreplan-webapp/src/main/java/org/libreplan/web/users/ProfileCRUDController.java:122 #: libreplan-webapp/src/main/java/org/libreplan/web/common/CustomMenuController.java:322 msgid "Profiles" msgstr "Perfís" @@ -1220,13 +1230,13 @@ msgstr "Listado de perfís" msgid "both {0} of category {1} and {2} of category {3} have the same code" msgstr "{0} da categoría {1} e {2} da categoría {3} teñen o mesmo código" -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/TaskElementAdapter.java:958 -#: libreplan-webapp/src/main/java/org/libreplan/web/templates/TemplatesTreeController.java:236 -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderModel.java:690 -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderElementTreeController.java:581 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/TaskElementAdapter.java:1039 +#: libreplan-webapp/src/main/java/org/libreplan/web/templates/TemplatesTreeController.java:240 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderModel.java:696 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderElementTreeController.java:583 #: libreplan-webapp/src/main/java/org/libreplan/web/common/CustomMenuController.java:331 #: libreplan-webapp/src/main/webapp/planner/taskpanels/_tabPanelSubcontract.zul:68 -#: libreplan-webapp/src/main/webapp/templates/templates.zul:64 +#: libreplan-webapp/src/main/webapp/templates/templates.zul:65 #: libreplan-webapp/src/main/webapp/templates/_editTemplateWindow.zul:50 #: libreplan-webapp/src/main/webapp/orders/_editOrderElement.zul:50 msgid "Labels" @@ -1236,7 +1246,7 @@ msgstr "Etiquetas" msgid "Data Types" msgstr "Tipos de datos" -#: libreplan-webapp/src/main/webapp/orders/_edition.zul:157 +#: libreplan-webapp/src/main/webapp/orders/_edition.zul:161 #: libreplan-webapp/src/main/webapp/orders/_listOrderElementHours.zul:68 msgid "Total hours" msgstr "Total de horas" @@ -1253,8 +1263,8 @@ msgstr "Reasignando {0} proxectos" msgid "Filter by task status" msgstr "Filtrar por estado da tarefa" -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/OrderPlanningModel.java:528 -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/company/CompanyPlanningModel.java:419 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/OrderPlanningModel.java:529 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/company/CompanyPlanningModel.java:416 msgid "Select date" msgstr "Seleccione data" @@ -1271,19 +1281,23 @@ msgstr "Por favor, volva a intentalo." msgid "Company code" msgstr "Código da empresa" +#: libreplan-webapp/src/main/webapp/orders/_listOrderElementHours.zul:62 +msgid "Sum of imputed hours in children tasks" +msgstr "Suma de horas imputadas nas tarefas fillas" + #: libreplan-webapp/src/main/java/org/libreplan/web/common/components/TwoWaySelector.java:110 msgid "Unknown attribute '{0}' in class {1}" msgstr "Atributo descoñecido '{0}' na clase {1}" +#: libreplan-webapp/src/main/java/org/libreplan/web/users/settings/PasswordController.java:96 +msgid "passwords can not be empty" +msgstr "os contrasinais non poden estar baleiros" + #: libreplan-webapp/src/main/java/org/libreplan/web/resources/worker/WorkerCRUDController.java:699 #: libreplan-business/src/main/java/org/libreplan/business/resources/entities/ResourceType.java:33 msgid "NON LIMITING RESOURCE" msgstr "RECURSO NON LIMITANTE" -#: libreplan-webapp/src/main/java/org/libreplan/web/users/settings/PasswordController.java:96 -msgid "passwords can not be empty" -msgstr "os contrasinais non poden estar baleiros" - #: libreplan-webapp/src/main/java/org/libreplan/web/orders/labels/AssignedLabelsController.java:88 #: libreplan-webapp/src/main/java/org/libreplan/web/orders/labels/AssignedLabelsController.java:128 #: libreplan-webapp/src/main/java/org/libreplan/web/orders/AssignedTaskQualityFormsToOrderElementController.java:176 @@ -1432,11 +1446,15 @@ msgstr "Lista de tramos" msgid "Enable scenarios module" msgstr "Habilitar módulo de escenarios" +#: libreplan-webapp/src/main/java/org/libreplan/web/calendars/BaseCalendarEditionController.java:312 +msgid "to {0}" +msgstr "ata {0}" + #: libreplan-webapp/src/main/webapp/limitingresources/limitingResourcesLayout.zul:59 msgid "Zoom" msgstr "Zoom" -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/SaveCommandBuilder.java:865 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/SaveCommandBuilder.java:863 #: libreplan-webapp/src/main/webapp/labels/_editLabelType.zul:112 #: libreplan-webapp/src/main/webapp/advance/advanceTypes.zul:37 #: libreplan-webapp/src/main/webapp/excetiondays/_editExceptionDayType.zul:91 @@ -1452,9 +1470,9 @@ msgstr "Zoom" #: libreplan-webapp/src/main/webapp/qualityforms/_editQualityForm.zul:131 #: libreplan-webapp/src/main/webapp/settings/changePassword.zul:81 #: libreplan-webapp/src/main/webapp/settings/settings.zul:124 -#: libreplan-webapp/src/main/webapp/users/_editProfile.zul:81 -#: libreplan-webapp/src/main/webapp/users/_editUser.zul:162 -#: libreplan-webapp/src/main/webapp/templates/templates.zul:135 +#: libreplan-webapp/src/main/webapp/users/_editProfile.zul:70 +#: libreplan-webapp/src/main/webapp/users/_editUser.zul:151 +#: libreplan-webapp/src/main/webapp/templates/templates.zul:143 #: libreplan-webapp/src/main/webapp/calendars/calendars.zul:44 #: libreplan-webapp/src/main/webapp/resources/worker/virtualWorkers.zul:40 #: libreplan-webapp/src/main/webapp/resources/worker/worker.zul:41 @@ -1513,7 +1531,7 @@ msgstr "Problemas conectando co servizo web subcontratista" msgid "Entity type" msgstr "Tipo de entidade" -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/OrderPlanningModel.java:1101 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/OrderPlanningModel.java:1127 #: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:268 msgid "Unsaved changes will be lost. Are you sure?" msgstr "Perderánse os cambios sen gardar. Está seguro?" @@ -1554,13 +1572,13 @@ msgstr "Recursos por día" msgid "ResourceType must be not-null" msgstr "ResourceType non debe ser nulo" -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrdersTreeComponent.java:95 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrdersTreeComponent.java:105 msgid "" "Estimated end date for the task (press enter in textbox to open calendar " "popup or type in date directly)" msgstr "Data de fin estimada para a tarefa (presione enter no cadro de texto para abrir o calendario ou escriba a data directamente)" -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderElementTreeController.java:292 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderElementTreeController.java:293 msgid "Expand/Collapse all" msgstr "Expandir/Pregar todo" @@ -1568,11 +1586,11 @@ msgstr "Expandir/Pregar todo" msgid "Overload due to current project" msgstr "Sobrecarga debido ao proxecto actual" -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/TaskElementAdapter.java:946 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/TaskElementAdapter.java:1017 msgid "Name: {0}" msgstr "Nome: {0}" -#: libreplan-webapp/src/main/java/org/libreplan/web/tree/TreeController.java:903 +#: libreplan-webapp/src/main/java/org/libreplan/web/tree/TreeController.java:1020 msgid "Move down" msgstr "Mover abaixo" @@ -1619,7 +1637,7 @@ msgstr "Asignar" msgid "missing code in a criterion" msgstr "falta código nun criterio" -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:1278 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:1282 msgid "Create Template" msgstr "Crear modelo" @@ -1636,7 +1654,7 @@ msgstr "Búsqueda avanzada" msgid "Filter by labels" msgstr "Filtrar por etiquetas" -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/taskedition/TaskPropertiesController.java:577 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/taskedition/TaskPropertiesController.java:586 msgid "" "IMPORTANT: Don't forget to communicate to subcontractor that his contract " "has been cancelled" @@ -1667,10 +1685,10 @@ msgstr "Código de estado" #: libreplan-webapp/src/main/java/org/libreplan/web/costcategories/TypeOfWorkHoursCRUDController.java:103 #: libreplan-webapp/src/main/java/org/libreplan/web/qualityforms/QualityFormCRUDController.java:391 #: libreplan-webapp/src/main/java/org/libreplan/web/planner/taskedition/AdvancedAllocationTaskController.java:73 -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/taskedition/TaskPropertiesController.java:509 -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/taskedition/TaskPropertiesController.java:547 -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/taskedition/TaskPropertiesController.java:578 -#: libreplan-webapp/src/main/java/org/libreplan/web/users/ProfileCRUDController.java:148 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/taskedition/TaskPropertiesController.java:518 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/taskedition/TaskPropertiesController.java:556 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/taskedition/TaskPropertiesController.java:587 +#: libreplan-webapp/src/main/java/org/libreplan/web/users/ProfileCRUDController.java:153 #: libreplan-webapp/src/main/java/org/libreplan/web/calendars/BaseCalendarCRUDController.java:476 msgid "Warning" msgstr "Advertencia" @@ -1787,8 +1805,8 @@ msgstr "o nome non pode ser nulo ou baleiro" msgid "Add From Template" msgstr "Engadir a partir de modelo" -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/taskedition/TaskPropertiesController.java:508 -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/taskedition/TaskPropertiesController.java:546 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/taskedition/TaskPropertiesController.java:517 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/taskedition/TaskPropertiesController.java:555 msgid "Assigned resources for this task will be deleted. Are you sure?" msgstr "Os recursos asignados para esta tarefa serán borrados. Está seguro?" @@ -1823,7 +1841,7 @@ msgstr "Xullo" msgid "Enable LDAP authentication" msgstr "Habilitar a autenticación LDAP" -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/consolidations/AdvanceConsolidationModel.java:493 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/consolidations/AdvanceConsolidationModel.java:490 msgid "( max: {0} )" msgstr "( máx: {0} )" @@ -1844,7 +1862,7 @@ msgid "Cannot calculate charts for current data" msgstr "Non se poden calcular gráficos para os datos actuais" #: libreplan-webapp/src/main/java/org/libreplan/web/orders/ProjectDetailsController.java:176 -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:1495 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:1499 msgid "project name already being used" msgstr "o nome de proxecto xa está sendo usado" @@ -1861,7 +1879,7 @@ msgstr "Dividir asignación" msgid "You can not remove the default scenario called \"{0}\"" msgstr "Non se pode borrar o escenario por defecto, chamado \"{0}\"" -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/consolidations/AdvanceConsolidationModel.java:522 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/consolidations/AdvanceConsolidationModel.java:519 msgid "There are not any assigned progress to current task" msgstr "Non hai ningún progreso asignado á tarefa actual" @@ -1890,7 +1908,7 @@ msgstr "Abaixo" msgid "Label" msgstr "Etiqueta" -#: libreplan-webapp/src/main/java/org/libreplan/web/tree/TreeController.java:870 +#: libreplan-webapp/src/main/java/org/libreplan/web/tree/TreeController.java:987 msgid "Value is not valid, taking into account the current list of HoursGroup" msgstr "O valor non é válido, tendo en conta a lista actual de HoursGroup" @@ -1907,8 +1925,8 @@ msgstr "falta tipo de horas de traballo nunha liña do parte" msgid "Quality forms" msgstr "Formularios de calidade" -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/SaveCommandBuilder.java:499 -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/SaveCommandBuilder.java:509 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/SaveCommandBuilder.java:497 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/SaveCommandBuilder.java:507 msgid "Repeated Hours Group code {0} in Project {1}" msgstr "Código {0} de groupo de horas repetido no proxecto {1}" @@ -1920,7 +1938,7 @@ msgstr "Grupo de horas" msgid "LibrePlan: Accounts" msgstr "LibrePlan: Contas" -#: libreplan-webapp/src/main/webapp/templates/templates.zul:96 +#: libreplan-webapp/src/main/webapp/templates/templates.zul:97 #: libreplan-webapp/src/main/webapp/templates/_list.zul:30 msgid "Days from Beginning to Deadline" msgstr "Días desde o comezo ata a data límite" @@ -1953,7 +1971,7 @@ msgstr "Op." msgid "Pessimistic" msgstr "Pesimista" -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/taskedition/TaskPropertiesController.java:376 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/taskedition/TaskPropertiesController.java:385 msgid "Limiting resource assignation" msgstr "Asignación de recursos limitantes" @@ -1984,7 +2002,7 @@ msgstr "O nome do tipo de unidade non pode ser baleiro" msgid "Entity sequences" msgstr "Secuencias de entidade" -#: libreplan-webapp/src/main/webapp/templates/templates.zul:91 +#: libreplan-webapp/src/main/webapp/templates/templates.zul:92 #: libreplan-webapp/src/main/webapp/templates/_list.zul:28 msgid "Delay from beginning (days)" msgstr "Retraso desde o comezo (en días)" @@ -2014,7 +2032,7 @@ msgstr "Confirmar cancelación" msgid "Work And Progress Per Task" msgstr "Traballo e progreso por tarefa" -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:1519 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:1523 msgid "project code already being used" msgstr "o código do proxecto xa está sendo usado" @@ -2033,8 +2051,8 @@ msgstr "Borrando secuencia" #: libreplan-webapp/src/main/java/org/libreplan/web/calendars/BaseCalendarCRUDController.java:457 #: libreplan-webapp/src/main/java/org/libreplan/web/orders/AssignedTaskQualityFormsToOrderElementController.java:208 #: libreplan-webapp/src/main/java/org/libreplan/web/orders/criterionrequirements/AssignedCriterionRequirementController.java:264 -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:840 -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:875 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:844 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:879 msgid "Error on showing removing element: " msgstr "Erro ao mostrar o elemento a borrar: " @@ -2095,7 +2113,7 @@ msgid "Overload" msgstr "Sobrecarga" #: libreplan-webapp/src/main/webapp/templates/_historicalAssignment.zul:30 -#: libreplan-webapp/src/main/webapp/templates/templates.zul:68 +#: libreplan-webapp/src/main/webapp/templates/templates.zul:69 msgid "Assignment log" msgstr "Histórico de asignacións" @@ -2104,10 +2122,6 @@ msgstr "Histórico de asignacións" msgid "Work Report Models" msgstr "Modelos de partes de traballo" -#: libreplan-webapp/src/main/java/org/libreplan/web/print/CutyCaptTimeout.java:45 -msgid "CutycaptTimeout thread exception" -msgstr "Excepción no thread CutycaptTimeout" - #: libreplan-webapp/src/main/webapp/materials/materials.zul:73 msgid "New" msgstr "Novo" @@ -2116,7 +2130,7 @@ msgstr "Novo" msgid "Date last progress measurement" msgstr "Data da última medida de progreso" -#: libreplan-webapp/src/main/java/org/libreplan/web/templates/TemplatesTreeComponent.java:103 +#: libreplan-webapp/src/main/java/org/libreplan/web/templates/TemplatesTreeComponent.java:112 msgid "Deadline (days since beggining project)" msgstr "Data límite (días desde o inicio do proxecto)" @@ -2146,14 +2160,14 @@ msgstr "o nome de tipo de criterio está sendo usado" msgid "Task code cannot be null" msgstr "O código da tarefa non pode ser nulo" -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/consolidations/AdvanceConsolidationModel.java:520 +#: libreplan-webapp/src/main/java/org/libreplan/web/calendars/BaseCalendarEditionController.java:302 +msgid "Derived of calendar {0}" +msgstr "Derivado do calendario {0}" + +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/consolidations/AdvanceConsolidationModel.java:517 msgid "It is not allowed to consolidate progress." msgstr "Non se pode borrar progreso consolidado." -#: libreplan-webapp/src/main/webapp/orders/components/_orderElementTree.zul:32 -msgid "Create Task" -msgstr "Crear tarefa" - #: libreplan-webapp/src/main/webapp/planner/taskpanels/_tabPanelSubcontract.zul:27 msgid "External company" msgstr "Empresa externa" @@ -2162,10 +2176,10 @@ msgstr "Empresa externa" #: libreplan-webapp/src/main/webapp/costcategories/_listTypesOfWorkHours.zul:30 #: libreplan-webapp/src/main/webapp/costcategories/_listCostCategories.zul:28 #: libreplan-webapp/src/main/webapp/users/_listUsers.zul:30 -#: libreplan-webapp/src/main/webapp/users/_editProfile.zul:60 +#: libreplan-webapp/src/main/webapp/users/_editProfile.zul:61 #: libreplan-webapp/src/main/webapp/users/_listProfiles.zul:27 -#: libreplan-webapp/src/main/webapp/users/_editUser.zul:107 -#: libreplan-webapp/src/main/webapp/users/_editUser.zul:140 +#: libreplan-webapp/src/main/webapp/users/_editUser.zul:108 +#: libreplan-webapp/src/main/webapp/users/_editUser.zul:129 #: libreplan-webapp/src/main/webapp/orders/_listOrderElementAuthorizations.zul:44 #: libreplan-webapp/src/main/webapp/orders/_listOrderElementAuthorizations.zul:68 msgid "Actions" @@ -2238,11 +2252,15 @@ msgstr "O valor non é válido.\n o código no pode conter caracteres como '_'." msgid "Hours Group" msgstr "Grupo de horas" +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/TaskElementAdapter.java:1029 +msgid "Budget: {0}€, Consumed: {1}€ ({2}%)" +msgstr "Orzamento: {0}€, Consumido: {1}€ ({2}%)" + #: libreplan-webapp/src/main/java/org/libreplan/web/workreports/WorkReportTypeCRUDController.java:825 msgid "Unallocated name" msgstr "Nome no asignado" -#: libreplan-webapp/src/main/java/org/libreplan/web/tree/TreeController.java:924 +#: libreplan-webapp/src/main/java/org/libreplan/web/tree/TreeController.java:1041 msgid "Move up" msgstr "Mover arriba" @@ -2256,7 +2274,7 @@ msgstr "Data de comunicación da subcontratación" #: libreplan-webapp/src/main/java/org/libreplan/web/planner/tabs/MultipleTabsPlannerController.java:131 #: libreplan-webapp/src/main/java/org/libreplan/web/planner/tabs/MultipleTabsPlannerController.java:134 -#: libreplan-webapp/src/main/java/org/libreplan/web/templates/OrderTemplatesController.java:281 +#: libreplan-webapp/src/main/java/org/libreplan/web/templates/OrderTemplatesController.java:301 #: libreplan-webapp/src/main/java/org/libreplan/web/common/CustomMenuController.java:269 #: libreplan-webapp/src/main/java/org/libreplan/web/common/CustomMenuController.java:367 msgid "Scheduling" @@ -2292,17 +2310,17 @@ msgstr "Páxina arriba" msgid "Create new project" msgstr "Crear novo proxecto" -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/TaskElementAdapter.java:954 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/TaskElementAdapter.java:1026 #: libreplan-webapp/src/main/java/org/libreplan/web/common/components/finders/TaskGroupFilterEnum.java:31 #: libreplan-webapp/src/main/java/org/libreplan/web/common/components/finders/OrderFilterEnum.java:31 #: libreplan-webapp/src/main/webapp/subcontract/subcontractedTasks.zul:53 #: libreplan-webapp/src/main/webapp/subcontract/reportAdvances.zul:50 -#: libreplan-webapp/src/main/webapp/orders/_edition.zul:161 +#: libreplan-webapp/src/main/webapp/orders/_edition.zul:165 #: libreplan-webapp/src/main/webapp/orders/_list.zul:35 msgid "State" msgstr "Estado" -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrdersTreeComponent.java:80 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrdersTreeComponent.java:90 msgid "Must start after" msgstr "Debe empezar despois" @@ -2310,7 +2328,7 @@ msgstr "Debe empezar despois" msgid "Confirm change" msgstr "Confirmar cambio" -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:845 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:849 msgid "You don't have permissions to edit this project" msgstr "Non ten permisos para editar este proxecto" @@ -2349,7 +2367,7 @@ msgstr "LibrePlan: Materiais" msgid "New task" msgstr "Nova tarefa" -#: libreplan-webapp/src/main/java/org/libreplan/web/users/UserCRUDController.java:191 +#: libreplan-webapp/src/main/java/org/libreplan/web/users/UserCRUDController.java:197 msgid "The password for a new user cannot be empty" msgstr "O contrasinal non pode ser baleiro para un usuario novo" @@ -2401,7 +2419,7 @@ msgstr "Detalles persoais" msgid "Workers List" msgstr "Lista de traballadores" -#: libreplan-webapp/src/main/java/org/libreplan/web/templates/OrderTemplatesController.java:355 +#: libreplan-webapp/src/main/java/org/libreplan/web/templates/OrderTemplatesController.java:375 msgid "Delete project template. Are you sure?" msgstr "Borrar modelo de proxecto. ¿Está seguro?" @@ -2482,18 +2500,18 @@ msgstr "Outros proxectos" msgid "Tasks input buffer" msgstr "Buffer de tarefas de entrada" -#: libreplan-webapp/src/main/java/org/libreplan/web/common/ConfigurationModel.java:168 +#: libreplan-webapp/src/main/java/org/libreplan/web/common/ConfigurationModel.java:173 msgid "At least one {0} sequence must be active" msgstr "Polo menos unha secuencia de {0} debe estar activa" #: libreplan-webapp/src/main/webapp/users/_listProfiles.zul:26 -#: libreplan-webapp/src/main/webapp/users/_editUser.zul:139 +#: libreplan-webapp/src/main/webapp/users/_editUser.zul:128 #: libreplan-webapp/src/main/webapp/orders/_listOrderElementAuthorizations.zul:42 #: libreplan-webapp/src/main/webapp/orders/_listOrderElementAuthorizations.zul:66 msgid "Profile name" msgstr "Nome do perfil" -#: libreplan-webapp/src/main/java/org/libreplan/web/print/CutyPrint.java:252 +#: libreplan-webapp/src/main/java/org/libreplan/web/print/CutyPrint.java:246 msgid "Could open generated PDF" msgstr "Non se puido abrir o PDF xerado" @@ -2505,7 +2523,7 @@ msgstr "Deshabilitar borrado" msgid "You should select a source scenario" msgstr "Debe seleccionar un escenario de orixe" -#: libreplan-webapp/src/main/java/org/libreplan/web/common/ConfigurationModel.java:163 +#: libreplan-webapp/src/main/java/org/libreplan/web/common/ConfigurationModel.java:168 msgid "At least one {0} sequence is needed" msgstr "Necesítase polo menos unha secuencia de {0}" @@ -2540,18 +2558,18 @@ msgid "" "to generate usage statistics" msgstr "Marca esta opción para enviar información aos desenvolvedores de LibrePlan para xerar estatísticas de uso" -#: libreplan-webapp/src/main/webapp/resources/search/_resourceFilter.zul:36 -msgid "More options" -msgstr "Máis opcións" +#: libreplan-webapp/src/main/java/org/libreplan/web/subcontract/ReportAdvancesModel.java:219 +#: libreplan-webapp/src/main/java/org/libreplan/web/subcontract/SubcontractedTasksModel.java:179 +msgid "Error: {0}" +msgstr "Erro: {0}" #: libreplan-webapp/src/main/webapp/subcontract/subcontractedTasks.zul:45 msgid "Communication" msgstr "Comunicación" -#: libreplan-webapp/src/main/java/org/libreplan/web/subcontract/ReportAdvancesModel.java:219 -#: libreplan-webapp/src/main/java/org/libreplan/web/subcontract/SubcontractedTasksModel.java:179 -msgid "Error: {0}" -msgstr "Erro: {0}" +#: libreplan-webapp/src/main/webapp/resources/search/_resourceFilter.zul:36 +msgid "More options" +msgstr "Máis opcións" #: libreplan-webapp/src/main/java/org/libreplan/web/orders/TreeElementOperationsController.java:240 msgid "Confirm create template" @@ -2583,7 +2601,7 @@ msgstr "LibrePlan: Traballo e progreso por tarefa" msgid "Projects" msgstr "Proxectos" -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/OrderPlanningModel.java:1102 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/OrderPlanningModel.java:1128 #: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:269 msgid "Confirm exit dialog" msgstr "Diálogo para confirmar a salida" @@ -2661,7 +2679,7 @@ msgstr "Rexistro de traballo" msgid "Output format" msgstr "Formato de saída" -#: libreplan-webapp/src/main/webapp/planner/print_configuration.zul:47 +#: libreplan-webapp/src/main/webapp/planner/print_configuration.zul:49 msgid "Print" msgstr "Imprimir" @@ -2681,8 +2699,8 @@ msgstr "o tipo de recurso non permite criterios habilitados" msgid "Effort cannot be null" msgstr "O esforzo non pode ser nulo" -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/OrderPlanningModel.java:1093 -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/assigntemplates/TemplateFinderPopup.java:52 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/OrderPlanningModel.java:1119 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/assigntemplates/TemplateFinderPopup.java:126 #: libreplan-webapp/src/main/webapp/labels/_editLabelType.zul:116 #: libreplan-webapp/src/main/webapp/excetiondays/_editExceptionDayType.zul:97 #: libreplan-webapp/src/main/webapp/externalcompanies/_editExternalCompany.zul:106 @@ -2694,16 +2712,16 @@ msgstr "O esforzo non pode ser nulo" #: libreplan-webapp/src/main/webapp/costcategories/_editCostCategory.zul:98 #: libreplan-webapp/src/main/webapp/costcategories/_editTypeOfWorkHours.zul:80 #: libreplan-webapp/src/main/webapp/qualityforms/_editQualityForm.zul:137 -#: libreplan-webapp/src/main/webapp/planner/print_configuration.zul:48 +#: libreplan-webapp/src/main/webapp/planner/print_configuration.zul:50 #: libreplan-webapp/src/main/webapp/planner/editTask.zul:81 #: libreplan-webapp/src/main/webapp/planner/reassign.zul:50 #: libreplan-webapp/src/main/webapp/planner/stretches_function.zul:91 #: libreplan-webapp/src/main/webapp/planner/advance_allocation.zul:42 #: libreplan-webapp/src/main/webapp/planner/order.zul:131 #: libreplan-webapp/src/main/webapp/planner/order.zul:166 -#: libreplan-webapp/src/main/webapp/users/_editProfile.zul:85 -#: libreplan-webapp/src/main/webapp/users/_editUser.zul:166 -#: libreplan-webapp/src/main/webapp/templates/templates.zul:139 +#: libreplan-webapp/src/main/webapp/users/_editProfile.zul:74 +#: libreplan-webapp/src/main/webapp/users/_editUser.zul:155 +#: libreplan-webapp/src/main/webapp/templates/templates.zul:147 #: libreplan-webapp/src/main/webapp/calendars/_createNewVersion.zul:58 #: libreplan-webapp/src/main/webapp/calendars/calendars.zul:47 #: libreplan-webapp/src/main/webapp/resources/machine/_editMachine.zul:103 @@ -2739,8 +2757,8 @@ msgid "Machines List" msgstr "Lista de máquinas" #: libreplan-webapp/src/main/java/org/libreplan/web/resourceload/ResourceLoadController.java:320 -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:692 -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:904 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:696 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:908 msgid "You don't have read access to this project" msgstr "Non ten acceso de lectura a este proxecto" @@ -2816,7 +2834,7 @@ msgstr "{0} (máx: {1})" msgid "Cost Category" msgstr "Categoría de custo" -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderElementTreeController.java:471 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderElementTreeController.java:473 msgid "end" msgstr "fin" @@ -2837,7 +2855,7 @@ msgstr "Autorizacións" msgid "Continue" msgstr "Continuar" -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderElementController.java:121 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderElementController.java:122 msgid "Edit task {0}" msgstr "Editar tarefa: {0}" @@ -2870,7 +2888,7 @@ msgstr "Valor máximo por defecto" msgid "Add criterion requirement" msgstr "Engadir criterio requirido" -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:860 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:864 msgid "" "You can not remove the project \"{0}\" because of any of its tasks are " "already in use in some work reports and the project just exists in the " @@ -2910,7 +2928,7 @@ msgstr "LibrePlan: Cambiar o contrasinal" msgid "please, select a label" msgstr "por favor, seleccione unha etiqueta" -#: libreplan-webapp/src/main/webapp/users/_editUser.zul:134 +#: libreplan-webapp/src/main/webapp/users/_editUser.zul:123 msgid "Add profile" msgstr "Engadir perfil" @@ -2989,8 +3007,8 @@ msgstr "o nome non pode ser baleiro" msgid "Disabled" msgstr "Deshabilitado" -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/OrderPlanningModel.java:738 -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/company/CompanyPlanningModel.java:325 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/OrderPlanningModel.java:764 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/company/CompanyPlanningModel.java:322 msgid "Earned value" msgstr "Valor gañado" @@ -3019,8 +3037,8 @@ msgid "" "Please save your project before proceeding." msgstr "Os modelos só poden ser creados a partir de tarefas existentes. Está tentando crear un modelo a partir dunha tarefa nova.\nPor favor garde o seu proxecto antes de continuar." -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/TaskElementAdapter.java:1163 -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/TaskElementAdapter.java:1178 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/TaskElementAdapter.java:1243 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/TaskElementAdapter.java:1258 msgid "{0} not supported yet" msgstr "{0} aínda non soportado" @@ -3042,7 +3060,7 @@ msgstr "Entrada nova" msgid "Resources Load" msgstr "Carga de recursos" -#: libreplan-webapp/src/main/java/org/libreplan/web/common/ConfigurationModel.java:220 +#: libreplan-webapp/src/main/java/org/libreplan/web/common/ConfigurationModel.java:225 msgid "Some sequences to remove not existed" msgstr "Algunhas secuencias para borrar non existen" @@ -3117,11 +3135,11 @@ msgid "Select start date" msgstr "Seleccionar data de inicio" #: libreplan-webapp/src/main/java/org/libreplan/web/costcategories/TypeOfWorkHoursCRUDController.java:106 -#: libreplan-webapp/src/main/java/org/libreplan/web/users/ProfileCRUDController.java:152 +#: libreplan-webapp/src/main/java/org/libreplan/web/users/ProfileCRUDController.java:157 msgid "Error on showing warning message removing typeOfWorkHours: " msgstr "Erro ao mostrar mensaxe de advertencia borrando tipo de horas de traballo: " -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:882 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:886 msgid "Removed {0}" msgstr "{0} borrado" @@ -3133,8 +3151,8 @@ msgstr "Confirmar o borrado deste traballador. ¿Está seguro?" msgid "Group name" msgstr "Nome do grupo" -#: libreplan-webapp/src/main/webapp/users/_editProfile.zul:59 -#: libreplan-webapp/src/main/webapp/users/_editUser.zul:106 +#: libreplan-webapp/src/main/webapp/users/_editProfile.zul:60 +#: libreplan-webapp/src/main/webapp/users/_editUser.zul:107 msgid "Role name" msgstr "Nome do rol" @@ -3150,8 +3168,8 @@ msgstr "Crear parte de traballo" msgid "Value is not valid, the precision value must not be empty" msgstr "O valor non é válido, o valor de precisión non debe estar baleiro" -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/OrderPlanningModel.java:863 -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/company/CompanyPlanningModel.java:473 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/OrderPlanningModel.java:889 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/company/CompanyPlanningModel.java:470 msgid "h" msgstr "h" @@ -3176,7 +3194,7 @@ msgstr "Engadir fito" msgid "Assign selected items" msgstr "Asignar elementos seleccionados" -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderElementTreeController.java:450 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderElementTreeController.java:452 msgid "init" msgstr "inicio" @@ -3253,6 +3271,10 @@ msgstr "Cliente" msgid "Hours type" msgstr "Tipo de horas" +#: libreplan-webapp/src/main/webapp/planner/print_configuration.zul:43 +msgid "Show money cost bar" +msgstr "Monstrar barra de coste monetario" + #: libreplan-webapp/src/main/java/org/libreplan/ws/resources/impl/ResourceConverter.java:156 #: libreplan-business/src/main/java/org/libreplan/business/resources/entities/CriterionType.java:211 msgid "criterion type name not specified" @@ -3266,11 +3288,11 @@ msgstr "Non se pode conectar ao servidor de LDAP" msgid "Add Exception" msgstr "Engadir excepción" -#: libreplan-webapp/src/main/java/org/libreplan/web/tree/TreeController.java:220 +#: libreplan-webapp/src/main/java/org/libreplan/web/tree/TreeController.java:222 #: libreplan-webapp/src/main/java/org/libreplan/web/qualityforms/QualityFormCRUDController.java:202 #: libreplan-webapp/src/main/java/org/libreplan/web/qualityforms/QualityFormCRUDController.java:223 #: libreplan-webapp/src/main/java/org/libreplan/web/qualityforms/QualityFormCRUDController.java:247 -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderElementTreeController.java:378 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderElementTreeController.java:379 msgid "cannot be empty" msgstr "non pode ser baleiro" @@ -3394,7 +3416,7 @@ msgstr "Opcións de exportación" #: libreplan-webapp/src/main/webapp/reports/workingArrangementsPerOrderReport.zul:145 #: libreplan-webapp/src/main/webapp/reports/timeLineMaterialReport.zul:94 #: libreplan-webapp/src/main/webapp/users/_editProfile.zul:40 -#: libreplan-webapp/src/main/webapp/templates/templates.zul:80 +#: libreplan-webapp/src/main/webapp/templates/templates.zul:81 #: libreplan-webapp/src/main/webapp/templates/_list.zul:27 #: libreplan-webapp/src/main/webapp/templates/_assignedQualityForms.zul:48 #: libreplan-webapp/src/main/webapp/subcontract/reportAdvances.zul:45 @@ -3463,7 +3485,7 @@ msgstr "Horas traballadas por recurso" msgid "The end date cannot be before the init date" msgstr "A data de fin non pode ser anterior á data de inicio" -#: libreplan-webapp/src/main/webapp/users/_editUser.zul:128 +#: libreplan-webapp/src/main/webapp/users/_editUser.zul:117 msgid "" "Profiles of LDAP users cannot be managed because LDAP roles are being used." msgstr "Os perfís dos usuarios de LDAP non se poden xestionar porque os roles de LDAP están sendo usados." @@ -3559,7 +3581,7 @@ msgstr "Grupo de traballadores virtuais" msgid "Changes saved" msgstr "Cambios gardados" -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:1263 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:1267 msgid "See scheduling" msgstr "Ver planificación" @@ -3588,7 +3610,7 @@ msgid "Work report saved" msgstr "Parte de traballo gardado" #: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/SubcontractCommand.java:53 -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/taskedition/TaskPropertiesController.java:377 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/taskedition/TaskPropertiesController.java:386 #: libreplan-webapp/src/main/webapp/planner/editTask.zul:68 msgid "Subcontract" msgstr "Subcontratar" @@ -3624,10 +3646,6 @@ msgstr "non pode ser baleiro" msgid "April" msgstr "Abril" -#: libreplan-webapp/src/main/java/org/libreplan/web/calendars/BaseCalendarEditionController.java:302 -msgid "Derived of Calendar " -msgstr "Derivado do calendario " - #: libreplan-webapp/src/main/webapp/users/_listUsers.zul:22 msgid "Users List" msgstr "Lista de usuarios" @@ -3685,14 +3703,14 @@ msgstr "Filtrar formularios de calidade por" msgid "Unindent selected task" msgstr "Desindentar tarefa seleccionada" -#: libreplan-webapp/src/main/webapp/planner/taskpanels/_tabPanelTaskProperties.zul:62 -msgid "Constraint" -msgstr "Restrición" - #: libreplan-webapp/src/main/webapp/subcontract/reportAdvances.zul:44 msgid "Customer reference code" msgstr "Código de referencia do cliente" +#: libreplan-webapp/src/main/webapp/planner/taskpanels/_tabPanelTaskProperties.zul:66 +msgid "Constraint" +msgstr "Restrición" + #: libreplan-webapp/src/main/webapp/workreports/_editWorkReportType.zul:150 msgid "Add New Label Type Field" msgstr "Engadir novo campo de tipo de etiqueta" @@ -3711,16 +3729,16 @@ msgstr "Referencia del cliente" #: libreplan-webapp/src/main/java/org/libreplan/web/templates/historicalAssignment/OrderElementHistoricalAssignmentComponent.java:146 #: libreplan-webapp/src/main/java/org/libreplan/web/resourceload/ResourceLoadController.java:311 #: libreplan-webapp/src/main/java/org/libreplan/web/resourceload/ResourceLoadController.java:321 -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:693 -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:846 -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:896 -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:905 -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:932 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:697 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:850 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:900 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:909 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:936 #: libreplan-webapp/src/main/java/org/libreplan/web/limitingresources/LimitingResourcesController.java:333 msgid "Information" msgstr "Información" -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:931 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:935 msgid "Sorry, you do not have permissions to access this project" msgstr "Sentímolo, non ten permisos para acceder a este proxecto" @@ -3744,7 +3762,7 @@ msgstr "novo grupo de horas " msgid "Assign element to queue manually" msgstr "Asignar elemento á cola manualmente" -#: libreplan-webapp/src/main/webapp/planner/print_configuration.zul:45 +#: libreplan-webapp/src/main/webapp/planner/print_configuration.zul:47 msgid "Please remember that only saved changes will be printed" msgstr "Por favor lembra que só os cambios gardados serán impresos" @@ -3789,6 +3807,10 @@ msgstr "Tipo de excepción de calendario non atopado" msgid "Unable to convert value to {0} type" msgstr "No se puido convertir o valor a tipo {0}" +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrdersTreeComponent.java:81 +msgid "Total task budget" +msgstr "Orzamento total da tarefa" + #: libreplan-webapp/src/main/java/org/libreplan/web/resources/worker/WorkerModel.java:222 msgid "Worker must be not-null" msgstr "O traballador non debe ser nulo" @@ -3797,14 +3819,14 @@ msgstr "O traballador non debe ser nulo" msgid "Some criterion satisfactions overlap in time" msgstr "Algúns criterios satisfeitos solápanse no tempo" -#: libreplan-webapp/src/main/webapp/reports/timeLineMaterialReport.zul:21 -msgid "LibrePlan: Materials Needs At Date" -msgstr "LibrePlan: Necesidades de materiais en data" - #: libreplan-webapp/src/main/webapp/subcontract/reportAdvances.zul:49 msgid "Value last progress measurement" msgstr "Valor da última medida de progreso" +#: libreplan-webapp/src/main/webapp/reports/timeLineMaterialReport.zul:21 +msgid "LibrePlan: Materials Needs At Date" +msgstr "LibrePlan: Necesidades de materiais en data" + #: libreplan-webapp/src/main/webapp/resources/machine/_machineConfigurationUnits.zul:44 msgid "Worker assignments" msgstr "Asignacións de traballador" @@ -4033,7 +4055,7 @@ msgid "Check consolidated progresses" msgstr "Marcar progresos consolidados" #: libreplan-webapp/src/main/java/org/libreplan/web/workreports/WorkReportCRUDController.java:1469 -#: libreplan-webapp/src/main/java/org/libreplan/web/workreports/WorkReportModel.java:585 +#: libreplan-webapp/src/main/java/org/libreplan/web/workreports/WorkReportModel.java:587 msgid "Show all" msgstr "Mostrar todo" @@ -4051,7 +4073,7 @@ msgid "Apply tab changes" msgstr "Aplicar cambios da pestana" #: libreplan-webapp/src/main/java/org/libreplan/web/users/settings/PasswordController.java:99 -#: libreplan-webapp/src/main/java/org/libreplan/web/users/UserCRUDController.java:170 +#: libreplan-webapp/src/main/java/org/libreplan/web/users/UserCRUDController.java:176 msgid "passwords don't match" msgstr "os contrasinais non coinciden" @@ -4171,7 +4193,7 @@ msgstr "Non indentable" msgid "List of materials for all categories (select one to filter)" msgstr "Lista de materiais paa tódalas categorías (seleccione unha para filtrar)" -#: libreplan-webapp/src/main/webapp/planner/taskpanels/_tabPanelTaskProperties.zul:69 +#: libreplan-webapp/src/main/webapp/planner/taskpanels/_tabPanelTaskProperties.zul:73 msgid "Resource allocation type" msgstr "Tipo de asignación de recursos" @@ -4188,7 +4210,7 @@ msgstr "Tipo de excepción" msgid "In the available periods {0} only {1} hours are available." msgstr "Nos períodos dispoñibles {0} só hai dispoñibles {1} horas." -#: libreplan-webapp/src/main/webapp/users/_editUser.zul:126 +#: libreplan-webapp/src/main/webapp/users/_editUser.zul:115 msgid "Association with profiles" msgstr "Asociación con perfís" @@ -4230,7 +4252,7 @@ msgstr "Base" msgid "Total dedication" msgstr "Dedicación total" -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderElementTreeController.java:683 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderElementTreeController.java:686 msgid "" "You can not remove the task \"{0}\" because of this or any of its children " "are already in use in some work reports" @@ -4431,8 +4453,8 @@ msgstr "Habilitar/Deshabilitar a advertencia sobre novas versións de LibrePlan msgid "Select type" msgstr "Seleccione tipo" -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/TaskElementAdapter.java:950 -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderModel.java:679 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/TaskElementAdapter.java:1021 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderModel.java:685 msgid "Hours invested" msgstr "Horas invertidas" @@ -4502,7 +4524,7 @@ msgstr "Vista da compañía" msgid "Both" msgstr "Ambos" -#: libreplan-webapp/src/main/java/org/libreplan/web/tree/TreeController.java:765 +#: libreplan-webapp/src/main/java/org/libreplan/web/tree/TreeController.java:882 msgid "Not editable for containing more that an hours group." msgstr "Non editable por conter máis dun grupo de horas." @@ -4576,6 +4598,7 @@ msgid "LibrePlan: Transfer Projects Between Scenarios" msgstr "LibrePlan: Transferir proxectos entre escenarios" #: libreplan-webapp/src/main/webapp/orders/_listOrderElementHours.zul:118 +#: libreplan-webapp/src/main/webapp/orders/_listOrderElementHours.zul:166 msgid "%" msgstr "%" @@ -4586,14 +4609,14 @@ msgstr "Borrar calendario" #: libreplan-webapp/src/main/java/org/libreplan/web/workreports/WorkReportCRUDController.java:1536 #: libreplan-webapp/src/main/java/org/libreplan/web/workreports/WorkReportCRUDController.java:1700 -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/OrderPlanningController.java:336 -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/company/CompanyPlanningController.java:273 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/OrderPlanningController.java:338 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/company/CompanyPlanningController.java:274 #: libreplan-webapp/src/main/java/org/libreplan/web/reports/OrderCostsPerResourceController.java:141 #: libreplan-webapp/src/main/java/org/libreplan/web/resources/worker/WorkerCRUDController.java:633 #: libreplan-webapp/src/main/java/org/libreplan/web/resources/machine/MachineCRUDController.java:425 #: libreplan-webapp/src/main/java/org/libreplan/web/orders/ProjectDetailsController.java:257 -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderElementTreeController.java:670 -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:1328 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderElementTreeController.java:673 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:1332 msgid "must be lower than finish date" msgstr "debe ser anterior á data de fin" @@ -4614,14 +4637,14 @@ msgstr "Recurso" msgid "Total task hours" msgstr "Total de horas de tarefa" -#: libreplan-webapp/src/main/java/org/libreplan/web/common/entrypoints/RedirectorSynthetiser.java:125 -msgid "Could not load any resource" -msgstr "Non se puido cargar un recurso" - #: libreplan-webapp/src/main/webapp/subcontract/reportAdvances.zul:46 msgid "Date last progress reported" msgstr "Data último progreso notificado" +#: libreplan-webapp/src/main/java/org/libreplan/web/common/entrypoints/RedirectorSynthetiser.java:125 +msgid "Could not load any resource" +msgstr "Non se puido cargar un recurso" + #: libreplan-webapp/src/main/java/org/libreplan/web/common/CustomMenuController.java:343 #: libreplan-webapp/src/main/webapp/reports/schedulingProgressPerOrderReport.zul:37 msgid "Work And Progress Per Project" @@ -4684,7 +4707,7 @@ msgstr "Lista de liñas de parte de traballo" msgid "Unit type code cannot be empty" msgstr "O código de tipo de unidade non pode ser baleiro" -#: libreplan-webapp/src/main/java/org/libreplan/web/users/UserCRUDController.java:183 +#: libreplan-webapp/src/main/java/org/libreplan/web/users/UserCRUDController.java:189 #: libreplan-webapp/src/main/java/org/libreplan/web/common/CustomMenuController.java:320 msgid "Users" msgstr "Usuarios" @@ -4717,8 +4740,8 @@ msgid "" "completed." msgstr "Outro usuario modificou os mesmos datos, polo tanto a operación non se pode completar con seguridade." -#: libreplan-webapp/src/main/java/org/libreplan/web/templates/OrderTemplatesController.java:218 -#: libreplan-webapp/src/main/java/org/libreplan/web/templates/OrderTemplatesController.java:232 +#: libreplan-webapp/src/main/java/org/libreplan/web/templates/OrderTemplatesController.java:223 +#: libreplan-webapp/src/main/java/org/libreplan/web/templates/OrderTemplatesController.java:244 msgid "Template saved" msgstr "Modelo gardado" @@ -4757,7 +4780,7 @@ msgstr "Saír da sesión" #: libreplan-webapp/src/main/webapp/resources/worker/_localizations.zul:31 #: libreplan-webapp/src/main/webapp/resources/worker/_localizations.zul:53 #: libreplan-webapp/src/main/webapp/resources/worker/_localizations.zul:67 -#: libreplan-business/src/main/java/org/libreplan/business/templates/entities/OrderLineGroupTemplate.java:243 +#: libreplan-business/src/main/java/org/libreplan/business/templates/entities/OrderLineGroupTemplate.java:244 msgid "Group" msgstr "Grupo" @@ -4822,9 +4845,9 @@ msgstr "Actualización incompatible: i recurso almacenado non é de tipo: {0}" #: libreplan-webapp/src/main/webapp/costcategories/_editCostCategory.zul:96 #: libreplan-webapp/src/main/webapp/costcategories/_editTypeOfWorkHours.zul:78 #: libreplan-webapp/src/main/webapp/qualityforms/_editQualityForm.zul:134 -#: libreplan-webapp/src/main/webapp/users/_editProfile.zul:83 -#: libreplan-webapp/src/main/webapp/users/_editUser.zul:164 -#: libreplan-webapp/src/main/webapp/templates/templates.zul:137 +#: libreplan-webapp/src/main/webapp/users/_editProfile.zul:72 +#: libreplan-webapp/src/main/webapp/users/_editUser.zul:153 +#: libreplan-webapp/src/main/webapp/templates/templates.zul:145 #: libreplan-webapp/src/main/webapp/resources/worker/_edition.zul:114 #: libreplan-webapp/src/main/webapp/resources/machine/_editMachine.zul:100 #: libreplan-webapp/src/main/webapp/resources/criterions/_edition.zul:92 @@ -4892,7 +4915,7 @@ msgstr "Planificar dende a data límite ao principio" msgid "generic machines allocation" msgstr "asignación xenérica de máquinas" -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/taskedition/TaskPropertiesController.java:375 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/taskedition/TaskPropertiesController.java:384 msgid "Non limiting resource assignation" msgstr "Asignación de recursos non limitantes" @@ -4915,13 +4938,13 @@ msgstr "Administración" #: libreplan-webapp/src/main/java/org/libreplan/web/workreports/WorkReportCRUDController.java:1519 #: libreplan-webapp/src/main/java/org/libreplan/web/workreports/WorkReportCRUDController.java:1682 -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/OrderPlanningController.java:317 -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/company/CompanyPlanningController.java:255 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/OrderPlanningController.java:319 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/company/CompanyPlanningController.java:256 #: libreplan-webapp/src/main/java/org/libreplan/web/resources/worker/WorkerCRUDController.java:616 #: libreplan-webapp/src/main/java/org/libreplan/web/resources/machine/MachineCRUDController.java:408 #: libreplan-webapp/src/main/java/org/libreplan/web/orders/ProjectDetailsController.java:240 -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderElementTreeController.java:652 -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:1311 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderElementTreeController.java:655 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:1315 msgid "must be greater than start date" msgstr "debe ser maior que a data de inicio" @@ -4934,6 +4957,10 @@ msgstr "Cancelar e volver" msgid "Assign quality form" msgstr "Asignar formulario de calidade" +#: libreplan-webapp/src/main/webapp/orders/_edition.zul:157 +msgid "Calculated budget" +msgstr "Orzamento calculado" + #: libreplan-webapp/src/main/java/org/libreplan/web/orders/materials/AssignedMaterialsController.java:387 msgid "Delete item {0}. Are you sure?" msgstr "Borrar elemento {0}. ¿Está seguro?" @@ -4959,6 +4986,10 @@ msgstr "unha liña de parte de traballo non ten este tipo de etiqueta asignado" msgid "Allocations" msgstr "Asignacións" +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/assigntemplates/TemplateFinderPopup.java:137 +msgid "Choosing Template" +msgstr "Elixindo modelo" + #: libreplan-webapp/src/main/webapp/calendars/_edition.zul:66 #: libreplan-webapp/src/main/webapp/resources/worker/_listVirtualWorkers.zul:35 msgid "Capacity" @@ -5003,7 +5034,7 @@ msgstr "Non se fixeron asignacións" msgid "Removed calendar \"{0}\"" msgstr "Borrado calendario \"{0}\"" -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:1068 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:1072 msgid "Create project" msgstr "Crear proxecto" @@ -5044,29 +5075,29 @@ msgstr "Non se engadiron esas actualizacións ao usuario {0} porque xa estaban p msgid "New work report" msgstr "Novo parte de traballo" +#: libreplan-webapp/src/main/java/org/libreplan/web/calendars/BaseCalendarEditionController.java:305 +msgid "Root calendar" +msgstr "Calendario raíz" + #: libreplan-webapp/src/main/java/org/libreplan/web/resources/worker/WorkerCRUDController.java:847 #: libreplan-webapp/src/main/java/org/libreplan/web/resources/machine/MachineCRUDController.java:578 msgid "yes" msgstr "si" -#: libreplan-webapp/src/main/java/org/libreplan/web/calendars/BaseCalendarEditionController.java:305 -msgid "Root calendar" -msgstr "Calendario raíz" - -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:867 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:871 msgid "" "Deleting this subcontracted project, you are going to lose the relation to " "report progress. Are you sure?" msgstr "Borrando este proxecto subcontrado, perderá a relación para notificar progresos. ¿Está seguro?" -#: libreplan-webapp/src/main/webapp/common/configuration.zul:278 -msgid "Port" -msgstr "Porto" - #: libreplan-webapp/src/main/webapp/limitingresources/manualAllocation.zul:113 msgid "Select gap" msgstr "Seleccionar intervalo" +#: libreplan-webapp/src/main/webapp/common/configuration.zul:278 +msgid "Port" +msgstr "Porto" + #: libreplan-webapp/src/main/webapp/workreports/workReport.zul:63 msgid "Date Finish" msgstr "Data de fin" @@ -5094,7 +5125,11 @@ msgstr "Asignación de categoría de custo" msgid "missing code in a hour cost" msgstr "falta código nun custo por hora" -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/TaskElementAdapter.java:902 +#: libreplan-webapp/src/main/java/org/libreplan/web/exceptionDays/CalendarExceptionTypeCRUDController.java:247 +msgid "Exception Day Type" +msgstr "Tipo de día de excepción" + +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/TaskElementAdapter.java:973 msgid "All workers" msgstr "Todos os traballadores" @@ -5118,14 +5153,16 @@ msgstr "Grupo de horas {0} : Clave duplicada en BD" #: libreplan-webapp/src/main/java/org/libreplan/web/materials/MaterialsController.java:311 #: libreplan-webapp/src/main/java/org/libreplan/web/costcategories/CostCategoryCRUDController.java:207 #: libreplan-webapp/src/main/java/org/libreplan/web/costcategories/CostCategoryCRUDController.java:307 +#: libreplan-webapp/src/main/java/org/libreplan/web/templates/TemplatesTreeController.java:110 +#: libreplan-webapp/src/main/java/org/libreplan/web/templates/TemplatesTreeController.java:130 #: libreplan-webapp/src/main/java/org/libreplan/web/calendars/BaseCalendarEditionController.java:994 #: libreplan-webapp/src/main/java/org/libreplan/web/calendars/BaseCalendarEditionController.java:1184 #: libreplan-webapp/src/main/java/org/libreplan/web/calendars/BaseCalendarEditionController.java:1441 #: libreplan-webapp/src/main/java/org/libreplan/web/resources/criterion/CriterionTreeController.java:135 #: libreplan-webapp/src/main/java/org/libreplan/web/orders/ProjectDetailsController.java:171 #: libreplan-webapp/src/main/java/org/libreplan/web/orders/labels/AssignedLabelsController.java:115 -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:1488 -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:1512 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:1492 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:1516 #: libreplan-webapp/src/main/java/org/libreplan/web/common/ConfigurationController.java:757 #: libreplan-webapp/src/main/webapp/labels/_editLabelType.zul:45 #: libreplan-webapp/src/main/webapp/labels/_editLabelType.zul:53 @@ -5192,10 +5229,6 @@ msgstr "Tipo de unidade" msgid "Load due to other assignments" msgstr "Carga debido a outras asignacións" -#: libreplan-webapp/src/main/webapp/orders/_listOrderElementHours.zul:62 -msgid "Sum of all task leafs imputed hours" -msgstr "Suma de horas imputadas por todas as tarefas folla" - #: libreplan-webapp/src/main/java/org/libreplan/web/resources/machine/MachineCRUDController.java:554 msgid "This machine was already removed by other user" msgstr "Esta máquina xa foi borrada por outro usuario" @@ -5268,11 +5301,11 @@ msgstr "Nome de usuario da nosa empresa" msgid "Filter work reports" msgstr "Filtrar partes de traballo" -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/TaskElementAdapter.java:947 -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderModel.java:678 -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderElementTreeController.java:601 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/TaskElementAdapter.java:1018 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderModel.java:684 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderElementTreeController.java:603 #: libreplan-webapp/src/main/java/org/libreplan/web/common/CustomMenuController.java:328 -#: libreplan-webapp/src/main/webapp/templates/templates.zul:63 +#: libreplan-webapp/src/main/webapp/templates/templates.zul:64 #: libreplan-webapp/src/main/webapp/templates/_editTemplateWindow.zul:49 #: libreplan-webapp/src/main/webapp/orders/_editOrderElement.zul:48 #: libreplan-webapp/src/main/webapp/orders/_edition.zul:46 @@ -5335,7 +5368,7 @@ msgstr "opcións" msgid "LibrePlan: Work Reports" msgstr "LibrePlan: Partes de traballo" -#: libreplan-webapp/src/main/java/org/libreplan/web/templates/OrderTemplatesController.java:373 +#: libreplan-webapp/src/main/java/org/libreplan/web/templates/OrderTemplatesController.java:393 #: libreplan-webapp/src/main/java/org/libreplan/web/orders/materials/AssignedMaterialsController.java:393 msgid "Error on showing delete confirm" msgstr "Erro ao mostrar a confirmación de borrado" @@ -5360,7 +5393,7 @@ msgstr "Agrupar por semanas" msgid "Finish hour" msgstr "Hora de fin" -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/reassign/ReassignCommand.java:200 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/reassign/ReassignCommand.java:196 msgid "Done {0} of {1}" msgstr "Feito {0} de {1}" @@ -5416,16 +5449,16 @@ msgstr "Esta medida de progreso non pode estar en " msgid "Inherited labels" msgstr "Etiquetas herdadas" -#: libreplan-webapp/src/main/java/org/libreplan/web/tree/TreeController.java:946 -#: libreplan-webapp/src/main/java/org/libreplan/web/resources/criterion/CriterionTreeController.java:292 -msgid "Unindent" -msgstr "Desindentar" - #: libreplan-webapp/src/main/java/org/libreplan/web/orders/ManageOrderElementAdvancesController.java:939 #: libreplan-webapp/src/main/java/org/libreplan/web/orders/ManageOrderElementAdvancesController.java:1406 msgid "Value is not valid, the current value must be not empty" msgstr "O valor non é válido, o valor actual non debe estar baleiro" +#: libreplan-webapp/src/main/java/org/libreplan/web/tree/TreeController.java:1063 +#: libreplan-webapp/src/main/java/org/libreplan/web/resources/criterion/CriterionTreeController.java:292 +msgid "Unindent" +msgstr "Desindentar" + #: libreplan-webapp/src/main/webapp/orders/components/_listOrderElementLabels.zul:50 msgid "Direct labels" msgstr "Etiquetas directas" @@ -5489,7 +5522,7 @@ msgstr "O código da secuencia xa está en uso e non se pode actualizar." msgid "Scheduling state" msgstr "Estado de planificación" -#: libreplan-webapp/src/main/java/org/libreplan/web/templates/OrderTemplatesController.java:369 +#: libreplan-webapp/src/main/java/org/libreplan/web/templates/OrderTemplatesController.java:389 msgid "This template can not be removed because it has applications." msgstr "Este modelo non pode borrarse porque ten aplicacións." @@ -5509,6 +5542,10 @@ msgstr "LibrePlan: Horas traballadas por recurso" msgid "Number of iterations should be between 1 and " msgstr "O número de iteracións debe estar entre 1 e " +#: libreplan-webapp/src/main/webapp/orders/_listOrderElementHours.zul:151 +msgid "Budget in money" +msgstr "Orzamento en diñeiro" + #: libreplan-webapp/src/main/java/org/libreplan/web/common/ConfigurationController.java:145 msgid "Scenarios must be enabled as more elements than master exist" msgstr "Os escenarios deben estar habilitados xa que existen máis elementos que master" @@ -5551,7 +5588,7 @@ msgstr "Her" msgid "Administrator" msgstr "Administrador" -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/reassign/ReassignCommand.java:190 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/reassign/ReassignCommand.java:186 msgid "Doing {0} reassignations" msgstr "Realizando {0} reasignacións" @@ -5587,7 +5624,7 @@ msgstr "Non se pode borrar o tipo de parte de traballo. Hai algún parte de trab msgid "Criterion Type List" msgstr "Lista de tipos de criterio" -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/OrderPlanningModel.java:739 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/OrderPlanningModel.java:765 msgid "Overall progress" msgstr "Progreso global" @@ -5611,7 +5648,7 @@ msgstr "Contrasinal" msgid "Observations" msgstr "Observacións" -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:947 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:951 msgid "Edit project" msgstr "Editar proxecto" @@ -5666,7 +5703,6 @@ msgstr "Borrar {0} \"{1}\". ¿Está seguro?" msgid "Only {0} resources per day were achieved for current allocation" msgstr "Só se lograon {0} recursos por día para a asignación actual" -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/assigntemplates/TemplateFinderPopup.java:51 #: libreplan-webapp/src/main/webapp/planner/editTask.zul:79 #: libreplan-webapp/src/main/webapp/planner/reassign.zul:48 #: libreplan-webapp/src/main/webapp/planner/stretches_function.zul:89 @@ -5713,6 +5749,10 @@ msgstr "Completado: {0}% " msgid "Calculated progress measurement can not be removed" msgstr "As medidas de progreso calculadas non se poden borrar" +#: libreplan-webapp/src/main/java/org/libreplan/web/exceptionDays/CalendarExceptionTypeCRUDController.java:252 +msgid "Exception Day Types" +msgstr "Tipos de día de excepción" + #: libreplan-webapp/src/main/java/org/libreplan/web/resources/worker/AssignedCriterionsModel.java:335 #: libreplan-webapp/src/main/java/org/libreplan/web/resources/worker/AssignedCriterionsModel.java:341 msgid " The " @@ -5756,6 +5796,10 @@ msgstr "Aplicar cambios e continuar a edición" msgid "Infinitely Over Assignable" msgstr "Sobreasignable infinitamente" +#: libreplan-webapp/src/main/webapp/orders/_listOrderElementHours.zul:157 +msgid "Money spent" +msgstr "Diñeiro gastado" + #: libreplan-business/src/main/java/org/libreplan/business/resources/entities/CriterionType.java:426 msgid "criterion names must be unique inside a criterion type" msgstr "o nome do criterio debe ser único dentro dun tipo de criterio" @@ -5791,7 +5835,7 @@ msgstr "Os períodos dispoñibles dependen da satisfacción dos criterios polos #: libreplan-webapp/src/main/webapp/reports/hoursWorkedPerWorkerReport.zul:86 #: libreplan-webapp/src/main/webapp/reports/schedulingProgressPerOrderReport.zul:116 #: libreplan-webapp/src/main/webapp/reports/timeLineMaterialReport.zul:95 -#: libreplan-webapp/src/main/webapp/templates/templates.zul:85 +#: libreplan-webapp/src/main/webapp/templates/templates.zul:86 #: libreplan-webapp/src/main/webapp/templates/_list.zul:26 #: libreplan-webapp/src/main/webapp/templates/_materialAssignmentsBox.zul:28 #: libreplan-webapp/src/main/webapp/calendars/_edition.zul:54 @@ -5848,15 +5892,20 @@ msgstr "Data de inicio" msgid "Update exception" msgstr "Actualizar excepción" -#: libreplan-webapp/src/main/webapp/subcontract/subcontractedTasks.zul:52 -#: libreplan-webapp/src/main/webapp/orders/_edition.zul:140 -msgid "Budget" -msgstr "Presuposto" - #: libreplan-webapp/src/main/java/org/libreplan/web/orders/TreeElementOperationsController.java:253 msgid "Operation cannot be done" msgstr "Non se pode realizar a operación" +#: libreplan-webapp/src/main/java/org/libreplan/web/templates/TemplatesTreeComponent.java:91 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrdersTreeComponent.java:80 +#: libreplan-webapp/src/main/webapp/planner/taskpanels/_tabPanelTaskProperties.zul:62 +#: libreplan-webapp/src/main/webapp/templates/templates.zul:107 +#: libreplan-webapp/src/main/webapp/subcontract/subcontractedTasks.zul:52 +#: libreplan-webapp/src/main/webapp/orders/_orderElementDetails.zul:65 +#: libreplan-webapp/src/main/webapp/orders/_edition.zul:140 +msgid "Budget" +msgstr "Presuposto" + #: libreplan-webapp/src/main/java/org/libreplan/web/reports/HoursWorkedPerWorkerInAMonthController.java:44 msgid "May" msgstr "Maio" @@ -5890,7 +5939,7 @@ msgstr "Número de aplicacións" msgid "Assign element to queue automatically" msgstr "Asignar elemento á cola automáticamente" -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrdersTreeComponent.java:82 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrdersTreeComponent.java:92 msgid "" "Date which the task must start after (press enter in textbox to open " "calendar popup or type in date directly)" @@ -5926,8 +5975,8 @@ msgstr "Este tipo de etiqueta xa está asignado ao tipo de parte de traballo." msgid "Probability %" msgstr "Probabilidade %" -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/OrderPlanningModel.java:737 -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/company/CompanyPlanningModel.java:324 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/OrderPlanningModel.java:763 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/company/CompanyPlanningModel.java:321 #: libreplan-webapp/src/main/java/org/libreplan/web/resourceload/ResourceLoadController.java:815 #: libreplan-webapp/src/main/webapp/planner/_legendLoadChartOrder.zul:49 msgid "Load" @@ -5938,12 +5987,12 @@ msgstr "Carga" msgid "New criterion" msgstr "Criterio novo" -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderModel.java:683 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderModel.java:689 #: libreplan-webapp/src/main/webapp/materials/materials.zul:81 #: libreplan-webapp/src/main/webapp/scenarios/_edition.zul:43 #: libreplan-webapp/src/main/webapp/qualityforms/_listQualityForm.zul:37 #: libreplan-webapp/src/main/webapp/qualityforms/_editQualityForm.zul:49 -#: libreplan-webapp/src/main/webapp/templates/templates.zul:101 +#: libreplan-webapp/src/main/webapp/templates/templates.zul:102 #: libreplan-webapp/src/main/webapp/templates/_list.zul:32 #: libreplan-webapp/src/main/webapp/subcontract/subcontractedTasks.zul:51 #: libreplan-webapp/src/main/webapp/resources/machine/_listMachines.zul:36 @@ -5967,7 +6016,7 @@ msgstr "Nodo seleccionado" msgid "already exists an allocation for criteria {0}" msgstr "xa existe unha asignación para os criterios {0}" -#: libreplan-webapp/src/main/java/org/libreplan/web/templates/OrderTemplatesController.java:283 +#: libreplan-webapp/src/main/java/org/libreplan/web/templates/OrderTemplatesController.java:303 #: libreplan-webapp/src/main/java/org/libreplan/web/common/CustomMenuController.java:294 msgid "Project Templates" msgstr "Modelos de proxectos" @@ -5994,7 +6043,7 @@ msgstr "Non asignado" msgid "At least one HoursGroup is needed" msgstr "É necesario alo menos un HoursGroup" -#: libreplan-webapp/src/main/java/org/libreplan/web/users/UserCRUDController.java:178 +#: libreplan-webapp/src/main/java/org/libreplan/web/users/UserCRUDController.java:184 #: libreplan-webapp/src/main/webapp/externalcompanies/_editExternalCompany.zul:63 #: libreplan-webapp/src/main/webapp/common/layout/login.zul:74 #: libreplan-business/src/main/java/org/libreplan/business/advance/entities/AdvanceType.java:165 @@ -6058,8 +6107,8 @@ msgstr "Carga 100%" msgid "Function" msgstr "Función" -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/OrderPlanningModel.java:799 -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/company/CompanyPlanningModel.java:363 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/OrderPlanningModel.java:825 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/company/CompanyPlanningModel.java:360 msgid "date in future" msgstr "data no futuro" @@ -6074,14 +6123,14 @@ msgstr "data no futuro" msgid "Format" msgstr "Formato" -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/SaveCommandBuilder.java:887 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/SaveCommandBuilder.java:885 msgid "New project version" msgstr "Nova versión de proxecto" -#: libreplan-webapp/src/main/java/org/libreplan/web/templates/TemplatesTreeController.java:77 +#: libreplan-webapp/src/main/java/org/libreplan/web/templates/TemplatesTreeController.java:79 #: libreplan-webapp/src/main/java/org/libreplan/web/calendars/BaseCalendarCRUDController.java:366 -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderElementTreeController.java:484 -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:1231 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderElementTreeController.java:486 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:1235 #: libreplan-webapp/src/main/java/org/libreplan/web/limitingresources/QueueComponent.java:478 #: libreplan-webapp/src/main/java/org/libreplan/web/common/Util.java:537 #: libreplan-webapp/src/main/webapp/labels/_listLabelTypes.zul:37 @@ -6252,7 +6301,7 @@ msgstr "O valor non é válido, o valor debe ser maior có valor do progreso pre msgid "BCWS" msgstr "BCWS" -#: libreplan-webapp/src/main/java/org/libreplan/web/print/CutyPrint.java:351 +#: libreplan-webapp/src/main/java/org/libreplan/web/print/CutyPrint.java:343 msgid " in the specified directory." msgstr " no directorio especificado." @@ -6305,7 +6354,7 @@ msgstr "Custo de traballo realizado" msgid "Create project from Template" msgstr "Crear proxecto a partir de modelo" -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderElementTreeController.java:418 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderElementTreeController.java:420 msgid "" "Value is not valid.\n" " Code cannot contain chars like '_' \n" @@ -6316,11 +6365,15 @@ msgstr "O valor non é válido.\n O código non pode conter caracteres como '_' msgid "an authorization type must be set" msgstr "Debe seleccionar un tipo de autorización" -#: libreplan-webapp/src/main/java/org/libreplan/web/templates/TemplatesTreeComponent.java:92 +#: libreplan-webapp/src/main/java/org/libreplan/web/templates/TemplatesTreeComponent.java:101 msgid "Must start after (days since beginning project)" msgstr "Debe empezar despois de (días desde o inicio do proxecto)" -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/SaveCommandBuilder.java:886 +#: libreplan-webapp/src/main/webapp/orders/_listOrderElementHours.zul:134 +msgid "Percentage of estimated budget in money / money spent" +msgstr "Porcentaxe de orzamento estimado / diñeiro gastado" + +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/SaveCommandBuilder.java:884 msgid "" "Confirm creating a new project version for this scenario and derived. Are " "you sure?" @@ -6368,7 +6421,7 @@ msgstr "Deseleccionar" msgid "You should select the type of exception" msgstr "Debe seleccionar o tipo de excepción" -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrdersTreeComponent.java:93 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrdersTreeComponent.java:103 #: libreplan-webapp/src/main/webapp/planner/taskpanels/_tabPanelTaskProperties.zul:46 #: libreplan-webapp/src/main/webapp/orders/_projectDetails.zul:63 #: libreplan-webapp/src/main/webapp/orders/_orderElementDetails.zul:52 @@ -6420,7 +6473,7 @@ msgstr "Asignación avanzada" msgid "Number of iterations" msgstr "Número de iteracións" -#: libreplan-webapp/src/main/webapp/templates/templates.zul:60 +#: libreplan-webapp/src/main/webapp/templates/templates.zul:61 msgid "Template Tree" msgstr "Árbore de modelos" @@ -6447,11 +6500,15 @@ msgstr "o esforzo non está ben calculado baseándose no reloxo" msgid "Status" msgstr "Estado" +#: libreplan-webapp/src/main/java/org/libreplan/web/calendars/BaseCalendarEditionController.java:321 +msgid "from {0}" +msgstr "desde {0}" + #: libreplan-webapp/src/main/webapp/settings/settings.zul:111 msgid "Resource load view" msgstr "Vista de carga de recursos" -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/OrderPlanningModel.java:787 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/OrderPlanningModel.java:813 msgid "the date must be inside the visualization area" msgstr "a data debe estar dentro da área de visualización" @@ -6601,8 +6658,8 @@ msgid "Task Scheduling Status In Project" msgstr "Estado de planificación de tarefas en proxecto" #: libreplan-webapp/src/main/java/org/libreplan/web/qualityforms/QualityFormCRUDController.java:162 -#: libreplan-webapp/src/main/java/org/libreplan/web/templates/OrderTemplatesController.java:356 -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:868 +#: libreplan-webapp/src/main/java/org/libreplan/web/templates/OrderTemplatesController.java:376 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:872 #: libreplan-webapp/src/main/java/org/libreplan/web/common/BaseCRUDController.java:313 msgid "Confirm" msgstr "Confirmar" @@ -6654,8 +6711,8 @@ msgstr "Prezo total" #: libreplan-webapp/src/main/java/org/libreplan/web/workreports/WorkReportCRUDController.java:1214 #: libreplan-webapp/src/main/java/org/libreplan/web/workreports/WorkReportCRUDController.java:1226 #: libreplan-webapp/src/main/java/org/libreplan/web/workreports/WorkReportTypeCRUDController.java:346 -#: libreplan-webapp/src/main/java/org/libreplan/web/tree/TreeController.java:984 -#: libreplan-webapp/src/main/java/org/libreplan/web/tree/TreeController.java:990 +#: libreplan-webapp/src/main/java/org/libreplan/web/tree/TreeController.java:1101 +#: libreplan-webapp/src/main/java/org/libreplan/web/tree/TreeController.java:1107 #: libreplan-webapp/src/main/java/org/libreplan/web/costcategories/CostCategoryCRUDController.java:289 #: libreplan-webapp/src/main/java/org/libreplan/web/costcategories/CostCategoryCRUDController.java:457 #: libreplan-webapp/src/main/java/org/libreplan/web/costcategories/ResourcesCostCategoryAssignmentController.java:143 @@ -6674,7 +6731,7 @@ msgstr "Prezo total" #: libreplan-webapp/src/main/java/org/libreplan/web/orders/AssignedTaskQualityFormsToOrderElementController.java:201 #: libreplan-webapp/src/main/java/org/libreplan/web/orders/AssignedTaskQualityFormsToOrderElementController.java:333 #: libreplan-webapp/src/main/java/org/libreplan/web/orders/AssignedTaskQualityFormsToOrderElementController.java:406 -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:1247 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:1251 #: libreplan-webapp/src/main/webapp/labels/_editLabelType.zul:99 #: libreplan-webapp/src/main/webapp/labels/_listLabelTypes.zul:42 #: libreplan-webapp/src/main/webapp/externalcompanies/_listExternalCompanies.zul:49 @@ -6699,10 +6756,8 @@ msgstr "Prezo total" #: libreplan-webapp/src/main/webapp/reports/workingArrangementsPerOrderReport.zul:154 #: libreplan-webapp/src/main/webapp/reports/timeLineMaterialReport.zul:106 #: libreplan-webapp/src/main/webapp/users/_listUsers.zul:46 -#: libreplan-webapp/src/main/webapp/users/_editProfile.zul:68 #: libreplan-webapp/src/main/webapp/users/_listProfiles.zul:40 -#: libreplan-webapp/src/main/webapp/users/_editUser.zul:115 -#: libreplan-webapp/src/main/webapp/users/_editUser.zul:148 +#: libreplan-webapp/src/main/webapp/users/_editUser.zul:137 #: libreplan-webapp/src/main/webapp/templates/_list.zul:53 #: libreplan-webapp/src/main/webapp/templates/_materialAssignmentsBox.zul:55 #: libreplan-webapp/src/main/webapp/resources/worker/_listVirtualWorkers.zul:52 @@ -6802,7 +6857,7 @@ msgid "Stretches" msgstr "Tramos" #: libreplan-business/src/main/java/org/libreplan/business/planner/entities/AssignmentFunction.java:79 -msgid "Interporlation" +msgid "Interpolation" msgstr "Interpolación" #: libreplan-business/src/main/java/org/libreplan/business/planner/entities/AssignmentFunction.java:80 @@ -6866,23 +6921,23 @@ msgstr "En progreso" msgid "Blocked" msgstr "Bloqueado" -#: libreplan-business/src/main/java/org/libreplan/business/planner/entities/PositionConstraintType.java:29 +#: libreplan-business/src/main/java/org/libreplan/business/planner/entities/PositionConstraintType.java:31 msgid "as soon as possible" msgstr "tan pronto como sexa posible" -#: libreplan-business/src/main/java/org/libreplan/business/planner/entities/PositionConstraintType.java:41 +#: libreplan-business/src/main/java/org/libreplan/business/planner/entities/PositionConstraintType.java:38 msgid "start not earlier than" msgstr "empezar non antes de" -#: libreplan-business/src/main/java/org/libreplan/business/planner/entities/PositionConstraintType.java:53 +#: libreplan-business/src/main/java/org/libreplan/business/planner/entities/PositionConstraintType.java:45 msgid "start in fixed date" msgstr "comezar en data fixa" -#: libreplan-business/src/main/java/org/libreplan/business/planner/entities/PositionConstraintType.java:65 +#: libreplan-business/src/main/java/org/libreplan/business/planner/entities/PositionConstraintType.java:57 msgid "as late as possible" msgstr "tan tarde como sexa posible" -#: libreplan-business/src/main/java/org/libreplan/business/planner/entities/PositionConstraintType.java:77 +#: libreplan-business/src/main/java/org/libreplan/business/planner/entities/PositionConstraintType.java:64 msgid "finish not later than" msgstr "acabar non despois de" @@ -6922,7 +6977,7 @@ msgstr "Permiso de edición para todos os proxectos" msgid "Project creation allowed" msgstr "Permiso de creación de proxectos" -#: libreplan-business/src/main/java/org/libreplan/business/templates/entities/OrderLineTemplate.java:122 +#: libreplan-business/src/main/java/org/libreplan/business/templates/entities/OrderLineTemplate.java:132 msgid "Line" msgstr "Liña" @@ -7090,23 +7145,23 @@ msgstr "P" msgid "U" msgstr "S" -#: libreplan-business/src/main/java/org/libreplan/business/orders/entities/OrderElement.java:618 +#: libreplan-business/src/main/java/org/libreplan/business/orders/entities/OrderElement.java:629 msgid "" "Some ancestor has the same label assigned, so this element is already " "inheriting this label" msgstr "Algún ancestro ten a misma etiqueta asignada, polo que este elemento xa está herdando esa etiqueta" -#: libreplan-business/src/main/java/org/libreplan/business/orders/entities/OrderElement.java:717 +#: libreplan-business/src/main/java/org/libreplan/business/orders/entities/OrderElement.java:728 #: libreplan-business/src/main/java/org/libreplan/business/orders/entities/OrderLineGroup.java:963 msgid "Cannot spread two progress in the same task" msgstr "Non poden propagar dous progresos na mesma tarefa" -#: libreplan-business/src/main/java/org/libreplan/business/orders/entities/OrderElement.java:741 -#: libreplan-business/src/main/java/org/libreplan/business/orders/entities/OrderElement.java:767 +#: libreplan-business/src/main/java/org/libreplan/business/orders/entities/OrderElement.java:752 +#: libreplan-business/src/main/java/org/libreplan/business/orders/entities/OrderElement.java:778 msgid "Duplicate Progress Assignment For Task" msgstr "Asignación de progreso duplicada para a tarefa" -#: libreplan-business/src/main/java/org/libreplan/business/orders/entities/OrderElement.java:1094 +#: libreplan-business/src/main/java/org/libreplan/business/orders/entities/OrderElement.java:1105 msgid "Quality form already exists" msgstr "O formulario de calidade xa existe" From 0f2aa3f80e5d4cae2dd1315e1bc6715dca5de319 Mon Sep 17 00:00:00 2001 From: Giuseppe Zizza Date: Wed, 11 Apr 2012 12:44:27 +0200 Subject: [PATCH 003/108] i18n: Update Italian translation --- ganttzk/src/main/resources/i18n/it.po | 56 +- .../src/main/resources/i18n/it.po | 567 ++++++++++-------- 2 files changed, 345 insertions(+), 278 deletions(-) diff --git a/ganttzk/src/main/resources/i18n/it.po b/ganttzk/src/main/resources/i18n/it.po index ef0c84cde..87c269918 100644 --- a/ganttzk/src/main/resources/i18n/it.po +++ b/ganttzk/src/main/resources/i18n/it.po @@ -8,10 +8,10 @@ # Giuseppe Zizza , 2012. msgid "" msgstr "" -"Project-Id-Version: 1.2.1\n" +"Project-Id-Version: libreplan-1.2.3\n" "Report-Msgid-Bugs-To: http://bugs.libreplan.org/\n" -"POT-Creation-Date: 2012-01-13 16:49+0100\n" -"PO-Revision-Date: 2012-01-13 16:09+0000\n" +"POT-Creation-Date: 2012-04-11 08:32+0200\n" +"PO-Revision-Date: 2012-04-11 08:05+0000\n" "Last-Translator: Giuseppe Zizza \n" "Language-Team: Italiano\n" "MIME-Version: 1.0\n" @@ -20,12 +20,12 @@ msgstr "" "Language: it\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" -#: ganttzk/src/main/java/org/zkoss/ganttz/DependencyList.java:215 -#: ganttzk/src/main/java/org/zkoss/ganttz/DependencyList.java:234 +#: ganttzk/src/main/java/org/zkoss/ganttz/DependencyList.java:216 +#: ganttzk/src/main/java/org/zkoss/ganttz/DependencyList.java:235 msgid "Erase" msgstr "Cancella" -#: ganttzk/src/main/java/org/zkoss/ganttz/TaskList.java:300 +#: ganttzk/src/main/java/org/zkoss/ganttz/TaskList.java:299 msgid "Add Dependency" msgstr "Aggiungi dipendenza" @@ -33,11 +33,15 @@ msgstr "Aggiungi dipendenza" msgid "Worker" msgstr "Lavoratore" +#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:682 +msgid "Show money cost bar" +msgstr "Mostra la barra dei costi" + #: ganttzk/src/main/resources/web/ganttz/zul/leftTasksTree.zul:29 msgid "Start" msgstr "Inizio" -#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:635 +#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:661 msgid "Show reported hours" msgstr "Mostra le ore riportate" @@ -62,7 +66,7 @@ msgstr "Risorse limitanti" msgid "The specified dependency is not allowed" msgstr "La dipendenza specifica non è permessa" -#: ganttzk/src/main/java/org/zkoss/ganttz/DependencyList.java:254 +#: ganttzk/src/main/java/org/zkoss/ganttz/DependencyList.java:255 msgid "Set End-End" msgstr "Imposta Fine-Fine" @@ -86,6 +90,10 @@ msgstr "Forza disponbile: {0}, forza assegnata: {1}" msgid "Criterion" msgstr "Criterio" +#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:688 +msgid "Hide money cost bar" +msgstr "Nascondi la barra dei costi" + #: ganttzk/src/main/resources/web/ganttz/zul/plannerLayout.zul:44 msgid "Print" msgstr "Stampa" @@ -114,6 +122,10 @@ msgstr "Fine" msgid "changing zoom" msgstr "Cambio vista" +#: ganttzk/src/main/resources/web/ganttz/zul/plannerLayout.zul:91 +msgid "Show/Hide money cost bar" +msgstr "Mostra/Nascondi la barra dei costi" + #: ganttzk/src/main/java/org/zkoss/ganttz/timetracker/zoom/ZoomLevel.java:45 msgid "Quarter" msgstr "Quarto" @@ -139,7 +151,7 @@ msgstr "Nome" msgid "Name filter" msgstr "Nome filtro" -#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:615 +#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:641 msgid "Show progress" msgstr "Mostra progresso" @@ -151,14 +163,14 @@ msgstr "Espandi/Riduci tutti" msgid "Show/Hide critical path" msgstr "Mostra/Nascondi percorso critico" -#: ganttzk/src/main/java/org/zkoss/ganttz/timetracker/zoom/ZoomLevel.java:32 -msgid "Year" -msgstr "Anno" - #: ganttzk/src/main/java/org/zkoss/ganttz/resourceload/ResourcesLoadPanel.java:150 msgid "showing criteria" msgstr "Mostro i criteri" +#: ganttzk/src/main/java/org/zkoss/ganttz/timetracker/zoom/ZoomLevel.java:32 +msgid "Year" +msgstr "Anno" + #: ganttzk/src/main/java/org/zkoss/ganttz/timetracker/zoom/ZoomLevel.java:58 msgid "Month" msgstr "Mese" @@ -167,15 +179,15 @@ msgstr "Mese" msgid "Show/Hide resources" msgstr "Mostra/Nascondi risorse" -#: ganttzk/src/main/java/org/zkoss/ganttz/DependencyList.java:246 +#: ganttzk/src/main/java/org/zkoss/ganttz/DependencyList.java:247 msgid "Set End-Start" msgstr "Imposta Fine-Inizio" -#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:297 +#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:308 msgid "decreasing zoom" msgstr "Riduco ingrandimento" -#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:596 +#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:622 msgid "Hide critical path" msgstr "Nascondi percorso critico" @@ -183,7 +195,7 @@ msgstr "Nascondi percorso critico" msgid "Day" msgstr "Giorno" -#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:642 +#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:668 msgid "Hide reported hours" msgstr "Nascondi ore riportate" @@ -204,11 +216,11 @@ msgid "Hour" msgstr "Ora" #: ganttzk/src/main/resources/web/ganttz/zul/resourcesLoadLayout.zul:90 -#: ganttzk/src/main/resources/web/ganttz/zul/plannerLayout.zul:114 +#: ganttzk/src/main/resources/web/ganttz/zul/plannerLayout.zul:120 msgid "Graphics" msgstr "Grafici" -#: ganttzk/src/main/java/org/zkoss/ganttz/DependencyList.java:250 +#: ganttzk/src/main/java/org/zkoss/ganttz/DependencyList.java:251 msgid "Set Start-Start" msgstr "Imposta Inizio-Inizio" @@ -216,7 +228,7 @@ msgstr "Imposta Inizio-Inizio" msgid "See resource allocation" msgstr "Mostra allocazione risorse" -#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:280 +#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:291 msgid "increasing zoom" msgstr "Aumento l'ingrandimento" @@ -232,10 +244,10 @@ msgstr "Tutti" msgid "Refresh" msgstr "Aggiorna" -#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:591 +#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:617 msgid "Show critical path" msgstr "Mostra percorso critico" -#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:620 +#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:646 msgid "Hide progress" msgstr "Nascondi progresso" diff --git a/libreplan-webapp/src/main/resources/i18n/it.po b/libreplan-webapp/src/main/resources/i18n/it.po index a79dfe006..e81cc2db8 100644 --- a/libreplan-webapp/src/main/resources/i18n/it.po +++ b/libreplan-webapp/src/main/resources/i18n/it.po @@ -8,10 +8,10 @@ # Giuseppe Zizza , 2012. msgid "" msgstr "" -"Project-Id-Version: 1.2.2\n" +"Project-Id-Version: libreplan-1.2.3\n" "Report-Msgid-Bugs-To: http://bugs.libreplan.org/\n" -"POT-Creation-Date: 2012-02-24 09:08+0100\n" -"PO-Revision-Date: 2012-02-24 18:20+0000\n" +"POT-Creation-Date: 2012-04-11 08:32+0200\n" +"PO-Revision-Date: 2012-04-11 08:04+0000\n" "Last-Translator: Giuseppe Zizza \n" "Language-Team: Italiano\n" "MIME-Version: 1.0\n" @@ -150,7 +150,7 @@ msgstr "Non può essere vuoto" #: libreplan-webapp/src/main/java/org/libreplan/web/common/CustomMenuController.java:324 #: libreplan-webapp/src/main/webapp/materials/materials.zul:33 -#: libreplan-webapp/src/main/webapp/templates/templates.zul:66 +#: libreplan-webapp/src/main/webapp/templates/templates.zul:67 #: libreplan-webapp/src/main/webapp/templates/_editTemplateWindow.zul:52 #: libreplan-webapp/src/main/webapp/templates/_materialAssignmentsBox.zul:22 #: libreplan-webapp/src/main/webapp/orders/_editOrderElement.zul:54 @@ -159,7 +159,7 @@ msgstr "Non può essere vuoto" msgid "Materials" msgstr "Materiali" -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/reassign/ReassignCommand.java:361 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/reassign/ReassignCommand.java:357 msgid "Reassign" msgstr "Riassegna" @@ -200,7 +200,7 @@ msgstr "Predefinito" #: libreplan-webapp/src/main/java/org/libreplan/web/qualityforms/QualityFormCRUDController.java:344 #: libreplan-webapp/src/main/java/org/libreplan/web/common/CustomMenuController.java:325 -#: libreplan-webapp/src/main/webapp/templates/templates.zul:67 +#: libreplan-webapp/src/main/webapp/templates/templates.zul:68 #: libreplan-webapp/src/main/webapp/templates/_editTemplateWindow.zul:53 msgid "Quality Forms" msgstr "Moduli Qualità" @@ -209,11 +209,15 @@ msgstr "Moduli Qualità" msgid "Reports" msgstr "Report" +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/assigntemplates/TemplateFinderPopup.java:117 +msgid "Create task" +msgstr "Crea compito" + #: libreplan-webapp/src/main/webapp/planner/advance_allocation.zul:22 msgid "LibrePlan: Advanced allocation" msgstr "LibrePlan: Allocazione avanzata" -#: libreplan-webapp/src/main/java/org/libreplan/web/common/ConfigurationModel.java:172 +#: libreplan-webapp/src/main/java/org/libreplan/web/common/ConfigurationModel.java:177 msgid "The {0} sequence prefixes can not be repeated" msgstr "I {0} prefissi di sequenza non possono essere ripetuti" @@ -300,7 +304,7 @@ msgid "generic workers allocation" msgstr "allocamento lavoratori generici" #: libreplan-webapp/src/main/java/org/libreplan/web/resourceload/ResourceLoadController.java:310 -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:895 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:899 msgid "The project has no scheduled elements" msgstr "Il progetto non ha nessuna pianificazione" @@ -378,19 +382,19 @@ msgstr "Clicca qui" msgid "Project Name" msgstr "Nome del progetto" -#: libreplan-webapp/src/main/java/org/libreplan/web/tree/TreeController.java:967 +#: libreplan-webapp/src/main/java/org/libreplan/web/tree/TreeController.java:1084 #: libreplan-webapp/src/main/java/org/libreplan/web/resources/criterion/CriterionTreeController.java:306 msgid "Indent" msgstr "Indenta" +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/reassign/ReassignCommand.java:252 +msgid "Reassignation" +msgstr "Riassegnamento" + #: libreplan-webapp/src/main/webapp/common/configuration.zul:327 msgid "Save passwords in database" msgstr "Salva le password nel database" -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/reassign/ReassignCommand.java:256 -msgid "Reassignation" -msgstr "Riassegnamento" - #: libreplan-webapp/src/main/java/org/libreplan/web/templates/TemplatesTree.java:42 msgid "New template" msgstr "Nuovo modello" @@ -459,7 +463,7 @@ msgid "" "applicable to this resource" msgstr "esistono criteri di soddisfazione che si riferiscono a tipi di criterio non applicabili a questa risorsa" -#: libreplan-webapp/src/main/webapp/templates/templates.zul:65 +#: libreplan-webapp/src/main/webapp/templates/templates.zul:66 #: libreplan-webapp/src/main/webapp/orders/_editOrderElement.zul:52 #: libreplan-webapp/src/main/webapp/orders/_edition.zul:50 msgid "Criterion Requirement" @@ -594,7 +598,7 @@ msgstr "Ottobre" msgid "First name" msgstr "Nome" -#: libreplan-webapp/src/main/java/org/libreplan/web/print/CutyPrint.java:256 +#: libreplan-webapp/src/main/java/org/libreplan/web/print/CutyPrint.java:250 msgid "Could not execute print command" msgstr "Impossibile eseguire il comando di stampa" @@ -607,7 +611,7 @@ msgstr "Campi testo complementari" #: libreplan-webapp/src/main/java/org/libreplan/web/workreports/WorkReportCRUDController.java:1226 #: libreplan-webapp/src/main/java/org/libreplan/web/calendars/BaseCalendarCRUDController.java:452 #: libreplan-webapp/src/main/java/org/libreplan/web/orders/AssignedTaskQualityFormsToOrderElementController.java:200 -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:832 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:836 msgid "Confirm deleting {0}. Are you sure?" msgstr "Conferma eliminazione di {0}. Sei sicuro?" @@ -734,7 +738,7 @@ msgstr "Questo progetto è già stato aggiunto" msgid "The task code cannot be null" msgstr "Il codice del compito non può essere nullo" -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderElementTreeController.java:594 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderElementTreeController.java:596 #: libreplan-webapp/src/main/java/org/libreplan/web/common/CustomMenuController.java:329 #: libreplan-webapp/src/main/webapp/planner/taskpanels/_taskInformation.zul:32 #: libreplan-webapp/src/main/webapp/resources/search/allocation_selector.zul:39 @@ -811,7 +815,7 @@ msgstr "Giugno" msgid "{0} annotation required on {1}" msgstr "{0} annotazione richiesta per {1}" -#: libreplan-webapp/src/main/java/org/libreplan/web/tree/TreeController.java:1067 +#: libreplan-webapp/src/main/java/org/libreplan/web/tree/TreeController.java:1193 msgid "Modified" msgstr "Modificato" @@ -876,7 +880,7 @@ msgstr "Il progresso calcolato non può essere modificato" msgid "Work done from starting date" msgstr "Lavoro completato dalla data d'inizio" -#: libreplan-webapp/src/main/webapp/templates/templates.zul:69 +#: libreplan-webapp/src/main/webapp/templates/templates.zul:70 msgid "Statistics log" msgstr "Diario delle statistiche" @@ -885,7 +889,7 @@ msgstr "Diario delle statistiche" msgid "Edit Calendar" msgstr "Modifica calendario" -#: libreplan-webapp/src/main/java/org/libreplan/web/users/ProfileCRUDController.java:112 +#: libreplan-webapp/src/main/java/org/libreplan/web/users/ProfileCRUDController.java:117 msgid "Profile" msgstr "Profilo" @@ -908,7 +912,7 @@ msgstr "Non può essere vuoto o nullo" msgid "{0} \"{1}\" saved" msgstr "{0} \"{1}\" salvato" -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/OrderPlanningController.java:299 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/OrderPlanningController.java:301 msgid "filtering" msgstr "filtro" @@ -965,6 +969,12 @@ msgstr "Questo Criterio è già stato aggiunto." msgid "add" msgstr "aggiungi" +#: libreplan-webapp/src/main/java/org/libreplan/web/tree/TreeController.java:860 +#: libreplan-webapp/src/main/webapp/templates/templates.zul:111 +#: libreplan-webapp/src/main/webapp/orders/_orderElementDetails.zul:69 +msgid "Budget value cannot be negative" +msgstr "Il budget non può essere negativo" + #: libreplan-webapp/src/main/java/org/libreplan/web/orders/TreeElementOperationsController.java:239 msgid "Unsaved changes will be lost. Would you like to continue?" msgstr "Le modifiche non salvate saranno perse. Vuoi continuare?" @@ -1042,8 +1052,8 @@ msgstr "Aggiungi ruolo" msgid "Exception end date should be greater or equals than start date" msgstr "La data finale dell'eccezione dev'essere successiva o uguale a quella d'inizio" -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/SaveCommandBuilder.java:476 -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/SaveCommandBuilder.java:486 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/SaveCommandBuilder.java:474 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/SaveCommandBuilder.java:484 msgid "Repeated Project code {0} in Project {1}" msgstr "Codice di progetto {0} ripetuto nel progetto {1}" @@ -1073,7 +1083,7 @@ msgstr "Data d'inizio precedente" msgid "Type data" msgstr "Tipo di dati" -#: libreplan-webapp/src/main/java/org/libreplan/web/users/ProfileCRUDController.java:117 +#: libreplan-webapp/src/main/java/org/libreplan/web/users/ProfileCRUDController.java:122 #: libreplan-webapp/src/main/java/org/libreplan/web/common/CustomMenuController.java:322 msgid "Profiles" msgstr "Profili" @@ -1219,13 +1229,13 @@ msgstr "Lista profili" msgid "both {0} of category {1} and {2} of category {3} have the same code" msgstr "entrambi {0} della categoria {1} e {2} della categoria {3} hanno lo stesso codice" -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/TaskElementAdapter.java:958 -#: libreplan-webapp/src/main/java/org/libreplan/web/templates/TemplatesTreeController.java:236 -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderModel.java:690 -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderElementTreeController.java:581 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/TaskElementAdapter.java:1039 +#: libreplan-webapp/src/main/java/org/libreplan/web/templates/TemplatesTreeController.java:240 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderModel.java:696 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderElementTreeController.java:583 #: libreplan-webapp/src/main/java/org/libreplan/web/common/CustomMenuController.java:331 #: libreplan-webapp/src/main/webapp/planner/taskpanels/_tabPanelSubcontract.zul:68 -#: libreplan-webapp/src/main/webapp/templates/templates.zul:64 +#: libreplan-webapp/src/main/webapp/templates/templates.zul:65 #: libreplan-webapp/src/main/webapp/templates/_editTemplateWindow.zul:50 #: libreplan-webapp/src/main/webapp/orders/_editOrderElement.zul:50 msgid "Labels" @@ -1235,7 +1245,7 @@ msgstr "Etichette" msgid "Data Types" msgstr "Tipi di dato" -#: libreplan-webapp/src/main/webapp/orders/_edition.zul:157 +#: libreplan-webapp/src/main/webapp/orders/_edition.zul:161 #: libreplan-webapp/src/main/webapp/orders/_listOrderElementHours.zul:68 msgid "Total hours" msgstr "Ore totali" @@ -1252,8 +1262,8 @@ msgstr "Riassegno {0} progetti" msgid "Filter by task status" msgstr "Filtra rispetto allo stato del compito" -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/OrderPlanningModel.java:528 -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/company/CompanyPlanningModel.java:419 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/OrderPlanningModel.java:529 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/company/CompanyPlanningModel.java:416 msgid "Select date" msgstr "Seleziona data" @@ -1270,19 +1280,23 @@ msgstr "Perfavore ritenta." msgid "Company code" msgstr "Codice azienda" +#: libreplan-webapp/src/main/webapp/orders/_listOrderElementHours.zul:62 +msgid "Sum of imputed hours in children tasks" +msgstr "Somma delle ore imputate ai compiti derivati" + #: libreplan-webapp/src/main/java/org/libreplan/web/common/components/TwoWaySelector.java:110 msgid "Unknown attribute '{0}' in class {1}" msgstr "Attributo '{0}' sconosciuto nella classe {1}" +#: libreplan-webapp/src/main/java/org/libreplan/web/users/settings/PasswordController.java:96 +msgid "passwords can not be empty" +msgstr "le password non possono essere vuote" + #: libreplan-webapp/src/main/java/org/libreplan/web/resources/worker/WorkerCRUDController.java:699 #: libreplan-business/src/main/java/org/libreplan/business/resources/entities/ResourceType.java:33 msgid "NON LIMITING RESOURCE" msgstr "RISORSA NON LIMITANTE" -#: libreplan-webapp/src/main/java/org/libreplan/web/users/settings/PasswordController.java:96 -msgid "passwords can not be empty" -msgstr "le password non possono essere vuote" - #: libreplan-webapp/src/main/java/org/libreplan/web/orders/labels/AssignedLabelsController.java:88 #: libreplan-webapp/src/main/java/org/libreplan/web/orders/labels/AssignedLabelsController.java:128 #: libreplan-webapp/src/main/java/org/libreplan/web/orders/AssignedTaskQualityFormsToOrderElementController.java:176 @@ -1431,11 +1445,15 @@ msgstr "Lista d'estensioni" msgid "Enable scenarios module" msgstr "Abilita modulo degli scenari" +#: libreplan-webapp/src/main/java/org/libreplan/web/calendars/BaseCalendarEditionController.java:312 +msgid "to {0}" +msgstr "a {0}" + #: libreplan-webapp/src/main/webapp/limitingresources/limitingResourcesLayout.zul:59 msgid "Zoom" msgstr "Ingrandimdento" -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/SaveCommandBuilder.java:865 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/SaveCommandBuilder.java:863 #: libreplan-webapp/src/main/webapp/labels/_editLabelType.zul:112 #: libreplan-webapp/src/main/webapp/advance/advanceTypes.zul:37 #: libreplan-webapp/src/main/webapp/excetiondays/_editExceptionDayType.zul:91 @@ -1451,9 +1469,9 @@ msgstr "Ingrandimdento" #: libreplan-webapp/src/main/webapp/qualityforms/_editQualityForm.zul:131 #: libreplan-webapp/src/main/webapp/settings/changePassword.zul:81 #: libreplan-webapp/src/main/webapp/settings/settings.zul:124 -#: libreplan-webapp/src/main/webapp/users/_editProfile.zul:81 -#: libreplan-webapp/src/main/webapp/users/_editUser.zul:162 -#: libreplan-webapp/src/main/webapp/templates/templates.zul:135 +#: libreplan-webapp/src/main/webapp/users/_editProfile.zul:70 +#: libreplan-webapp/src/main/webapp/users/_editUser.zul:151 +#: libreplan-webapp/src/main/webapp/templates/templates.zul:143 #: libreplan-webapp/src/main/webapp/calendars/calendars.zul:44 #: libreplan-webapp/src/main/webapp/resources/worker/virtualWorkers.zul:40 #: libreplan-webapp/src/main/webapp/resources/worker/worker.zul:41 @@ -1512,7 +1530,7 @@ msgstr "Problemi con la connessione ai servizi web del subappaltatore" msgid "Entity type" msgstr "Tipo d'entità" -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/OrderPlanningModel.java:1101 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/OrderPlanningModel.java:1127 #: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:268 msgid "Unsaved changes will be lost. Are you sure?" msgstr "Le modifiche non salvate verranno perse. Sei sicuro?" @@ -1553,13 +1571,13 @@ msgstr "Risorse giornaliere" msgid "ResourceType must be not-null" msgstr "ResourceType non può essere nullo" -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrdersTreeComponent.java:95 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrdersTreeComponent.java:105 msgid "" "Estimated end date for the task (press enter in textbox to open calendar " "popup or type in date directly)" msgstr "Data stimata di fine del compito (premi enter nel campo di testo per aprire un pop-up col calendario o inserisci direttamente una data)" -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderElementTreeController.java:292 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderElementTreeController.java:293 msgid "Expand/Collapse all" msgstr "Espandi/Riduci tutto" @@ -1567,11 +1585,11 @@ msgstr "Espandi/Riduci tutto" msgid "Overload due to current project" msgstr "Sovraccarico dovuto al progetto corrente" -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/TaskElementAdapter.java:946 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/TaskElementAdapter.java:1017 msgid "Name: {0}" msgstr "Nome: {0}" -#: libreplan-webapp/src/main/java/org/libreplan/web/tree/TreeController.java:903 +#: libreplan-webapp/src/main/java/org/libreplan/web/tree/TreeController.java:1020 msgid "Move down" msgstr "Muovi giù" @@ -1618,7 +1636,7 @@ msgstr "Assegna" msgid "missing code in a criterion" msgstr "codice mancante in un criterio" -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:1278 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:1282 msgid "Create Template" msgstr "Crea Modello" @@ -1635,7 +1653,7 @@ msgstr "Ricerca avanzata" msgid "Filter by labels" msgstr "Filtra per etichetta" -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/taskedition/TaskPropertiesController.java:577 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/taskedition/TaskPropertiesController.java:586 msgid "" "IMPORTANT: Don't forget to communicate to subcontractor that his contract " "has been cancelled" @@ -1666,10 +1684,10 @@ msgstr "Codice di stato" #: libreplan-webapp/src/main/java/org/libreplan/web/costcategories/TypeOfWorkHoursCRUDController.java:103 #: libreplan-webapp/src/main/java/org/libreplan/web/qualityforms/QualityFormCRUDController.java:391 #: libreplan-webapp/src/main/java/org/libreplan/web/planner/taskedition/AdvancedAllocationTaskController.java:73 -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/taskedition/TaskPropertiesController.java:509 -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/taskedition/TaskPropertiesController.java:547 -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/taskedition/TaskPropertiesController.java:578 -#: libreplan-webapp/src/main/java/org/libreplan/web/users/ProfileCRUDController.java:148 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/taskedition/TaskPropertiesController.java:518 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/taskedition/TaskPropertiesController.java:556 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/taskedition/TaskPropertiesController.java:587 +#: libreplan-webapp/src/main/java/org/libreplan/web/users/ProfileCRUDController.java:153 #: libreplan-webapp/src/main/java/org/libreplan/web/calendars/BaseCalendarCRUDController.java:476 msgid "Warning" msgstr "Avvertimento" @@ -1786,8 +1804,8 @@ msgstr "il nome non dev'essere nullo o vuoto" msgid "Add From Template" msgstr "Aggiungi da modello" -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/taskedition/TaskPropertiesController.java:508 -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/taskedition/TaskPropertiesController.java:546 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/taskedition/TaskPropertiesController.java:517 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/taskedition/TaskPropertiesController.java:555 msgid "Assigned resources for this task will be deleted. Are you sure?" msgstr "Le risorse assegnate a questo compito verranno eliminate. Sei sicuro?" @@ -1822,7 +1840,7 @@ msgstr "Luglio" msgid "Enable LDAP authentication" msgstr "Abilita autenticazione LDAP" -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/consolidations/AdvanceConsolidationModel.java:493 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/consolidations/AdvanceConsolidationModel.java:490 msgid "( max: {0} )" msgstr "( max: {0} )" @@ -1843,7 +1861,7 @@ msgid "Cannot calculate charts for current data" msgstr "Impossibile calcolare il grafico per la data corrente" #: libreplan-webapp/src/main/java/org/libreplan/web/orders/ProjectDetailsController.java:176 -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:1495 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:1499 msgid "project name already being used" msgstr "nome di progetto già utilizzato" @@ -1860,7 +1878,7 @@ msgstr "Dividi assegnamenti" msgid "You can not remove the default scenario called \"{0}\"" msgstr "Non puoi eliminare lo scenario di riferimento chiamato \"{0}\"" -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/consolidations/AdvanceConsolidationModel.java:522 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/consolidations/AdvanceConsolidationModel.java:519 msgid "There are not any assigned progress to current task" msgstr "Non ci sono progressi assegnati a questo compito" @@ -1889,7 +1907,7 @@ msgstr "Giù" msgid "Label" msgstr "Etichetta" -#: libreplan-webapp/src/main/java/org/libreplan/web/tree/TreeController.java:870 +#: libreplan-webapp/src/main/java/org/libreplan/web/tree/TreeController.java:987 msgid "Value is not valid, taking into account the current list of HoursGroup" msgstr "Il valore non è valido, prendendo in considerazione la lista corrente di OreDiGruppo" @@ -1906,8 +1924,8 @@ msgstr "tipo d'ore di lavoro mancante in una linea del report di lavoro" msgid "Quality forms" msgstr "Moduli di qualità" -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/SaveCommandBuilder.java:499 -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/SaveCommandBuilder.java:509 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/SaveCommandBuilder.java:497 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/SaveCommandBuilder.java:507 msgid "Repeated Hours Group code {0} in Project {1}" msgstr "Codice di Ore di Gruppo {0} ripetuto nel Progetto {1}" @@ -1919,7 +1937,7 @@ msgstr "Ore di gruppo" msgid "LibrePlan: Accounts" msgstr "LibrePlan: Accounts" -#: libreplan-webapp/src/main/webapp/templates/templates.zul:96 +#: libreplan-webapp/src/main/webapp/templates/templates.zul:97 #: libreplan-webapp/src/main/webapp/templates/_list.zul:30 msgid "Days from Beginning to Deadline" msgstr "Giorni dall'inizio del termine massimo" @@ -1952,7 +1970,7 @@ msgstr "Op." msgid "Pessimistic" msgstr "Pessimistico" -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/taskedition/TaskPropertiesController.java:376 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/taskedition/TaskPropertiesController.java:385 msgid "Limiting resource assignation" msgstr "Limita assegnazione risorse" @@ -1983,7 +2001,7 @@ msgstr "Il nome del tipo d'unità non può essere vuoto" msgid "Entity sequences" msgstr "Sequenze d'entità" -#: libreplan-webapp/src/main/webapp/templates/templates.zul:91 +#: libreplan-webapp/src/main/webapp/templates/templates.zul:92 #: libreplan-webapp/src/main/webapp/templates/_list.zul:28 msgid "Delay from beginning (days)" msgstr "Ritardo dall'inizio (giorni)" @@ -2013,7 +2031,7 @@ msgstr "Conferma annullamento" msgid "Work And Progress Per Task" msgstr "Lavoro e progresso per compito" -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:1519 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:1523 msgid "project code already being used" msgstr "codice di progetto già utilizzato" @@ -2032,8 +2050,8 @@ msgstr "Sequenza d'eliminazione" #: libreplan-webapp/src/main/java/org/libreplan/web/calendars/BaseCalendarCRUDController.java:457 #: libreplan-webapp/src/main/java/org/libreplan/web/orders/AssignedTaskQualityFormsToOrderElementController.java:208 #: libreplan-webapp/src/main/java/org/libreplan/web/orders/criterionrequirements/AssignedCriterionRequirementController.java:264 -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:840 -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:875 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:844 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:879 msgid "Error on showing removing element: " msgstr "Errore nel mostrare elemento in rimozione:" @@ -2094,7 +2112,7 @@ msgid "Overload" msgstr "Sovraccarico" #: libreplan-webapp/src/main/webapp/templates/_historicalAssignment.zul:30 -#: libreplan-webapp/src/main/webapp/templates/templates.zul:68 +#: libreplan-webapp/src/main/webapp/templates/templates.zul:69 msgid "Assignment log" msgstr "Diario d'assegnamento" @@ -2103,10 +2121,6 @@ msgstr "Diario d'assegnamento" msgid "Work Report Models" msgstr "Modelli dei report di lavoro" -#: libreplan-webapp/src/main/java/org/libreplan/web/print/CutyCaptTimeout.java:45 -msgid "CutycaptTimeout thread exception" -msgstr "CutycaptTimeout thread exception" - #: libreplan-webapp/src/main/webapp/materials/materials.zul:73 msgid "New" msgstr "Nuovo" @@ -2115,7 +2129,7 @@ msgstr "Nuovo" msgid "Date last progress measurement" msgstr "Data di misurazione dell'ultimo progresso" -#: libreplan-webapp/src/main/java/org/libreplan/web/templates/TemplatesTreeComponent.java:103 +#: libreplan-webapp/src/main/java/org/libreplan/web/templates/TemplatesTreeComponent.java:112 msgid "Deadline (days since beggining project)" msgstr "Scadenza (giorni dall'inizio del progetto)" @@ -2145,14 +2159,14 @@ msgstr "questo nome del tipo di criterio è già stato utilizzato" msgid "Task code cannot be null" msgstr "Il codice del compito non può essere nullo" -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/consolidations/AdvanceConsolidationModel.java:520 +#: libreplan-webapp/src/main/java/org/libreplan/web/calendars/BaseCalendarEditionController.java:302 +msgid "Derived of calendar {0}" +msgstr "Derivato dal calendario {0}" + +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/consolidations/AdvanceConsolidationModel.java:517 msgid "It is not allowed to consolidate progress." msgstr "Non è permesso consolidare i progressi." -#: libreplan-webapp/src/main/webapp/orders/components/_orderElementTree.zul:32 -msgid "Create Task" -msgstr "Crea compito" - #: libreplan-webapp/src/main/webapp/planner/taskpanels/_tabPanelSubcontract.zul:27 msgid "External company" msgstr "Azienda esterna" @@ -2161,10 +2175,10 @@ msgstr "Azienda esterna" #: libreplan-webapp/src/main/webapp/costcategories/_listTypesOfWorkHours.zul:30 #: libreplan-webapp/src/main/webapp/costcategories/_listCostCategories.zul:28 #: libreplan-webapp/src/main/webapp/users/_listUsers.zul:30 -#: libreplan-webapp/src/main/webapp/users/_editProfile.zul:60 +#: libreplan-webapp/src/main/webapp/users/_editProfile.zul:61 #: libreplan-webapp/src/main/webapp/users/_listProfiles.zul:27 -#: libreplan-webapp/src/main/webapp/users/_editUser.zul:107 -#: libreplan-webapp/src/main/webapp/users/_editUser.zul:140 +#: libreplan-webapp/src/main/webapp/users/_editUser.zul:108 +#: libreplan-webapp/src/main/webapp/users/_editUser.zul:129 #: libreplan-webapp/src/main/webapp/orders/_listOrderElementAuthorizations.zul:44 #: libreplan-webapp/src/main/webapp/orders/_listOrderElementAuthorizations.zul:68 msgid "Actions" @@ -2237,11 +2251,15 @@ msgstr "Il valore non è valido.\nIl codice non può contenere caratteri come '_ msgid "Hours Group" msgstr "Ore di gruppo" +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/TaskElementAdapter.java:1029 +msgid "Budget: {0}€, Consumed: {1}€ ({2}%)" +msgstr "Budget: {0}€, Utilizzato: {1}€ ({2}%)" + #: libreplan-webapp/src/main/java/org/libreplan/web/workreports/WorkReportTypeCRUDController.java:825 msgid "Unallocated name" msgstr "Nome non allocato" -#: libreplan-webapp/src/main/java/org/libreplan/web/tree/TreeController.java:924 +#: libreplan-webapp/src/main/java/org/libreplan/web/tree/TreeController.java:1041 msgid "Move up" msgstr "Muovi su" @@ -2255,7 +2273,7 @@ msgstr "Data di comunicazione del subappalto" #: libreplan-webapp/src/main/java/org/libreplan/web/planner/tabs/MultipleTabsPlannerController.java:131 #: libreplan-webapp/src/main/java/org/libreplan/web/planner/tabs/MultipleTabsPlannerController.java:134 -#: libreplan-webapp/src/main/java/org/libreplan/web/templates/OrderTemplatesController.java:281 +#: libreplan-webapp/src/main/java/org/libreplan/web/templates/OrderTemplatesController.java:301 #: libreplan-webapp/src/main/java/org/libreplan/web/common/CustomMenuController.java:269 #: libreplan-webapp/src/main/java/org/libreplan/web/common/CustomMenuController.java:367 msgid "Scheduling" @@ -2291,17 +2309,17 @@ msgstr "Pagina su" msgid "Create new project" msgstr "Crea nuovo progetto" -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/TaskElementAdapter.java:954 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/TaskElementAdapter.java:1026 #: libreplan-webapp/src/main/java/org/libreplan/web/common/components/finders/TaskGroupFilterEnum.java:31 #: libreplan-webapp/src/main/java/org/libreplan/web/common/components/finders/OrderFilterEnum.java:31 #: libreplan-webapp/src/main/webapp/subcontract/subcontractedTasks.zul:53 #: libreplan-webapp/src/main/webapp/subcontract/reportAdvances.zul:50 -#: libreplan-webapp/src/main/webapp/orders/_edition.zul:161 +#: libreplan-webapp/src/main/webapp/orders/_edition.zul:165 #: libreplan-webapp/src/main/webapp/orders/_list.zul:35 msgid "State" msgstr "Stato" -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrdersTreeComponent.java:80 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrdersTreeComponent.java:90 msgid "Must start after" msgstr "Deve iniziare dopo" @@ -2309,7 +2327,7 @@ msgstr "Deve iniziare dopo" msgid "Confirm change" msgstr "Conferma modifica" -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:845 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:849 msgid "You don't have permissions to edit this project" msgstr "Non hai i permessi per modificare questo progetto" @@ -2348,7 +2366,7 @@ msgstr "LibrePlan: Materiali" msgid "New task" msgstr "Nuovo compito" -#: libreplan-webapp/src/main/java/org/libreplan/web/users/UserCRUDController.java:191 +#: libreplan-webapp/src/main/java/org/libreplan/web/users/UserCRUDController.java:197 msgid "The password for a new user cannot be empty" msgstr "La password per un nuovo utente non può essere vuota" @@ -2400,7 +2418,7 @@ msgstr "Dettagli personali" msgid "Workers List" msgstr "Lista lavoratori" -#: libreplan-webapp/src/main/java/org/libreplan/web/templates/OrderTemplatesController.java:355 +#: libreplan-webapp/src/main/java/org/libreplan/web/templates/OrderTemplatesController.java:375 msgid "Delete project template. Are you sure?" msgstr "Elimina modello di progetto. Sei sicuro?" @@ -2481,18 +2499,18 @@ msgstr "Altri progetti" msgid "Tasks input buffer" msgstr "Buffer in ingresso per i compiti" -#: libreplan-webapp/src/main/java/org/libreplan/web/common/ConfigurationModel.java:168 +#: libreplan-webapp/src/main/java/org/libreplan/web/common/ConfigurationModel.java:173 msgid "At least one {0} sequence must be active" msgstr "Almeno una sequenza {0} dev'essere attiva" #: libreplan-webapp/src/main/webapp/users/_listProfiles.zul:26 -#: libreplan-webapp/src/main/webapp/users/_editUser.zul:139 +#: libreplan-webapp/src/main/webapp/users/_editUser.zul:128 #: libreplan-webapp/src/main/webapp/orders/_listOrderElementAuthorizations.zul:42 #: libreplan-webapp/src/main/webapp/orders/_listOrderElementAuthorizations.zul:66 msgid "Profile name" msgstr "Nome profilo" -#: libreplan-webapp/src/main/java/org/libreplan/web/print/CutyPrint.java:252 +#: libreplan-webapp/src/main/java/org/libreplan/web/print/CutyPrint.java:246 msgid "Could open generated PDF" msgstr "Si piò aprire il PDF generato" @@ -2504,7 +2522,7 @@ msgstr "Disabilita eliminazione" msgid "You should select a source scenario" msgstr "Dovresti selezionare uno scenario d'origine" -#: libreplan-webapp/src/main/java/org/libreplan/web/common/ConfigurationModel.java:163 +#: libreplan-webapp/src/main/java/org/libreplan/web/common/ConfigurationModel.java:168 msgid "At least one {0} sequence is needed" msgstr "Almeno una sequenza {0} è necessaria" @@ -2539,18 +2557,18 @@ msgid "" "to generate usage statistics" msgstr "Spunta questa opzione per inviare informazioni agli sviluppatori di LibrePlan in modo da poter generare delle statistiche d'utilizzo" -#: libreplan-webapp/src/main/webapp/resources/search/_resourceFilter.zul:36 -msgid "More options" -msgstr "Più opzioni" +#: libreplan-webapp/src/main/java/org/libreplan/web/subcontract/ReportAdvancesModel.java:219 +#: libreplan-webapp/src/main/java/org/libreplan/web/subcontract/SubcontractedTasksModel.java:179 +msgid "Error: {0}" +msgstr "Errore: {0}" #: libreplan-webapp/src/main/webapp/subcontract/subcontractedTasks.zul:45 msgid "Communication" msgstr "Comunicazioni" -#: libreplan-webapp/src/main/java/org/libreplan/web/subcontract/ReportAdvancesModel.java:219 -#: libreplan-webapp/src/main/java/org/libreplan/web/subcontract/SubcontractedTasksModel.java:179 -msgid "Error: {0}" -msgstr "Errore: {0}" +#: libreplan-webapp/src/main/webapp/resources/search/_resourceFilter.zul:36 +msgid "More options" +msgstr "Più opzioni" #: libreplan-webapp/src/main/java/org/libreplan/web/orders/TreeElementOperationsController.java:240 msgid "Confirm create template" @@ -2582,7 +2600,7 @@ msgstr "LibrePlan: Lavoro e progresso per compito" msgid "Projects" msgstr "Progetti" -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/OrderPlanningModel.java:1102 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/OrderPlanningModel.java:1128 #: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:269 msgid "Confirm exit dialog" msgstr "Finestra di conferma uscita" @@ -2660,7 +2678,7 @@ msgstr "Registro di lavoro" msgid "Output format" msgstr "Formato d'uscita" -#: libreplan-webapp/src/main/webapp/planner/print_configuration.zul:47 +#: libreplan-webapp/src/main/webapp/planner/print_configuration.zul:49 msgid "Print" msgstr "Stampa" @@ -2680,8 +2698,8 @@ msgstr "il tipo di risorsa non permette criteri abilitati" msgid "Effort cannot be null" msgstr "Lo sforzo non può essere nullo" -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/OrderPlanningModel.java:1093 -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/assigntemplates/TemplateFinderPopup.java:52 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/OrderPlanningModel.java:1119 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/assigntemplates/TemplateFinderPopup.java:126 #: libreplan-webapp/src/main/webapp/labels/_editLabelType.zul:116 #: libreplan-webapp/src/main/webapp/excetiondays/_editExceptionDayType.zul:97 #: libreplan-webapp/src/main/webapp/externalcompanies/_editExternalCompany.zul:106 @@ -2693,16 +2711,16 @@ msgstr "Lo sforzo non può essere nullo" #: libreplan-webapp/src/main/webapp/costcategories/_editCostCategory.zul:98 #: libreplan-webapp/src/main/webapp/costcategories/_editTypeOfWorkHours.zul:80 #: libreplan-webapp/src/main/webapp/qualityforms/_editQualityForm.zul:137 -#: libreplan-webapp/src/main/webapp/planner/print_configuration.zul:48 +#: libreplan-webapp/src/main/webapp/planner/print_configuration.zul:50 #: libreplan-webapp/src/main/webapp/planner/editTask.zul:81 #: libreplan-webapp/src/main/webapp/planner/reassign.zul:50 #: libreplan-webapp/src/main/webapp/planner/stretches_function.zul:91 #: libreplan-webapp/src/main/webapp/planner/advance_allocation.zul:42 #: libreplan-webapp/src/main/webapp/planner/order.zul:131 #: libreplan-webapp/src/main/webapp/planner/order.zul:166 -#: libreplan-webapp/src/main/webapp/users/_editProfile.zul:85 -#: libreplan-webapp/src/main/webapp/users/_editUser.zul:166 -#: libreplan-webapp/src/main/webapp/templates/templates.zul:139 +#: libreplan-webapp/src/main/webapp/users/_editProfile.zul:74 +#: libreplan-webapp/src/main/webapp/users/_editUser.zul:155 +#: libreplan-webapp/src/main/webapp/templates/templates.zul:147 #: libreplan-webapp/src/main/webapp/calendars/_createNewVersion.zul:58 #: libreplan-webapp/src/main/webapp/calendars/calendars.zul:47 #: libreplan-webapp/src/main/webapp/resources/machine/_editMachine.zul:103 @@ -2738,8 +2756,8 @@ msgid "Machines List" msgstr "Lista macchine" #: libreplan-webapp/src/main/java/org/libreplan/web/resourceload/ResourceLoadController.java:320 -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:692 -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:904 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:696 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:908 msgid "You don't have read access to this project" msgstr "Non hai i permessi di lettura per questo progetto" @@ -2815,7 +2833,7 @@ msgstr "{0} (max: {1})" msgid "Cost Category" msgstr "Categoria di costo" -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderElementTreeController.java:471 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderElementTreeController.java:473 msgid "end" msgstr "fine" @@ -2836,7 +2854,7 @@ msgstr "Autorizzazioni" msgid "Continue" msgstr "Continua" -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderElementController.java:121 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderElementController.java:122 msgid "Edit task {0}" msgstr "Modifica compito {0}" @@ -2869,7 +2887,7 @@ msgstr "Valore massimo di default" msgid "Add criterion requirement" msgstr "Aggiungi requisito di criterio" -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:860 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:864 msgid "" "You can not remove the project \"{0}\" because of any of its tasks are " "already in use in some work reports and the project just exists in the " @@ -2909,7 +2927,7 @@ msgstr "LibrePlan: Cambia password" msgid "please, select a label" msgstr "seleziona un'etichetta" -#: libreplan-webapp/src/main/webapp/users/_editUser.zul:134 +#: libreplan-webapp/src/main/webapp/users/_editUser.zul:123 msgid "Add profile" msgstr "Aggiungi profilo" @@ -2988,8 +3006,8 @@ msgstr "il nome non dev'essere vuoto" msgid "Disabled" msgstr "Disabilitato" -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/OrderPlanningModel.java:738 -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/company/CompanyPlanningModel.java:325 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/OrderPlanningModel.java:764 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/company/CompanyPlanningModel.java:322 msgid "Earned value" msgstr "Valore guadagnato" @@ -3018,8 +3036,8 @@ msgid "" "Please save your project before proceeding." msgstr "I modelli possono essere creati solo da compiti esistenti. Stai tentnado di creare un modella da un nuovo compito.\nPer favore salva il progetto prima di procedere." -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/TaskElementAdapter.java:1163 -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/TaskElementAdapter.java:1178 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/TaskElementAdapter.java:1243 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/TaskElementAdapter.java:1258 msgid "{0} not supported yet" msgstr "{0} non ancora supportato" @@ -3041,7 +3059,7 @@ msgstr "Nuova voce" msgid "Resources Load" msgstr "Carica risorse" -#: libreplan-webapp/src/main/java/org/libreplan/web/common/ConfigurationModel.java:220 +#: libreplan-webapp/src/main/java/org/libreplan/web/common/ConfigurationModel.java:225 msgid "Some sequences to remove not existed" msgstr "Alcune sequenze da rimuovere non esistono" @@ -3116,11 +3134,11 @@ msgid "Select start date" msgstr "Seleziona la data d'inizio" #: libreplan-webapp/src/main/java/org/libreplan/web/costcategories/TypeOfWorkHoursCRUDController.java:106 -#: libreplan-webapp/src/main/java/org/libreplan/web/users/ProfileCRUDController.java:152 +#: libreplan-webapp/src/main/java/org/libreplan/web/users/ProfileCRUDController.java:157 msgid "Error on showing warning message removing typeOfWorkHours: " msgstr "Errore nel mostrare il messaggio d'avvertimento rimuovendo typeOfWorkHours:" -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:882 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:886 msgid "Removed {0}" msgstr "Rimosso {0}" @@ -3132,8 +3150,8 @@ msgstr "Conferma eliminazione lavoratore. Sei sicuro?" msgid "Group name" msgstr "Nome del gruppo" -#: libreplan-webapp/src/main/webapp/users/_editProfile.zul:59 -#: libreplan-webapp/src/main/webapp/users/_editUser.zul:106 +#: libreplan-webapp/src/main/webapp/users/_editProfile.zul:60 +#: libreplan-webapp/src/main/webapp/users/_editUser.zul:107 msgid "Role name" msgstr "Nome del ruolo" @@ -3149,8 +3167,8 @@ msgstr "Crea report di lavoro" msgid "Value is not valid, the precision value must not be empty" msgstr "Il valore non è valido, li valore di precisione non dev'essere vuoto" -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/OrderPlanningModel.java:863 -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/company/CompanyPlanningModel.java:473 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/OrderPlanningModel.java:889 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/company/CompanyPlanningModel.java:470 msgid "h" msgstr "h" @@ -3175,7 +3193,7 @@ msgstr "Aggiungi tappa" msgid "Assign selected items" msgstr "Assegna gli oggetti selezionati" -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderElementTreeController.java:450 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderElementTreeController.java:452 msgid "init" msgstr "inizializza" @@ -3252,6 +3270,10 @@ msgstr "Clienti" msgid "Hours type" msgstr "Tipo d'ore" +#: libreplan-webapp/src/main/webapp/planner/print_configuration.zul:43 +msgid "Show money cost bar" +msgstr "Mostra barra dei costi" + #: libreplan-webapp/src/main/java/org/libreplan/ws/resources/impl/ResourceConverter.java:156 #: libreplan-business/src/main/java/org/libreplan/business/resources/entities/CriterionType.java:211 msgid "criterion type name not specified" @@ -3265,11 +3287,11 @@ msgstr "Non posso connettermi al server LDAP" msgid "Add Exception" msgstr "Aggiungi eccezione" -#: libreplan-webapp/src/main/java/org/libreplan/web/tree/TreeController.java:220 +#: libreplan-webapp/src/main/java/org/libreplan/web/tree/TreeController.java:222 #: libreplan-webapp/src/main/java/org/libreplan/web/qualityforms/QualityFormCRUDController.java:202 #: libreplan-webapp/src/main/java/org/libreplan/web/qualityforms/QualityFormCRUDController.java:223 #: libreplan-webapp/src/main/java/org/libreplan/web/qualityforms/QualityFormCRUDController.java:247 -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderElementTreeController.java:378 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderElementTreeController.java:379 msgid "cannot be empty" msgstr "non può essere vuoto" @@ -3393,7 +3415,7 @@ msgstr "Opzioni d'esportazione" #: libreplan-webapp/src/main/webapp/reports/workingArrangementsPerOrderReport.zul:145 #: libreplan-webapp/src/main/webapp/reports/timeLineMaterialReport.zul:94 #: libreplan-webapp/src/main/webapp/users/_editProfile.zul:40 -#: libreplan-webapp/src/main/webapp/templates/templates.zul:80 +#: libreplan-webapp/src/main/webapp/templates/templates.zul:81 #: libreplan-webapp/src/main/webapp/templates/_list.zul:27 #: libreplan-webapp/src/main/webapp/templates/_assignedQualityForms.zul:48 #: libreplan-webapp/src/main/webapp/subcontract/reportAdvances.zul:45 @@ -3462,7 +3484,7 @@ msgstr "Ore lavorate per risorsa" msgid "The end date cannot be before the init date" msgstr "La data di fine non può essere precedente quella d'inizio" -#: libreplan-webapp/src/main/webapp/users/_editUser.zul:128 +#: libreplan-webapp/src/main/webapp/users/_editUser.zul:117 msgid "" "Profiles of LDAP users cannot be managed because LDAP roles are being used." msgstr "I profili degli utenti LDAP non possono essere modificati poichè si sta utilizzando LDAP come metodo di autenticazione." @@ -3558,7 +3580,7 @@ msgstr "Gruppo di lavoro virtuale" msgid "Changes saved" msgstr "Modifiche salvate" -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:1263 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:1267 msgid "See scheduling" msgstr "Mostra tabella di marcia" @@ -3587,7 +3609,7 @@ msgid "Work report saved" msgstr "Report di lavoro salvato" #: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/SubcontractCommand.java:53 -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/taskedition/TaskPropertiesController.java:377 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/taskedition/TaskPropertiesController.java:386 #: libreplan-webapp/src/main/webapp/planner/editTask.zul:68 msgid "Subcontract" msgstr "Subappalto" @@ -3623,10 +3645,6 @@ msgstr "non dev'essere vuoto" msgid "April" msgstr "Aprile" -#: libreplan-webapp/src/main/java/org/libreplan/web/calendars/BaseCalendarEditionController.java:302 -msgid "Derived of Calendar " -msgstr "Derivati del calendario" - #: libreplan-webapp/src/main/webapp/users/_listUsers.zul:22 msgid "Users List" msgstr "Lista utenti" @@ -3684,14 +3702,14 @@ msgstr "Filtra moduli di qualità per " msgid "Unindent selected task" msgstr "Disindenta il compito selezionato" -#: libreplan-webapp/src/main/webapp/planner/taskpanels/_tabPanelTaskProperties.zul:62 -msgid "Constraint" -msgstr "Obbligo" - #: libreplan-webapp/src/main/webapp/subcontract/reportAdvances.zul:44 msgid "Customer reference code" msgstr "Codice di riferimento del cliente" +#: libreplan-webapp/src/main/webapp/planner/taskpanels/_tabPanelTaskProperties.zul:66 +msgid "Constraint" +msgstr "Obbligo" + #: libreplan-webapp/src/main/webapp/workreports/_editWorkReportType.zul:150 msgid "Add New Label Type Field" msgstr "Aggiungi un nuovo campo di tipo d'etichetta" @@ -3710,16 +3728,16 @@ msgstr "Riferimento clliente" #: libreplan-webapp/src/main/java/org/libreplan/web/templates/historicalAssignment/OrderElementHistoricalAssignmentComponent.java:146 #: libreplan-webapp/src/main/java/org/libreplan/web/resourceload/ResourceLoadController.java:311 #: libreplan-webapp/src/main/java/org/libreplan/web/resourceload/ResourceLoadController.java:321 -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:693 -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:846 -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:896 -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:905 -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:932 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:697 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:850 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:900 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:909 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:936 #: libreplan-webapp/src/main/java/org/libreplan/web/limitingresources/LimitingResourcesController.java:333 msgid "Information" msgstr "Informazione" -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:931 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:935 msgid "Sorry, you do not have permissions to access this project" msgstr "Mi spiace, non hai i permessi per accedere a questo progetto" @@ -3743,7 +3761,7 @@ msgstr "Nuovo gruppo ore" msgid "Assign element to queue manually" msgstr "Assegna manualmente elemento alla coda" -#: libreplan-webapp/src/main/webapp/planner/print_configuration.zul:45 +#: libreplan-webapp/src/main/webapp/planner/print_configuration.zul:47 msgid "Please remember that only saved changes will be printed" msgstr "Ricordare che solo le modifiche salvate saranno stampate" @@ -3788,6 +3806,10 @@ msgstr "Tipo d'eccezione per calendario non trovato" msgid "Unable to convert value to {0} type" msgstr "Impossibile convertire il valore al tipo {0}" +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrdersTreeComponent.java:81 +msgid "Total task budget" +msgstr "Budget totale per il compito" + #: libreplan-webapp/src/main/java/org/libreplan/web/resources/worker/WorkerModel.java:222 msgid "Worker must be not-null" msgstr "Il lavoratore non dev'essere nullo" @@ -3796,14 +3818,14 @@ msgstr "Il lavoratore non dev'essere nullo" msgid "Some criterion satisfactions overlap in time" msgstr "Alcune soddisfazioni del criterio si sovrappongono nel tempo" -#: libreplan-webapp/src/main/webapp/reports/timeLineMaterialReport.zul:21 -msgid "LibrePlan: Materials Needs At Date" -msgstr "LibrePlan: Materiali necessari alla data" - #: libreplan-webapp/src/main/webapp/subcontract/reportAdvances.zul:49 msgid "Value last progress measurement" msgstr "Valore dell'ultimo progresso misurato" +#: libreplan-webapp/src/main/webapp/reports/timeLineMaterialReport.zul:21 +msgid "LibrePlan: Materials Needs At Date" +msgstr "LibrePlan: Materiali necessari alla data" + #: libreplan-webapp/src/main/webapp/resources/machine/_machineConfigurationUnits.zul:44 msgid "Worker assignments" msgstr "Assegnamento lavoratori" @@ -4032,7 +4054,7 @@ msgid "Check consolidated progresses" msgstr "Controlla i progressi consolidati" #: libreplan-webapp/src/main/java/org/libreplan/web/workreports/WorkReportCRUDController.java:1469 -#: libreplan-webapp/src/main/java/org/libreplan/web/workreports/WorkReportModel.java:585 +#: libreplan-webapp/src/main/java/org/libreplan/web/workreports/WorkReportModel.java:587 msgid "Show all" msgstr "Mostra tutti" @@ -4050,7 +4072,7 @@ msgid "Apply tab changes" msgstr "Applica modifiche alle linguette" #: libreplan-webapp/src/main/java/org/libreplan/web/users/settings/PasswordController.java:99 -#: libreplan-webapp/src/main/java/org/libreplan/web/users/UserCRUDController.java:170 +#: libreplan-webapp/src/main/java/org/libreplan/web/users/UserCRUDController.java:176 msgid "passwords don't match" msgstr "la password non corrisponde" @@ -4170,7 +4192,7 @@ msgstr "Non indentabile" msgid "List of materials for all categories (select one to filter)" msgstr "Lista dei materiali per tutte le categorie (seleziona una per filtrare)" -#: libreplan-webapp/src/main/webapp/planner/taskpanels/_tabPanelTaskProperties.zul:69 +#: libreplan-webapp/src/main/webapp/planner/taskpanels/_tabPanelTaskProperties.zul:73 msgid "Resource allocation type" msgstr "Tipo di allocazione risorse" @@ -4187,7 +4209,7 @@ msgstr "Tipo d'eccezione" msgid "In the available periods {0} only {1} hours are available." msgstr "Nel periodo disponibile {0} solo {1} ore sono disponibili." -#: libreplan-webapp/src/main/webapp/users/_editUser.zul:126 +#: libreplan-webapp/src/main/webapp/users/_editUser.zul:115 msgid "Association with profiles" msgstr "Associazione coi profili" @@ -4229,7 +4251,7 @@ msgstr "Base" msgid "Total dedication" msgstr "Dedizione totale" -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderElementTreeController.java:683 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderElementTreeController.java:686 msgid "" "You can not remove the task \"{0}\" because of this or any of its children " "are already in use in some work reports" @@ -4430,8 +4452,8 @@ msgstr "Abilita/Disabilita l'avviso circa la disponibilità di una nuova version msgid "Select type" msgstr "Seleziona tipo" -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/TaskElementAdapter.java:950 -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderModel.java:679 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/TaskElementAdapter.java:1021 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderModel.java:685 msgid "Hours invested" msgstr "Ore investite" @@ -4501,7 +4523,7 @@ msgstr "Vista Azienda" msgid "Both" msgstr "Entrambe" -#: libreplan-webapp/src/main/java/org/libreplan/web/tree/TreeController.java:765 +#: libreplan-webapp/src/main/java/org/libreplan/web/tree/TreeController.java:882 msgid "Not editable for containing more that an hours group." msgstr "Non modificabile poichè contiene più di un gruppo d'ore." @@ -4575,6 +4597,7 @@ msgid "LibrePlan: Transfer Projects Between Scenarios" msgstr "LibrePlan: Trasferisci progetti tra gli scenari" #: libreplan-webapp/src/main/webapp/orders/_listOrderElementHours.zul:118 +#: libreplan-webapp/src/main/webapp/orders/_listOrderElementHours.zul:166 msgid "%" msgstr "%" @@ -4585,14 +4608,14 @@ msgstr "Rimuovi calendario" #: libreplan-webapp/src/main/java/org/libreplan/web/workreports/WorkReportCRUDController.java:1536 #: libreplan-webapp/src/main/java/org/libreplan/web/workreports/WorkReportCRUDController.java:1700 -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/OrderPlanningController.java:336 -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/company/CompanyPlanningController.java:273 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/OrderPlanningController.java:338 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/company/CompanyPlanningController.java:274 #: libreplan-webapp/src/main/java/org/libreplan/web/reports/OrderCostsPerResourceController.java:141 #: libreplan-webapp/src/main/java/org/libreplan/web/resources/worker/WorkerCRUDController.java:633 #: libreplan-webapp/src/main/java/org/libreplan/web/resources/machine/MachineCRUDController.java:425 #: libreplan-webapp/src/main/java/org/libreplan/web/orders/ProjectDetailsController.java:257 -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderElementTreeController.java:670 -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:1328 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderElementTreeController.java:673 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:1332 msgid "must be lower than finish date" msgstr "dev'essere precedente alla data di fine" @@ -4613,14 +4636,14 @@ msgstr "Risorsa" msgid "Total task hours" msgstr "Ore totali del compito" -#: libreplan-webapp/src/main/java/org/libreplan/web/common/entrypoints/RedirectorSynthetiser.java:125 -msgid "Could not load any resource" -msgstr "Impossbile caricare alcuna risorsa" - #: libreplan-webapp/src/main/webapp/subcontract/reportAdvances.zul:46 msgid "Date last progress reported" msgstr "Data dell'ultimo progresso riportato" +#: libreplan-webapp/src/main/java/org/libreplan/web/common/entrypoints/RedirectorSynthetiser.java:125 +msgid "Could not load any resource" +msgstr "Impossbile caricare alcuna risorsa" + #: libreplan-webapp/src/main/java/org/libreplan/web/common/CustomMenuController.java:343 #: libreplan-webapp/src/main/webapp/reports/schedulingProgressPerOrderReport.zul:37 msgid "Work And Progress Per Project" @@ -4683,7 +4706,7 @@ msgstr "Lista delle linee del report di lavoro" msgid "Unit type code cannot be empty" msgstr "Il codice del tipo d'unità non può essere vuoto" -#: libreplan-webapp/src/main/java/org/libreplan/web/users/UserCRUDController.java:183 +#: libreplan-webapp/src/main/java/org/libreplan/web/users/UserCRUDController.java:189 #: libreplan-webapp/src/main/java/org/libreplan/web/common/CustomMenuController.java:320 msgid "Users" msgstr "Utenti" @@ -4716,8 +4739,8 @@ msgid "" "completed." msgstr "Un altro utente ha modificato gli stessi dati, quindi l'operazione non può essere eseguita con sicurezza." -#: libreplan-webapp/src/main/java/org/libreplan/web/templates/OrderTemplatesController.java:218 -#: libreplan-webapp/src/main/java/org/libreplan/web/templates/OrderTemplatesController.java:232 +#: libreplan-webapp/src/main/java/org/libreplan/web/templates/OrderTemplatesController.java:223 +#: libreplan-webapp/src/main/java/org/libreplan/web/templates/OrderTemplatesController.java:244 msgid "Template saved" msgstr "Modello salvato" @@ -4756,7 +4779,7 @@ msgstr "Esci dalla sessione" #: libreplan-webapp/src/main/webapp/resources/worker/_localizations.zul:31 #: libreplan-webapp/src/main/webapp/resources/worker/_localizations.zul:53 #: libreplan-webapp/src/main/webapp/resources/worker/_localizations.zul:67 -#: libreplan-business/src/main/java/org/libreplan/business/templates/entities/OrderLineGroupTemplate.java:243 +#: libreplan-business/src/main/java/org/libreplan/business/templates/entities/OrderLineGroupTemplate.java:244 msgid "Group" msgstr "Gruppo" @@ -4821,9 +4844,9 @@ msgstr "Aggiornamento incompatibile: la risorsa salvata non è del tipo: {0}" #: libreplan-webapp/src/main/webapp/costcategories/_editCostCategory.zul:96 #: libreplan-webapp/src/main/webapp/costcategories/_editTypeOfWorkHours.zul:78 #: libreplan-webapp/src/main/webapp/qualityforms/_editQualityForm.zul:134 -#: libreplan-webapp/src/main/webapp/users/_editProfile.zul:83 -#: libreplan-webapp/src/main/webapp/users/_editUser.zul:164 -#: libreplan-webapp/src/main/webapp/templates/templates.zul:137 +#: libreplan-webapp/src/main/webapp/users/_editProfile.zul:72 +#: libreplan-webapp/src/main/webapp/users/_editUser.zul:153 +#: libreplan-webapp/src/main/webapp/templates/templates.zul:145 #: libreplan-webapp/src/main/webapp/resources/worker/_edition.zul:114 #: libreplan-webapp/src/main/webapp/resources/machine/_editMachine.zul:100 #: libreplan-webapp/src/main/webapp/resources/criterions/_edition.zul:92 @@ -4891,7 +4914,7 @@ msgstr "Pianifica dalla scadenza all'inizio" msgid "generic machines allocation" msgstr "allocazione generica delle macchine" -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/taskedition/TaskPropertiesController.java:375 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/taskedition/TaskPropertiesController.java:384 msgid "Non limiting resource assignation" msgstr "Assegnazione risorse non limitanti" @@ -4914,13 +4937,13 @@ msgstr "Amministrazione" #: libreplan-webapp/src/main/java/org/libreplan/web/workreports/WorkReportCRUDController.java:1519 #: libreplan-webapp/src/main/java/org/libreplan/web/workreports/WorkReportCRUDController.java:1682 -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/OrderPlanningController.java:317 -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/company/CompanyPlanningController.java:255 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/OrderPlanningController.java:319 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/company/CompanyPlanningController.java:256 #: libreplan-webapp/src/main/java/org/libreplan/web/resources/worker/WorkerCRUDController.java:616 #: libreplan-webapp/src/main/java/org/libreplan/web/resources/machine/MachineCRUDController.java:408 #: libreplan-webapp/src/main/java/org/libreplan/web/orders/ProjectDetailsController.java:240 -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderElementTreeController.java:652 -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:1311 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderElementTreeController.java:655 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:1315 msgid "must be greater than start date" msgstr "dev'essere successiva alla data d'inizio" @@ -4933,6 +4956,10 @@ msgstr "Annulla e torna indietro" msgid "Assign quality form" msgstr "Assegna modulo qualità" +#: libreplan-webapp/src/main/webapp/orders/_edition.zul:157 +msgid "Calculated budget" +msgstr "Budget calcolato" + #: libreplan-webapp/src/main/java/org/libreplan/web/orders/materials/AssignedMaterialsController.java:387 msgid "Delete item {0}. Are you sure?" msgstr "Eliminare l'oggetto {0}. Sei sicuro?" @@ -4958,6 +4985,10 @@ msgstr "una linea del report di lavoro non ha questo tipo d'etichetta assegnato" msgid "Allocations" msgstr "Allocazioni" +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/assigntemplates/TemplateFinderPopup.java:137 +msgid "Choosing Template" +msgstr "Scegli il modello" + #: libreplan-webapp/src/main/webapp/calendars/_edition.zul:66 #: libreplan-webapp/src/main/webapp/resources/worker/_listVirtualWorkers.zul:35 msgid "Capacity" @@ -5002,7 +5033,7 @@ msgstr "Nessuna allocazione è stata effettuata" msgid "Removed calendar \"{0}\"" msgstr "Rimosso calendario \"{0}\"" -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:1068 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:1072 msgid "Create project" msgstr "Crea progetto" @@ -5043,29 +5074,29 @@ msgstr "Impossibile aggiungere queste autorizzazioni all'utente {0} perchè sono msgid "New work report" msgstr "Nuovo report di lavoro" +#: libreplan-webapp/src/main/java/org/libreplan/web/calendars/BaseCalendarEditionController.java:305 +msgid "Root calendar" +msgstr "Calendario centrale" + #: libreplan-webapp/src/main/java/org/libreplan/web/resources/worker/WorkerCRUDController.java:847 #: libreplan-webapp/src/main/java/org/libreplan/web/resources/machine/MachineCRUDController.java:578 msgid "yes" msgstr "si" -#: libreplan-webapp/src/main/java/org/libreplan/web/calendars/BaseCalendarEditionController.java:305 -msgid "Root calendar" -msgstr "Calendario centrale" - -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:867 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:871 msgid "" "Deleting this subcontracted project, you are going to lose the relation to " "report progress. Are you sure?" msgstr "Eliminare questo progetto subappaltato, perderai le relazioni per riportare i progressi. Sei sicuro?" -#: libreplan-webapp/src/main/webapp/common/configuration.zul:278 -msgid "Port" -msgstr "Porta" - #: libreplan-webapp/src/main/webapp/limitingresources/manualAllocation.zul:113 msgid "Select gap" msgstr "Imposta intervallo" +#: libreplan-webapp/src/main/webapp/common/configuration.zul:278 +msgid "Port" +msgstr "Porta" + #: libreplan-webapp/src/main/webapp/workreports/workReport.zul:63 msgid "Date Finish" msgstr "Data di fine" @@ -5093,7 +5124,11 @@ msgstr "Assegnamento categorie di costo" msgid "missing code in a hour cost" msgstr "codice mancante in un costo orario" -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/TaskElementAdapter.java:902 +#: libreplan-webapp/src/main/java/org/libreplan/web/exceptionDays/CalendarExceptionTypeCRUDController.java:247 +msgid "Exception Day Type" +msgstr "Tipo di giorno d'eccezione" + +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/TaskElementAdapter.java:973 msgid "All workers" msgstr "Tutti i lavoratori" @@ -5117,14 +5152,16 @@ msgstr "Gruppi d'ore {0} : Codice duplicato nel DB" #: libreplan-webapp/src/main/java/org/libreplan/web/materials/MaterialsController.java:311 #: libreplan-webapp/src/main/java/org/libreplan/web/costcategories/CostCategoryCRUDController.java:207 #: libreplan-webapp/src/main/java/org/libreplan/web/costcategories/CostCategoryCRUDController.java:307 +#: libreplan-webapp/src/main/java/org/libreplan/web/templates/TemplatesTreeController.java:110 +#: libreplan-webapp/src/main/java/org/libreplan/web/templates/TemplatesTreeController.java:130 #: libreplan-webapp/src/main/java/org/libreplan/web/calendars/BaseCalendarEditionController.java:994 #: libreplan-webapp/src/main/java/org/libreplan/web/calendars/BaseCalendarEditionController.java:1184 #: libreplan-webapp/src/main/java/org/libreplan/web/calendars/BaseCalendarEditionController.java:1441 #: libreplan-webapp/src/main/java/org/libreplan/web/resources/criterion/CriterionTreeController.java:135 #: libreplan-webapp/src/main/java/org/libreplan/web/orders/ProjectDetailsController.java:171 #: libreplan-webapp/src/main/java/org/libreplan/web/orders/labels/AssignedLabelsController.java:115 -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:1488 -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:1512 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:1492 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:1516 #: libreplan-webapp/src/main/java/org/libreplan/web/common/ConfigurationController.java:757 #: libreplan-webapp/src/main/webapp/labels/_editLabelType.zul:45 #: libreplan-webapp/src/main/webapp/labels/_editLabelType.zul:53 @@ -5191,10 +5228,6 @@ msgstr "Tipo unità" msgid "Load due to other assignments" msgstr "Carico dovuto ad altri assegnamenti" -#: libreplan-webapp/src/main/webapp/orders/_listOrderElementHours.zul:62 -msgid "Sum of all task leafs imputed hours" -msgstr "Somma di tutte le ore imputate per le parti del compito" - #: libreplan-webapp/src/main/java/org/libreplan/web/resources/machine/MachineCRUDController.java:554 msgid "This machine was already removed by other user" msgstr "Questa macchina è stata già rimossa da un altro utente" @@ -5267,11 +5300,11 @@ msgstr "Login della nostra azienda" msgid "Filter work reports" msgstr "Filtra per report di lavoro" -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/TaskElementAdapter.java:947 -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderModel.java:678 -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderElementTreeController.java:601 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/TaskElementAdapter.java:1018 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderModel.java:684 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderElementTreeController.java:603 #: libreplan-webapp/src/main/java/org/libreplan/web/common/CustomMenuController.java:328 -#: libreplan-webapp/src/main/webapp/templates/templates.zul:63 +#: libreplan-webapp/src/main/webapp/templates/templates.zul:64 #: libreplan-webapp/src/main/webapp/templates/_editTemplateWindow.zul:49 #: libreplan-webapp/src/main/webapp/orders/_editOrderElement.zul:48 #: libreplan-webapp/src/main/webapp/orders/_edition.zul:46 @@ -5334,7 +5367,7 @@ msgstr "opzioni" msgid "LibrePlan: Work Reports" msgstr "LibrePlan: Report di lavoro" -#: libreplan-webapp/src/main/java/org/libreplan/web/templates/OrderTemplatesController.java:373 +#: libreplan-webapp/src/main/java/org/libreplan/web/templates/OrderTemplatesController.java:393 #: libreplan-webapp/src/main/java/org/libreplan/web/orders/materials/AssignedMaterialsController.java:393 msgid "Error on showing delete confirm" msgstr "Errore nel mostrare la conferma d'eliminazione" @@ -5359,7 +5392,7 @@ msgstr "Raggruppa per settimana" msgid "Finish hour" msgstr "Ora di fine" -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/reassign/ReassignCommand.java:200 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/reassign/ReassignCommand.java:196 msgid "Done {0} of {1}" msgstr "Completato {0} su {1}" @@ -5415,16 +5448,16 @@ msgstr "Questa misura di progresso non può essere in " msgid "Inherited labels" msgstr "Etichette ereditate" -#: libreplan-webapp/src/main/java/org/libreplan/web/tree/TreeController.java:946 -#: libreplan-webapp/src/main/java/org/libreplan/web/resources/criterion/CriterionTreeController.java:292 -msgid "Unindent" -msgstr "Disindenta" - #: libreplan-webapp/src/main/java/org/libreplan/web/orders/ManageOrderElementAdvancesController.java:939 #: libreplan-webapp/src/main/java/org/libreplan/web/orders/ManageOrderElementAdvancesController.java:1406 msgid "Value is not valid, the current value must be not empty" msgstr "Il valore non è valido, il valore corrente non può essere vuoto" +#: libreplan-webapp/src/main/java/org/libreplan/web/tree/TreeController.java:1063 +#: libreplan-webapp/src/main/java/org/libreplan/web/resources/criterion/CriterionTreeController.java:292 +msgid "Unindent" +msgstr "Disindenta" + #: libreplan-webapp/src/main/webapp/orders/components/_listOrderElementLabels.zul:50 msgid "Direct labels" msgstr "Etichette dirette" @@ -5488,7 +5521,7 @@ msgstr "La sequenza di codice è già in uso e non può essere aggiornata" msgid "Scheduling state" msgstr "Stato di programmazione" -#: libreplan-webapp/src/main/java/org/libreplan/web/templates/OrderTemplatesController.java:369 +#: libreplan-webapp/src/main/java/org/libreplan/web/templates/OrderTemplatesController.java:389 msgid "This template can not be removed because it has applications." msgstr "Questo modello non può essere rimosso poiche ha delle applicazioni." @@ -5508,6 +5541,10 @@ msgstr "LibrePlan: Ore lavorate per risorsa" msgid "Number of iterations should be between 1 and " msgstr "Il numero d'iterazioni dev'essere compreso tra 1 e " +#: libreplan-webapp/src/main/webapp/orders/_listOrderElementHours.zul:151 +msgid "Budget in money" +msgstr "Budget monetario" + #: libreplan-webapp/src/main/java/org/libreplan/web/common/ConfigurationController.java:145 msgid "Scenarios must be enabled as more elements than master exist" msgstr "Gli scenari devono essere abilitati poichè esistono più di un elemento principale" @@ -5550,7 +5587,7 @@ msgstr "ab" msgid "Administrator" msgstr "Amministratore" -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/reassign/ReassignCommand.java:190 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/reassign/ReassignCommand.java:186 msgid "Doing {0} reassignations" msgstr "Eseguo {0} riassegnamenti" @@ -5586,7 +5623,7 @@ msgstr "Impossibile eliminare il tipo di report di lavoro. Ci sono alcun report msgid "Criterion Type List" msgstr "Lista dei tipi di criterio" -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/OrderPlanningModel.java:739 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/OrderPlanningModel.java:765 msgid "Overall progress" msgstr "Progresso globale" @@ -5610,7 +5647,7 @@ msgstr "Password" msgid "Observations" msgstr "Osservazioni" -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:947 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:951 msgid "Edit project" msgstr "Modifica progetto" @@ -5665,7 +5702,6 @@ msgstr "Cancellare {0} \"{1}\". Sei sicuro?" msgid "Only {0} resources per day were achieved for current allocation" msgstr "Solo {0} risorse per giorno sono state utilizzate con l'allocazione corrente" -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/assigntemplates/TemplateFinderPopup.java:51 #: libreplan-webapp/src/main/webapp/planner/editTask.zul:79 #: libreplan-webapp/src/main/webapp/planner/reassign.zul:48 #: libreplan-webapp/src/main/webapp/planner/stretches_function.zul:89 @@ -5712,6 +5748,10 @@ msgstr "Completato: {0}% " msgid "Calculated progress measurement can not be removed" msgstr "Le misure di progresso calcolate non possono essere rimosse" +#: libreplan-webapp/src/main/java/org/libreplan/web/exceptionDays/CalendarExceptionTypeCRUDController.java:252 +msgid "Exception Day Types" +msgstr "Tipi di giorni d'eccezione" + #: libreplan-webapp/src/main/java/org/libreplan/web/resources/worker/AssignedCriterionsModel.java:335 #: libreplan-webapp/src/main/java/org/libreplan/web/resources/worker/AssignedCriterionsModel.java:341 msgid " The " @@ -5755,6 +5795,10 @@ msgstr "Applica le modifiche e continua a modificare" msgid "Infinitely Over Assignable" msgstr "Permette infinito lavoro in straordinario" +#: libreplan-webapp/src/main/webapp/orders/_listOrderElementHours.zul:157 +msgid "Money spent" +msgstr "Soldi spesi" + #: libreplan-business/src/main/java/org/libreplan/business/resources/entities/CriterionType.java:426 msgid "criterion names must be unique inside a criterion type" msgstr "i nomi dei criteri devono essere unici all'interno di un tipo di criterio" @@ -5790,7 +5834,7 @@ msgstr "I periodi disponibili dipendono dal soddisfacimento dei criteri delle ri #: libreplan-webapp/src/main/webapp/reports/hoursWorkedPerWorkerReport.zul:86 #: libreplan-webapp/src/main/webapp/reports/schedulingProgressPerOrderReport.zul:116 #: libreplan-webapp/src/main/webapp/reports/timeLineMaterialReport.zul:95 -#: libreplan-webapp/src/main/webapp/templates/templates.zul:85 +#: libreplan-webapp/src/main/webapp/templates/templates.zul:86 #: libreplan-webapp/src/main/webapp/templates/_list.zul:26 #: libreplan-webapp/src/main/webapp/templates/_materialAssignmentsBox.zul:28 #: libreplan-webapp/src/main/webapp/calendars/_edition.zul:54 @@ -5847,15 +5891,20 @@ msgstr "Data d'inizio" msgid "Update exception" msgstr "Aggiorna eccezione" -#: libreplan-webapp/src/main/webapp/subcontract/subcontractedTasks.zul:52 -#: libreplan-webapp/src/main/webapp/orders/_edition.zul:140 -msgid "Budget" -msgstr "Capitale preventivato" - #: libreplan-webapp/src/main/java/org/libreplan/web/orders/TreeElementOperationsController.java:253 msgid "Operation cannot be done" msgstr "L'operazione non può essere effettuata" +#: libreplan-webapp/src/main/java/org/libreplan/web/templates/TemplatesTreeComponent.java:91 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrdersTreeComponent.java:80 +#: libreplan-webapp/src/main/webapp/planner/taskpanels/_tabPanelTaskProperties.zul:62 +#: libreplan-webapp/src/main/webapp/templates/templates.zul:107 +#: libreplan-webapp/src/main/webapp/subcontract/subcontractedTasks.zul:52 +#: libreplan-webapp/src/main/webapp/orders/_orderElementDetails.zul:65 +#: libreplan-webapp/src/main/webapp/orders/_edition.zul:140 +msgid "Budget" +msgstr "Capitale preventivato" + #: libreplan-webapp/src/main/java/org/libreplan/web/reports/HoursWorkedPerWorkerInAMonthController.java:44 msgid "May" msgstr "Maggio" @@ -5889,7 +5938,7 @@ msgstr "Numero delle applicazioni" msgid "Assign element to queue automatically" msgstr "Assegna elemento alla coda automaticamente" -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrdersTreeComponent.java:82 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrdersTreeComponent.java:92 msgid "" "Date which the task must start after (press enter in textbox to open " "calendar popup or type in date directly)" @@ -5925,8 +5974,8 @@ msgstr "Questo tipo d'etichetta è già assegnato al tipo di report di lavoro." msgid "Probability %" msgstr "Probabilità %" -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/OrderPlanningModel.java:737 -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/company/CompanyPlanningModel.java:324 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/OrderPlanningModel.java:763 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/company/CompanyPlanningModel.java:321 #: libreplan-webapp/src/main/java/org/libreplan/web/resourceload/ResourceLoadController.java:815 #: libreplan-webapp/src/main/webapp/planner/_legendLoadChartOrder.zul:49 msgid "Load" @@ -5937,12 +5986,12 @@ msgstr "Carico" msgid "New criterion" msgstr "Nuovo criterio" -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderModel.java:683 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderModel.java:689 #: libreplan-webapp/src/main/webapp/materials/materials.zul:81 #: libreplan-webapp/src/main/webapp/scenarios/_edition.zul:43 #: libreplan-webapp/src/main/webapp/qualityforms/_listQualityForm.zul:37 #: libreplan-webapp/src/main/webapp/qualityforms/_editQualityForm.zul:49 -#: libreplan-webapp/src/main/webapp/templates/templates.zul:101 +#: libreplan-webapp/src/main/webapp/templates/templates.zul:102 #: libreplan-webapp/src/main/webapp/templates/_list.zul:32 #: libreplan-webapp/src/main/webapp/subcontract/subcontractedTasks.zul:51 #: libreplan-webapp/src/main/webapp/resources/machine/_listMachines.zul:36 @@ -5966,7 +6015,7 @@ msgstr "Nodo selezionato" msgid "already exists an allocation for criteria {0}" msgstr "esiste già un'allocazione per il criterio {0}" -#: libreplan-webapp/src/main/java/org/libreplan/web/templates/OrderTemplatesController.java:283 +#: libreplan-webapp/src/main/java/org/libreplan/web/templates/OrderTemplatesController.java:303 #: libreplan-webapp/src/main/java/org/libreplan/web/common/CustomMenuController.java:294 msgid "Project Templates" msgstr "Modelli di progetto" @@ -5993,7 +6042,7 @@ msgstr "Non assegnato" msgid "At least one HoursGroup is needed" msgstr "Almeno un HoursGroup è necessario" -#: libreplan-webapp/src/main/java/org/libreplan/web/users/UserCRUDController.java:178 +#: libreplan-webapp/src/main/java/org/libreplan/web/users/UserCRUDController.java:184 #: libreplan-webapp/src/main/webapp/externalcompanies/_editExternalCompany.zul:63 #: libreplan-webapp/src/main/webapp/common/layout/login.zul:74 #: libreplan-business/src/main/java/org/libreplan/business/advance/entities/AdvanceType.java:165 @@ -6057,8 +6106,8 @@ msgstr "Carico al 100%" msgid "Function" msgstr "Funzione" -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/OrderPlanningModel.java:799 -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/company/CompanyPlanningModel.java:363 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/OrderPlanningModel.java:825 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/company/CompanyPlanningModel.java:360 msgid "date in future" msgstr "data futura" @@ -6073,14 +6122,14 @@ msgstr "data futura" msgid "Format" msgstr "Formato" -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/SaveCommandBuilder.java:887 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/SaveCommandBuilder.java:885 msgid "New project version" msgstr "Nuova versione del progetto" -#: libreplan-webapp/src/main/java/org/libreplan/web/templates/TemplatesTreeController.java:77 +#: libreplan-webapp/src/main/java/org/libreplan/web/templates/TemplatesTreeController.java:79 #: libreplan-webapp/src/main/java/org/libreplan/web/calendars/BaseCalendarCRUDController.java:366 -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderElementTreeController.java:484 -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:1231 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderElementTreeController.java:486 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:1235 #: libreplan-webapp/src/main/java/org/libreplan/web/limitingresources/QueueComponent.java:478 #: libreplan-webapp/src/main/java/org/libreplan/web/common/Util.java:537 #: libreplan-webapp/src/main/webapp/labels/_listLabelTypes.zul:37 @@ -6251,7 +6300,7 @@ msgstr "Il valore non è valido, dev'essere maggiore del precedente valore di pr msgid "BCWS" msgstr "BCWS" -#: libreplan-webapp/src/main/java/org/libreplan/web/print/CutyPrint.java:351 +#: libreplan-webapp/src/main/java/org/libreplan/web/print/CutyPrint.java:343 msgid " in the specified directory." msgstr " nella cartella specificata." @@ -6304,7 +6353,7 @@ msgstr "Costo attuale del lavoro effettuato" msgid "Create project from Template" msgstr "Crea progetto da modello" -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderElementTreeController.java:418 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderElementTreeController.java:420 msgid "" "Value is not valid.\n" " Code cannot contain chars like '_' \n" @@ -6315,11 +6364,15 @@ msgstr "Valore non valido.\nIl codice non può contenere caratteri come '_'\ne n msgid "an authorization type must be set" msgstr "un tipo d'autorizzazione dev'essere impostato" -#: libreplan-webapp/src/main/java/org/libreplan/web/templates/TemplatesTreeComponent.java:92 +#: libreplan-webapp/src/main/java/org/libreplan/web/templates/TemplatesTreeComponent.java:101 msgid "Must start after (days since beginning project)" msgstr "Deve iniziare dopo (giorni dall'inizio del progetto)" -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/SaveCommandBuilder.java:886 +#: libreplan-webapp/src/main/webapp/orders/_listOrderElementHours.zul:134 +msgid "Percentage of estimated budget in money / money spent" +msgstr "Percentuale del budget stimato / soldi spesi" + +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/SaveCommandBuilder.java:884 msgid "" "Confirm creating a new project version for this scenario and derived. Are " "you sure?" @@ -6367,7 +6420,7 @@ msgstr "Deseleziona" msgid "You should select the type of exception" msgstr "Dovresti selezionare un tipo di eccezione" -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrdersTreeComponent.java:93 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrdersTreeComponent.java:103 #: libreplan-webapp/src/main/webapp/planner/taskpanels/_tabPanelTaskProperties.zul:46 #: libreplan-webapp/src/main/webapp/orders/_projectDetails.zul:63 #: libreplan-webapp/src/main/webapp/orders/_orderElementDetails.zul:52 @@ -6419,7 +6472,7 @@ msgstr "Allocazione avanzata" msgid "Number of iterations" msgstr "Numero d'iterazioni" -#: libreplan-webapp/src/main/webapp/templates/templates.zul:60 +#: libreplan-webapp/src/main/webapp/templates/templates.zul:61 msgid "Template Tree" msgstr "Albero dei modelli" @@ -6446,11 +6499,15 @@ msgstr "lo sforzo non è calcolato in modo appropriato basandosi sull'orologio" msgid "Status" msgstr "Stato" +#: libreplan-webapp/src/main/java/org/libreplan/web/calendars/BaseCalendarEditionController.java:321 +msgid "from {0}" +msgstr "da {0}" + #: libreplan-webapp/src/main/webapp/settings/settings.zul:111 msgid "Resource load view" msgstr "Vista del carico delle risorse" -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/OrderPlanningModel.java:787 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/OrderPlanningModel.java:813 msgid "the date must be inside the visualization area" msgstr "la data dev'essere all'interno dell'are di visualizzazione" @@ -6600,8 +6657,8 @@ msgid "Task Scheduling Status In Project" msgstr "Stato della pianificazione del compito nel progetto" #: libreplan-webapp/src/main/java/org/libreplan/web/qualityforms/QualityFormCRUDController.java:162 -#: libreplan-webapp/src/main/java/org/libreplan/web/templates/OrderTemplatesController.java:356 -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:868 +#: libreplan-webapp/src/main/java/org/libreplan/web/templates/OrderTemplatesController.java:376 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:872 #: libreplan-webapp/src/main/java/org/libreplan/web/common/BaseCRUDController.java:313 msgid "Confirm" msgstr "Conferma" @@ -6653,8 +6710,8 @@ msgstr "Prezzo totale" #: libreplan-webapp/src/main/java/org/libreplan/web/workreports/WorkReportCRUDController.java:1214 #: libreplan-webapp/src/main/java/org/libreplan/web/workreports/WorkReportCRUDController.java:1226 #: libreplan-webapp/src/main/java/org/libreplan/web/workreports/WorkReportTypeCRUDController.java:346 -#: libreplan-webapp/src/main/java/org/libreplan/web/tree/TreeController.java:984 -#: libreplan-webapp/src/main/java/org/libreplan/web/tree/TreeController.java:990 +#: libreplan-webapp/src/main/java/org/libreplan/web/tree/TreeController.java:1101 +#: libreplan-webapp/src/main/java/org/libreplan/web/tree/TreeController.java:1107 #: libreplan-webapp/src/main/java/org/libreplan/web/costcategories/CostCategoryCRUDController.java:289 #: libreplan-webapp/src/main/java/org/libreplan/web/costcategories/CostCategoryCRUDController.java:457 #: libreplan-webapp/src/main/java/org/libreplan/web/costcategories/ResourcesCostCategoryAssignmentController.java:143 @@ -6673,7 +6730,7 @@ msgstr "Prezzo totale" #: libreplan-webapp/src/main/java/org/libreplan/web/orders/AssignedTaskQualityFormsToOrderElementController.java:201 #: libreplan-webapp/src/main/java/org/libreplan/web/orders/AssignedTaskQualityFormsToOrderElementController.java:333 #: libreplan-webapp/src/main/java/org/libreplan/web/orders/AssignedTaskQualityFormsToOrderElementController.java:406 -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:1247 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:1251 #: libreplan-webapp/src/main/webapp/labels/_editLabelType.zul:99 #: libreplan-webapp/src/main/webapp/labels/_listLabelTypes.zul:42 #: libreplan-webapp/src/main/webapp/externalcompanies/_listExternalCompanies.zul:49 @@ -6698,10 +6755,8 @@ msgstr "Prezzo totale" #: libreplan-webapp/src/main/webapp/reports/workingArrangementsPerOrderReport.zul:154 #: libreplan-webapp/src/main/webapp/reports/timeLineMaterialReport.zul:106 #: libreplan-webapp/src/main/webapp/users/_listUsers.zul:46 -#: libreplan-webapp/src/main/webapp/users/_editProfile.zul:68 #: libreplan-webapp/src/main/webapp/users/_listProfiles.zul:40 -#: libreplan-webapp/src/main/webapp/users/_editUser.zul:115 -#: libreplan-webapp/src/main/webapp/users/_editUser.zul:148 +#: libreplan-webapp/src/main/webapp/users/_editUser.zul:137 #: libreplan-webapp/src/main/webapp/templates/_list.zul:53 #: libreplan-webapp/src/main/webapp/templates/_materialAssignmentsBox.zul:55 #: libreplan-webapp/src/main/webapp/resources/worker/_listVirtualWorkers.zul:52 @@ -6801,7 +6856,7 @@ msgid "Stretches" msgstr "Allarga" #: libreplan-business/src/main/java/org/libreplan/business/planner/entities/AssignmentFunction.java:79 -msgid "Interporlation" +msgid "Interpolation" msgstr "Interpolazione" #: libreplan-business/src/main/java/org/libreplan/business/planner/entities/AssignmentFunction.java:80 @@ -6865,23 +6920,23 @@ msgstr "In progresso" msgid "Blocked" msgstr "Bloccato" -#: libreplan-business/src/main/java/org/libreplan/business/planner/entities/PositionConstraintType.java:29 +#: libreplan-business/src/main/java/org/libreplan/business/planner/entities/PositionConstraintType.java:31 msgid "as soon as possible" msgstr "al più presto" -#: libreplan-business/src/main/java/org/libreplan/business/planner/entities/PositionConstraintType.java:41 +#: libreplan-business/src/main/java/org/libreplan/business/planner/entities/PositionConstraintType.java:38 msgid "start not earlier than" msgstr "non iniziare prima di" -#: libreplan-business/src/main/java/org/libreplan/business/planner/entities/PositionConstraintType.java:53 +#: libreplan-business/src/main/java/org/libreplan/business/planner/entities/PositionConstraintType.java:45 msgid "start in fixed date" msgstr "inizia con data fissa " -#: libreplan-business/src/main/java/org/libreplan/business/planner/entities/PositionConstraintType.java:65 +#: libreplan-business/src/main/java/org/libreplan/business/planner/entities/PositionConstraintType.java:57 msgid "as late as possible" msgstr "al più tardi possibile" -#: libreplan-business/src/main/java/org/libreplan/business/planner/entities/PositionConstraintType.java:77 +#: libreplan-business/src/main/java/org/libreplan/business/planner/entities/PositionConstraintType.java:64 msgid "finish not later than" msgstr "non finire più tardi di" @@ -6921,7 +6976,7 @@ msgstr "Modifica di tutti i progetti permessa" msgid "Project creation allowed" msgstr "Creazione progetti permessa" -#: libreplan-business/src/main/java/org/libreplan/business/templates/entities/OrderLineTemplate.java:122 +#: libreplan-business/src/main/java/org/libreplan/business/templates/entities/OrderLineTemplate.java:132 msgid "Line" msgstr "Linea" @@ -7089,23 +7144,23 @@ msgstr "P" msgid "U" msgstr "U" -#: libreplan-business/src/main/java/org/libreplan/business/orders/entities/OrderElement.java:618 +#: libreplan-business/src/main/java/org/libreplan/business/orders/entities/OrderElement.java:629 msgid "" "Some ancestor has the same label assigned, so this element is already " "inheriting this label" msgstr "Alcuni avi hanno la stessa etichetta assegnata quindi questo elemento eredità già questa etichetta" -#: libreplan-business/src/main/java/org/libreplan/business/orders/entities/OrderElement.java:717 +#: libreplan-business/src/main/java/org/libreplan/business/orders/entities/OrderElement.java:728 #: libreplan-business/src/main/java/org/libreplan/business/orders/entities/OrderLineGroup.java:963 msgid "Cannot spread two progress in the same task" msgstr "Non posso spargere 2 progressi nello stesso compito" -#: libreplan-business/src/main/java/org/libreplan/business/orders/entities/OrderElement.java:741 -#: libreplan-business/src/main/java/org/libreplan/business/orders/entities/OrderElement.java:767 +#: libreplan-business/src/main/java/org/libreplan/business/orders/entities/OrderElement.java:752 +#: libreplan-business/src/main/java/org/libreplan/business/orders/entities/OrderElement.java:778 msgid "Duplicate Progress Assignment For Task" msgstr "Assegnamento di progresso duplicato per il compito" -#: libreplan-business/src/main/java/org/libreplan/business/orders/entities/OrderElement.java:1094 +#: libreplan-business/src/main/java/org/libreplan/business/orders/entities/OrderElement.java:1105 msgid "Quality form already exists" msgstr "Modulo di qualità già esistente" From 6c66ac0f6c9d8e167cbf3df96a7bbceadd2da395 Mon Sep 17 00:00:00 2001 From: Manuel Rego Casasnovas Date: Wed, 11 Apr 2012 14:28:05 +0200 Subject: [PATCH 004/108] Fix error in documentation of class ResourcesMultipleFiltersFinder FEA: ItEr76S23ImproveFilteringArea --- .../components/finders/ResourcesMultipleFiltersFinder.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/libreplan-webapp/src/main/java/org/libreplan/web/common/components/finders/ResourcesMultipleFiltersFinder.java b/libreplan-webapp/src/main/java/org/libreplan/web/common/components/finders/ResourcesMultipleFiltersFinder.java index be6746e45..25579c12c 100644 --- a/libreplan-webapp/src/main/java/org/libreplan/web/common/components/finders/ResourcesMultipleFiltersFinder.java +++ b/libreplan-webapp/src/main/java/org/libreplan/web/common/components/finders/ResourcesMultipleFiltersFinder.java @@ -35,11 +35,11 @@ import org.springframework.beans.factory.annotation.Autowired; /** * Implements all the methods needed to search the criterion to filter the - * resources. Provides multiples criterions to filter like {@link Criterion}, - * {@link Category} or filter by name or nif. + * resources. Provides multiples criteria to filter like {@link Criterion} or + * {@link CostCategory}. + * * @author Susana Montes Pedreira */ - public class ResourcesMultipleFiltersFinder extends MultipleFiltersFinder { @Autowired From 7570bee03c0a98cd0b40ff71d07cc910b471c88a Mon Sep 17 00:00:00 2001 From: Manuel Rego Casasnovas Date: Wed, 11 Apr 2012 19:35:28 +0200 Subject: [PATCH 005/108] Allow to filter resources by criteria in the resource load window FEA: ItEr76S23ImproveFilteringArea --- .../components/finders/WorkerFilterEnum.java | 50 ++++++ .../finders/WorkerMultipleFiltersFinder.java | 157 ++++++++++++++---- .../resourceload/ResourceLoadController.java | 36 +++- 3 files changed, 206 insertions(+), 37 deletions(-) create mode 100644 libreplan-webapp/src/main/java/org/libreplan/web/common/components/finders/WorkerFilterEnum.java diff --git a/libreplan-webapp/src/main/java/org/libreplan/web/common/components/finders/WorkerFilterEnum.java b/libreplan-webapp/src/main/java/org/libreplan/web/common/components/finders/WorkerFilterEnum.java new file mode 100644 index 000000000..a22a8d2b2 --- /dev/null +++ b/libreplan-webapp/src/main/java/org/libreplan/web/common/components/finders/WorkerFilterEnum.java @@ -0,0 +1,50 @@ +/* + * This file is part of LibrePlan + * + * Copyright (C) 2012 Igalia, S.L. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 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 Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package org.libreplan.web.common.components.finders; + +import org.libreplan.business.resources.entities.Resource; + +/** + * Diferent filters for {@link Resource}. + * + * @author Manuel Rego Casasnovas + */ +public enum WorkerFilterEnum implements IFilterEnum { + + RESOURCE(_("Resource")), CRITERION(_("Criterion")); + + /** + * Forces to mark the string as needing translation + */ + private static String _(String string) { + return string; + } + + private String description; + + private WorkerFilterEnum(String description) { + this.description = description; + } + + public String toString() { + return this.description; + } + +} diff --git a/libreplan-webapp/src/main/java/org/libreplan/web/common/components/finders/WorkerMultipleFiltersFinder.java b/libreplan-webapp/src/main/java/org/libreplan/web/common/components/finders/WorkerMultipleFiltersFinder.java index a10f92f6b..179f01865 100644 --- a/libreplan-webapp/src/main/java/org/libreplan/web/common/components/finders/WorkerMultipleFiltersFinder.java +++ b/libreplan-webapp/src/main/java/org/libreplan/web/common/components/finders/WorkerMultipleFiltersFinder.java @@ -3,7 +3,7 @@ * * Copyright (C) 2009-2010 Fundación para o Fomento da Calidade Industrial e * Desenvolvemento Tecnolóxico de Galicia - * Copyright (C) 2010-2011 Igalia, S.L. + * Copyright (C) 2010-2012 Igalia, S.L. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as published by @@ -23,67 +23,160 @@ package org.libreplan.web.common.components.finders; import java.util.Iterator; import java.util.List; +import java.util.Map; +import java.util.SortedMap; import org.apache.commons.lang.StringUtils; import org.libreplan.business.hibernate.notification.PredefinedDatabaseSnapshots; -import org.libreplan.business.resources.entities.Worker; +import org.libreplan.business.resources.entities.Criterion; +import org.libreplan.business.resources.entities.CriterionType; +import org.libreplan.business.resources.entities.Resource; import org.springframework.beans.factory.annotation.Autowired; +/** + * Implements all the methods needed to search the different criteria to filter + * the {@link Resource}s.
+ * It provides the following criteria to filter: {@link Resource} and + * {@link Criterion}. + * + * @author Manuel Rego Casasnovas + */ public class WorkerMultipleFiltersFinder extends MultipleFiltersFinder { @Autowired private PredefinedDatabaseSnapshots databaseSnapshots; - private IFilterEnum workerFilterEnum = new IFilterEnum() { - @Override - public String toString() { - return "Resource ( Worker )"; - } - }; - - /** - * Forces to mark the string as needing translation - */ - private static String _(String string) { - return string; + protected WorkerMultipleFiltersFinder() { } @Override public List getFirstTenFilters() { getListMatching().clear(); - Iterator iteratorWorker = getListWorkers().iterator(); - while(iteratorWorker.hasNext() && getListMatching().size() < 10) { - Worker worker = iteratorWorker.next(); - getListMatching().add( - new FilterPair(workerFilterEnum, worker.getDescription(), - worker)); - } + fillWithFirstTenFiltersResources(); + fillWithFirstTenFiltersCriterions(); addNoneFilter(); return getListMatching(); } - private List getListWorkers() { - return databaseSnapshots.snapshotListWorkers(); + private List fillWithFirstTenFiltersResources() { + Map, List> mapResources = getMapResources(); + Iterator> iteratorClass = mapResources.keySet().iterator(); + while (iteratorClass.hasNext() && getListMatching().size() < 10) { + Class className = iteratorClass.next(); + for (int i = 0; getListMatching().size() < 10 + && i < mapResources.get(className).size(); i++) { + Resource resource = mapResources.get(className).get(i); + addResource(className, resource); + } + } + return getListMatching(); + } + + private Map, List> getMapResources() { + return databaseSnapshots.snapshotMapResources(); + } + + private void addResource(Class className, Resource resource) { + String pattern = resource.getName(); + getListMatching().add( + new FilterPair(WorkerFilterEnum.RESOURCE, className + .getSimpleName(), pattern, resource)); + } + + private List fillWithFirstTenFiltersCriterions() { + SortedMap> mapCriterions = getMapCriterions(); + Iterator iteratorCriterionType = mapCriterions.keySet() + .iterator(); + while (iteratorCriterionType.hasNext() && getListMatching().size() < 10) { + CriterionType type = iteratorCriterionType.next(); + for (int i = 0; getListMatching().size() < 10 + && i < mapCriterions.get(type).size(); i++) { + Criterion criterion = mapCriterions.get(type).get(i); + addCriterion(type, criterion); + } + } + return getListMatching(); + } + + private SortedMap> getMapCriterions() { + return databaseSnapshots.snapshotCriterionsMap(); + } + + private void addCriterion(CriterionType type, Criterion criterion) { + String pattern = criterion.getName() + " ( " + type.getName() + " )"; + getListMatching().add( + new FilterPair(WorkerFilterEnum.CRITERION, type + .getResource().toLowerCase(), pattern, criterion)); } - @Override public List getMatching(String filter) { getListMatching().clear(); if ((filter != null) && (!filter.isEmpty())) { filter = StringUtils.deleteWhitespace(filter.toLowerCase()); - searchInWorkers(filter); + searchInResources(filter); + searchInCriterionTypes(filter); } + addNoneFilter(); return getListMatching(); - } - private void searchInWorkers(String filter) { - for (Worker worker : getListWorkers()) { - String name = StringUtils.deleteWhitespace(worker.getDescription() + + private void searchInResources(String filter) { + Map, List> mapResources = databaseSnapshots + .snapshotMapResources(); + for (Class className : mapResources.keySet()) { + for (Resource resource : mapResources.get(className)) { + String name = StringUtils.deleteWhitespace(resource.getName() + .toLowerCase()); + if (name.contains(filter)) { + addResource(className, resource); + if ((filter.length() < 3) && (getListMatching().size() > 9)) { + return; + } + } + } + } + } + + private void searchInCriterionTypes(String filter) { + boolean limited = (filter.length() < 3); + for (CriterionType type : getMapCriterions().keySet()) { + String name = StringUtils.deleteWhitespace(type.getName() .toLowerCase()); - if(name.contains(filter)) { - getListMatching().add(new FilterPair( - workerFilterEnum, worker.getShortDescription(), worker)); + if (name.contains(filter)) { + setFilterPairCriterionType(type, limited); + } else { + searchInCriterions(type, filter); + } + } + } + + private void searchInCriterions(CriterionType type, String filter) { + List list = getMapCriterions().get(type); + if (list == null) { + return; + } + for (Criterion criterion : list) { + String name = StringUtils.deleteWhitespace(criterion.getName() + .toLowerCase()); + if (name.contains(filter)) { + addCriterion(type, criterion); + if ((filter.length() < 3) && (getListMatching().size() > 9)) { + return; + } + } + } + } + + private void setFilterPairCriterionType(CriterionType type, boolean limited) { + List list = getMapCriterions().get(type); + if (list == null) { + return; + } + for (Criterion criterion : list) { + addCriterion(type, criterion); + if ((limited) && (getListMatching().size() > 9)) { + return; } } } diff --git a/libreplan-webapp/src/main/java/org/libreplan/web/resourceload/ResourceLoadController.java b/libreplan-webapp/src/main/java/org/libreplan/web/resourceload/ResourceLoadController.java index 3af09f504..e764bb1c5 100644 --- a/libreplan-webapp/src/main/java/org/libreplan/web/resourceload/ResourceLoadController.java +++ b/libreplan-webapp/src/main/java/org/libreplan/web/resourceload/ResourceLoadController.java @@ -43,6 +43,7 @@ import org.libreplan.business.planner.chart.ILoadChartData; import org.libreplan.business.planner.chart.ResourceLoadChartData; import org.libreplan.business.planner.entities.DayAssignment; import org.libreplan.business.planner.entities.TaskElement; +import org.libreplan.business.resources.daos.IResourcesSearcher; import org.libreplan.business.resources.entities.Criterion; import org.libreplan.business.resources.entities.Resource; import org.libreplan.web.common.components.bandboxsearch.BandboxMultipleSearch; @@ -123,6 +124,9 @@ public class ResourceLoadController implements Composer { private IOrderPlanningGate planningControllerEntryPoints; + @Autowired + private IResourcesSearcher resourcesSearcher; + public ResourceLoadController() { } @@ -265,7 +269,7 @@ public class ResourceLoadController implements Composer { result.add(filterTypeChanger); result.add(new ByDatesFilter(onChange, filterBy)); WorkersOrCriteriaBandbox bandbox = new WorkersOrCriteriaBandbox( - onChange, filterBy, filterTypeChanger); + onChange, filterBy, filterTypeChanger, resourcesSearcher); result.add(bandbox); result.add(new ByNamePaginator(onChange, filterBy, filterTypeChanger, bandbox)); @@ -501,10 +505,13 @@ public class ResourceLoadController implements Composer { private List entitiesSelected = null; + private final IResourcesSearcher resourcesSearcher; + private WorkersOrCriteriaBandbox(Runnable onChange, - PlanningState filterBy, - FilterTypeChanger filterType) { + PlanningState filterBy, FilterTypeChanger filterType, + IResourcesSearcher resourcesSearcher) { super(onChange, filterBy, filterType); + this.resourcesSearcher = resourcesSearcher; } @Override @@ -563,14 +570,33 @@ public class ResourceLoadController implements Composer { parameters.clearResourcesToShow(); parameters.clearCriteriaToShow(); } else if (isFilteringByResource()) { - parameters.setResourcesToShow(as(Resource.class, - entitiesSelected)); + parameters.setResourcesToShow(calculateResourcesToShow()); } else { parameters.setCriteriaToShow(as(Criterion.class, entitiesSelected)); } } + private List calculateResourcesToShow() { + List resources = new ArrayList(); + List criteria = new ArrayList(); + + for (Object each : entitiesSelected) { + if (each instanceof Resource) { + resources.add((Resource) each); + } else { + criteria.add((Criterion) each); + } + } + + if (!criteria.isEmpty()) { + resources.addAll(resourcesSearcher.searchBoth() + .byCriteria(criteria).execute()); + } + + return resources; + } + public boolean hasEntitiesSelected() { return entitiesSelected != null && !entitiesSelected.isEmpty(); } From 92d606ed6d2de389ffdc5060f1597b4b5d56e21a Mon Sep 17 00:00:00 2001 From: Manuel Rego Casasnovas Date: Wed, 11 Apr 2012 19:44:53 +0200 Subject: [PATCH 006/108] Rename WorkerMultipleFiltersFinder to ResourceFilterEnumByResourceAndCriterion This filter now works for any kind of resource and not only workers, that's the main reason to rename the class. Also the enum WorkerFilterEnum is renamed to ResourceFilterEnumByResourceAndCriterion. FEA: ItEr76S23ImproveFilteringArea --- ...java => ResourceFilterEnumByResourceAndCriterion.java} | 4 ++-- ...ourceMultipleFiltersFinderByResourceAndCriterion.java} | 8 ++++---- .../web/resourceload/ResourceLoadController.java | 2 +- .../src/main/resources/libreplan-webapp-spring-config.xml | 2 +- 4 files changed, 8 insertions(+), 8 deletions(-) rename libreplan-webapp/src/main/java/org/libreplan/web/common/components/finders/{WorkerFilterEnum.java => ResourceFilterEnumByResourceAndCriterion.java} (89%) rename libreplan-webapp/src/main/java/org/libreplan/web/common/components/finders/{WorkerMultipleFiltersFinder.java => ResourceMultipleFiltersFinderByResourceAndCriterion.java} (95%) diff --git a/libreplan-webapp/src/main/java/org/libreplan/web/common/components/finders/WorkerFilterEnum.java b/libreplan-webapp/src/main/java/org/libreplan/web/common/components/finders/ResourceFilterEnumByResourceAndCriterion.java similarity index 89% rename from libreplan-webapp/src/main/java/org/libreplan/web/common/components/finders/WorkerFilterEnum.java rename to libreplan-webapp/src/main/java/org/libreplan/web/common/components/finders/ResourceFilterEnumByResourceAndCriterion.java index a22a8d2b2..13e752167 100644 --- a/libreplan-webapp/src/main/java/org/libreplan/web/common/components/finders/WorkerFilterEnum.java +++ b/libreplan-webapp/src/main/java/org/libreplan/web/common/components/finders/ResourceFilterEnumByResourceAndCriterion.java @@ -26,7 +26,7 @@ import org.libreplan.business.resources.entities.Resource; * * @author Manuel Rego Casasnovas */ -public enum WorkerFilterEnum implements IFilterEnum { +public enum ResourceFilterEnumByResourceAndCriterion implements IFilterEnum { RESOURCE(_("Resource")), CRITERION(_("Criterion")); @@ -39,7 +39,7 @@ public enum WorkerFilterEnum implements IFilterEnum { private String description; - private WorkerFilterEnum(String description) { + private ResourceFilterEnumByResourceAndCriterion(String description) { this.description = description; } diff --git a/libreplan-webapp/src/main/java/org/libreplan/web/common/components/finders/WorkerMultipleFiltersFinder.java b/libreplan-webapp/src/main/java/org/libreplan/web/common/components/finders/ResourceMultipleFiltersFinderByResourceAndCriterion.java similarity index 95% rename from libreplan-webapp/src/main/java/org/libreplan/web/common/components/finders/WorkerMultipleFiltersFinder.java rename to libreplan-webapp/src/main/java/org/libreplan/web/common/components/finders/ResourceMultipleFiltersFinderByResourceAndCriterion.java index 179f01865..82b93706f 100644 --- a/libreplan-webapp/src/main/java/org/libreplan/web/common/components/finders/WorkerMultipleFiltersFinder.java +++ b/libreplan-webapp/src/main/java/org/libreplan/web/common/components/finders/ResourceMultipleFiltersFinderByResourceAndCriterion.java @@ -41,12 +41,12 @@ import org.springframework.beans.factory.annotation.Autowired; * * @author Manuel Rego Casasnovas */ -public class WorkerMultipleFiltersFinder extends MultipleFiltersFinder { +public class ResourceMultipleFiltersFinderByResourceAndCriterion extends MultipleFiltersFinder { @Autowired private PredefinedDatabaseSnapshots databaseSnapshots; - protected WorkerMultipleFiltersFinder() { + protected ResourceMultipleFiltersFinderByResourceAndCriterion() { } @Override @@ -79,7 +79,7 @@ public class WorkerMultipleFiltersFinder extends MultipleFiltersFinder { private void addResource(Class className, Resource resource) { String pattern = resource.getName(); getListMatching().add( - new FilterPair(WorkerFilterEnum.RESOURCE, className + new FilterPair(ResourceFilterEnumByResourceAndCriterion.RESOURCE, className .getSimpleName(), pattern, resource)); } @@ -105,7 +105,7 @@ public class WorkerMultipleFiltersFinder extends MultipleFiltersFinder { private void addCriterion(CriterionType type, Criterion criterion) { String pattern = criterion.getName() + " ( " + type.getName() + " )"; getListMatching().add( - new FilterPair(WorkerFilterEnum.CRITERION, type + new FilterPair(ResourceFilterEnumByResourceAndCriterion.CRITERION, type .getResource().toLowerCase(), pattern, criterion)); } diff --git a/libreplan-webapp/src/main/java/org/libreplan/web/resourceload/ResourceLoadController.java b/libreplan-webapp/src/main/java/org/libreplan/web/resourceload/ResourceLoadController.java index e764bb1c5..d35028fdd 100644 --- a/libreplan-webapp/src/main/java/org/libreplan/web/resourceload/ResourceLoadController.java +++ b/libreplan-webapp/src/main/java/org/libreplan/web/resourceload/ResourceLoadController.java @@ -549,7 +549,7 @@ public class ResourceLoadController implements Composer { private String getFinderToUse() { if (isFilteringByResource()) { - return "workerMultipleFiltersFinder"; + return "resourceMultipleFiltersFinderByResourceAndCriterion"; } else { return "criterionMultipleFiltersFinder"; } diff --git a/libreplan-webapp/src/main/resources/libreplan-webapp-spring-config.xml b/libreplan-webapp/src/main/resources/libreplan-webapp-spring-config.xml index 5a4eba029..42a3cbd6e 100644 --- a/libreplan-webapp/src/main/resources/libreplan-webapp-spring-config.xml +++ b/libreplan-webapp/src/main/resources/libreplan-webapp-spring-config.xml @@ -41,7 +41,7 @@ - + From 06b4899bb0f4e11c52fd87e9bfd4e22f4a9caf69 Mon Sep 17 00:00:00 2001 From: Manuel Rego Casasnovas Date: Fri, 13 Apr 2012 08:02:20 +0200 Subject: [PATCH 007/108] Bug #1395: Fix issue setting width of date boxes to 100px FEA: ItEr76S04BugFixing --- .../libreplan/web/resourceload/ResourceLoadController.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libreplan-webapp/src/main/java/org/libreplan/web/resourceload/ResourceLoadController.java b/libreplan-webapp/src/main/java/org/libreplan/web/resourceload/ResourceLoadController.java index d35028fdd..b0f35b7e2 100644 --- a/libreplan-webapp/src/main/java/org/libreplan/web/resourceload/ResourceLoadController.java +++ b/libreplan-webapp/src/main/java/org/libreplan/web/resourceload/ResourceLoadController.java @@ -429,7 +429,7 @@ public class ResourceLoadController implements Composer { Label label1 = new Label(_("Time filter") + ":"); Label label2 = new Label("-"); startBox.setValue(asDate(startDateValue)); - startBox.setWidth("75px"); + startBox.setWidth("100px"); startBox.addEventListener(Events.ON_CHANGE, new EventListener() { @Override public void onEvent(Event event) { @@ -441,7 +441,7 @@ public class ResourceLoadController implements Composer { } }); endBox.setValue(asDate(endDateValue)); - endBox.setWidth("75px"); + endBox.setWidth("100px"); endBox.addEventListener(Events.ON_CHANGE, new EventListener() { @Override public void onEvent(Event event) { From b33e72e0799e7161ec00a180f25df4285245df79 Mon Sep 17 00:00:00 2001 From: Manuel Rego Casasnovas Date: Fri, 13 Apr 2012 08:49:20 +0200 Subject: [PATCH 008/108] Make coherent behavior of bandbox with the rest of elements in the filtering bar When the user selects changes any element, the filter is applied without having to use the filter button. Once this is also working for the bandbox, the filter button has no sense anymore so it has been removed.a FEA: ItEr76S23ImproveFilteringArea --- .../bandboxsearch/BandboxMultipleSearch.java | 11 ++++++++-- .../resourceload/ResourceLoadController.java | 20 +++++++------------ 2 files changed, 16 insertions(+), 15 deletions(-) diff --git a/libreplan-webapp/src/main/java/org/libreplan/web/common/components/bandboxsearch/BandboxMultipleSearch.java b/libreplan-webapp/src/main/java/org/libreplan/web/common/components/bandboxsearch/BandboxMultipleSearch.java index 96d83463e..435bd97dd 100644 --- a/libreplan-webapp/src/main/java/org/libreplan/web/common/components/bandboxsearch/BandboxMultipleSearch.java +++ b/libreplan-webapp/src/main/java/org/libreplan/web/common/components/bandboxsearch/BandboxMultipleSearch.java @@ -3,7 +3,7 @@ * * Copyright (C) 2009-2010 Fundación para o Fomento da Calidade Industrial e * Desenvolvemento Tecnolóxico de Galicia - * Copyright (C) 2010-2011 Igalia, S.L. + * Copyright (C) 2010-2012 Igalia, S.L. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as published by @@ -53,9 +53,15 @@ import org.zkoss.zul.SimpleListModel; import org.zkoss.zul.api.Listbox; /** + * {@link Bandbox} allowing to choose more than one element from the drop down + * list separating them by ";".
+ * + * When an element is selected {@link Events.ON_CHANGE} event over this + * component is launched. + * * @author Susana Montes Pedreira + * @author Manuel Rego Casasnovas */ - @SuppressWarnings("serial") public class BandboxMultipleSearch extends HtmlMacroComponent { @@ -168,6 +174,7 @@ public class BandboxMultipleSearch extends HtmlMacroComponent { } } bandbox.close(); + Events.postEvent(Events.ON_CHANGE, this, null); } private void searchMultipleFilters() { diff --git a/libreplan-webapp/src/main/java/org/libreplan/web/resourceload/ResourceLoadController.java b/libreplan-webapp/src/main/java/org/libreplan/web/resourceload/ResourceLoadController.java index b0f35b7e2..2d490586b 100644 --- a/libreplan-webapp/src/main/java/org/libreplan/web/resourceload/ResourceLoadController.java +++ b/libreplan-webapp/src/main/java/org/libreplan/web/resourceload/ResourceLoadController.java @@ -3,7 +3,7 @@ * * Copyright (C) 2009-2010 Fundación para o Fomento da Calidade Industrial e * Desenvolvemento Tecnolóxico de Galicia - * Copyright (C) 2010-2011 Igalia, S.L. + * Copyright (C) 2010-2012 Igalia, S.L. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as published by @@ -81,7 +81,6 @@ import org.zkoss.zk.ui.event.Event; import org.zkoss.zk.ui.event.EventListener; import org.zkoss.zk.ui.event.Events; import org.zkoss.zk.ui.util.Composer; -import org.zkoss.zul.Button; import org.zkoss.zul.Comboitem; import org.zkoss.zul.Datebox; import org.zkoss.zul.Hbox; @@ -96,7 +95,9 @@ import org.zkoss.zul.api.Combobox; /** * Controller for global resourceload view + * * @author Óscar González Fernández + * @author Manuel Rego Casasnovas */ @Component @Scope(BeanDefinition.SCOPE_PROTOTYPE) @@ -522,29 +523,22 @@ public class ResourceLoadController implements Composer { panel.setSecondOptionalFilter(buildBandboxFilterer()); } - private Hbox buildBandboxFilterer() { + private BandboxMultipleSearch buildBandboxFilterer() { bandBox.setId("workerBandboxMultipleSearch"); bandBox.setWidthBandbox("185px"); bandBox.setWidthListbox("450px"); bandBox.setFinder(getFinderToUse()); bandBox.afterCompose(); - Button button = new Button(); - button.setImage("/common/img/ico_filter.png"); - button.setTooltip(_("Filter by worker")); - button.addEventListener(Events.ON_CLICK, new EventListener() { + bandBox.addEventListener(Events.ON_CHANGE, new EventListener() { @Override - public void onEvent(Event event) { + public void onEvent(Event event) throws Exception { entitiesSelected = getSelected(); notifyChange(); } }); - Hbox hbox = new Hbox(); - hbox.appendChild(bandBox); - hbox.appendChild(button); - hbox.setAlign("center"); - return hbox; + return bandBox; } private String getFinderToUse() { From 41610cad2b5b6667c31aa83ec09289bd82cfb19d Mon Sep 17 00:00:00 2001 From: Manuel Rego Casasnovas Date: Fri, 13 Apr 2012 09:50:43 +0200 Subject: [PATCH 009/108] Change the order and labels of the filtering area FEA: ItEr76S23ImproveFilteringArea --- .../resourceload/ResourcesLoadPanel.java | 4 +-- .../web/ganttz/zul/resourcesLoadLayout.zul | 12 +++---- .../resourceload/ResourceLoadController.java | 31 +++++++++++++++---- 3 files changed, 33 insertions(+), 14 deletions(-) diff --git a/ganttzk/src/main/java/org/zkoss/ganttz/resourceload/ResourcesLoadPanel.java b/ganttzk/src/main/java/org/zkoss/ganttz/resourceload/ResourcesLoadPanel.java index 70e87e7e7..5df22d59b 100644 --- a/ganttzk/src/main/java/org/zkoss/ganttz/resourceload/ResourcesLoadPanel.java +++ b/ganttzk/src/main/java/org/zkoss/ganttz/resourceload/ResourcesLoadPanel.java @@ -86,8 +86,8 @@ public class ResourcesLoadPanel extends HtmlMacroComponent { private Listbox listZoomLevels; - private final String FILTER_RESOURCES = _("by resources"); - private final String FILTER_CRITERIA = _("by criteria"); + private final String FILTER_RESOURCES = _("Resources"); + private final String FILTER_CRITERIA = _("Generic allocation criteria"); private String feedBackMessage; private Boolean filterbyResources; diff --git a/ganttzk/src/main/resources/web/ganttz/zul/resourcesLoadLayout.zul b/ganttzk/src/main/resources/web/ganttz/zul/resourcesLoadLayout.zul index c8c5bc61c..436004528 100644 --- a/ganttzk/src/main/resources/web/ganttz/zul/resourcesLoadLayout.zul +++ b/ganttzk/src/main/resources/web/ganttz/zul/resourcesLoadLayout.zul @@ -40,17 +40,17 @@ resourcesLoadPanel = self; - ${ganttzk_i18n:_('Show')}: - ${ganttzk_i18n:_('Page')}: + + + ${ganttzk_i18n:_('Group by')}: + - - - diff --git a/libreplan-webapp/src/main/java/org/libreplan/web/resourceload/ResourceLoadController.java b/libreplan-webapp/src/main/java/org/libreplan/web/resourceload/ResourceLoadController.java index 2d490586b..5734ab57b 100644 --- a/libreplan-webapp/src/main/java/org/libreplan/web/resourceload/ResourceLoadController.java +++ b/libreplan-webapp/src/main/java/org/libreplan/web/resourceload/ResourceLoadController.java @@ -427,8 +427,6 @@ public class ResourceLoadController implements Composer { } private Hbox buildTimeFilter() { - Label label1 = new Label(_("Time filter") + ":"); - Label label2 = new Label("-"); startBox.setValue(asDate(startDateValue)); startBox.setWidth("100px"); startBox.addEventListener(Events.ON_CHANGE, new EventListener() { @@ -454,9 +452,9 @@ public class ResourceLoadController implements Composer { } }); Hbox hbox = new Hbox(); - hbox.appendChild(label1); + hbox.appendChild(new Label(_("From") + ":")); hbox.appendChild(startBox); - hbox.appendChild(label2); + hbox.appendChild(new Label(_("To") + ":")); hbox.appendChild(endBox); hbox.setAlign("center"); return hbox; @@ -508,6 +506,8 @@ public class ResourceLoadController implements Composer { private final IResourcesSearcher resourcesSearcher; + private Label label = new Label(); + private WorkersOrCriteriaBandbox(Runnable onChange, PlanningState filterBy, FilterTypeChanger filterType, IResourcesSearcher resourcesSearcher) { @@ -523,7 +523,7 @@ public class ResourceLoadController implements Composer { panel.setSecondOptionalFilter(buildBandboxFilterer()); } - private BandboxMultipleSearch buildBandboxFilterer() { + private Hbox buildBandboxFilterer() { bandBox.setId("workerBandboxMultipleSearch"); bandBox.setWidthBandbox("185px"); bandBox.setWidthListbox("450px"); @@ -538,7 +538,25 @@ public class ResourceLoadController implements Composer { } }); - return bandBox; + Hbox hbox = new Hbox(); + hbox.appendChild(getLabel()); + hbox.appendChild(bandBox); + hbox.setAlign("center"); + + return hbox; + } + + private Label getLabel() { + updateLabelValue(); + return label; + } + + private void updateLabelValue() { + if (isFilteringByResource()) { + label.setValue(_("Resources or criteria") + ":"); + } else { + label.setValue(_("Criteria") + ":"); + } } private String getFinderToUse() { @@ -556,6 +574,7 @@ public class ResourceLoadController implements Composer { } entitiesSelected = null; bandBox.setFinder(getFinderToUse()); + updateLabelValue(); } @Override From b698d0fa1e41a1e8008671e6806a60d3c2fc4802 Mon Sep 17 00:00:00 2001 From: Manuel Rego Casasnovas Date: Fri, 13 Apr 2012 15:45:38 +0200 Subject: [PATCH 010/108] Add new compilation option to disable default users (user, wsreader and wswriter) A new Maven property has been added to disable the default users. This property is enabled by default except for the "dev" profile. You can manually specify the property with the following argument: -Ddefault.exampleUsersDisabled=false FEA: ItEr76S04BugFixing --- .../business/common/Configuration.java | 35 +++++++++++++++---- .../libreplan-business-spring-config.xml | 5 ++- .../web/users/bootstrap/MandatoryUser.java | 32 ++++++++++++----- .../users/bootstrap/UsersBootstrapInDB.java | 12 ++++--- pom.xml | 4 +++ 5 files changed, 68 insertions(+), 20 deletions(-) diff --git a/libreplan-business/src/main/java/org/libreplan/business/common/Configuration.java b/libreplan-business/src/main/java/org/libreplan/business/common/Configuration.java index c7b66b0bb..49a2e7db2 100644 --- a/libreplan-business/src/main/java/org/libreplan/business/common/Configuration.java +++ b/libreplan-business/src/main/java/org/libreplan/business/common/Configuration.java @@ -2,6 +2,7 @@ * This file is part of LibrePlan * * Copyright (C) 2010-2011 Wireless Galicia, S.L. + * Copyright (C) 2012 Igalia, S.L. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as published by @@ -19,24 +20,29 @@ package org.libreplan.business.common; -import org.libreplan.business.common.daos.IConfigurationDAO; -import org.springframework.beans.factory.annotation.Autowired; +import org.apache.commons.lang.BooleanUtils; + /** - * It contains the compiling option to disable the warning changing default - * password and implements of singleton pattern. + * This is a singleton that contains the compilation options passed from Maven. + * + * Currently we have two options: + *
    + *
  • Enable/Disable the warning changing default password
  • + *
  • Enable/Disable default users (such as user, wsreader and wswriter)
  • + *
* * @author Susana Montes Pedreira + * @author Manuel Rego Casasnovas */ public class Configuration { private static final Configuration singleton = new Configuration(); - @Autowired - private IConfigurationDAO configurationDAO; - private Boolean defaultPasswordsControl; + private Boolean exampleUsersDisabled; + private Configuration() { } @@ -61,4 +67,19 @@ public class Configuration { return defaultPasswordsControl; } + public void setExampleUsersDisabled(Boolean exampleUsersDisabled) { + this.exampleUsersDisabled = exampleUsersDisabled; + } + + public Boolean getExampleUsersDisabled() { + return exampleUsersDisabled; + } + + /** + * Returns the value of example users disabled compilation option + */ + public static boolean isExampleUsersDisabled() { + return BooleanUtils.isNotFalse(singleton.getExampleUsersDisabled()); + } + } diff --git a/libreplan-business/src/main/resources/libreplan-business-spring-config.xml b/libreplan-business/src/main/resources/libreplan-business-spring-config.xml index b3f6ee43a..99f32cb1b 100644 --- a/libreplan-business/src/main/resources/libreplan-business-spring-config.xml +++ b/libreplan-business/src/main/resources/libreplan-business-spring-config.xml @@ -141,7 +141,10 @@ factory-method="getInstance" lazy-init="false"> - ${default.passwordsControl} + ${default.passwordsControl} + + + ${default.exampleUsersDisabled}
diff --git a/libreplan-webapp/src/main/java/org/libreplan/web/users/bootstrap/MandatoryUser.java b/libreplan-webapp/src/main/java/org/libreplan/web/users/bootstrap/MandatoryUser.java index 3e87b7628..ff5bfcd4d 100644 --- a/libreplan-webapp/src/main/java/org/libreplan/web/users/bootstrap/MandatoryUser.java +++ b/libreplan-webapp/src/main/java/org/libreplan/web/users/bootstrap/MandatoryUser.java @@ -28,19 +28,25 @@ import java.util.EnumSet; import java.util.HashSet; import java.util.Set; +import org.libreplan.business.common.Configuration; import org.libreplan.business.common.Registry; -import org.libreplan.business.common.entities.Configuration; import org.libreplan.business.common.exceptions.InstanceNotFoundException; import org.libreplan.business.users.entities.UserRole; /** - * It enumerates the mandatory users (login names) for running the application. + * It enumerates the mandatory users (login names) for running the application.
+ * + * ADMIN user will be always enabled, however USER, + * WSREADER and WSWRITER could be disabled in + * copilation time with a Maven option specified via {@link Configuration} + * class. * * @author Fernando Bellas Permuy + * @author Manuel Rego Casasnovas */ public enum MandatoryUser { - USER(new ArrayList()) { + USER(new ArrayList(), Configuration.isExampleUsersDisabled()) { @Override public boolean hasChangedDefaultPassword() { return getConfiguration().getChangedDefaultUserPassword(); @@ -49,20 +55,22 @@ public enum MandatoryUser { ADMIN(Arrays.asList(UserRole.ROLE_ADMINISTRATION, UserRole.ROLE_READ_ALL_ORDERS, UserRole.ROLE_EDIT_ALL_ORDERS, - UserRole.ROLE_CREATE_ORDER)) { + UserRole.ROLE_CREATE_ORDER), false) { @Override public boolean hasChangedDefaultPassword() { return getConfiguration().getChangedDefaultAdminPassword(); } }, - WSREADER(Arrays.asList(UserRole.ROLE_WS_READER)) { + WSREADER(Arrays.asList(UserRole.ROLE_WS_READER), Configuration + .isExampleUsersDisabled()) { @Override public boolean hasChangedDefaultPassword() { return getConfiguration().getChangedDefaultWsreaderPassword(); } }, - WSWRITER(Arrays.asList(UserRole.ROLE_WS_READER, UserRole.ROLE_WS_WRITER)) { + WSWRITER(Arrays.asList(UserRole.ROLE_WS_READER, UserRole.ROLE_WS_WRITER), + Configuration.isExampleUsersDisabled()) { @Override public boolean hasChangedDefaultPassword() { return getConfiguration().getChangedDefaultWswriterPassword(); @@ -84,15 +92,23 @@ public enum MandatoryUser { return false; } - private static Configuration getConfiguration() { + private static org.libreplan.business.common.entities.Configuration getConfiguration() { return Registry.getConfigurationDAO() .getConfigurationWithReadOnlyTransaction(); } private Set initialRoles; - private MandatoryUser(Collection initialUserRoles) { + private final boolean userDisabled; + + private MandatoryUser(Collection initialUserRoles, + boolean userDisabled) { this.initialRoles = new HashSet(initialUserRoles); + this.userDisabled = userDisabled; + } + + public boolean isUserDisabled() { + return userDisabled; } public boolean hasChangedDefaultPasswordOrDisabled() { diff --git a/libreplan-webapp/src/main/java/org/libreplan/web/users/bootstrap/UsersBootstrapInDB.java b/libreplan-webapp/src/main/java/org/libreplan/web/users/bootstrap/UsersBootstrapInDB.java index 3317461df..e7c518384 100644 --- a/libreplan-webapp/src/main/java/org/libreplan/web/users/bootstrap/UsersBootstrapInDB.java +++ b/libreplan-webapp/src/main/java/org/libreplan/web/users/bootstrap/UsersBootstrapInDB.java @@ -3,7 +3,7 @@ * * Copyright (C) 2009-2010 Fundación para o Fomento da Calidade Industrial e * Desenvolvemento Tecnolóxico de Galicia - * Copyright (C) 2010-2011 Igalia, S.L. + * Copyright (C) 2010-2012 Igalia, S.L. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as published by @@ -28,7 +28,10 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.transaction.annotation.Transactional; /** + * Bootstrapt to create the default {@link User}s. + * * @author Fernando Bellas Permuy + * @author Manuel Rego Casasnovas */ @Transactional public class UsersBootstrapInDB implements IUsersBootstrapInDB { @@ -57,10 +60,11 @@ public class UsersBootstrapInDB implements IUsersBootstrapInDB { private void createUserIfNotExists(MandatoryUser u) { if (!userDAO.existsByLoginName(u.getLoginName())) { + User user = User.create(u.getLoginName(), getEncodedPassword(u), + u.getInitialRoles()); + user.setDisabled(u.isUserDisabled()); - userDAO.save(User.create(u.getLoginName(), getEncodedPassword(u), - u.getInitialRoles())); - + userDAO.save(user); } } diff --git a/pom.xml b/pom.xml index 80075596d..fa1c33809 100644 --- a/pom.xml +++ b/pom.xml @@ -36,6 +36,7 @@ public. true + true + false From 49affa61cba781dc3090c762c09c5a244ef62c13 Mon Sep 17 00:00:00 2001 From: Manuel Rego Casasnovas Date: Fri, 13 Apr 2012 16:17:14 +0200 Subject: [PATCH 011/108] doc: Update HACKING file about the compilation options FEA: ItEr76S03Community --- HACKING | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/HACKING b/HACKING index 30aa2b9a4..64335ee0e 100644 --- a/HACKING +++ b/HACKING @@ -351,6 +351,44 @@ command. For example: mvn -Pprod,postgresql clean install +Compilation options +------------------- + +In LibrePlan there are two custom Maven properties, which allow you to configure +some small bits in the project. + +* *default.passwordsControl* - Warning about default passwords (``true`` by + default) + + If this option is enabled, a warning is show in LibrePlan footer to + application administrators in order to change the default password (which + matches with user login) for the users created by default: admin, user, + wsreader and wswriter. + +* *default.exampleUsersDisabled* - Disable default users (``true`` by default) + + If true, example default users such as user, wsreader and wswriter are + disabled. This is a good option for production environments. + + This option is set to ``false`` if you are using the development profile (the + default one). + +How to set compilation options +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Maven properties have a default value, but you can change it using the parameter +``-D`` for Maven command to set the value of each option you want to modify. For +example: + +* Set *default.passwordsControl* to ``false``:: + + mvn -Ddefault.passwordsControl=false clean install + +* Set *default.passwordsControl* and *default.exampleUsersDisabled* to false:: + + mvn -Ddefault.passwordsControl=false -Ddefault.exampleUsersDisabled=false clean install + + Tests ----- From 72f9f878d67c4f0d04723030a94eb9bd0078f31e Mon Sep 17 00:00:00 2001 From: Philippe Poumaroux Date: Fri, 13 Apr 2012 16:54:23 +0200 Subject: [PATCH 012/108] i18n: Update French translation --- ganttzk/src/main/resources/i18n/fr.po | 56 +- .../src/main/resources/i18n/fr.po | 579 ++++++++++-------- 2 files changed, 351 insertions(+), 284 deletions(-) diff --git a/ganttzk/src/main/resources/i18n/fr.po b/ganttzk/src/main/resources/i18n/fr.po index acc323409..724947d76 100644 --- a/ganttzk/src/main/resources/i18n/fr.po +++ b/ganttzk/src/main/resources/i18n/fr.po @@ -8,10 +8,10 @@ # Philippe Poumaroux , 2012. msgid "" msgstr "" -"Project-Id-Version: 1.2.1\n" +"Project-Id-Version: libreplan-1.2.3\n" "Report-Msgid-Bugs-To: http://bugs.libreplan.org/\n" -"POT-Creation-Date: 2012-01-13 16:49+0100\n" -"PO-Revision-Date: 2012-01-23 12:36+0000\n" +"POT-Creation-Date: 2012-04-11 08:32+0200\n" +"PO-Revision-Date: 2012-04-11 12:30+0000\n" "Last-Translator: Philippe Poumaroux \n" "Language-Team: Français\n" "MIME-Version: 1.0\n" @@ -20,12 +20,12 @@ msgstr "" "Language: fr\n" "Plural-Forms: nplurals=2; plural=(n > 1)\n" -#: ganttzk/src/main/java/org/zkoss/ganttz/DependencyList.java:215 -#: ganttzk/src/main/java/org/zkoss/ganttz/DependencyList.java:234 +#: ganttzk/src/main/java/org/zkoss/ganttz/DependencyList.java:216 +#: ganttzk/src/main/java/org/zkoss/ganttz/DependencyList.java:235 msgid "Erase" msgstr "Supprimer" -#: ganttzk/src/main/java/org/zkoss/ganttz/TaskList.java:300 +#: ganttzk/src/main/java/org/zkoss/ganttz/TaskList.java:299 msgid "Add Dependency" msgstr "Ajouter une dépendance" @@ -33,11 +33,15 @@ msgstr "Ajouter une dépendance" msgid "Worker" msgstr "Travailleur" +#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:682 +msgid "Show money cost bar" +msgstr "Afficher la barre de coût monétaire" + #: ganttzk/src/main/resources/web/ganttz/zul/leftTasksTree.zul:29 msgid "Start" msgstr "Début" -#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:635 +#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:661 msgid "Show reported hours" msgstr "Afficher les heures comptabilisées" @@ -62,7 +66,7 @@ msgstr "Ressources bloquantes" msgid "The specified dependency is not allowed" msgstr "La dépendance indiquée n'est pas disponible" -#: ganttzk/src/main/java/org/zkoss/ganttz/DependencyList.java:254 +#: ganttzk/src/main/java/org/zkoss/ganttz/DependencyList.java:255 msgid "Set End-End" msgstr "Faire correspondre les achèvements" @@ -86,6 +90,10 @@ msgstr "investissement disponible: {0}, investissement affecté: {1}" msgid "Criterion" msgstr "Critère" +#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:688 +msgid "Hide money cost bar" +msgstr "Masquer la barre de coût monétaire" + #: ganttzk/src/main/resources/web/ganttz/zul/plannerLayout.zul:44 msgid "Print" msgstr "Imprimer" @@ -114,6 +122,10 @@ msgstr "Fin" msgid "changing zoom" msgstr "Changer le zoom" +#: ganttzk/src/main/resources/web/ganttz/zul/plannerLayout.zul:91 +msgid "Show/Hide money cost bar" +msgstr "Afficher/Masquer la barre de coût monétaire" + #: ganttzk/src/main/java/org/zkoss/ganttz/timetracker/zoom/ZoomLevel.java:45 msgid "Quarter" msgstr "Trimestre" @@ -139,7 +151,7 @@ msgstr "Nom" msgid "Name filter" msgstr "Filtre par nom" -#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:615 +#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:641 msgid "Show progress" msgstr "Monter l'avancement" @@ -151,14 +163,14 @@ msgstr "Déplier/Replier tout" msgid "Show/Hide critical path" msgstr "Montrer/Cacher le chemin critique" -#: ganttzk/src/main/java/org/zkoss/ganttz/timetracker/zoom/ZoomLevel.java:32 -msgid "Year" -msgstr "Année" - #: ganttzk/src/main/java/org/zkoss/ganttz/resourceload/ResourcesLoadPanel.java:150 msgid "showing criteria" msgstr "Montrer les critères" +#: ganttzk/src/main/java/org/zkoss/ganttz/timetracker/zoom/ZoomLevel.java:32 +msgid "Year" +msgstr "Année" + #: ganttzk/src/main/java/org/zkoss/ganttz/timetracker/zoom/ZoomLevel.java:58 msgid "Month" msgstr "Mois" @@ -167,15 +179,15 @@ msgstr "Mois" msgid "Show/Hide resources" msgstr "Montrer/Cacher les ressources" -#: ganttzk/src/main/java/org/zkoss/ganttz/DependencyList.java:246 +#: ganttzk/src/main/java/org/zkoss/ganttz/DependencyList.java:247 msgid "Set End-Start" msgstr "Ajuster le début sur la fin" -#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:297 +#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:308 msgid "decreasing zoom" msgstr "réduire le zoom" -#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:596 +#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:622 msgid "Hide critical path" msgstr "Cacher le chemin critique" @@ -183,7 +195,7 @@ msgstr "Cacher le chemin critique" msgid "Day" msgstr "Jour" -#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:642 +#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:668 msgid "Hide reported hours" msgstr "Cacher les heures comptabilisées" @@ -204,11 +216,11 @@ msgid "Hour" msgstr "Heure" #: ganttzk/src/main/resources/web/ganttz/zul/resourcesLoadLayout.zul:90 -#: ganttzk/src/main/resources/web/ganttz/zul/plannerLayout.zul:114 +#: ganttzk/src/main/resources/web/ganttz/zul/plannerLayout.zul:120 msgid "Graphics" msgstr "Graphiques" -#: ganttzk/src/main/java/org/zkoss/ganttz/DependencyList.java:250 +#: ganttzk/src/main/java/org/zkoss/ganttz/DependencyList.java:251 msgid "Set Start-Start" msgstr "Ajuster sur le début" @@ -216,7 +228,7 @@ msgstr "Ajuster sur le début" msgid "See resource allocation" msgstr "Voir l'allocation des ressources" -#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:280 +#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:291 msgid "increasing zoom" msgstr "augmenter le zoom" @@ -232,10 +244,10 @@ msgstr "Tout" msgid "Refresh" msgstr "Rafraîchir" -#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:591 +#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:617 msgid "Show critical path" msgstr "Montrer le chemin critique" -#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:620 +#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:646 msgid "Hide progress" msgstr "Cacher l'avancement" diff --git a/libreplan-webapp/src/main/resources/i18n/fr.po b/libreplan-webapp/src/main/resources/i18n/fr.po index bc4f57b68..d2e69db69 100644 --- a/libreplan-webapp/src/main/resources/i18n/fr.po +++ b/libreplan-webapp/src/main/resources/i18n/fr.po @@ -10,10 +10,10 @@ # Philippe Poumaroux , 2012. msgid "" msgstr "" -"Project-Id-Version: 1.2.2\n" +"Project-Id-Version: libreplan-1.2.3\n" "Report-Msgid-Bugs-To: http://bugs.libreplan.org/\n" -"POT-Creation-Date: 2012-02-24 09:08+0100\n" -"PO-Revision-Date: 2012-02-24 13:15+0000\n" +"POT-Creation-Date: 2012-04-11 08:32+0200\n" +"PO-Revision-Date: 2012-04-11 12:29+0000\n" "Last-Translator: Philippe Poumaroux \n" "Language-Team: Français\n" "MIME-Version: 1.0\n" @@ -152,7 +152,7 @@ msgstr "Cela ne peut être vide" #: libreplan-webapp/src/main/java/org/libreplan/web/common/CustomMenuController.java:324 #: libreplan-webapp/src/main/webapp/materials/materials.zul:33 -#: libreplan-webapp/src/main/webapp/templates/templates.zul:66 +#: libreplan-webapp/src/main/webapp/templates/templates.zul:67 #: libreplan-webapp/src/main/webapp/templates/_editTemplateWindow.zul:52 #: libreplan-webapp/src/main/webapp/templates/_materialAssignmentsBox.zul:22 #: libreplan-webapp/src/main/webapp/orders/_editOrderElement.zul:54 @@ -161,7 +161,7 @@ msgstr "Cela ne peut être vide" msgid "Materials" msgstr "Matériels" -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/reassign/ReassignCommand.java:361 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/reassign/ReassignCommand.java:357 msgid "Reassign" msgstr "Réaffecter" @@ -202,7 +202,7 @@ msgstr "Prédéfini" #: libreplan-webapp/src/main/java/org/libreplan/web/qualityforms/QualityFormCRUDController.java:344 #: libreplan-webapp/src/main/java/org/libreplan/web/common/CustomMenuController.java:325 -#: libreplan-webapp/src/main/webapp/templates/templates.zul:67 +#: libreplan-webapp/src/main/webapp/templates/templates.zul:68 #: libreplan-webapp/src/main/webapp/templates/_editTemplateWindow.zul:53 msgid "Quality Forms" msgstr "Formulaires qualité" @@ -211,11 +211,15 @@ msgstr "Formulaires qualité" msgid "Reports" msgstr "Rapports" +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/assigntemplates/TemplateFinderPopup.java:117 +msgid "Create task" +msgstr "Créer une tâche" + #: libreplan-webapp/src/main/webapp/planner/advance_allocation.zul:22 msgid "LibrePlan: Advanced allocation" msgstr "LibrePlan: Allocation avancée" -#: libreplan-webapp/src/main/java/org/libreplan/web/common/ConfigurationModel.java:172 +#: libreplan-webapp/src/main/java/org/libreplan/web/common/ConfigurationModel.java:177 msgid "The {0} sequence prefixes can not be repeated" msgstr "Les préfixes de séquence {0} ne peuvent pas être répétés" @@ -302,7 +306,7 @@ msgid "generic workers allocation" msgstr "Allocation générique des travailleurs" #: libreplan-webapp/src/main/java/org/libreplan/web/resourceload/ResourceLoadController.java:310 -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:895 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:899 msgid "The project has no scheduled elements" msgstr "Ce projet n'a pas d'éléments planifiés" @@ -380,19 +384,19 @@ msgstr "Cliquer ici" msgid "Project Name" msgstr "Nom du projet" -#: libreplan-webapp/src/main/java/org/libreplan/web/tree/TreeController.java:967 +#: libreplan-webapp/src/main/java/org/libreplan/web/tree/TreeController.java:1084 #: libreplan-webapp/src/main/java/org/libreplan/web/resources/criterion/CriterionTreeController.java:306 msgid "Indent" msgstr "Décaler" +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/reassign/ReassignCommand.java:252 +msgid "Reassignation" +msgstr "Ré-affectation" + #: libreplan-webapp/src/main/webapp/common/configuration.zul:327 msgid "Save passwords in database" msgstr "Sauvegarder les mots de passe en base de donnée" -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/reassign/ReassignCommand.java:256 -msgid "Reassignation" -msgstr "Ré-affectation" - #: libreplan-webapp/src/main/java/org/libreplan/web/templates/TemplatesTree.java:42 msgid "New template" msgstr "Nouveau modèle" @@ -461,7 +465,7 @@ msgid "" "applicable to this resource" msgstr "il existe des critères de satisfaction faisant référence à des types de critères non applicable à cette ressource" -#: libreplan-webapp/src/main/webapp/templates/templates.zul:65 +#: libreplan-webapp/src/main/webapp/templates/templates.zul:66 #: libreplan-webapp/src/main/webapp/orders/_editOrderElement.zul:52 #: libreplan-webapp/src/main/webapp/orders/_edition.zul:50 msgid "Criterion Requirement" @@ -596,7 +600,7 @@ msgstr "Octobre" msgid "First name" msgstr "Prénom" -#: libreplan-webapp/src/main/java/org/libreplan/web/print/CutyPrint.java:256 +#: libreplan-webapp/src/main/java/org/libreplan/web/print/CutyPrint.java:250 msgid "Could not execute print command" msgstr "Impossible d'exécuter la commande d'impression" @@ -609,7 +613,7 @@ msgstr "Champs de texte complémentaires" #: libreplan-webapp/src/main/java/org/libreplan/web/workreports/WorkReportCRUDController.java:1226 #: libreplan-webapp/src/main/java/org/libreplan/web/calendars/BaseCalendarCRUDController.java:452 #: libreplan-webapp/src/main/java/org/libreplan/web/orders/AssignedTaskQualityFormsToOrderElementController.java:200 -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:832 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:836 msgid "Confirm deleting {0}. Are you sure?" msgstr "Suppression de {0}. Êtes-vous sûr ?" @@ -736,7 +740,7 @@ msgstr "Ce projet a déjà été ajouté" msgid "The task code cannot be null" msgstr "Le code de tâche ne peut être nul" -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderElementTreeController.java:594 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderElementTreeController.java:596 #: libreplan-webapp/src/main/java/org/libreplan/web/common/CustomMenuController.java:329 #: libreplan-webapp/src/main/webapp/planner/taskpanels/_taskInformation.zul:32 #: libreplan-webapp/src/main/webapp/resources/search/allocation_selector.zul:39 @@ -813,7 +817,7 @@ msgstr "Juin" msgid "{0} annotation required on {1}" msgstr "{0} annotation requise sur {1}" -#: libreplan-webapp/src/main/java/org/libreplan/web/tree/TreeController.java:1067 +#: libreplan-webapp/src/main/java/org/libreplan/web/tree/TreeController.java:1193 msgid "Modified" msgstr "Modifié" @@ -878,7 +882,7 @@ msgstr "Les avancements calculés ne peuvent pas être modifiés" msgid "Work done from starting date" msgstr "Travail effectué depuis une date donnée" -#: libreplan-webapp/src/main/webapp/templates/templates.zul:69 +#: libreplan-webapp/src/main/webapp/templates/templates.zul:70 msgid "Statistics log" msgstr "Journal des statistiques" @@ -887,7 +891,7 @@ msgstr "Journal des statistiques" msgid "Edit Calendar" msgstr "Modifier le calendrier" -#: libreplan-webapp/src/main/java/org/libreplan/web/users/ProfileCRUDController.java:112 +#: libreplan-webapp/src/main/java/org/libreplan/web/users/ProfileCRUDController.java:117 msgid "Profile" msgstr "Profil" @@ -910,7 +914,7 @@ msgstr "Ne peut pas être vide ou nul" msgid "{0} \"{1}\" saved" msgstr "{0} \"{1}\" enregistré" -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/OrderPlanningController.java:299 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/OrderPlanningController.java:301 msgid "filtering" msgstr "filtrage" @@ -967,6 +971,12 @@ msgstr "Ce critère existe déjà." msgid "add" msgstr "ajouter" +#: libreplan-webapp/src/main/java/org/libreplan/web/tree/TreeController.java:860 +#: libreplan-webapp/src/main/webapp/templates/templates.zul:111 +#: libreplan-webapp/src/main/webapp/orders/_orderElementDetails.zul:69 +msgid "Budget value cannot be negative" +msgstr "La valeur budgétée ne peut pas être négative" + #: libreplan-webapp/src/main/java/org/libreplan/web/orders/TreeElementOperationsController.java:239 msgid "Unsaved changes will be lost. Would you like to continue?" msgstr "Les changements non enregistrés seront perdus. Voulez-vous continuer ?" @@ -1044,8 +1054,8 @@ msgstr "Ajouter un rôle" msgid "Exception end date should be greater or equals than start date" msgstr "Les dates de fin exceptionnelles doivent être postérieures ou égales à la date de début" -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/SaveCommandBuilder.java:476 -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/SaveCommandBuilder.java:486 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/SaveCommandBuilder.java:474 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/SaveCommandBuilder.java:484 msgid "Repeated Project code {0} in Project {1}" msgstr "Code projet {0} répété dans le projet {1}" @@ -1075,7 +1085,7 @@ msgstr "Date de démarrage au plus tôt" msgid "Type data" msgstr "Données de type" -#: libreplan-webapp/src/main/java/org/libreplan/web/users/ProfileCRUDController.java:117 +#: libreplan-webapp/src/main/java/org/libreplan/web/users/ProfileCRUDController.java:122 #: libreplan-webapp/src/main/java/org/libreplan/web/common/CustomMenuController.java:322 msgid "Profiles" msgstr "Profils" @@ -1221,13 +1231,13 @@ msgstr "Liste de profils" msgid "both {0} of category {1} and {2} of category {3} have the same code" msgstr "Les deux {0} des catégories {1} et {2} de la catégorie {3} ont le même code" -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/TaskElementAdapter.java:958 -#: libreplan-webapp/src/main/java/org/libreplan/web/templates/TemplatesTreeController.java:236 -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderModel.java:690 -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderElementTreeController.java:581 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/TaskElementAdapter.java:1039 +#: libreplan-webapp/src/main/java/org/libreplan/web/templates/TemplatesTreeController.java:240 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderModel.java:696 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderElementTreeController.java:583 #: libreplan-webapp/src/main/java/org/libreplan/web/common/CustomMenuController.java:331 #: libreplan-webapp/src/main/webapp/planner/taskpanels/_tabPanelSubcontract.zul:68 -#: libreplan-webapp/src/main/webapp/templates/templates.zul:64 +#: libreplan-webapp/src/main/webapp/templates/templates.zul:65 #: libreplan-webapp/src/main/webapp/templates/_editTemplateWindow.zul:50 #: libreplan-webapp/src/main/webapp/orders/_editOrderElement.zul:50 msgid "Labels" @@ -1237,7 +1247,7 @@ msgstr "Libellés" msgid "Data Types" msgstr "Types de données" -#: libreplan-webapp/src/main/webapp/orders/_edition.zul:157 +#: libreplan-webapp/src/main/webapp/orders/_edition.zul:161 #: libreplan-webapp/src/main/webapp/orders/_listOrderElementHours.zul:68 msgid "Total hours" msgstr "Total des heures" @@ -1254,8 +1264,8 @@ msgstr "Réaffecter {0} projets" msgid "Filter by task status" msgstr "Filtrer par état de tâche" -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/OrderPlanningModel.java:528 -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/company/CompanyPlanningModel.java:419 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/OrderPlanningModel.java:529 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/company/CompanyPlanningModel.java:416 msgid "Select date" msgstr "Choisissez la date" @@ -1272,19 +1282,23 @@ msgstr "Merci de réessayer" msgid "Company code" msgstr "Code de la compagnie" +#: libreplan-webapp/src/main/webapp/orders/_listOrderElementHours.zul:62 +msgid "Sum of imputed hours in children tasks" +msgstr "Somme des heures imputées dans les tâches filles" + #: libreplan-webapp/src/main/java/org/libreplan/web/common/components/TwoWaySelector.java:110 msgid "Unknown attribute '{0}' in class {1}" msgstr "Attribut '{0}' inconnu dans la classe {1}" +#: libreplan-webapp/src/main/java/org/libreplan/web/users/settings/PasswordController.java:96 +msgid "passwords can not be empty" +msgstr "Les mots de passe ne peuvent pas être vides" + #: libreplan-webapp/src/main/java/org/libreplan/web/resources/worker/WorkerCRUDController.java:699 #: libreplan-business/src/main/java/org/libreplan/business/resources/entities/ResourceType.java:33 msgid "NON LIMITING RESOURCE" msgstr "RESSOURCE NON LIMITANTE" -#: libreplan-webapp/src/main/java/org/libreplan/web/users/settings/PasswordController.java:96 -msgid "passwords can not be empty" -msgstr "Les mots de passe ne peuvent pas être vides" - #: libreplan-webapp/src/main/java/org/libreplan/web/orders/labels/AssignedLabelsController.java:88 #: libreplan-webapp/src/main/java/org/libreplan/web/orders/labels/AssignedLabelsController.java:128 #: libreplan-webapp/src/main/java/org/libreplan/web/orders/AssignedTaskQualityFormsToOrderElementController.java:176 @@ -1433,11 +1447,15 @@ msgstr "Liste des dérives" msgid "Enable scenarios module" msgstr "Activer le module scénarios" +#: libreplan-webapp/src/main/java/org/libreplan/web/calendars/BaseCalendarEditionController.java:312 +msgid "to {0}" +msgstr "à {0}" + #: libreplan-webapp/src/main/webapp/limitingresources/limitingResourcesLayout.zul:59 msgid "Zoom" msgstr "Zoom" -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/SaveCommandBuilder.java:865 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/SaveCommandBuilder.java:863 #: libreplan-webapp/src/main/webapp/labels/_editLabelType.zul:112 #: libreplan-webapp/src/main/webapp/advance/advanceTypes.zul:37 #: libreplan-webapp/src/main/webapp/excetiondays/_editExceptionDayType.zul:91 @@ -1453,9 +1471,9 @@ msgstr "Zoom" #: libreplan-webapp/src/main/webapp/qualityforms/_editQualityForm.zul:131 #: libreplan-webapp/src/main/webapp/settings/changePassword.zul:81 #: libreplan-webapp/src/main/webapp/settings/settings.zul:124 -#: libreplan-webapp/src/main/webapp/users/_editProfile.zul:81 -#: libreplan-webapp/src/main/webapp/users/_editUser.zul:162 -#: libreplan-webapp/src/main/webapp/templates/templates.zul:135 +#: libreplan-webapp/src/main/webapp/users/_editProfile.zul:70 +#: libreplan-webapp/src/main/webapp/users/_editUser.zul:151 +#: libreplan-webapp/src/main/webapp/templates/templates.zul:143 #: libreplan-webapp/src/main/webapp/calendars/calendars.zul:44 #: libreplan-webapp/src/main/webapp/resources/worker/virtualWorkers.zul:40 #: libreplan-webapp/src/main/webapp/resources/worker/worker.zul:41 @@ -1514,7 +1532,7 @@ msgstr "Problèmes lors de la connection avec le web service sous-traitant" msgid "Entity type" msgstr "Type d'entité" -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/OrderPlanningModel.java:1101 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/OrderPlanningModel.java:1127 #: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:268 msgid "Unsaved changes will be lost. Are you sure?" msgstr "Les modifications non enregistrées seront perdues. Êtes-vous sûr ?" @@ -1555,13 +1573,13 @@ msgstr "Ressources par jour" msgid "ResourceType must be not-null" msgstr "RessourceType doit être non nul" -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrdersTreeComponent.java:95 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrdersTreeComponent.java:105 msgid "" "Estimated end date for the task (press enter in textbox to open calendar " "popup or type in date directly)" msgstr "Date de fin estimée pour la tâche (appuyer sur entrée dans la boîte de texte pour ouvrir la popup du calendrier ou saisir directement une date)" -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderElementTreeController.java:292 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderElementTreeController.java:293 msgid "Expand/Collapse all" msgstr "Déplier/Replier tout" @@ -1569,11 +1587,11 @@ msgstr "Déplier/Replier tout" msgid "Overload due to current project" msgstr "Surcharge due au projet actuel" -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/TaskElementAdapter.java:946 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/TaskElementAdapter.java:1017 msgid "Name: {0}" msgstr "Nom: {0}" -#: libreplan-webapp/src/main/java/org/libreplan/web/tree/TreeController.java:903 +#: libreplan-webapp/src/main/java/org/libreplan/web/tree/TreeController.java:1020 msgid "Move down" msgstr "Descendre" @@ -1620,7 +1638,7 @@ msgstr "Affecter" msgid "missing code in a criterion" msgstr "code manquant dans un critère" -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:1278 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:1282 msgid "Create Template" msgstr "Créer un modèle" @@ -1637,7 +1655,7 @@ msgstr "Recherche avancée" msgid "Filter by labels" msgstr "Filtrer par libellé" -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/taskedition/TaskPropertiesController.java:577 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/taskedition/TaskPropertiesController.java:586 msgid "" "IMPORTANT: Don't forget to communicate to subcontractor that his contract " "has been cancelled" @@ -1668,10 +1686,10 @@ msgstr "Code d'état" #: libreplan-webapp/src/main/java/org/libreplan/web/costcategories/TypeOfWorkHoursCRUDController.java:103 #: libreplan-webapp/src/main/java/org/libreplan/web/qualityforms/QualityFormCRUDController.java:391 #: libreplan-webapp/src/main/java/org/libreplan/web/planner/taskedition/AdvancedAllocationTaskController.java:73 -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/taskedition/TaskPropertiesController.java:509 -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/taskedition/TaskPropertiesController.java:547 -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/taskedition/TaskPropertiesController.java:578 -#: libreplan-webapp/src/main/java/org/libreplan/web/users/ProfileCRUDController.java:148 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/taskedition/TaskPropertiesController.java:518 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/taskedition/TaskPropertiesController.java:556 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/taskedition/TaskPropertiesController.java:587 +#: libreplan-webapp/src/main/java/org/libreplan/web/users/ProfileCRUDController.java:153 #: libreplan-webapp/src/main/java/org/libreplan/web/calendars/BaseCalendarCRUDController.java:476 msgid "Warning" msgstr "Attention" @@ -1788,8 +1806,8 @@ msgstr "le nom ne doit pas être vide" msgid "Add From Template" msgstr "Ajouter depuis le modèle" -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/taskedition/TaskPropertiesController.java:508 -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/taskedition/TaskPropertiesController.java:546 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/taskedition/TaskPropertiesController.java:517 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/taskedition/TaskPropertiesController.java:555 msgid "Assigned resources for this task will be deleted. Are you sure?" msgstr "Les ressources affectées à cette tâche vont être supprimées. Êtes-vous sûr ?" @@ -1824,7 +1842,7 @@ msgstr "Juillet" msgid "Enable LDAP authentication" msgstr "Activer l'authentification LDAP" -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/consolidations/AdvanceConsolidationModel.java:493 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/consolidations/AdvanceConsolidationModel.java:490 msgid "( max: {0} )" msgstr "( max: {0} )" @@ -1845,7 +1863,7 @@ msgid "Cannot calculate charts for current data" msgstr "Impossible de calculer les graphiques avec les données actuelles" #: libreplan-webapp/src/main/java/org/libreplan/web/orders/ProjectDetailsController.java:176 -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:1495 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:1499 msgid "project name already being used" msgstr "nom de projet déjà existant" @@ -1862,7 +1880,7 @@ msgstr "Diviser les affectations" msgid "You can not remove the default scenario called \"{0}\"" msgstr "Vous ne pouvez pas supprimer le scénario par défaut appelé \"{0}\"" -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/consolidations/AdvanceConsolidationModel.java:522 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/consolidations/AdvanceConsolidationModel.java:519 msgid "There are not any assigned progress to current task" msgstr "Il n'existe pas d'avancement affecté pour la tâche actuelle" @@ -1891,7 +1909,7 @@ msgstr "Bas" msgid "Label" msgstr "Libellé" -#: libreplan-webapp/src/main/java/org/libreplan/web/tree/TreeController.java:870 +#: libreplan-webapp/src/main/java/org/libreplan/web/tree/TreeController.java:987 msgid "Value is not valid, taking into account the current list of HoursGroup" msgstr "La valeur n'est pas correcte, prendre en compte la liste actuelle des groupes d'heures" @@ -1908,8 +1926,8 @@ msgstr "type d'heures de travail manquant dans une ligne du rapport de travail" msgid "Quality forms" msgstr "Formulaires qualité" -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/SaveCommandBuilder.java:499 -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/SaveCommandBuilder.java:509 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/SaveCommandBuilder.java:497 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/SaveCommandBuilder.java:507 msgid "Repeated Hours Group code {0} in Project {1}" msgstr "Code {0} de groupe d'heures répété dans le projet {1}" @@ -1921,10 +1939,10 @@ msgstr "Groupe d'heures" msgid "LibrePlan: Accounts" msgstr "LibrePlan: Comptes" -#: libreplan-webapp/src/main/webapp/templates/templates.zul:96 +#: libreplan-webapp/src/main/webapp/templates/templates.zul:97 #: libreplan-webapp/src/main/webapp/templates/_list.zul:30 msgid "Days from Beginning to Deadline" -msgstr "Jours depuis le démarrage jusqu'à la ligne critique" +msgstr "Jours depuis le démarrage jusqu'à l'échéance" #: libreplan-webapp/src/main/java/org/libreplan/web/planner/chart/EarnedValueChartFiller.java:128 msgid "Estimate At Completion" @@ -1954,7 +1972,7 @@ msgstr "Op." msgid "Pessimistic" msgstr "Pessimiste" -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/taskedition/TaskPropertiesController.java:376 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/taskedition/TaskPropertiesController.java:385 msgid "Limiting resource assignation" msgstr "Limiter l'affectation des ressources" @@ -1985,7 +2003,7 @@ msgstr "Le nom de type d'unité ne peut pas être vide" msgid "Entity sequences" msgstr "Séquences d'entité" -#: libreplan-webapp/src/main/webapp/templates/templates.zul:91 +#: libreplan-webapp/src/main/webapp/templates/templates.zul:92 #: libreplan-webapp/src/main/webapp/templates/_list.zul:28 msgid "Delay from beginning (days)" msgstr "Retard depuis le début (en jours)" @@ -2015,7 +2033,7 @@ msgstr "Confirmer l'annulation" msgid "Work And Progress Per Task" msgstr "Travail et avancement par tâche" -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:1519 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:1523 msgid "project code already being used" msgstr "le code projet est déjà utilisé" @@ -2034,8 +2052,8 @@ msgstr "Séquence de suppression" #: libreplan-webapp/src/main/java/org/libreplan/web/calendars/BaseCalendarCRUDController.java:457 #: libreplan-webapp/src/main/java/org/libreplan/web/orders/AssignedTaskQualityFormsToOrderElementController.java:208 #: libreplan-webapp/src/main/java/org/libreplan/web/orders/criterionrequirements/AssignedCriterionRequirementController.java:264 -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:840 -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:875 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:844 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:879 msgid "Error on showing removing element: " msgstr "Erreur dans l'affichage des éléments supprimés:" @@ -2096,7 +2114,7 @@ msgid "Overload" msgstr "Surcharge" #: libreplan-webapp/src/main/webapp/templates/_historicalAssignment.zul:30 -#: libreplan-webapp/src/main/webapp/templates/templates.zul:68 +#: libreplan-webapp/src/main/webapp/templates/templates.zul:69 msgid "Assignment log" msgstr "Journal d'affectation" @@ -2105,10 +2123,6 @@ msgstr "Journal d'affectation" msgid "Work Report Models" msgstr "Modèles de rapport de travail" -#: libreplan-webapp/src/main/java/org/libreplan/web/print/CutyCaptTimeout.java:45 -msgid "CutycaptTimeout thread exception" -msgstr "Exception du processus CutycapTimeout" - #: libreplan-webapp/src/main/webapp/materials/materials.zul:73 msgid "New" msgstr "Nouveau" @@ -2117,9 +2131,9 @@ msgstr "Nouveau" msgid "Date last progress measurement" msgstr "Date de dernière mesure d'avancement" -#: libreplan-webapp/src/main/java/org/libreplan/web/templates/TemplatesTreeComponent.java:103 +#: libreplan-webapp/src/main/java/org/libreplan/web/templates/TemplatesTreeComponent.java:112 msgid "Deadline (days since beggining project)" -msgstr "Date critique (jours depuis le commencement projet)" +msgstr "Echéance (jours depuis le commencement projet)" #: libreplan-webapp/src/main/webapp/externalcompanies/externalcompanies.zul:23 msgid "LibrePlan: Companies" @@ -2147,14 +2161,14 @@ msgstr "le nom de type de critère est déjà utilisé" msgid "Task code cannot be null" msgstr "Le code de la tâche ne peut pas être nul" -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/consolidations/AdvanceConsolidationModel.java:520 +#: libreplan-webapp/src/main/java/org/libreplan/web/calendars/BaseCalendarEditionController.java:302 +msgid "Derived of calendar {0}" +msgstr "Dérivé du calendrier {0}" + +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/consolidations/AdvanceConsolidationModel.java:517 msgid "It is not allowed to consolidate progress." msgstr "Il n'est pas autorisé pour consolider l'avancement" -#: libreplan-webapp/src/main/webapp/orders/components/_orderElementTree.zul:32 -msgid "Create Task" -msgstr "Créer une tâche" - #: libreplan-webapp/src/main/webapp/planner/taskpanels/_tabPanelSubcontract.zul:27 msgid "External company" msgstr "Compagnie externe" @@ -2163,10 +2177,10 @@ msgstr "Compagnie externe" #: libreplan-webapp/src/main/webapp/costcategories/_listTypesOfWorkHours.zul:30 #: libreplan-webapp/src/main/webapp/costcategories/_listCostCategories.zul:28 #: libreplan-webapp/src/main/webapp/users/_listUsers.zul:30 -#: libreplan-webapp/src/main/webapp/users/_editProfile.zul:60 +#: libreplan-webapp/src/main/webapp/users/_editProfile.zul:61 #: libreplan-webapp/src/main/webapp/users/_listProfiles.zul:27 -#: libreplan-webapp/src/main/webapp/users/_editUser.zul:107 -#: libreplan-webapp/src/main/webapp/users/_editUser.zul:140 +#: libreplan-webapp/src/main/webapp/users/_editUser.zul:108 +#: libreplan-webapp/src/main/webapp/users/_editUser.zul:129 #: libreplan-webapp/src/main/webapp/orders/_listOrderElementAuthorizations.zul:44 #: libreplan-webapp/src/main/webapp/orders/_listOrderElementAuthorizations.zul:68 msgid "Actions" @@ -2239,11 +2253,15 @@ msgstr "La valeur n'est pas correcte.\nLe code ne peut pas contenir de caractèr msgid "Hours Group" msgstr "Groupe d'heures" +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/TaskElementAdapter.java:1029 +msgid "Budget: {0}€, Consumed: {1}€ ({2}%)" +msgstr "Budget: {0}€, Consommé: {1}€ ( {2}%)" + #: libreplan-webapp/src/main/java/org/libreplan/web/workreports/WorkReportTypeCRUDController.java:825 msgid "Unallocated name" msgstr "Nom non alloué" -#: libreplan-webapp/src/main/java/org/libreplan/web/tree/TreeController.java:924 +#: libreplan-webapp/src/main/java/org/libreplan/web/tree/TreeController.java:1041 msgid "Move up" msgstr "Monter" @@ -2257,7 +2275,7 @@ msgstr "Date de communication de sous-contrat" #: libreplan-webapp/src/main/java/org/libreplan/web/planner/tabs/MultipleTabsPlannerController.java:131 #: libreplan-webapp/src/main/java/org/libreplan/web/planner/tabs/MultipleTabsPlannerController.java:134 -#: libreplan-webapp/src/main/java/org/libreplan/web/templates/OrderTemplatesController.java:281 +#: libreplan-webapp/src/main/java/org/libreplan/web/templates/OrderTemplatesController.java:301 #: libreplan-webapp/src/main/java/org/libreplan/web/common/CustomMenuController.java:269 #: libreplan-webapp/src/main/java/org/libreplan/web/common/CustomMenuController.java:367 msgid "Scheduling" @@ -2293,17 +2311,17 @@ msgstr "Page précédente" msgid "Create new project" msgstr "Créer un nouveau projet" -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/TaskElementAdapter.java:954 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/TaskElementAdapter.java:1026 #: libreplan-webapp/src/main/java/org/libreplan/web/common/components/finders/TaskGroupFilterEnum.java:31 #: libreplan-webapp/src/main/java/org/libreplan/web/common/components/finders/OrderFilterEnum.java:31 #: libreplan-webapp/src/main/webapp/subcontract/subcontractedTasks.zul:53 #: libreplan-webapp/src/main/webapp/subcontract/reportAdvances.zul:50 -#: libreplan-webapp/src/main/webapp/orders/_edition.zul:161 +#: libreplan-webapp/src/main/webapp/orders/_edition.zul:165 #: libreplan-webapp/src/main/webapp/orders/_list.zul:35 msgid "State" msgstr "Etat" -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrdersTreeComponent.java:80 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrdersTreeComponent.java:90 msgid "Must start after" msgstr "Doit débuter après" @@ -2311,7 +2329,7 @@ msgstr "Doit débuter après" msgid "Confirm change" msgstr "Confirmer la modification" -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:845 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:849 msgid "You don't have permissions to edit this project" msgstr "Vous n'avez pas la permission de modifier ce projet" @@ -2350,7 +2368,7 @@ msgstr "LibrePlan: Matériel" msgid "New task" msgstr "Nouvelle tâche" -#: libreplan-webapp/src/main/java/org/libreplan/web/users/UserCRUDController.java:191 +#: libreplan-webapp/src/main/java/org/libreplan/web/users/UserCRUDController.java:197 msgid "The password for a new user cannot be empty" msgstr "Le mot de passe d'un nouvel utilisateur ne peut pas être vide" @@ -2402,7 +2420,7 @@ msgstr "Détails personnels" msgid "Workers List" msgstr "Liste des participants" -#: libreplan-webapp/src/main/java/org/libreplan/web/templates/OrderTemplatesController.java:355 +#: libreplan-webapp/src/main/java/org/libreplan/web/templates/OrderTemplatesController.java:375 msgid "Delete project template. Are you sure?" msgstr "Suppression du canevas de projet. Êtes-vous sûr ?" @@ -2483,18 +2501,18 @@ msgstr "Autres projets" msgid "Tasks input buffer" msgstr "Tampon d'entrée des tâches" -#: libreplan-webapp/src/main/java/org/libreplan/web/common/ConfigurationModel.java:168 +#: libreplan-webapp/src/main/java/org/libreplan/web/common/ConfigurationModel.java:173 msgid "At least one {0} sequence must be active" msgstr "Au moins une séquence {0} doit être active" #: libreplan-webapp/src/main/webapp/users/_listProfiles.zul:26 -#: libreplan-webapp/src/main/webapp/users/_editUser.zul:139 +#: libreplan-webapp/src/main/webapp/users/_editUser.zul:128 #: libreplan-webapp/src/main/webapp/orders/_listOrderElementAuthorizations.zul:42 #: libreplan-webapp/src/main/webapp/orders/_listOrderElementAuthorizations.zul:66 msgid "Profile name" msgstr "Nom de profil" -#: libreplan-webapp/src/main/java/org/libreplan/web/print/CutyPrint.java:252 +#: libreplan-webapp/src/main/java/org/libreplan/web/print/CutyPrint.java:246 msgid "Could open generated PDF" msgstr "Possible d'ouvrir le PDF généré" @@ -2506,7 +2524,7 @@ msgstr "Désactiver la suppression" msgid "You should select a source scenario" msgstr "Vous devez choisir un scénario source" -#: libreplan-webapp/src/main/java/org/libreplan/web/common/ConfigurationModel.java:163 +#: libreplan-webapp/src/main/java/org/libreplan/web/common/ConfigurationModel.java:168 msgid "At least one {0} sequence is needed" msgstr "Au moins une séquence {0} est nécessaire" @@ -2541,18 +2559,18 @@ msgid "" "to generate usage statistics" msgstr "Cocher cette option pour envoyer cette information aux développeurs de LibrePlan de façon à générer des statistiques d'utilisation" -#: libreplan-webapp/src/main/webapp/resources/search/_resourceFilter.zul:36 -msgid "More options" -msgstr "Plus d'options" +#: libreplan-webapp/src/main/java/org/libreplan/web/subcontract/ReportAdvancesModel.java:219 +#: libreplan-webapp/src/main/java/org/libreplan/web/subcontract/SubcontractedTasksModel.java:179 +msgid "Error: {0}" +msgstr "Erreur: {0}" #: libreplan-webapp/src/main/webapp/subcontract/subcontractedTasks.zul:45 msgid "Communication" msgstr "Communication" -#: libreplan-webapp/src/main/java/org/libreplan/web/subcontract/ReportAdvancesModel.java:219 -#: libreplan-webapp/src/main/java/org/libreplan/web/subcontract/SubcontractedTasksModel.java:179 -msgid "Error: {0}" -msgstr "Erreur: {0}" +#: libreplan-webapp/src/main/webapp/resources/search/_resourceFilter.zul:36 +msgid "More options" +msgstr "Plus d'options" #: libreplan-webapp/src/main/java/org/libreplan/web/orders/TreeElementOperationsController.java:240 msgid "Confirm create template" @@ -2584,7 +2602,7 @@ msgstr "LibrePlan: Travail et avancement par tâche" msgid "Projects" msgstr "Projets" -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/OrderPlanningModel.java:1102 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/OrderPlanningModel.java:1128 #: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:269 msgid "Confirm exit dialog" msgstr "Confirmer la fenêtre de sortie" @@ -2662,7 +2680,7 @@ msgstr "Enregistrement du travail" msgid "Output format" msgstr "Format de sortie" -#: libreplan-webapp/src/main/webapp/planner/print_configuration.zul:47 +#: libreplan-webapp/src/main/webapp/planner/print_configuration.zul:49 msgid "Print" msgstr "Imprimer" @@ -2682,8 +2700,8 @@ msgstr "le type de ressource n'autorise pas le critère activé" msgid "Effort cannot be null" msgstr "L'effort ne peut pas être nul" -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/OrderPlanningModel.java:1093 -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/assigntemplates/TemplateFinderPopup.java:52 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/OrderPlanningModel.java:1119 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/assigntemplates/TemplateFinderPopup.java:126 #: libreplan-webapp/src/main/webapp/labels/_editLabelType.zul:116 #: libreplan-webapp/src/main/webapp/excetiondays/_editExceptionDayType.zul:97 #: libreplan-webapp/src/main/webapp/externalcompanies/_editExternalCompany.zul:106 @@ -2695,16 +2713,16 @@ msgstr "L'effort ne peut pas être nul" #: libreplan-webapp/src/main/webapp/costcategories/_editCostCategory.zul:98 #: libreplan-webapp/src/main/webapp/costcategories/_editTypeOfWorkHours.zul:80 #: libreplan-webapp/src/main/webapp/qualityforms/_editQualityForm.zul:137 -#: libreplan-webapp/src/main/webapp/planner/print_configuration.zul:48 +#: libreplan-webapp/src/main/webapp/planner/print_configuration.zul:50 #: libreplan-webapp/src/main/webapp/planner/editTask.zul:81 #: libreplan-webapp/src/main/webapp/planner/reassign.zul:50 #: libreplan-webapp/src/main/webapp/planner/stretches_function.zul:91 #: libreplan-webapp/src/main/webapp/planner/advance_allocation.zul:42 #: libreplan-webapp/src/main/webapp/planner/order.zul:131 #: libreplan-webapp/src/main/webapp/planner/order.zul:166 -#: libreplan-webapp/src/main/webapp/users/_editProfile.zul:85 -#: libreplan-webapp/src/main/webapp/users/_editUser.zul:166 -#: libreplan-webapp/src/main/webapp/templates/templates.zul:139 +#: libreplan-webapp/src/main/webapp/users/_editProfile.zul:74 +#: libreplan-webapp/src/main/webapp/users/_editUser.zul:155 +#: libreplan-webapp/src/main/webapp/templates/templates.zul:147 #: libreplan-webapp/src/main/webapp/calendars/_createNewVersion.zul:58 #: libreplan-webapp/src/main/webapp/calendars/calendars.zul:47 #: libreplan-webapp/src/main/webapp/resources/machine/_editMachine.zul:103 @@ -2740,8 +2758,8 @@ msgid "Machines List" msgstr "Liste des machines" #: libreplan-webapp/src/main/java/org/libreplan/web/resourceload/ResourceLoadController.java:320 -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:692 -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:904 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:696 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:908 msgid "You don't have read access to this project" msgstr "Vous n'avez pas les droits en consultation pour ce projet" @@ -2817,7 +2835,7 @@ msgstr "{0} (max: {1})" msgid "Cost Category" msgstr "Catégorie de coût" -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderElementTreeController.java:471 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderElementTreeController.java:473 msgid "end" msgstr "fin" @@ -2838,7 +2856,7 @@ msgstr "Autorisation" msgid "Continue" msgstr "Continuer" -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderElementController.java:121 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderElementController.java:122 msgid "Edit task {0}" msgstr "Modifier la tâche {0}" @@ -2871,7 +2889,7 @@ msgstr "Valeur maximum par défaut" msgid "Add criterion requirement" msgstr "Ajouter une exigence de critère" -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:860 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:864 msgid "" "You can not remove the project \"{0}\" because of any of its tasks are " "already in use in some work reports and the project just exists in the " @@ -2911,7 +2929,7 @@ msgstr "LibrePlan: modifier le mot de passe" msgid "please, select a label" msgstr "Merci de choisir un libellé" -#: libreplan-webapp/src/main/webapp/users/_editUser.zul:134 +#: libreplan-webapp/src/main/webapp/users/_editUser.zul:123 msgid "Add profile" msgstr "Ajouter un profil" @@ -2990,8 +3008,8 @@ msgstr "le nom ne doit pas être vide" msgid "Disabled" msgstr "Désactivé" -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/OrderPlanningModel.java:738 -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/company/CompanyPlanningModel.java:325 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/OrderPlanningModel.java:764 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/company/CompanyPlanningModel.java:322 msgid "Earned value" msgstr "Valeur gagnée" @@ -3020,8 +3038,8 @@ msgid "" "Please save your project before proceeding." msgstr "Les modèles ne peuvent être créés qu'à partir de tâches existantes. Vous essayez de créer un modèle à partir d'une nouvelle tâche.\nMerci d'enregistrer votre projet avant de continuer." -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/TaskElementAdapter.java:1163 -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/TaskElementAdapter.java:1178 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/TaskElementAdapter.java:1243 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/TaskElementAdapter.java:1258 msgid "{0} not supported yet" msgstr "{0} pas géré actuellement" @@ -3043,7 +3061,7 @@ msgstr "Nouvelle entrée" msgid "Resources Load" msgstr "Chargement des ressources" -#: libreplan-webapp/src/main/java/org/libreplan/web/common/ConfigurationModel.java:220 +#: libreplan-webapp/src/main/java/org/libreplan/web/common/ConfigurationModel.java:225 msgid "Some sequences to remove not existed" msgstr "Certaines séquences à supprimer n'existent pas" @@ -3118,11 +3136,11 @@ msgid "Select start date" msgstr "Choisir une date de début" #: libreplan-webapp/src/main/java/org/libreplan/web/costcategories/TypeOfWorkHoursCRUDController.java:106 -#: libreplan-webapp/src/main/java/org/libreplan/web/users/ProfileCRUDController.java:152 +#: libreplan-webapp/src/main/java/org/libreplan/web/users/ProfileCRUDController.java:157 msgid "Error on showing warning message removing typeOfWorkHours: " msgstr "Erreur dans l'affichage du message d'avertissement de suppression de typeOfWorkHours:" -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:882 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:886 msgid "Removed {0}" msgstr "{0} supprimé" @@ -3134,8 +3152,8 @@ msgstr "Confirmer la suppression de ce participant. Êtes-vous sûr ?" msgid "Group name" msgstr "Nom de groupe" -#: libreplan-webapp/src/main/webapp/users/_editProfile.zul:59 -#: libreplan-webapp/src/main/webapp/users/_editUser.zul:106 +#: libreplan-webapp/src/main/webapp/users/_editProfile.zul:60 +#: libreplan-webapp/src/main/webapp/users/_editUser.zul:107 msgid "Role name" msgstr "Nom du rôle" @@ -3151,8 +3169,8 @@ msgstr "Créer un rapport de travail" msgid "Value is not valid, the precision value must not be empty" msgstr "La valeur n'est pas correcte," -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/OrderPlanningModel.java:863 -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/company/CompanyPlanningModel.java:473 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/OrderPlanningModel.java:889 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/company/CompanyPlanningModel.java:470 msgid "h" msgstr "h" @@ -3177,7 +3195,7 @@ msgstr "Ajouter un jalon" msgid "Assign selected items" msgstr "Affecter les éléments sélectionnés" -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderElementTreeController.java:450 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderElementTreeController.java:452 msgid "init" msgstr "initialisation" @@ -3254,6 +3272,10 @@ msgstr "Client" msgid "Hours type" msgstr "Type d'heures" +#: libreplan-webapp/src/main/webapp/planner/print_configuration.zul:43 +msgid "Show money cost bar" +msgstr "Afficher la barre de coût monétaire" + #: libreplan-webapp/src/main/java/org/libreplan/ws/resources/impl/ResourceConverter.java:156 #: libreplan-business/src/main/java/org/libreplan/business/resources/entities/CriterionType.java:211 msgid "criterion type name not specified" @@ -3267,11 +3289,11 @@ msgstr "Impossible de se connecter au serveur LDAP" msgid "Add Exception" msgstr "Ajouter une exception" -#: libreplan-webapp/src/main/java/org/libreplan/web/tree/TreeController.java:220 +#: libreplan-webapp/src/main/java/org/libreplan/web/tree/TreeController.java:222 #: libreplan-webapp/src/main/java/org/libreplan/web/qualityforms/QualityFormCRUDController.java:202 #: libreplan-webapp/src/main/java/org/libreplan/web/qualityforms/QualityFormCRUDController.java:223 #: libreplan-webapp/src/main/java/org/libreplan/web/qualityforms/QualityFormCRUDController.java:247 -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderElementTreeController.java:378 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderElementTreeController.java:379 msgid "cannot be empty" msgstr "ne peut pas être vide" @@ -3395,7 +3417,7 @@ msgstr "Options d'export" #: libreplan-webapp/src/main/webapp/reports/workingArrangementsPerOrderReport.zul:145 #: libreplan-webapp/src/main/webapp/reports/timeLineMaterialReport.zul:94 #: libreplan-webapp/src/main/webapp/users/_editProfile.zul:40 -#: libreplan-webapp/src/main/webapp/templates/templates.zul:80 +#: libreplan-webapp/src/main/webapp/templates/templates.zul:81 #: libreplan-webapp/src/main/webapp/templates/_list.zul:27 #: libreplan-webapp/src/main/webapp/templates/_assignedQualityForms.zul:48 #: libreplan-webapp/src/main/webapp/subcontract/reportAdvances.zul:45 @@ -3464,7 +3486,7 @@ msgstr "Heures travaillées par ressource" msgid "The end date cannot be before the init date" msgstr "La date de fin ne peut pas être antérieure à la date d'initialisation" -#: libreplan-webapp/src/main/webapp/users/_editUser.zul:128 +#: libreplan-webapp/src/main/webapp/users/_editUser.zul:117 msgid "" "Profiles of LDAP users cannot be managed because LDAP roles are being used." msgstr "Le profil des utilisateurs LDAP ne peut pas être géré car les rôles LDAP sont actuellement utilisés." @@ -3560,7 +3582,7 @@ msgstr "Groupe de participants virtuels" msgid "Changes saved" msgstr "Modifications enregistrées" -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:1263 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:1267 msgid "See scheduling" msgstr "Voir la prévision" @@ -3589,7 +3611,7 @@ msgid "Work report saved" msgstr "Rapport de travail enregistré" #: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/SubcontractCommand.java:53 -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/taskedition/TaskPropertiesController.java:377 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/taskedition/TaskPropertiesController.java:386 #: libreplan-webapp/src/main/webapp/planner/editTask.zul:68 msgid "Subcontract" msgstr "Sous-contrat" @@ -3625,10 +3647,6 @@ msgstr "ne doit pas être vide" msgid "April" msgstr "avril" -#: libreplan-webapp/src/main/java/org/libreplan/web/calendars/BaseCalendarEditionController.java:302 -msgid "Derived of Calendar " -msgstr "Dérivé du calendrier" - #: libreplan-webapp/src/main/webapp/users/_listUsers.zul:22 msgid "Users List" msgstr "Liste des utilisateurs" @@ -3686,14 +3704,14 @@ msgstr "Filtrer les formulaires qualité par" msgid "Unindent selected task" msgstr "Tâche sélectionnée non décalée" -#: libreplan-webapp/src/main/webapp/planner/taskpanels/_tabPanelTaskProperties.zul:62 -msgid "Constraint" -msgstr "Contrainte" - #: libreplan-webapp/src/main/webapp/subcontract/reportAdvances.zul:44 msgid "Customer reference code" msgstr "Code de référence du client" +#: libreplan-webapp/src/main/webapp/planner/taskpanels/_tabPanelTaskProperties.zul:66 +msgid "Constraint" +msgstr "Contrainte" + #: libreplan-webapp/src/main/webapp/workreports/_editWorkReportType.zul:150 msgid "Add New Label Type Field" msgstr "Ajouter un nouveau champ de type de libellé" @@ -3712,16 +3730,16 @@ msgstr "Référence du client" #: libreplan-webapp/src/main/java/org/libreplan/web/templates/historicalAssignment/OrderElementHistoricalAssignmentComponent.java:146 #: libreplan-webapp/src/main/java/org/libreplan/web/resourceload/ResourceLoadController.java:311 #: libreplan-webapp/src/main/java/org/libreplan/web/resourceload/ResourceLoadController.java:321 -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:693 -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:846 -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:896 -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:905 -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:932 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:697 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:850 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:900 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:909 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:936 #: libreplan-webapp/src/main/java/org/libreplan/web/limitingresources/LimitingResourcesController.java:333 msgid "Information" msgstr "Information" -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:931 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:935 msgid "Sorry, you do not have permissions to access this project" msgstr "Désolé, vous n'avez pas les droits pour accéder à ce projet" @@ -3745,7 +3763,7 @@ msgstr "Nouveau groupe d'heures" msgid "Assign element to queue manually" msgstr "Assigner l'élément à la file manuellement" -#: libreplan-webapp/src/main/webapp/planner/print_configuration.zul:45 +#: libreplan-webapp/src/main/webapp/planner/print_configuration.zul:47 msgid "Please remember that only saved changes will be printed" msgstr "Merci de vous rappeler que seules les modifications enregistrées seront affichées" @@ -3790,6 +3808,10 @@ msgstr "Type d'exception du calendrier non trouvé" msgid "Unable to convert value to {0} type" msgstr "Impossible de convertir la valeur en type {0}" +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrdersTreeComponent.java:81 +msgid "Total task budget" +msgstr "Budget total de la tâche" + #: libreplan-webapp/src/main/java/org/libreplan/web/resources/worker/WorkerModel.java:222 msgid "Worker must be not-null" msgstr "Le participant ne doit pas être nul" @@ -3798,14 +3820,14 @@ msgstr "Le participant ne doit pas être nul" msgid "Some criterion satisfactions overlap in time" msgstr "Certaines satisfactions de critères se chevauchent dans le temps" -#: libreplan-webapp/src/main/webapp/reports/timeLineMaterialReport.zul:21 -msgid "LibrePlan: Materials Needs At Date" -msgstr "LibrePlan: Besoins matériels à la date" - #: libreplan-webapp/src/main/webapp/subcontract/reportAdvances.zul:49 msgid "Value last progress measurement" msgstr "Renseigne la dernière mesure d'avancement" +#: libreplan-webapp/src/main/webapp/reports/timeLineMaterialReport.zul:21 +msgid "LibrePlan: Materials Needs At Date" +msgstr "LibrePlan: Besoins matériels à la date" + #: libreplan-webapp/src/main/webapp/resources/machine/_machineConfigurationUnits.zul:44 msgid "Worker assignments" msgstr "Affectations des participants" @@ -4034,7 +4056,7 @@ msgid "Check consolidated progresses" msgstr "Contrôler les avancements consolidés" #: libreplan-webapp/src/main/java/org/libreplan/web/workreports/WorkReportCRUDController.java:1469 -#: libreplan-webapp/src/main/java/org/libreplan/web/workreports/WorkReportModel.java:585 +#: libreplan-webapp/src/main/java/org/libreplan/web/workreports/WorkReportModel.java:587 msgid "Show all" msgstr "Montrer tout" @@ -4052,7 +4074,7 @@ msgid "Apply tab changes" msgstr "Appliquer les changements d'onglet" #: libreplan-webapp/src/main/java/org/libreplan/web/users/settings/PasswordController.java:99 -#: libreplan-webapp/src/main/java/org/libreplan/web/users/UserCRUDController.java:170 +#: libreplan-webapp/src/main/java/org/libreplan/web/users/UserCRUDController.java:176 msgid "passwords don't match" msgstr "les mots de passe ne correspondent pas" @@ -4102,7 +4124,7 @@ msgstr "Montrer les dépendances" #: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:344 msgid "Schedule from start to deadline" -msgstr "Prévision du début à la ligne critique" +msgstr "Prévision du début à l'échéance" #: libreplan-webapp/src/main/webapp/montecarlo/_montecarlo.zul:50 #: libreplan-webapp/src/main/webapp/montecarlo/_montecarlo.zul:52 @@ -4172,7 +4194,7 @@ msgstr "Non décalable" msgid "List of materials for all categories (select one to filter)" msgstr "Liste des matériels pour toutes les catégories (en choisir un à filtrer)" -#: libreplan-webapp/src/main/webapp/planner/taskpanels/_tabPanelTaskProperties.zul:69 +#: libreplan-webapp/src/main/webapp/planner/taskpanels/_tabPanelTaskProperties.zul:73 msgid "Resource allocation type" msgstr "Type d'allocation de ressource" @@ -4189,7 +4211,7 @@ msgstr "Type d'exception" msgid "In the available periods {0} only {1} hours are available." msgstr "Dans les périodes disponibles {0}, seules {1} heures sont disponibles." -#: libreplan-webapp/src/main/webapp/users/_editUser.zul:126 +#: libreplan-webapp/src/main/webapp/users/_editUser.zul:115 msgid "Association with profiles" msgstr "Association avec les profils" @@ -4231,7 +4253,7 @@ msgstr "Base" msgid "Total dedication" msgstr "Investissement total" -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderElementTreeController.java:683 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderElementTreeController.java:686 msgid "" "You can not remove the task \"{0}\" because of this or any of its children " "are already in use in some work reports" @@ -4432,8 +4454,8 @@ msgstr "Activer/Désactiver l'avertissement relatif aux nouvelles versions de Li msgid "Select type" msgstr "Choisir le type" -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/TaskElementAdapter.java:950 -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderModel.java:679 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/TaskElementAdapter.java:1021 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderModel.java:685 msgid "Hours invested" msgstr "Heures investies" @@ -4503,7 +4525,7 @@ msgstr "Vue de la compagnie" msgid "Both" msgstr "Les deux" -#: libreplan-webapp/src/main/java/org/libreplan/web/tree/TreeController.java:765 +#: libreplan-webapp/src/main/java/org/libreplan/web/tree/TreeController.java:882 msgid "Not editable for containing more that an hours group." msgstr "Pas modifiable car contient plus d'un groupe d'heures" @@ -4577,6 +4599,7 @@ msgid "LibrePlan: Transfer Projects Between Scenarios" msgstr "LibrePlan: transfert des projets entre les scénarios" #: libreplan-webapp/src/main/webapp/orders/_listOrderElementHours.zul:118 +#: libreplan-webapp/src/main/webapp/orders/_listOrderElementHours.zul:166 msgid "%" msgstr "%" @@ -4587,14 +4610,14 @@ msgstr "Supprimer le calendrier" #: libreplan-webapp/src/main/java/org/libreplan/web/workreports/WorkReportCRUDController.java:1536 #: libreplan-webapp/src/main/java/org/libreplan/web/workreports/WorkReportCRUDController.java:1700 -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/OrderPlanningController.java:336 -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/company/CompanyPlanningController.java:273 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/OrderPlanningController.java:338 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/company/CompanyPlanningController.java:274 #: libreplan-webapp/src/main/java/org/libreplan/web/reports/OrderCostsPerResourceController.java:141 #: libreplan-webapp/src/main/java/org/libreplan/web/resources/worker/WorkerCRUDController.java:633 #: libreplan-webapp/src/main/java/org/libreplan/web/resources/machine/MachineCRUDController.java:425 #: libreplan-webapp/src/main/java/org/libreplan/web/orders/ProjectDetailsController.java:257 -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderElementTreeController.java:670 -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:1328 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderElementTreeController.java:673 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:1332 msgid "must be lower than finish date" msgstr "doit être plus petit que la date de fin" @@ -4615,14 +4638,14 @@ msgstr "Ressource" msgid "Total task hours" msgstr "Total des heures des tâches" -#: libreplan-webapp/src/main/java/org/libreplan/web/common/entrypoints/RedirectorSynthetiser.java:125 -msgid "Could not load any resource" -msgstr "Impossible de charger une quelconque ressource" - #: libreplan-webapp/src/main/webapp/subcontract/reportAdvances.zul:46 msgid "Date last progress reported" msgstr "Date du dernier rapport d'avancement" +#: libreplan-webapp/src/main/java/org/libreplan/web/common/entrypoints/RedirectorSynthetiser.java:125 +msgid "Could not load any resource" +msgstr "Impossible de charger une quelconque ressource" + #: libreplan-webapp/src/main/java/org/libreplan/web/common/CustomMenuController.java:343 #: libreplan-webapp/src/main/webapp/reports/schedulingProgressPerOrderReport.zul:37 msgid "Work And Progress Per Project" @@ -4685,7 +4708,7 @@ msgstr "Liste des lignes de rapport de travail" msgid "Unit type code cannot be empty" msgstr "Le code du type d'unité ne peut pas être vide" -#: libreplan-webapp/src/main/java/org/libreplan/web/users/UserCRUDController.java:183 +#: libreplan-webapp/src/main/java/org/libreplan/web/users/UserCRUDController.java:189 #: libreplan-webapp/src/main/java/org/libreplan/web/common/CustomMenuController.java:320 msgid "Users" msgstr "Utilisateurs" @@ -4718,8 +4741,8 @@ msgid "" "completed." msgstr "Un autre utilisateur a modifié la même donnée, donc l'opération ne peut être achevée en toute sécurité" -#: libreplan-webapp/src/main/java/org/libreplan/web/templates/OrderTemplatesController.java:218 -#: libreplan-webapp/src/main/java/org/libreplan/web/templates/OrderTemplatesController.java:232 +#: libreplan-webapp/src/main/java/org/libreplan/web/templates/OrderTemplatesController.java:223 +#: libreplan-webapp/src/main/java/org/libreplan/web/templates/OrderTemplatesController.java:244 msgid "Template saved" msgstr "Modèle enregistré" @@ -4758,7 +4781,7 @@ msgstr "Terminer la session" #: libreplan-webapp/src/main/webapp/resources/worker/_localizations.zul:31 #: libreplan-webapp/src/main/webapp/resources/worker/_localizations.zul:53 #: libreplan-webapp/src/main/webapp/resources/worker/_localizations.zul:67 -#: libreplan-business/src/main/java/org/libreplan/business/templates/entities/OrderLineGroupTemplate.java:243 +#: libreplan-business/src/main/java/org/libreplan/business/templates/entities/OrderLineGroupTemplate.java:244 msgid "Group" msgstr "Groupe" @@ -4823,9 +4846,9 @@ msgstr "Mise à jour incompatible: la ressource enregistrée n'est pas du type: #: libreplan-webapp/src/main/webapp/costcategories/_editCostCategory.zul:96 #: libreplan-webapp/src/main/webapp/costcategories/_editTypeOfWorkHours.zul:78 #: libreplan-webapp/src/main/webapp/qualityforms/_editQualityForm.zul:134 -#: libreplan-webapp/src/main/webapp/users/_editProfile.zul:83 -#: libreplan-webapp/src/main/webapp/users/_editUser.zul:164 -#: libreplan-webapp/src/main/webapp/templates/templates.zul:137 +#: libreplan-webapp/src/main/webapp/users/_editProfile.zul:72 +#: libreplan-webapp/src/main/webapp/users/_editUser.zul:153 +#: libreplan-webapp/src/main/webapp/templates/templates.zul:145 #: libreplan-webapp/src/main/webapp/resources/worker/_edition.zul:114 #: libreplan-webapp/src/main/webapp/resources/machine/_editMachine.zul:100 #: libreplan-webapp/src/main/webapp/resources/criterions/_edition.zul:92 @@ -4887,13 +4910,13 @@ msgstr "DEBUT" #: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:347 msgid "Schedule from the deadline to start" -msgstr "Prévision du début à partir de la ligne critique " +msgstr "Prévision depuis l'échéance jusqu'au début" #: libreplan-webapp/src/main/java/org/libreplan/web/common/components/NewAllocationSelector.java:71 msgid "generic machines allocation" msgstr "allocation générique des machines" -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/taskedition/TaskPropertiesController.java:375 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/taskedition/TaskPropertiesController.java:384 msgid "Non limiting resource assignation" msgstr "Affectation de ressources non limitantes" @@ -4916,13 +4939,13 @@ msgstr "Administration" #: libreplan-webapp/src/main/java/org/libreplan/web/workreports/WorkReportCRUDController.java:1519 #: libreplan-webapp/src/main/java/org/libreplan/web/workreports/WorkReportCRUDController.java:1682 -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/OrderPlanningController.java:317 -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/company/CompanyPlanningController.java:255 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/OrderPlanningController.java:319 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/company/CompanyPlanningController.java:256 #: libreplan-webapp/src/main/java/org/libreplan/web/resources/worker/WorkerCRUDController.java:616 #: libreplan-webapp/src/main/java/org/libreplan/web/resources/machine/MachineCRUDController.java:408 #: libreplan-webapp/src/main/java/org/libreplan/web/orders/ProjectDetailsController.java:240 -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderElementTreeController.java:652 -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:1311 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderElementTreeController.java:655 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:1315 msgid "must be greater than start date" msgstr "doit être postérieur à la date de début" @@ -4935,6 +4958,10 @@ msgstr "Annuler et retour" msgid "Assign quality form" msgstr "Affecter un formulaire qualité" +#: libreplan-webapp/src/main/webapp/orders/_edition.zul:157 +msgid "Calculated budget" +msgstr "Budget calculé" + #: libreplan-webapp/src/main/java/org/libreplan/web/orders/materials/AssignedMaterialsController.java:387 msgid "Delete item {0}. Are you sure?" msgstr "Supprimer l'élément {0}. Êtes-vous sûr ?" @@ -4960,6 +4987,10 @@ msgstr "une ligne du rapport de travail n'a pas de type de libellé assigné" msgid "Allocations" msgstr "Allocations" +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/assigntemplates/TemplateFinderPopup.java:137 +msgid "Choosing Template" +msgstr "Choisir le canevas" + #: libreplan-webapp/src/main/webapp/calendars/_edition.zul:66 #: libreplan-webapp/src/main/webapp/resources/worker/_listVirtualWorkers.zul:35 msgid "Capacity" @@ -5004,7 +5035,7 @@ msgstr "Aucune allocation n'a été faite" msgid "Removed calendar \"{0}\"" msgstr "Suppression du calendrier \"{0}\"" -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:1068 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:1072 msgid "Create project" msgstr "Créer le projet" @@ -5045,29 +5076,29 @@ msgstr "Impossible d'ajouter ces droits à l'utilisateur {0} car il les possède msgid "New work report" msgstr "Nouveau rapport de travail" +#: libreplan-webapp/src/main/java/org/libreplan/web/calendars/BaseCalendarEditionController.java:305 +msgid "Root calendar" +msgstr "Calendrier source" + #: libreplan-webapp/src/main/java/org/libreplan/web/resources/worker/WorkerCRUDController.java:847 #: libreplan-webapp/src/main/java/org/libreplan/web/resources/machine/MachineCRUDController.java:578 msgid "yes" msgstr "oui" -#: libreplan-webapp/src/main/java/org/libreplan/web/calendars/BaseCalendarEditionController.java:305 -msgid "Root calendar" -msgstr "Calendrier source" - -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:867 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:871 msgid "" "Deleting this subcontracted project, you are going to lose the relation to " "report progress. Are you sure?" msgstr "Suppression de ce projet sous-traité, vous allez perdre la relation avec le rapport d'avancement. Êtes-vous sûr ?" -#: libreplan-webapp/src/main/webapp/common/configuration.zul:278 -msgid "Port" -msgstr "Port" - #: libreplan-webapp/src/main/webapp/limitingresources/manualAllocation.zul:113 msgid "Select gap" msgstr "Choisir l'écart" +#: libreplan-webapp/src/main/webapp/common/configuration.zul:278 +msgid "Port" +msgstr "Port" + #: libreplan-webapp/src/main/webapp/workreports/workReport.zul:63 msgid "Date Finish" msgstr "Date de fin" @@ -5095,7 +5126,11 @@ msgstr "Affectation des catégories de coût" msgid "missing code in a hour cost" msgstr "code manquant dans le coût horaire" -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/TaskElementAdapter.java:902 +#: libreplan-webapp/src/main/java/org/libreplan/web/exceptionDays/CalendarExceptionTypeCRUDController.java:247 +msgid "Exception Day Type" +msgstr "Type de jour exceptionnel" + +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/TaskElementAdapter.java:973 msgid "All workers" msgstr "Tous les participants" @@ -5119,14 +5154,16 @@ msgstr "Groupe d'heures {0}: code dupliqué dans la base de données" #: libreplan-webapp/src/main/java/org/libreplan/web/materials/MaterialsController.java:311 #: libreplan-webapp/src/main/java/org/libreplan/web/costcategories/CostCategoryCRUDController.java:207 #: libreplan-webapp/src/main/java/org/libreplan/web/costcategories/CostCategoryCRUDController.java:307 +#: libreplan-webapp/src/main/java/org/libreplan/web/templates/TemplatesTreeController.java:110 +#: libreplan-webapp/src/main/java/org/libreplan/web/templates/TemplatesTreeController.java:130 #: libreplan-webapp/src/main/java/org/libreplan/web/calendars/BaseCalendarEditionController.java:994 #: libreplan-webapp/src/main/java/org/libreplan/web/calendars/BaseCalendarEditionController.java:1184 #: libreplan-webapp/src/main/java/org/libreplan/web/calendars/BaseCalendarEditionController.java:1441 #: libreplan-webapp/src/main/java/org/libreplan/web/resources/criterion/CriterionTreeController.java:135 #: libreplan-webapp/src/main/java/org/libreplan/web/orders/ProjectDetailsController.java:171 #: libreplan-webapp/src/main/java/org/libreplan/web/orders/labels/AssignedLabelsController.java:115 -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:1488 -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:1512 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:1492 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:1516 #: libreplan-webapp/src/main/java/org/libreplan/web/common/ConfigurationController.java:757 #: libreplan-webapp/src/main/webapp/labels/_editLabelType.zul:45 #: libreplan-webapp/src/main/webapp/labels/_editLabelType.zul:53 @@ -5193,10 +5230,6 @@ msgstr "Type d'unité" msgid "Load due to other assignments" msgstr "Charge due pour les autres affectations" -#: libreplan-webapp/src/main/webapp/orders/_listOrderElementHours.zul:62 -msgid "Sum of all task leafs imputed hours" -msgstr "Somme de toutes les heures imputées des tâches terminales" - #: libreplan-webapp/src/main/java/org/libreplan/web/resources/machine/MachineCRUDController.java:554 msgid "This machine was already removed by other user" msgstr "Cette machine a déjà été supprimée par un autre utilisateur" @@ -5269,11 +5302,11 @@ msgstr "Identifiant de notre compagnie" msgid "Filter work reports" msgstr "Filtrer les rapports de travail" -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/TaskElementAdapter.java:947 -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderModel.java:678 -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderElementTreeController.java:601 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/TaskElementAdapter.java:1018 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderModel.java:684 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderElementTreeController.java:603 #: libreplan-webapp/src/main/java/org/libreplan/web/common/CustomMenuController.java:328 -#: libreplan-webapp/src/main/webapp/templates/templates.zul:63 +#: libreplan-webapp/src/main/webapp/templates/templates.zul:64 #: libreplan-webapp/src/main/webapp/templates/_editTemplateWindow.zul:49 #: libreplan-webapp/src/main/webapp/orders/_editOrderElement.zul:48 #: libreplan-webapp/src/main/webapp/orders/_edition.zul:46 @@ -5336,7 +5369,7 @@ msgstr "options" msgid "LibrePlan: Work Reports" msgstr "LibrePlan: Rapports de travail" -#: libreplan-webapp/src/main/java/org/libreplan/web/templates/OrderTemplatesController.java:373 +#: libreplan-webapp/src/main/java/org/libreplan/web/templates/OrderTemplatesController.java:393 #: libreplan-webapp/src/main/java/org/libreplan/web/orders/materials/AssignedMaterialsController.java:393 msgid "Error on showing delete confirm" msgstr "Erreur en affichant la confirmation de suppression" @@ -5361,7 +5394,7 @@ msgstr "Grouper par semaine" msgid "Finish hour" msgstr "Heure de fin" -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/reassign/ReassignCommand.java:200 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/reassign/ReassignCommand.java:196 msgid "Done {0} of {1}" msgstr "{0} sur {1} de réalisé" @@ -5417,16 +5450,16 @@ msgstr "Cette mesure d'avancement ne peut pas être incluse" msgid "Inherited labels" msgstr "Libellés hérités" -#: libreplan-webapp/src/main/java/org/libreplan/web/tree/TreeController.java:946 -#: libreplan-webapp/src/main/java/org/libreplan/web/resources/criterion/CriterionTreeController.java:292 -msgid "Unindent" -msgstr "Réduire le décalage" - #: libreplan-webapp/src/main/java/org/libreplan/web/orders/ManageOrderElementAdvancesController.java:939 #: libreplan-webapp/src/main/java/org/libreplan/web/orders/ManageOrderElementAdvancesController.java:1406 msgid "Value is not valid, the current value must be not empty" msgstr "La valeur n'est pas correcte, la valeur courante ne doit pas être vide" +#: libreplan-webapp/src/main/java/org/libreplan/web/tree/TreeController.java:1063 +#: libreplan-webapp/src/main/java/org/libreplan/web/resources/criterion/CriterionTreeController.java:292 +msgid "Unindent" +msgstr "Réduire le décalage" + #: libreplan-webapp/src/main/webapp/orders/components/_listOrderElementLabels.zul:50 msgid "Direct labels" msgstr "Orienter les libellés " @@ -5490,7 +5523,7 @@ msgstr "La séquence de code est déjà utilisée et ne peut pas être mise à j msgid "Scheduling state" msgstr "Etat de la prévision" -#: libreplan-webapp/src/main/java/org/libreplan/web/templates/OrderTemplatesController.java:369 +#: libreplan-webapp/src/main/java/org/libreplan/web/templates/OrderTemplatesController.java:389 msgid "This template can not be removed because it has applications." msgstr "Ce modèle ne peut pas être supprimé car il a des applications" @@ -5510,6 +5543,10 @@ msgstr "LibrePlan: Heures travaillées par ressource" msgid "Number of iterations should be between 1 and " msgstr "Le nombre d'itérations doit être entre 1 et " +#: libreplan-webapp/src/main/webapp/orders/_listOrderElementHours.zul:151 +msgid "Budget in money" +msgstr "Budget monétisé" + #: libreplan-webapp/src/main/java/org/libreplan/web/common/ConfigurationController.java:145 msgid "Scenarios must be enabled as more elements than master exist" msgstr "Les scénarios doivent être autorisés quand plus d'élément que le maître existent" @@ -5552,7 +5589,7 @@ msgstr "Hér" msgid "Administrator" msgstr "Administrateur" -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/reassign/ReassignCommand.java:190 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/reassign/ReassignCommand.java:186 msgid "Doing {0} reassignations" msgstr "Réalise {0} réaffectations" @@ -5588,7 +5625,7 @@ msgstr "Impossible de supprimer le type de rapport de travail. Il y a des rappor msgid "Criterion Type List" msgstr "Liste des types de critères" -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/OrderPlanningModel.java:739 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/OrderPlanningModel.java:765 msgid "Overall progress" msgstr "Avancement global" @@ -5612,7 +5649,7 @@ msgstr "Mot de passe" msgid "Observations" msgstr "Observations" -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:947 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:951 msgid "Edit project" msgstr "Modifier le projet" @@ -5667,7 +5704,6 @@ msgstr "Supprimer {0} \"{1}\". Êtes-vous sûr ?" msgid "Only {0} resources per day were achieved for current allocation" msgstr "Seules {0} ressources par jour ont été atteintes pour l'allocation actuelle" -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/assigntemplates/TemplateFinderPopup.java:51 #: libreplan-webapp/src/main/webapp/planner/editTask.zul:79 #: libreplan-webapp/src/main/webapp/planner/reassign.zul:48 #: libreplan-webapp/src/main/webapp/planner/stretches_function.zul:89 @@ -5714,6 +5750,10 @@ msgstr "Réalisé: {0}%" msgid "Calculated progress measurement can not be removed" msgstr "La mesure d'avancement calculée ne peut être supprimée" +#: libreplan-webapp/src/main/java/org/libreplan/web/exceptionDays/CalendarExceptionTypeCRUDController.java:252 +msgid "Exception Day Types" +msgstr "Types de jour exceptionnel" + #: libreplan-webapp/src/main/java/org/libreplan/web/resources/worker/AssignedCriterionsModel.java:335 #: libreplan-webapp/src/main/java/org/libreplan/web/resources/worker/AssignedCriterionsModel.java:341 msgid " The " @@ -5757,6 +5797,10 @@ msgstr "Appliquer les changements et continuer l'édition" msgid "Infinitely Over Assignable" msgstr "Infiniment sur-affectable" +#: libreplan-webapp/src/main/webapp/orders/_listOrderElementHours.zul:157 +msgid "Money spent" +msgstr "Argent dépensé" + #: libreplan-business/src/main/java/org/libreplan/business/resources/entities/CriterionType.java:426 msgid "criterion names must be unique inside a criterion type" msgstr "les noms de critères doivent être unique dans un type de critère" @@ -5792,7 +5836,7 @@ msgstr "Les périodes disponibles dépendent de la satisfaction du critère par #: libreplan-webapp/src/main/webapp/reports/hoursWorkedPerWorkerReport.zul:86 #: libreplan-webapp/src/main/webapp/reports/schedulingProgressPerOrderReport.zul:116 #: libreplan-webapp/src/main/webapp/reports/timeLineMaterialReport.zul:95 -#: libreplan-webapp/src/main/webapp/templates/templates.zul:85 +#: libreplan-webapp/src/main/webapp/templates/templates.zul:86 #: libreplan-webapp/src/main/webapp/templates/_list.zul:26 #: libreplan-webapp/src/main/webapp/templates/_materialAssignmentsBox.zul:28 #: libreplan-webapp/src/main/webapp/calendars/_edition.zul:54 @@ -5849,15 +5893,20 @@ msgstr "Date de début" msgid "Update exception" msgstr "Mettre à jour l'exception" -#: libreplan-webapp/src/main/webapp/subcontract/subcontractedTasks.zul:52 -#: libreplan-webapp/src/main/webapp/orders/_edition.zul:140 -msgid "Budget" -msgstr "Budget" - #: libreplan-webapp/src/main/java/org/libreplan/web/orders/TreeElementOperationsController.java:253 msgid "Operation cannot be done" msgstr "L'opération ne peut pas être effectuée" +#: libreplan-webapp/src/main/java/org/libreplan/web/templates/TemplatesTreeComponent.java:91 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrdersTreeComponent.java:80 +#: libreplan-webapp/src/main/webapp/planner/taskpanels/_tabPanelTaskProperties.zul:62 +#: libreplan-webapp/src/main/webapp/templates/templates.zul:107 +#: libreplan-webapp/src/main/webapp/subcontract/subcontractedTasks.zul:52 +#: libreplan-webapp/src/main/webapp/orders/_orderElementDetails.zul:65 +#: libreplan-webapp/src/main/webapp/orders/_edition.zul:140 +msgid "Budget" +msgstr "Budget" + #: libreplan-webapp/src/main/java/org/libreplan/web/reports/HoursWorkedPerWorkerInAMonthController.java:44 msgid "May" msgstr "Mai" @@ -5891,7 +5940,7 @@ msgstr "Nombre d'applications" msgid "Assign element to queue automatically" msgstr "Affecte l'élément à la file automatiquement" -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrdersTreeComponent.java:82 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrdersTreeComponent.java:92 msgid "" "Date which the task must start after (press enter in textbox to open " "calendar popup or type in date directly)" @@ -5927,8 +5976,8 @@ msgstr "Ce type de libellé est déjà affecté au type de rapport de travail." msgid "Probability %" msgstr "% de probabilité" -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/OrderPlanningModel.java:737 -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/company/CompanyPlanningModel.java:324 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/OrderPlanningModel.java:763 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/company/CompanyPlanningModel.java:321 #: libreplan-webapp/src/main/java/org/libreplan/web/resourceload/ResourceLoadController.java:815 #: libreplan-webapp/src/main/webapp/planner/_legendLoadChartOrder.zul:49 msgid "Load" @@ -5939,12 +5988,12 @@ msgstr "Charge" msgid "New criterion" msgstr "Nouveau critère" -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderModel.java:683 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderModel.java:689 #: libreplan-webapp/src/main/webapp/materials/materials.zul:81 #: libreplan-webapp/src/main/webapp/scenarios/_edition.zul:43 #: libreplan-webapp/src/main/webapp/qualityforms/_listQualityForm.zul:37 #: libreplan-webapp/src/main/webapp/qualityforms/_editQualityForm.zul:49 -#: libreplan-webapp/src/main/webapp/templates/templates.zul:101 +#: libreplan-webapp/src/main/webapp/templates/templates.zul:102 #: libreplan-webapp/src/main/webapp/templates/_list.zul:32 #: libreplan-webapp/src/main/webapp/subcontract/subcontractedTasks.zul:51 #: libreplan-webapp/src/main/webapp/resources/machine/_listMachines.zul:36 @@ -5968,7 +6017,7 @@ msgstr "Noeud choisi" msgid "already exists an allocation for criteria {0}" msgstr "il existe déjà une allocation pour le critère {0}" -#: libreplan-webapp/src/main/java/org/libreplan/web/templates/OrderTemplatesController.java:283 +#: libreplan-webapp/src/main/java/org/libreplan/web/templates/OrderTemplatesController.java:303 #: libreplan-webapp/src/main/java/org/libreplan/web/common/CustomMenuController.java:294 msgid "Project Templates" msgstr "Modèles de projet" @@ -5995,7 +6044,7 @@ msgstr "Non affecté" msgid "At least one HoursGroup is needed" msgstr "Au moins un groupe d'heures est nécessaire" -#: libreplan-webapp/src/main/java/org/libreplan/web/users/UserCRUDController.java:178 +#: libreplan-webapp/src/main/java/org/libreplan/web/users/UserCRUDController.java:184 #: libreplan-webapp/src/main/webapp/externalcompanies/_editExternalCompany.zul:63 #: libreplan-webapp/src/main/webapp/common/layout/login.zul:74 #: libreplan-business/src/main/java/org/libreplan/business/advance/entities/AdvanceType.java:165 @@ -6059,8 +6108,8 @@ msgstr "Charge à 100%" msgid "Function" msgstr "Fonction" -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/OrderPlanningModel.java:799 -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/company/CompanyPlanningModel.java:363 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/OrderPlanningModel.java:825 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/company/CompanyPlanningModel.java:360 msgid "date in future" msgstr "date dans le futur" @@ -6075,14 +6124,14 @@ msgstr "date dans le futur" msgid "Format" msgstr "Format" -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/SaveCommandBuilder.java:887 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/SaveCommandBuilder.java:885 msgid "New project version" msgstr "Nouvelle version du projet" -#: libreplan-webapp/src/main/java/org/libreplan/web/templates/TemplatesTreeController.java:77 +#: libreplan-webapp/src/main/java/org/libreplan/web/templates/TemplatesTreeController.java:79 #: libreplan-webapp/src/main/java/org/libreplan/web/calendars/BaseCalendarCRUDController.java:366 -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderElementTreeController.java:484 -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:1231 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderElementTreeController.java:486 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:1235 #: libreplan-webapp/src/main/java/org/libreplan/web/limitingresources/QueueComponent.java:478 #: libreplan-webapp/src/main/java/org/libreplan/web/common/Util.java:537 #: libreplan-webapp/src/main/webapp/labels/_listLabelTypes.zul:37 @@ -6253,7 +6302,7 @@ msgstr "La valeur n'est pas correcte, la valeur doit être plus grande que la va msgid "BCWS" msgstr "CPBT" -#: libreplan-webapp/src/main/java/org/libreplan/web/print/CutyPrint.java:351 +#: libreplan-webapp/src/main/java/org/libreplan/web/print/CutyPrint.java:343 msgid " in the specified directory." msgstr " dans le répertoire indiqué" @@ -6306,7 +6355,7 @@ msgstr "Coût réel du travail réalisé" msgid "Create project from Template" msgstr "Créer un projet à partir d'un modèle" -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderElementTreeController.java:418 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderElementTreeController.java:420 msgid "" "Value is not valid.\n" " Code cannot contain chars like '_' \n" @@ -6317,11 +6366,15 @@ msgstr "La valeur est invalide.\n Le code ne peut contenir de caractère comme ' msgid "an authorization type must be set" msgstr "un type de permission doit être choisi" -#: libreplan-webapp/src/main/java/org/libreplan/web/templates/TemplatesTreeComponent.java:92 +#: libreplan-webapp/src/main/java/org/libreplan/web/templates/TemplatesTreeComponent.java:101 msgid "Must start after (days since beginning project)" msgstr "Doit démarrer après (en jours depuis le début du projet)" -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/SaveCommandBuilder.java:886 +#: libreplan-webapp/src/main/webapp/orders/_listOrderElementHours.zul:134 +msgid "Percentage of estimated budget in money / money spent" +msgstr "Pourcentage du budget estimé en argent / argent dépensé" + +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/SaveCommandBuilder.java:884 msgid "" "Confirm creating a new project version for this scenario and derived. Are " "you sure?" @@ -6369,14 +6422,14 @@ msgstr "Désélectionner" msgid "You should select the type of exception" msgstr "Vous devez choisir le type d'exception" -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrdersTreeComponent.java:93 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrdersTreeComponent.java:103 #: libreplan-webapp/src/main/webapp/planner/taskpanels/_tabPanelTaskProperties.zul:46 #: libreplan-webapp/src/main/webapp/orders/_projectDetails.zul:63 #: libreplan-webapp/src/main/webapp/orders/_orderElementDetails.zul:52 #: libreplan-webapp/src/main/webapp/orders/_edition.zul:101 #: libreplan-webapp/src/main/webapp/orders/_list.zul:31 msgid "Deadline" -msgstr "Ligne critique" +msgstr "Echéance" #: libreplan-webapp/src/main/webapp/reports/hoursWorkedPerWorkerReport.zul:113 msgid "Tasks" @@ -6421,7 +6474,7 @@ msgstr "Allocation avancée" msgid "Number of iterations" msgstr "Nombre d'itérations" -#: libreplan-webapp/src/main/webapp/templates/templates.zul:60 +#: libreplan-webapp/src/main/webapp/templates/templates.zul:61 msgid "Template Tree" msgstr "Arbre des modèles" @@ -6448,11 +6501,15 @@ msgstr "l'effort n'est pas correctement calculé en se basant sur l'horloge" msgid "Status" msgstr "Etat" +#: libreplan-webapp/src/main/java/org/libreplan/web/calendars/BaseCalendarEditionController.java:321 +msgid "from {0}" +msgstr "à partir de {0}" + #: libreplan-webapp/src/main/webapp/settings/settings.zul:111 msgid "Resource load view" msgstr "Vue de la charge des ressources" -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/OrderPlanningModel.java:787 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/OrderPlanningModel.java:813 msgid "the date must be inside the visualization area" msgstr "la date doit être à l'intérieure de la zone de visualisation" @@ -6602,8 +6659,8 @@ msgid "Task Scheduling Status In Project" msgstr "Etat prévisionnel de la tâche dans le projet" #: libreplan-webapp/src/main/java/org/libreplan/web/qualityforms/QualityFormCRUDController.java:162 -#: libreplan-webapp/src/main/java/org/libreplan/web/templates/OrderTemplatesController.java:356 -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:868 +#: libreplan-webapp/src/main/java/org/libreplan/web/templates/OrderTemplatesController.java:376 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:872 #: libreplan-webapp/src/main/java/org/libreplan/web/common/BaseCRUDController.java:313 msgid "Confirm" msgstr "Confirmer" @@ -6655,8 +6712,8 @@ msgstr "Prix total" #: libreplan-webapp/src/main/java/org/libreplan/web/workreports/WorkReportCRUDController.java:1214 #: libreplan-webapp/src/main/java/org/libreplan/web/workreports/WorkReportCRUDController.java:1226 #: libreplan-webapp/src/main/java/org/libreplan/web/workreports/WorkReportTypeCRUDController.java:346 -#: libreplan-webapp/src/main/java/org/libreplan/web/tree/TreeController.java:984 -#: libreplan-webapp/src/main/java/org/libreplan/web/tree/TreeController.java:990 +#: libreplan-webapp/src/main/java/org/libreplan/web/tree/TreeController.java:1101 +#: libreplan-webapp/src/main/java/org/libreplan/web/tree/TreeController.java:1107 #: libreplan-webapp/src/main/java/org/libreplan/web/costcategories/CostCategoryCRUDController.java:289 #: libreplan-webapp/src/main/java/org/libreplan/web/costcategories/CostCategoryCRUDController.java:457 #: libreplan-webapp/src/main/java/org/libreplan/web/costcategories/ResourcesCostCategoryAssignmentController.java:143 @@ -6675,7 +6732,7 @@ msgstr "Prix total" #: libreplan-webapp/src/main/java/org/libreplan/web/orders/AssignedTaskQualityFormsToOrderElementController.java:201 #: libreplan-webapp/src/main/java/org/libreplan/web/orders/AssignedTaskQualityFormsToOrderElementController.java:333 #: libreplan-webapp/src/main/java/org/libreplan/web/orders/AssignedTaskQualityFormsToOrderElementController.java:406 -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:1247 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:1251 #: libreplan-webapp/src/main/webapp/labels/_editLabelType.zul:99 #: libreplan-webapp/src/main/webapp/labels/_listLabelTypes.zul:42 #: libreplan-webapp/src/main/webapp/externalcompanies/_listExternalCompanies.zul:49 @@ -6700,10 +6757,8 @@ msgstr "Prix total" #: libreplan-webapp/src/main/webapp/reports/workingArrangementsPerOrderReport.zul:154 #: libreplan-webapp/src/main/webapp/reports/timeLineMaterialReport.zul:106 #: libreplan-webapp/src/main/webapp/users/_listUsers.zul:46 -#: libreplan-webapp/src/main/webapp/users/_editProfile.zul:68 #: libreplan-webapp/src/main/webapp/users/_listProfiles.zul:40 -#: libreplan-webapp/src/main/webapp/users/_editUser.zul:115 -#: libreplan-webapp/src/main/webapp/users/_editUser.zul:148 +#: libreplan-webapp/src/main/webapp/users/_editUser.zul:137 #: libreplan-webapp/src/main/webapp/templates/_list.zul:53 #: libreplan-webapp/src/main/webapp/templates/_materialAssignmentsBox.zul:55 #: libreplan-webapp/src/main/webapp/resources/worker/_listVirtualWorkers.zul:52 @@ -6803,8 +6858,8 @@ msgid "Stretches" msgstr "Extensions" #: libreplan-business/src/main/java/org/libreplan/business/planner/entities/AssignmentFunction.java:79 -msgid "Interporlation" -msgstr "Interpolations" +msgid "Interpolation" +msgstr "Interpolation" #: libreplan-business/src/main/java/org/libreplan/business/planner/entities/AssignmentFunction.java:80 msgid "Sigmoid" @@ -6867,23 +6922,23 @@ msgstr "En cours" msgid "Blocked" msgstr "Bloqué" -#: libreplan-business/src/main/java/org/libreplan/business/planner/entities/PositionConstraintType.java:29 +#: libreplan-business/src/main/java/org/libreplan/business/planner/entities/PositionConstraintType.java:31 msgid "as soon as possible" msgstr "Dès que possible" -#: libreplan-business/src/main/java/org/libreplan/business/planner/entities/PositionConstraintType.java:41 +#: libreplan-business/src/main/java/org/libreplan/business/planner/entities/PositionConstraintType.java:38 msgid "start not earlier than" msgstr "ne démarre pas plus tôt que" -#: libreplan-business/src/main/java/org/libreplan/business/planner/entities/PositionConstraintType.java:53 +#: libreplan-business/src/main/java/org/libreplan/business/planner/entities/PositionConstraintType.java:45 msgid "start in fixed date" msgstr "démarre à la date indiquée" -#: libreplan-business/src/main/java/org/libreplan/business/planner/entities/PositionConstraintType.java:65 +#: libreplan-business/src/main/java/org/libreplan/business/planner/entities/PositionConstraintType.java:57 msgid "as late as possible" msgstr "aussi tard que possible" -#: libreplan-business/src/main/java/org/libreplan/business/planner/entities/PositionConstraintType.java:77 +#: libreplan-business/src/main/java/org/libreplan/business/planner/entities/PositionConstraintType.java:64 msgid "finish not later than" msgstr "ne finit pas plus tard que" @@ -6923,7 +6978,7 @@ msgstr "Modification de tous les projets autorisée" msgid "Project creation allowed" msgstr "Création de projet autorisée" -#: libreplan-business/src/main/java/org/libreplan/business/templates/entities/OrderLineTemplate.java:122 +#: libreplan-business/src/main/java/org/libreplan/business/templates/entities/OrderLineTemplate.java:132 msgid "Line" msgstr "Ligne" @@ -7091,23 +7146,23 @@ msgstr "P" msgid "U" msgstr "D" -#: libreplan-business/src/main/java/org/libreplan/business/orders/entities/OrderElement.java:618 +#: libreplan-business/src/main/java/org/libreplan/business/orders/entities/OrderElement.java:629 msgid "" "Some ancestor has the same label assigned, so this element is already " "inheriting this label" msgstr "Certains ancêtres ont le même libellé affecté de telle sorte que cet élément a déjà hérité de ce libellé" -#: libreplan-business/src/main/java/org/libreplan/business/orders/entities/OrderElement.java:717 +#: libreplan-business/src/main/java/org/libreplan/business/orders/entities/OrderElement.java:728 #: libreplan-business/src/main/java/org/libreplan/business/orders/entities/OrderLineGroup.java:963 msgid "Cannot spread two progress in the same task" msgstr "Impossible d'étendre deux avancements dans la même tâche" -#: libreplan-business/src/main/java/org/libreplan/business/orders/entities/OrderElement.java:741 -#: libreplan-business/src/main/java/org/libreplan/business/orders/entities/OrderElement.java:767 +#: libreplan-business/src/main/java/org/libreplan/business/orders/entities/OrderElement.java:752 +#: libreplan-business/src/main/java/org/libreplan/business/orders/entities/OrderElement.java:778 msgid "Duplicate Progress Assignment For Task" msgstr "Affectation d'avancement dupliquée pour la tâche" -#: libreplan-business/src/main/java/org/libreplan/business/orders/entities/OrderElement.java:1094 +#: libreplan-business/src/main/java/org/libreplan/business/orders/entities/OrderElement.java:1105 msgid "Quality form already exists" msgstr "Le formulaire qualité existe déjà" From a55fb9e9f795d8642376e9eb3fdbf64bb9fef84b Mon Sep 17 00:00:00 2001 From: Jeroen Baten Date: Fri, 13 Apr 2012 17:06:05 +0200 Subject: [PATCH 013/108] i18n: Update Dutch translation --- ganttzk/src/main/resources/i18n/nl.po | 44 +- .../src/main/resources/i18n/nl.po | 567 ++++++++++-------- 2 files changed, 339 insertions(+), 272 deletions(-) diff --git a/ganttzk/src/main/resources/i18n/nl.po b/ganttzk/src/main/resources/i18n/nl.po index 339ca61b0..fde0eff2e 100644 --- a/ganttzk/src/main/resources/i18n/nl.po +++ b/ganttzk/src/main/resources/i18n/nl.po @@ -8,10 +8,10 @@ # Jeroen Baten , 2012. msgid "" msgstr "" -"Project-Id-Version: LibrePlan\n" +"Project-Id-Version: libreplan-1.2.3\n" "Report-Msgid-Bugs-To: http://bugs.libreplan.org/\n" -"POT-Creation-Date: 2012-02-24 09:08+0100\n" -"PO-Revision-Date: 2012-02-29 19:53+0000\n" +"POT-Creation-Date: 2012-04-11 08:32+0200\n" +"PO-Revision-Date: 2012-04-13 14:30+0000\n" "Last-Translator: Jeroen Baten \n" "Language-Team: Nederlands\n" "MIME-Version: 1.0\n" @@ -33,11 +33,15 @@ msgstr "Voeg afhankelijkheid toe" msgid "Worker" msgstr "Werker" +#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:682 +msgid "Show money cost bar" +msgstr "Toon geldelijke kosten balk" + #: ganttzk/src/main/resources/web/ganttz/zul/leftTasksTree.zul:29 msgid "Start" msgstr "Start" -#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:635 +#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:661 msgid "Show reported hours" msgstr "Toon gerapporteerde uren" @@ -86,6 +90,10 @@ msgstr "Beschikbare inspanning: {0}, toegewezen inspanning: {1}" msgid "Criterion" msgstr "Criterium" +#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:688 +msgid "Hide money cost bar" +msgstr "Verberg geldelijke kosten balk" + #: ganttzk/src/main/resources/web/ganttz/zul/plannerLayout.zul:44 msgid "Print" msgstr "Afdrukken" @@ -114,6 +122,10 @@ msgstr "Einde" msgid "changing zoom" msgstr "wijzig zoom" +#: ganttzk/src/main/resources/web/ganttz/zul/plannerLayout.zul:91 +msgid "Show/Hide money cost bar" +msgstr "Toon/verberg geldelijke kosten balk" + #: ganttzk/src/main/java/org/zkoss/ganttz/timetracker/zoom/ZoomLevel.java:45 msgid "Quarter" msgstr "Kwartaal" @@ -139,7 +151,7 @@ msgstr "Naam" msgid "Name filter" msgstr "Naam filter " -#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:615 +#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:641 msgid "Show progress" msgstr "Toon voortgang" @@ -151,14 +163,14 @@ msgstr "Inklappen/Uitklappen alles" msgid "Show/Hide critical path" msgstr "Toon/Verberg kritieke pad" -#: ganttzk/src/main/java/org/zkoss/ganttz/timetracker/zoom/ZoomLevel.java:32 -msgid "Year" -msgstr "Jaar" - #: ganttzk/src/main/java/org/zkoss/ganttz/resourceload/ResourcesLoadPanel.java:150 msgid "showing criteria" msgstr "tonen criteria" +#: ganttzk/src/main/java/org/zkoss/ganttz/timetracker/zoom/ZoomLevel.java:32 +msgid "Year" +msgstr "Jaar" + #: ganttzk/src/main/java/org/zkoss/ganttz/timetracker/zoom/ZoomLevel.java:58 msgid "Month" msgstr "Maand" @@ -171,11 +183,11 @@ msgstr "Toon/Verberg resources" msgid "Set End-Start" msgstr "Set End-Start" -#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:297 +#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:308 msgid "decreasing zoom" msgstr "uitzoomen" -#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:596 +#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:622 msgid "Hide critical path" msgstr "Verberg kritieke pad" @@ -183,7 +195,7 @@ msgstr "Verberg kritieke pad" msgid "Day" msgstr "Dag" -#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:642 +#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:668 msgid "Hide reported hours" msgstr "Verberg gerapporteerde uren" @@ -204,7 +216,7 @@ msgid "Hour" msgstr "Uur" #: ganttzk/src/main/resources/web/ganttz/zul/resourcesLoadLayout.zul:90 -#: ganttzk/src/main/resources/web/ganttz/zul/plannerLayout.zul:114 +#: ganttzk/src/main/resources/web/ganttz/zul/plannerLayout.zul:120 msgid "Graphics" msgstr "Graphics" @@ -216,7 +228,7 @@ msgstr "Set Start-Start" msgid "See resource allocation" msgstr "Zie resource allocation" -#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:280 +#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:291 msgid "increasing zoom" msgstr "Inzoomen" @@ -232,10 +244,10 @@ msgstr "Alle" msgid "Refresh" msgstr "Ververs" -#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:591 +#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:617 msgid "Show critical path" msgstr "Toon kritieke pad" -#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:620 +#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:646 msgid "Hide progress" msgstr "Verberg voortgang" diff --git a/libreplan-webapp/src/main/resources/i18n/nl.po b/libreplan-webapp/src/main/resources/i18n/nl.po index 8ed8968b8..0d11f215e 100644 --- a/libreplan-webapp/src/main/resources/i18n/nl.po +++ b/libreplan-webapp/src/main/resources/i18n/nl.po @@ -8,10 +8,10 @@ # Jeroen Baten , 2012. msgid "" msgstr "" -"Project-Id-Version: 1.2.2\n" +"Project-Id-Version: libreplan-1.2.3\n" "Report-Msgid-Bugs-To: http://bugs.libreplan.org/\n" -"POT-Creation-Date: 2012-02-24 09:08+0100\n" -"PO-Revision-Date: 2012-02-29 20:18+0000\n" +"POT-Creation-Date: 2012-04-11 08:32+0200\n" +"PO-Revision-Date: 2012-04-13 14:28+0000\n" "Last-Translator: Jeroen Baten \n" "Language-Team: Nederlands\n" "MIME-Version: 1.0\n" @@ -150,7 +150,7 @@ msgstr "Het kan niet leeg zijn" #: libreplan-webapp/src/main/java/org/libreplan/web/common/CustomMenuController.java:324 #: libreplan-webapp/src/main/webapp/materials/materials.zul:33 -#: libreplan-webapp/src/main/webapp/templates/templates.zul:66 +#: libreplan-webapp/src/main/webapp/templates/templates.zul:67 #: libreplan-webapp/src/main/webapp/templates/_editTemplateWindow.zul:52 #: libreplan-webapp/src/main/webapp/templates/_materialAssignmentsBox.zul:22 #: libreplan-webapp/src/main/webapp/orders/_editOrderElement.zul:54 @@ -159,7 +159,7 @@ msgstr "Het kan niet leeg zijn" msgid "Materials" msgstr "Materialen" -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/reassign/ReassignCommand.java:361 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/reassign/ReassignCommand.java:357 msgid "Reassign" msgstr "Opnieuw toekennen" @@ -200,7 +200,7 @@ msgstr "Voorgedefinieerd" #: libreplan-webapp/src/main/java/org/libreplan/web/qualityforms/QualityFormCRUDController.java:344 #: libreplan-webapp/src/main/java/org/libreplan/web/common/CustomMenuController.java:325 -#: libreplan-webapp/src/main/webapp/templates/templates.zul:67 +#: libreplan-webapp/src/main/webapp/templates/templates.zul:68 #: libreplan-webapp/src/main/webapp/templates/_editTemplateWindow.zul:53 msgid "Quality Forms" msgstr "Kwaliteit formulieren" @@ -209,11 +209,15 @@ msgstr "Kwaliteit formulieren" msgid "Reports" msgstr "Rapporten" +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/assigntemplates/TemplateFinderPopup.java:117 +msgid "Create task" +msgstr "Maak taak" + #: libreplan-webapp/src/main/webapp/planner/advance_allocation.zul:22 msgid "LibrePlan: Advanced allocation" msgstr "LibrePlan: Gevorderde allocatie" -#: libreplan-webapp/src/main/java/org/libreplan/web/common/ConfigurationModel.java:172 +#: libreplan-webapp/src/main/java/org/libreplan/web/common/ConfigurationModel.java:177 msgid "The {0} sequence prefixes can not be repeated" msgstr "De {0} sequentie prefix kan niet herhaald worden" @@ -300,7 +304,7 @@ msgid "generic workers allocation" msgstr "algemene werkers allocatie" #: libreplan-webapp/src/main/java/org/libreplan/web/resourceload/ResourceLoadController.java:310 -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:895 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:899 msgid "The project has no scheduled elements" msgstr "Het project heeft geen ingeplande elementen" @@ -378,19 +382,19 @@ msgstr "Klik hier" msgid "Project Name" msgstr "Projectnaam" -#: libreplan-webapp/src/main/java/org/libreplan/web/tree/TreeController.java:967 +#: libreplan-webapp/src/main/java/org/libreplan/web/tree/TreeController.java:1084 #: libreplan-webapp/src/main/java/org/libreplan/web/resources/criterion/CriterionTreeController.java:306 msgid "Indent" msgstr "Inspringen" +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/reassign/ReassignCommand.java:252 +msgid "Reassignation" +msgstr "Opnieuw toekennen" + #: libreplan-webapp/src/main/webapp/common/configuration.zul:327 msgid "Save passwords in database" msgstr "Sla wachtwoord op in database" -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/reassign/ReassignCommand.java:256 -msgid "Reassignation" -msgstr "Opnieuw toekennen" - #: libreplan-webapp/src/main/java/org/libreplan/web/templates/TemplatesTree.java:42 msgid "New template" msgstr "Nieuwe sjabloon" @@ -459,7 +463,7 @@ msgid "" "applicable to this resource" msgstr "er bestaan criterium overeenkomsten die verwijzen naar criterium types die niet relevant zijn voor deze resource " -#: libreplan-webapp/src/main/webapp/templates/templates.zul:65 +#: libreplan-webapp/src/main/webapp/templates/templates.zul:66 #: libreplan-webapp/src/main/webapp/orders/_editOrderElement.zul:52 #: libreplan-webapp/src/main/webapp/orders/_edition.zul:50 msgid "Criterion Requirement" @@ -594,7 +598,7 @@ msgstr "Oktober" msgid "First name" msgstr "Voornaam" -#: libreplan-webapp/src/main/java/org/libreplan/web/print/CutyPrint.java:256 +#: libreplan-webapp/src/main/java/org/libreplan/web/print/CutyPrint.java:250 msgid "Could not execute print command" msgstr "Kon het print commando niet uitvoeren" @@ -607,7 +611,7 @@ msgstr "Complementaire tekstvelden" #: libreplan-webapp/src/main/java/org/libreplan/web/workreports/WorkReportCRUDController.java:1226 #: libreplan-webapp/src/main/java/org/libreplan/web/calendars/BaseCalendarCRUDController.java:452 #: libreplan-webapp/src/main/java/org/libreplan/web/orders/AssignedTaskQualityFormsToOrderElementController.java:200 -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:832 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:836 msgid "Confirm deleting {0}. Are you sure?" msgstr "Bevestig verwijderen {0}. Weet u het zeker?" @@ -734,7 +738,7 @@ msgstr "Dit project is al toegevoegd" msgid "The task code cannot be null" msgstr "De taakcode kan niet ongedefinieerd zijn" -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderElementTreeController.java:594 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderElementTreeController.java:596 #: libreplan-webapp/src/main/java/org/libreplan/web/common/CustomMenuController.java:329 #: libreplan-webapp/src/main/webapp/planner/taskpanels/_taskInformation.zul:32 #: libreplan-webapp/src/main/webapp/resources/search/allocation_selector.zul:39 @@ -811,7 +815,7 @@ msgstr "Juni" msgid "{0} annotation required on {1}" msgstr "{0} annotatie vereist bij {1}" -#: libreplan-webapp/src/main/java/org/libreplan/web/tree/TreeController.java:1067 +#: libreplan-webapp/src/main/java/org/libreplan/web/tree/TreeController.java:1193 msgid "Modified" msgstr "Gewijzigd" @@ -876,7 +880,7 @@ msgstr "Berekende voorgang niet niet worden gewijzigd" msgid "Work done from starting date" msgstr "Werk verricht sinds startdatum" -#: libreplan-webapp/src/main/webapp/templates/templates.zul:69 +#: libreplan-webapp/src/main/webapp/templates/templates.zul:70 msgid "Statistics log" msgstr "Statistieken logboek" @@ -885,7 +889,7 @@ msgstr "Statistieken logboek" msgid "Edit Calendar" msgstr "Wijzig kalender" -#: libreplan-webapp/src/main/java/org/libreplan/web/users/ProfileCRUDController.java:112 +#: libreplan-webapp/src/main/java/org/libreplan/web/users/ProfileCRUDController.java:117 msgid "Profile" msgstr "Profiel" @@ -908,7 +912,7 @@ msgstr "Kan niet leeg zijn of ongedefinieerd" msgid "{0} \"{1}\" saved" msgstr "{0} \"{1}\" opgeslagen" -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/OrderPlanningController.java:299 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/OrderPlanningController.java:301 msgid "filtering" msgstr "filteren" @@ -965,6 +969,12 @@ msgstr "Dit criterium is al toegevoegd" msgid "add" msgstr "toevoegen" +#: libreplan-webapp/src/main/java/org/libreplan/web/tree/TreeController.java:860 +#: libreplan-webapp/src/main/webapp/templates/templates.zul:111 +#: libreplan-webapp/src/main/webapp/orders/_orderElementDetails.zul:69 +msgid "Budget value cannot be negative" +msgstr "Budgetwaarde kan niet negatief zijn" + #: libreplan-webapp/src/main/java/org/libreplan/web/orders/TreeElementOperationsController.java:239 msgid "Unsaved changes will be lost. Would you like to continue?" msgstr "Niet opgeslagen wijzigiingen zullen verloren gaan. Wilt u toch doorgaan?" @@ -1042,8 +1052,8 @@ msgstr "Rol toevoegen" msgid "Exception end date should be greater or equals than start date" msgstr "UItzonderingseinddatum moet op of na stardatum liggen" -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/SaveCommandBuilder.java:476 -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/SaveCommandBuilder.java:486 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/SaveCommandBuilder.java:474 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/SaveCommandBuilder.java:484 msgid "Repeated Project code {0} in Project {1}" msgstr "Herhalade Projectcode {0} in Project {1}" @@ -1073,7 +1083,7 @@ msgstr "Eerdere startdatum" msgid "Type data" msgstr "Type gegevens" -#: libreplan-webapp/src/main/java/org/libreplan/web/users/ProfileCRUDController.java:117 +#: libreplan-webapp/src/main/java/org/libreplan/web/users/ProfileCRUDController.java:122 #: libreplan-webapp/src/main/java/org/libreplan/web/common/CustomMenuController.java:322 msgid "Profiles" msgstr "Profielen" @@ -1219,13 +1229,13 @@ msgstr "Profielen Lijst" msgid "both {0} of category {1} and {2} of category {3} have the same code" msgstr "zowel {0} van categorie {1} en {2} van categorie {3} hebben dezelfde code" -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/TaskElementAdapter.java:958 -#: libreplan-webapp/src/main/java/org/libreplan/web/templates/TemplatesTreeController.java:236 -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderModel.java:690 -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderElementTreeController.java:581 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/TaskElementAdapter.java:1039 +#: libreplan-webapp/src/main/java/org/libreplan/web/templates/TemplatesTreeController.java:240 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderModel.java:696 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderElementTreeController.java:583 #: libreplan-webapp/src/main/java/org/libreplan/web/common/CustomMenuController.java:331 #: libreplan-webapp/src/main/webapp/planner/taskpanels/_tabPanelSubcontract.zul:68 -#: libreplan-webapp/src/main/webapp/templates/templates.zul:64 +#: libreplan-webapp/src/main/webapp/templates/templates.zul:65 #: libreplan-webapp/src/main/webapp/templates/_editTemplateWindow.zul:50 #: libreplan-webapp/src/main/webapp/orders/_editOrderElement.zul:50 msgid "Labels" @@ -1235,7 +1245,7 @@ msgstr "Labels" msgid "Data Types" msgstr "Data Types" -#: libreplan-webapp/src/main/webapp/orders/_edition.zul:157 +#: libreplan-webapp/src/main/webapp/orders/_edition.zul:161 #: libreplan-webapp/src/main/webapp/orders/_listOrderElementHours.zul:68 msgid "Total hours" msgstr "Totaal aantal uren" @@ -1252,8 +1262,8 @@ msgstr "opnieuw toewijzen {0} projecten" msgid "Filter by task status" msgstr "Filter op taak status" -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/OrderPlanningModel.java:528 -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/company/CompanyPlanningModel.java:419 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/OrderPlanningModel.java:529 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/company/CompanyPlanningModel.java:416 msgid "Select date" msgstr "Selecteer datum" @@ -1270,19 +1280,23 @@ msgstr "Probeer aub opnieuw." msgid "Company code" msgstr "Bedrijfscode" +#: libreplan-webapp/src/main/webapp/orders/_listOrderElementHours.zul:62 +msgid "Sum of imputed hours in children tasks" +msgstr "Totaal van doorbelaste uren in afgeleide taken" + #: libreplan-webapp/src/main/java/org/libreplan/web/common/components/TwoWaySelector.java:110 msgid "Unknown attribute '{0}' in class {1}" msgstr "Onbekende attribuut '{0}' in classe {1}" +#: libreplan-webapp/src/main/java/org/libreplan/web/users/settings/PasswordController.java:96 +msgid "passwords can not be empty" +msgstr "wachtwoorden kunnen niet leeg zijn" + #: libreplan-webapp/src/main/java/org/libreplan/web/resources/worker/WorkerCRUDController.java:699 #: libreplan-business/src/main/java/org/libreplan/business/resources/entities/ResourceType.java:33 msgid "NON LIMITING RESOURCE" msgstr "ONBEGRENSDE RESOURCE" -#: libreplan-webapp/src/main/java/org/libreplan/web/users/settings/PasswordController.java:96 -msgid "passwords can not be empty" -msgstr "wachtwoorden kunnen niet leeg zijn" - #: libreplan-webapp/src/main/java/org/libreplan/web/orders/labels/AssignedLabelsController.java:88 #: libreplan-webapp/src/main/java/org/libreplan/web/orders/labels/AssignedLabelsController.java:128 #: libreplan-webapp/src/main/java/org/libreplan/web/orders/AssignedTaskQualityFormsToOrderElementController.java:176 @@ -1431,11 +1445,15 @@ msgstr "Stretches lijst" msgid "Enable scenarios module" msgstr "Inschakelen scenarios module" +#: libreplan-webapp/src/main/java/org/libreplan/web/calendars/BaseCalendarEditionController.java:312 +msgid "to {0}" +msgstr "naar {0}" + #: libreplan-webapp/src/main/webapp/limitingresources/limitingResourcesLayout.zul:59 msgid "Zoom" msgstr "Zoom" -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/SaveCommandBuilder.java:865 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/SaveCommandBuilder.java:863 #: libreplan-webapp/src/main/webapp/labels/_editLabelType.zul:112 #: libreplan-webapp/src/main/webapp/advance/advanceTypes.zul:37 #: libreplan-webapp/src/main/webapp/excetiondays/_editExceptionDayType.zul:91 @@ -1451,9 +1469,9 @@ msgstr "Zoom" #: libreplan-webapp/src/main/webapp/qualityforms/_editQualityForm.zul:131 #: libreplan-webapp/src/main/webapp/settings/changePassword.zul:81 #: libreplan-webapp/src/main/webapp/settings/settings.zul:124 -#: libreplan-webapp/src/main/webapp/users/_editProfile.zul:81 -#: libreplan-webapp/src/main/webapp/users/_editUser.zul:162 -#: libreplan-webapp/src/main/webapp/templates/templates.zul:135 +#: libreplan-webapp/src/main/webapp/users/_editProfile.zul:70 +#: libreplan-webapp/src/main/webapp/users/_editUser.zul:151 +#: libreplan-webapp/src/main/webapp/templates/templates.zul:143 #: libreplan-webapp/src/main/webapp/calendars/calendars.zul:44 #: libreplan-webapp/src/main/webapp/resources/worker/virtualWorkers.zul:40 #: libreplan-webapp/src/main/webapp/resources/worker/worker.zul:41 @@ -1512,7 +1530,7 @@ msgstr "Problemen bij het verbinden met een onderaannemer web service" msgid "Entity type" msgstr "Entiteittype" -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/OrderPlanningModel.java:1101 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/OrderPlanningModel.java:1127 #: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:268 msgid "Unsaved changes will be lost. Are you sure?" msgstr "Niet opgeslagen wijzigingen zullen verloren gaan. Weet u het zeker?" @@ -1553,13 +1571,13 @@ msgstr "Resources per dag" msgid "ResourceType must be not-null" msgstr "ResourceType mag niet ongedefinieerd zijn" -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrdersTreeComponent.java:95 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrdersTreeComponent.java:105 msgid "" "Estimated end date for the task (press enter in textbox to open calendar " "popup or type in date directly)" msgstr "Geschatte einddatum voor de taak (druk enter in tekstbox om een kalender venster te openen of type datum rechtstreeks in)" -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderElementTreeController.java:292 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderElementTreeController.java:293 msgid "Expand/Collapse all" msgstr "Alles Uitklappen/Inklappen" @@ -1567,11 +1585,11 @@ msgstr "Alles Uitklappen/Inklappen" msgid "Overload due to current project" msgstr "Overbelast door huidig project" -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/TaskElementAdapter.java:946 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/TaskElementAdapter.java:1017 msgid "Name: {0}" msgstr "Naam: {0}" -#: libreplan-webapp/src/main/java/org/libreplan/web/tree/TreeController.java:903 +#: libreplan-webapp/src/main/java/org/libreplan/web/tree/TreeController.java:1020 msgid "Move down" msgstr "Omlaag" @@ -1618,7 +1636,7 @@ msgstr "Toekenne" msgid "missing code in a criterion" msgstr "ontbrekende code in criterium" -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:1278 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:1282 msgid "Create Template" msgstr "Maak sjabloon" @@ -1635,7 +1653,7 @@ msgstr "Gevorderde zoekopdracht" msgid "Filter by labels" msgstr "Filter op label" -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/taskedition/TaskPropertiesController.java:577 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/taskedition/TaskPropertiesController.java:586 msgid "" "IMPORTANT: Don't forget to communicate to subcontractor that his contract " "has been cancelled" @@ -1666,10 +1684,10 @@ msgstr "Status code" #: libreplan-webapp/src/main/java/org/libreplan/web/costcategories/TypeOfWorkHoursCRUDController.java:103 #: libreplan-webapp/src/main/java/org/libreplan/web/qualityforms/QualityFormCRUDController.java:391 #: libreplan-webapp/src/main/java/org/libreplan/web/planner/taskedition/AdvancedAllocationTaskController.java:73 -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/taskedition/TaskPropertiesController.java:509 -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/taskedition/TaskPropertiesController.java:547 -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/taskedition/TaskPropertiesController.java:578 -#: libreplan-webapp/src/main/java/org/libreplan/web/users/ProfileCRUDController.java:148 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/taskedition/TaskPropertiesController.java:518 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/taskedition/TaskPropertiesController.java:556 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/taskedition/TaskPropertiesController.java:587 +#: libreplan-webapp/src/main/java/org/libreplan/web/users/ProfileCRUDController.java:153 #: libreplan-webapp/src/main/java/org/libreplan/web/calendars/BaseCalendarCRUDController.java:476 msgid "Warning" msgstr "Waarschuwing" @@ -1786,8 +1804,8 @@ msgstr "de naam moet niet ongedefinieerd of leeg zijn" msgid "Add From Template" msgstr "Toevoegen vanaf sjabloon" -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/taskedition/TaskPropertiesController.java:508 -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/taskedition/TaskPropertiesController.java:546 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/taskedition/TaskPropertiesController.java:517 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/taskedition/TaskPropertiesController.java:555 msgid "Assigned resources for this task will be deleted. Are you sure?" msgstr "Toegekende resources voor deze taak zullen verwijderd worden. Weet u het zeker?" @@ -1822,7 +1840,7 @@ msgstr "Juli" msgid "Enable LDAP authentication" msgstr "Inschakelen LDAP authenticatie" -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/consolidations/AdvanceConsolidationModel.java:493 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/consolidations/AdvanceConsolidationModel.java:490 msgid "( max: {0} )" msgstr "( max: {0} )" @@ -1843,7 +1861,7 @@ msgid "Cannot calculate charts for current data" msgstr "Kan geen grafiek berekenen met actuele gegevens" #: libreplan-webapp/src/main/java/org/libreplan/web/orders/ProjectDetailsController.java:176 -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:1495 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:1499 msgid "project name already being used" msgstr "projectnaam reeds gebruikt" @@ -1860,7 +1878,7 @@ msgstr "Splits toekenning" msgid "You can not remove the default scenario called \"{0}\"" msgstr "U kunt het standaard scenario genaamd \"{0}\" niet verwijderen" -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/consolidations/AdvanceConsolidationModel.java:522 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/consolidations/AdvanceConsolidationModel.java:519 msgid "There are not any assigned progress to current task" msgstr "Er zijn geen toegekende voortgangen aan de huidige taak" @@ -1889,7 +1907,7 @@ msgstr "Omlaag" msgid "Label" msgstr "Label" -#: libreplan-webapp/src/main/java/org/libreplan/web/tree/TreeController.java:870 +#: libreplan-webapp/src/main/java/org/libreplan/web/tree/TreeController.java:987 msgid "Value is not valid, taking into account the current list of HoursGroup" msgstr "Waarde is ongeldig, rekening houdend met de actuele lijst met HoursGroup" @@ -1906,8 +1924,8 @@ msgstr "ontbrekend type werkuren in een werkrapportregel" msgid "Quality forms" msgstr "Kwaliteitsformulieren" -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/SaveCommandBuilder.java:499 -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/SaveCommandBuilder.java:509 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/SaveCommandBuilder.java:497 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/SaveCommandBuilder.java:507 msgid "Repeated Hours Group code {0} in Project {1}" msgstr "Herhaalde Urengroepcode {0} in Project {1}" @@ -1919,7 +1937,7 @@ msgstr "Urengroep" msgid "LibrePlan: Accounts" msgstr "LibrePlan: Rekeningen" -#: libreplan-webapp/src/main/webapp/templates/templates.zul:96 +#: libreplan-webapp/src/main/webapp/templates/templates.zul:97 #: libreplan-webapp/src/main/webapp/templates/_list.zul:30 msgid "Days from Beginning to Deadline" msgstr "Dagen vanaf de aanvang tot de deadline" @@ -1952,7 +1970,7 @@ msgstr "Op." msgid "Pessimistic" msgstr "Pessimistisch" -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/taskedition/TaskPropertiesController.java:376 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/taskedition/TaskPropertiesController.java:385 msgid "Limiting resource assignation" msgstr "Beperken resource toekenning" @@ -1983,7 +2001,7 @@ msgstr "Unittype kan niet leeg zijn" msgid "Entity sequences" msgstr "Entiteitssequences" -#: libreplan-webapp/src/main/webapp/templates/templates.zul:91 +#: libreplan-webapp/src/main/webapp/templates/templates.zul:92 #: libreplan-webapp/src/main/webapp/templates/_list.zul:28 msgid "Delay from beginning (days)" msgstr "Vertraging vanaf het begin (dagen)" @@ -2013,7 +2031,7 @@ msgstr "Bevestig afbreken" msgid "Work And Progress Per Task" msgstr "Werk en voortgang per taak" -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:1519 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:1523 msgid "project code already being used" msgstr "projectcode reeds gebruikt" @@ -2032,8 +2050,8 @@ msgstr "Verwijderen sequence" #: libreplan-webapp/src/main/java/org/libreplan/web/calendars/BaseCalendarCRUDController.java:457 #: libreplan-webapp/src/main/java/org/libreplan/web/orders/AssignedTaskQualityFormsToOrderElementController.java:208 #: libreplan-webapp/src/main/java/org/libreplan/web/orders/criterionrequirements/AssignedCriterionRequirementController.java:264 -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:840 -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:875 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:844 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:879 msgid "Error on showing removing element: " msgstr "Fout bij tonen verwijderen element:" @@ -2094,7 +2112,7 @@ msgid "Overload" msgstr "Overbelast" #: libreplan-webapp/src/main/webapp/templates/_historicalAssignment.zul:30 -#: libreplan-webapp/src/main/webapp/templates/templates.zul:68 +#: libreplan-webapp/src/main/webapp/templates/templates.zul:69 msgid "Assignment log" msgstr "Opdrachten logboek" @@ -2103,10 +2121,6 @@ msgstr "Opdrachten logboek" msgid "Work Report Models" msgstr "Werkrapport modellen" -#: libreplan-webapp/src/main/java/org/libreplan/web/print/CutyCaptTimeout.java:45 -msgid "CutycaptTimeout thread exception" -msgstr "CutycaptTimeout thread exception" - #: libreplan-webapp/src/main/webapp/materials/materials.zul:73 msgid "New" msgstr "Nieuw" @@ -2115,7 +2129,7 @@ msgstr "Nieuw" msgid "Date last progress measurement" msgstr "Datum laatste voortgangsmeeting" -#: libreplan-webapp/src/main/java/org/libreplan/web/templates/TemplatesTreeComponent.java:103 +#: libreplan-webapp/src/main/java/org/libreplan/web/templates/TemplatesTreeComponent.java:112 msgid "Deadline (days since beggining project)" msgstr "Deadline (dagen since aanvang project)" @@ -2145,14 +2159,14 @@ msgstr "criterium type naam is reeds in gebruik" msgid "Task code cannot be null" msgstr "Taakcode kan niet ongedefinieerd zijn" -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/consolidations/AdvanceConsolidationModel.java:520 +#: libreplan-webapp/src/main/java/org/libreplan/web/calendars/BaseCalendarEditionController.java:302 +msgid "Derived of calendar {0}" +msgstr "Afgeleid van kalender {0}" + +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/consolidations/AdvanceConsolidationModel.java:517 msgid "It is not allowed to consolidate progress." msgstr "Het is niet toegestaan om de voortgang te consolideren" -#: libreplan-webapp/src/main/webapp/orders/components/_orderElementTree.zul:32 -msgid "Create Task" -msgstr "Maak taak" - #: libreplan-webapp/src/main/webapp/planner/taskpanels/_tabPanelSubcontract.zul:27 msgid "External company" msgstr "Extern bedrijf" @@ -2161,10 +2175,10 @@ msgstr "Extern bedrijf" #: libreplan-webapp/src/main/webapp/costcategories/_listTypesOfWorkHours.zul:30 #: libreplan-webapp/src/main/webapp/costcategories/_listCostCategories.zul:28 #: libreplan-webapp/src/main/webapp/users/_listUsers.zul:30 -#: libreplan-webapp/src/main/webapp/users/_editProfile.zul:60 +#: libreplan-webapp/src/main/webapp/users/_editProfile.zul:61 #: libreplan-webapp/src/main/webapp/users/_listProfiles.zul:27 -#: libreplan-webapp/src/main/webapp/users/_editUser.zul:107 -#: libreplan-webapp/src/main/webapp/users/_editUser.zul:140 +#: libreplan-webapp/src/main/webapp/users/_editUser.zul:108 +#: libreplan-webapp/src/main/webapp/users/_editUser.zul:129 #: libreplan-webapp/src/main/webapp/orders/_listOrderElementAuthorizations.zul:44 #: libreplan-webapp/src/main/webapp/orders/_listOrderElementAuthorizations.zul:68 msgid "Actions" @@ -2237,11 +2251,15 @@ msgstr "Waarde is ongeldig.\nCode kan geen letters bevatten zoals '_'." msgid "Hours Group" msgstr "Urengroep" +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/TaskElementAdapter.java:1029 +msgid "Budget: {0}€, Consumed: {1}€ ({2}%)" +msgstr "Budget:{0}€, Verbruikt: {1}€ ({2}%)" + #: libreplan-webapp/src/main/java/org/libreplan/web/workreports/WorkReportTypeCRUDController.java:825 msgid "Unallocated name" msgstr "Niet toegewezen naam" -#: libreplan-webapp/src/main/java/org/libreplan/web/tree/TreeController.java:924 +#: libreplan-webapp/src/main/java/org/libreplan/web/tree/TreeController.java:1041 msgid "Move up" msgstr "Omhoog" @@ -2255,7 +2273,7 @@ msgstr "Onderaannemer communicatie datum" #: libreplan-webapp/src/main/java/org/libreplan/web/planner/tabs/MultipleTabsPlannerController.java:131 #: libreplan-webapp/src/main/java/org/libreplan/web/planner/tabs/MultipleTabsPlannerController.java:134 -#: libreplan-webapp/src/main/java/org/libreplan/web/templates/OrderTemplatesController.java:281 +#: libreplan-webapp/src/main/java/org/libreplan/web/templates/OrderTemplatesController.java:301 #: libreplan-webapp/src/main/java/org/libreplan/web/common/CustomMenuController.java:269 #: libreplan-webapp/src/main/java/org/libreplan/web/common/CustomMenuController.java:367 msgid "Scheduling" @@ -2291,17 +2309,17 @@ msgstr "Pagina omhoog" msgid "Create new project" msgstr "Maak nieuw project" -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/TaskElementAdapter.java:954 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/TaskElementAdapter.java:1026 #: libreplan-webapp/src/main/java/org/libreplan/web/common/components/finders/TaskGroupFilterEnum.java:31 #: libreplan-webapp/src/main/java/org/libreplan/web/common/components/finders/OrderFilterEnum.java:31 #: libreplan-webapp/src/main/webapp/subcontract/subcontractedTasks.zul:53 #: libreplan-webapp/src/main/webapp/subcontract/reportAdvances.zul:50 -#: libreplan-webapp/src/main/webapp/orders/_edition.zul:161 +#: libreplan-webapp/src/main/webapp/orders/_edition.zul:165 #: libreplan-webapp/src/main/webapp/orders/_list.zul:35 msgid "State" msgstr "Status" -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrdersTreeComponent.java:80 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrdersTreeComponent.java:90 msgid "Must start after" msgstr "Moet starten na" @@ -2309,7 +2327,7 @@ msgstr "Moet starten na" msgid "Confirm change" msgstr "Bevestig wijziging" -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:845 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:849 msgid "You don't have permissions to edit this project" msgstr "U heeft geen rechten om dit project te wijzigen" @@ -2348,7 +2366,7 @@ msgstr "LibrePlan: Materialen" msgid "New task" msgstr "Nieuwe taak" -#: libreplan-webapp/src/main/java/org/libreplan/web/users/UserCRUDController.java:191 +#: libreplan-webapp/src/main/java/org/libreplan/web/users/UserCRUDController.java:197 msgid "The password for a new user cannot be empty" msgstr "Het wachtwoord van een nieuwe gebruiker mag niet leeg zijn" @@ -2400,7 +2418,7 @@ msgstr "Persoonlijke gegevens" msgid "Workers List" msgstr "Werkerslijst" -#: libreplan-webapp/src/main/java/org/libreplan/web/templates/OrderTemplatesController.java:355 +#: libreplan-webapp/src/main/java/org/libreplan/web/templates/OrderTemplatesController.java:375 msgid "Delete project template. Are you sure?" msgstr "Verwijder project sjabloon. Weet u het zeker?" @@ -2481,18 +2499,18 @@ msgstr "Andere projecten" msgid "Tasks input buffer" msgstr "Taken invoer buffer" -#: libreplan-webapp/src/main/java/org/libreplan/web/common/ConfigurationModel.java:168 +#: libreplan-webapp/src/main/java/org/libreplan/web/common/ConfigurationModel.java:173 msgid "At least one {0} sequence must be active" msgstr "Minimaal één {0} sequence moet actief zijn" #: libreplan-webapp/src/main/webapp/users/_listProfiles.zul:26 -#: libreplan-webapp/src/main/webapp/users/_editUser.zul:139 +#: libreplan-webapp/src/main/webapp/users/_editUser.zul:128 #: libreplan-webapp/src/main/webapp/orders/_listOrderElementAuthorizations.zul:42 #: libreplan-webapp/src/main/webapp/orders/_listOrderElementAuthorizations.zul:66 msgid "Profile name" msgstr "Profielnaam" -#: libreplan-webapp/src/main/java/org/libreplan/web/print/CutyPrint.java:252 +#: libreplan-webapp/src/main/java/org/libreplan/web/print/CutyPrint.java:246 msgid "Could open generated PDF" msgstr "Kan gegenereerde PDF openen" @@ -2504,7 +2522,7 @@ msgstr "Uitschakelen Verwijderen" msgid "You should select a source scenario" msgstr "U dient een bron scenario te selecteren" -#: libreplan-webapp/src/main/java/org/libreplan/web/common/ConfigurationModel.java:163 +#: libreplan-webapp/src/main/java/org/libreplan/web/common/ConfigurationModel.java:168 msgid "At least one {0} sequence is needed" msgstr "Minimaal één {0} sequence is nodig" @@ -2539,18 +2557,18 @@ msgid "" "to generate usage statistics" msgstr "Vink deze optie aan om informatie naar LibrePlan ontwikkelaars te sturen voor het samenstellen van gebruiksstatistieken" -#: libreplan-webapp/src/main/webapp/resources/search/_resourceFilter.zul:36 -msgid "More options" -msgstr "Meer opties" +#: libreplan-webapp/src/main/java/org/libreplan/web/subcontract/ReportAdvancesModel.java:219 +#: libreplan-webapp/src/main/java/org/libreplan/web/subcontract/SubcontractedTasksModel.java:179 +msgid "Error: {0}" +msgstr "Fout: {0}" #: libreplan-webapp/src/main/webapp/subcontract/subcontractedTasks.zul:45 msgid "Communication" msgstr "Communicatie" -#: libreplan-webapp/src/main/java/org/libreplan/web/subcontract/ReportAdvancesModel.java:219 -#: libreplan-webapp/src/main/java/org/libreplan/web/subcontract/SubcontractedTasksModel.java:179 -msgid "Error: {0}" -msgstr "Fout: {0}" +#: libreplan-webapp/src/main/webapp/resources/search/_resourceFilter.zul:36 +msgid "More options" +msgstr "Meer opties" #: libreplan-webapp/src/main/java/org/libreplan/web/orders/TreeElementOperationsController.java:240 msgid "Confirm create template" @@ -2582,7 +2600,7 @@ msgstr "LibrePlan: Werk en voortgang per taak" msgid "Projects" msgstr "Projecten" -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/OrderPlanningModel.java:1102 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/OrderPlanningModel.java:1128 #: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:269 msgid "Confirm exit dialog" msgstr "Bevestig afsluit dialoog" @@ -2660,7 +2678,7 @@ msgstr "Werkrekord" msgid "Output format" msgstr "Uitvoer formaat" -#: libreplan-webapp/src/main/webapp/planner/print_configuration.zul:47 +#: libreplan-webapp/src/main/webapp/planner/print_configuration.zul:49 msgid "Print" msgstr "Afdrukken" @@ -2680,8 +2698,8 @@ msgstr "resource type staat geen criteria toe" msgid "Effort cannot be null" msgstr "Inspanning kan niet ongedefinieerd zijn" -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/OrderPlanningModel.java:1093 -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/assigntemplates/TemplateFinderPopup.java:52 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/OrderPlanningModel.java:1119 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/assigntemplates/TemplateFinderPopup.java:126 #: libreplan-webapp/src/main/webapp/labels/_editLabelType.zul:116 #: libreplan-webapp/src/main/webapp/excetiondays/_editExceptionDayType.zul:97 #: libreplan-webapp/src/main/webapp/externalcompanies/_editExternalCompany.zul:106 @@ -2693,16 +2711,16 @@ msgstr "Inspanning kan niet ongedefinieerd zijn" #: libreplan-webapp/src/main/webapp/costcategories/_editCostCategory.zul:98 #: libreplan-webapp/src/main/webapp/costcategories/_editTypeOfWorkHours.zul:80 #: libreplan-webapp/src/main/webapp/qualityforms/_editQualityForm.zul:137 -#: libreplan-webapp/src/main/webapp/planner/print_configuration.zul:48 +#: libreplan-webapp/src/main/webapp/planner/print_configuration.zul:50 #: libreplan-webapp/src/main/webapp/planner/editTask.zul:81 #: libreplan-webapp/src/main/webapp/planner/reassign.zul:50 #: libreplan-webapp/src/main/webapp/planner/stretches_function.zul:91 #: libreplan-webapp/src/main/webapp/planner/advance_allocation.zul:42 #: libreplan-webapp/src/main/webapp/planner/order.zul:131 #: libreplan-webapp/src/main/webapp/planner/order.zul:166 -#: libreplan-webapp/src/main/webapp/users/_editProfile.zul:85 -#: libreplan-webapp/src/main/webapp/users/_editUser.zul:166 -#: libreplan-webapp/src/main/webapp/templates/templates.zul:139 +#: libreplan-webapp/src/main/webapp/users/_editProfile.zul:74 +#: libreplan-webapp/src/main/webapp/users/_editUser.zul:155 +#: libreplan-webapp/src/main/webapp/templates/templates.zul:147 #: libreplan-webapp/src/main/webapp/calendars/_createNewVersion.zul:58 #: libreplan-webapp/src/main/webapp/calendars/calendars.zul:47 #: libreplan-webapp/src/main/webapp/resources/machine/_editMachine.zul:103 @@ -2738,8 +2756,8 @@ msgid "Machines List" msgstr "Machinelijst" #: libreplan-webapp/src/main/java/org/libreplan/web/resourceload/ResourceLoadController.java:320 -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:692 -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:904 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:696 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:908 msgid "You don't have read access to this project" msgstr "U heeft geen leesrechten voor dit project" @@ -2815,7 +2833,7 @@ msgstr "{0} (max: {1})" msgid "Cost Category" msgstr "Kostencategorie" -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderElementTreeController.java:471 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderElementTreeController.java:473 msgid "end" msgstr "einde" @@ -2836,7 +2854,7 @@ msgstr "Autorisaties" msgid "Continue" msgstr "Doorgaan" -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderElementController.java:121 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderElementController.java:122 msgid "Edit task {0}" msgstr "Wijzig taak {0}" @@ -2869,7 +2887,7 @@ msgstr "Standaard maximum waarde" msgid "Add criterion requirement" msgstr "Toevoegen criterium vereiste" -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:860 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:864 msgid "" "You can not remove the project \"{0}\" because of any of its tasks are " "already in use in some work reports and the project just exists in the " @@ -2909,7 +2927,7 @@ msgstr "LibrePlan: wijzig wachtwoord" msgid "please, select a label" msgstr "Kies aub een label" -#: libreplan-webapp/src/main/webapp/users/_editUser.zul:134 +#: libreplan-webapp/src/main/webapp/users/_editUser.zul:123 msgid "Add profile" msgstr "Toevoegen profiel " @@ -2988,8 +3006,8 @@ msgstr "de naam mag niet leeg zijn" msgid "Disabled" msgstr "uitgeschakeld" -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/OrderPlanningModel.java:738 -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/company/CompanyPlanningModel.java:325 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/OrderPlanningModel.java:764 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/company/CompanyPlanningModel.java:322 msgid "Earned value" msgstr "Earned value" @@ -3018,8 +3036,8 @@ msgid "" "Please save your project before proceeding." msgstr "Sjablonen kunnen alleen gemaakt worden uit bestaande taken. U probeert een nieuwe sjabloon te maken uit een nieuwe taak.⏎\nSla aub uw project op voordat u verder gaat." -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/TaskElementAdapter.java:1163 -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/TaskElementAdapter.java:1178 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/TaskElementAdapter.java:1243 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/TaskElementAdapter.java:1258 msgid "{0} not supported yet" msgstr "{0} nog niet ondersteund" @@ -3041,7 +3059,7 @@ msgstr "Nieuwe entry" msgid "Resources Load" msgstr "Resource belasting" -#: libreplan-webapp/src/main/java/org/libreplan/web/common/ConfigurationModel.java:220 +#: libreplan-webapp/src/main/java/org/libreplan/web/common/ConfigurationModel.java:225 msgid "Some sequences to remove not existed" msgstr "Sommige te verwijderen sequenties bestonden niet" @@ -3116,11 +3134,11 @@ msgid "Select start date" msgstr "Kies startdatum" #: libreplan-webapp/src/main/java/org/libreplan/web/costcategories/TypeOfWorkHoursCRUDController.java:106 -#: libreplan-webapp/src/main/java/org/libreplan/web/users/ProfileCRUDController.java:152 +#: libreplan-webapp/src/main/java/org/libreplan/web/users/ProfileCRUDController.java:157 msgid "Error on showing warning message removing typeOfWorkHours: " msgstr "Fout bij het tonen van waarschuwingsboodschap verwijderen typeOfWorkHours" -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:882 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:886 msgid "Removed {0}" msgstr "Verwijderd {0}" @@ -3132,8 +3150,8 @@ msgstr "Bevestig verwijderen van werker. Weet u het zeker?" msgid "Group name" msgstr "Groepsnaam" -#: libreplan-webapp/src/main/webapp/users/_editProfile.zul:59 -#: libreplan-webapp/src/main/webapp/users/_editUser.zul:106 +#: libreplan-webapp/src/main/webapp/users/_editProfile.zul:60 +#: libreplan-webapp/src/main/webapp/users/_editUser.zul:107 msgid "Role name" msgstr "Rolnaam" @@ -3149,8 +3167,8 @@ msgstr "Maak werkrapport" msgid "Value is not valid, the precision value must not be empty" msgstr "Waarde is ongeldig, de precisie waarde mag niet leeg zijn" -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/OrderPlanningModel.java:863 -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/company/CompanyPlanningModel.java:473 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/OrderPlanningModel.java:889 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/company/CompanyPlanningModel.java:470 msgid "h" msgstr "h" @@ -3175,7 +3193,7 @@ msgstr "Toevoegen mijlpaal" msgid "Assign selected items" msgstr "Toewijzen geselecteerde onderdelen" -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderElementTreeController.java:450 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderElementTreeController.java:452 msgid "init" msgstr "init" @@ -3252,6 +3270,10 @@ msgstr "Klant" msgid "Hours type" msgstr "Urentype" +#: libreplan-webapp/src/main/webapp/planner/print_configuration.zul:43 +msgid "Show money cost bar" +msgstr "Toon kosten balk" + #: libreplan-webapp/src/main/java/org/libreplan/ws/resources/impl/ResourceConverter.java:156 #: libreplan-business/src/main/java/org/libreplan/business/resources/entities/CriterionType.java:211 msgid "criterion type name not specified" @@ -3265,11 +3287,11 @@ msgstr "Kan niet verbinden met LDAP server" msgid "Add Exception" msgstr "Toevoegen uitzondering" -#: libreplan-webapp/src/main/java/org/libreplan/web/tree/TreeController.java:220 +#: libreplan-webapp/src/main/java/org/libreplan/web/tree/TreeController.java:222 #: libreplan-webapp/src/main/java/org/libreplan/web/qualityforms/QualityFormCRUDController.java:202 #: libreplan-webapp/src/main/java/org/libreplan/web/qualityforms/QualityFormCRUDController.java:223 #: libreplan-webapp/src/main/java/org/libreplan/web/qualityforms/QualityFormCRUDController.java:247 -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderElementTreeController.java:378 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderElementTreeController.java:379 msgid "cannot be empty" msgstr "kan niet leeg zijn" @@ -3393,7 +3415,7 @@ msgstr "Export opties" #: libreplan-webapp/src/main/webapp/reports/workingArrangementsPerOrderReport.zul:145 #: libreplan-webapp/src/main/webapp/reports/timeLineMaterialReport.zul:94 #: libreplan-webapp/src/main/webapp/users/_editProfile.zul:40 -#: libreplan-webapp/src/main/webapp/templates/templates.zul:80 +#: libreplan-webapp/src/main/webapp/templates/templates.zul:81 #: libreplan-webapp/src/main/webapp/templates/_list.zul:27 #: libreplan-webapp/src/main/webapp/templates/_assignedQualityForms.zul:48 #: libreplan-webapp/src/main/webapp/subcontract/reportAdvances.zul:45 @@ -3462,7 +3484,7 @@ msgstr "Gewerkte uren per resource" msgid "The end date cannot be before the init date" msgstr "De einddatum kan niet voor de init datum liggen" -#: libreplan-webapp/src/main/webapp/users/_editUser.zul:128 +#: libreplan-webapp/src/main/webapp/users/_editUser.zul:117 msgid "" "Profiles of LDAP users cannot be managed because LDAP roles are being used." msgstr "Profielen van LDAP gebruikers kunnen niet beheert worden omdat LDAP rollen worden gebruikt." @@ -3558,7 +3580,7 @@ msgstr "Virtuele werkersgroep" msgid "Changes saved" msgstr "Wijzigingen opgeslagen" -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:1263 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:1267 msgid "See scheduling" msgstr "Zie planning" @@ -3587,7 +3609,7 @@ msgid "Work report saved" msgstr "Werkrapport opgeslagen" #: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/SubcontractCommand.java:53 -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/taskedition/TaskPropertiesController.java:377 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/taskedition/TaskPropertiesController.java:386 #: libreplan-webapp/src/main/webapp/planner/editTask.zul:68 msgid "Subcontract" msgstr "Onderaannemen" @@ -3623,10 +3645,6 @@ msgstr "mag niet leeg zijn" msgid "April" msgstr "April" -#: libreplan-webapp/src/main/java/org/libreplan/web/calendars/BaseCalendarEditionController.java:302 -msgid "Derived of Calendar " -msgstr "Afgeleid van kalender" - #: libreplan-webapp/src/main/webapp/users/_listUsers.zul:22 msgid "Users List" msgstr "Gebruikerslijst" @@ -3684,14 +3702,14 @@ msgstr "Filter kwaliteitsformulieren op" msgid "Unindent selected task" msgstr "Terugspringen geselecteerde taak" -#: libreplan-webapp/src/main/webapp/planner/taskpanels/_tabPanelTaskProperties.zul:62 -msgid "Constraint" -msgstr "Beperking" - #: libreplan-webapp/src/main/webapp/subcontract/reportAdvances.zul:44 msgid "Customer reference code" msgstr "Klant referentiecode" +#: libreplan-webapp/src/main/webapp/planner/taskpanels/_tabPanelTaskProperties.zul:66 +msgid "Constraint" +msgstr "Beperking" + #: libreplan-webapp/src/main/webapp/workreports/_editWorkReportType.zul:150 msgid "Add New Label Type Field" msgstr "Voeg nieuw labeltypeveld toe" @@ -3710,16 +3728,16 @@ msgstr "Referentieklant" #: libreplan-webapp/src/main/java/org/libreplan/web/templates/historicalAssignment/OrderElementHistoricalAssignmentComponent.java:146 #: libreplan-webapp/src/main/java/org/libreplan/web/resourceload/ResourceLoadController.java:311 #: libreplan-webapp/src/main/java/org/libreplan/web/resourceload/ResourceLoadController.java:321 -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:693 -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:846 -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:896 -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:905 -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:932 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:697 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:850 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:900 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:909 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:936 #: libreplan-webapp/src/main/java/org/libreplan/web/limitingresources/LimitingResourcesController.java:333 msgid "Information" msgstr "Informatie" -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:931 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:935 msgid "Sorry, you do not have permissions to access this project" msgstr "Helaas heeft u geen toegangdrechten voor dit project" @@ -3743,7 +3761,7 @@ msgstr "Nieuwe urengroup" msgid "Assign element to queue manually" msgstr "Ken element handmatig aan wachtrij" -#: libreplan-webapp/src/main/webapp/planner/print_configuration.zul:45 +#: libreplan-webapp/src/main/webapp/planner/print_configuration.zul:47 msgid "Please remember that only saved changes will be printed" msgstr "Bedenk dat alleen opgeslagen wijzigingen kunnen worden afgedrukt" @@ -3788,6 +3806,10 @@ msgstr "De kalenderuitzonderingstype is niet gevonden" msgid "Unable to convert value to {0} type" msgstr "Niet in staat om waarde om te zetten naar {0} type" +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrdersTreeComponent.java:81 +msgid "Total task budget" +msgstr "Totaal taak budget" + #: libreplan-webapp/src/main/java/org/libreplan/web/resources/worker/WorkerModel.java:222 msgid "Worker must be not-null" msgstr "Werker moet gedefinieerd zijn" @@ -3796,14 +3818,14 @@ msgstr "Werker moet gedefinieerd zijn" msgid "Some criterion satisfactions overlap in time" msgstr "Sommige criteria satisfactions overlappen in tijd" -#: libreplan-webapp/src/main/webapp/reports/timeLineMaterialReport.zul:21 -msgid "LibrePlan: Materials Needs At Date" -msgstr "LibrePlan: Materiaal nodig op datum" - #: libreplan-webapp/src/main/webapp/subcontract/reportAdvances.zul:49 msgid "Value last progress measurement" msgstr "Waarde laatste voortgangsmeting" +#: libreplan-webapp/src/main/webapp/reports/timeLineMaterialReport.zul:21 +msgid "LibrePlan: Materials Needs At Date" +msgstr "LibrePlan: Materiaal nodig op datum" + #: libreplan-webapp/src/main/webapp/resources/machine/_machineConfigurationUnits.zul:44 msgid "Worker assignments" msgstr "Werker toewijzingen" @@ -4032,7 +4054,7 @@ msgid "Check consolidated progresses" msgstr "Controleer geconsolideerde voortgang" #: libreplan-webapp/src/main/java/org/libreplan/web/workreports/WorkReportCRUDController.java:1469 -#: libreplan-webapp/src/main/java/org/libreplan/web/workreports/WorkReportModel.java:585 +#: libreplan-webapp/src/main/java/org/libreplan/web/workreports/WorkReportModel.java:587 msgid "Show all" msgstr "Toon alles" @@ -4050,7 +4072,7 @@ msgid "Apply tab changes" msgstr "Voer tab wijzigingen door" #: libreplan-webapp/src/main/java/org/libreplan/web/users/settings/PasswordController.java:99 -#: libreplan-webapp/src/main/java/org/libreplan/web/users/UserCRUDController.java:170 +#: libreplan-webapp/src/main/java/org/libreplan/web/users/UserCRUDController.java:176 msgid "passwords don't match" msgstr "wachtwoorden komen niet overeen" @@ -4170,7 +4192,7 @@ msgstr "Niet indentable" msgid "List of materials for all categories (select one to filter)" msgstr "Lijst met materialen voor alle categorieën (kies er een om te filteren)" -#: libreplan-webapp/src/main/webapp/planner/taskpanels/_tabPanelTaskProperties.zul:69 +#: libreplan-webapp/src/main/webapp/planner/taskpanels/_tabPanelTaskProperties.zul:73 msgid "Resource allocation type" msgstr "Resource allocatie type" @@ -4187,7 +4209,7 @@ msgstr "Uitzonderingstype" msgid "In the available periods {0} only {1} hours are available." msgstr "In de beschikbare perioden {0} zijn alleen {1} uren beschikbaar" -#: libreplan-webapp/src/main/webapp/users/_editUser.zul:126 +#: libreplan-webapp/src/main/webapp/users/_editUser.zul:115 msgid "Association with profiles" msgstr "Associeer met profielen" @@ -4229,7 +4251,7 @@ msgstr "Base" msgid "Total dedication" msgstr "Total dedication" -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderElementTreeController.java:683 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderElementTreeController.java:686 msgid "" "You can not remove the task \"{0}\" because of this or any of its children " "are already in use in some work reports" @@ -4430,8 +4452,8 @@ msgstr "In-/Uitschakelen waarschuwing over een beschikbare nieuwe LibrePlan vers msgid "Select type" msgstr "Kies type" -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/TaskElementAdapter.java:950 -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderModel.java:679 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/TaskElementAdapter.java:1021 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderModel.java:685 msgid "Hours invested" msgstr "Uren geinvesteerd" @@ -4501,7 +4523,7 @@ msgstr "Bedrijf" msgid "Both" msgstr "Beiden" -#: libreplan-webapp/src/main/java/org/libreplan/web/tree/TreeController.java:765 +#: libreplan-webapp/src/main/java/org/libreplan/web/tree/TreeController.java:882 msgid "Not editable for containing more that an hours group." msgstr "Niet te wijzigen voor het bevatten van meer dan een urengroep" @@ -4575,6 +4597,7 @@ msgid "LibrePlan: Transfer Projects Between Scenarios" msgstr "LibrePlan: Kopieer projecten tussen scenarios" #: libreplan-webapp/src/main/webapp/orders/_listOrderElementHours.zul:118 +#: libreplan-webapp/src/main/webapp/orders/_listOrderElementHours.zul:166 msgid "%" msgstr "%" @@ -4585,14 +4608,14 @@ msgstr "Verwijder kalender" #: libreplan-webapp/src/main/java/org/libreplan/web/workreports/WorkReportCRUDController.java:1536 #: libreplan-webapp/src/main/java/org/libreplan/web/workreports/WorkReportCRUDController.java:1700 -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/OrderPlanningController.java:336 -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/company/CompanyPlanningController.java:273 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/OrderPlanningController.java:338 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/company/CompanyPlanningController.java:274 #: libreplan-webapp/src/main/java/org/libreplan/web/reports/OrderCostsPerResourceController.java:141 #: libreplan-webapp/src/main/java/org/libreplan/web/resources/worker/WorkerCRUDController.java:633 #: libreplan-webapp/src/main/java/org/libreplan/web/resources/machine/MachineCRUDController.java:425 #: libreplan-webapp/src/main/java/org/libreplan/web/orders/ProjectDetailsController.java:257 -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderElementTreeController.java:670 -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:1328 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderElementTreeController.java:673 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:1332 msgid "must be lower than finish date" msgstr "moet eerder dan einddatum zijn" @@ -4613,14 +4636,14 @@ msgstr "Resource" msgid "Total task hours" msgstr "Totaal taakuren" -#: libreplan-webapp/src/main/java/org/libreplan/web/common/entrypoints/RedirectorSynthetiser.java:125 -msgid "Could not load any resource" -msgstr "Kon geen resource laden" - #: libreplan-webapp/src/main/webapp/subcontract/reportAdvances.zul:46 msgid "Date last progress reported" msgstr "Datum laatste voortgangsrapport" +#: libreplan-webapp/src/main/java/org/libreplan/web/common/entrypoints/RedirectorSynthetiser.java:125 +msgid "Could not load any resource" +msgstr "Kon geen resource laden" + #: libreplan-webapp/src/main/java/org/libreplan/web/common/CustomMenuController.java:343 #: libreplan-webapp/src/main/webapp/reports/schedulingProgressPerOrderReport.zul:37 msgid "Work And Progress Per Project" @@ -4683,7 +4706,7 @@ msgstr "Werkrapportregels lijst" msgid "Unit type code cannot be empty" msgstr "Unittype kan niet leeg zijn" -#: libreplan-webapp/src/main/java/org/libreplan/web/users/UserCRUDController.java:183 +#: libreplan-webapp/src/main/java/org/libreplan/web/users/UserCRUDController.java:189 #: libreplan-webapp/src/main/java/org/libreplan/web/common/CustomMenuController.java:320 msgid "Users" msgstr "Gebruikers" @@ -4716,8 +4739,8 @@ msgid "" "completed." msgstr "Een andere gebruiker heeft dezelfde gegevens gewijzigd, dus deze handeling kan niet veilig voltooid worden." -#: libreplan-webapp/src/main/java/org/libreplan/web/templates/OrderTemplatesController.java:218 -#: libreplan-webapp/src/main/java/org/libreplan/web/templates/OrderTemplatesController.java:232 +#: libreplan-webapp/src/main/java/org/libreplan/web/templates/OrderTemplatesController.java:223 +#: libreplan-webapp/src/main/java/org/libreplan/web/templates/OrderTemplatesController.java:244 msgid "Template saved" msgstr "Sjabloon opgeslagen" @@ -4756,7 +4779,7 @@ msgstr "Einde sessie" #: libreplan-webapp/src/main/webapp/resources/worker/_localizations.zul:31 #: libreplan-webapp/src/main/webapp/resources/worker/_localizations.zul:53 #: libreplan-webapp/src/main/webapp/resources/worker/_localizations.zul:67 -#: libreplan-business/src/main/java/org/libreplan/business/templates/entities/OrderLineGroupTemplate.java:243 +#: libreplan-business/src/main/java/org/libreplan/business/templates/entities/OrderLineGroupTemplate.java:244 msgid "Group" msgstr "Groep" @@ -4821,9 +4844,9 @@ msgstr "Incompatibele update: opgeslagen resource is niet van het type: {0}" #: libreplan-webapp/src/main/webapp/costcategories/_editCostCategory.zul:96 #: libreplan-webapp/src/main/webapp/costcategories/_editTypeOfWorkHours.zul:78 #: libreplan-webapp/src/main/webapp/qualityforms/_editQualityForm.zul:134 -#: libreplan-webapp/src/main/webapp/users/_editProfile.zul:83 -#: libreplan-webapp/src/main/webapp/users/_editUser.zul:164 -#: libreplan-webapp/src/main/webapp/templates/templates.zul:137 +#: libreplan-webapp/src/main/webapp/users/_editProfile.zul:72 +#: libreplan-webapp/src/main/webapp/users/_editUser.zul:153 +#: libreplan-webapp/src/main/webapp/templates/templates.zul:145 #: libreplan-webapp/src/main/webapp/resources/worker/_edition.zul:114 #: libreplan-webapp/src/main/webapp/resources/machine/_editMachine.zul:100 #: libreplan-webapp/src/main/webapp/resources/criterions/_edition.zul:92 @@ -4891,7 +4914,7 @@ msgstr "Plan vanaf de deadline naar de aanvang" msgid "generic machines allocation" msgstr "Gebruikelijke machine allocatie" -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/taskedition/TaskPropertiesController.java:375 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/taskedition/TaskPropertiesController.java:384 msgid "Non limiting resource assignation" msgstr "Onbegrensde resource toekenning" @@ -4914,13 +4937,13 @@ msgstr "Administratie" #: libreplan-webapp/src/main/java/org/libreplan/web/workreports/WorkReportCRUDController.java:1519 #: libreplan-webapp/src/main/java/org/libreplan/web/workreports/WorkReportCRUDController.java:1682 -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/OrderPlanningController.java:317 -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/company/CompanyPlanningController.java:255 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/OrderPlanningController.java:319 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/company/CompanyPlanningController.java:256 #: libreplan-webapp/src/main/java/org/libreplan/web/resources/worker/WorkerCRUDController.java:616 #: libreplan-webapp/src/main/java/org/libreplan/web/resources/machine/MachineCRUDController.java:408 #: libreplan-webapp/src/main/java/org/libreplan/web/orders/ProjectDetailsController.java:240 -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderElementTreeController.java:652 -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:1311 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderElementTreeController.java:655 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:1315 msgid "must be greater than start date" msgstr "Moet na de startdatum komen" @@ -4933,6 +4956,10 @@ msgstr "Afbreken en terug" msgid "Assign quality form" msgstr "Kwaliteitsformulier toekennen" +#: libreplan-webapp/src/main/webapp/orders/_edition.zul:157 +msgid "Calculated budget" +msgstr "Berekend budget" + #: libreplan-webapp/src/main/java/org/libreplan/web/orders/materials/AssignedMaterialsController.java:387 msgid "Delete item {0}. Are you sure?" msgstr "Verwijder item {0}. Weet u het zeker?" @@ -4958,6 +4985,10 @@ msgstr "Een werkrapportregel heeft niet dit labeltype toegekend gekregen" msgid "Allocations" msgstr "Allocatie" +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/assigntemplates/TemplateFinderPopup.java:137 +msgid "Choosing Template" +msgstr "Sjabloon kiezen" + #: libreplan-webapp/src/main/webapp/calendars/_edition.zul:66 #: libreplan-webapp/src/main/webapp/resources/worker/_listVirtualWorkers.zul:35 msgid "Capacity" @@ -5002,7 +5033,7 @@ msgstr "Er zijn geen allocaties gedaan" msgid "Removed calendar \"{0}\"" msgstr "Verwijderd kalender \"{0}\"" -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:1068 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:1072 msgid "Create project" msgstr "Maak project" @@ -5043,29 +5074,29 @@ msgstr "Kon deze autorisaties niet toevoegen aan gebruiker {0} omdat deze ze al msgid "New work report" msgstr "Nieuw werkrapport" +#: libreplan-webapp/src/main/java/org/libreplan/web/calendars/BaseCalendarEditionController.java:305 +msgid "Root calendar" +msgstr "Hoofdkalender" + #: libreplan-webapp/src/main/java/org/libreplan/web/resources/worker/WorkerCRUDController.java:847 #: libreplan-webapp/src/main/java/org/libreplan/web/resources/machine/MachineCRUDController.java:578 msgid "yes" msgstr "ja" -#: libreplan-webapp/src/main/java/org/libreplan/web/calendars/BaseCalendarEditionController.java:305 -msgid "Root calendar" -msgstr "Hoofdkalender" - -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:867 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:871 msgid "" "Deleting this subcontracted project, you are going to lose the relation to " "report progress. Are you sure?" msgstr "Als u dit uitbestede project verwijderd verliest u zijn relatie met de voortgangsrapportage. Weet u het zeker?" -#: libreplan-webapp/src/main/webapp/common/configuration.zul:278 -msgid "Port" -msgstr "Poort" - #: libreplan-webapp/src/main/webapp/limitingresources/manualAllocation.zul:113 msgid "Select gap" msgstr "Kies gap" +#: libreplan-webapp/src/main/webapp/common/configuration.zul:278 +msgid "Port" +msgstr "Poort" + #: libreplan-webapp/src/main/webapp/workreports/workReport.zul:63 msgid "Date Finish" msgstr "Einddatum" @@ -5093,7 +5124,11 @@ msgstr "Kostencategory toekenning" msgid "missing code in a hour cost" msgstr "ontbrekende code in een urenkostprijs" -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/TaskElementAdapter.java:902 +#: libreplan-webapp/src/main/java/org/libreplan/web/exceptionDays/CalendarExceptionTypeCRUDController.java:247 +msgid "Exception Day Type" +msgstr "Type uitzonderingsdag" + +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/TaskElementAdapter.java:973 msgid "All workers" msgstr "Alle werkers" @@ -5117,14 +5152,16 @@ msgstr "Urengroep {0}: Duplicaatcode in DB" #: libreplan-webapp/src/main/java/org/libreplan/web/materials/MaterialsController.java:311 #: libreplan-webapp/src/main/java/org/libreplan/web/costcategories/CostCategoryCRUDController.java:207 #: libreplan-webapp/src/main/java/org/libreplan/web/costcategories/CostCategoryCRUDController.java:307 +#: libreplan-webapp/src/main/java/org/libreplan/web/templates/TemplatesTreeController.java:110 +#: libreplan-webapp/src/main/java/org/libreplan/web/templates/TemplatesTreeController.java:130 #: libreplan-webapp/src/main/java/org/libreplan/web/calendars/BaseCalendarEditionController.java:994 #: libreplan-webapp/src/main/java/org/libreplan/web/calendars/BaseCalendarEditionController.java:1184 #: libreplan-webapp/src/main/java/org/libreplan/web/calendars/BaseCalendarEditionController.java:1441 #: libreplan-webapp/src/main/java/org/libreplan/web/resources/criterion/CriterionTreeController.java:135 #: libreplan-webapp/src/main/java/org/libreplan/web/orders/ProjectDetailsController.java:171 #: libreplan-webapp/src/main/java/org/libreplan/web/orders/labels/AssignedLabelsController.java:115 -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:1488 -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:1512 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:1492 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:1516 #: libreplan-webapp/src/main/java/org/libreplan/web/common/ConfigurationController.java:757 #: libreplan-webapp/src/main/webapp/labels/_editLabelType.zul:45 #: libreplan-webapp/src/main/webapp/labels/_editLabelType.zul:53 @@ -5191,10 +5228,6 @@ msgstr "Unit type" msgid "Load due to other assignments" msgstr "Belasting door andere opdrachten" -#: libreplan-webapp/src/main/webapp/orders/_listOrderElementHours.zul:62 -msgid "Sum of all task leafs imputed hours" -msgstr "Som van alle taak leafs toegerekende uren" - #: libreplan-webapp/src/main/java/org/libreplan/web/resources/machine/MachineCRUDController.java:554 msgid "This machine was already removed by other user" msgstr "Deze machine is al verwijderd door een andere gebruiker" @@ -5267,11 +5300,11 @@ msgstr "Ons bedrijfslogo" msgid "Filter work reports" msgstr "Filter werkrapporten" -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/TaskElementAdapter.java:947 -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderModel.java:678 -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderElementTreeController.java:601 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/TaskElementAdapter.java:1018 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderModel.java:684 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderElementTreeController.java:603 #: libreplan-webapp/src/main/java/org/libreplan/web/common/CustomMenuController.java:328 -#: libreplan-webapp/src/main/webapp/templates/templates.zul:63 +#: libreplan-webapp/src/main/webapp/templates/templates.zul:64 #: libreplan-webapp/src/main/webapp/templates/_editTemplateWindow.zul:49 #: libreplan-webapp/src/main/webapp/orders/_editOrderElement.zul:48 #: libreplan-webapp/src/main/webapp/orders/_edition.zul:46 @@ -5334,7 +5367,7 @@ msgstr "opties" msgid "LibrePlan: Work Reports" msgstr "LibrePlan: Werkrapporten" -#: libreplan-webapp/src/main/java/org/libreplan/web/templates/OrderTemplatesController.java:373 +#: libreplan-webapp/src/main/java/org/libreplan/web/templates/OrderTemplatesController.java:393 #: libreplan-webapp/src/main/java/org/libreplan/web/orders/materials/AssignedMaterialsController.java:393 msgid "Error on showing delete confirm" msgstr "Fout bij tonen van bevestiging verwijdering" @@ -5359,7 +5392,7 @@ msgstr "Groepeer op week" msgid "Finish hour" msgstr "Eind uur" -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/reassign/ReassignCommand.java:200 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/reassign/ReassignCommand.java:196 msgid "Done {0} of {1}" msgstr "Gedaan {0} van {1}" @@ -5415,16 +5448,16 @@ msgstr "Deze voortgangsmeting kan niet in " msgid "Inherited labels" msgstr "Geërfde labels" -#: libreplan-webapp/src/main/java/org/libreplan/web/tree/TreeController.java:946 -#: libreplan-webapp/src/main/java/org/libreplan/web/resources/criterion/CriterionTreeController.java:292 -msgid "Unindent" -msgstr "Uitspringen" - #: libreplan-webapp/src/main/java/org/libreplan/web/orders/ManageOrderElementAdvancesController.java:939 #: libreplan-webapp/src/main/java/org/libreplan/web/orders/ManageOrderElementAdvancesController.java:1406 msgid "Value is not valid, the current value must be not empty" msgstr "Waarde is ongeldig, de huidige waarde mag niet leeg zijn" +#: libreplan-webapp/src/main/java/org/libreplan/web/tree/TreeController.java:1063 +#: libreplan-webapp/src/main/java/org/libreplan/web/resources/criterion/CriterionTreeController.java:292 +msgid "Unindent" +msgstr "Uitspringen" + #: libreplan-webapp/src/main/webapp/orders/components/_listOrderElementLabels.zul:50 msgid "Direct labels" msgstr "Direkte labels" @@ -5488,7 +5521,7 @@ msgstr "De code sequence wordt reeds gebruikt en kan niet geupdate worden" msgid "Scheduling state" msgstr "Planing status" -#: libreplan-webapp/src/main/java/org/libreplan/web/templates/OrderTemplatesController.java:369 +#: libreplan-webapp/src/main/java/org/libreplan/web/templates/OrderTemplatesController.java:389 msgid "This template can not be removed because it has applications." msgstr "Deze sjabloon kan niet worden verwijderd want hij wordt toegepast" @@ -5508,6 +5541,10 @@ msgstr "LibrePlan: Gewerkte uren per resource" msgid "Number of iterations should be between 1 and " msgstr "Aantal iteraties moet liggen tussen 1 en " +#: libreplan-webapp/src/main/webapp/orders/_listOrderElementHours.zul:151 +msgid "Budget in money" +msgstr "Geldelijk budget" + #: libreplan-webapp/src/main/java/org/libreplan/web/common/ConfigurationController.java:145 msgid "Scenarios must be enabled as more elements than master exist" msgstr "Scenarios moeten worden aangezet omdat er meer elementen dan de master bestaan" @@ -5550,7 +5587,7 @@ msgstr "Inh" msgid "Administrator" msgstr "Administrator" -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/reassign/ReassignCommand.java:190 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/reassign/ReassignCommand.java:186 msgid "Doing {0} reassignations" msgstr "Bezig met {0} reassignations" @@ -5586,7 +5623,7 @@ msgstr "Kan werkrapporttype niet verwijderen. Er zijn koppelingen met enkele wer msgid "Criterion Type List" msgstr "Criterium Type Lijst" -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/OrderPlanningModel.java:739 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/OrderPlanningModel.java:765 msgid "Overall progress" msgstr "Overall voortgang" @@ -5610,7 +5647,7 @@ msgstr "Wachtwoord" msgid "Observations" msgstr "Observaties" -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:947 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:951 msgid "Edit project" msgstr "Wijzig project" @@ -5665,7 +5702,6 @@ msgstr "Verwijder {0} \"{1}\". Weet u het zeker?" msgid "Only {0} resources per day were achieved for current allocation" msgstr "Alleen {0} resources per dag zijn gelukt voor de huidige allocatie" -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/assigntemplates/TemplateFinderPopup.java:51 #: libreplan-webapp/src/main/webapp/planner/editTask.zul:79 #: libreplan-webapp/src/main/webapp/planner/reassign.zul:48 #: libreplan-webapp/src/main/webapp/planner/stretches_function.zul:89 @@ -5712,6 +5748,10 @@ msgstr "Voltooid: {0}%" msgid "Calculated progress measurement can not be removed" msgstr "Berekende voortgangsmeting kan niet verwijderd worden" +#: libreplan-webapp/src/main/java/org/libreplan/web/exceptionDays/CalendarExceptionTypeCRUDController.java:252 +msgid "Exception Day Types" +msgstr "Uitzonderingsdag types" + #: libreplan-webapp/src/main/java/org/libreplan/web/resources/worker/AssignedCriterionsModel.java:335 #: libreplan-webapp/src/main/java/org/libreplan/web/resources/worker/AssignedCriterionsModel.java:341 msgid " The " @@ -5755,6 +5795,10 @@ msgstr "Voer wijzigingen door en ga verder met wijzigen" msgid "Infinitely Over Assignable" msgstr "Oneindig overmatig toekenbaar" +#: libreplan-webapp/src/main/webapp/orders/_listOrderElementHours.zul:157 +msgid "Money spent" +msgstr "Uitgegeven geld" + #: libreplan-business/src/main/java/org/libreplan/business/resources/entities/CriterionType.java:426 msgid "criterion names must be unique inside a criterion type" msgstr "criterium namen moeten uniek zijn binnen een criteriumtype" @@ -5790,7 +5834,7 @@ msgstr "De beschikbare perioden zijn afhankelijk van de vervulling van de criter #: libreplan-webapp/src/main/webapp/reports/hoursWorkedPerWorkerReport.zul:86 #: libreplan-webapp/src/main/webapp/reports/schedulingProgressPerOrderReport.zul:116 #: libreplan-webapp/src/main/webapp/reports/timeLineMaterialReport.zul:95 -#: libreplan-webapp/src/main/webapp/templates/templates.zul:85 +#: libreplan-webapp/src/main/webapp/templates/templates.zul:86 #: libreplan-webapp/src/main/webapp/templates/_list.zul:26 #: libreplan-webapp/src/main/webapp/templates/_materialAssignmentsBox.zul:28 #: libreplan-webapp/src/main/webapp/calendars/_edition.zul:54 @@ -5847,15 +5891,20 @@ msgstr "Startdatum" msgid "Update exception" msgstr "Update uitzondering" -#: libreplan-webapp/src/main/webapp/subcontract/subcontractedTasks.zul:52 -#: libreplan-webapp/src/main/webapp/orders/_edition.zul:140 -msgid "Budget" -msgstr "Budget" - #: libreplan-webapp/src/main/java/org/libreplan/web/orders/TreeElementOperationsController.java:253 msgid "Operation cannot be done" msgstr "Handeling kan niet ongedaan gemaakt worden" +#: libreplan-webapp/src/main/java/org/libreplan/web/templates/TemplatesTreeComponent.java:91 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrdersTreeComponent.java:80 +#: libreplan-webapp/src/main/webapp/planner/taskpanels/_tabPanelTaskProperties.zul:62 +#: libreplan-webapp/src/main/webapp/templates/templates.zul:107 +#: libreplan-webapp/src/main/webapp/subcontract/subcontractedTasks.zul:52 +#: libreplan-webapp/src/main/webapp/orders/_orderElementDetails.zul:65 +#: libreplan-webapp/src/main/webapp/orders/_edition.zul:140 +msgid "Budget" +msgstr "Budget" + #: libreplan-webapp/src/main/java/org/libreplan/web/reports/HoursWorkedPerWorkerInAMonthController.java:44 msgid "May" msgstr "Mei" @@ -5889,7 +5938,7 @@ msgstr "Aantal applicaties" msgid "Assign element to queue automatically" msgstr "Wijs element automatisch aan queue toe" -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrdersTreeComponent.java:82 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrdersTreeComponent.java:92 msgid "" "Date which the task must start after (press enter in textbox to open " "calendar popup or type in date directly)" @@ -5925,8 +5974,8 @@ msgstr "Dit labeltype is al toegewezen aan het werkrapport type" msgid "Probability %" msgstr "Waarschijnlijkheid %" -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/OrderPlanningModel.java:737 -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/company/CompanyPlanningModel.java:324 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/OrderPlanningModel.java:763 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/company/CompanyPlanningModel.java:321 #: libreplan-webapp/src/main/java/org/libreplan/web/resourceload/ResourceLoadController.java:815 #: libreplan-webapp/src/main/webapp/planner/_legendLoadChartOrder.zul:49 msgid "Load" @@ -5937,12 +5986,12 @@ msgstr "Belasting" msgid "New criterion" msgstr "Nieuw criterium" -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderModel.java:683 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderModel.java:689 #: libreplan-webapp/src/main/webapp/materials/materials.zul:81 #: libreplan-webapp/src/main/webapp/scenarios/_edition.zul:43 #: libreplan-webapp/src/main/webapp/qualityforms/_listQualityForm.zul:37 #: libreplan-webapp/src/main/webapp/qualityforms/_editQualityForm.zul:49 -#: libreplan-webapp/src/main/webapp/templates/templates.zul:101 +#: libreplan-webapp/src/main/webapp/templates/templates.zul:102 #: libreplan-webapp/src/main/webapp/templates/_list.zul:32 #: libreplan-webapp/src/main/webapp/subcontract/subcontractedTasks.zul:51 #: libreplan-webapp/src/main/webapp/resources/machine/_listMachines.zul:36 @@ -5966,7 +6015,7 @@ msgstr "Selecteer node" msgid "already exists an allocation for criteria {0}" msgstr "er bestaat al een allocatie voor criterium {0}" -#: libreplan-webapp/src/main/java/org/libreplan/web/templates/OrderTemplatesController.java:283 +#: libreplan-webapp/src/main/java/org/libreplan/web/templates/OrderTemplatesController.java:303 #: libreplan-webapp/src/main/java/org/libreplan/web/common/CustomMenuController.java:294 msgid "Project Templates" msgstr "Project sjablonen" @@ -5993,7 +6042,7 @@ msgstr "Niet toegwezen" msgid "At least one HoursGroup is needed" msgstr "Minimaal één UrenGroep is nodig" -#: libreplan-webapp/src/main/java/org/libreplan/web/users/UserCRUDController.java:178 +#: libreplan-webapp/src/main/java/org/libreplan/web/users/UserCRUDController.java:184 #: libreplan-webapp/src/main/webapp/externalcompanies/_editExternalCompany.zul:63 #: libreplan-webapp/src/main/webapp/common/layout/login.zul:74 #: libreplan-business/src/main/java/org/libreplan/business/advance/entities/AdvanceType.java:165 @@ -6057,8 +6106,8 @@ msgstr "Belasting 100%" msgid "Function" msgstr "Functie" -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/OrderPlanningModel.java:799 -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/company/CompanyPlanningModel.java:363 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/OrderPlanningModel.java:825 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/company/CompanyPlanningModel.java:360 msgid "date in future" msgstr "datum in de toekomst" @@ -6073,14 +6122,14 @@ msgstr "datum in de toekomst" msgid "Format" msgstr "Formaat" -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/SaveCommandBuilder.java:887 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/SaveCommandBuilder.java:885 msgid "New project version" msgstr "Nieuwe projectversie" -#: libreplan-webapp/src/main/java/org/libreplan/web/templates/TemplatesTreeController.java:77 +#: libreplan-webapp/src/main/java/org/libreplan/web/templates/TemplatesTreeController.java:79 #: libreplan-webapp/src/main/java/org/libreplan/web/calendars/BaseCalendarCRUDController.java:366 -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderElementTreeController.java:484 -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:1231 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderElementTreeController.java:486 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:1235 #: libreplan-webapp/src/main/java/org/libreplan/web/limitingresources/QueueComponent.java:478 #: libreplan-webapp/src/main/java/org/libreplan/web/common/Util.java:537 #: libreplan-webapp/src/main/webapp/labels/_listLabelTypes.zul:37 @@ -6251,7 +6300,7 @@ msgstr "Waarde is ongeldig, de waarde moet groter zijn dan de waarde van de vori msgid "BCWS" msgstr "BCWS" -#: libreplan-webapp/src/main/java/org/libreplan/web/print/CutyPrint.java:351 +#: libreplan-webapp/src/main/java/org/libreplan/web/print/CutyPrint.java:343 msgid " in the specified directory." msgstr "in de aangegeven directory" @@ -6304,7 +6353,7 @@ msgstr "Daadwerkelijk Kosten Werk verricht" msgid "Create project from Template" msgstr "Maak project vanuit sjabloon" -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderElementTreeController.java:418 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderElementTreeController.java:420 msgid "" "Value is not valid.\n" " Code cannot contain chars like '_' \n" @@ -6315,11 +6364,15 @@ msgstr "Waarde is niet geldig.\nCode kan geen letters bevatten zoals '_'\nen mag msgid "an authorization type must be set" msgstr "een autorisatietype moet worden ingesteld" -#: libreplan-webapp/src/main/java/org/libreplan/web/templates/TemplatesTreeComponent.java:92 +#: libreplan-webapp/src/main/java/org/libreplan/web/templates/TemplatesTreeComponent.java:101 msgid "Must start after (days since beginning project)" msgstr "Moet starten na (dagen sinds aanvang project)" -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/SaveCommandBuilder.java:886 +#: libreplan-webapp/src/main/webapp/orders/_listOrderElementHours.zul:134 +msgid "Percentage of estimated budget in money / money spent" +msgstr "Percentage van geschat budget in uitgegeven geld/geld " + +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/SaveCommandBuilder.java:884 msgid "" "Confirm creating a new project version for this scenario and derived. Are " "you sure?" @@ -6367,7 +6420,7 @@ msgstr "Deselecteer" msgid "You should select the type of exception" msgstr "U dient het type uitzondering te kiezen" -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrdersTreeComponent.java:93 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrdersTreeComponent.java:103 #: libreplan-webapp/src/main/webapp/planner/taskpanels/_tabPanelTaskProperties.zul:46 #: libreplan-webapp/src/main/webapp/orders/_projectDetails.zul:63 #: libreplan-webapp/src/main/webapp/orders/_orderElementDetails.zul:52 @@ -6419,7 +6472,7 @@ msgstr "Gevorderde allocatie" msgid "Number of iterations" msgstr "Aantal iteraties" -#: libreplan-webapp/src/main/webapp/templates/templates.zul:60 +#: libreplan-webapp/src/main/webapp/templates/templates.zul:61 msgid "Template Tree" msgstr "Sjabloon boomstructuur" @@ -6446,11 +6499,15 @@ msgstr "inspanning is niet correct berekent gebaseerd op de klok" msgid "Status" msgstr "Status" +#: libreplan-webapp/src/main/java/org/libreplan/web/calendars/BaseCalendarEditionController.java:321 +msgid "from {0}" +msgstr "van {0}" + #: libreplan-webapp/src/main/webapp/settings/settings.zul:111 msgid "Resource load view" msgstr "Resource belasting view" -#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/OrderPlanningModel.java:787 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/OrderPlanningModel.java:813 msgid "the date must be inside the visualization area" msgstr "de datum moet binnen het visualiseer gedeelte liggen" @@ -6600,8 +6657,8 @@ msgid "Task Scheduling Status In Project" msgstr "Taak planning status in project" #: libreplan-webapp/src/main/java/org/libreplan/web/qualityforms/QualityFormCRUDController.java:162 -#: libreplan-webapp/src/main/java/org/libreplan/web/templates/OrderTemplatesController.java:356 -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:868 +#: libreplan-webapp/src/main/java/org/libreplan/web/templates/OrderTemplatesController.java:376 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:872 #: libreplan-webapp/src/main/java/org/libreplan/web/common/BaseCRUDController.java:313 msgid "Confirm" msgstr "Bevestig" @@ -6653,8 +6710,8 @@ msgstr "Toaalprijs" #: libreplan-webapp/src/main/java/org/libreplan/web/workreports/WorkReportCRUDController.java:1214 #: libreplan-webapp/src/main/java/org/libreplan/web/workreports/WorkReportCRUDController.java:1226 #: libreplan-webapp/src/main/java/org/libreplan/web/workreports/WorkReportTypeCRUDController.java:346 -#: libreplan-webapp/src/main/java/org/libreplan/web/tree/TreeController.java:984 -#: libreplan-webapp/src/main/java/org/libreplan/web/tree/TreeController.java:990 +#: libreplan-webapp/src/main/java/org/libreplan/web/tree/TreeController.java:1101 +#: libreplan-webapp/src/main/java/org/libreplan/web/tree/TreeController.java:1107 #: libreplan-webapp/src/main/java/org/libreplan/web/costcategories/CostCategoryCRUDController.java:289 #: libreplan-webapp/src/main/java/org/libreplan/web/costcategories/CostCategoryCRUDController.java:457 #: libreplan-webapp/src/main/java/org/libreplan/web/costcategories/ResourcesCostCategoryAssignmentController.java:143 @@ -6673,7 +6730,7 @@ msgstr "Toaalprijs" #: libreplan-webapp/src/main/java/org/libreplan/web/orders/AssignedTaskQualityFormsToOrderElementController.java:201 #: libreplan-webapp/src/main/java/org/libreplan/web/orders/AssignedTaskQualityFormsToOrderElementController.java:333 #: libreplan-webapp/src/main/java/org/libreplan/web/orders/AssignedTaskQualityFormsToOrderElementController.java:406 -#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:1247 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:1251 #: libreplan-webapp/src/main/webapp/labels/_editLabelType.zul:99 #: libreplan-webapp/src/main/webapp/labels/_listLabelTypes.zul:42 #: libreplan-webapp/src/main/webapp/externalcompanies/_listExternalCompanies.zul:49 @@ -6698,10 +6755,8 @@ msgstr "Toaalprijs" #: libreplan-webapp/src/main/webapp/reports/workingArrangementsPerOrderReport.zul:154 #: libreplan-webapp/src/main/webapp/reports/timeLineMaterialReport.zul:106 #: libreplan-webapp/src/main/webapp/users/_listUsers.zul:46 -#: libreplan-webapp/src/main/webapp/users/_editProfile.zul:68 #: libreplan-webapp/src/main/webapp/users/_listProfiles.zul:40 -#: libreplan-webapp/src/main/webapp/users/_editUser.zul:115 -#: libreplan-webapp/src/main/webapp/users/_editUser.zul:148 +#: libreplan-webapp/src/main/webapp/users/_editUser.zul:137 #: libreplan-webapp/src/main/webapp/templates/_list.zul:53 #: libreplan-webapp/src/main/webapp/templates/_materialAssignmentsBox.zul:55 #: libreplan-webapp/src/main/webapp/resources/worker/_listVirtualWorkers.zul:52 @@ -6801,7 +6856,7 @@ msgid "Stretches" msgstr "Stretches" #: libreplan-business/src/main/java/org/libreplan/business/planner/entities/AssignmentFunction.java:79 -msgid "Interporlation" +msgid "Interpolation" msgstr "Interpolatie" #: libreplan-business/src/main/java/org/libreplan/business/planner/entities/AssignmentFunction.java:80 @@ -6865,23 +6920,23 @@ msgstr "Wordt aan gewerkt" msgid "Blocked" msgstr "Geblokkeerd" -#: libreplan-business/src/main/java/org/libreplan/business/planner/entities/PositionConstraintType.java:29 +#: libreplan-business/src/main/java/org/libreplan/business/planner/entities/PositionConstraintType.java:31 msgid "as soon as possible" msgstr "zo snel mogelijk" -#: libreplan-business/src/main/java/org/libreplan/business/planner/entities/PositionConstraintType.java:41 +#: libreplan-business/src/main/java/org/libreplan/business/planner/entities/PositionConstraintType.java:38 msgid "start not earlier than" msgstr "start niet eerder dan" -#: libreplan-business/src/main/java/org/libreplan/business/planner/entities/PositionConstraintType.java:53 +#: libreplan-business/src/main/java/org/libreplan/business/planner/entities/PositionConstraintType.java:45 msgid "start in fixed date" msgstr "start op vaste datum" -#: libreplan-business/src/main/java/org/libreplan/business/planner/entities/PositionConstraintType.java:65 +#: libreplan-business/src/main/java/org/libreplan/business/planner/entities/PositionConstraintType.java:57 msgid "as late as possible" msgstr "zo laat mogelijk" -#: libreplan-business/src/main/java/org/libreplan/business/planner/entities/PositionConstraintType.java:77 +#: libreplan-business/src/main/java/org/libreplan/business/planner/entities/PositionConstraintType.java:64 msgid "finish not later than" msgstr "eindig niet later dan" @@ -6921,7 +6976,7 @@ msgstr "Alle projecten versies toegestaan" msgid "Project creation allowed" msgstr "Project aanmaken toegestaan" -#: libreplan-business/src/main/java/org/libreplan/business/templates/entities/OrderLineTemplate.java:122 +#: libreplan-business/src/main/java/org/libreplan/business/templates/entities/OrderLineTemplate.java:132 msgid "Line" msgstr "Regel" @@ -7089,23 +7144,23 @@ msgstr "P" msgid "U" msgstr "U" -#: libreplan-business/src/main/java/org/libreplan/business/orders/entities/OrderElement.java:618 +#: libreplan-business/src/main/java/org/libreplan/business/orders/entities/OrderElement.java:629 msgid "" "Some ancestor has the same label assigned, so this element is already " "inheriting this label" msgstr "Een parent heeft hetzelfde label toegekend gekregen, dus dit element erft reeds dit label" -#: libreplan-business/src/main/java/org/libreplan/business/orders/entities/OrderElement.java:717 +#: libreplan-business/src/main/java/org/libreplan/business/orders/entities/OrderElement.java:728 #: libreplan-business/src/main/java/org/libreplan/business/orders/entities/OrderLineGroup.java:963 msgid "Cannot spread two progress in the same task" msgstr "Kan geen twee voortgangen in dezelfde taak spreiden" -#: libreplan-business/src/main/java/org/libreplan/business/orders/entities/OrderElement.java:741 -#: libreplan-business/src/main/java/org/libreplan/business/orders/entities/OrderElement.java:767 +#: libreplan-business/src/main/java/org/libreplan/business/orders/entities/OrderElement.java:752 +#: libreplan-business/src/main/java/org/libreplan/business/orders/entities/OrderElement.java:778 msgid "Duplicate Progress Assignment For Task" msgstr "Duplicaat voortgangs toewijziging voor taak" -#: libreplan-business/src/main/java/org/libreplan/business/orders/entities/OrderElement.java:1094 +#: libreplan-business/src/main/java/org/libreplan/business/orders/entities/OrderElement.java:1105 msgid "Quality form already exists" msgstr "kwaliteitsformulier bestaat reeds" From fce1d66713558fe248a58a38aec6b31b4477adb2 Mon Sep 17 00:00:00 2001 From: Manuel Rego Casasnovas Date: Mon, 16 Apr 2012 11:47:50 +0200 Subject: [PATCH 014/108] Fix Sahi test due to change in string FEA: ItEr76S04BugFixing --- scripts/functional-tests/scheduling/templates_test.sah | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/functional-tests/scheduling/templates_test.sah b/scripts/functional-tests/scheduling/templates_test.sah index e7b703908..bb94a7df5 100644 --- a/scripts/functional-tests/scheduling/templates_test.sah +++ b/scripts/functional-tests/scheduling/templates_test.sah @@ -80,7 +80,7 @@ function templateTaskAssignTemplate($projectName, $taskName){ _click(_cell("Add From Template")); _click(_italic(0, _cell("z-caption-l"))); _click(_div("new container")); - _click(_cell("Create Task")); + _click(_cell("Create task")); _click(_image("ico_save.png")); _click(_cell("OK")); _log("Assign the task template", "custom1") From 9d4e8d61229c50be5bf209c90dca03f89e8437bb Mon Sep 17 00:00:00 2001 From: Manuel Rego Casasnovas Date: Tue, 17 Apr 2012 08:07:46 +0200 Subject: [PATCH 015/108] Bug #1411: Missing Spanish translation for "Project cost by resource" FEA: ItEr76S04BugFixing --- .../orderCostsPerResource_es.properties | 32 +++++++++---------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/libreplan-webapp/src/main/jasper/orderCostsPerResource_Bundle/orderCostsPerResource_es.properties b/libreplan-webapp/src/main/jasper/orderCostsPerResource_Bundle/orderCostsPerResource_es.properties index 58467adeb..3f47ebdd0 100644 --- a/libreplan-webapp/src/main/jasper/orderCostsPerResource_Bundle/orderCostsPerResource_es.properties +++ b/libreplan-webapp/src/main/jasper/orderCostsPerResource_Bundle/orderCostsPerResource_es.properties @@ -1,17 +1,17 @@ # Locale for ordersCostPerResourcesReport.jrxml -title = Project report -subtitle = Costs by Resource -date.start = Starting date: -date.end = Ending date: -criteria = Criteria : -labels = Labels : -headers.column1 = Type of hours -headers.column2 = Date -headers.column3 = Salary -headers.column4 = Hours -headers.column5 = Costs -total.task = Total per task: -total.worker = Total per worker: -total = Project Total: -page = page -of = of +title = Informe del proyecto +subtitle = Costes por recurso +date.start = Fecha de inicio: +date.end = Fecha de fin: +criteria = Criterios: +labels = Etiquetas: +headers.column1 = Tipo de horas +headers.column2 = Fecha +headers.column3 = Salario +headers.column4 = Horas +headers.column5 = Costes +total.task = Total por tarea: +total.worker = Total por trabajador: +total = Total por proyecto: +page = página +of = de From bd0406aa7b88feea9aa2936ef39b3427a3c77779 Mon Sep 17 00:00:00 2001 From: Manuel Rego Casasnovas Date: Tue, 17 Apr 2012 09:34:05 +0200 Subject: [PATCH 016/108] Revert "Bug #1320: When asking a container for start constraints, return the leftmost" This reverts commit ef057267b968256c3d6a6300a0572e3b303aae54. because of it's causing a more important bug #1410. FEA: ItEr76S04BugFixing --- .../web/planner/TaskElementAdapter.java | 33 ------------------- 1 file changed, 33 deletions(-) diff --git a/libreplan-webapp/src/main/java/org/libreplan/web/planner/TaskElementAdapter.java b/libreplan-webapp/src/main/java/org/libreplan/web/planner/TaskElementAdapter.java index 8fe2839d4..3c3019693 100644 --- a/libreplan-webapp/src/main/java/org/libreplan/web/planner/TaskElementAdapter.java +++ b/libreplan-webapp/src/main/java/org/libreplan/web/planner/TaskElementAdapter.java @@ -118,41 +118,8 @@ public class TaskElementAdapter { private static final Log LOG = LogFactory.getLog(TaskElementAdapter.class); - private static TaskPositionConstraint getLeftMostFixedDateConstraintAmongChildren( - TaskGroup container) { - - TaskPositionConstraint constraint = null; - for(TaskElement child : ((TaskGroup)container).getChildren()) { - TaskPositionConstraint currentConstraint = null; - if (child instanceof ITaskPositionConstrained) { - ITaskPositionConstrained task = (ITaskPositionConstrained) child; - currentConstraint = task.getPositionConstraint(); - } - else if (child instanceof TaskGroup) { - currentConstraint = getLeftMostFixedDateConstraintAmongChildren( - (TaskGroup) child); - } - if(currentConstraint != null && - currentConstraint.getConstraintType().equals( - PositionConstraintType.START_IN_FIXED_DATE) && - (constraint == null || currentConstraint.getConstraintDate(). - compareTo(constraint.getConstraintDate()) < 0)) { - constraint = currentConstraint; - } - } - return constraint; - } public static List> getStartConstraintsFor( TaskElement taskElement, LocalDate orderInitDate) { - if (taskElement instanceof TaskGroup) { - TaskPositionConstraint constraint = - getLeftMostFixedDateConstraintAmongChildren((TaskGroup) taskElement); - if(constraint == null) { - return Collections.emptyList(); - } - return Collections.singletonList(equalTo(toGantt( - constraint.getConstraintDate()))); - } if (taskElement instanceof ITaskPositionConstrained) { ITaskPositionConstrained task = (ITaskPositionConstrained) taskElement; TaskPositionConstraint startConstraint = task From ddf79bde1ffad4e86be4c0c9bd8f10e65da4d586 Mon Sep 17 00:00:00 2001 From: Manuel Rego Casasnovas Date: Tue, 17 Apr 2012 13:17:24 +0200 Subject: [PATCH 017/108] Bug #1409: Fix problem replacing allocations for the ones related to the criterion Without this patch, the replacement was been doing wrong as it has been replacing the allocation related to a criterion with allocations related to any of the criteria being shown. This didn't happen in company view because of there's not unsaved changes, so the replacement method do nothing. FEA: ItEr76S04BugFixing --- .../web/resourceload/ResourceLoadModel.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/libreplan-webapp/src/main/java/org/libreplan/web/resourceload/ResourceLoadModel.java b/libreplan-webapp/src/main/java/org/libreplan/web/resourceload/ResourceLoadModel.java index c321f783a..1a94198ef 100644 --- a/libreplan-webapp/src/main/java/org/libreplan/web/resourceload/ResourceLoadModel.java +++ b/libreplan-webapp/src/main/java/org/libreplan/web/resourceload/ResourceLoadModel.java @@ -26,6 +26,7 @@ import static org.libreplan.web.I18nHelper._; import static org.libreplan.web.planner.order.PlanningStateCreator.and; import java.util.ArrayList; +import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.Date; @@ -461,8 +462,7 @@ public class ResourceLoadModel implements IResourceLoadModel { relatedWith, asDate(parameters.getInitDateFilter()), asDate(parameters.getEndDateFilter())); - return doReplacementsIfNeeded(result, - and(onInterval(), new RelatedWithAnyOf(relatedWith))); + return doReplacementsIfNeeded(result); } private Map>> withAssociatedSpecific( @@ -494,19 +494,19 @@ public class ResourceLoadModel implements IResourceLoadModel { resourceAllocationDAO.findGenericAllocationsByCriterion( getCurrentScenario(), asDate(parameters.getInitDateFilter()), - asDate(parameters.getEndDateFilter())), - onInterval()); + asDate(parameters.getEndDateFilter()))); } private Map> doReplacementsIfNeeded( - Map> map, - IAllocationCriteria criteria) { + Map> map) { if (!parameters.thereIsCurrentOrder()) { return map; } Map> result = new HashMap>(); for (Entry> each : map .entrySet()) { + IAllocationCriteria criteria = and(onInterval(), + new RelatedWithAnyOf(Arrays.asList(each.getKey()))); List> replaced = parameters .getPlanningState().replaceByCurrentOnes( each.getValue(), criteria); From 5c608c9a4a522f9022d2d3e2bb436aaee4ad6209 Mon Sep 17 00:00:00 2001 From: Manuel Rego Casasnovas Date: Tue, 17 Apr 2012 13:24:53 +0200 Subject: [PATCH 018/108] Bug #1409: Rename RelatedWithAnyOf to RelatedWith Now the constructor only receives one criterion. FEA: ItEr76S04BugFixing --- .../web/planner/order/PlanningStateCreator.java | 11 +++++------ .../libreplan/web/resourceload/ResourceLoadModel.java | 5 ++--- 2 files changed, 7 insertions(+), 9 deletions(-) diff --git a/libreplan-webapp/src/main/java/org/libreplan/web/planner/order/PlanningStateCreator.java b/libreplan-webapp/src/main/java/org/libreplan/web/planner/order/PlanningStateCreator.java index 598b76aa4..fecfdb775 100644 --- a/libreplan-webapp/src/main/java/org/libreplan/web/planner/order/PlanningStateCreator.java +++ b/libreplan-webapp/src/main/java/org/libreplan/web/planner/order/PlanningStateCreator.java @@ -1133,14 +1133,13 @@ public class PlanningStateCreator { } } - public static class RelatedWithAnyOf implements + public static class RelatedWith implements IAllocationCriteria { - private final Collection anyOf; + private final Criterion criterion; - public RelatedWithAnyOf( - Collection anyOf) { - this.anyOf = anyOf; + public RelatedWith(Criterion criterion) { + this.criterion = criterion; } @Override @@ -1156,7 +1155,7 @@ public class PlanningStateCreator { private boolean someCriterionIn( Collection allocationCriterions) { for (Criterion each : allocationCriterions) { - if (this.anyOf.contains(each)) { + if (criterion.equals(each)) { return true; } } diff --git a/libreplan-webapp/src/main/java/org/libreplan/web/resourceload/ResourceLoadModel.java b/libreplan-webapp/src/main/java/org/libreplan/web/resourceload/ResourceLoadModel.java index 1a94198ef..2370623d3 100644 --- a/libreplan-webapp/src/main/java/org/libreplan/web/resourceload/ResourceLoadModel.java +++ b/libreplan-webapp/src/main/java/org/libreplan/web/resourceload/ResourceLoadModel.java @@ -26,7 +26,6 @@ import static org.libreplan.web.I18nHelper._; import static org.libreplan.web.planner.order.PlanningStateCreator.and; import java.util.ArrayList; -import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.Date; @@ -74,7 +73,7 @@ import org.libreplan.business.users.entities.UserRole; import org.libreplan.web.calendars.BaseCalendarModel; import org.libreplan.web.planner.order.PlanningStateCreator.IAllocationCriteria; import org.libreplan.web.planner.order.PlanningStateCreator.PlanningState; -import org.libreplan.web.planner.order.PlanningStateCreator.RelatedWithAnyOf; +import org.libreplan.web.planner.order.PlanningStateCreator.RelatedWith; import org.libreplan.web.planner.order.PlanningStateCreator.RelatedWithResource; import org.libreplan.web.planner.order.PlanningStateCreator.SpecificRelatedWithCriterionOnInterval; import org.libreplan.web.planner.order.PlanningStateCreator.TaskOnInterval; @@ -506,7 +505,7 @@ public class ResourceLoadModel implements IResourceLoadModel { for (Entry> each : map .entrySet()) { IAllocationCriteria criteria = and(onInterval(), - new RelatedWithAnyOf(Arrays.asList(each.getKey()))); + new RelatedWith(each.getKey())); List> replaced = parameters .getPlanningState().replaceByCurrentOnes( each.getValue(), criteria); From 691bd6634a1c73fd5da290e422080e526bd5fdb4 Mon Sep 17 00:00:00 2001 From: Manuel Rego Casasnovas Date: Tue, 17 Apr 2012 18:18:04 +0200 Subject: [PATCH 019/108] Bug #1412: Fix problem converting to string clockStart and clockFinish FEA: ItEr76S04BugFixing --- .../reports/dtos/HoursWorkedPerResourceDTO.java | 17 ++++++++--------- .../jasper/hoursWorkedPerWorkerReport.jrxml | 8 ++++---- 2 files changed, 12 insertions(+), 13 deletions(-) diff --git a/libreplan-business/src/main/java/org/libreplan/business/reports/dtos/HoursWorkedPerResourceDTO.java b/libreplan-business/src/main/java/org/libreplan/business/reports/dtos/HoursWorkedPerResourceDTO.java index 0de687547..9fce1dfc6 100644 --- a/libreplan-business/src/main/java/org/libreplan/business/reports/dtos/HoursWorkedPerResourceDTO.java +++ b/libreplan-business/src/main/java/org/libreplan/business/reports/dtos/HoursWorkedPerResourceDTO.java @@ -25,7 +25,6 @@ import java.util.Date; import java.util.Set; import org.joda.time.LocalDate; -import org.joda.time.LocalTime; import org.libreplan.business.labels.entities.Label; import org.libreplan.business.resources.entities.Resource; import org.libreplan.business.workingday.EffortDuration; @@ -38,9 +37,9 @@ public class HoursWorkedPerResourceDTO implements Comparable { private Date date; - private LocalTime clockStart; + private String clockStart; - private LocalTime clockFinish; + private String clockFinish; private EffortDuration effort; @@ -59,8 +58,8 @@ public class HoursWorkedPerResourceDTO implements Comparable { this.workerName = resource.getName(); this.date = workReportLine.getDate(); - this.clockStart = workReportLine.getClockStart(); - this.clockFinish = workReportLine.getClockFinish(); + this.clockStart = workReportLine.getClockStart().toString("HH:mm"); + this.clockFinish = workReportLine.getClockFinish().toString("HH:mm"); this.effort = workReportLine.getEffort(); this.orderElementCode = workReportLine.getOrderElement().getCode(); this.orderElementName = workReportLine.getOrderElement().getName(); @@ -98,19 +97,19 @@ public class HoursWorkedPerResourceDTO implements Comparable { this.effort = effort; } - public LocalTime getClockStart() { + public String getClockStart() { return clockStart; } - public void setClockStart(LocalTime clockStart) { + public void setClockStart(String clockStart) { this.clockStart = clockStart; } - public LocalTime getClockFinish() { + public String getClockFinish() { return clockFinish; } - public void setClockFinish(LocalTime clockFinish) { + public void setClockFinish(String clockFinish) { this.clockFinish = clockFinish; } diff --git a/libreplan-webapp/src/main/jasper/hoursWorkedPerWorkerReport.jrxml b/libreplan-webapp/src/main/jasper/hoursWorkedPerWorkerReport.jrxml index 707ed3853..ddfa9c325 100644 --- a/libreplan-webapp/src/main/jasper/hoursWorkedPerWorkerReport.jrxml +++ b/libreplan-webapp/src/main/jasper/hoursWorkedPerWorkerReport.jrxml @@ -9,8 +9,8 @@ - - + + @@ -343,7 +343,7 @@ - + @@ -355,7 +355,7 @@ - + From f933be8a601ae1edc14d2bb00d73289462b50082 Mon Sep 17 00:00:00 2001 From: Manuel Rego Casasnovas Date: Tue, 17 Apr 2012 18:22:39 +0200 Subject: [PATCH 020/108] Remove unused fields in Order Costs Per Resource Report --- .../src/main/jasper/orderCostsPerResourceReport.jrxml | 2 -- 1 file changed, 2 deletions(-) diff --git a/libreplan-webapp/src/main/jasper/orderCostsPerResourceReport.jrxml b/libreplan-webapp/src/main/jasper/orderCostsPerResourceReport.jrxml index 7288e1dad..35ef705e2 100644 --- a/libreplan-webapp/src/main/jasper/orderCostsPerResourceReport.jrxml +++ b/libreplan-webapp/src/main/jasper/orderCostsPerResourceReport.jrxml @@ -9,8 +9,6 @@ - - From a8bbe482a31044108860f0ad6018643945e16170 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jacobo=20Aragunde=20P=C3=A9rez?= Date: Tue, 17 Apr 2012 18:46:39 +0200 Subject: [PATCH 021/108] Bug #1407: Run TaskComponent.updateProperties() after running the scheduling algorithm. --- .../web/planner/taskedition/EditTaskController.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/libreplan-webapp/src/main/java/org/libreplan/web/planner/taskedition/EditTaskController.java b/libreplan-webapp/src/main/java/org/libreplan/web/planner/taskedition/EditTaskController.java index babf31491..5c74ee101 100644 --- a/libreplan-webapp/src/main/java/org/libreplan/web/planner/taskedition/EditTaskController.java +++ b/libreplan-webapp/src/main/java/org/libreplan/web/planner/taskedition/EditTaskController.java @@ -39,6 +39,7 @@ import org.libreplan.web.planner.taskedition.TaskPropertiesController.ResourceAl import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.context.annotation.Scope; +import org.zkoss.ganttz.TaskComponent; import org.zkoss.ganttz.extensions.IContextWithPlannerTask; import org.zkoss.zk.ui.Component; import org.zkoss.zk.ui.event.Event; @@ -311,6 +312,10 @@ public class EditTaskController extends GenericForwardComposer { if (context != null) { context.getTask().reloadResourcesText(); context.reloadCharts(); + if (context.getRelativeTo() instanceof TaskComponent) { + ((TaskComponent) context.getRelativeTo()).updateProperties(); + ((TaskComponent) context.getRelativeTo()).invalidate(); + } } } From 3096fd91a847c74b3113a73903db1d446331f388 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lorenzo=20Tilve=20=C3=81lvaro?= Date: Fri, 13 Apr 2012 18:12:09 +0200 Subject: [PATCH 022/108] Bug #1358: Added CSS max dimensions restriction to configured company logo FEA: ItEr76S04BugFixing --- libreplan-webapp/src/main/webapp/common/configuration.zul | 3 ++- libreplan-webapp/src/main/webapp/common/css/libreplan.css | 7 ++++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/libreplan-webapp/src/main/webapp/common/configuration.zul b/libreplan-webapp/src/main/webapp/common/configuration.zul index 1d435feb8..c27ec88ad 100644 --- a/libreplan-webapp/src/main/webapp/common/configuration.zul +++ b/libreplan-webapp/src/main/webapp/common/configuration.zul @@ -3,7 +3,7 @@ Copyright (C) 2009-2010 Fundación para o Fomento da Calidade Industrial e Desenvolvemento Tecnolóxico de Galicia - Copyright (C) 2011 Igalia, S.L. + Copyright (C) 2011-2012 Igalia, S.L. This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as @@ -81,6 +81,7 @@ value="${i18n:_('Company logo URL')}" /> diff --git a/libreplan-webapp/src/main/webapp/common/css/libreplan.css b/libreplan-webapp/src/main/webapp/common/css/libreplan.css index ae2641fd4..26e6f3d00 100644 --- a/libreplan-webapp/src/main/webapp/common/css/libreplan.css +++ b/libreplan-webapp/src/main/webapp/common/css/libreplan.css @@ -208,4 +208,9 @@ a.sub_menu:hover { .footer-messages-area a:hover { text-decoration: underline; -} \ No newline at end of file +} + +.logo-area img { + max-width: 300px; + max-height: 65px; +} From 7c91dfb43be4bb0fef9c51b14248131ff947dea6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lorenzo=20Tilve=20=C3=81lvaro?= Date: Wed, 18 Apr 2012 11:49:43 +0200 Subject: [PATCH 023/108] Bug #1358: Removed unnecessary tooltip string FEA: ItEr76S04BugFixing --- libreplan-webapp/src/main/webapp/common/configuration.zul | 1 - 1 file changed, 1 deletion(-) diff --git a/libreplan-webapp/src/main/webapp/common/configuration.zul b/libreplan-webapp/src/main/webapp/common/configuration.zul index c27ec88ad..059180156 100644 --- a/libreplan-webapp/src/main/webapp/common/configuration.zul +++ b/libreplan-webapp/src/main/webapp/common/configuration.zul @@ -81,7 +81,6 @@ value="${i18n:_('Company logo URL')}" /> From 963268600438d3ad23a7a401aae454bdce478d64 Mon Sep 17 00:00:00 2001 From: Manuel Rego Casasnovas Date: Wed, 18 Apr 2012 18:19:47 +0200 Subject: [PATCH 024/108] Bug #1384: Add validation in starting date and deadline depending on position constraints FEA: ItEr76S04BugFixing --- .../business/planner/entities/Task.java | 9 +++- .../planner/entities/TaskElement.java | 5 +- .../business/planner/entities/TaskGroup.java | 14 +++++- .../planner/entities/TaskMilestone.java | 8 +++- .../org/libreplan/web/orders/IOrderModel.java | 6 ++- .../web/orders/OrderCRUDController.java | 48 ++++++++++++++++--- .../org/libreplan/web/orders/OrderModel.java | 12 ++++- 7 files changed, 90 insertions(+), 12 deletions(-) diff --git a/libreplan-business/src/main/java/org/libreplan/business/planner/entities/Task.java b/libreplan-business/src/main/java/org/libreplan/business/planner/entities/Task.java index 317148192..15a24867b 100644 --- a/libreplan-business/src/main/java/org/libreplan/business/planner/entities/Task.java +++ b/libreplan-business/src/main/java/org/libreplan/business/planner/entities/Task.java @@ -3,7 +3,7 @@ * * Copyright (C) 2009-2010 Fundación para o Fomento da Calidade Industrial e * Desenvolvemento Tecnolóxico de Galicia - * Copyright (C) 2010-2011 Igalia, S.L. + * Copyright (C) 2010-2012 Igalia, S.L. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as published by @@ -73,6 +73,7 @@ import org.libreplan.business.workingday.ResourcesPerDay; /** * @author Óscar González Fernández + * @author Manuel Rego Casasnovas */ public class Task extends TaskElement implements ITaskPositionConstrained { @@ -1218,4 +1219,10 @@ public class Task extends TaskElement implements ITaskPositionConstrained { public void resetStatus() { this.currentStatus = null; } + + @Override + public boolean isAnyTaskWithConstraint(PositionConstraintType type) { + return getPositionConstraint().getConstraintType().equals(type); + } + } diff --git a/libreplan-business/src/main/java/org/libreplan/business/planner/entities/TaskElement.java b/libreplan-business/src/main/java/org/libreplan/business/planner/entities/TaskElement.java index 7ddc7d3ac..23262c025 100644 --- a/libreplan-business/src/main/java/org/libreplan/business/planner/entities/TaskElement.java +++ b/libreplan-business/src/main/java/org/libreplan/business/planner/entities/TaskElement.java @@ -3,7 +3,7 @@ * * Copyright (C) 2009-2010 Fundación para o Fomento da Calidade Industrial e * Desenvolvemento Tecnolóxico de Galicia - * Copyright (C) 2010-2011 Igalia, S.L. + * Copyright (C) 2010-2012 Igalia, S.L. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as published by @@ -63,6 +63,7 @@ import org.libreplan.business.workingday.ResourcesPerDay; /** * @author Óscar González Fernández + * @author Manuel Rego Casasnovas */ public abstract class TaskElement extends BaseEntity { @@ -769,4 +770,6 @@ public abstract class TaskElement extends BaseEntity { return null; } + public abstract boolean isAnyTaskWithConstraint(PositionConstraintType type); + } diff --git a/libreplan-business/src/main/java/org/libreplan/business/planner/entities/TaskGroup.java b/libreplan-business/src/main/java/org/libreplan/business/planner/entities/TaskGroup.java index c06d5896b..0edfd3817 100644 --- a/libreplan-business/src/main/java/org/libreplan/business/planner/entities/TaskGroup.java +++ b/libreplan-business/src/main/java/org/libreplan/business/planner/entities/TaskGroup.java @@ -3,7 +3,7 @@ * * Copyright (C) 2009-2010 Fundación para o Fomento da Calidade Industrial e * Desenvolvemento Tecnolóxico de Galicia - * Copyright (C) 2010-2011 Igalia, S.L. + * Copyright (C) 2010-2012 Igalia, S.L. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as published by @@ -44,6 +44,7 @@ import org.libreplan.business.workingday.IntraDayDate; /** * @author Óscar González Fernández * @author Javier Moran Rua + * @author Manuel Rego Casasnovas */ public class TaskGroup extends TaskElement { @@ -376,4 +377,15 @@ public class TaskGroup extends TaskElement { public void resetStatus() { this.isFinished = this.isInProgress = null; } + + @Override + public boolean isAnyTaskWithConstraint(PositionConstraintType type) { + for (TaskElement taskElement : getChildren()) { + if (taskElement.isAnyTaskWithConstraint(type)) { + return true; + } + } + return false; + } + } diff --git a/libreplan-business/src/main/java/org/libreplan/business/planner/entities/TaskMilestone.java b/libreplan-business/src/main/java/org/libreplan/business/planner/entities/TaskMilestone.java index e744eb35d..2583920f4 100644 --- a/libreplan-business/src/main/java/org/libreplan/business/planner/entities/TaskMilestone.java +++ b/libreplan-business/src/main/java/org/libreplan/business/planner/entities/TaskMilestone.java @@ -3,7 +3,7 @@ * * Copyright (C) 2009-2010 Fundación para o Fomento da Calidade Industrial e * Desenvolvemento Tecnolóxico de Galicia - * Copyright (C) 2010-2011 Igalia, S.L. + * Copyright (C) 2010-2012 Igalia, S.L. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as published by @@ -43,6 +43,7 @@ import org.libreplan.business.workingday.IntraDayDate; /** * @author Lorenzo Tilve Álvaro * @author Javier Moran Rua + * @author Manuel Rego Casasnovas */ public class TaskMilestone extends TaskElement implements ITaskPositionConstrained { @@ -225,4 +226,9 @@ public class TaskMilestone extends TaskElement implements ITaskPositionConstrain return false; } + @Override + public boolean isAnyTaskWithConstraint(PositionConstraintType type) { + return getPositionConstraint().getConstraintType().equals(type); + } + } diff --git a/libreplan-webapp/src/main/java/org/libreplan/web/orders/IOrderModel.java b/libreplan-webapp/src/main/java/org/libreplan/web/orders/IOrderModel.java index b79408223..0f549e859 100644 --- a/libreplan-webapp/src/main/java/org/libreplan/web/orders/IOrderModel.java +++ b/libreplan-webapp/src/main/java/org/libreplan/web/orders/IOrderModel.java @@ -3,7 +3,7 @@ * * Copyright (C) 2009-2010 Fundación para o Fomento da Calidade Industrial e * Desenvolvemento Tecnolóxico de Galicia - * Copyright (C) 2010-2011 Igalia, S.L. + * Copyright (C) 2010-2012 Igalia, S.L. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as published by @@ -30,6 +30,7 @@ import org.libreplan.business.labels.entities.Label; import org.libreplan.business.orders.entities.Order; import org.libreplan.business.orders.entities.OrderElement; import org.libreplan.business.orders.entities.OrderLineGroup; +import org.libreplan.business.planner.entities.PositionConstraintType; import org.libreplan.business.qualityforms.entities.QualityForm; import org.libreplan.business.resources.entities.Criterion; import org.libreplan.business.resources.entities.CriterionType; @@ -45,6 +46,7 @@ import org.zkoss.zk.ui.Desktop; * * @author Óscar González Fernández * @author Diego Pino García + * @author Manuel Rego Casasnovas */ public interface IOrderModel extends IIntegrationEntityModel { @@ -128,4 +130,6 @@ public interface IOrderModel extends IIntegrationEntityModel { PlanningState getPlanningState(); + boolean isAnyTaskWithConstraint(PositionConstraintType type); + } diff --git a/libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java b/libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java index bbd39fdb9..58c60e314 100644 --- a/libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java +++ b/libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java @@ -3,7 +3,7 @@ * * Copyright (C) 2009-2010 Fundación para o Fomento da Calidade Industrial e * Desenvolvemento Tecnolóxico de Galicia - * Copyright (C) 2010-2011 Igalia, S.L. + * Copyright (C) 2010-2012 Igalia, S.L. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as published by @@ -45,6 +45,7 @@ import org.libreplan.business.orders.entities.Order; import org.libreplan.business.orders.entities.Order.SchedulingMode; import org.libreplan.business.orders.entities.OrderElement; import org.libreplan.business.orders.entities.OrderStatusEnum; +import org.libreplan.business.planner.entities.PositionConstraintType; import org.libreplan.business.templates.entities.OrderTemplate; import org.libreplan.business.users.entities.UserRole; import org.libreplan.web.common.IMessagesForUser; @@ -108,6 +109,7 @@ import org.zkoss.zul.api.Window; * * @author Óscar González Fernández * @author Lorenzo Tilve Álvaro + * @author Manuel Rego Casasnovas */ @org.springframework.stereotype.Component @Scope(BeanDefinition.SCOPE_PROTOTYPE) @@ -387,11 +389,45 @@ public class OrderCRUDController extends GenericForwardComposer { return result; } - private void setConstraintsFor(SchedulingMode mode) { - initDate.setConstraint(mode == SchedulingMode.FORWARD ? "no empty" - : null); - deadline.setConstraint(mode == SchedulingMode.BACKWARDS ? "no empty" - : null); + private void setConstraintsFor(final SchedulingMode mode) { + initDate.setConstraint(new Constraint() { + + @Override + public void validate(Component comp, Object value) + throws WrongValueException { + if (value == null) { + if (mode == SchedulingMode.FORWARD) { + throw new WrongValueException( + comp, + _("Starting date cannot be empty in forward mode")); + } + if (orderModel + .isAnyTaskWithConstraint(PositionConstraintType.AS_SOON_AS_POSSIBLE)) { + throw new WrongValueException(comp, + _("Starting date cannot be empty because there is a task with constraint \"as soon as possible\"")); + } + } + } + }); + deadline.setConstraint(new Constraint() { + + @Override + public void validate(Component comp, Object value) + throws WrongValueException { + if (value == null) { + if (mode == SchedulingMode.BACKWARDS) { + throw new WrongValueException( + comp, + _("Starting date cannot be empty in backwards mode")); + } + if (orderModel + .isAnyTaskWithConstraint(PositionConstraintType.AS_LATE_AS_POSSIBLE)) { + throw new WrongValueException(comp, + _("Starting date cannot be empty because there is a task with constraint \"as late as possible\"")); + } + } + } + }); } private void changeFocusAccordingTo(SchedulingMode chosen) { diff --git a/libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderModel.java b/libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderModel.java index d379276e2..3edba79f3 100644 --- a/libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderModel.java +++ b/libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderModel.java @@ -3,7 +3,7 @@ * * Copyright (C) 2009-2010 Fundación para o Fomento da Calidade Industrial e * Desenvolvemento Tecnolóxico de Galicia - * Copyright (C) 2012 Igalia, S.L. + * Copyright (C) 2010-2012 Igalia, S.L. * * This program is free software: you can redistribute it and/or modify it under * the terms of the GNU Affero General Public License as published by the Free @@ -56,6 +56,7 @@ import org.libreplan.business.orders.entities.Order; import org.libreplan.business.orders.entities.OrderElement; import org.libreplan.business.orders.entities.OrderLineGroup; import org.libreplan.business.planner.entities.IMoneyCostCalculator; +import org.libreplan.business.planner.entities.PositionConstraintType; import org.libreplan.business.qualityforms.daos.IQualityFormDAO; import org.libreplan.business.qualityforms.entities.QualityForm; import org.libreplan.business.requirements.entities.DirectCriterionRequirement; @@ -850,4 +851,13 @@ public class OrderModel extends IntegrationEntityModel implements IOrderModel { return planningState; } + @Override + public boolean isAnyTaskWithConstraint(PositionConstraintType type) { + if ((planningState == null) || (planningState.getRootTask() == null)) { + return false; + } + + return planningState.getRootTask().isAnyTaskWithConstraint(type); + } + } From 353ef9a9803dd608c3f4fed03403141e8b9a8a59 Mon Sep 17 00:00:00 2001 From: Krzysztof Kamecki Date: Thu, 19 Apr 2012 08:58:36 +0200 Subject: [PATCH 025/108] i18n: Add Polish translation --- ganttzk/src/main/resources/i18n/pl.po | 253 + .../completedEstimatedHours_pl.properties | 16 + ...hoursWorkedPerWorkerInAMonth_pl.properties | 11 + .../hoursWorkedPerWorker_pl.properties | 18 + .../orderCostsPerResource_pl.properties | 17 + .../schedulingProgressPerOrder_pl.properties | 27 + .../timeLineRequiredMaterial_pl.properties | 17 + .../workingArrangementsPerOrder_pl.properties | 28 + .../workingProgressPerTask_pl.properties | 24 + .../src/main/resources/i18n/pl.po | 7224 +++++++++++++++++ 10 files changed, 7635 insertions(+) create mode 100644 ganttzk/src/main/resources/i18n/pl.po create mode 100644 libreplan-webapp/src/main/jasper/completedEstimatedHours_Bundle/completedEstimatedHours_pl.properties create mode 100644 libreplan-webapp/src/main/jasper/hoursWorkedPerWorkerInAMonth_Bundle/hoursWorkedPerWorkerInAMonth_pl.properties create mode 100644 libreplan-webapp/src/main/jasper/hoursWorkedPerWorker_Bundle/hoursWorkedPerWorker_pl.properties create mode 100644 libreplan-webapp/src/main/jasper/orderCostsPerResource_Bundle/orderCostsPerResource_pl.properties create mode 100644 libreplan-webapp/src/main/jasper/schedulingProgressPerOrder_Bundle/schedulingProgressPerOrder_pl.properties create mode 100644 libreplan-webapp/src/main/jasper/timeLineRequiredMaterial_Bundle/timeLineRequiredMaterial_pl.properties create mode 100644 libreplan-webapp/src/main/jasper/workingArrangementsPerOrder_Bundle/workingArrangementsPerOrder_pl.properties create mode 100644 libreplan-webapp/src/main/jasper/workingProgressPerTask_Bundle/workingProgressPerTask_pl.properties create mode 100644 libreplan-webapp/src/main/resources/i18n/pl.po diff --git a/ganttzk/src/main/resources/i18n/pl.po b/ganttzk/src/main/resources/i18n/pl.po new file mode 100644 index 000000000..5e726d76f --- /dev/null +++ b/ganttzk/src/main/resources/i18n/pl.po @@ -0,0 +1,253 @@ +# LibrePlan - GanttZK module. +# Copyright (C) 2009-2010 Fundación para o Fomento da Calidade Industrial e +# Desenvolvemento Tecnolóxico de Galicia +# Copyright (C) 2010-2012 Igalia, S.L. +# This file is distributed under the same license as the LibrePlan package. +# +# Translators: +# Krzysztof Kamecki , 2012. +msgid "" +msgstr "" +"Project-Id-Version: libreplan-1.2.3\n" +"Report-Msgid-Bugs-To: http://bugs.libreplan.org/\n" +"POT-Creation-Date: 2012-04-11 08:32+0200\n" +"PO-Revision-Date: 2012-04-11 06:39+0000\n" +"Last-Translator: Krzysztof Kamecki \n" +"Language-Team: Polski\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: pl\n" +"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2)\n" + +#: ganttzk/src/main/java/org/zkoss/ganttz/DependencyList.java:216 +#: ganttzk/src/main/java/org/zkoss/ganttz/DependencyList.java:235 +msgid "Erase" +msgstr "Usuń" + +#: ganttzk/src/main/java/org/zkoss/ganttz/TaskList.java:299 +msgid "Add Dependency" +msgstr "Dodaj Zależność" + +#: ganttzk/src/main/java/org/zkoss/ganttz/data/resourceload/TimeLineRole.java:58 +msgid "Worker" +msgstr "Pracownik" + +#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:682 +msgid "Show money cost bar" +msgstr "" + +#: ganttzk/src/main/resources/web/ganttz/zul/leftTasksTree.zul:29 +msgid "Start" +msgstr "Start" + +#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:661 +msgid "Show reported hours" +msgstr "Pokaż zgłaszane godziny" + +#: ganttzk/src/main/java/org/zkoss/ganttz/resourceload/ResourcesLoadPanel.java:90 +msgid "by criteria" +msgstr "po kryteriach" + +#: ganttzk/src/main/resources/web/ganttz/zul/plannerLayout.zul:85 +msgid "Show/Hide reported hours" +msgstr "Pokaż/Ukryj zgłaszane godziny" + +#: ganttzk/src/main/resources/web/ganttz/zul/resourcesLoadLayout.zul:35 +#: ganttzk/src/main/resources/web/ganttz/zul/plannerLayout.zul:49 +msgid "Zoom" +msgstr "Powiększ" + +#: ganttzk/src/main/java/org/zkoss/ganttz/TabsRegistry.java:121 +msgid "Limiting resources" +msgstr "Ograniczanie zasobów" + +#: ganttzk/src/main/java/org/zkoss/ganttz/DependencyList.java:67 +msgid "The specified dependency is not allowed" +msgstr "Określony zasób nie jest dozwolony" + +#: ganttzk/src/main/java/org/zkoss/ganttz/DependencyList.java:255 +msgid "Set End-End" +msgstr "Ustaw End-End" + +#: ganttzk/src/main/resources/web/ganttz/zul/plannerLayout.zul:78 +msgid "Show/Hide progress" +msgstr "Pokaż/Ukryj postęp" + +#: ganttzk/src/main/java/org/zkoss/ganttz/data/resourceload/TimeLineRole.java:58 +msgid "Task" +msgstr "Zadanie" + +#: ganttzk/src/main/java/org/zkoss/ganttz/resourceload/ResourcesLoadPanel.java:89 +msgid "by resources" +msgstr "po zasobach" + +#: ganttzk/src/main/java/org/zkoss/ganttz/resourceload/ResourceLoadComponent.java:199 +msgid "available effort: {0}, assigned effort: {1}" +msgstr "dostępny wysiłek: {0}, przydzielony wysiłek: {1}" + +#: ganttzk/src/main/java/org/zkoss/ganttz/data/resourceload/TimeLineRole.java:64 +msgid "Criterion" +msgstr "Kryterium" + +#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:688 +msgid "Hide money cost bar" +msgstr "" + +#: ganttzk/src/main/resources/web/ganttz/zul/plannerLayout.zul:44 +msgid "Print" +msgstr "Drukuj" + +#: ganttzk/src/main/java/org/zkoss/ganttz/timetracker/zoom/ZoomLevel.java:71 +msgid "Week" +msgstr "Tydzień" + +#: ganttzk/src/main/java/org/zkoss/ganttz/resourceload/ResourcesLoadPanel.java:501 +msgid "filtering by name" +msgstr "filtruj po nazwie" + +#: ganttzk/src/main/java/org/zkoss/ganttz/resourceload/ResourceLoadLeftPane.java:111 +msgid "See scheduling" +msgstr "Zobacz planowanie" + +#: ganttzk/src/main/resources/web/ganttz/zul/resourcesLoadLayout.zul:43 +msgid "Show" +msgstr "Pokaż" + +#: ganttzk/src/main/resources/web/ganttz/zul/leftTasksTree.zul:30 +msgid "End" +msgstr "Koniec" + +#: ganttzk/src/main/java/org/zkoss/ganttz/timetracker/TimeTracker.java:243 +msgid "changing zoom" +msgstr "zmiana przybliżenia" + +#: ganttzk/src/main/resources/web/ganttz/zul/plannerLayout.zul:91 +msgid "Show/Hide money cost bar" +msgstr "" + +#: ganttzk/src/main/java/org/zkoss/ganttz/timetracker/zoom/ZoomLevel.java:45 +msgid "Quarter" +msgstr "Kwartał" + +#: ganttzk/src/main/java/org/zkoss/ganttz/data/resourceload/TimeLineRole.java:58 +msgid "None" +msgstr "Żaden" + +#: ganttzk/src/main/resources/web/ganttz/zul/plannerLayout.zul:71 +msgid "Flatten/Unflatten tree" +msgstr "Płaskie/Rozwinięte drzewo" + +#: ganttzk/src/main/java/org/zkoss/ganttz/data/resourceload/TimeLineRole.java:58 +msgid "Project" +msgstr "Projekt" + +#: ganttzk/src/main/resources/web/ganttz/zul/resourcesLoadLayout.zul:67 +#: ganttzk/src/main/resources/web/ganttz/zul/leftTasksTree.zul:28 +msgid "Name" +msgstr "Nazwa" + +#: ganttzk/src/main/resources/web/ganttz/zul/resourcesLoadLayout.zul:50 +msgid "Name filter" +msgstr "Filtr nazwy" + +#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:641 +msgid "Show progress" +msgstr "Pokaż postęp" + +#: ganttzk/src/main/resources/web/ganttz/zul/plannerLayout.zul:67 +msgid "Expand/Collapse all" +msgstr "Rozwiń/Zwiń wszystkie" + +#: ganttzk/src/main/resources/web/ganttz/zul/plannerLayout.zul:58 +msgid "Show/Hide critical path" +msgstr "Pokaż/Ukryj ścieżkę krytyczną" + +#: ganttzk/src/main/java/org/zkoss/ganttz/resourceload/ResourcesLoadPanel.java:150 +msgid "showing criteria" +msgstr "pokaż kryteria" + +#: ganttzk/src/main/java/org/zkoss/ganttz/timetracker/zoom/ZoomLevel.java:32 +msgid "Year" +msgstr "Rok" + +#: ganttzk/src/main/java/org/zkoss/ganttz/timetracker/zoom/ZoomLevel.java:58 +msgid "Month" +msgstr "Miesiąc" + +#: ganttzk/src/main/resources/web/ganttz/zul/plannerLayout.zul:64 +msgid "Show/Hide resources" +msgstr "Pokaż/Ukryj zasoby" + +#: ganttzk/src/main/java/org/zkoss/ganttz/DependencyList.java:247 +msgid "Set End-Start" +msgstr "Ustaw End-Start" + +#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:308 +msgid "decreasing zoom" +msgstr "zmniejszenie powiększenia" + +#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:622 +msgid "Hide critical path" +msgstr "ukryj ścieżkę krytyczną" + +#: ganttzk/src/main/java/org/zkoss/ganttz/timetracker/zoom/ZoomLevel.java:84 +msgid "Day" +msgstr "Dzień" + +#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:668 +msgid "Hide reported hours" +msgstr "Ukryj zgłoszone godziny" + +#: ganttzk/src/main/java/org/zkoss/ganttz/resourceload/ResourceLoadComponent.java:193 +msgid "Load: {0}%" +msgstr "Ładowanie: {0}%" + +#: ganttzk/src/main/java/org/zkoss/ganttz/resourceload/ResourcesLoadPanel.java:147 +msgid "showing resources" +msgstr "pokazuję zasoby" + +#: ganttzk/src/main/resources/web/ganttz/zul/plannerLayout.zul:61 +msgid "Show/Hide labels" +msgstr "Pokaż/Ukryj etykiety" + +#: ganttzk/src/main/java/org/zkoss/ganttz/timetracker/zoom/ZoomLevel.java:97 +msgid "Hour" +msgstr "Godzina" + +#: ganttzk/src/main/resources/web/ganttz/zul/resourcesLoadLayout.zul:90 +#: ganttzk/src/main/resources/web/ganttz/zul/plannerLayout.zul:120 +msgid "Graphics" +msgstr "Grafika" + +#: ganttzk/src/main/java/org/zkoss/ganttz/DependencyList.java:251 +msgid "Set Start-Start" +msgstr "Ustaw Start-Start" + +#: ganttzk/src/main/java/org/zkoss/ganttz/resourceload/ResourceLoadComponent.java:152 +msgid "See resource allocation" +msgstr "Pokaż przydział zasobów" + +#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:291 +msgid "increasing zoom" +msgstr "powiększ powiększenie" + +#: ganttzk/src/main/java/org/zkoss/ganttz/resourceload/ResourcesLoadPanel.java:467 +msgid "Show all elements" +msgstr "Pokaż wszystkie elementy" + +#: ganttzk/src/main/java/org/zkoss/ganttz/resourceload/ResourcesLoadPanel.java:466 +msgid "All" +msgstr "Wszystko" + +#: ganttzk/src/main/resources/web/ganttz/zul/plannerLayout.zul:38 +msgid "Refresh" +msgstr "Odśwież" + +#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:617 +msgid "Show critical path" +msgstr "Pokaż ścieżkę krytyczną" + +#: ganttzk/src/main/java/org/zkoss/ganttz/Planner.java:646 +msgid "Hide progress" +msgstr "Ukryj postęp" diff --git a/libreplan-webapp/src/main/jasper/completedEstimatedHours_Bundle/completedEstimatedHours_pl.properties b/libreplan-webapp/src/main/jasper/completedEstimatedHours_Bundle/completedEstimatedHours_pl.properties new file mode 100644 index 000000000..0da7759e5 --- /dev/null +++ b/libreplan-webapp/src/main/jasper/completedEstimatedHours_Bundle/completedEstimatedHours_pl.properties @@ -0,0 +1,16 @@ +# Locale for completedEstimatedHours.jrxml +title = Raport godzin +subtitle = Zrealizowane szacowane godziny +order = Projekt \: +reference = Data referencyjna \: +criteria = Kryteria \: +labels = Etykiety \: +headers.column1 = Nazwa +headers.column2 = Wszystkie godziny +headers.column2.column1 = Szacowany +headers.column2.column2 = Planowany +headers.column3 = Godziny do tej pory +headers.column3.column1 = Planowany +headers.column3.column2 = Realny +page = strona +of = z diff --git a/libreplan-webapp/src/main/jasper/hoursWorkedPerWorkerInAMonth_Bundle/hoursWorkedPerWorkerInAMonth_pl.properties b/libreplan-webapp/src/main/jasper/hoursWorkedPerWorkerInAMonth_Bundle/hoursWorkedPerWorkerInAMonth_pl.properties new file mode 100644 index 000000000..c13d368af --- /dev/null +++ b/libreplan-webapp/src/main/jasper/hoursWorkedPerWorkerInAMonth_Bundle/hoursWorkedPerWorkerInAMonth_pl.properties @@ -0,0 +1,11 @@ +# Locale for hoursWorkedPerWorkerReportInAMonth.jrxml +title = Raport pracy +subtitle = Raport pracy wed\u0142ug zasobw w miesi\u0105cu +parameters.year = Rok\: +parameters.month = Miesi\u0105c\: +headers.column1 = Nazwa +headers.column2 = Godziny +total.hours = Wszystkie godziny\: +note1 = Brak raportw pracy dla zaznaczonych zasobw w tym zakresie wyszukiwania. +page = strona +of = z diff --git a/libreplan-webapp/src/main/jasper/hoursWorkedPerWorker_Bundle/hoursWorkedPerWorker_pl.properties b/libreplan-webapp/src/main/jasper/hoursWorkedPerWorker_Bundle/hoursWorkedPerWorker_pl.properties new file mode 100644 index 000000000..b110c3cbc --- /dev/null +++ b/libreplan-webapp/src/main/jasper/hoursWorkedPerWorker_Bundle/hoursWorkedPerWorker_pl.properties @@ -0,0 +1,18 @@ +# Locale for hoursWorkedPerWorkerReport.jrxml +title = Raport pracy +subtitle = Przepracowane godziny wed\u0142ug zasobw +date.start = Data rozpocz\u0119cia\: +date.end = Data zako\u0144czenia\: +criteria = Kryteria\: +labels = Etykiety\: +headers.column1 = Start +headers.column2 = Zako\u0144czenie +headers.column3 = Godziny +headers.column4 = Kod/nazwa zadania +headers.column5 = Pola tekstowe +headers.column6 = Etykiety +total.day = Wszystkie godziny wed\u0142ug dnia\: +total.worker = Wszystkie godziny wed\u0142ug pracownika\: +note1 = Nie ma raportw pracy dla zaznaczonych zasobw w zakresie wyszukiwania. +page = strona +of = z diff --git a/libreplan-webapp/src/main/jasper/orderCostsPerResource_Bundle/orderCostsPerResource_pl.properties b/libreplan-webapp/src/main/jasper/orderCostsPerResource_Bundle/orderCostsPerResource_pl.properties new file mode 100644 index 000000000..ebfe76e03 --- /dev/null +++ b/libreplan-webapp/src/main/jasper/orderCostsPerResource_Bundle/orderCostsPerResource_pl.properties @@ -0,0 +1,17 @@ +# Locale for ordersCostPerResourcesReport.jrxml +title = Raport projektu +subtitle = Koszty wed\u0142ug zasobu +date.start = Data rozpocz\u0119cia\: +date.end = Data zako\u0144czenia\: +criteria = Kryteria \: +labels = Etykiety \: +headers.column1 = Typ godzin +headers.column2 = Data +headers.column3 = Wynagrodzenie +headers.column4 = Godziny +headers.column5 = Koszty +total.task = Og\u0142em na dzie\u0144\: +total.worker = Og\u0142em na pracownika\: +total = Ca\u0142kowity projekt\: +page = strona +of = z diff --git a/libreplan-webapp/src/main/jasper/schedulingProgressPerOrder_Bundle/schedulingProgressPerOrder_pl.properties b/libreplan-webapp/src/main/jasper/schedulingProgressPerOrder_Bundle/schedulingProgressPerOrder_pl.properties new file mode 100644 index 000000000..316f52611 --- /dev/null +++ b/libreplan-webapp/src/main/jasper/schedulingProgressPerOrder_Bundle/schedulingProgressPerOrder_pl.properties @@ -0,0 +1,27 @@ +# Locale for schedulingProgressPerOrderReport.jrxml +title = Raport post\u0119pu +subtitle = Harmonogram post\u0119pu na projekt +tipo = Typ post\u0119pu\: +order = Projekty\: +date.start = Data rozpocz\u0119cia. +date.end = Data zako\u0144czenia\: +date.reference = Data referencyjna\: +headers.column1 = Wszystkie godziny +headers.column1.column1 = Szacowany +headers.column1.column2 = Planowany +headers.column2 = Post\u0119p +headers.column2.column1 = Mierzony +headers.column2.column2 = Kalkulacja +headers.column2.column3 = Planowany +headers.column3 = Godziny do tej pory +headers.column3.column1 = Planowany +headers.column3.column2 = Realny +headers.column4 = R\u017cnica +headers.column4.column1 = Koszt +headers.column4.column2 = Planowany +headers.column4.column3 = Wska\u017anik kosztw +headers.column4.column4 = Planowany wska\u017anik +note1 = Zaznaczony typ post\u0119pu nie jest dost\u0119pny dla tego projektu. +note2 = U\u017cywany rozpowszechniany typ procesu. +page = strona +of = z diff --git a/libreplan-webapp/src/main/jasper/timeLineRequiredMaterial_Bundle/timeLineRequiredMaterial_pl.properties b/libreplan-webapp/src/main/jasper/timeLineRequiredMaterial_Bundle/timeLineRequiredMaterial_pl.properties new file mode 100644 index 000000000..a5f584a47 --- /dev/null +++ b/libreplan-webapp/src/main/jasper/timeLineRequiredMaterial_Bundle/timeLineRequiredMaterial_pl.properties @@ -0,0 +1,17 @@ +# Locale for timeLineRequiredMaterial.jrxml +title = Materia\u0142y +subtitle = Linia czasowa materia\u0142w. +date.start = Data rozpocz\u0119cia\: +date.end = Data zako\u0144czenia\: +status = Status\: +headers.title = Dzie\u0144 +headers.column1 = Materia\u0142 +headers.column2 = Projekt - Zadanie +headers.column3 = Dost\u0119pno\u015b\u0107 +headers.column4 = Jednostki +headers.column5 = Cena jednostkowa +headers.column6 = Cena +headers.column7 = Status +headers.total = Ca\u0142kowita cena za dzie\u0144\: +page = strona +of = z diff --git a/libreplan-webapp/src/main/jasper/workingArrangementsPerOrder_Bundle/workingArrangementsPerOrder_pl.properties b/libreplan-webapp/src/main/jasper/workingArrangementsPerOrder_Bundle/workingArrangementsPerOrder_pl.properties new file mode 100644 index 000000000..9425a2605 --- /dev/null +++ b/libreplan-webapp/src/main/jasper/workingArrangementsPerOrder_Bundle/workingArrangementsPerOrder_pl.properties @@ -0,0 +1,28 @@ +# Locale for workingArrangementPerOrderReport.jrxml +title = Raport projektu +subtitle = Stan planowania zada\u0144. +order = Projekt\: +status = Status\: +name = Nazwa. +code = Kod\: +criteria = Kryteria \: +labels = Etykiety \: +headers1.column1 = Data rozpocz\u0119cia +headers1.column1.column1 = Szacowany +headers1.column1.column2 = Pierwszy raport +headers1.column2 = Data zako\u0144czenia +headers1.column2.column1 = Szacowany +headers1.column2.column2 = Ostatni raport +headers1.column2.column3 = Ostateczny termin +headers1.column3 = Post\u0119p +headers1.column4 = Status +headers1.column5 = Ostateczny termin +headers2.title = Zale\u017cno\u015bci. +headers2.column1 = Nazwa +headers2.column2 = Kod +headers2.column3 = Typ +headers2.column4 = Post\u0119p +overrun = przekroczenia +intime = W czasie. +page = strona +of = z diff --git a/libreplan-webapp/src/main/jasper/workingProgressPerTask_Bundle/workingProgressPerTask_pl.properties b/libreplan-webapp/src/main/jasper/workingProgressPerTask_Bundle/workingProgressPerTask_pl.properties new file mode 100644 index 000000000..74ebd6c52 --- /dev/null +++ b/libreplan-webapp/src/main/jasper/workingProgressPerTask_Bundle/workingProgressPerTask_pl.properties @@ -0,0 +1,24 @@ +# Locale for workingProgressPerTaskReport.jrxml +title = Raport post\u0119pu +subtitle = Post\u0119p pracy wed\u0142ug zadania +order = Projekt +reference = Data odniesienia\: +criteria = Kryteria \: +labels = Etykiety \: +headers.column1 = Wszystkie godziny +headers.column1.column1 = Szacowany +headers.column1.column2 = Planowany +headers.column2 = Post\u0119p +headers.column2.column1 = Mierzony +headers.column2.column2 = Kalkulacja +headers.column2.column3 = Planowany +headers.column3 = Godziny do tej pory +headers.column3.column1 = Planowany +headers.column3.column2 = Realny +headers.column4 = R\u017cnica +headers.column4.column1 = Koszt +headers.column4.column2 = Planowany +headers.column4.column3 = Wska\u017anik kosztw +headers.column4.column4 = Planowany wska\u017anik +page = strona +of = z diff --git a/libreplan-webapp/src/main/resources/i18n/pl.po b/libreplan-webapp/src/main/resources/i18n/pl.po new file mode 100644 index 000000000..540e81a31 --- /dev/null +++ b/libreplan-webapp/src/main/resources/i18n/pl.po @@ -0,0 +1,7224 @@ +# LibrePlan - Webapp module. +# Copyright (C) 2009-2010 Fundación para o Fomento da Calidade Industrial e +# Desenvolvemento Tecnolóxico de Galicia +# Copyright (C) 2010-2012 Igalia, S.L. +# This file is distributed under the same license as the LibrePlan package. +# +# Translators: +# Krzysztof Kamecki , 2012. +msgid "" +msgstr "" +"Project-Id-Version: libreplan-1.2.3\n" +"Report-Msgid-Bugs-To: http://bugs.libreplan.org/\n" +"POT-Creation-Date: 2012-04-11 08:32+0200\n" +"PO-Revision-Date: 2012-04-11 06:40+0000\n" +"Last-Translator: Krzysztof Kamecki \n" +"Language-Team: Polski\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: pl\n" +"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2)\n" + +#: libreplan-webapp/src/main/java/org/libreplan/web/workreports/WorkReportCRUDController.java:373 +msgid "The resource cannot be null" +msgstr "Zasób nie może być pusty" + +#: libreplan-webapp/src/main/webapp/common/configuration.zul:354 +msgid "Group path" +msgstr "Ścieżka grupy" + +#: libreplan-business/src/main/java/org/libreplan/business/resources/entities/CriterionType.java:420 +msgid "criterion codes must be unique inside a criterion type" +msgstr "kod kryterium musi być unikalny wewnątrz typu kryterium" + +#: libreplan-webapp/src/main/java/org/libreplan/web/users/OrderAuthorizationController.java:96 +msgid "No authorizations were added because you did not select any." +msgstr "Nie zostały dodane żadne autoryzacje, ponieważ żadne nie zostały wybrane." + +#: libreplan-webapp/src/main/webapp/resources/search/allocation_selector.zul:88 +#: libreplan-webapp/src/main/webapp/common/layout/_customMenu.zul:71 +#: libreplan-webapp/src/main/webapp/common/layout/login.zul:58 +msgid "en" +msgstr "en" + +#: libreplan-webapp/src/main/webapp/calendars/_edition.zul:204 +msgid "Origin" +msgstr "Oryginalny" + +#: libreplan-webapp/src/main/webapp/calendars/_edition.zul:180 +msgid "Create exception" +msgstr "Stwórz wyjątek" + +#: libreplan-webapp/src/main/webapp/reports/orderCostsPerResource.zul:41 +msgid "Select report data" +msgstr "Wybierz dane do raportu" + +#: libreplan-webapp/src/main/java/org/libreplan/ws/resources/impl/ResourceConverter.java:207 +msgid "there exist multiple resource calendars with name {0}" +msgstr "istnieje wiele kalendarzy o nazwie {0}" + +#: libreplan-webapp/src/main/webapp/resources/worker/_listVirtualWorkers.zul:60 +msgid "Create Virtual Worker" +msgstr "Tworzenie Wirtualnego Pracownika" + +#: libreplan-webapp/src/main/java/org/libreplan/web/workreports/WorkReportCRUDController.java:830 +#: libreplan-webapp/src/main/java/org/libreplan/web/tree/TreeComponent.java:105 +#: libreplan-webapp/src/main/webapp/labels/_editLabelType.zul:81 +#: libreplan-webapp/src/main/webapp/labels/_listLabelTypes.zul:28 +#: libreplan-webapp/src/main/webapp/advance/_listAdvanceTypes.zul:30 +#: libreplan-webapp/src/main/webapp/excetiondays/_listExceptionDayTypes.zul:36 +#: libreplan-webapp/src/main/webapp/externalcompanies/_listExternalCompanies.zul:32 +#: libreplan-webapp/src/main/webapp/materials/materials.zul:61 +#: libreplan-webapp/src/main/webapp/materials/materials.zul:86 +#: libreplan-webapp/src/main/webapp/materials/_listUnitTypes.zul:29 +#: libreplan-webapp/src/main/webapp/workreports/_editWorkReportType.zul:137 +#: libreplan-webapp/src/main/webapp/workreports/_editWorkReportType.zul:159 +#: libreplan-webapp/src/main/webapp/workreports/_listWorkReportTypes.zul:28 +#: libreplan-webapp/src/main/webapp/workreports/_sortFieldsAndLabels.zul:36 +#: libreplan-webapp/src/main/webapp/workreports/_sortFieldsAndLabels.zul:52 +#: libreplan-webapp/src/main/webapp/scenarios/transferOrders.zul:68 +#: libreplan-webapp/src/main/webapp/scenarios/_list.zul:28 +#: libreplan-webapp/src/main/webapp/costcategories/_editCostCategory.zul:83 +#: libreplan-webapp/src/main/webapp/qualityforms/_listQualityForm.zul:38 +#: libreplan-webapp/src/main/webapp/qualityforms/_editQualityForm.zul:87 +#: libreplan-webapp/src/main/webapp/reports/workingProgressPerTaskReport.zul:97 +#: libreplan-webapp/src/main/webapp/reports/workingProgressPerTaskReport.zul:138 +#: libreplan-webapp/src/main/webapp/reports/completedEstimatedHoursPerTask.zul:97 +#: libreplan-webapp/src/main/webapp/reports/completedEstimatedHoursPerTask.zul:138 +#: libreplan-webapp/src/main/webapp/reports/orderCostsPerResource.zul:93 +#: libreplan-webapp/src/main/webapp/reports/orderCostsPerResource.zul:135 +#: libreplan-webapp/src/main/webapp/reports/orderCostsPerResource.zul:176 +#: libreplan-webapp/src/main/webapp/reports/hoursWorkedPerWorkerReport.zul:87 +#: libreplan-webapp/src/main/webapp/reports/hoursWorkedPerWorkerReport.zul:125 +#: libreplan-webapp/src/main/webapp/reports/hoursWorkedPerWorkerReport.zul:167 +#: libreplan-webapp/src/main/webapp/reports/schedulingProgressPerOrderReport.zul:118 +#: libreplan-webapp/src/main/webapp/reports/workingArrangementsPerOrderReport.zul:105 +#: libreplan-webapp/src/main/webapp/reports/workingArrangementsPerOrderReport.zul:146 +#: libreplan-webapp/src/main/webapp/reports/timeLineMaterialReport.zul:97 +#: libreplan-webapp/src/main/webapp/templates/_historicalAssignment.zul:40 +#: libreplan-webapp/src/main/webapp/templates/_list.zul:34 +#: libreplan-webapp/src/main/webapp/templates/_assignedQualityForms.zul:50 +#: libreplan-webapp/src/main/webapp/templates/_advances.zul:39 +#: libreplan-webapp/src/main/webapp/subcontract/subcontractedTasks.zul:54 +#: libreplan-webapp/src/main/webapp/subcontract/reportAdvances.zul:51 +#: libreplan-webapp/src/main/webapp/calendars/_edition.zul:258 +#: libreplan-webapp/src/main/webapp/calendars/_list.zul:31 +#: libreplan-webapp/src/main/webapp/resources/worker/_listVirtualWorkers.zul:37 +#: libreplan-webapp/src/main/webapp/resources/worker/_workRelationships.zul:31 +#: libreplan-webapp/src/main/webapp/resources/worker/_list.zul:40 +#: libreplan-webapp/src/main/webapp/resources/_costCategoryAssignment.zul:39 +#: libreplan-webapp/src/main/webapp/resources/_criterions.zul:44 +#: libreplan-webapp/src/main/webapp/resources/machine/_machineConfigurationUnits.zul:37 +#: libreplan-webapp/src/main/webapp/resources/machine/_machineConfigurationUnits.zul:56 +#: libreplan-webapp/src/main/webapp/resources/machine/_machineConfigurationUnits.zul:109 +#: libreplan-webapp/src/main/webapp/resources/machine/_listMachines.zul:39 +#: libreplan-webapp/src/main/webapp/resources/criterions/_list.zul:29 +#: libreplan-webapp/src/main/webapp/resources/criterions/_workers.zul:26 +#: libreplan-webapp/src/main/webapp/resources/criterions/_criterionsTree.zul:44 +#: libreplan-webapp/src/main/webapp/orders/_listHoursGroupCriterionRequirement.zul:29 +#: libreplan-webapp/src/main/webapp/orders/_listOrderElementCriterionRequirements.zul:48 +#: libreplan-webapp/src/main/webapp/orders/_listOrderElementTaskQualityForms.zul:50 +#: libreplan-webapp/src/main/webapp/orders/_list.zul:36 +#: libreplan-webapp/src/main/webapp/orders/_listOrderElementAdvances.zul:50 +#: libreplan-webapp/src/main/webapp/orders/_listOrderElementAdvances.zul:70 +#: libreplan-webapp/src/main/webapp/orders/components/_listOrderElementLabels.zul:57 +#: libreplan-webapp/src/main/webapp/limitingresources/limitingResourcesLayout.zul:137 +#: libreplan-webapp/src/main/webapp/common/configuration.zul:242 +msgid "Operations" +msgstr "Operacje" + +#: libreplan-webapp/src/main/java/org/libreplan/ws/workreports/impl/WorkReportConverter.java:151 +#: libreplan-webapp/src/main/java/org/libreplan/ws/workreports/impl/WorkReportConverter.java:523 +#: libreplan-webapp/src/main/java/org/libreplan/ws/costcategories/impl/CostCategoryConverter.java:135 +#: libreplan-webapp/src/main/java/org/libreplan/ws/costcategories/impl/CostCategoryConverter.java:195 +msgid "There is no type of work hours with this code" +msgstr "Nie ma typu godzin pracujących o tym kodzie" + +#: libreplan-webapp/src/main/webapp/planner/taskpanels/_tabPanelLimitingResourceAllocation.zul:84 +#: libreplan-webapp/src/main/webapp/planner/taskpanels/_tabPanelNonLimitingResourceAllocation.zul:112 +msgid "Select" +msgstr "Wybierz" + +#: libreplan-webapp/src/main/java/org/libreplan/web/workreports/WorkReportCRUDController.java:215 +msgid "Work report removed successfully" +msgstr "Raport pracy usunięty pomyślnie" + +#: libreplan-webapp/src/main/java/org/libreplan/web/calendars/BaseCalendarEditionController.java:1517 +msgid "It can not be empty" +msgstr "Pole nie może być puste" + +#: libreplan-webapp/src/main/java/org/libreplan/web/common/CustomMenuController.java:324 +#: libreplan-webapp/src/main/webapp/materials/materials.zul:33 +#: libreplan-webapp/src/main/webapp/templates/templates.zul:67 +#: libreplan-webapp/src/main/webapp/templates/_editTemplateWindow.zul:52 +#: libreplan-webapp/src/main/webapp/templates/_materialAssignmentsBox.zul:22 +#: libreplan-webapp/src/main/webapp/orders/_editOrderElement.zul:54 +#: libreplan-webapp/src/main/webapp/orders/_edition.zul:53 +#: libreplan-webapp/src/main/webapp/orders/_edition.zul:147 +msgid "Materials" +msgstr "Materiały" + +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/reassign/ReassignCommand.java:357 +msgid "Reassign" +msgstr "Przypisz" + +#: libreplan-webapp/src/main/webapp/resources/machine/_editMachine.zul:64 +msgid "Description cannot be null or empty" +msgstr "Opis nie może być pusty" + +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/tabs/MonteCarloTabCreator.java:72 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/tabs/MonteCarloTabCreator.java:269 +msgid "MonteCarlo Method" +msgstr "Metoda MonteCarlo" + +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/tabs/PlanningTabCreator.java:229 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/tabs/PlanningTabCreator.java:247 +msgid "Project Scheduling" +msgstr "Planowanie Projektu" + +#: libreplan-webapp/src/main/java/org/libreplan/web/reports/HoursWorkedPerWorkerInAMonthController.java:43 +msgid "February" +msgstr "Luty" + +#: libreplan-webapp/src/main/webapp/workreports/_editWorkReportType.zul:29 +msgid "Managing fields and labels" +msgstr "Zarządzanie polami i etykietami" + +#: libreplan-webapp/src/main/java/org/libreplan/web/resources/machine/MachineCRUDController.java:269 +msgid "Please, select a calendar" +msgstr "Proszę wybrać kalendarz" + +#: libreplan-webapp/src/main/webapp/calendars/_edition.zul:256 +msgid "Summary" +msgstr "Podsumowanie" + +#: libreplan-webapp/src/main/webapp/advance/_listAdvanceTypes.zul:29 +#: libreplan-business/src/main/java/org/libreplan/business/advance/entities/AdvanceType.java:170 +msgid "Predefined" +msgstr "predefiniowane" + +#: libreplan-webapp/src/main/java/org/libreplan/web/qualityforms/QualityFormCRUDController.java:344 +#: libreplan-webapp/src/main/java/org/libreplan/web/common/CustomMenuController.java:325 +#: libreplan-webapp/src/main/webapp/templates/templates.zul:68 +#: libreplan-webapp/src/main/webapp/templates/_editTemplateWindow.zul:53 +msgid "Quality Forms" +msgstr "Formularze Jakości" + +#: libreplan-webapp/src/main/java/org/libreplan/web/common/CustomMenuController.java:339 +msgid "Reports" +msgstr "Raporty" + +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/assigntemplates/TemplateFinderPopup.java:117 +msgid "Create task" +msgstr "" + +#: libreplan-webapp/src/main/webapp/planner/advance_allocation.zul:22 +msgid "LibrePlan: Advanced allocation" +msgstr "LibrePlan: Zaawansowany przydział" + +#: libreplan-webapp/src/main/java/org/libreplan/web/common/ConfigurationModel.java:177 +msgid "The {0} sequence prefixes can not be repeated" +msgstr "Prefiksy w sekwencji {0} nie mogą się powtarzać" + +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/allocation/FormBinder.java:340 +msgid "" +"The original workable days value {0}, is prevented because consolidated " +"values cannot be modified" +msgstr "Zmiana wartości oryginalnych dni roboczych {0} została zablokowana, ponieważ skonsolidowane wartości nie mogą być modyfikowane" + +#: libreplan-webapp/src/main/webapp/resources/machine/_machineConfigurationUnits.zul:82 +msgid "Criterion requirements" +msgstr "Wymagania kryterium" + +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/allocation/streches/StretchesFunctionModel.java:285 +msgid "Stretch date must not be less than task start date: " +msgstr "Przeciągnięta data nie może być wcześniejsza niż początkowa data zadania:" + +#: libreplan-webapp/src/main/webapp/planner/stretches_function.zul:68 +msgid "Dedication chart" +msgstr "Wykres zaangażowania" + +#: libreplan-webapp/src/main/java/org/libreplan/ws/common/impl/OrderElementConverter.java:748 +msgid "Not the same hours group, impossible to update" +msgstr "Grupy godzin nie pokrywają się, nie mogę nadpisać" + +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/ManageOrderElementAdvancesController.java:694 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/ManageOrderElementAdvancesController.java:721 +msgid "Progress that are reported by quality forms can not be modified" +msgstr "Postęp zgłoszony przez formularze jakości nie mogą być modyfikowane" + +#: libreplan-webapp/src/main/webapp/excetiondays/_editExceptionDayType.zul:66 +msgid "Own exception" +msgstr "Własny wyjątek" + +#: libreplan-webapp/src/main/java/org/libreplan/web/materials/MaterialsController.java:522 +msgid "Cannot delete that material because it is assigned to a project." +msgstr "Nie mogę usunąć materiału ponieważ jest przydzielony do projektu." + +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/tabs/ResourcesLoadTabCreator.java:136 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/tabs/ResourcesLoadTabCreator.java:150 +#: libreplan-webapp/src/main/java/org/libreplan/web/common/CustomMenuController.java:282 +msgid "Resource Usage" +msgstr "Wykorzystanie zasobów" + +#: libreplan-webapp/src/main/java/org/libreplan/web/limitingresources/LimitingResourcesController.java:479 +msgid "Remove limiting resource element" +msgstr "Usuń ograniczenie elementu zasobów" + +#: libreplan-webapp/src/main/webapp/resources/search/_resourceFilter.zul:40 +msgid "Active period from" +msgstr "Okres aktywny od" + +#: libreplan-webapp/src/main/java/org/libreplan/web/limitingresources/QueueComponent.java:485 +msgid "Unassign" +msgstr "Cofnij przypisanie" + +#: libreplan-webapp/src/main/java/org/libreplan/web/limitingresources/ManualAllocationController.java:505 +msgid "Manual assignment" +msgstr "Ręczne przypisanie" + +#: libreplan-webapp/src/main/java/org/libreplan/web/externalcompanies/ExternalCompanyCRUDController.java:157 +#: libreplan-webapp/src/main/java/org/libreplan/web/common/CustomMenuController.java:302 +msgid "Companies" +msgstr "Firmy" + +#: libreplan-webapp/src/main/webapp/qualityforms/_editQualityForm.zul:74 +msgid "Quality form items list" +msgstr "Lista pozycji formularza jakości" + +#: libreplan-webapp/src/main/java/org/libreplan/web/resources/worker/CriterionsMachineController.java:218 +#: libreplan-webapp/src/main/java/org/libreplan/web/resources/worker/CriterionsController.java:240 +msgid "" +"End date is not valid, the new end date must be later the current end date" +msgstr "Data zakończenia jest błędna, nowa data zakończenia nie może być wcześniejsza niż data aktualna" + +#: libreplan-webapp/src/main/java/org/libreplan/web/calendars/BaseCalendarCRUDController.java:520 +#: libreplan-webapp/src/main/java/org/libreplan/web/resources/worker/WorkerCRUDController.java:885 +#: libreplan-webapp/src/main/java/org/libreplan/web/common/BaseCRUDController.java:128 +msgid "Create {0}: {1}" +msgstr "Tworzenie {0}:{1}" + +#: libreplan-webapp/src/main/java/org/libreplan/web/common/components/NewAllocationSelector.java:51 +msgid "generic workers allocation" +msgstr "Ogólne przydzielenie pracowników" + +#: libreplan-webapp/src/main/java/org/libreplan/web/resourceload/ResourceLoadController.java:310 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:899 +msgid "The project has no scheduled elements" +msgstr "Projekt nie ma zaplanowanych elementów" + +#: libreplan-webapp/src/main/java/org/libreplan/web/workreports/WorkReportCRUDController.java:806 +msgid "Hour start" +msgstr "Godzina rozpoczęcia" + +#: libreplan-webapp/src/main/webapp/planner/main.zul:53 +#: libreplan-webapp/src/main/webapp/planner/taskpanels/_tabPanelTaskProperties.zul:36 +#: libreplan-webapp/src/main/webapp/limitingresources/manualAllocation.zul:120 +msgid "Start" +msgstr "Start" + +#: libreplan-webapp/src/main/webapp/subcontract/reportAdvances.zul:34 +msgid "Progress Report" +msgstr "Raport postępu" + +#: libreplan-business/src/main/java/org/libreplan/business/costcategories/entities/ResourcesCostCategoryAssignment.java:119 +msgid "cost assignment's category not specified" +msgstr "nie podano kosztów przypisanych kategoriom" + +#: libreplan-webapp/src/main/webapp/common/configuration.zul:96 +msgid "Check for updates" +msgstr "Sprawdź dostępność aktualizacji" + +#: libreplan-webapp/src/main/java/org/libreplan/web/templates/TemplatesTreeComponent.java:72 +msgid "Delete Template element" +msgstr "Usuń element Szablonu" + +#: libreplan-webapp/src/main/webapp/calendars/calendars.zul:22 +msgid "LibrePlan: Calendars" +msgstr "LibrePlan: Kalendarze" + +#: libreplan-webapp/src/main/java/org/libreplan/web/users/services/LDAPUserDetailsService.java:65 +#: libreplan-webapp/src/main/java/org/libreplan/web/users/services/DBUserDetailsService.java:66 +msgid "User with login name '{0}': not found" +msgstr "Użytkownik o loginie '{0}': nie został znaleziony" + +#: libreplan-webapp/src/main/webapp/planner/_legendLoadChartOrder.zul:37 +msgid "Resources capability" +msgstr "Funkcje zasobów" + +#: libreplan-webapp/src/main/java/org/libreplan/web/common/CustomMenuController.java:312 +#: libreplan-webapp/src/main/webapp/scenarios/transferOrders.zul:31 +msgid "Transfer Projects Between Scenarios" +msgstr "Przenieś Projekty Między Scenariuszami" + +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/tabs/MultipleTabsPlannerController.java:108 +msgid "changing perspective" +msgstr "zmiana perspektywy" + +#: libreplan-webapp/src/main/java/org/libreplan/web/users/OrderAuthorizationController.java:124 +msgid "" +"Could not add those authorizations to profile {0} because they were already " +"present." +msgstr "Nie mogę dodać autoryzacji do profilu {0} ponieważ już są one obecne." + +#: libreplan-webapp/src/main/webapp/common/configuration.zul:63 +msgid "Default calendar" +msgstr "Podstawowy kalendarz" + +#: libreplan-webapp/src/main/webapp/reports/workingProgressPerTaskReport.zul:178 +#: libreplan-webapp/src/main/webapp/reports/completedEstimatedHoursPerTask.zul:179 +#: libreplan-webapp/src/main/webapp/reports/orderCostsPerResource.zul:218 +#: libreplan-webapp/src/main/webapp/reports/hoursWorkedPerWorkerReport.zul:207 +#: libreplan-webapp/src/main/webapp/reports/hoursWorkedPerWorkerInAMonthReport.zul:86 +#: libreplan-webapp/src/main/webapp/reports/schedulingProgressPerOrderReport.zul:159 +#: libreplan-webapp/src/main/webapp/reports/workingArrangementsPerOrderReport.zul:186 +#: libreplan-webapp/src/main/webapp/reports/timeLineMaterialReport.zul:156 +msgid "Click on this" +msgstr "Kliknij na to" + +#: libreplan-webapp/src/main/webapp/workreports/workReportQuery.zul:74 +#: libreplan-webapp/src/main/webapp/templates/_historicalAssignment.zul:36 +msgid "Project Name" +msgstr "Nazwa Projektu" + +#: libreplan-webapp/src/main/java/org/libreplan/web/tree/TreeController.java:1084 +#: libreplan-webapp/src/main/java/org/libreplan/web/resources/criterion/CriterionTreeController.java:306 +msgid "Indent" +msgstr "Wcięcie" + +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/reassign/ReassignCommand.java:252 +msgid "Reassignation" +msgstr "Zmiana przydziału" + +#: libreplan-webapp/src/main/webapp/common/configuration.zul:327 +msgid "Save passwords in database" +msgstr "Zapisz hasła w bazie danych" + +#: libreplan-webapp/src/main/java/org/libreplan/web/templates/TemplatesTree.java:42 +msgid "New template" +msgstr "Nowy szablon" + +#: libreplan-webapp/src/main/webapp/planner/taskpanels/_taskInformation.zul:38 +msgid "Total estimated hours" +msgstr "Wszystkie szacowane godziny" + +#: libreplan-webapp/src/main/webapp/common/error.zul:21 +#: libreplan-webapp/src/main/webapp/common/event_error.zul:22 +msgid "LibrePlan: Runtime Error" +msgstr "LibrePlan: Runtime Error" + +#: libreplan-webapp/src/main/java/org/libreplan/web/calendars/BaseCalendarCRUDController.java:137 +#: libreplan-webapp/src/main/java/org/libreplan/web/calendars/BaseCalendarCRUDController.java:153 +msgid "Base calendar \"{0}\" saved" +msgstr "Podstawowy kalendarz \"{0}\" został zapisany" + +#: libreplan-webapp/src/main/webapp/calendars/_edition.zul:189 +msgid "Exceptions list" +msgstr "Lista wyjątków" + +#: libreplan-webapp/src/main/webapp/resources/worker/_edition.zul:33 +msgid "Locations" +msgstr "Lokalizacje" + +#: libreplan-webapp/src/main/webapp/qualityforms/_editQualityForm.zul:77 +msgid "New quality form item" +msgstr "Nowy element formularza jakości" + +#: libreplan-webapp/src/main/webapp/labels/labelTypes.zul:21 +msgid "LibrePlan: Labels" +msgstr "LibrePlan: Etykiety" + +#: libreplan-webapp/src/main/java/org/libreplan/web/common/ConfigurationController.java:261 +msgid "LDAP connection was successful" +msgstr "Połączenie LDAP pomyślne" + +#: libreplan-webapp/src/main/webapp/users/_editUser.zul:46 +msgid "Login name" +msgstr "Login" + +#: libreplan-webapp/src/main/java/org/libreplan/web/common/BaseCRUDController.java:84 +msgid "{0} List" +msgstr "{0} Lista" + +#: libreplan-webapp/src/main/webapp/resources/_criterions.zul:43 +msgid "Current" +msgstr "Aktualny" + +#: libreplan-webapp/src/main/webapp/reports/workingArrangementsPerOrderReport.zul:63 +msgid "Dependencies" +msgstr "Zależności" + +#: libreplan-webapp/src/main/java/org/libreplan/ws/calendars/impl/CalendarConverter.java:187 +msgid "missing code in a calendar exception" +msgstr "wyjątek brakującego kodu w kalendarzu" + +#: libreplan-webapp/src/main/webapp/resources/search/allocation_selector.zul:78 +msgid "Current selection" +msgstr "Aktualny wybór" + +#: libreplan-business/src/main/java/org/libreplan/business/resources/entities/Resource.java:1130 +msgid "" +"there exist criterion satisfactions referring to criterion types not " +"applicable to this resource" +msgstr "istnieje kryterium satysfakcji odnoszący się do typu kryteriów nie możliwy do zastosowania do zasobu" + +#: libreplan-webapp/src/main/webapp/templates/templates.zul:66 +#: libreplan-webapp/src/main/webapp/orders/_editOrderElement.zul:52 +#: libreplan-webapp/src/main/webapp/orders/_edition.zul:50 +msgid "Criterion Requirement" +msgstr "Wymóg Kryterium" + +#: libreplan-webapp/src/main/webapp/planner/print_configuration.zul:31 +msgid "Show labels" +msgstr "Pokaż etykiety" + +#: libreplan-webapp/src/main/java/org/libreplan/web/common/components/EffortDurationPicker.java:63 +msgid "Minutes" +msgstr "Minuty" + +#: libreplan-webapp/src/main/java/org/libreplan/web/scenarios/ScenarioModel.java:132 +msgid "You can not remove a scenario with derived scenarios" +msgstr "Nie można usunąć scenariusza z pochodnymi scenariuszami" + +#: libreplan-webapp/src/main/webapp/orders/components/_listOrderElementMaterials.zul:91 +msgid "Available materials" +msgstr "Dostępne materiały" + +#: libreplan-webapp/src/main/java/org/libreplan/web/workreports/WorkReportTypeCRUDController.java:950 +msgid "Work Report Types" +msgstr "Typy Raportów Pracy" + +#: libreplan-webapp/src/main/webapp/templates/_historicalStatistics.zul:55 +msgid "Maximum/minimum of estimated hours" +msgstr "Maksimum/minimum szacowanych godzin" + +#: libreplan-webapp/src/main/webapp/qualityforms/qualityForms.zul:22 +msgid "LibrePlan: Quality Forms" +msgstr "LibrePlan: Formularze Jakości" + +#: libreplan-webapp/src/main/java/org/libreplan/web/common/components/ResourceAllocationBehaviour.java:63 +msgid "LIMITING" +msgstr "OGRANICZENIA" + +#: libreplan-business/src/main/java/org/libreplan/business/resources/entities/Criterion.java:415 +msgid "a disabled resource has enabled subresources" +msgstr "wyłączony zasób ma włączone podzasoby" + +#: libreplan-webapp/src/main/webapp/externalcompanies/_listExternalCompanies.zul:29 +#: libreplan-webapp/src/main/webapp/externalcompanies/_editExternalCompany.zul:53 +msgid "Client" +msgstr "Klient" + +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/limiting/allocation/LimitingResourceAllocationModel.java:153 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/allocation/FormBinder.java:662 +msgid "" +"there are no resources for required criteria: {0}. So the generic allocation" +" can't be added" +msgstr "nie ma zasobów na wymagane kryteria: {0}. Więc ogólny przydział nie może zostać dodany" + +#: libreplan-webapp/src/main/webapp/common/configuration.zul:347 +msgid "Role search strategy" +msgstr "Strategia poszukiwania roli" + +#: libreplan-webapp/src/main/java/org/libreplan/web/calendars/BaseCalendarCRUDController.java:480 +msgid "Error on showing warning message removing calendar: " +msgstr "Błąd przy pokazywaniu ostrzeżenia o usunięciu kalendarza:" + +#: libreplan-webapp/src/main/java/org/libreplan/ws/workreports/impl/WorkReportConverter.java:415 +msgid "work report has not any description value with this field name" +msgstr "raport pracy nie ma żadnej wartości opisowej dla pola o nazwie" + +#: libreplan-business/src/main/java/org/libreplan/business/materials/entities/MaterialCategory.java:153 +msgid "material category name has to be unique. It is already used" +msgstr "nazwa kategorii materiałów musi być unikalna. Ta jest już w użyciu" + +#: libreplan-webapp/src/main/webapp/orders/_editOrderElement.zul:46 +#: libreplan-webapp/src/main/webapp/orders/_edition.zul:44 +#: libreplan-webapp/src/main/webapp/orders/_listOrderElementHours.zul:109 +msgid "Imputed hours" +msgstr "Wstawione godziny" + +#: libreplan-webapp/src/main/java/org/libreplan/web/common/CustomMenuController.java:346 +#: libreplan-webapp/src/main/webapp/reports/orderCostsPerResource.zul:37 +msgid "Project Costs Per Resource" +msgstr "Koszty Projektu na Zasób" + +#: libreplan-webapp/src/main/java/org/libreplan/web/costcategories/CostCategoryCRUDController.java:457 +#: libreplan-webapp/src/main/java/org/libreplan/web/costcategories/ResourcesCostCategoryAssignmentController.java:143 +msgid "Confirm deleting this hour cost. Are you sure?" +msgstr "Potwierdź usunięcie tego kosztu godzinowego. Czy jesteś pewien?" + +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/milestone/DeleteMilestoneCommand.java:59 +msgid "Delete Milestone" +msgstr "Usuń Kamień Milowy" + +#: libreplan-webapp/src/main/webapp/common/layout/template.zul:155 +msgid "default password were not changed" +msgstr "standardowe hasło nie zostało zmienione" + +#: libreplan-webapp/src/main/java/org/libreplan/web/costcategories/TypeOfWorkHoursCRUDController.java:112 +msgid "Type of hours" +msgstr "Typ godzin" + +#: libreplan-webapp/src/main/webapp/resources/worker/_localizations.zul:48 +msgid "Non-assigned locations" +msgstr "Nie przydzielone lokalizacje" + +#: libreplan-webapp/src/main/webapp/externalcompanies/_editExternalCompany.zul:77 +msgid "Application URI" +msgstr "URI Aplikacji" + +#: libreplan-webapp/src/main/java/org/libreplan/web/resources/machine/AssignedMachineCriterionsModel.java:418 +msgid "" +"The {0} is not valid, criterionType overlaps with other " +"criterionSatisfaction from the same criterionType" +msgstr "{0} nie jest poprawny. Typ kryterium nakłada się z innym kryterium satysfakcji z kryterium o tym samym typie" + +#: libreplan-webapp/src/main/webapp/common/configuration.zul:349 +msgid "Group strategy" +msgstr "Strategia grupy" + +#: libreplan-webapp/src/main/java/org/libreplan/web/common/CustomMenuController.java:340 +msgid "Work Report Lines" +msgstr "Linie Raportu Pracy" + +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/allocation/AdvancedAllocationController.java:1555 +msgid "Configure" +msgstr "Skonfigurować" + +#: libreplan-webapp/src/main/java/org/libreplan/web/reports/HoursWorkedPerWorkerInAMonthController.java:45 +msgid "October" +msgstr "Październik" + +#: libreplan-webapp/src/main/webapp/settings/settings.zul:58 +#: libreplan-webapp/src/main/webapp/users/_editUser.zul:54 +#: libreplan-webapp/src/main/webapp/resources/worker/_edition.zul:58 +#: libreplan-webapp/src/main/webapp/resources/worker/_list.zul:36 +msgid "First name" +msgstr "Imię" + +#: libreplan-webapp/src/main/java/org/libreplan/web/print/CutyPrint.java:250 +msgid "Could not execute print command" +msgstr "Nie można wydać polecenie drukowania" + +#: libreplan-webapp/src/main/webapp/workreports/_editWorkReportType.zul:122 +msgid "Complementary text fields" +msgstr "Uzupełniające się pola tekstowe" + +#: libreplan-webapp/src/main/java/org/libreplan/web/materials/MaterialsController.java:291 +#: libreplan-webapp/src/main/java/org/libreplan/web/workreports/WorkReportCRUDController.java:210 +#: libreplan-webapp/src/main/java/org/libreplan/web/workreports/WorkReportCRUDController.java:1226 +#: libreplan-webapp/src/main/java/org/libreplan/web/calendars/BaseCalendarCRUDController.java:452 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/AssignedTaskQualityFormsToOrderElementController.java:200 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:836 +msgid "Confirm deleting {0}. Are you sure?" +msgstr "Potwierdź usunięcie {0}. Jesteś pewien?" + +#: libreplan-webapp/src/main/webapp/workreports/workReport.zul:37 +msgid "Work Reports List" +msgstr "Lista Raportu Pracy" + +#: libreplan-webapp/src/main/java/org/libreplan/web/common/CustomMenuController.java:321 +msgid "Accounts" +msgstr "Konta" + +#: libreplan-webapp/src/main/webapp/orders/components/_orderElementTree.zul:50 +msgid "Edit selected task" +msgstr "Edycja wybranego zadania" + +#: libreplan-webapp/src/main/webapp/orders/_edition.zul:87 +msgid "External code" +msgstr "Zewnętrzny kod" + +#: libreplan-webapp/src/main/webapp/templates/_historicalAssignment.zul:49 +msgid "View" +msgstr "Podgląd" + +#: libreplan-webapp/src/main/webapp/reports/hoursWorkedPerWorkerReport.zul:84 +#: libreplan-webapp/src/main/webapp/resources/worker/_list.zul:39 +#: libreplan-webapp/src/main/webapp/resources/machine/_listMachines.zul:38 +msgid "Limiting" +msgstr "Ograniczenia" + +#: libreplan-webapp/src/main/webapp/orders/components/_listOrderElementMaterials.zul:60 +msgid "Required materials" +msgstr "Wymagane materiały" + +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:346 +msgid "Backwards" +msgstr "Wstecz" + +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/allocation/FormBinder.java:677 +msgid "resources per day must be not empty and bigger than zero" +msgstr "zasoby dzienne nie mogą być puste i większe od zera" + +#: libreplan-webapp/src/main/webapp/resources/search/_resourceFilter.zul:52 +msgid "Apply filtering to resources satisfying required criteria" +msgstr "Zastosować filtrowanie zasobów spełniających wymagane kryteria" + +#: libreplan-webapp/src/main/webapp/scenarios/transferOrders.zul:67 +#: libreplan-webapp/src/main/webapp/scenarios/transferOrders.zul:77 +msgid "Version" +msgstr "Wersja" + +#: libreplan-webapp/src/main/webapp/qualityforms/_editQualityForm.zul:105 +msgid "Up" +msgstr "W górę" + +#: libreplan-webapp/src/main/java/org/libreplan/web/resources/worker/CriterionsController.java:184 +msgid "" +"CriterionType is not valid, it overlaps other criterionSatisfaction with the" +" same criterionType" +msgstr "CriterionType nie jest prawidłowy, nakłada się inne criterionSatisfaction o tym samym criterionType" + +#: libreplan-webapp/src/main/webapp/common/configuration.zul:138 +msgid "Types of work hours" +msgstr "Typy godzin pracy" + +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/chart/EarnedValueChartFiller.java:127 +msgid "EAC" +msgstr "EAC" + +#: libreplan-webapp/src/main/java/org/libreplan/web/templates/historicalAssignment/OrderElementHistoricalAssignmentComponent.java:144 +msgid "" +"Its planning is not in the current scene.\n" +"Should change to any of the following scenarios:\n" +msgstr "Jego planowanie nie jest w obecnej scenie.\nPowinien zmienić się na jedną z następujących scenariuszy:\n" + +#: libreplan-webapp/src/main/webapp/scenarios/_edition.zul:39 +msgid "Predecessor" +msgstr "Poprzednik" + +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/allocation/streches/StretchesFunctionModel.java:172 +msgid "Some stretch has higher or equal values than the previous stretch" +msgstr "Niektóry odcinek ma wyższe lub równe wartości niż w poprzednim odcinku" + +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/TreeElementOperationsController.java:55 +msgid "Please select a task" +msgstr "Proszę wybrać zadanie" + +#: libreplan-webapp/src/main/java/org/libreplan/ws/workreports/impl/WorkReportConverter.java:245 +msgid "missing worker code in the work report" +msgstr "brakuje kodu pracownika w raporcie pracy" + +#: libreplan-webapp/src/main/java/org/libreplan/web/advance/AdvanceTypeCRUDController.java:101 +msgid "" +"Value is not valid, the default max value must be greater than the precision" +" value " +msgstr "Wartość nie jest prawidłowa, domyślna wartość maksymalna musi być większa niż wartość dokładności " + +#: libreplan-webapp/src/main/webapp/costcategories/_editCostCategory.zul:82 +#: libreplan-webapp/src/main/webapp/planner/montecarlo_function.zul:45 +#: libreplan-webapp/src/main/webapp/planner/montecarlo_function.zul:61 +#: libreplan-webapp/src/main/webapp/planner/taskpanels/_tabPanelSubcontract.zul:60 +#: libreplan-webapp/src/main/webapp/reports/hoursWorkedPerWorkerReport.zul:55 +#: libreplan-webapp/src/main/webapp/reports/timeLineMaterialReport.zul:58 +#: libreplan-webapp/src/main/webapp/resources/_costCategoryAssignment.zul:38 +#: libreplan-webapp/src/main/webapp/resources/machine/_machineConfigurationUnits.zul:55 +msgid "End date" +msgstr "Data zakończenia" + +#: libreplan-business/src/main/java/org/libreplan/business/users/entities/Profile.java:89 +msgid "profile name is already being used by another profile" +msgstr "Nazwa profilu jest aktualnie używana przez inny profil" + +#: libreplan-webapp/src/main/webapp/settings/settings.zul:68 +#: libreplan-webapp/src/main/webapp/users/_editUser.zul:81 +msgid "E-mail" +msgstr "E-mail" + +#: libreplan-webapp/src/main/java/org/libreplan/web/reports/TimeLineRequiredMaterialController.java:112 +#: libreplan-webapp/src/main/java/org/libreplan/web/reports/OrderCostsPerResourceController.java:112 +#: libreplan-webapp/src/main/java/org/libreplan/web/reports/SchedulingProgressPerOrderController.java:106 +msgid "This project has already been added." +msgstr "Ten projekt został już dodany." + +#: libreplan-webapp/src/main/java/org/libreplan/web/workreports/WorkReportCRUDController.java:386 +msgid "The task code cannot be null" +msgstr "Kod zadania nie może być pusty" + +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderElementTreeController.java:596 +#: libreplan-webapp/src/main/java/org/libreplan/web/common/CustomMenuController.java:329 +#: libreplan-webapp/src/main/webapp/planner/taskpanels/_taskInformation.zul:32 +#: libreplan-webapp/src/main/webapp/resources/search/allocation_selector.zul:39 +#: libreplan-webapp/src/main/webapp/limitingresources/manualAllocation.zul:36 +msgid "Criteria" +msgstr "Kryteria" + +#: libreplan-webapp/src/main/webapp/users/_editUser.zul:27 +msgid "User data" +msgstr "Dane użytkownika" + +#: libreplan-webapp/src/main/webapp/limitingresources/limitingResourcesLayout.zul:134 +msgid "Resource / Criteria" +msgstr "Zasoby / Kryteria" + +#: libreplan-webapp/src/main/webapp/workreports/_sortFieldsAndLabels.zul:44 +msgid "Lines" +msgstr "Linie" + +#: libreplan-webapp/src/main/webapp/orders/_listOrderElementAdvances.zul:29 +msgid "Add new progress assignment" +msgstr "Dodaj nowy postęp zadania" + +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/ManageOrderElementAdvancesController.java:1284 +msgid "" +"Value must be a multiple of the precision value of the progress type: {0}" +msgstr "Wartość musi być wielokrotna precyzji wartości postępu typu: {0}" + +#: libreplan-webapp/src/main/webapp/orders/_orderElementTreeFilter.zul:32 +msgid "Set Filter Options" +msgstr "Wybierz opcje filtrowania" + +#: libreplan-webapp/src/main/java/org/libreplan/web/workreports/WorkReportTypeCRUDController.java:979 +msgid "Error on showing warning message removing workReportType: " +msgstr "Błąd przy wyświetlaniu komunikatu ostrzegawczego przy usuwaniu workReportType: " + +#: libreplan-webapp/src/main/java/org/libreplan/web/workreports/WorkReportCRUDController.java:633 +msgid "Edit Work Report" +msgstr "Edytuj Raport Pracy" + +#: libreplan-webapp/src/main/webapp/qualityforms/_listQualityForm.zul:22 +msgid "Quality Forms List" +msgstr "Lista Form Jakości" + +#: libreplan-webapp/src/main/java/org/libreplan/web/scenarios/TransferOrdersModel.java:170 +msgid "Project version is the same in source and destination scenarios" +msgstr "Wersja projektu jest ta sama w źródłowych i docelowych sytuacjach" + +#: libreplan-webapp/src/main/webapp/resources/worker/_edition.zul:31 +msgid "Personal data" +msgstr "Dane osobowe" + +#: libreplan-webapp/src/main/java/org/libreplan/web/reports/CompletedEstimatedHoursPerTaskController.java:164 +#: libreplan-webapp/src/main/java/org/libreplan/web/reports/HoursWorkedPerWorkerController.java:331 +#: libreplan-webapp/src/main/java/org/libreplan/web/reports/OrderCostsPerResourceController.java:202 +#: libreplan-webapp/src/main/java/org/libreplan/web/reports/WorkingArrangementsPerOrderController.java:202 +#: libreplan-webapp/src/main/java/org/libreplan/web/reports/WorkingProgressPerTaskController.java:159 +msgid "please, select a Criterion" +msgstr "proszę, wybrać Kryterium" + +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/ManageOrderElementAdvancesController.java:725 +msgid "Calculated progress can not be removed" +msgstr "Obliczony postęp nie może być usunięty" + +#: libreplan-webapp/src/main/webapp/reports/hoursWorkedPerWorkerReport.zul:112 +msgid "Work reports" +msgstr "Raporty pracy" + +#: libreplan-webapp/src/main/java/org/libreplan/web/reports/HoursWorkedPerWorkerInAMonthController.java:44 +msgid "June" +msgstr "Czerwiec" + +#: libreplan-webapp/src/main/java/org/libreplan/web/common/entrypoints/EntryPointsHandler.java:143 +msgid "{0} annotation required on {1}" +msgstr "{0} adnotacja wymagane na {1}" + +#: libreplan-webapp/src/main/java/org/libreplan/web/tree/TreeController.java:1193 +msgid "Modified" +msgstr "Zmodyfikowane" + +#: libreplan-webapp/src/main/webapp/orders/_listOrderElementCriterionRequirements.zul:215 +msgid "Add Criterion" +msgstr "Dodaj Kryterium" + +#: libreplan-webapp/src/main/java/org/libreplan/web/scenarios/ScenarioModel.java:126 +msgid "You can not remove the current scenario" +msgstr "Nie możesz usunąć aktualnego scenariusza" + +#: libreplan-webapp/src/main/java/org/libreplan/web/common/ConfigurationController.java:672 +msgid "format prefix invalid. It cannot be empty or contain whitespaces." +msgstr "format prefiksu jest błędny. Nie może być pusty bądź zawierać odstępów." + +#: libreplan-webapp/src/main/java/org/libreplan/web/resources/worker/CriterionsController.java:89 +#: libreplan-webapp/src/main/java/org/libreplan/web/resources/worker/WorkerCRUDController.java:335 +msgid "MessagesContainer is needed" +msgstr "Potrzebny jest MessegesContainer" + +#: libreplan-webapp/src/main/webapp/templates/_historicalAssignment.zul:37 +msgid "Project element code" +msgstr "Kod elementu projektu" + +#: libreplan-webapp/src/main/webapp/reports/schedulingProgressPerOrderReport.zul:56 +#: libreplan-webapp/src/main/webapp/resources/worker/_localizations.zul:69 +#: libreplan-webapp/src/main/webapp/resources/worker/_editWorkRelationship.zul:26 +#: libreplan-webapp/src/main/webapp/resources/worker/_workRelationships.zul:29 +#: libreplan-webapp/src/main/webapp/resources/_criterions.zul:42 +msgid "Ending date" +msgstr "Data zakończenia" + +#: libreplan-webapp/src/main/webapp/common/page_not_found.zul:21 +msgid "LibrePlan: Page not found" +msgstr "LibrePlan: Strona nie została znaleziona" + +#: libreplan-webapp/src/main/webapp/planner/print_configuration.zul:29 +msgid "Export options" +msgstr "Opcje eksportu" + +#: libreplan-webapp/src/main/webapp/templates/_list.zul:21 +msgid "Templates List" +msgstr "Lista Szablonów" + +#: libreplan-webapp/src/main/webapp/subcontract/subcontractedTasks.zul:34 +msgid "Subcontracted Tasks List" +msgstr "Lista Zadań Podwykonawców" + +#: libreplan-webapp/src/main/webapp/common/configuration.zul:240 +msgid "Last value" +msgstr "Ostatnia wartość" + +#: libreplan-webapp/src/main/webapp/templates/_historicalStatistics.zul:51 +msgid "Average of worked hours in finished applications" +msgstr "Średnia z przepracowanych godzin w zakończonych zastosowań" + +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/ManageOrderElementAdvancesController.java:698 +msgid "Calculated progress can not be modified" +msgstr "Wyliczony postęp nie może być modyfikowany" + +#: libreplan-webapp/src/main/webapp/reports/orderCostsPerResource.zul:58 +msgid "Work done from starting date" +msgstr "Praca wykonana od daty rozpoczęcia" + +#: libreplan-webapp/src/main/webapp/templates/templates.zul:70 +msgid "Statistics log" +msgstr "Logi statystyk" + +#: libreplan-webapp/src/main/webapp/resources/worker/_calendar.zul:47 +#: libreplan-webapp/src/main/webapp/resources/machine/_calendar.zul:40 +msgid "Edit Calendar" +msgstr "Edytuj Kalendarz" + +#: libreplan-webapp/src/main/java/org/libreplan/web/users/ProfileCRUDController.java:117 +msgid "Profile" +msgstr "Profil" + +#: libreplan-webapp/src/main/java/org/libreplan/web/common/CustomMenuController.java:348 +#: libreplan-webapp/src/main/webapp/reports/timeLineMaterialReport.zul:37 +msgid "Materials Needs At Date" +msgstr "Materiały Potrzebne Na Dany Dzień" + +#: libreplan-webapp/src/main/webapp/common/configuration.zul:292 +msgid "UserDn" +msgstr "UserDn" + +#: libreplan-webapp/src/main/webapp/orders/_orderElementDetails.zul:35 +#: libreplan-webapp/src/main/webapp/orders/_orderElementDetails.zul:41 +#: libreplan-webapp/src/main/webapp/common/configuration.zul:59 +msgid "Cannot be empty or null" +msgstr "Nie może być pusty" + +#: libreplan-webapp/src/main/java/org/libreplan/web/common/BaseCRUDController.java:233 +msgid "{0} \"{1}\" saved" +msgstr "{0} \"{1}\" zapisane" + +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/OrderPlanningController.java:301 +msgid "filtering" +msgstr "filtrowanie" + +#: libreplan-webapp/src/main/webapp/orders/_list.zul:33 +msgid "Total Budget" +msgstr "Cały Budżet" + +#: libreplan-webapp/src/main/webapp/resources/criterions/_edition.zul:55 +msgid "Hierarchy" +msgstr "Hierarchia" + +#: libreplan-webapp/src/main/java/org/libreplan/web/resources/worker/WorkerCRUDController.java:815 +msgid "" +"This worker cannot be deleted because it has assignments to projects or " +"imputed hours" +msgstr "Ten pracownik nie może zostać skasowany ponieważ jest przypisany do projektów bądź wprowadzonych godzin" + +#: libreplan-webapp/src/main/webapp/reports/orderCostsPerResource.zul:62 +msgid "Work done until ending date" +msgstr "Praca wykonana przed datą zakończenia" + +#: libreplan-webapp/src/main/webapp/planner/print_configuration.zul:22 +#: libreplan-webapp/src/main/webapp/planner/print_configuration.zul:26 +msgid "Print configuration" +msgstr "Konfiguracja wydruku" + +#: libreplan-webapp/src/main/webapp/planner/_legendLoadChartOrder.zul:27 +msgid "Overload due to other assignments" +msgstr "Przeciążenia z powodu innych zadań" + +#: libreplan-webapp/src/main/java/org/libreplan/web/costcategories/TypeOfWorkHoursCRUDController.java:117 +msgid "Types of hours" +msgstr "Typy godzin" + +#: libreplan-webapp/src/main/java/org/libreplan/web/resources/worker/WorkRelationshipsController.java:149 +msgid "Time period saved" +msgstr "Okres czasu zapisany" + +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/criterionrequirements/AssignedCriterionRequirementController.java:252 +msgid "" +"Are you sure of changing the resource type? You will lose the criteria with " +"different resource type." +msgstr "Jesteś pewien że chcesz zmienić typ zasobu? Stracisz w ten sposób kryteria związane z innymi typami zasobów." + +#: libreplan-webapp/src/main/java/org/libreplan/web/reports/CompletedEstimatedHoursPerTaskController.java:170 +#: libreplan-webapp/src/main/java/org/libreplan/web/reports/HoursWorkedPerWorkerController.java:337 +#: libreplan-webapp/src/main/java/org/libreplan/web/reports/OrderCostsPerResourceController.java:208 +#: libreplan-webapp/src/main/java/org/libreplan/web/reports/WorkingArrangementsPerOrderController.java:208 +#: libreplan-webapp/src/main/java/org/libreplan/web/reports/WorkingProgressPerTaskController.java:165 +msgid "This Criterion has already been added." +msgstr "To kryterium zostało już dodane" + +#: libreplan-webapp/src/main/webapp/common/configuration.zul:222 +msgid "add" +msgstr "dodaj" + +#: libreplan-webapp/src/main/java/org/libreplan/web/tree/TreeController.java:860 +#: libreplan-webapp/src/main/webapp/templates/templates.zul:111 +#: libreplan-webapp/src/main/webapp/orders/_orderElementDetails.zul:69 +msgid "Budget value cannot be negative" +msgstr "" + +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/TreeElementOperationsController.java:239 +msgid "Unsaved changes will be lost. Would you like to continue?" +msgstr "Nie zapisane zmiany zostaną stracone. Czy chcesz kontynuować?" + +#: libreplan-webapp/src/main/java/org/libreplan/web/common/components/ResourceAllocationBehaviour.java:38 +msgid "NON_LIMITING" +msgstr "NIE_OGRANICZONE" + +#: libreplan-webapp/src/main/java/org/libreplan/web/common/CustomMenuController.java:297 +msgid "Workers" +msgstr "Pracownicy" + +#: libreplan-webapp/src/main/java/org/libreplan/web/exceptionDays/CalendarExceptionTypeModel.java:102 +msgid "Cannot remove {0}, since it is being used by some Exception Day" +msgstr "Nie mogę usunąć {0}, ponieważ jest używany przez któryś z Dni Wyjątków" + +#: libreplan-webapp/src/main/java/org/libreplan/web/reports/HoursWorkedPerWorkerInAMonthController.java:45 +msgid "August" +msgstr "Sierpień" + +#: libreplan-webapp/src/main/webapp/resources/search/allocation_selector.zul:53 +msgid "Resources matching selected criteria" +msgstr "Zasoby pasujące do wybranych kryteriów" + +#: libreplan-webapp/src/main/webapp/orders/_orderElementTreeFilter.zul:27 +msgid "with" +msgstr "z" + +#: libreplan-webapp/src/main/java/org/libreplan/web/labels/LabelTypeCRUDController.java:297 +msgid "Label Type" +msgstr "Typ Etykiety" + +#: libreplan-webapp/src/main/webapp/reports/hoursWorkedPerWorkerInAMonthReport.zul:48 +msgid "Year" +msgstr "Rok" + +#: libreplan-webapp/src/main/java/org/libreplan/web/common/BaseCRUDController.java:327 +msgid "{0} \"{1}\" could not be deleted, it was already removed" +msgstr "{0} \"{1}\" nie może być skasowny, został już usunięty" + +#: libreplan-business/src/main/java/org/libreplan/business/users/entities/Profile.java:68 +msgid "profile name not specified" +msgstr "nazwa profilu nie jest określona" + +#: libreplan-webapp/src/main/webapp/workreports/workReport.zul:62 +msgid "Date Start" +msgstr "Data Startu" + +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/ManageOrderElementAdvancesController.java:1280 +msgid "Value is not valid, the current value must be less than max value" +msgstr "Wartość nie jest poprawna, musi być mniejsza od wartości maksymalnej" + +#: libreplan-webapp/src/main/webapp/planner/order.zul:105 +#: libreplan-webapp/src/main/webapp/orders/_listOrderElementAdvances.zul:67 +#: libreplan-webapp/src/main/webapp/orders/components/_listOrderElementLabels.zul:35 +#: libreplan-webapp/src/main/webapp/orders/components/_listOrderElementLabels.zul:56 +msgid "Value" +msgstr "Wartość" + +#: libreplan-webapp/src/main/webapp/costcategories/_editCostCategory.zul:66 +msgid "Hour costs" +msgstr "Cena godzin" + +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/allocation/AllocationRow.java:773 +msgid "there are no valid periods for this calendar" +msgstr "nie istnieją żadne ważne okresy dla tego kalendarza" + +#: libreplan-webapp/src/main/webapp/users/_editProfile.zul:54 +#: libreplan-webapp/src/main/webapp/users/_editUser.zul:101 +msgid "Add role" +msgstr "Dodać rolę" + +#: libreplan-webapp/src/main/java/org/libreplan/web/calendars/BaseCalendarEditionController.java:638 +#: libreplan-webapp/src/main/java/org/libreplan/web/calendars/BaseCalendarEditionController.java:1274 +msgid "Exception end date should be greater or equals than start date" +msgstr "Wyjątek daty zakończenia powinien być większy lub równy niż data rozpoczęcia" + +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/SaveCommandBuilder.java:474 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/SaveCommandBuilder.java:484 +msgid "Repeated Project code {0} in Project {1}" +msgstr "Powtarzający się kod Projektu {0} w projekcie {1}" + +#: libreplan-webapp/src/main/java/org/libreplan/ws/subcontract/impl/SubcontractServiceREST.java:277 +msgid "Project from client" +msgstr "Projekt od klienta" + +#: libreplan-webapp/src/main/webapp/advance/_listAdvanceTypes.zul:22 +msgid "Progress Types List" +msgstr "Lista typów postępu" + +#: libreplan-webapp/src/main/java/org/libreplan/web/resources/machine/AssignedMachineCriterionsModel.java:415 +msgid "" +"The {0} can not be assigned to this resource. Its interval overlaps with " +"other criterion" +msgstr "{0} nie może być przypisany do tego zasobu. Jego odstęp nakłada się z innym kryterium" + +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/chart/EarnedValueChartFiller.java:132 +msgid "Schedule Performance Index" +msgstr "Harmonogram wydajności indeksu" + +#: libreplan-webapp/src/main/webapp/limitingresources/limitingResourcesLayout.zul:135 +msgid "Earlier starting date" +msgstr "Wcześniejsza data rozpoczęcia" + +#: libreplan-webapp/src/main/webapp/costcategories/_editTypeOfWorkHours.zul:27 +msgid "Type data" +msgstr "Typ danych" + +#: libreplan-webapp/src/main/java/org/libreplan/web/users/ProfileCRUDController.java:122 +#: libreplan-webapp/src/main/java/org/libreplan/web/common/CustomMenuController.java:322 +msgid "Profiles" +msgstr "Profile" + +#: libreplan-webapp/src/main/webapp/common/configuration.zul:271 +msgid "Host" +msgstr "Host" + +#: libreplan-webapp/src/main/java/org/libreplan/web/workreports/WorkReportCRUDController.java:810 +msgid "Hour finish" +msgstr "Godzina ukończenia" + +#: libreplan-webapp/src/main/webapp/common/configuration.zul:178 +msgid "Perspectives" +msgstr "Perspektywy" + +#: libreplan-webapp/src/main/webapp/calendars/_edition.zul:119 +msgid "Workable time" +msgstr "Przepracowany czas" + +#: libreplan-webapp/src/main/java/org/libreplan/ws/materials/impl/MaterialConverter.java:240 +msgid "missing code in a subcategory" +msgstr "brakuje kodu w podkategorii" + +#: libreplan-webapp/src/main/webapp/planner/editTask.zul:66 +msgid "Non limiting resource allocation" +msgstr "Brak ograniczenia przydziału zasobów" + +#: libreplan-webapp/src/main/webapp/externalcompanies/_editExternalCompany.zul:40 +msgid "Company name" +msgstr "Nazwa firmy" + +#: libreplan-webapp/src/main/webapp/planner/editTask.zul:67 +msgid "Limiting resource allocation" +msgstr "Ograniczenia przydziału zasobów" + +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/materials/AssignedMaterialsController.java:463 +msgid "Split new assignment" +msgstr "Podziel nowe zadanie" + +#: libreplan-webapp/src/main/webapp/calendars/_edition.zul:275 +msgid "Expiry date" +msgstr "Data ważnosći" + +#: libreplan-webapp/src/main/webapp/planner/advance_allocation.zul:57 +#: libreplan-webapp/src/main/webapp/limitingresources/limitingResourcesLayout.zul:67 +msgid "Pagination" +msgstr "Paginacja" + +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/AssignedTaskQualityFormsToOrderElementModel.java:342 +msgid "" +"The operation does not perform because the task has progress reports that is" +" spread associated with this quality form" +msgstr "Operacja nie jest wykonywana ponieważ raport postępu zadania, jest rozłożony, związany z tą formą jakości" + +#: libreplan-webapp/src/main/webapp/common/layout/template.zul:82 +msgid "Change scenario" +msgstr "Zmień scenariusz" + +#: libreplan-webapp/src/main/java/org/libreplan/web/montecarlo/MonteCarloModel.java:84 +#: libreplan-webapp/src/main/webapp/montecarlo/_montecarlo.zul:69 +msgid "Critical path" +msgstr "Ścieżka krytyczna" + +#: libreplan-webapp/src/main/java/org/libreplan/web/qualityforms/QualityFormCRUDController.java:161 +msgid "" +"Deleting this item, it will disable the report progress option. Are you " +"sure?" +msgstr "Usunięcie tej pozycji wyłączy opcję raportu postępu. Jesteś pewien?" + +#: libreplan-webapp/src/main/webapp/materials/materials.zul:41 +#: libreplan-webapp/src/main/webapp/orders/components/_listOrderElementMaterials.zul:41 +#: libreplan-webapp/src/main/webapp/orders/components/_listOrderElementMaterials.zul:77 +msgid "Categories" +msgstr "Kategorie" + +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/tabs/OrdersTabCreator.java:46 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/tabs/PlanningTabCreator.java:180 +msgid "Project Details" +msgstr "Szczegóły projektu" + +#: libreplan-webapp/src/main/webapp/orders/_listOrderElementCriterionRequirements.zul:167 +msgid "Add new hours group" +msgstr "Dodaj nowe godziny pracy" + +#: libreplan-webapp/src/main/java/org/libreplan/web/limitingresources/QueueComponent.java:221 +msgid "Criteria: {0} " +msgstr "Kryteria: {0} " + +#: libreplan-webapp/src/main/webapp/planner/advance_allocation.zul:44 +msgid "Cancel changes and back to scheduling" +msgstr "Anuluj zmiany i wróć do planowania" + +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/AssignedTaskQualityFormsToOrderElementController.java:386 +#: libreplan-webapp/src/main/webapp/advance/_editAdvanceTypes.zul:65 +#: libreplan-webapp/src/main/webapp/qualityforms/_editQualityForm.zul:86 +#: libreplan-webapp/src/main/webapp/planner/order.zul:106 +#: libreplan-webapp/src/main/webapp/orders/_listOrderElementAdvances.zul:45 +#: libreplan-webapp/src/main/webapp/orders/_listOrderElementAdvances.zul:68 +msgid "Percentage" +msgstr "Procent" + +#: libreplan-webapp/src/main/java/org/libreplan/web/subcontract/ReportAdvancesController.java:137 +msgid "Updated" +msgstr "Zaktualizowany" + +#: libreplan-webapp/src/main/webapp/common/configuration.zul:81 +msgid "Company logo URL" +msgstr "Adres do logo firmy" + +#: libreplan-webapp/src/main/java/org/libreplan/web/resources/machine/MachineConfigurationController.java:129 +msgid "No worker selected" +msgstr "Żaden pracownik nie został zaznaczony" + +#: libreplan-webapp/src/main/webapp/common/configuration.zul:220 +#: libreplan-webapp/src/main/webapp/common/configuration.zul:238 +msgid "Number of digits" +msgstr "Liczba cyfr" + +#: libreplan-webapp/src/main/java/org/libreplan/web/workreports/WorkReportCRUDController.java:1639 +msgid "Task not found" +msgstr "Nie znaleziono zadania" + +#: libreplan-webapp/src/main/webapp/planner/_legendLoadChartOrder.zul:39 +#: libreplan-webapp/src/main/webapp/planner/_legendLoadChartCompany.zul:39 +msgid "Total capability" +msgstr "Całkowita zdolność" + +#: libreplan-webapp/src/main/java/org/libreplan/web/subcontract/ReportAdvancesModel.java:217 +msgid "Problems connecting with client web service" +msgstr "Problemy z podłączeniem z klientem serwisu internetowego" + +#: libreplan-webapp/src/main/webapp/calendars/_edition.zul:169 +#: libreplan-webapp/src/main/webapp/calendars/_edition.zul:198 +msgid "Exception Type" +msgstr "Typ wyjątku" + +#: libreplan-webapp/src/main/webapp/users/_listProfiles.zul:22 +msgid "Profiles List" +msgstr "Lista profili" + +#: libreplan-webapp/src/main/java/org/libreplan/web/materials/MaterialsModel.java:278 +msgid "both {0} of category {1} and {2} of category {3} have the same code" +msgstr "zarówno {0} kategoria {1} i {2} kategoria {3} mają ten sam kod" + +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/TaskElementAdapter.java:1039 +#: libreplan-webapp/src/main/java/org/libreplan/web/templates/TemplatesTreeController.java:240 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderModel.java:696 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderElementTreeController.java:583 +#: libreplan-webapp/src/main/java/org/libreplan/web/common/CustomMenuController.java:331 +#: libreplan-webapp/src/main/webapp/planner/taskpanels/_tabPanelSubcontract.zul:68 +#: libreplan-webapp/src/main/webapp/templates/templates.zul:65 +#: libreplan-webapp/src/main/webapp/templates/_editTemplateWindow.zul:50 +#: libreplan-webapp/src/main/webapp/orders/_editOrderElement.zul:50 +msgid "Labels" +msgstr "Etykiety" + +#: libreplan-webapp/src/main/java/org/libreplan/web/common/CustomMenuController.java:327 +msgid "Data Types" +msgstr "Typy danych" + +#: libreplan-webapp/src/main/webapp/orders/_edition.zul:161 +#: libreplan-webapp/src/main/webapp/orders/_listOrderElementHours.zul:68 +msgid "Total hours" +msgstr "Wszystkie godziny" + +#: libreplan-webapp/src/main/webapp/settings/settings.zul:38 +msgid "Data" +msgstr "Dane" + +#: libreplan-webapp/src/main/java/org/libreplan/web/common/TemplateModel.java:344 +msgid "Reassigning {0} projects" +msgstr "Kolejne przypisywanie {0} projektów" + +#: libreplan-webapp/src/main/webapp/reports/workingArrangementsPerOrderReport.zul:55 +msgid "Filter by task status" +msgstr "Filtruj przez status zadania" + +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/OrderPlanningModel.java:529 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/company/CompanyPlanningModel.java:416 +msgid "Select date" +msgstr "Wybierz datę" + +#: libreplan-webapp/src/main/java/org/libreplan/web/calendars/BaseCalendarEditionController.java:631 +#: libreplan-webapp/src/main/java/org/libreplan/web/calendars/BaseCalendarEditionController.java:1267 +msgid "You should select a end date for the exception" +msgstr "Powinieneś wybrać datę zakończenia dla wyjątku" + +#: libreplan-webapp/src/main/webapp/common/concurrent_modification.zul:34 +msgid "Please try it again." +msgstr "Proszę spróbować ponownie" + +#: libreplan-webapp/src/main/webapp/common/configuration.zul:56 +msgid "Company code" +msgstr "Kod firmy" + +#: libreplan-webapp/src/main/webapp/orders/_listOrderElementHours.zul:62 +msgid "Sum of imputed hours in children tasks" +msgstr "" + +#: libreplan-webapp/src/main/java/org/libreplan/web/common/components/TwoWaySelector.java:110 +msgid "Unknown attribute '{0}' in class {1}" +msgstr "Nieznany atrybut '{0}' w klasie {1}" + +#: libreplan-webapp/src/main/java/org/libreplan/web/users/settings/PasswordController.java:96 +msgid "passwords can not be empty" +msgstr "Hasła nie powinny być puste" + +#: libreplan-webapp/src/main/java/org/libreplan/web/resources/worker/WorkerCRUDController.java:699 +#: libreplan-business/src/main/java/org/libreplan/business/resources/entities/ResourceType.java:33 +msgid "NON LIMITING RESOURCE" +msgstr "Brak ograniczenia zasobu" + +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/labels/AssignedLabelsController.java:88 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/labels/AssignedLabelsController.java:128 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/AssignedTaskQualityFormsToOrderElementController.java:176 +msgid "already assigned" +msgstr "Aktualnie przypisany" + +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/AssignedTaskQualityFormsToOrderElementController.java:390 +msgid "Passed" +msgstr "Przekazywana" + +#: libreplan-webapp/src/main/webapp/calendars/_edition.zul:132 +msgid "Activation periods" +msgstr "Okresy aktywacji" + +#: libreplan-webapp/src/main/java/org/libreplan/web/calendars/BaseCalendarCRUDController.java:511 +#: libreplan-webapp/src/main/webapp/planner/order.zul:151 +#: libreplan-webapp/src/main/webapp/resources/worker/_edition.zul:35 +#: libreplan-webapp/src/main/webapp/resources/machine/_editMachine.zul:32 +#: libreplan-webapp/src/main/webapp/orders/_projectDetails.zul:75 +#: libreplan-webapp/src/main/webapp/orders/_edition.zul:133 +#: libreplan-webapp/src/main/webapp/common/configuration.zul:152 +msgid "Calendar" +msgstr "Kalendarz" + +#: libreplan-webapp/src/main/java/org/libreplan/web/common/CustomMenuController.java:307 +#: libreplan-webapp/src/main/webapp/common/configuration.zul:132 +msgid "Resources" +msgstr "Zasoby" + +#: libreplan-webapp/src/main/webapp/settings/changePassword.zul:48 +msgid "" +"LDAP users cannot change their password if LDAP authentication is enabled. " +"Talk to one of the administrators" +msgstr "Użytkownicy Ldap nie mogą zmienić swojego hasła jeżeli autentyczność Ldap jest włączona. Porozmawiaj z jednym z administratorów." + +#: libreplan-webapp/src/main/webapp/orders/_listOrderElementAuthorizations.zul:31 +#: libreplan-webapp/src/main/webapp/orders/_listOrderElementAuthorizations.zul:56 +msgid "Read" +msgstr "Czytaj" + +#: libreplan-webapp/src/main/java/org/libreplan/web/scenarios/TransferOrdersModel.java:153 +msgid "Source and destination scenarios should be different" +msgstr "Źródłowy i docelowy scenariusz powinien być inny" + +#: libreplan-webapp/src/main/webapp/common/layout/login.zul:141 +msgid "The browser you are using" +msgstr "Przeglądarka, której używasz" + +#: libreplan-webapp/src/main/webapp/common/layout/template.zul:78 +msgid "scenario" +msgstr "scenariusz" + +#: libreplan-webapp/src/main/webapp/workreports/workReport.zul:51 +#: libreplan-webapp/src/main/webapp/workreports/workReportQuery.zul:49 +#: libreplan-webapp/src/main/webapp/resources/search/_resourceFilter.zul:42 +#: libreplan-webapp/src/main/webapp/orders/_orderElementTreeFilter.zul:42 +#: libreplan-webapp/src/main/webapp/orders/_orderFilter.zul:29 +msgid "to" +msgstr "do" + +#: libreplan-business/src/main/java/org/libreplan/business/resources/entities/Worker.java:115 +msgid "worker's first name not specified" +msgstr "Nie podano imienia pracownika" + +#: libreplan-webapp/src/main/webapp/common/configuration.zul:350 +msgid "Property strategy" +msgstr "Strategia własności" + +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/AssignedTaskQualityFormsToOrderElementModel.java:281 +msgid "date not specified" +msgstr "Nie podano daty" + +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/tabs/PlanningTabCreator.java:196 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/tabs/PlanningTabCreator.java:206 +#: libreplan-webapp/src/main/java/org/libreplan/web/common/CustomMenuController.java:270 +msgid "Projects Planning" +msgstr "Planowanie projektów" + +#: libreplan-webapp/src/main/webapp/planner/print_configuration.zul:37 +msgid "Shrink to fit page width" +msgstr "Zmniejsz aby dopasować szerokość strony" + +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/ManageOrderElementAdvancesController.java:770 +msgid "The max value must be greater than 0" +msgstr "Maksymalna wartość musi być większa niż 0" + +#: libreplan-webapp/src/main/webapp/settings/settings.zul:63 +#: libreplan-webapp/src/main/webapp/users/_editUser.zul:59 +#: libreplan-webapp/src/main/webapp/resources/worker/_edition.zul:70 +msgid "Last name" +msgstr "Nazwisko" + +#: libreplan-webapp/src/main/java/org/libreplan/ws/resources/impl/ResourceConverter.java:254 +msgid "cost category name not specified" +msgstr "Nie podano nazwy kategorii kosztów" + +#: libreplan-webapp/src/main/java/org/libreplan/web/calendars/BaseCalendarCRUDController.java:382 +#: libreplan-webapp/src/main/java/org/libreplan/web/common/Util.java:556 +msgid "Remove" +msgstr "Usuń" + +#: libreplan-webapp/src/main/webapp/planner/taskpanels/_allocationConfiguration.zul:41 +msgid "Planned workable days" +msgstr "Planowane przepracowane dni" + +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/chart/EarnedValueChartFiller.java:131 +msgid "SPI" +msgstr "SPI" + +#: libreplan-webapp/src/main/java/org/libreplan/web/advance/AdvanceTypeCRUDController.java:232 +msgid "Progress Type" +msgstr "Typ postępu" + +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/allocation/AdvancedAllocationController.java:1304 +msgid "Task contains consolidated progress. Cannot apply sigmoid function." +msgstr "Zadanie zawiera skonsolidowany postęp. Nie można stosować funkcji sigmoid." + +#: libreplan-webapp/src/main/webapp/common/configuration.zul:320 +msgid "UserId" +msgstr "Identyfikacja użytkownika" + +#: libreplan-webapp/src/main/java/org/libreplan/web/workreports/WorkReportTypeModel.java:390 +msgid "the code must be not null or not empty" +msgstr "kod nie może być zerowy lub pusty" + +#: libreplan-webapp/src/main/java/org/libreplan/web/calendars/BaseCalendarModel.java:509 +msgid "This date can not include the whole previous work week" +msgstr "Data ta nie może obejmować cały poprzedni tydzień pracy" + +#: libreplan-webapp/src/main/java/org/libreplan/web/resources/worker/CriterionsMachineController.java:245 +#: libreplan-webapp/src/main/java/org/libreplan/web/resources/worker/CriterionsController.java:218 +msgid "" +"Start date is not valid, the new start date must be previous the current " +"start date" +msgstr "Data rozpoczęcia jest nieprawidłowa, nowa data rozpoczęcia musi być poprzednią aktualną data rozpoczęcia" + +#: libreplan-webapp/src/main/webapp/common/layout/template.zul:119 +msgid "Create New Project" +msgstr "Stwórz nowy projekt" + +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/allocation/AdvancedAllocationController.java:1439 +msgid "Stretches list" +msgstr "Rozciąga listę" + +#: libreplan-webapp/src/main/webapp/common/configuration.zul:193 +msgid "Enable scenarios module" +msgstr "Włącz moduł scenariuszy" + +#: libreplan-webapp/src/main/java/org/libreplan/web/calendars/BaseCalendarEditionController.java:312 +msgid "to {0}" +msgstr "" + +#: libreplan-webapp/src/main/webapp/limitingresources/limitingResourcesLayout.zul:59 +msgid "Zoom" +msgstr "Przybliż" + +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/SaveCommandBuilder.java:863 +#: libreplan-webapp/src/main/webapp/labels/_editLabelType.zul:112 +#: libreplan-webapp/src/main/webapp/advance/advanceTypes.zul:37 +#: libreplan-webapp/src/main/webapp/excetiondays/_editExceptionDayType.zul:91 +#: libreplan-webapp/src/main/webapp/externalcompanies/_editExternalCompany.zul:102 +#: libreplan-webapp/src/main/webapp/materials/materials.zul:115 +#: libreplan-webapp/src/main/webapp/materials/unitTypes.zul:39 +#: libreplan-webapp/src/main/webapp/workreports/workReport.zul:205 +#: libreplan-webapp/src/main/webapp/workreports/workReportTypes.zul:36 +#: libreplan-webapp/src/main/webapp/workreports/workReportQuery.zul:185 +#: libreplan-webapp/src/main/webapp/scenarios/_edition.zul:64 +#: libreplan-webapp/src/main/webapp/costcategories/_editCostCategory.zul:94 +#: libreplan-webapp/src/main/webapp/costcategories/_editTypeOfWorkHours.zul:76 +#: libreplan-webapp/src/main/webapp/qualityforms/_editQualityForm.zul:131 +#: libreplan-webapp/src/main/webapp/settings/changePassword.zul:81 +#: libreplan-webapp/src/main/webapp/settings/settings.zul:124 +#: libreplan-webapp/src/main/webapp/users/_editProfile.zul:70 +#: libreplan-webapp/src/main/webapp/users/_editUser.zul:151 +#: libreplan-webapp/src/main/webapp/templates/templates.zul:143 +#: libreplan-webapp/src/main/webapp/calendars/calendars.zul:44 +#: libreplan-webapp/src/main/webapp/resources/worker/virtualWorkers.zul:40 +#: libreplan-webapp/src/main/webapp/resources/worker/worker.zul:41 +#: libreplan-webapp/src/main/webapp/resources/worker/_editWorkRelationship.zul:45 +#: libreplan-webapp/src/main/webapp/resources/machine/_editMachine.zul:97 +#: libreplan-webapp/src/main/webapp/resources/criterions/criterions.zul:44 +#: libreplan-webapp/src/main/webapp/resources/criterions/_edition.zul:90 +#: libreplan-webapp/src/main/webapp/resources/criterions/_workers.zul:48 +#: libreplan-webapp/src/main/webapp/limitingresources/limitingResourcesLayout.zul:53 +#: libreplan-webapp/src/main/webapp/common/configuration.zul:395 +msgid "Save" +msgstr "Zapisz" + +#: libreplan-webapp/src/main/webapp/excetiondays/_listExceptionDayTypes.zul:34 +#: libreplan-webapp/src/main/webapp/excetiondays/_editExceptionDayType.zul:72 +msgid "Standard Effort" +msgstr "Standardowy wysiłek" + +#: libreplan-webapp/src/main/webapp/common/configuration.zul:142 +msgid "Material categories" +msgstr "Kategorie materiałów" + +#: libreplan-webapp/src/main/java/org/libreplan/web/common/ConfigurationController.java:292 +#: libreplan-webapp/src/main/java/org/libreplan/web/common/ConfigurationController.java:595 +#: libreplan-webapp/src/main/java/org/libreplan/web/common/ConfigurationController.java:693 +msgid "number of digits must be between {0} and {1}" +msgstr "liczba cyfr musi wynosić między {0} i {1}" + +#: libreplan-webapp/src/main/webapp/orders/_listHoursGroupCriterionRequirement.zul:22 +msgid "Criteria Requirement" +msgstr "Wymóg Kryteria" + +#: libreplan-webapp/src/main/java/org/libreplan/web/subcontract/ReportAdvancesController.java:134 +msgid "Pending update" +msgstr "Do czasu aktualizacji" + +#: libreplan-webapp/src/main/java/org/libreplan/web/resources/machine/MachineConfigurationController.java:158 +msgid "Criterion previously selected" +msgstr "Kryterium poprzednio wybrany" + +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/ManageOrderElementAdvancesController.java:881 +msgid "" +"Spread progress cannot be changed if there is a consolidation in any " +"progress assignment from root task" +msgstr "Rozprzestrzeniany postęp nie może być zmieniony jeżeli jest jakaś konsolidacja w jakimkolwiek przypisanym postępie głównego zadania" + +#: libreplan-webapp/src/main/webapp/orders/_listOrderElementAuthorizations.zul:51 +msgid "Users authorization" +msgstr "Autoryzacja użytkowników" + +#: libreplan-webapp/src/main/java/org/libreplan/web/subcontract/SubcontractedTasksModel.java:177 +msgid "Problems connecting with subcontractor web service" +msgstr "Problemy z podłączeniem podwykonawcy serwisu internetowego" + +#: libreplan-webapp/src/main/webapp/common/configuration.zul:232 +msgid "Entity type" +msgstr "Rodzaj podmiotu" + +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/OrderPlanningModel.java:1127 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:268 +msgid "Unsaved changes will be lost. Are you sure?" +msgstr "Niezapisane zmiany zostaną utracone. Jesteś pewien?" + +#: libreplan-webapp/src/main/webapp/planner/montecarlo_function.zul:22 +#: libreplan-webapp/src/main/webapp/planner/resources_use.zul:22 +#: libreplan-webapp/src/main/webapp/planner/stretches_function.zul:22 +#: libreplan-webapp/src/main/webapp/planner/main.zul:22 +#: libreplan-webapp/src/main/webapp/planner/index.zul:22 +#: libreplan-webapp/src/main/webapp/planner/taskpanels/_tabPanelLimitingResourceAllocation.zul:22 +#: libreplan-webapp/src/main/webapp/planner/order.zul:22 +#: libreplan-webapp/src/main/webapp/templates/templates.zul:22 +#: libreplan-webapp/src/main/webapp/resourceload/resourceload.zul:22 +msgid "LibrePlan: Scheduling" +msgstr "LibrePlan: Planowanie" + +#: libreplan-webapp/src/main/webapp/planner/_legendLoadChartCompany.zul:44 +msgid "Assigned load" +msgstr "Przypisany ładunek" + +#: libreplan-webapp/src/main/webapp/reports/hoursWorkedPerWorkerReport.zul:64 +msgid "Filter by workers" +msgstr "Filtruj przez pracowników" + +#: libreplan-webapp/src/main/webapp/calendars/_edition.zul:154 +msgid "End Date" +msgstr "Data zakończenia" + +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/taskedition/AdvancedAllocationTaskController.java:73 +msgid "Some allocations needed" +msgstr "Niektóre przydziały są potrzebne" + +#: libreplan-webapp/src/main/webapp/planner/taskpanels/_tabPanelNonLimitingResourceAllocation.zul:83 +msgid "Resources Per Day" +msgstr "Zasoby na dzień" + +#: libreplan-webapp/src/main/java/org/libreplan/web/resources/criterion/CriterionsModel.java:216 +msgid "ResourceType must be not-null" +msgstr "ResourceType nie może być pusty" + +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrdersTreeComponent.java:105 +msgid "" +"Estimated end date for the task (press enter in textbox to open calendar " +"popup or type in date directly)" +msgstr "Szacowana data zakończenia dla zadania (naciśnij enter w polu tekstowym, aby otworzyć kalendarz popup lub wpisz datę bezpośrednio)" + +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderElementTreeController.java:293 +msgid "Expand/Collapse all" +msgstr "Rozwiń/Zwiń wszystko" + +#: libreplan-webapp/src/main/webapp/planner/_legendLoadChartOrder.zul:32 +msgid "Overload due to current project" +msgstr "Przeciążenie z powodu obecnego projektu" + +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/TaskElementAdapter.java:1017 +msgid "Name: {0}" +msgstr "Nazwa: {0}" + +#: libreplan-webapp/src/main/java/org/libreplan/web/tree/TreeController.java:1020 +msgid "Move down" +msgstr "Przesuń na dół" + +#: libreplan-webapp/src/main/java/org/libreplan/web/reports/CompletedEstimatedHoursPerTaskController.java:118 +#: libreplan-webapp/src/main/java/org/libreplan/web/reports/WorkingArrangementsPerOrderController.java:139 +#: libreplan-webapp/src/main/java/org/libreplan/web/reports/WorkingProgressPerTaskController.java:113 +msgid "Please, select a project" +msgstr "Proszę, wybrać projekt" + +#: libreplan-webapp/src/main/webapp/calendars/_list.zul:29 +msgid "Inherits from date" +msgstr "Dziedziczy po dacie" + +#: libreplan-webapp/src/main/java/org/libreplan/web/reports/HoursWorkedPerWorkerInAMonthController.java:45 +msgid "September" +msgstr "Wrzesień" + +#: libreplan-webapp/src/main/webapp/workreports/_editWorkReportType.zul:28 +msgid "Report structure" +msgstr "Struktura raportu" + +#: libreplan-webapp/src/main/webapp/workreports/workReport.zul:119 +#: libreplan-webapp/src/main/webapp/templates/templates.zul:59 +#: libreplan-webapp/src/main/webapp/orders/_edition.zul:42 +msgid "General data" +msgstr "Dane ogólne" + +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/chart/EarnedValueChartFiller.java:126 +msgid "BAC" +msgstr "BAC" + +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/allocation/ResourceAllocationController.java:381 +msgid "Calculate Number of Hours" +msgstr "Oblicz Ilość Godzin" + +#: libreplan-webapp/src/main/webapp/templates/_assignedQualityForms.zul:38 +#: libreplan-webapp/src/main/webapp/orders/_listOrderElementTaskQualityForms.zul:35 +#: libreplan-webapp/src/main/webapp/orders/components/_listOrderElementLabels.zul:81 +#: libreplan-webapp/src/main/webapp/orders/components/_listOrderElementMaterials.zul:99 +msgid "Assign" +msgstr "Przypisz" + +#: libreplan-webapp/src/main/java/org/libreplan/ws/resources/criterion/impl/CriterionConverter.java:130 +msgid "missing code in a criterion" +msgstr "brakuje kodu w kryterium" + +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:1282 +msgid "Create Template" +msgstr "Utwórz Szablon" + +#: libreplan-webapp/src/main/webapp/planner/taskpanels/_tabPanelLimitingResourceAllocation.zul:60 +#: libreplan-webapp/src/main/webapp/planner/taskpanels/_tabPanelNonLimitingResourceAllocation.zul:68 +msgid "Advanced search" +msgstr "Zaawansowane wyszukiwanie" + +#: libreplan-webapp/src/main/webapp/reports/workingProgressPerTaskReport.zul:74 +#: libreplan-webapp/src/main/webapp/reports/completedEstimatedHoursPerTask.zul:74 +#: libreplan-webapp/src/main/webapp/reports/orderCostsPerResource.zul:112 +#: libreplan-webapp/src/main/webapp/reports/hoursWorkedPerWorkerReport.zul:95 +#: libreplan-webapp/src/main/webapp/reports/workingArrangementsPerOrderReport.zul:82 +msgid "Filter by labels" +msgstr "Filtruj przez etykiety" + +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/taskedition/TaskPropertiesController.java:586 +msgid "" +"IMPORTANT: Don't forget to communicate to subcontractor that his contract " +"has been cancelled" +msgstr "WAŻNE: Nie zapomnij przekazać podwykonawcy, że jego umowa została rozwiązana." + +#: libreplan-webapp/src/main/webapp/planner/montecarlo_function.zul:36 +msgid "MonteCarlo chart" +msgstr "Wykres MonteCarlo" + +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/chart/EarnedValueChartFiller.java:126 +msgid "Schedule Variance" +msgstr "Rozkład wariancji" + +#: libreplan-webapp/src/main/java/org/libreplan/web/qualityforms/QualityFormCRUDController.java:395 +msgid "Error on showing warning message removing qualityForm: " +msgstr "Błąd przy wyświetlaniu komunikatu ostrzegawczego usuwającego qualityForm: " + +#: libreplan-webapp/src/main/java/org/libreplan/ws/resources/impl/ResourceConverter.java:410 +msgid "Service does not manage resource of type: {0}" +msgstr "Serwis nie zarządza zasobami typu: {0}" + +#: libreplan-webapp/src/main/webapp/common/error.zul:44 +#: libreplan-webapp/src/main/webapp/common/event_error.zul:39 +msgid "Status code" +msgstr "Kod stanu" + +#: libreplan-webapp/src/main/java/org/libreplan/web/workreports/WorkReportTypeCRUDController.java:976 +#: libreplan-webapp/src/main/java/org/libreplan/web/costcategories/TypeOfWorkHoursCRUDController.java:103 +#: libreplan-webapp/src/main/java/org/libreplan/web/qualityforms/QualityFormCRUDController.java:391 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/taskedition/AdvancedAllocationTaskController.java:73 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/taskedition/TaskPropertiesController.java:518 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/taskedition/TaskPropertiesController.java:556 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/taskedition/TaskPropertiesController.java:587 +#: libreplan-webapp/src/main/java/org/libreplan/web/users/ProfileCRUDController.java:153 +#: libreplan-webapp/src/main/java/org/libreplan/web/calendars/BaseCalendarCRUDController.java:476 +msgid "Warning" +msgstr "Ostrzeżenie" + +#: libreplan-webapp/src/main/webapp/resources/worker/_calendar.zul:35 +#: libreplan-webapp/src/main/webapp/resources/machine/_calendar.zul:30 +msgid "Select parent calendar" +msgstr "Wybierz kalendarz nadrzędny" + +#: libreplan-webapp/src/main/java/org/libreplan/ws/workreports/impl/WorkReportConverter.java:450 +#: libreplan-webapp/src/main/java/org/libreplan/ws/workreports/impl/WorkReportConverter.java:513 +msgid "There is no task with this code" +msgstr "Nie ma zadania z tym kodem" + +#: libreplan-webapp/src/main/java/org/libreplan/web/workreports/WorkReportCRUDController.java:441 +#: libreplan-webapp/src/main/java/org/libreplan/web/costcategories/CostCategoryCRUDController.java:146 +msgid "The type of hours cannot be null" +msgstr "Rodzaj godzin nie może być zerowy" + +#: libreplan-business/src/main/java/org/libreplan/business/resources/entities/CriterionSatisfaction.java:297 +msgid "criterion satisfaction with end date less than start date" +msgstr "Satysfakcja z kryterium daty końcowej jest mniejsza niż z daty rozpoczęcia" + +#: libreplan-webapp/src/main/webapp/reports/workingProgressPerTaskReport.zul:185 +#: libreplan-webapp/src/main/webapp/reports/completedEstimatedHoursPerTask.zul:186 +#: libreplan-webapp/src/main/webapp/reports/orderCostsPerResource.zul:226 +#: libreplan-webapp/src/main/webapp/reports/hoursWorkedPerWorkerReport.zul:214 +#: libreplan-webapp/src/main/webapp/reports/hoursWorkedPerWorkerInAMonthReport.zul:94 +#: libreplan-webapp/src/main/webapp/reports/schedulingProgressPerOrderReport.zul:166 +#: libreplan-webapp/src/main/webapp/reports/workingArrangementsPerOrderReport.zul:193 +#: libreplan-webapp/src/main/webapp/reports/timeLineMaterialReport.zul:163 +#: libreplan-webapp/src/main/webapp/orders/_listOrderElementAdvances.zul:49 +msgid "Show" +msgstr "Pokaż" + +#: libreplan-webapp/src/main/webapp/resources/search/allocation_selector.zul:71 +msgid "Assignment Type" +msgstr "Rodzaj zadania" + +#: libreplan-webapp/src/main/webapp/planner/taskpanels/_tabPanelTaskProperties.zul:58 +msgid "Duration (days)" +msgstr "Czas trwania (dni)" + +#: libreplan-webapp/src/main/webapp/common/layout/timeout.zul:29 +msgid "Back to log in" +msgstr "Powróć do logowania" + +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/materials/AssignedMaterialsController.java:481 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/materials/AssignedMaterialsController.java:483 +msgid "Error on splitting" +msgstr "Błąd na rozdzieleniu" + +#: libreplan-webapp/src/main/webapp/planner/taskpanels/_tabPanelSubcontract.zul:66 +msgid "Node without children" +msgstr "Węzeł bez elementów" + +#: libreplan-webapp/src/main/java/org/libreplan/web/externalcompanies/ExternalCompanyCRUDController.java:152 +#: libreplan-webapp/src/main/webapp/subcontract/subcontractedTasks.zul:47 +msgid "Company" +msgstr "Firma" + +#: libreplan-webapp/src/main/java/org/libreplan/web/limitingresources/QueueComponent.java:212 +msgid "Task: {0} " +msgstr "Zadanie: {0} " + +#: libreplan-webapp/src/main/java/org/libreplan/ws/workreports/impl/WorkReportConverter.java:118 +msgid "There is no label with this code " +msgstr "Nie ma etykiety z tym kodem " + +#: libreplan-webapp/src/main/webapp/planner/editTask.zul:65 +msgid "Task properties" +msgstr "Właściwości zadania" + +#: libreplan-webapp/src/main/java/org/libreplan/ws/workreports/impl/WorkReportConverter.java:84 +msgid "There is no type of work report with this code" +msgstr "Nie ma typu pracy z tym kodem" + +#: libreplan-webapp/src/main/webapp/orders/_listOrderElementHours.zul:56 +msgid "Sum of direct imputed hours" +msgstr "Suma bezpośrednich przypisanych godzin" + +#: libreplan-webapp/src/main/webapp/resources/worker/_list.zul:35 +#: libreplan-webapp/src/main/webapp/resources/criterions/_workers.zul:28 +msgid "Surname" +msgstr "Nazwisko" + +#: libreplan-webapp/src/main/webapp/excetiondays/_listExceptionDayTypes.zul:22 +msgid "Exception Day Types List" +msgstr "Wyjątek listy dni typu" + +#: libreplan-webapp/src/main/java/org/libreplan/web/workreports/WorkReportCRUDController.java:750 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/AssignedTaskQualityFormsToOrderElementController.java:394 +#: libreplan-webapp/src/main/webapp/workreports/workReport.zul:154 +#: libreplan-webapp/src/main/webapp/workreports/_editWorkReportType.zul:69 +#: libreplan-webapp/src/main/webapp/workreports/workReportQuery.zul:68 +#: libreplan-webapp/src/main/webapp/workreports/workReportQuery.zul:131 +#: libreplan-webapp/src/main/webapp/planner/stretches_function.zul:48 +#: libreplan-webapp/src/main/webapp/planner/order.zul:107 +#: libreplan-webapp/src/main/webapp/reports/workingProgressPerTaskReport.zul:41 +#: libreplan-webapp/src/main/webapp/reports/completedEstimatedHoursPerTask.zul:41 +#: libreplan-webapp/src/main/webapp/reports/schedulingProgressPerOrderReport.zul:41 +#: libreplan-webapp/src/main/webapp/orders/_listOrderElementAdvances.zul:46 +#: libreplan-webapp/src/main/webapp/orders/_listOrderElementAdvances.zul:69 +#: libreplan-webapp/src/main/webapp/orders/_listOrderElementAdvances.zul:87 +#: libreplan-webapp/src/main/webapp/orders/_listOrderElementHours.zul:32 +msgid "Date" +msgstr "Data" + +#: libreplan-webapp/src/main/java/org/libreplan/web/workreports/WorkReportTypeModel.java:375 +msgid "the name must be not null or not empty" +msgstr "Nazwa nie może być zerowa lub pusta" + +#: libreplan-webapp/src/main/webapp/orders/components/_orderElementTree.zul:42 +msgid "Add From Template" +msgstr "Dodaj z szablonu" + +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/taskedition/TaskPropertiesController.java:517 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/taskedition/TaskPropertiesController.java:555 +msgid "Assigned resources for this task will be deleted. Are you sure?" +msgstr "Przypisane zasoby na to zadanie zostaną usunięte. Jesteś pewien?" + +#: libreplan-webapp/src/main/java/org/libreplan/web/common/ConfigurationController.java:670 +msgid "" +"format prefix invalid. It cannot be empty or contain '_' or whitespaces." +msgstr "Format prefiksu jest nieprawidłowy. Nie może być pusty lub zawierać \"_\" lub spacje." + +#: libreplan-webapp/src/main/webapp/reports/hoursWorkedPerWorkerInAMonthReport.zul:41 +msgid "Filter by month" +msgstr "Filtruj według miesiąca" + +#: libreplan-webapp/src/main/java/org/libreplan/web/qualityforms/QualityFormCRUDController.java:321 +msgid "The quality form must have an item with 100% value to report progress" +msgstr "Formularz jakości musi mieć element z 100% wartością raportu pracy" + +#: libreplan-webapp/src/main/java/org/libreplan/web/resources/worker/CriterionsMachineController.java:361 +#: libreplan-webapp/src/main/java/org/libreplan/web/resources/worker/CriterionsController.java:351 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/criterionrequirements/AssignedCriterionRequirementController.java:322 +msgid "The criterion and its type cannot be null" +msgstr "Kryterium i jego typ nie może być zerowy" + +#: libreplan-webapp/src/main/java/org/libreplan/web/materials/UnitTypeController.java:156 +msgid "The code is not valid. There is another unit type with the same code" +msgstr "Kod jest nie prawidłowy. Jest jeszcze jeden typ jednostki z tym samym kodem." + +#: libreplan-webapp/src/main/java/org/libreplan/web/reports/HoursWorkedPerWorkerInAMonthController.java:44 +msgid "July" +msgstr "Lipiec" + +#: libreplan-webapp/src/main/webapp/common/configuration.zul:255 +msgid "Enable LDAP authentication" +msgstr "Włącz uwierzytelnianie LDAP" + +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/consolidations/AdvanceConsolidationModel.java:490 +msgid "( max: {0} )" +msgstr "( max: {0} )" + +#: libreplan-webapp/src/main/java/org/libreplan/web/workreports/WorkReportCRUDController.java:222 +msgid "Error on removing element: " +msgstr "Błąd przy usuwaniu elementów: " + +#: libreplan-webapp/src/main/java/org/libreplan/web/reports/HoursWorkedPerWorkerInAMonthController.java:43 +msgid "January" +msgstr "Styczeń" + +#: libreplan-webapp/src/main/webapp/limitingresources/manualAllocation.zul:54 +msgid "Select queue" +msgstr "Wybierz kolejkę" + +#: libreplan-webapp/src/main/webapp/planner/stretches_function.zul:60 +msgid "Cannot calculate charts for current data" +msgstr "Nie można obliczyć wykresów dla bieżących danych" + +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/ProjectDetailsController.java:176 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:1499 +msgid "project name already being used" +msgstr "nazwa projektu jest aktualnie w użyciu" + +#: libreplan-webapp/src/main/webapp/planner/taskpanels/_tabPanelSubcontract.zul:48 +msgid "Work description" +msgstr "Opis pracy" + +#: libreplan-webapp/src/main/webapp/templates/_materialAssignmentsBox.zul:59 +#: libreplan-webapp/src/main/webapp/orders/_assignmentsBox.zul:58 +msgid "Split assignment" +msgstr "Podział przypisania" + +#: libreplan-webapp/src/main/java/org/libreplan/web/scenarios/ScenarioModel.java:118 +msgid "You can not remove the default scenario called \"{0}\"" +msgstr "Nie można usunąć domyślnego scenariusza o nazwie \"{0}\"" + +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/consolidations/AdvanceConsolidationModel.java:519 +msgid "There are not any assigned progress to current task" +msgstr "Nie ma żadnego przydzielonego postępu do bieżącego zadania" + +#: libreplan-webapp/src/main/webapp/reports/workingProgressPerTaskReport.zul:180 +#: libreplan-webapp/src/main/webapp/reports/completedEstimatedHoursPerTask.zul:181 +#: libreplan-webapp/src/main/webapp/reports/orderCostsPerResource.zul:220 +#: libreplan-webapp/src/main/webapp/reports/hoursWorkedPerWorkerReport.zul:209 +#: libreplan-webapp/src/main/webapp/reports/hoursWorkedPerWorkerInAMonthReport.zul:88 +#: libreplan-webapp/src/main/webapp/reports/schedulingProgressPerOrderReport.zul:161 +#: libreplan-webapp/src/main/webapp/reports/workingArrangementsPerOrderReport.zul:188 +#: libreplan-webapp/src/main/webapp/reports/timeLineMaterialReport.zul:158 +msgid "direct link" +msgstr "bezpośredni odnośnik" + +#: libreplan-webapp/src/main/webapp/qualityforms/_editQualityForm.zul:111 +msgid "Down" +msgstr "W dół" + +#: libreplan-webapp/src/main/java/org/libreplan/web/workreports/WorkReportTypeCRUDController.java:844 +#: libreplan-webapp/src/main/java/org/libreplan/web/common/components/finders/OrderElementFilterEnum.java:36 +#: libreplan-webapp/src/main/java/org/libreplan/web/common/components/finders/TaskGroupFilterEnum.java:30 +#: libreplan-webapp/src/main/java/org/libreplan/web/common/components/finders/OrderFilterEnum.java:30 +#: libreplan-webapp/src/main/java/org/libreplan/web/common/components/finders/TaskElementFilterEnum.java:34 +#: libreplan-webapp/src/main/webapp/orders/_edition.zul:48 +#: libreplan-webapp/src/main/webapp/common/configuration.zul:122 +msgid "Label" +msgstr "Etykieta" + +#: libreplan-webapp/src/main/java/org/libreplan/web/tree/TreeController.java:987 +msgid "Value is not valid, taking into account the current list of HoursGroup" +msgstr "Wartość nie jest ważna, biorąc pod uwagę aktualną listę HoursGroup" + +#: libreplan-webapp/src/main/webapp/users/_editProfile.zul:51 +#: libreplan-webapp/src/main/webapp/users/_editUser.zul:95 +msgid "Association with roles" +msgstr "Stowarzyszenie z ról" + +#: libreplan-webapp/src/main/java/org/libreplan/ws/workreports/impl/WorkReportConverter.java:371 +msgid "missing type of work hours in a work report line" +msgstr "brakuje rodzaju godzin pracy w linii raportu pracy" + +#: libreplan-webapp/src/main/webapp/templates/_assignedQualityForms.zul:30 +msgid "Quality forms" +msgstr "Formy jakości" + +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/SaveCommandBuilder.java:497 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/SaveCommandBuilder.java:507 +msgid "Repeated Hours Group code {0} in Project {1}" +msgstr "Kod grupy godzin powtarza się w {0} w projekcie {1}" + +#: libreplan-webapp/src/main/webapp/orders/_listOrderElementCriterionRequirements.zul:144 +msgid "Hours group" +msgstr "Grupa godzin" + +#: libreplan-webapp/src/main/webapp/users/users.zul:23 +msgid "LibrePlan: Accounts" +msgstr "LibrePlan: Konta" + +#: libreplan-webapp/src/main/webapp/templates/templates.zul:97 +#: libreplan-webapp/src/main/webapp/templates/_list.zul:30 +msgid "Days from Beginning to Deadline" +msgstr "Dni od początku do terminu końcowego" + +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/chart/EarnedValueChartFiller.java:128 +msgid "Estimate At Completion" +msgstr "Szacowane na zakończenie" + +#: libreplan-business/src/main/java/org/libreplan/business/costcategories/entities/ResourcesCostCategoryAssignment.java:102 +msgid "cost assignment's start date not specified" +msgstr "nie podano kosztów przypisanych do daty startu" + +#: libreplan-webapp/src/main/java/org/libreplan/web/calendars/BaseCalendarEditionController.java:1195 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/CriterionRequirementWrapper.java:45 +msgid "Direct" +msgstr "Bezpośredni" + +#: libreplan-webapp/src/main/java/org/libreplan/web/workreports/WorkReportCRUDController.java:828 +#: libreplan-webapp/src/main/java/org/libreplan/web/tree/TreeComponent.java:104 +#: libreplan-webapp/src/main/webapp/planner/stretches_function.zul:51 +#: libreplan-webapp/src/main/webapp/planner/taskpanels/_tabPanelNonLimitingResourceAllocation.zul:86 +#: libreplan-webapp/src/main/webapp/calendars/_edition.zul:205 +#: libreplan-webapp/src/main/webapp/calendars/_edition.zul:257 +#: libreplan-webapp/src/main/webapp/calendars/_edition.zul:278 +#: libreplan-webapp/src/main/webapp/orders/_assignmentsBox.zul:34 +msgid "Op." +msgstr "Op." + +#: libreplan-webapp/src/main/webapp/montecarlo/_montecarlo.zul:44 +msgid "Pessimistic" +msgstr "Pesymistyczny" + +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/taskedition/TaskPropertiesController.java:385 +msgid "Limiting resource assignation" +msgstr "Ograniczenia ze wskazaniem zasobów" + +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/ManageOrderElementAdvancesController.java:1261 +msgid "" +"This progress can not be removed, because it is spread. It is necessary to " +"select another progress as spread." +msgstr "Postęp ten nie może być usunięty, ponieważ jest on rozprzestrzeniany. Konieczne jest, aby wybrać inny postęp jako rozprzestrzeniający się." + +#: libreplan-webapp/src/main/webapp/calendars/_edition.zul:131 +msgid "Work week" +msgstr "Tydzień pracy" + +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/allocation/streches/StretchesFunctionController.java:128 +msgid "You will lose the changes. Are you sure?" +msgstr "Stracisz zmiany. Jesteś pewien?" + +#: libreplan-webapp/src/main/webapp/externalcompanies/_listExternalCompanies.zul:28 +#: libreplan-webapp/src/main/webapp/externalcompanies/_editExternalCompany.zul:47 +msgid "Company ID" +msgstr "Identyfikator firmy" + +#: libreplan-webapp/src/main/java/org/libreplan/web/materials/UnitTypeController.java:129 +msgid "Unit type name cannot be empty" +msgstr "Nazwa typu jednostki nie może być pusta" + +#: libreplan-webapp/src/main/webapp/common/configuration.zul:42 +msgid "Entity sequences" +msgstr "Jednostka sekwencji" + +#: libreplan-webapp/src/main/webapp/templates/templates.zul:92 +#: libreplan-webapp/src/main/webapp/templates/_list.zul:28 +msgid "Delay from beginning (days)" +msgstr "Opóźnienie od początku (dni)" + +#: libreplan-webapp/src/main/java/org/libreplan/web/workreports/WorkReportCRUDController.java:324 +msgid "Resource cannot be null" +msgstr "Zasób nie może być zerowy" + +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/allocation/ResourceAllocationController.java:455 +msgid "Total Hours" +msgstr "Wszystkie godziny" + +#: libreplan-webapp/src/main/webapp/common/configuration.zul:385 +msgid "LibrePlan Role" +msgstr "Rola LibrePlan" + +#: libreplan-webapp/src/main/webapp/advance/advanceTypes.zul:36 +msgid "Create Progress Type" +msgstr "Stwórz typ procesu" + +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/allocation/streches/StretchesFunctionController.java:129 +msgid "Confirm cancel" +msgstr "Potwierdź anulowanie" + +#: libreplan-webapp/src/main/java/org/libreplan/web/common/CustomMenuController.java:344 +#: libreplan-webapp/src/main/webapp/reports/workingProgressPerTaskReport.zul:37 +msgid "Work And Progress Per Task" +msgstr "Praca i postęp na zadanie" + +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:1523 +msgid "project code already being used" +msgstr "Kod projektu jest aktualnie w użyciu" + +#: libreplan-webapp/src/main/webapp/orders/_edition.zul:40 +msgid "WBS (tasks)" +msgstr "WBS (zadania)" + +#: libreplan-webapp/src/main/java/org/libreplan/web/common/ConfigurationController.java:720 +msgid "Deleting sequence" +msgstr "Usuwanie sekwencji" + +#: libreplan-webapp/src/main/java/org/libreplan/web/materials/MaterialsController.java:299 +#: libreplan-webapp/src/main/java/org/libreplan/web/workreports/WorkReportCRUDController.java:1234 +#: libreplan-webapp/src/main/java/org/libreplan/web/costcategories/CostCategoryCRUDController.java:465 +#: libreplan-webapp/src/main/java/org/libreplan/web/costcategories/ResourcesCostCategoryAssignmentController.java:150 +#: libreplan-webapp/src/main/java/org/libreplan/web/calendars/BaseCalendarCRUDController.java:457 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/AssignedTaskQualityFormsToOrderElementController.java:208 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/criterionrequirements/AssignedCriterionRequirementController.java:264 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:844 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:879 +msgid "Error on showing removing element: " +msgstr "Błąd przy pokazywaniu usuniętego elementu: " + +#: libreplan-webapp/src/main/webapp/common/layout/template.zul:88 +msgid "Select scenario" +msgstr "Wybierz scenariusz" + +#: libreplan-webapp/src/main/webapp/settings/settings.zul:51 +msgid "Login" +msgstr "Zaloguj" + +#: libreplan-webapp/src/main/java/org/libreplan/ws/workreports/impl/WorkReportConverter.java:225 +msgid "missing work report code in a work report" +msgstr "brak kodu raportu pracy w raporcie pracy" + +#: libreplan-webapp/src/main/java/org/libreplan/web/resources/worker/WorkerCRUDController.java:296 +msgid "Edit Virtual Workers Group: {0}" +msgstr "Edytuj wirtualną grupę pracujących: {0}" + +#: libreplan-webapp/src/main/webapp/templates/_editTemplateWindow.zul:51 +msgid "Criterion requirement" +msgstr "Wymagania kryterium" + +#: libreplan-webapp/src/main/java/org/libreplan/web/calendars/BaseCalendarEditionController.java:1407 +msgid "Only the last activation period allows to delete end date." +msgstr "Tylko ostatni okres aktywacji pozwala usunąć datę końcową." + +#: libreplan-webapp/src/main/webapp/templates/_historicalStatistics.zul:63 +msgid "Maximum/minimum of worked hours in finished applications" +msgstr "Maksymalne/minimalne przepracowane godziny w gotowych aplikacjach" + +#: libreplan-webapp/src/main/java/org/libreplan/web/limitingresources/LimitingResourcesController.java:333 +msgid "Scheduling saved" +msgstr "Harmonogram zapisany" + +#: libreplan-webapp/src/main/webapp/workreports/workReport.zul:192 +#: libreplan-webapp/src/main/webapp/workreports/workReportQuery.zul:171 +#: libreplan-webapp/src/main/webapp/costcategories/_editCostCategory.zul:70 +#: libreplan-webapp/src/main/webapp/resources/_costCategoryAssignment.zul:28 +msgid "Add new row" +msgstr "Dodaj nowy wiersz" + +#: libreplan-webapp/src/main/java/org/libreplan/web/limitingresources/QueueComponent.java:492 +msgid "Move" +msgstr "Przenieś" + +#: libreplan-webapp/src/main/java/org/libreplan/web/users/settings/PasswordController.java:68 +msgid "Password saved" +msgstr "Hasło zostało zapisane" + +#: libreplan-webapp/src/main/java/org/libreplan/ws/resources/impl/ResourceConverter.java:224 +msgid "missing code in the resource calendar" +msgstr "brakuje kodu w kalendarzu zasobów" + +#: libreplan-webapp/src/main/webapp/planner/_legendLoadChartOrder.zul:34 +#: libreplan-webapp/src/main/webapp/planner/_legendLoadChartCompany.zul:29 +msgid "Overload" +msgstr "Przeciążony" + +#: libreplan-webapp/src/main/webapp/templates/_historicalAssignment.zul:30 +#: libreplan-webapp/src/main/webapp/templates/templates.zul:69 +msgid "Assignment log" +msgstr "Zalogowany przydział" + +#: libreplan-webapp/src/main/java/org/libreplan/web/common/CustomMenuController.java:334 +#: libreplan-webapp/src/main/webapp/workreports/_listWorkReportTypes.zul:22 +msgid "Work Report Models" +msgstr "Modele raportu pracy" + +#: libreplan-webapp/src/main/webapp/materials/materials.zul:73 +msgid "New" +msgstr "Nowy" + +#: libreplan-webapp/src/main/webapp/subcontract/reportAdvances.zul:48 +msgid "Date last progress measurement" +msgstr "Data ostatniego pomiaru postępu" + +#: libreplan-webapp/src/main/java/org/libreplan/web/templates/TemplatesTreeComponent.java:112 +msgid "Deadline (days since beggining project)" +msgstr "Ostateczny termin (dzień od poczatku projektu)" + +#: libreplan-webapp/src/main/webapp/externalcompanies/externalcompanies.zul:23 +msgid "LibrePlan: Companies" +msgstr "LibrePlan: Firmy" + +#: libreplan-webapp/src/main/webapp/subcontract/reportAdvances.zul:22 +msgid "LibrePlan: Progress Report" +msgstr "LibrePlan: raport postępu" + +#: libreplan-webapp/src/main/java/org/libreplan/web/calendars/BaseCalendarCRUDController.java:419 +msgid "" +"Calendar cannot be removed because it still has children. Some other " +"calendar is derived from this one." +msgstr "Kalendarz nie może być usunięty, ponieważ jest przypisany do czegoś innego. Jakiś inny kalendarz wywodzi się z tego." + +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/ManageOrderElementAdvancesController.java:925 +msgid "Value is not valid, the type must be not empty" +msgstr "Wartość nie jest prawidłowa, typ nie może być pusty" + +#: libreplan-business/src/main/java/org/libreplan/business/resources/entities/CriterionType.java:445 +msgid "criterion type name is already being used" +msgstr "Nazwa typu kryterium jest już używana" + +#: libreplan-webapp/src/main/java/org/libreplan/web/workreports/WorkReportCRUDController.java:331 +msgid "Task code cannot be null" +msgstr "Kod zadania nie może być zerowy" + +#: libreplan-webapp/src/main/java/org/libreplan/web/calendars/BaseCalendarEditionController.java:302 +msgid "Derived of calendar {0}" +msgstr "" + +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/consolidations/AdvanceConsolidationModel.java:517 +msgid "It is not allowed to consolidate progress." +msgstr "Konsolidacja postępu nie jest dozwolona." + +#: libreplan-webapp/src/main/webapp/planner/taskpanels/_tabPanelSubcontract.zul:27 +msgid "External company" +msgstr "Zewnętrzna firma" + +#: libreplan-webapp/src/main/webapp/workreports/workReport.zul:66 +#: libreplan-webapp/src/main/webapp/costcategories/_listTypesOfWorkHours.zul:30 +#: libreplan-webapp/src/main/webapp/costcategories/_listCostCategories.zul:28 +#: libreplan-webapp/src/main/webapp/users/_listUsers.zul:30 +#: libreplan-webapp/src/main/webapp/users/_editProfile.zul:61 +#: libreplan-webapp/src/main/webapp/users/_listProfiles.zul:27 +#: libreplan-webapp/src/main/webapp/users/_editUser.zul:108 +#: libreplan-webapp/src/main/webapp/users/_editUser.zul:129 +#: libreplan-webapp/src/main/webapp/orders/_listOrderElementAuthorizations.zul:44 +#: libreplan-webapp/src/main/webapp/orders/_listOrderElementAuthorizations.zul:68 +msgid "Actions" +msgstr "Akcje" + +#: libreplan-webapp/src/main/webapp/calendars/_edition.zul:130 +msgid "Exceptions" +msgstr "Wyjątki" + +#: libreplan-webapp/src/main/webapp/settings/settings.zul:32 +msgid "User settings" +msgstr "Ustawienia użytkownika" + +#: libreplan-webapp/src/main/webapp/workreports/workReportQuery.zul:80 +msgid "Start hour" +msgstr "Godzina startu" + +#: libreplan-webapp/src/main/webapp/orders/components/_listOrderElementMaterials.zul:127 +msgid "Assign materials" +msgstr "Przypisz materiały" + +#: libreplan-webapp/src/main/webapp/excetiondays/_listExceptionDayTypes.zul:33 +msgid "Over assignable" +msgstr "Ponad przypisywany" + +#: libreplan-webapp/src/main/java/org/libreplan/web/common/components/finders/ExternalCompanyBandboxFinder.java:51 +#: libreplan-webapp/src/main/webapp/resources/worker/_edition.zul:76 +#: libreplan-webapp/src/main/webapp/resources/worker/_list.zul:37 +#: libreplan-webapp/src/main/webapp/resources/criterions/_workers.zul:29 +msgid "ID" +msgstr "Identyfikator" + +#: libreplan-webapp/src/main/java/org/libreplan/web/common/components/bandboxsearch/BandboxMultipleSearch.java:231 +msgid "format filters are not valid" +msgstr "Formaty filtrów nie są prawidłowe" + +#: libreplan-webapp/src/main/java/org/libreplan/web/common/CustomMenuController.java:351 +msgid "Settings" +msgstr "Ustawienia" + +#: libreplan-webapp/src/main/java/org/libreplan/web/costcategories/CostCategoryCRUDController.java:346 +#: libreplan-webapp/src/main/java/org/libreplan/web/costcategories/ResourcesCostCategoryAssignmentController.java:181 +msgid "The init date cannot be empty" +msgstr "Data init nie może być pusta" + +#: libreplan-webapp/src/main/webapp/externalcompanies/_editExternalCompany.zul:90 +msgid "Our company password" +msgstr "Hasło naszej firmy" + +#: libreplan-webapp/src/main/java/org/libreplan/web/reports/CompletedEstimatedHoursPerTaskController.java:136 +#: libreplan-webapp/src/main/java/org/libreplan/web/reports/HoursWorkedPerWorkerController.java:307 +#: libreplan-webapp/src/main/java/org/libreplan/web/reports/OrderCostsPerResourceController.java:174 +#: libreplan-webapp/src/main/java/org/libreplan/web/reports/WorkingArrangementsPerOrderController.java:174 +#: libreplan-webapp/src/main/java/org/libreplan/web/reports/WorkingProgressPerTaskController.java:131 +msgid "This label has already been added." +msgstr "Ta etykieta została już dodana." + +#: libreplan-webapp/src/main/java/org/libreplan/ws/resources/impl/ResourceServiceREST.java:181 +#: libreplan-webapp/src/main/java/org/libreplan/web/common/IntegrationEntityModel.java:80 +msgid "Could not get code, please try again later" +msgstr "Nie można uzyskać kodu, spróbuj ponownie później" + +#: libreplan-webapp/src/main/java/org/libreplan/web/workreports/WorkReportTypeModel.java:394 +msgid "" +"Value is not valid.\n" +" Code cannot contain chars like '_'." +msgstr "Wartość nie jest prawidłowa.\n Kod nie może zawierać znaków takich jak \"_\"." + +#: libreplan-webapp/src/main/webapp/orders/_listOrderElementCriterionRequirements.zul:161 +msgid "Hours Group" +msgstr "Grupa godzin" + +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/TaskElementAdapter.java:1029 +msgid "Budget: {0}€, Consumed: {1}€ ({2}%)" +msgstr "" + +#: libreplan-webapp/src/main/java/org/libreplan/web/workreports/WorkReportTypeCRUDController.java:825 +msgid "Unallocated name" +msgstr "Nieprzydzielona nazwa" + +#: libreplan-webapp/src/main/java/org/libreplan/web/tree/TreeController.java:1041 +msgid "Move up" +msgstr "Przesuń w górę" + +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/chart/EarnedValueChartFiller.java:124 +msgid "BCWP" +msgstr "BCWP" + +#: libreplan-webapp/src/main/webapp/planner/taskpanels/_tabPanelSubcontract.zul:43 +msgid "Subcontract communication date" +msgstr "Data komunikacji podwykonawcy" + +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/tabs/MultipleTabsPlannerController.java:131 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/tabs/MultipleTabsPlannerController.java:134 +#: libreplan-webapp/src/main/java/org/libreplan/web/templates/OrderTemplatesController.java:301 +#: libreplan-webapp/src/main/java/org/libreplan/web/common/CustomMenuController.java:269 +#: libreplan-webapp/src/main/java/org/libreplan/web/common/CustomMenuController.java:367 +msgid "Scheduling" +msgstr "Planowanie" + +#: libreplan-webapp/src/main/webapp/orders/_edition.zul:128 +msgid "Dependencies have priority" +msgstr "Zależności mają pierwszeństwo" + +#: libreplan-webapp/src/main/java/org/libreplan/web/calendars/BaseCalendarCRUDController.java:518 +#: libreplan-webapp/src/main/java/org/libreplan/web/resources/worker/WorkerCRUDController.java:883 +#: libreplan-webapp/src/main/java/org/libreplan/web/common/BaseCRUDController.java:126 +msgid "Create {0}" +msgstr "Stwórz {0}" + +#: libreplan-webapp/src/main/java/org/libreplan/web/calendars/BaseCalendarEditionController.java:219 +msgid "Unlimited" +msgstr "Nieograniczony" + +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/chart/EarnedValueChartFiller.java:127 +msgid "Budget At Completion" +msgstr "Budżet na zakończenie" + +#: libreplan-webapp/src/main/webapp/orders/components/_listOrderElementLabels.zul:77 +msgid "Assign Label" +msgstr "Przypisz etykietę" + +#: libreplan-webapp/src/main/webapp/limitingresources/limitingResourcesLayout.zul:73 +msgid "Page up" +msgstr "Strona w górę" + +#: libreplan-webapp/src/main/webapp/orders/_projectDetails.zul:24 +msgid "Create new project" +msgstr "Stwórz nowy projekt" + +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/TaskElementAdapter.java:1026 +#: libreplan-webapp/src/main/java/org/libreplan/web/common/components/finders/TaskGroupFilterEnum.java:31 +#: libreplan-webapp/src/main/java/org/libreplan/web/common/components/finders/OrderFilterEnum.java:31 +#: libreplan-webapp/src/main/webapp/subcontract/subcontractedTasks.zul:53 +#: libreplan-webapp/src/main/webapp/subcontract/reportAdvances.zul:50 +#: libreplan-webapp/src/main/webapp/orders/_edition.zul:165 +#: libreplan-webapp/src/main/webapp/orders/_list.zul:35 +msgid "State" +msgstr "Stan" + +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrdersTreeComponent.java:90 +msgid "Must start after" +msgstr "Należy rozpocząć po" + +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/allocation/AdvancedAllocationController.java:1315 +msgid "Confirm change" +msgstr "Potwierdź zmianę" + +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:849 +msgid "You don't have permissions to edit this project" +msgstr "Nie masz uprawnień do edytowania tego projektu" + +#: libreplan-webapp/src/main/java/org/libreplan/web/workreports/WorkReportCRUDController.java:440 +#: libreplan-webapp/src/main/java/org/libreplan/web/costcategories/CostCategoryCRUDController.java:145 +msgid "" +"Type of hours is empty. Please, create some type of hours before proceeding" +msgstr "Rodzaj godzin jest pusty. Proszę stworzyć jakiś rodzaj godziny przed rozpoczęciem" + +#: libreplan-webapp/src/main/java/org/libreplan/ws/calendars/impl/CalendarConverter.java:192 +msgid "missing date in a calendar exception" +msgstr "Brak daty w wyjątku kalendarza" + +#: libreplan-webapp/src/main/java/org/libreplan/ws/workreports/impl/WorkReportConverter.java:108 +#: libreplan-webapp/src/main/java/org/libreplan/ws/workreports/impl/WorkReportConverter.java:172 +#: libreplan-webapp/src/main/java/org/libreplan/ws/workreports/impl/WorkReportConverter.java:437 +#: libreplan-webapp/src/main/java/org/libreplan/ws/workreports/impl/WorkReportConverter.java:502 +msgid "There is no resource with this ID" +msgstr "Nie ma zasobu z tym oznaczeniem" + +#: libreplan-webapp/src/main/java/org/libreplan/web/subcontract/ReportAdvancesController.java:198 +#: libreplan-webapp/src/main/java/org/libreplan/web/subcontract/SubcontractedTasksController.java:195 +msgid "Send" +msgstr "Prześlij" + +#: libreplan-webapp/src/main/webapp/common/layout/template.zul:104 +msgid "user" +msgstr "użytkownik" + +#: libreplan-webapp/src/main/webapp/materials/materials.zul:21 +msgid "LibrePlan: Materials" +msgstr "LibrePlan: Materiały" + +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderElementTreeModel.java:53 +#: libreplan-webapp/src/main/webapp/orders/components/_orderElementTree.zul:33 +msgid "New task" +msgstr "Nowe zadanie" + +#: libreplan-webapp/src/main/java/org/libreplan/web/users/UserCRUDController.java:197 +msgid "The password for a new user cannot be empty" +msgstr "Hasło dla nowego użytkownika nie może być puste" + +#: libreplan-webapp/src/main/webapp/externalcompanies/_listExternalCompanies.zul:31 +msgid "Associated user" +msgstr "Powiązany użytkownik" + +#: libreplan-webapp/src/main/webapp/costcategories/_listTypesOfWorkHours.zul:27 +msgid "Type name" +msgstr "Typ nazwy" + +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/advances/AdvanceAssignmentPlanningCommand.java:69 +msgid "Progress assignment" +msgstr "Przypisany postęp" + +#: libreplan-webapp/src/main/java/org/libreplan/web/reports/TimeLineRequiredMaterialController.java:205 +#: libreplan-webapp/src/main/java/org/libreplan/web/reports/SchedulingProgressPerOrderController.java:181 +#: libreplan-webapp/src/main/java/org/libreplan/web/resourceload/ResourceLoadController.java:689 +#: libreplan-business/src/main/java/org/libreplan/business/planner/entities/TaskStatusEnum.java:27 +msgid "All" +msgstr "Wszystko" + +#: libreplan-webapp/src/main/java/org/libreplan/web/limitingresources/LimitingResourcesController.java:463 +#: libreplan-business/src/main/java/org/libreplan/business/planner/entities/AssignmentFunction.java:77 +msgid "Manual" +msgstr "Ręcznie" + +#: libreplan-webapp/src/main/webapp/calendars/_list.zul:22 +msgid "Calendars List" +msgstr "Lista kalendarzy" + +#: libreplan-webapp/src/main/webapp/orders/_assignmentsBox.zul:28 +msgid "Receipt date" +msgstr "Data otrzymania" + +#: libreplan-webapp/src/main/java/org/libreplan/web/reports/SchedulingProgressPerOrderController.java:209 +msgid "Cannot be higher than Ending date" +msgstr "Nie może być wyższa niż data zakończenia" + +#: libreplan-webapp/src/main/webapp/calendars/_edition.zul:281 +msgid "Create activation period" +msgstr "Tworzenie okresu aktywacji" + +#: libreplan-webapp/src/main/webapp/resources/search/_resourceFilter.zul:31 +msgid "Personal details" +msgstr "Dane osobowe" + +#: libreplan-webapp/src/main/webapp/resources/worker/_list.zul:22 +msgid "Workers List" +msgstr "Lista pracowników" + +#: libreplan-webapp/src/main/java/org/libreplan/web/templates/OrderTemplatesController.java:375 +msgid "Delete project template. Are you sure?" +msgstr "Usuń szablon projektu. Jesteś pewien?" + +#: libreplan-webapp/src/main/java/org/libreplan/web/calendars/BaseCalendarEditionController.java:1193 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/CriterionRequirementWrapper.java:48 +#: libreplan-webapp/src/main/webapp/calendars/_edition.zul:229 +msgid "Inherited" +msgstr "Dziedziczone" + +#: libreplan-webapp/src/main/java/org/libreplan/web/limitingresources/LimitingResourcesController.java:521 +#: libreplan-webapp/src/main/java/org/libreplan/web/limitingresources/LimitingResourcesController.java:599 +msgid "" +"Cannot allocate selected element. There is not any queue that matches " +"resource allocation criteria at any interval of time" +msgstr "Nie można przydzielić wybranego elementu. Nie każda kolejka odpowiada kryteriom alokacji zasobów w dowolnym przedziale czasu" + +#: libreplan-webapp/src/main/java/org/libreplan/web/reports/HoursWorkedPerWorkerController.java:287 +#: libreplan-webapp/src/main/java/org/libreplan/web/resources/worker/WorkerCRUDController.java:872 +msgid "Worker" +msgstr "Pracownik" + +#: libreplan-webapp/src/main/java/org/libreplan/web/resources/criterion/CriterionsModel.java:217 +msgid "Criterion must be not-null" +msgstr "Kryterium nie może być puste" + +#: libreplan-webapp/src/main/java/org/libreplan/ws/resources/impl/ResourceConverter.java:161 +#: libreplan-business/src/main/java/org/libreplan/business/resources/entities/Criterion.java:300 +msgid "criterion name not specified" +msgstr "nie określono nazwy kryterium" + +#: libreplan-webapp/src/main/java/org/libreplan/web/advance/AdvanceTypeCRUDController.java:95 +msgid "Value is not valid, the default max value must not be empty " +msgstr "Wartość nie jest prawidłowa, domyślna wartość maksymalna nie może być pusta " + +#: libreplan-webapp/src/main/webapp/common/configuration.zul:362 +msgid "Role property" +msgstr "Rola nieruchomości" + +#: libreplan-webapp/src/main/webapp/limitingresources/manualAllocation.zul:25 +msgid "Manual allocation" +msgstr "Ręczny podział" + +#: libreplan-webapp/src/main/webapp/planner/_legendLoadChartOrder.zul:29 +msgid "External overload" +msgstr "Zewnętrzne przeciążenie" + +#: libreplan-webapp/src/main/webapp/orders/_listOrderElementAuthorizations.zul:33 +#: libreplan-webapp/src/main/webapp/orders/_listOrderElementAuthorizations.zul:58 +msgid "Authorize" +msgstr "Autoryzuj" + +#: libreplan-webapp/src/main/webapp/planner/taskpanels/_taskInformation.zul:47 +msgid "Recommended allocation" +msgstr "Zalecany podział" + +#: libreplan-webapp/src/main/webapp/common/configuration.zul:254 +msgid "Activation" +msgstr "Aktywacja" + +#: libreplan-webapp/src/main/java/org/libreplan/web/common/CustomMenuController.java:310 +msgid "Scenarios" +msgstr "Scenariusze" + +#: libreplan-webapp/src/main/java/org/libreplan/web/materials/MaterialsController.java:375 +msgid "Materials saved" +msgstr "Materiały zapisane" + +#: libreplan-webapp/src/main/java/org/libreplan/web/common/CustomMenuController.java:342 +#: libreplan-webapp/src/main/webapp/reports/hoursWorkedPerWorkerInAMonthReport.zul:37 +msgid "Total Worked Hours By Resource In A Month" +msgstr "Wszystkie przepracowane godziny przez zasoby w miesiącu" + +#: libreplan-webapp/src/main/java/org/libreplan/web/resourceload/ResourceLoadModel.java:672 +msgid "Other projects" +msgstr "Inne projekty" + +#: libreplan-webapp/src/main/webapp/limitingresources/limitingResourcesLayout.zul:111 +msgid "Tasks input buffer" +msgstr "Bufor wejściowy zadania" + +#: libreplan-webapp/src/main/java/org/libreplan/web/common/ConfigurationModel.java:173 +msgid "At least one {0} sequence must be active" +msgstr "Przynajmniej jedna {0} sekwencja musi być aktywna" + +#: libreplan-webapp/src/main/webapp/users/_listProfiles.zul:26 +#: libreplan-webapp/src/main/webapp/users/_editUser.zul:128 +#: libreplan-webapp/src/main/webapp/orders/_listOrderElementAuthorizations.zul:42 +#: libreplan-webapp/src/main/webapp/orders/_listOrderElementAuthorizations.zul:66 +msgid "Profile name" +msgstr "Nazwa profilu" + +#: libreplan-webapp/src/main/java/org/libreplan/web/print/CutyPrint.java:246 +msgid "Could open generated PDF" +msgstr "Może otworzyć wygenerowany plik PDF" + +#: libreplan-webapp/src/main/webapp/orders/_listHoursGroupCriterionRequirement.zul:107 +msgid "Disable Delete" +msgstr "Wyłącz Usuń" + +#: libreplan-webapp/src/main/java/org/libreplan/web/scenarios/TransferOrdersModel.java:144 +msgid "You should select a source scenario" +msgstr "Powinieneś wybrać źródłowy scenariusz" + +#: libreplan-webapp/src/main/java/org/libreplan/web/common/ConfigurationModel.java:168 +msgid "At least one {0} sequence is needed" +msgstr "Przynajmniej jedna {0} sekwencja jest potrzebna" + +#: libreplan-webapp/src/main/java/org/libreplan/web/common/CustomMenuController.java:345 +#: libreplan-webapp/src/main/webapp/reports/completedEstimatedHoursPerTask.zul:37 +msgid "Estimated/Planned Hours Per Task" +msgstr "Szacowany/Planowane godziny na zadanie" + +#: libreplan-webapp/src/main/webapp/costcategories/costCategory.zul:23 +msgid "LibrePlan: Cost Categories" +msgstr "LibrePlan: Kategorie kosztów" + +#: libreplan-webapp/src/main/java/org/libreplan/web/common/components/TwoWaySelector.java:68 +msgid "Assigned" +msgstr "Przydzielony" + +#: libreplan-webapp/src/main/webapp/common/configuration.zul:257 +msgid "Use LDAP roles" +msgstr "Użyj ról LDAP" + +#: libreplan-webapp/src/main/webapp/orders/_editOrderElement.zul:44 +msgid "Details" +msgstr "Detale" + +#: libreplan-webapp/src/main/webapp/materials/unitTypes.zul:21 +msgid "LibrePlan: Units" +msgstr "LibrePlan: Jednostki" + +#: libreplan-webapp/src/main/webapp/common/configuration.zul:104 +msgid "" +"Check this option to send this information to LibrePlan developers in order " +"to generate usage statistics" +msgstr "Sprawdź tą opcję aby wysłać informacje do deweloperów LibrePlan do generowania statystyk" + +#: libreplan-webapp/src/main/java/org/libreplan/web/subcontract/ReportAdvancesModel.java:219 +#: libreplan-webapp/src/main/java/org/libreplan/web/subcontract/SubcontractedTasksModel.java:179 +msgid "Error: {0}" +msgstr "Błąd: {0}" + +#: libreplan-webapp/src/main/webapp/subcontract/subcontractedTasks.zul:45 +msgid "Communication" +msgstr "Komunikacja" + +#: libreplan-webapp/src/main/webapp/resources/search/_resourceFilter.zul:36 +msgid "More options" +msgstr "Więcej opcji" + +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/TreeElementOperationsController.java:240 +msgid "Confirm create template" +msgstr "Potwierdź utworzony szablon" + +#: libreplan-webapp/src/main/webapp/calendars/_edition.zul:250 +msgid "Parent" +msgstr "Rodzic" + +#: libreplan-webapp/src/main/webapp/users/_editUser.zul:35 +msgid "" +"Password cannot be managed for LDAP users because LDAP authentication is " +"being used" +msgstr "Hasło nie powinno być zarządzane dla użytkowników Ldap ponieważ autentyczność Ldap jest już używana" + +#: libreplan-webapp/src/main/webapp/limitingresources/manualAllocation.zul:91 +msgid "Earliest date" +msgstr "Najwcześniejsza data" + +#: libreplan-webapp/src/main/java/org/libreplan/web/common/CustomMenuController.java:352 +msgid "Change Password" +msgstr "Zmień hasło" + +#: libreplan-webapp/src/main/webapp/reports/workingProgressPerTaskReport.zul:21 +msgid "LibrePlan: Work And Progress Per Task" +msgstr "LibrePlan: praca i postęp na zadanie" + +#: libreplan-webapp/src/main/webapp/scenarios/_edition.zul:48 +msgid "Projects" +msgstr "Projekty" + +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/OrderPlanningModel.java:1128 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:269 +msgid "Confirm exit dialog" +msgstr "Potwierdź okno wyjścia" + +#: libreplan-webapp/src/main/java/org/libreplan/web/common/converters/ConverterFactory.java:64 +msgid "Not found converter for {0}" +msgstr "Nie znaleziona konwertera dla {0}" + +#: libreplan-webapp/src/main/webapp/planner/taskpanels/_tabPanelSubcontract.zul:70 +msgid "Material assignments" +msgstr "Przydziały materiałów" + +#: libreplan-webapp/src/main/java/org/libreplan/web/reports/HoursWorkedPerWorkerInAMonthController.java:46 +msgid "December" +msgstr "Grudzień" + +#: libreplan-webapp/src/main/webapp/settings/changePassword.zul:35 +msgid "Change password" +msgstr "Zmień hasło" + +#: libreplan-webapp/src/main/java/org/libreplan/web/advance/AdvanceTypeCRUDController.java:81 +msgid "" +"Value is not valid, the Precision value must be less than the defalt max " +"value." +msgstr "Wartość nie jest prawidłowa, precyzyjna wartość musi być mniejsza od domyślnej wartości maksymalnej." + +#: libreplan-webapp/src/main/java/org/libreplan/web/workreports/WorkReportTypeCRUDController.java:832 +msgid "Text field" +msgstr "Pole tekstowe" + +#: libreplan-webapp/src/main/java/org/libreplan/web/resources/criterion/CriterionAdminController.java:97 +msgid "Question" +msgstr "Pytanie" + +#: libreplan-webapp/src/main/webapp/calendars/_createNewVersion.zul:23 +#: libreplan-webapp/src/main/webapp/calendars/_edition.zul:237 +msgid "Create new work week" +msgstr "Stwórz nowy tydzień pracy" + +#: libreplan-webapp/src/main/java/org/libreplan/web/resources/worker/WorkerCRUDController.java:698 +#: libreplan-business/src/main/java/org/libreplan/business/resources/entities/ResourceType.java:34 +msgid "LIMITING RESOURCE" +msgstr "Ograniczenia zasobu" + +#: libreplan-webapp/src/main/webapp/subcontract/subcontractedTasks.zul:43 +msgid "Subcontratation" +msgstr "Pod wykonywany" + +#: libreplan-webapp/src/main/java/org/libreplan/web/materials/UnitTypeController.java:135 +msgid "" +"The meausure name is not valid. There is another unit type with the same " +"measure name" +msgstr "Nazwa mierzenia nie jest ważna. Jest jeszcze jeden typ jednostki o tej samej nazwie mierzenia" + +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/allocation/AllocationRow.java:590 +msgid "{0} cannot be fulfilled" +msgstr "{0} nie mogą być spełnione" + +#: libreplan-webapp/src/main/webapp/planner/taskpanels/_tabPanelNonLimitingResourceAllocation.zul:69 +msgid "Extended view" +msgstr "Rozwinięty widok" + +#: libreplan-webapp/src/main/webapp/resources/worker/_edition.zul:34 +msgid "Work record" +msgstr "Zapis pracy" + +#: libreplan-webapp/src/main/webapp/reports/workingProgressPerTaskReport.zul:166 +#: libreplan-webapp/src/main/webapp/reports/completedEstimatedHoursPerTask.zul:167 +#: libreplan-webapp/src/main/webapp/reports/orderCostsPerResource.zul:204 +#: libreplan-webapp/src/main/webapp/reports/hoursWorkedPerWorkerReport.zul:197 +#: libreplan-webapp/src/main/webapp/reports/hoursWorkedPerWorkerInAMonthReport.zul:74 +#: libreplan-webapp/src/main/webapp/reports/schedulingProgressPerOrderReport.zul:147 +#: libreplan-webapp/src/main/webapp/reports/workingArrangementsPerOrderReport.zul:174 +#: libreplan-webapp/src/main/webapp/reports/timeLineMaterialReport.zul:145 +msgid "Output format" +msgstr "Wyjściowy format" + +#: libreplan-webapp/src/main/webapp/planner/print_configuration.zul:49 +msgid "Print" +msgstr "Wydrukuj" + +#: libreplan-webapp/src/main/java/org/libreplan/web/resources/criterion/CriterionsModel.java:179 +msgid "{0} not found type for criterion " +msgstr "{0} nie znaleziono typu dla kryterium " + +#: libreplan-webapp/src/main/webapp/limitingresources/limitingResourcesLayout.zul:68 +msgid "Page down" +msgstr "Strona w dół" + +#: libreplan-business/src/main/java/org/libreplan/business/resources/entities/CriterionType.java:486 +msgid "resource type does not allow enabled criteria" +msgstr "typ zasobu nie zezwala na włączenia kryteria" + +#: libreplan-webapp/src/main/java/org/libreplan/web/workreports/WorkReportCRUDController.java:416 +msgid "Effort cannot be null" +msgstr "Wysiłek nie może być pusty" + +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/OrderPlanningModel.java:1119 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/assigntemplates/TemplateFinderPopup.java:126 +#: libreplan-webapp/src/main/webapp/labels/_editLabelType.zul:116 +#: libreplan-webapp/src/main/webapp/excetiondays/_editExceptionDayType.zul:97 +#: libreplan-webapp/src/main/webapp/externalcompanies/_editExternalCompany.zul:106 +#: libreplan-webapp/src/main/webapp/materials/unitTypes.zul:41 +#: libreplan-webapp/src/main/webapp/workreports/workReport.zul:211 +#: libreplan-webapp/src/main/webapp/workreports/workReportTypes.zul:38 +#: libreplan-webapp/src/main/webapp/workreports/workReportQuery.zul:191 +#: libreplan-webapp/src/main/webapp/scenarios/_edition.zul:70 +#: libreplan-webapp/src/main/webapp/costcategories/_editCostCategory.zul:98 +#: libreplan-webapp/src/main/webapp/costcategories/_editTypeOfWorkHours.zul:80 +#: libreplan-webapp/src/main/webapp/qualityforms/_editQualityForm.zul:137 +#: libreplan-webapp/src/main/webapp/planner/print_configuration.zul:50 +#: libreplan-webapp/src/main/webapp/planner/editTask.zul:81 +#: libreplan-webapp/src/main/webapp/planner/reassign.zul:50 +#: libreplan-webapp/src/main/webapp/planner/stretches_function.zul:91 +#: libreplan-webapp/src/main/webapp/planner/advance_allocation.zul:42 +#: libreplan-webapp/src/main/webapp/planner/order.zul:131 +#: libreplan-webapp/src/main/webapp/planner/order.zul:166 +#: libreplan-webapp/src/main/webapp/users/_editProfile.zul:74 +#: libreplan-webapp/src/main/webapp/users/_editUser.zul:155 +#: libreplan-webapp/src/main/webapp/templates/templates.zul:147 +#: libreplan-webapp/src/main/webapp/calendars/_createNewVersion.zul:58 +#: libreplan-webapp/src/main/webapp/calendars/calendars.zul:47 +#: libreplan-webapp/src/main/webapp/resources/machine/_editMachine.zul:103 +#: libreplan-webapp/src/main/webapp/resources/criterions/criterions.zul:45 +#: libreplan-webapp/src/main/webapp/resources/criterions/_edition.zul:94 +#: libreplan-webapp/src/main/webapp/resources/criterions/_workers.zul:49 +#: libreplan-webapp/src/main/webapp/orders/_projectDetails.zul:89 +#: libreplan-webapp/src/main/webapp/orders/components/_listOrderElementMaterials.zul:129 +#: libreplan-webapp/src/main/webapp/limitingresources/manualAllocation.zul:135 +#: libreplan-webapp/src/main/webapp/common/layout/template.zul:100 +#: libreplan-webapp/src/main/webapp/common/configuration.zul:398 +msgid "Cancel" +msgstr "Anuluj" + +#: libreplan-webapp/src/main/webapp/users/_editUser.zul:38 +msgid "General user data" +msgstr "Ogólne dane użytkownika" + +#: libreplan-webapp/src/main/webapp/common/components/schedulingStateToggler.zul:32 +msgid "Unschedule" +msgstr "Nieplanowany" + +#: libreplan-webapp/src/main/java/org/libreplan/web/subcontract/SubcontractedTasksController.java:204 +msgid "Subcontracted task sent successfully" +msgstr "Podwykonawstwo zadania pomyślnie wysłano" + +#: libreplan-webapp/src/main/webapp/planner/stretches_function.zul:77 +msgid "Accumulated hours chart" +msgstr "Skumulowany wykres godzin" + +#: libreplan-webapp/src/main/webapp/resources/machine/_listMachines.zul:22 +msgid "Machines List" +msgstr "Lista maszyn" + +#: libreplan-webapp/src/main/java/org/libreplan/web/resourceload/ResourceLoadController.java:320 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:696 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:908 +msgid "You don't have read access to this project" +msgstr "Nie masz dostępu do odczytania tego projektu" + +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/chart/EarnedValueChartFiller.java:130 +msgid "CPI" +msgstr "CPI" + +#: libreplan-webapp/src/main/java/org/libreplan/web/resources/criterion/CriterionAdminController.java:96 +msgid "" +"Disable hierarchy will cause criteria tree to be flattened. Are you sure?" +msgstr "Wyłączenie hierarchii spowoduje spłaszczenie drzewa kryteriów. Jesteś pewien?" + +#: libreplan-webapp/src/main/webapp/reports/orderCostsPerResource.zul:48 +#: libreplan-webapp/src/main/webapp/reports/hoursWorkedPerWorkerReport.zul:41 +#: libreplan-webapp/src/main/webapp/reports/timeLineMaterialReport.zul:43 +msgid "Dates" +msgstr "Daty" + +#: libreplan-webapp/src/main/webapp/templates/_materialAssignmentsBox.zul:29 +#: libreplan-webapp/src/main/webapp/orders/_assignmentsBox.zul:29 +#: libreplan-webapp/src/main/webapp/orders/_splitMaterialAssignmentDlg.zul:38 +msgid "Units" +msgstr "Jednostki" + +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/allocation/streches/StretchesFunctionModel.java:168 +msgid "At least one stretch is needed" +msgstr "Przynajmniej jeden odcinek jest potrzebny" + +#: libreplan-webapp/src/main/java/org/libreplan/ws/calendars/impl/CalendarConverter.java:307 +msgid "a day is not valid" +msgstr "dzień nie jest ważny" + +#: libreplan-webapp/src/main/webapp/reports/orderCostsPerResource.zul:21 +msgid "LibrePlan: Project Costs Per Resource" +msgstr "LibrePlan: Koszty projektu Na Zasób" + +#: libreplan-webapp/src/main/webapp/common/configuration.zul:87 +msgid "Autocomplete login form" +msgstr "Auto uzupełniający formularz logowania" + +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/taskedition/TaskPropertiesCommand.java:61 +msgid "Task Properties" +msgstr "Właściwości zadania" + +#: libreplan-webapp/src/main/webapp/workreports/workReportQuery.zul:51 +msgid "hours type" +msgstr "typ godzin" + +#: libreplan-webapp/src/main/webapp/reports/workingArrangementsPerOrderReport.zul:21 +msgid "LibrePlan: Task Scheduling Status In Project" +msgstr "LibrePlan: Status Planowania zadań w Projekcie" + +#: libreplan-webapp/src/main/java/org/libreplan/web/resources/worker/CriterionsMachineController.java:214 +#: libreplan-webapp/src/main/java/org/libreplan/web/resources/worker/CriterionsController.java:237 +#: libreplan-webapp/src/main/java/org/libreplan/web/resources/machine/MachineConfigurationController.java:222 +msgid "" +"End date is not valid, the new end date must be greater than the start date" +msgstr "Data zakończenia nie jest ważna, nowy termin końcowy musi być większy od daty rozpoczęcia" + +#: libreplan-webapp/src/main/webapp/qualityforms/_listQualityForm.zul:27 +msgid "name" +msgstr "nazwa" + +#: libreplan-webapp/src/main/webapp/orders/components/_orderElementTree.zul:75 +msgid "Delete selected task" +msgstr "Usuń wybrane zadanie" + +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/ManageOrderElementAdvancesModel.java:129 +msgid "{0} (max: {1})" +msgstr "{0} (max: {1})" + +#: libreplan-webapp/src/main/java/org/libreplan/web/costcategories/CostCategoryCRUDController.java:529 +msgid "Cost Category" +msgstr "Kategoria kosztów" + +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderElementTreeController.java:473 +msgid "end" +msgstr "zakończenie" + +#: libreplan-webapp/src/main/webapp/common/configuration.zul:369 +msgid "Role search query" +msgstr "Wyszukiwana rola" + +#: libreplan-webapp/src/main/webapp/resources/worker/_localizations.zul:63 +msgid "Log" +msgstr "Log" + +#: libreplan-webapp/src/main/webapp/orders/_edition.zul:57 +msgid "Authorizations" +msgstr "Autoryzacje" + +#: libreplan-webapp/src/main/webapp/common/concurrent_modification.zul:36 +#: libreplan-webapp/src/main/webapp/common/event_error.zul:49 +msgid "Continue" +msgstr "Kontynuuj" + +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderElementController.java:122 +msgid "Edit task {0}" +msgstr "Edytuj zadanie {0}" + +#: libreplan-webapp/src/main/java/org/libreplan/web/resources/worker/CriterionsMachineController.java:236 +#: libreplan-webapp/src/main/java/org/libreplan/web/resources/worker/CriterionsController.java:210 +msgid "Start date cannot be null" +msgstr "Data rozpoczęcia nie może być pusta" + +#: libreplan-webapp/src/main/java/org/libreplan/web/common/CustomMenuController.java:304 +msgid "Subcontracting" +msgstr "Podwykonawstwo" + +#: libreplan-webapp/src/main/java/org/libreplan/web/resources/criterion/CriterionTreeController.java:328 +msgid "references" +msgstr "referencje" + +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/allocation/GenericAllocationRow.java:55 +msgid "Generic" +msgstr "Ogólny" + +#: libreplan-webapp/src/main/webapp/orders/_projectDetails.zul:42 +msgid "Template" +msgstr "Szablon" + +#: libreplan-webapp/src/main/webapp/advance/_editAdvanceTypes.zul:49 +msgid "Default max value" +msgstr "Domyślna maksymalna wartość" + +#: libreplan-webapp/src/main/webapp/orders/_listOrderElementCriterionRequirements.zul:36 +msgid "Add criterion requirement" +msgstr "Dodaj wymagania kryterium" + +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:864 +msgid "" +"You can not remove the project \"{0}\" because of any of its tasks are " +"already in use in some work reports and the project just exists in the " +"current scenario" +msgstr "Nie można usunąć projektu \"{0}\", ponieważ każdy z jego zadań jest już w użyciu w niektórych raportach prac oraz projekt już istnieje w aktualnym scenariuszu" + +#: libreplan-webapp/src/main/webapp/orders/_listOrderElementHours.zul:86 +msgid "Percentage of estimated budget hours / hours consumed" +msgstr "Procentowe szacowane godziny budżetowe / godziny zużyte" + +#: libreplan-webapp/src/main/java/org/libreplan/web/limitingresources/LimitingResourcesController.java:502 +msgid "Automatic" +msgstr "Automatyczny" + +#: libreplan-webapp/src/main/java/org/libreplan/web/common/components/finders/CriterionBandboxFinder.java:44 +msgid "Criterion Name" +msgstr "Nazwa kryterium" + +#: libreplan-webapp/src/main/java/org/libreplan/web/common/components/finders/OrderElementBandboxFinder.java:52 +#: libreplan-webapp/src/main/webapp/workreports/_editWorkReportType.zul:93 +#: libreplan-webapp/src/main/webapp/orders/_orderElementTreeFilter.zul:23 +#: libreplan-webapp/src/main/webapp/limitingresources/limitingResourcesLayout.zul:133 +#: libreplan-webapp/src/main/webapp/montecarlo/_montecarlo.zul:48 +msgid "Task" +msgstr "Zadanie" + +#: libreplan-webapp/src/main/webapp/settings/changePassword.zul:21 +msgid "LibrePlan: Change password" +msgstr "LibrePlan: Zmień hasło" + +#: libreplan-webapp/src/main/java/org/libreplan/web/reports/CompletedEstimatedHoursPerTaskController.java:130 +#: libreplan-webapp/src/main/java/org/libreplan/web/reports/HoursWorkedPerWorkerController.java:302 +#: libreplan-webapp/src/main/java/org/libreplan/web/reports/OrderCostsPerResourceController.java:169 +#: libreplan-webapp/src/main/java/org/libreplan/web/reports/WorkingArrangementsPerOrderController.java:168 +#: libreplan-webapp/src/main/java/org/libreplan/web/reports/WorkingProgressPerTaskController.java:125 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/labels/AssignedLabelsController.java:85 +msgid "please, select a label" +msgstr "proszę wybrać etykietę" + +#: libreplan-webapp/src/main/webapp/users/_editUser.zul:123 +msgid "Add profile" +msgstr "Dodaj profil" + +#: libreplan-webapp/src/main/webapp/scenarios/scenarios.zul:23 +msgid "LibrePlan: Scenarios Management" +msgstr "LibrePlan: Zarządzanie Scenariuszami" + +#: libreplan-webapp/src/main/java/org/libreplan/ws/calendars/impl/CalendarConverter.java:225 +msgid "missing code in a calendar data version" +msgstr "brak kodu w wersji danych kalendarza" + +#: libreplan-webapp/src/main/java/org/libreplan/web/common/components/bandboxsearch/BandboxMultipleSearch.java:220 +msgid "filter already exists" +msgstr "filtr już istnieje" + +#: libreplan-webapp/src/main/webapp/resources/_criterions.zul:40 +#: libreplan-webapp/src/main/webapp/orders/_listHoursGroupCriterionRequirement.zul:27 +#: libreplan-webapp/src/main/webapp/orders/_listOrderElementCriterionRequirements.zul:46 +msgid "Criterion name" +msgstr "Nazwa kryterium" + +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/ManageOrderElementAdvancesController.java:126 +msgid "values are not valid, the values must not be null" +msgstr "wartości nie są ważne, wartości nie mogą być puste" + +#: libreplan-webapp/src/main/webapp/planner/advance_allocation.zul:41 +msgid "Apply changes and go back to scheduling" +msgstr "Zastosuj zmiany i powróć do planowania" + +#: libreplan-webapp/src/main/webapp/workreports/workReportQuery.zul:78 +#: libreplan-webapp/src/main/webapp/subcontract/subcontractedTasks.zul:50 +#: libreplan-webapp/src/main/webapp/orders/_orderElementDetails.zul:32 +msgid "Task name" +msgstr "Nazwa zadania" + +#: libreplan-business/src/main/java/org/libreplan/business/costcategories/entities/ResourcesCostCategoryAssignment.java:128 +msgid "cost assignment's resource not specified" +msgstr "nie podano przypisanych kosztów zasobu" + +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:129 +#: libreplan-webapp/src/main/java/org/libreplan/web/common/components/finders/OrderElementBandboxFinder.java:51 +#: libreplan-webapp/src/main/webapp/reports/workingProgressPerTaskReport.zul:64 +#: libreplan-webapp/src/main/webapp/reports/workingArrangementsPerOrderReport.zul:45 +#: libreplan-webapp/src/main/webapp/limitingresources/limitingResourcesLayout.zul:132 +#: libreplan-business/src/main/java/org/libreplan/business/templates/entities/OrderTemplate.java:68 +msgid "Project" +msgstr "Projekt" + +#: libreplan-webapp/src/main/java/org/libreplan/web/common/components/TwoWaySelector.java:79 +msgid "Unassigned" +msgstr "Nieprzypisany" + +#: libreplan-webapp/src/main/webapp/resources/machine/_machineConfigurationUnits.zul:102 +msgid "Add new criterion requirement" +msgstr "Dodaj nowy wymóg kryterium" + +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/chart/EarnedValueChartFiller.java:124 +msgid "Budgeted Cost Work Performed" +msgstr "Budżet kosztów wykonywanej pracy" + +#: libreplan-webapp/src/main/webapp/common/layout/template.zul:138 +msgid "Change the password" +msgstr "Zmień hasło" + +#: libreplan-webapp/src/main/webapp/common/configuration.zul:128 +msgid "Work report" +msgstr "Raport pracy" + +#: libreplan-webapp/src/main/java/org/libreplan/web/templates/OrderTemplatesModel.java:302 +msgid "the name must be not empty" +msgstr "Nazwa nie może być pusta" + +#: libreplan-webapp/src/main/webapp/materials/materials.zul:85 +#: libreplan-webapp/src/main/webapp/users/_listUsers.zul:27 +#: libreplan-webapp/src/main/webapp/users/_editUser.zul:75 +msgid "Disabled" +msgstr "Wyłączony" + +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/OrderPlanningModel.java:764 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/company/CompanyPlanningModel.java:322 +msgid "Earned value" +msgstr "Wartość wypracowana" + +#: libreplan-webapp/src/main/webapp/excetiondays/_listExceptionDayTypes.zul:35 +#: libreplan-webapp/src/main/webapp/calendars/_edition.zul:163 +msgid "Overtime Effort" +msgstr "Wysiłek w godzinach nadliczbowych" + +#: libreplan-webapp/src/main/webapp/calendars/_edition.zul:231 +msgid "Inherited from parent calendar" +msgstr "Dziedziczone z kalendarza głównego" + +#: libreplan-webapp/src/main/webapp/calendars/_edition.zul:161 +#: libreplan-webapp/src/main/webapp/calendars/_edition.zul:199 +#: libreplan-webapp/src/main/webapp/calendars/_edition.zul:225 +msgid "Normal Effort" +msgstr "Normalny wysiłek" + +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/reassign/ReassignCommand.java:138 +msgid "{0} reassignations finished" +msgstr "{0} zakończono ponowne przypisanie" + +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/TreeElementOperationsController.java:250 +msgid "" +"Templates can only be created out of existent tasks.You are trying to create a template out of a new task.\n" +"Please save your project before proceeding." +msgstr "Szablony mogą być tworzone wyłącznie z istniejących zadań. Próbujesz utworzyć szablon poza nowym zadaniem.\nProszę zapisać projekt przed rozpoczęciem." + +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/TaskElementAdapter.java:1243 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/TaskElementAdapter.java:1258 +msgid "{0} not supported yet" +msgstr "{0} nie jest jeszcze obsługiwany" + +#: libreplan-webapp/src/main/webapp/common/layout/login.zul:143 +msgid "is not supported for its use with LibrePlan." +msgstr "nie jest wspierany przez używanie tego w LibrePlan." + +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/ManageOrderElementAdvancesController.java:1321 +msgid "" +"Date is not valid, it must be greater than the last progress consolidation" +msgstr "Data nie jest prawidłowa, musi być większa niż ostatni postęp konsolidacji" + +#: libreplan-webapp/src/main/webapp/resources/worker/_workRelationships.zul:53 +msgid "New entry" +msgstr "Nowy wpis" + +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/tabs/ResourcesLoadTabCreator.java:100 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/tabs/ResourcesLoadTabCreator.java:109 +msgid "Resources Load" +msgstr "Obciążenie zasobów" + +#: libreplan-webapp/src/main/java/org/libreplan/web/common/ConfigurationModel.java:225 +msgid "Some sequences to remove not existed" +msgstr "Niektóre sekwencje do usunięcia nie istnieją" + +#: libreplan-webapp/src/main/java/org/libreplan/web/common/ConfigurationController.java:233 +msgid "Changes have been canceled" +msgstr "Zmiany zostały anulowane" + +#: libreplan-webapp/src/main/webapp/reports/hoursWorkedPerWorkerInAMonthReport.zul:21 +msgid "LibrePlan: Hours Worked Per Worker In A Month" +msgstr "LibrePlan: godziny Przepracowane na jednego pracownika w ciągu miesiąca" + +#: libreplan-webapp/src/main/webapp/common/configuration.zul:312 +msgid "Authentication" +msgstr "Uwierzytelnianie" + +#: libreplan-webapp/src/main/java/org/libreplan/web/reports/HoursWorkedPerWorkerInAMonthController.java:44 +msgid "March" +msgstr "Marzec" + +#: libreplan-webapp/src/main/webapp/settings/settings.zul:85 +msgid "Select language" +msgstr "Wybierz język" + +#: libreplan-webapp/src/main/webapp/limitingresources/manualAllocation.zul:104 +msgid "Appropriative allocation" +msgstr "Odpowiednia alokacja" + +#: libreplan-webapp/src/main/webapp/orders/_listOrderElementCriterionRequirements.zul:31 +msgid "Assigned criterion requirements" +msgstr "Przypisane wymagane kryterium" + +#: libreplan-webapp/src/main/webapp/reports/workingProgressPerTaskReport.zul:115 +#: libreplan-webapp/src/main/webapp/reports/completedEstimatedHoursPerTask.zul:115 +#: libreplan-webapp/src/main/webapp/reports/orderCostsPerResource.zul:153 +#: libreplan-webapp/src/main/webapp/reports/hoursWorkedPerWorkerReport.zul:144 +#: libreplan-webapp/src/main/webapp/reports/workingArrangementsPerOrderReport.zul:123 +msgid "Filter by criteria" +msgstr "Filtruj według kryteriów" + +#: libreplan-webapp/src/main/webapp/templates/_advances.zul:37 +#: libreplan-webapp/src/main/webapp/orders/_listOrderElementAdvances.zul:43 +msgid "Max value" +msgstr "Maksymalna wartość" + +#: libreplan-webapp/src/main/webapp/scenarios/_list.zul:22 +msgid "Scenarios List" +msgstr "Lista scenariuszy" + +#: libreplan-webapp/src/main/java/org/libreplan/web/advance/AdvanceTypeCRUDController.java:115 +msgid "The name is not valid, the name must not be null " +msgstr "Nazwa nie jest ważna, nazwa nie może być pusta " + +#: libreplan-webapp/src/main/webapp/limitingresources/limitingResourcesLayout.zul:136 +msgid "Hours to allocate" +msgstr "Godziny do przydziału" + +#: libreplan-webapp/src/main/java/org/libreplan/web/costcategories/ResourcesCostCategoryAssignmentController.java:115 +msgid "A category must be selected" +msgstr "Kategoria musi być wybrana" + +#: libreplan-webapp/src/main/webapp/calendars/_edition.zul:149 +msgid "Period" +msgstr "Okres" + +#: libreplan-webapp/src/main/webapp/templates/_advances.zul:38 +#: libreplan-webapp/src/main/webapp/orders/_listOrderElementAdvances.zul:47 +msgid "Spread" +msgstr "Rozprzestrzenianie" + +#: libreplan-webapp/src/main/webapp/limitingresources/manualAllocation.zul:93 +msgid "Select start date" +msgstr "Wybierz datę rozpoczęcia" + +#: libreplan-webapp/src/main/java/org/libreplan/web/costcategories/TypeOfWorkHoursCRUDController.java:106 +#: libreplan-webapp/src/main/java/org/libreplan/web/users/ProfileCRUDController.java:157 +msgid "Error on showing warning message removing typeOfWorkHours: " +msgstr "Błąd przy pokazywaniu usuwanych komunikatów ostrzegawczych typeOfWorkHours: " + +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:886 +msgid "Removed {0}" +msgstr "Usunięty {0}" + +#: libreplan-webapp/src/main/java/org/libreplan/web/resources/worker/WorkerCRUDController.java:803 +msgid "Confirm deleting this worker. Are you sure?" +msgstr "Potwierdź usunięcie tego pracownika. Czy na pewno?" + +#: libreplan-webapp/src/main/webapp/resources/worker/_edition.zul:64 +msgid "Group name" +msgstr "Nazwa grupy" + +#: libreplan-webapp/src/main/webapp/users/_editProfile.zul:60 +#: libreplan-webapp/src/main/webapp/users/_editUser.zul:107 +msgid "Role name" +msgstr "Nazwa roli" + +#: libreplan-webapp/src/main/java/org/libreplan/web/resources/worker/WorkerCRUDController.java:822 +msgid "This worker was already removed by other user" +msgstr "Ten pracownik został już usunięty przez innego użytkownika" + +#: libreplan-webapp/src/main/java/org/libreplan/web/workreports/WorkReportCRUDController.java:620 +msgid "Create Work Report" +msgstr "Stwórz raporty pracy" + +#: libreplan-webapp/src/main/java/org/libreplan/web/advance/AdvanceTypeCRUDController.java:75 +msgid "Value is not valid, the precision value must not be empty" +msgstr "Wartość nie jest prawidłowa, wartość dokładności nie może być pusta" + +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/OrderPlanningModel.java:889 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/company/CompanyPlanningModel.java:470 +msgid "h" +msgstr "h" + +#: libreplan-webapp/src/main/java/org/libreplan/web/limitingresources/QueueComponent.java:363 +msgid "Workable capacity for this period " +msgstr "Realne możliwości tego okresu " + +#: libreplan-webapp/src/main/java/org/libreplan/web/costcategories/CostCategoryCRUDController.java:150 +#: libreplan-webapp/src/main/java/org/libreplan/web/montecarlo/MonteCarloController.java:159 +msgid "Cannot be null or empty" +msgstr "Nie może być zerowa lub pusta" + +#: libreplan-webapp/src/main/java/org/libreplan/web/qualityforms/QualityFormCRUDController.java:339 +msgid "Quality Form" +msgstr "Formularz jakości" + +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/milestone/AddMilestoneCommand.java:67 +msgid "Add Milestone" +msgstr "Dodaj kamień milowy" + +#: libreplan-webapp/src/main/webapp/limitingresources/limitingResourcesLayout.zul:116 +msgid "Assign selected items" +msgstr "Przypisz wybrane elementy" + +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderElementTreeController.java:452 +msgid "init" +msgstr "init" + +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/ManageOrderElementAdvancesController.java:1238 +msgid "Add new progress measurement" +msgstr "Dodaj nowy pomiar postępów" + +#: libreplan-webapp/src/main/java/org/libreplan/web/limitingresources/LimitingResourcesController.java:532 +msgid "Select for automatic queuing" +msgstr "Wybierz automatyczne kolejkowanie" + +#: libreplan-webapp/src/main/java/org/libreplan/web/scenarios/TransferOrdersController.java:192 +msgid "Project {0} transfered" +msgstr "Projekt {0} przeniesiony" + +#: libreplan-webapp/src/main/java/org/libreplan/web/common/CustomMenuController.java:311 +msgid "Scenarios Management" +msgstr "Zarządzanie scenariuszami" + +#: libreplan-webapp/src/main/webapp/orders/components/_listOrderElementLabels.zul:96 +msgid "Create & Assign" +msgstr "Stwórz i przypisz" + +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/allocation/AdvancedAllocationController.java:1558 +msgid "Not configurable" +msgstr "Nie konfigurowalny" + +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/allocation/AdvancedAllocationCommand.java:47 +msgid "Advanced allocation" +msgstr "Zaawansowana alokacja" + +#: libreplan-webapp/src/main/webapp/planner/taskpanels/_tabPanelNonLimitingResourceAllocation.zul:93 +#: libreplan-webapp/src/main/webapp/planner/taskpanels/_tabPanelNonLimitingResourceAllocation.zul:96 +#: libreplan-webapp/src/main/webapp/planner/order.zul:108 +msgid "Consolidated" +msgstr "Skonsolidowany" + +#: libreplan-webapp/src/main/webapp/common/configuration.zul:158 +msgid "Work report types" +msgstr "Typy raportu pracy" + +#: libreplan-webapp/src/main/webapp/common/configuration.zul:187 +msgid "MonteCarlo method" +msgstr "Metoda MonteCarlo" + +#: libreplan-webapp/src/main/java/org/libreplan/web/calendars/BaseCalendarEditionController.java:1223 +msgid "derived exception can not be removed" +msgstr "pochodzący wyjątek nie może być usunięty" + +#: libreplan-webapp/src/main/java/org/libreplan/web/resources/worker/WorkerCRUDController.java:284 +#: libreplan-webapp/src/main/java/org/libreplan/web/resources/worker/WorkerCRUDController.java:304 +msgid "Edit Worker: {0}" +msgstr "Edytuj pracownika: {0}" + +#: libreplan-webapp/src/main/java/org/libreplan/ws/materials/impl/MaterialConverter.java:217 +msgid "missing code in a material" +msgstr "brak kodu w materiale" + +#: libreplan-webapp/src/main/webapp/common/layout/login.zul:21 +msgid "LibrePlan: User access" +msgstr "LibrePlan: Dostęp użytkownika" + +#: libreplan-webapp/src/main/java/org/libreplan/web/common/components/finders/TaskGroupFilterEnum.java:30 +#: libreplan-webapp/src/main/java/org/libreplan/web/common/components/finders/OrderFilterEnum.java:30 +#: libreplan-webapp/src/main/webapp/orders/_projectDetails.zul:68 +#: libreplan-webapp/src/main/webapp/orders/_edition.zul:111 +#: libreplan-webapp/src/main/webapp/orders/_list.zul:32 +msgid "Customer" +msgstr "Klient" + +#: libreplan-webapp/src/main/java/org/libreplan/web/workreports/WorkReportCRUDController.java:820 +#: libreplan-webapp/src/main/webapp/workreports/workReportQuery.zul:86 +#: libreplan-webapp/src/main/webapp/orders/_listOrderElementHours.zul:34 +msgid "Hours type" +msgstr "Typ godzin" + +#: libreplan-webapp/src/main/webapp/planner/print_configuration.zul:43 +msgid "Show money cost bar" +msgstr "" + +#: libreplan-webapp/src/main/java/org/libreplan/ws/resources/impl/ResourceConverter.java:156 +#: libreplan-business/src/main/java/org/libreplan/business/resources/entities/CriterionType.java:211 +msgid "criterion type name not specified" +msgstr "nie określono nazwy typu kryterium" + +#: libreplan-webapp/src/main/java/org/libreplan/web/common/ConfigurationController.java:265 +msgid "Cannot connect to LDAP server" +msgstr "Nie można połączyć się z serwerem LDAP" + +#: libreplan-webapp/src/main/webapp/orders/_listOrderElementCriterionRequirements.zul:219 +msgid "Add Exception" +msgstr "Dodaj wyjątek" + +#: libreplan-webapp/src/main/java/org/libreplan/web/tree/TreeController.java:222 +#: libreplan-webapp/src/main/java/org/libreplan/web/qualityforms/QualityFormCRUDController.java:202 +#: libreplan-webapp/src/main/java/org/libreplan/web/qualityforms/QualityFormCRUDController.java:223 +#: libreplan-webapp/src/main/java/org/libreplan/web/qualityforms/QualityFormCRUDController.java:247 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderElementTreeController.java:379 +msgid "cannot be empty" +msgstr "Nie może być pusty" + +#: libreplan-webapp/src/main/java/org/libreplan/web/workreports/WorkReportCRUDController.java:421 +msgid "Effort must be greater than zero" +msgstr "Wysiłek musi być większa od zera" + +#: libreplan-webapp/src/main/webapp/workreports/workReport.zul:49 +#: libreplan-webapp/src/main/webapp/workreports/workReportQuery.zul:47 +#: libreplan-webapp/src/main/webapp/orders/_orderElementTreeFilter.zul:40 +#: libreplan-webapp/src/main/webapp/orders/_orderFilter.zul:27 +msgid "from" +msgstr "z" + +#: libreplan-webapp/src/main/webapp/workreports/workReport.zul:146 +#: libreplan-webapp/src/main/webapp/workreports/workReportQuery.zul:121 +msgid "Heading Fields" +msgstr "Pola pozycji" + +#: libreplan-webapp/src/main/webapp/reports/schedulingProgressPerOrderReport.zul:70 +#: libreplan-webapp/src/main/webapp/reports/schedulingProgressPerOrderReport.zul:80 +msgid "Progress type" +msgstr "Typ postępu" + +#: libreplan-webapp/src/main/java/org/libreplan/ws/common/impl/OrderElementConverter.java:581 +msgid "Task {0} : Project is incompatible type with {1}" +msgstr "Zadanie {0}: projekt jest niezgodny z typem {1}" + +#: libreplan-webapp/src/main/java/org/libreplan/web/resources/worker/WorkRelationshipsController.java:155 +msgid "" +"Time period contains non valid data. Ending data must be older than starting" +" date" +msgstr "Okres zawiera nieważną dane. Data zakończenia musi być starsza niż data rozpoczęcia" + +#: libreplan-webapp/src/main/webapp/planner/print_configuration.zul:35 +msgid "Expand taskgroups" +msgstr "Rozwiń grupy zadań" + +#: libreplan-webapp/src/main/webapp/common/layout/template.zul:137 +msgid "The admin's account password remains the default one. This is insecure" +msgstr "Hasło konta administratora pozostaje domyślne. Jest to niebezpieczne." + +#: libreplan-webapp/src/main/webapp/orders/_ordersTab.zul:33 +msgid "Save Project" +msgstr "Zapisz projekt" + +#: libreplan-webapp/src/main/java/org/libreplan/web/limitingresources/ManualAllocationController.java:318 +#: libreplan-webapp/src/main/java/org/libreplan/web/limitingresources/ManualAllocationController.java:324 +msgid "Day is not valid" +msgstr "Dzień nie jest ważny" + +#: libreplan-webapp/src/main/java/org/libreplan/web/calendars/BaseCalendarEditionController.java:623 +#: libreplan-webapp/src/main/java/org/libreplan/web/calendars/BaseCalendarEditionController.java:1259 +msgid "You should select a start date for the exception" +msgstr "Należy wybrać datę początkową dla wyjątku" + +#: libreplan-webapp/src/main/webapp/common/layout/_customMenu.zul:72 +msgid "Help" +msgstr "Pomoc" + +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/chart/EarnedValueChartFiller.java:129 +msgid "Variance At Completion" +msgstr "Wariancja na zakończenie" + +#: libreplan-webapp/src/main/java/org/libreplan/web/users/settings/SettingsController.java:96 +msgid "Settings saved" +msgstr "Ustawienia zostały zapisane" + +#: libreplan-webapp/src/main/webapp/planner/taskpanels/_tabPanelSubcontract.zul:64 +msgid "Exportation options" +msgstr "Opcje wywozu" + +#: libreplan-webapp/src/main/java/org/libreplan/web/tree/TreeComponent.java:94 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/allocation/AdvancedAllocationController.java:930 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/allocation/ResourceAllocationController.java:443 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/AssignedTaskQualityFormsToOrderElementController.java:376 +#: libreplan-webapp/src/main/java/org/libreplan/web/common/components/finders/ScenarioBandboxFinder.java:46 +#: libreplan-webapp/src/main/java/org/libreplan/web/common/components/finders/QualityFormBandboxFinder.java:51 +#: libreplan-webapp/src/main/java/org/libreplan/web/common/components/finders/BaseCalendarBandboxFinder.java:46 +#: libreplan-webapp/src/main/java/org/libreplan/web/common/components/finders/LabelBandboxFinder.java:52 +#: libreplan-webapp/src/main/java/org/libreplan/web/common/components/finders/ExternalCompanyBandboxFinder.java:51 +#: libreplan-webapp/src/main/webapp/labels/_editLabelType.zul:42 +#: libreplan-webapp/src/main/webapp/labels/_editLabelType.zul:77 +#: libreplan-webapp/src/main/webapp/labels/_listLabelTypes.zul:26 +#: libreplan-webapp/src/main/webapp/advance/_listAdvanceTypes.zul:27 +#: libreplan-webapp/src/main/webapp/excetiondays/_listExceptionDayTypes.zul:31 +#: libreplan-webapp/src/main/webapp/excetiondays/_editExceptionDayType.zul:50 +#: libreplan-webapp/src/main/webapp/externalcompanies/_listExternalCompanies.zul:27 +#: libreplan-webapp/src/main/webapp/materials/materials.zul:58 +#: libreplan-webapp/src/main/webapp/workreports/_editWorkReportType.zul:43 +#: libreplan-webapp/src/main/webapp/workreports/_editWorkReportType.zul:134 +#: libreplan-webapp/src/main/webapp/workreports/_editWorkReportType.zul:156 +#: libreplan-webapp/src/main/webapp/workreports/_listWorkReportTypes.zul:27 +#: libreplan-webapp/src/main/webapp/workreports/_sortFieldsAndLabels.zul:34 +#: libreplan-webapp/src/main/webapp/workreports/_sortFieldsAndLabels.zul:50 +#: libreplan-webapp/src/main/webapp/scenarios/transferOrders.zul:66 +#: libreplan-webapp/src/main/webapp/scenarios/transferOrders.zul:76 +#: libreplan-webapp/src/main/webapp/scenarios/_edition.zul:32 +#: libreplan-webapp/src/main/webapp/scenarios/_edition.zul:52 +#: libreplan-webapp/src/main/webapp/scenarios/_list.zul:27 +#: libreplan-webapp/src/main/webapp/costcategories/_editCostCategory.zul:51 +#: libreplan-webapp/src/main/webapp/costcategories/_editTypeOfWorkHours.zul:52 +#: libreplan-webapp/src/main/webapp/qualityforms/_listQualityForm.zul:36 +#: libreplan-webapp/src/main/webapp/qualityforms/_editQualityForm.zul:42 +#: libreplan-webapp/src/main/webapp/qualityforms/_editQualityForm.zul:83 +#: libreplan-webapp/src/main/webapp/planner/main.zul:49 +#: libreplan-webapp/src/main/webapp/planner/taskpanels/_tabPanelTaskProperties.zul:32 +#: libreplan-webapp/src/main/webapp/planner/taskpanels/_tabPanelNonLimitingResourceAllocation.zul:81 +#: libreplan-webapp/src/main/webapp/reports/workingProgressPerTaskReport.zul:96 +#: libreplan-webapp/src/main/webapp/reports/workingProgressPerTaskReport.zul:137 +#: libreplan-webapp/src/main/webapp/reports/completedEstimatedHoursPerTask.zul:96 +#: libreplan-webapp/src/main/webapp/reports/completedEstimatedHoursPerTask.zul:137 +#: libreplan-webapp/src/main/webapp/reports/orderCostsPerResource.zul:90 +#: libreplan-webapp/src/main/webapp/reports/orderCostsPerResource.zul:134 +#: libreplan-webapp/src/main/webapp/reports/orderCostsPerResource.zul:175 +#: libreplan-webapp/src/main/webapp/reports/hoursWorkedPerWorkerReport.zul:85 +#: libreplan-webapp/src/main/webapp/reports/hoursWorkedPerWorkerReport.zul:124 +#: libreplan-webapp/src/main/webapp/reports/hoursWorkedPerWorkerReport.zul:166 +#: libreplan-webapp/src/main/webapp/reports/schedulingProgressPerOrderReport.zul:115 +#: libreplan-webapp/src/main/webapp/reports/workingArrangementsPerOrderReport.zul:104 +#: libreplan-webapp/src/main/webapp/reports/workingArrangementsPerOrderReport.zul:145 +#: libreplan-webapp/src/main/webapp/reports/timeLineMaterialReport.zul:94 +#: libreplan-webapp/src/main/webapp/users/_editProfile.zul:40 +#: libreplan-webapp/src/main/webapp/templates/templates.zul:81 +#: libreplan-webapp/src/main/webapp/templates/_list.zul:27 +#: libreplan-webapp/src/main/webapp/templates/_assignedQualityForms.zul:48 +#: libreplan-webapp/src/main/webapp/subcontract/reportAdvances.zul:45 +#: libreplan-webapp/src/main/webapp/calendars/_edition.zul:40 +#: libreplan-webapp/src/main/webapp/calendars/_list.zul:28 +#: libreplan-webapp/src/main/webapp/resources/worker/_listVirtualWorkers.zul:34 +#: libreplan-webapp/src/main/webapp/resources/machine/_machineConfigurationUnits.zul:32 +#: libreplan-webapp/src/main/webapp/resources/machine/_machineConfigurationUnits.zul:53 +#: libreplan-webapp/src/main/webapp/resources/machine/_machineConfigurationUnits.zul:108 +#: libreplan-webapp/src/main/webapp/resources/machine/_listMachines.zul:35 +#: libreplan-webapp/src/main/webapp/resources/machine/_editMachine.zul:56 +#: libreplan-webapp/src/main/webapp/resources/criterions/_edition.zul:39 +#: libreplan-webapp/src/main/webapp/resources/criterions/_list.zul:25 +#: libreplan-webapp/src/main/webapp/resources/criterions/_workers.zul:27 +#: libreplan-webapp/src/main/webapp/resources/criterions/_workers.zul:45 +#: libreplan-webapp/src/main/webapp/resources/criterions/_criterionsTree.zul:41 +#: libreplan-webapp/src/main/webapp/orders/_projectDetails.zul:36 +#: libreplan-webapp/src/main/webapp/orders/_assignmentsBox.zul:27 +#: libreplan-webapp/src/main/webapp/orders/_edition.zul:72 +#: libreplan-webapp/src/main/webapp/orders/_list.zul:28 +#: libreplan-webapp/src/main/webapp/orders/components/_listOrderElementMaterials.zul:110 +#: libreplan-webapp/src/main/webapp/limitingresources/limitingResourcesLayout.zul:90 +msgid "Name" +msgstr "Nazwa" + +#: libreplan-webapp/src/main/java/org/libreplan/web/resources/worker/WorkRelationshipsController.java:160 +msgid "" +"Could not save time period. Time period overlaps with another non-compatible" +" time period" +msgstr "Nie można zapisać terminu. Okres pobytu pokrywa się z innym niekompatybilnym czasem" + +#: libreplan-webapp/src/main/java/org/libreplan/web/tree/TreeComponent.java:168 +msgid "Delete task" +msgstr "Usuń zadanie" + +#: libreplan-webapp/src/main/java/org/libreplan/web/common/components/EffortDurationPicker.java:69 +msgid "Seconds" +msgstr "Sekundy" + +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/labels/AssignedLabelsController.java:108 +msgid "please, select an item" +msgstr "proszę wybrać pozycję" + +#: libreplan-webapp/src/main/webapp/calendars/_edition.zul:224 +msgid "Day of week" +msgstr "Dzień tygodnia" + +#: libreplan-webapp/src/main/java/org/libreplan/web/workreports/WorkReportCRUDController.java:397 +msgid "Time Start cannot be null" +msgstr "Czas rozpoczęcia nie może być zerowy" + +#: libreplan-webapp/src/main/webapp/externalcompanies/_listExternalCompanies.zul:22 +msgid "Companies List" +msgstr "Lista firm" + +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/allocation/AdvancedAllocationController.java:1462 +msgid "Stretches with Interpolation" +msgstr "Odcinki z interpolacją" + +#: libreplan-webapp/src/main/java/org/libreplan/web/common/CustomMenuController.java:341 +#: libreplan-webapp/src/main/webapp/reports/hoursWorkedPerWorkerReport.zul:37 +msgid "Hours Worked Per Resource" +msgstr "Godziny przepracowane na zasób" + +#: libreplan-business/src/main/java/org/libreplan/business/costcategories/entities/HourCost.java:146 +msgid "The end date cannot be before the init date" +msgstr "Data zakończenia nie może być przed init daty" + +#: libreplan-webapp/src/main/webapp/users/_editUser.zul:117 +msgid "" +"Profiles of LDAP users cannot be managed because LDAP roles are being used." +msgstr "Profile Ldap użytkowników nie mogą być zarządzane ponieważ role Ldap są już używane." + +#: libreplan-business/src/main/java/org/libreplan/business/costcategories/entities/ResourcesCostCategoryAssignment.java:145 +msgid "cost assignment with end date less than start date" +msgstr "przypisane koszta z datą zakończenia są mniejsze niż daty rozpoczęcia" + +#: libreplan-webapp/src/main/webapp/common/configuration.zul:91 +msgid "" +"Enable/Disable autocomplete property in login form, if the admin password is" +" still in default" +msgstr "Włącz / wyłącz auto uzupełniania w formularzu logowania, jeśli hasło administratora jest nadal domyślne" + +#: libreplan-webapp/src/main/webapp/costcategories/_listCostCategories.zul:26 +#: libreplan-webapp/src/main/webapp/resources/_costCategoryAssignment.zul:36 +msgid "Category name" +msgstr "Nazwa kategorii" + +#: libreplan-webapp/src/main/java/org/libreplan/ws/common/impl/OrderElementConverter.java:766 +msgid "Not the same material, impossible to update" +msgstr "Nie z tego samego materiału, aktualizacja nie jest możliwa" + +#: libreplan-webapp/src/main/webapp/workreports/workReport.zul:41 +#: libreplan-webapp/src/main/webapp/workreports/workReportQuery.zul:34 +msgid "Filter work report by" +msgstr "Filtrowanie raportu pracy przez" + +#: libreplan-webapp/src/main/webapp/common/configuration.zul:99 +msgid "Show a notification when new LibrePlan versions are released" +msgstr "Pokaż powiadomienie w przypadku pojawienia się nowej wersji LibrePlan" + +#: libreplan-webapp/src/main/webapp/common/layout/template.zul:65 +msgid "Main menu" +msgstr "Główne menu" + +#: libreplan-webapp/src/main/webapp/planner/montecarlo_function.zul:31 +msgid "MonteCarlo" +msgstr "MonteCarlo" + +#: libreplan-webapp/src/main/webapp/montecarlo/_montecarlo.zul:49 +msgid "Duration" +msgstr "Czas trwania" + +#: libreplan-webapp/src/main/java/org/libreplan/web/calendars/BaseCalendarEditionController.java:589 +msgid "Exception: {0}" +msgstr "Wyjątek: {0}" + +#: libreplan-webapp/src/main/webapp/settings/changePassword.zul:46 +msgid "Password settings" +msgstr "Ustawienia hasła" + +#: libreplan-webapp/src/main/java/org/libreplan/web/workreports/WorkReportTypeModel.java:381 +msgid "There exists other workReportType with the same name." +msgstr "Istnieje inny workReportType o tej samej nazwie." + +#: libreplan-webapp/src/main/webapp/advance/advanceTypes.zul:22 +msgid "LibrePlan: Progress" +msgstr "LibrePlan: postęp" + +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/tabs/PlanningTabCreator.java:149 +#: libreplan-webapp/src/main/webapp/common/components/schedulingStateToggler.zul:29 +msgid "Schedule" +msgstr "Harmonogram" + +#: libreplan-webapp/src/main/java/org/libreplan/web/resources/worker/WorkRelationshipsController.java:164 +msgid "Unexpected: {0}" +msgstr "Nieoczekiwany: {0}" + +#: libreplan-webapp/src/main/webapp/planner/main.zul:61 +#: libreplan-webapp/src/main/webapp/planner/taskpanels/_tabPanelTaskProperties.zul:50 +msgid "Notes" +msgstr "Uwagi" + +#: libreplan-webapp/src/main/java/org/libreplan/web/scenarios/ScenarioCRUDController.java:178 +msgid "Connect" +msgstr "Połącz" + +#: libreplan-webapp/src/main/webapp/users/_editUser.zul:97 +msgid "" +"Roles of LDAP users cannot be managed because LDAP roles are being used." +msgstr "Role Ldap użytkowników nie mogą być zarządzane ponieważ role Ldap są już używane." + +#: libreplan-webapp/src/main/java/org/libreplan/web/limitingresources/QueueComponent.java:223 +msgid "Allocation: [{0},{1}]" +msgstr "Alokacja: [{0}, {1}]" + +#: libreplan-webapp/src/main/java/org/libreplan/web/resources/worker/WorkerCRUDController.java:874 +msgid "Virtual Workers Group" +msgstr "Wirtualne grupy pracowników" + +#: libreplan-webapp/src/main/java/org/libreplan/web/common/ConfigurationController.java:217 +msgid "Changes saved" +msgstr "Zmiany zostały zapisane" + +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:1267 +msgid "See scheduling" +msgstr "Zobacz harmonogram" + +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/consolidations/AdvanceConsolidationController.java:107 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/consolidations/AdvanceConsolidationController.java:110 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/ManageOrderElementAdvancesController.java:329 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/ManageOrderElementAdvancesController.java:332 +msgid "Progress measurements" +msgstr "Pomiary postępu" + +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/ManageOrderElementAdvancesController.java:1237 +msgid "Add measure" +msgstr "Dodaj pomiar" + +#: libreplan-webapp/src/main/webapp/resources/search/allocation_selector.zul:52 +msgid "Found resources" +msgstr "Znalezione zasoby" + +#: libreplan-webapp/src/main/webapp/resources/worker/_editWorkRelationship.zul:27 +#: libreplan-webapp/src/main/webapp/resources/worker/_workRelationships.zul:30 +msgid "Relationship" +msgstr "Związek" + +#: libreplan-webapp/src/main/java/org/libreplan/web/workreports/WorkReportCRUDController.java:258 +msgid "Work report saved" +msgstr "Zapisano raport pracy" + +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/SubcontractCommand.java:53 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/taskedition/TaskPropertiesController.java:386 +#: libreplan-webapp/src/main/webapp/planner/editTask.zul:68 +msgid "Subcontract" +msgstr "Podwykonawca" + +#: libreplan-webapp/src/main/webapp/planner/main.zul:57 +#: libreplan-webapp/src/main/webapp/planner/taskpanels/_tabPanelTaskProperties.zul:41 +#: libreplan-webapp/src/main/webapp/limitingresources/manualAllocation.zul:121 +msgid "End" +msgstr "Zakończenie" + +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/ManageOrderElementAdvancesController.java:1379 +msgid "The date is not valid, the date must be not empty" +msgstr "Data nie jest ważna, data nie może być pusta" + +#: libreplan-webapp/src/main/webapp/users/_listUsers.zul:26 +msgid "User login name" +msgstr "Nazwa logowania użytkownika" + +#: libreplan-webapp/src/main/java/org/libreplan/web/costcategories/CostCategoryCRUDController.java:534 +#: libreplan-webapp/src/main/java/org/libreplan/web/common/CustomMenuController.java:326 +msgid "Cost Categories" +msgstr "Kategorie kosztów" + +#: libreplan-business/src/main/java/org/libreplan/business/resources/entities/Criterion.java:313 +msgid "criterion type not specified" +msgstr "nie określono rodzaju kryterium" + +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/reassign/ReassignController.java:143 +msgid "must be not empty" +msgstr "nie może być puste" + +#: libreplan-webapp/src/main/java/org/libreplan/web/reports/HoursWorkedPerWorkerInAMonthController.java:44 +msgid "April" +msgstr "Kwiecień" + +#: libreplan-webapp/src/main/webapp/users/_listUsers.zul:22 +msgid "Users List" +msgstr "Lista użytkowników" + +#: libreplan-webapp/src/main/webapp/orders/_listOrderElementTaskQualityForms.zul:27 +#: libreplan-webapp/src/main/webapp/orders/_editOrderElement.zul:56 +#: libreplan-webapp/src/main/webapp/orders/_edition.zul:55 +msgid "Task quality forms" +msgstr "Formy jakości zadań" + +#: libreplan-webapp/src/main/java/org/libreplan/web/calendars/BaseCalendarEditionController.java:597 +msgid "Not working day" +msgstr "Dzień niepracujący" + +#: libreplan-webapp/src/main/java/org/libreplan/web/advance/AdvanceTypeCRUDController.java:237 +msgid "Progress Types" +msgstr "Typy postępów" + +#: libreplan-webapp/src/main/java/org/libreplan/web/common/components/finders/ResourceFilterEnum.java:29 +#: libreplan-webapp/src/main/webapp/common/configuration.zul:168 +msgid "Cost category" +msgstr "Kategoria kosztów" + +#: libreplan-webapp/src/main/java/org/libreplan/web/common/ConfigurationController.java:719 +msgid "It can not be deleted. At least one sequence is necessary." +msgstr "To nie może być usunięte. Przynajmniej jedna sekwencja jest konieczna." + +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/allocation/ResourceAllocationCommand.java:74 +msgid "Resource allocation" +msgstr "Alokacja zasobu" + +#: libreplan-webapp/src/main/webapp/planner/stretches_function.zul:50 +msgid "Amount work" +msgstr "Ilość pracy" + +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/AssignedTaskQualityFormsToOrderElementController.java:172 +msgid "please, select a quality form" +msgstr "proszę wybrać formę jakości" + +#: libreplan-webapp/src/main/java/org/libreplan/web/calendars/BaseCalendarCRUDController.java:524 +#: libreplan-webapp/src/main/java/org/libreplan/web/resources/worker/WorkerCRUDController.java:889 +#: libreplan-webapp/src/main/java/org/libreplan/web/common/BaseCRUDController.java:132 +msgid "Edit {0}: {1}" +msgstr "Edytuj {0}: {1}" + +#: libreplan-webapp/src/main/java/org/libreplan/web/workreports/WorkReportTypeModel.java:400 +msgid "Exist other workReportType with the same code." +msgstr "Istnieją inne workReportType z tym samym kodem." + +#: libreplan-webapp/src/main/webapp/qualityforms/_listQualityForm.zul:26 +msgid "Filter quality forms by" +msgstr "Filtruj formy jakości przez" + +#: libreplan-webapp/src/main/webapp/orders/components/_orderElementTree.zul:67 +msgid "Unindent selected task" +msgstr "Wsunięcie wybranego zadania" + +#: libreplan-webapp/src/main/webapp/subcontract/reportAdvances.zul:44 +msgid "Customer reference code" +msgstr "Kod referencyjny klienta" + +#: libreplan-webapp/src/main/webapp/planner/taskpanels/_tabPanelTaskProperties.zul:66 +msgid "Constraint" +msgstr "Przymus" + +#: libreplan-webapp/src/main/webapp/workreports/_editWorkReportType.zul:150 +msgid "Add New Label Type Field" +msgstr "Dodaj nowy typ pola etykiety" + +#: libreplan-webapp/src/main/java/org/libreplan/web/workreports/WorkReportCRUDController.java:407 +msgid "Time finish cannot be null" +msgstr "Czas wykończenia nie może być pusty" + +#: libreplan-webapp/src/main/webapp/orders/_edition.zul:118 +msgid "Customer reference" +msgstr "Oznaczenie klienta" + +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/SaveCommandBuilder.java:326 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/taskedition/EditTaskController.java:360 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/allocation/AdvancedAllocationController.java:712 +#: libreplan-webapp/src/main/java/org/libreplan/web/templates/historicalAssignment/OrderElementHistoricalAssignmentComponent.java:146 +#: libreplan-webapp/src/main/java/org/libreplan/web/resourceload/ResourceLoadController.java:311 +#: libreplan-webapp/src/main/java/org/libreplan/web/resourceload/ResourceLoadController.java:321 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:697 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:850 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:900 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:909 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:936 +#: libreplan-webapp/src/main/java/org/libreplan/web/limitingresources/LimitingResourcesController.java:333 +msgid "Information" +msgstr "Informacja" + +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:935 +msgid "Sorry, you do not have permissions to access this project" +msgstr "Przepraszamy, nie masz prawa dostępu do tego projektu" + +#: libreplan-webapp/src/main/java/org/libreplan/web/limitingresources/ManualAllocationController.java:492 +msgid "END" +msgstr "Zakończenie" + +#: libreplan-webapp/src/main/java/org/libreplan/web/resources/worker/WorkerCRUDController.java:223 +msgid "Worker saved" +msgstr "Pracownik zapisany" + +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/AssignedTaskQualityFormsToOrderElementModel.java:266 +msgid "can not pass until the previous item is passed." +msgstr "nie można przejść jeżeli poprzedni element jest w trakcie przechodzenia." + +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/criterionrequirements/AssignedCriterionRequirementModel.java:206 +msgid "New hours group " +msgstr "Nowa grupa godzin " + +#: libreplan-webapp/src/main/java/org/libreplan/web/limitingresources/LimitingResourcesController.java:464 +msgid "Assign element to queue manually" +msgstr "Przydziel element do kolejki ręcznie" + +#: libreplan-webapp/src/main/webapp/planner/print_configuration.zul:47 +msgid "Please remember that only saved changes will be printed" +msgstr "Proszę zapamiętaj, że tylko zapisane zmiany mogą zostać wydrukowane" + +#: libreplan-webapp/src/main/java/org/libreplan/web/qualityforms/QualityFormCRUDController.java:259 +msgid "percentage cannot be duplicated" +msgstr "procent nie może być powielany" + +#: libreplan-webapp/src/main/java/org/libreplan/web/limitingresources/QueueComponent.java:218 +msgid "Resource: {0} " +msgstr "Zasób: {0} " + +#: libreplan-webapp/src/main/webapp/templates/templates.zul:55 +msgid "Edit Template" +msgstr "Edytuj szablon" + +#: libreplan-webapp/src/main/java/org/libreplan/web/common/CustomMenuController.java:333 +msgid "Work Hours" +msgstr "Godziny pracy" + +#: libreplan-webapp/src/main/webapp/workreports/_sortFieldsAndLabels.zul:27 +msgid "Heading" +msgstr "Nagłówek" + +#: libreplan-business/src/main/java/org/libreplan/business/externalcompanies/entities/ExternalCompany.java:166 +msgid "Company ID already used. It has to be be unique" +msgstr "Identyfikator firmy jest już w użyciu. Musi on być unikalny" + +#: libreplan-webapp/src/main/java/org/libreplan/ws/materials/impl/MaterialConverter.java:122 +msgid "There is no material category with this code" +msgstr "Nie ma kategorii materiałów z tym kodem" + +#: libreplan-webapp/src/main/java/org/libreplan/web/montecarlo/MonteCarloController.java:192 +msgid "Percentages should sum 100" +msgstr "Procentowa suma powinna wynosić 100" + +#: libreplan-webapp/src/main/java/org/libreplan/ws/calendars/impl/CalendarConverter.java:339 +msgid "The calendar exception type not found" +msgstr "Nie znaleziono typu wyjątku kalendarza" + +#: libreplan-webapp/src/main/java/org/libreplan/ws/calendarexceptiontypes/impl/CalendarExceptionTypeColorConverter.java:106 +#: libreplan-webapp/src/main/java/org/libreplan/ws/common/impl/ResourceEnumConverter.java:81 +msgid "Unable to convert value to {0} type" +msgstr "Nie można przekonwertować wartości typu {0}" + +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrdersTreeComponent.java:81 +msgid "Total task budget" +msgstr "" + +#: libreplan-webapp/src/main/java/org/libreplan/web/resources/worker/WorkerModel.java:222 +msgid "Worker must be not-null" +msgstr "Pracownik nie może być pusty" + +#: libreplan-business/src/main/java/org/libreplan/business/resources/entities/Resource.java:1063 +msgid "Some criterion satisfactions overlap in time" +msgstr "Niektóre satysfakcje kryterium nakładają się w czasie" + +#: libreplan-webapp/src/main/webapp/subcontract/reportAdvances.zul:49 +msgid "Value last progress measurement" +msgstr "Wartość ostatniego pomiaru postępu" + +#: libreplan-webapp/src/main/webapp/reports/timeLineMaterialReport.zul:21 +msgid "LibrePlan: Materials Needs At Date" +msgstr "LibrePlan: Materiały Potrzebne na datę" + +#: libreplan-webapp/src/main/webapp/resources/machine/_machineConfigurationUnits.zul:44 +msgid "Worker assignments" +msgstr "Zadania pracownika" + +#: libreplan-webapp/src/main/java/org/libreplan/web/labels/LabelTypeCRUDController.java:270 +#: libreplan-webapp/src/main/java/org/libreplan/web/labels/LabelTypeModel.java:154 +#: libreplan-webapp/src/main/java/org/libreplan/web/labels/LabelTypeModel.java:182 +#: libreplan-webapp/src/main/java/org/libreplan/web/materials/MaterialsModel.java:173 +#: libreplan-webapp/src/main/java/org/libreplan/web/scenarios/ScenarioModel.java:221 +#: libreplan-webapp/src/main/java/org/libreplan/web/qualityforms/QualityFormCRUDController.java:206 +#: libreplan-webapp/src/main/java/org/libreplan/web/qualityforms/QualityFormCRUDController.java:227 +#: libreplan-webapp/src/main/java/org/libreplan/web/calendars/BaseCalendarModel.java:603 +msgid "{0} already exists" +msgstr "{0} już istnieje" + +#: libreplan-webapp/src/main/java/org/libreplan/web/resources/worker/WorkerCRUDController.java:315 +msgid "Create Worker" +msgstr "Stwórz pracownika" + +#: libreplan-webapp/src/main/webapp/orders/_orderElementDetails.zul:38 +msgid "Code " +msgstr "Kod " + +#: libreplan-webapp/src/main/java/org/libreplan/web/calendars/BaseCalendarEditionController.java:591 +msgid "Exception: {0} (Inh)" +msgstr "Wyjątek: {0} (Inh)" + +#: libreplan-webapp/src/main/webapp/settings/changePassword.zul:69 +#: libreplan-webapp/src/main/webapp/users/_editUser.zul:69 +msgid "Password confirmation" +msgstr "Potwierdzenie hasła" + +#: libreplan-webapp/src/main/webapp/orders/components/_orderElementTree.zul:71 +msgid "Indent selected task" +msgstr "Wytnij wybrane zadanie" + +#: libreplan-webapp/src/main/webapp/workreports/workReportQuery.zul:88 +msgid "Work Report" +msgstr "Raport pracy" + +#: libreplan-webapp/src/main/java/org/libreplan/web/materials/UnitTypeController.java:189 +#: libreplan-webapp/src/main/java/org/libreplan/web/common/CustomMenuController.java:332 +#: libreplan-webapp/src/main/webapp/common/configuration.zul:148 +msgid "Unit Measures" +msgstr "Wymiary jednostki" + +#: libreplan-webapp/src/main/webapp/planner/print_configuration.zul:39 +#: libreplan-webapp/src/main/webapp/common/configuration.zul:72 +msgid "Show progress" +msgstr "Pokaż postęp" + +#: libreplan-webapp/src/main/webapp/orders/_edition.zul:142 +msgid "Work" +msgstr "Praca" + +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/SaveCommandBuilder.java:305 +msgid "" +"Error saving the project\n" +"{0}" +msgstr "Błąd przy zapisywaniu projektu\n{0}" + +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/taskedition/EditTaskController.java:358 +msgid "" +"The task has got progress consolidations. It must delete all consolidations " +"to change the resource allocation type " +msgstr "Zadanie ma konsolidację postępu. Musisz usunąć wszystkie konsolidację, aby zmienić typ alokacji zasobów " + +#: libreplan-webapp/src/main/webapp/resources/machine/machines.zul:22 +msgid "LibrePlan: Machines" +msgstr "LibrePlan: Maszyny" + +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/SaveCommandBuilder.java:306 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/allocation/streches/StretchesFunctionController.java:121 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/allocation/AdvancedAllocationController.java:1305 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/criterionrequirements/AssignedCriterionRequirementController.java:405 +#: libreplan-webapp/src/main/java/org/libreplan/web/limitingresources/LimitingResourcesController.java:630 +msgid "Error" +msgstr "Błąd" + +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/chart/EarnedValueChartFiller.java:131 +msgid "Cost Performance Index" +msgstr "Wskaźnik wydajności kosztów" + +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/chart/EarnedValueChartFiller.java:129 +msgid "ETC" +msgstr "ETC" + +#: libreplan-webapp/src/main/java/org/libreplan/web/resources/worker/CriterionsMachineController.java:182 +msgid "" +"Criterion is not valid, the criterion overlap other criterionSatisfaction " +"whith same criterion" +msgstr "Kryterium nie jest prawidłowe, kryterium pokrywają inne criterionSatisfaction z tego samego kryterium" + +#: libreplan-webapp/src/main/webapp/common/layout/template.zul:105 +msgid "Log out" +msgstr "Wyloguj" + +#: libreplan-webapp/src/main/webapp/resources/machine/_machineConfigurationUnits.zul:25 +msgid "Add new configuration unit" +msgstr "Dodaj nową konfigurację jednostki" + +#: libreplan-webapp/src/main/webapp/common/configuration.zul:41 +msgid "Main preferences" +msgstr "Główne ustawienia" + +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/consolidations/AdvanceConsolidationCommand.java:67 +#: libreplan-webapp/src/main/webapp/planner/order.zul:80 +msgid "Progress consolidation" +msgstr "Konsolidacja postępu" + +#: libreplan-webapp/src/main/java/org/libreplan/web/resources/worker/CriterionsController.java:180 +msgid "" +"Criterion is not valid, it overlaps other criterionSatisfaction with the " +"same criterion" +msgstr "Kryterium nie jest prawidłowe, nakłada się z kryterium satysfakcji z tym samym kryterium" + +#: libreplan-webapp/src/main/webapp/resources/machine/_machineConfigurationUnits.zul:47 +msgid "Add new worker assignment" +msgstr "Dodaj nowe zadanie dla pracownika" + +#: libreplan-webapp/src/main/java/org/libreplan/ws/workreports/impl/WorkReportConverter.java:406 +#: libreplan-webapp/src/main/java/org/libreplan/ws/workreports/impl/WorkReportConverter.java:556 +msgid "missing field name in a description value" +msgstr "brakuje pola nazwy w opisie wartości" + +#: libreplan-webapp/src/main/java/org/libreplan/web/resourceload/ResourceLoadController.java:690 +msgid "Show all elements" +msgstr "Wyświetl wszystkie elementy" + +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/reassign/ReassignCommand.java:149 +msgid "It couldn't complete all the reassignations" +msgstr "Nie można zakończyć wszystkich ponownie przypisanych" + +#: libreplan-webapp/src/main/webapp/resources/machine/_editMachine.zul:68 +msgid "Limited resource" +msgstr "Limitowany zasób" + +#: libreplan-webapp/src/main/webapp/planner/taskpanels/_taskInformation.zul:27 +msgid "Task Information" +msgstr "Informacje zadania" + +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:142 +msgid "Hours Group at " +msgstr "Grupy godzin na " + +#: libreplan-webapp/src/main/webapp/common/layout/timeout.zul:27 +msgid "Your session has expired after inactivity period. Please log in again." +msgstr "Twoja sesja wygasła po okresie bezczynności. Proszę zalogować się ponownie." + +#: libreplan-webapp/src/main/java/org/libreplan/ws/calendars/impl/CalendarConverter.java:309 +msgid "a day is empty" +msgstr "Dzień jest pusty" + +#: libreplan-webapp/src/main/java/org/libreplan/web/reports/SchedulingProgressPerOrderController.java:165 +#: libreplan-webapp/src/main/java/org/libreplan/web/reports/SchedulingProgressPerOrderController.java:190 +msgid "SPREAD" +msgstr "Szerzenie" + +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/allocation/AdvancedAllocationController.java:712 +msgid "Changes applied" +msgstr "Zmiany zastosowane" + +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/chart/EarnedValueChartFiller.java:122 +msgid "Budgeted Cost Work Scheduled" +msgstr "Prace zaplanowane w budżecie kosztów" + +#: libreplan-webapp/src/main/webapp/resources/machine/_editMachine.zul:58 +msgid "Name cannot be null or empty" +msgstr "Nazwa nie może być zerowa lub pusta" + +#: libreplan-webapp/src/main/webapp/common/configuration.zul:43 +msgid "LDAP configuration" +msgstr "Konfiguracja LDAP" + +#: libreplan-webapp/src/main/webapp/limitingresources/manualAllocation.zul:32 +msgid "Queue Element Information" +msgstr "Informacje o elemencie kolejki" + +#: libreplan-webapp/src/main/webapp/calendars/_edition.zul:151 +msgid "Start Date" +msgstr "Data rozpoczęcia" + +#: libreplan-webapp/src/main/webapp/resources/worker/_listVirtualWorkers.zul:22 +msgid "Virtual Workers Groups List" +msgstr "Lista wirtualnej grupy pracowników" + +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/chart/EarnedValueChartFiller.java:125 +msgid "Cost Variance" +msgstr "Wariancja kosztów" + +#: libreplan-business/src/main/java/org/libreplan/business/resources/entities/CriterionType.java:471 +msgid "criterion type does not allow resource hierarchy" +msgstr "rodzaj kryterium nie pozwala na hierarchię zasobów" + +#: libreplan-webapp/src/main/webapp/planner/taskpanels/_tabPanelNonLimitingResourceAllocation.zul:92 +#: libreplan-webapp/src/main/webapp/planner/taskpanels/_tabPanelNonLimitingResourceAllocation.zul:95 +#: libreplan-webapp/src/main/webapp/orders/_edition.zul:152 +msgid "Total" +msgstr "Wszystko" + +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/CriterionRequirementWrapper.java:222 +#: libreplan-webapp/src/main/webapp/orders/_listOrderElementCriterionRequirements.zul:99 +msgid "Invalidate" +msgstr "Unieważnić" + +#: libreplan-webapp/src/main/webapp/orders/_listOrderElementHours.zul:103 +msgid "Budget hours" +msgstr "Budżet godzin" + +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/taskedition/EditTaskController.java:150 +msgid "Edit task: {0}" +msgstr "Edytuj zadanie: {0}" + +#: libreplan-webapp/src/main/webapp/scenarios/transferOrders.zul:52 +msgid "Select destination" +msgstr "Wybierz cel" + +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/AssignedTaskQualityFormsToOrderElementController.java:530 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/AssignedTaskQualityFormsToOrderElementModel.java:274 +msgid "must be greater than the previous date." +msgstr "musi być większa niż poprzednia data." + +#: libreplan-webapp/src/main/webapp/planner/order.zul:89 +#: libreplan-webapp/src/main/webapp/planner/order.zul:95 +msgid "Check consolidated progresses" +msgstr "Sprawdź skonsolidowany postęp" + +#: libreplan-webapp/src/main/java/org/libreplan/web/workreports/WorkReportCRUDController.java:1469 +#: libreplan-webapp/src/main/java/org/libreplan/web/workreports/WorkReportModel.java:587 +msgid "Show all" +msgstr "Pokaż wszystko" + +#: libreplan-webapp/src/main/webapp/costcategories/_listTypesOfWorkHours.zul:28 +#: libreplan-webapp/src/main/webapp/costcategories/_editTypeOfWorkHours.zul:59 +msgid "Default price" +msgstr "Cena domyślna" + +#: libreplan-webapp/src/main/webapp/templates/_historicalAssignment.zul:38 +msgid "Estimated hours" +msgstr "Szacowane godziny" + +#: libreplan-webapp/src/main/webapp/planner/taskpanels/_tabPanelNonLimitingResourceAllocation.zul:121 +msgid "Apply tab changes" +msgstr "Zastosuj zmiany karty" + +#: libreplan-webapp/src/main/java/org/libreplan/web/users/settings/PasswordController.java:99 +#: libreplan-webapp/src/main/java/org/libreplan/web/users/UserCRUDController.java:176 +msgid "passwords don't match" +msgstr "hasła nie pasują" + +#: libreplan-webapp/src/main/webapp/calendars/_edition.zul:100 +msgid "Day properties" +msgstr "Właściwości dnia" + +#: libreplan-webapp/src/main/webapp/planner/taskpanels/_tabPanelSubcontract.zul:72 +msgid "Hours groups" +msgstr "Grupy godzin" + +#: libreplan-webapp/src/main/java/org/libreplan/web/scenarios/TransferOrdersController.java:183 +msgid "Transfer" +msgstr "Przenieś" + +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/ManageOrderElementAdvancesController.java:903 +msgid "" +"Spread progress cannot be changed if there is a consolidation in any " +"progress assignment" +msgstr "Rozprzestrzeniany postęp nie może być zmieniony jeżeli jest konsolidacja w jakimkolwiek przypisanym postępie" + +#: libreplan-webapp/src/main/webapp/costcategories/_listTypesOfWorkHours.zul:22 +msgid "Work Hours Types List" +msgstr "Lista typów godzin przepracowanych" + +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/milestone/AddMilestoneCommand.java:54 +msgid "new milestone" +msgstr "Nowy kamień milowy" + +#: libreplan-webapp/src/main/webapp/subcontract/reportAdvances.zul:47 +msgid "Value last progress reported" +msgstr "Wartość ostatniego postępu została zaraportowana" + +#: libreplan-webapp/src/main/webapp/common/configuration.zul:103 +msgid "" +"Help project developers to collect information about which LibrePlan version" +" you are using" +msgstr "Pomóż deweloperom projektu do zbierania informacji na temat wersji LibrePlan, której używasz" + +#: libreplan-webapp/src/main/java/org/libreplan/web/common/CustomMenuController.java:306 +msgid "Report Progress" +msgstr "Postęp raportu" + +#: libreplan-webapp/src/main/webapp/reports/workingArrangementsPerOrderReport.zul:73 +msgid "Show dependencies" +msgstr "Pokaż zależności" + +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:344 +msgid "Schedule from start to deadline" +msgstr "Zaplanuj od początku do terminu ostatecznego" + +#: libreplan-webapp/src/main/webapp/montecarlo/_montecarlo.zul:50 +#: libreplan-webapp/src/main/webapp/montecarlo/_montecarlo.zul:52 +#: libreplan-webapp/src/main/webapp/montecarlo/_montecarlo.zul:54 +msgid "Estimated days" +msgstr "Szacunkowe dni" + +#: libreplan-webapp/src/main/webapp/reports/workingProgressPerTaskReport.zul:51 +#: libreplan-webapp/src/main/webapp/reports/completedEstimatedHoursPerTask.zul:51 +#: libreplan-webapp/src/main/webapp/reports/schedulingProgressPerOrderReport.zul:61 +msgid "Reference date" +msgstr "Data odniesienia" + +#: libreplan-webapp/src/main/webapp/reports/completedEstimatedHoursPerTask.zul:21 +msgid "LibrePlan: Estimated/Planned Hours Per Task" +msgstr "LibrePlan: Szacowane / Planowane godziny na zadanie" + +#: libreplan-webapp/src/main/webapp/orders/_listOrderElementAdvances.zul:81 +msgid "Progress Evolution" +msgstr "Ewolucja postępu" + +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/reassign/Type.java:55 +msgid "From chosen date" +msgstr "Z wybranego terminu" + +#: libreplan-webapp/src/main/webapp/excetiondays/exceptionDays.zul:22 +msgid "LibrePlan: Exception Days" +msgstr "LibrePlan: Dni wyjątków" + +#: libreplan-webapp/src/main/webapp/costcategories/typeOfWorkHours.zul:23 +msgid "LibrePlan: Work Hours" +msgstr "LibrePlan: Godziny pracy" + +#: libreplan-webapp/src/main/java/org/libreplan/web/tree/TreeComponent.java:118 +msgid "Complete, Partially or Not Scheduled. (Drag and drop to move tasks)" +msgstr "Wykonano, w części lub nie zaplanowano. (Przeciągnij i upuść aby przenieść zadania)" + +#: libreplan-webapp/src/main/java/org/libreplan/web/common/CustomMenuController.java:317 +msgid "LibrePlan Configuration" +msgstr "LibrePlan Konfiguracja" + +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/chart/EarnedValueChartFiller.java:125 +msgid "CV" +msgstr "CV" + +#: libreplan-webapp/src/main/webapp/planner/taskpanels/_tabPanelNonLimitingResourceAllocation.zul:91 +msgid "Original" +msgstr "Oryginalny" + +#: libreplan-webapp/src/main/webapp/common/layout/template.zul:163 +msgid "" +"A new version of LibrePlan is available. Please check next link for more " +"information:" +msgstr "Nowa wersja LibrePlan jest dostępna. Proszę sprawdzić następny odnośnik po więcej informacji:" + +#: libreplan-webapp/src/main/webapp/planner/stretches_function.zul:31 +msgid "Stretches function configuration" +msgstr "Rozciąga konfigurację funkcji" + +#: libreplan-webapp/src/main/java/org/libreplan/web/resources/criterion/CriterionTreeController.java:295 +#: libreplan-webapp/src/main/java/org/libreplan/web/resources/criterion/CriterionTreeController.java:309 +msgid "Not indentable" +msgstr " " + +#: libreplan-webapp/src/main/java/org/libreplan/web/materials/MaterialsController.java:493 +#: libreplan-webapp/src/main/webapp/materials/materials.zul:71 +msgid "List of materials for all categories (select one to filter)" +msgstr "Wykaz materiałów dla wszystkich kategorii (wybierz jedną z filtrem)" + +#: libreplan-webapp/src/main/webapp/planner/taskpanels/_tabPanelTaskProperties.zul:73 +msgid "Resource allocation type" +msgstr "Typ alokacji zasobów" + +#: libreplan-webapp/src/main/webapp/common/layout/login.zul:103 +msgid "User disabled" +msgstr "Użytkownik wyłączony" + +#: libreplan-webapp/src/main/webapp/common/error.zul:40 +#: libreplan-webapp/src/main/webapp/common/event_error.zul:35 +msgid "Exception type" +msgstr "Typ wyjątku" + +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/allocation/AllocationRow.java:788 +msgid "In the available periods {0} only {1} hours are available." +msgstr "W dostępnych okresach {0} tylko {1} godziny są dostępne." + +#: libreplan-webapp/src/main/webapp/users/_editUser.zul:115 +msgid "Association with profiles" +msgstr "Stowarzyszenie z profilami." + +#: libreplan-webapp/src/main/java/org/libreplan/ws/common/impl/OrderElementConverter.java:627 +msgid "Task {0} : Duplicate code in DB" +msgstr "Zadanie {0}: Duplikat kodu w DB" + +#: libreplan-webapp/src/main/webapp/common/error.zul:30 +#: libreplan-webapp/src/main/webapp/common/event_error.zul:25 +msgid "Message - {0}" +msgstr "Wiadomość - {0}" + +#: libreplan-webapp/src/main/webapp/settings/settings.zul:21 +msgid "LibrePlan: Settings" +msgstr "LibrePlan: Ustawienia" + +#: libreplan-business/src/main/java/org/libreplan/business/resources/entities/Worker.java:124 +msgid "worker's surname not specified" +msgstr "pracownika nazwisko nie podano" + +#: libreplan-webapp/src/main/webapp/resources/worker/_calendar.zul:48 +#: libreplan-webapp/src/main/webapp/resources/machine/_calendar.zul:41 +msgid "Save changes" +msgstr "Zapisz zmiany" + +#: libreplan-webapp/src/main/webapp/settings/settings.zul:77 +msgid "Application settings" +msgstr "Ustawienia aplikacji" + +#: libreplan-webapp/src/main/webapp/templates/_historicalStatistics.zul:47 +msgid "Average of estimated hours" +msgstr "Średnia szacowanych godzin" + +#: libreplan-webapp/src/main/webapp/common/configuration.zul:285 +msgid "Base" +msgstr "podstawa" + +#: libreplan-webapp/src/main/java/org/libreplan/web/reports/OrderCostsPerResourceModel.java:203 +msgid "Total dedication" +msgstr "Całkowite poświęcenie" + +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderElementTreeController.java:686 +msgid "" +"You can not remove the task \"{0}\" because of this or any of its children " +"are already in use in some work reports" +msgstr "Nie możesz usunąć zadania {0} ponieważ jakiś z jego elemetn" + +#: libreplan-webapp/src/main/webapp/scenarios/transferOrders.zul:44 +msgid "Select source" +msgstr "Wybierz źródło" + +#: libreplan-webapp/src/main/java/org/libreplan/web/resources/worker/WorkerCRUDController.java:810 +msgid "Worker deleted" +msgstr "Pracownik usunięty" + +#: libreplan-webapp/src/main/java/org/libreplan/web/common/ConfigurationController.java:752 +msgid "Select entity, please" +msgstr "Proszę wybrać podmiot" + +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/allocation/streches/StretchesFunctionModel.java:291 +msgid "Stretch date must not be greater than the task's end date: " +msgstr "Data rozciągnięcia nie może być większa niż zadania daty końcowej: " + +#: libreplan-webapp/src/main/webapp/users/profiles.zul:23 +msgid "LibrePlan: Profiles" +msgstr "LibrePlan: Profile" + +#: libreplan-webapp/src/main/webapp/planner/taskpanels/_tabPanelSubcontract.zul:38 +#: libreplan-webapp/src/main/webapp/subcontract/subcontractedTasks.zul:44 +msgid "Subcontratation date" +msgstr "Data podwykonawcy" + +#: libreplan-webapp/src/main/webapp/calendars/_edition.zul:108 +#: libreplan-webapp/src/main/webapp/calendars/_edition.zul:197 +msgid "Day" +msgstr "Dzień" + +#: libreplan-webapp/src/main/webapp/subcontract/subcontractedTasks.zul:22 +msgid "LibrePlan: Subcontracted Tasks" +msgstr "LibrePlan: Zadania podwykonawcy" + +#: libreplan-webapp/src/main/webapp/settings/changePassword.zul:57 +msgid "Current password" +msgstr "Bieżące hasło" + +#: libreplan-webapp/src/main/java/org/libreplan/web/workreports/WorkReportCRUDController.java:921 +#: libreplan-webapp/src/main/java/org/libreplan/web/workreports/WorkReportCRUDController.java:1181 +#: libreplan-webapp/src/main/java/org/libreplan/web/costcategories/CostCategoryCRUDController.java:276 +msgid "Please, select an item" +msgstr "Proszę wybrać element" + +#: libreplan-webapp/src/main/java/org/libreplan/web/workreports/WorkReportCRUDController.java:1096 +msgid "Cannot be higher than finish hour" +msgstr "Nie może być wyższa niż godzina zakończenia" + +#: libreplan-webapp/src/main/webapp/common/configuration.zul:217 +#: libreplan-webapp/src/main/webapp/common/configuration.zul:236 +msgid "Prefix" +msgstr "Prefiks" + +#: libreplan-webapp/src/main/java/org/libreplan/web/templates/TemplatesTreeComponent.java:64 +msgid "New Template element" +msgstr "Nowy element szablonu" + +#: libreplan-webapp/src/main/webapp/planner/taskpanels/_tabPanelSubcontract.zul:56 +#: libreplan-webapp/src/main/webapp/subcontract/subcontractedTasks.zul:49 +msgid "Subcontracted code" +msgstr "Kod podwykonawcy" + +#: libreplan-webapp/src/main/java/org/libreplan/ws/calendars/impl/CalendarConverter.java:251 +#: libreplan-webapp/src/main/java/org/libreplan/ws/calendars/impl/CalendarConverter.java:325 +msgid "The base calendar parent not found" +msgstr "Nie znaleziono kalendarza głównego" + +#: libreplan-webapp/src/main/webapp/planner/taskpanels/_tabPanelNonLimitingResourceAllocation.zul:94 +#: libreplan-webapp/src/main/webapp/planner/taskpanels/_tabPanelNonLimitingResourceAllocation.zul:97 +msgid "Non Consolidated" +msgstr "Nie skonsolidowane" + +#: libreplan-webapp/src/main/webapp/calendars/_createNewVersion.zul:43 +msgid "From date" +msgstr "Od daty" + +#: libreplan-webapp/src/main/webapp/planner/reassign.zul:34 +msgid "Reassigning type" +msgstr "Typ ponownego przypisywania" + +#: libreplan-webapp/src/main/webapp/resources/worker/virtualWorkers.zul:22 +msgid "LibrePlan: Virtual Workers Groups" +msgstr "LibrePlan: Wirtualne Grupy Pracowników" + +#: libreplan-webapp/src/main/java/org/libreplan/web/externalcompanies/ExternalCompanyCRUDController.java:190 +msgid "{0} \"{1}\" can not be deleted because of it is being used" +msgstr "{0} \"{1}\" nie może zostać usunięty ponieważ jest on używany" + +#: libreplan-webapp/src/main/java/org/libreplan/web/workreports/WorkReportTypeCRUDController.java:772 +msgid "The field name must be unique, not null and not empty" +msgstr "Nazwa pola musi być unikatowa, nie zerowa i nie pusta" + +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/AssignedTaskQualityFormsToOrderElementController.java:382 +#: libreplan-webapp/src/main/webapp/workreports/_editWorkReportType.zul:136 +#: libreplan-webapp/src/main/webapp/workreports/_editWorkReportType.zul:157 +#: libreplan-webapp/src/main/webapp/qualityforms/_editQualityForm.zul:84 +msgid "Position" +msgstr "Pozycja" + +#: libreplan-webapp/src/main/java/org/libreplan/web/limitingresources/LimitingResourcesController.java:445 +msgid "Edit limiting resource element" +msgstr "Edytuj ograniczenia elementu zasobów" + +#: libreplan-webapp/src/main/webapp/common/layout/login.zul:108 +msgid "Incorrect authentication" +msgstr "Nieprawidłowe uwierzytelnianie" + +#: libreplan-webapp/src/main/webapp/workreports/workReportQuery.zul:112 +msgid "Edit work report" +msgstr "Edytuj raport pracy" + +#: libreplan-webapp/src/main/webapp/planner/editTask.zul:53 +#: libreplan-webapp/src/main/webapp/templates/_editTemplateWindow.zul:42 +#: libreplan-webapp/src/main/webapp/orders/_editOrderElement.zul:35 +msgid "Edit task" +msgstr "Edytuj zadanie" + +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/tabs/LimitingResourcesTabCreator.java:44 +msgid "Limiting resources (project)" +msgstr "Ograniczanie zasobów (projekt)" + +#: libreplan-webapp/src/main/java/org/libreplan/web/workreports/WorkReportTypeCRUDController.java:674 +msgid "A description field of the same name already exists." +msgstr "Pole opisu o tej samej nazwie już istnieje." + +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/ManageOrderElementAdvancesController.java:1190 +msgid "" +"Progress measurements that are reported by quality forms can not be removed" +msgstr "Pomiary postępu, które są zgłaszane przez formy jakości nie mogą być usunięte" + +#: libreplan-webapp/src/main/webapp/orders/_listOrderElementAdvances.zul:44 +msgid "Current value" +msgstr "Aktualna wartość" + +#: libreplan-webapp/src/main/java/org/libreplan/ws/common/impl/OrderElementConverter.java:823 +msgid "Duplicate progress assignment for task " +msgstr "Duplikuj przypisane postępy dla zadania " + +#: libreplan-webapp/src/main/webapp/excetiondays/_editExceptionDayType.zul:94 +#: libreplan-webapp/src/main/webapp/calendars/calendars.zul:46 +msgid "Save and Continue" +msgstr "Zapisz i kontynuuj" + +#: libreplan-webapp/src/main/webapp/planner/advance_allocation.zul:50 +msgid "Zoom level" +msgstr "Poziom zbliżenia" + +#: libreplan-webapp/src/main/webapp/qualityforms/_editQualityForm.zul:29 +#: libreplan-business/src/main/java/org/libreplan/business/advance/entities/AdvanceType.java:168 +msgid "Quality form" +msgstr "Forma jakości" + +#: libreplan-webapp/src/main/webapp/montecarlo/_montecarlo.zul:97 +msgid "Go!" +msgstr "Idź" + +#: libreplan-webapp/src/main/webapp/calendars/_list.zul:30 +msgid "Inherits up to date" +msgstr "Dziedziczy na bieżąco" + +#: libreplan-webapp/src/main/java/org/libreplan/web/labels/LabelTypeModel.java:280 +msgid "The name of the label is empty." +msgstr "Nazwa etykiety jest pusta." + +#: libreplan-webapp/src/main/webapp/users/_editProfile.zul:27 +msgid "Profile data" +msgstr "Dane profilu" + +#: libreplan-webapp/src/main/webapp/resources/machine/_editMachine.zul:33 +#: libreplan-webapp/src/main/webapp/common/configuration.zul:35 +#: libreplan-webapp/src/main/webapp/common/configuration.zul:263 +msgid "Configuration" +msgstr "Konfiguracja" + +#: libreplan-webapp/src/main/java/org/libreplan/web/calendars/BaseCalendarModel.java:489 +#: libreplan-webapp/src/main/java/org/libreplan/web/calendars/BaseCalendarModel.java:521 +msgid "This date can not be empty" +msgstr "Data ta nie może być pusta" + +#: libreplan-webapp/src/main/webapp/resources/worker/worker.zul:22 +msgid "LibrePlan: Workers" +msgstr "LibrePlan: Pracownicy" + +#: libreplan-webapp/src/main/java/org/libreplan/web/resources/worker/WorkerCRUDController.java:567 +msgid "Create Virtual Workers Group" +msgstr "Stwórz wirtualną grupę pracowników" + +#: libreplan-webapp/src/main/webapp/common/configuration.zul:100 +msgid "Enable/Disable warning about new LibrePlan versions available" +msgstr "Włącz/wyłącz ostrzeżenie o nowej wersji LibrePlan" + +#: libreplan-webapp/src/main/webapp/workreports/workReport.zul:95 +msgid "Select type" +msgstr "Wybierz typ" + +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/TaskElementAdapter.java:1021 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderModel.java:685 +msgid "Hours invested" +msgstr "Godziny zainwestowane" + +#: libreplan-webapp/src/main/webapp/common/configuration.zul:339 +msgid "Authorization" +msgstr "Autoryzacja" + +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/SaveCommandBuilder.java:326 +msgid "Project saved" +msgstr "Projekt zapisany" + +#: libreplan-webapp/src/main/java/org/libreplan/web/advance/AdvanceTypeCRUDController.java:119 +msgid "" +"The name is not valid, there is another progress type with the same name. " +msgstr "Nazwa nie jest ważna, nie ma innego rodzaju postępu o tej samej nazwie. " + +#: libreplan-webapp/src/main/webapp/workreports/workReportQuery.zul:44 +msgid "task" +msgstr "zadanie" + +#: libreplan-webapp/src/main/java/org/libreplan/web/resources/worker/WorkerCRUDController.java:697 +msgid "ALL" +msgstr "Wszystko" + +#: libreplan-business/src/main/java/org/libreplan/business/resources/entities/CriterionSatisfaction.java:215 +msgid "criterion satisfaction's resource not specified" +msgstr "nie podano kryterium satysfakcji zasobu" + +#: libreplan-webapp/src/main/webapp/excetiondays/_editExceptionDayType.zul:68 +msgid "Derived exception" +msgstr "Pochodzące z wyjątkiem" + +#: libreplan-webapp/src/main/java/org/libreplan/web/common/CustomMenuController.java:298 +msgid "Machines" +msgstr "Maszyny" + +#: libreplan-webapp/src/main/webapp/materials/_listUnitTypes.zul:22 +msgid "Unit Measures List" +msgstr "Lista jednostki miary" + +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/ManageOrderElementAdvancesController.java:148 +msgid "Couldn't find element: {0}" +msgstr "Nie można odnaleźć elementu: {0}" + +#: libreplan-webapp/src/main/java/org/libreplan/web/scenarios/TransferOrdersModel.java:148 +msgid "You should select a destination scenario" +msgstr "Należy wybrać scenariusz docelowy" + +#: libreplan-webapp/src/main/java/org/libreplan/ws/materials/impl/MaterialConverter.java:185 +#: libreplan-webapp/src/main/java/org/libreplan/ws/materials/impl/MaterialConverter.java:269 +msgid "unit type code not found" +msgstr "nie znaleziono kodu typu jednostki" + +#: libreplan-webapp/src/main/java/org/libreplan/web/common/CustomMenuController.java:350 +msgid "My account" +msgstr "Moje konto" + +#: libreplan-webapp/src/main/webapp/scenarios/transferOrders.zul:39 +msgid "Destination scenario" +msgstr "Scenariusz docelowy" + +#: libreplan-webapp/src/main/webapp/settings/settings.zul:105 +msgid "Company view" +msgstr "Widok firmy" + +#: libreplan-webapp/src/main/webapp/reports/hoursWorkedPerWorkerReport.zul:114 +msgid "Both" +msgstr "Zarówno" + +#: libreplan-webapp/src/main/java/org/libreplan/web/tree/TreeController.java:882 +msgid "Not editable for containing more that an hours group." +msgstr "Nie można edytować dla zawierającej więcej niż jedną grupę godzin." + +#: libreplan-webapp/src/main/webapp/resources/search/_resourceFilter.zul:25 +msgid "Filter by" +msgstr "Filtruj przez" + +#: libreplan-webapp/src/main/webapp/resources/worker/_edition.zul:80 +#: libreplan-webapp/src/main/webapp/resources/search/_resourceFilter.zul:46 +msgid "Limiting resource" +msgstr "Limitowane zasoby" + +#: libreplan-webapp/src/main/webapp/calendars/_createNewVersion.zul:48 +msgid "Up to date" +msgstr "Do tej pory" + +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/calendar/CalendarAllocationCommand.java:58 +#: libreplan-webapp/src/main/webapp/planner/order.zul:143 +msgid "Calendar allocation" +msgstr "Alokacja kalendarza" + +#: libreplan-webapp/src/main/java/org/libreplan/ws/common/impl/OrderElementConverter.java:819 +msgid "Duplicate value true report global progress for task" +msgstr "Powielaj prawdziwą wartość globalnego raportu postępu dla zadania" + +#: libreplan-webapp/src/main/webapp/materials/materials.zul:84 +#: libreplan-webapp/src/main/webapp/templates/_materialAssignmentsBox.zul:33 +#: libreplan-webapp/src/main/webapp/orders/components/_listOrderElementMaterials.zul:113 +msgid "Category" +msgstr "Kategoria" + +#: libreplan-webapp/src/main/java/org/libreplan/web/reports/OrderCostsPerResourceController.java:156 +msgid "must be greater than finish date" +msgstr "musi być większa od daty zakończenia" + +#: libreplan-webapp/src/main/webapp/resources/search/allocation_selector.zul:79 +#: libreplan-business/src/main/java/org/libreplan/business/resources/entities/Criterion.java:203 +msgid "[generic all workers]" +msgstr "[ogólne wszystkich pracowników]" + +#: libreplan-webapp/src/main/webapp/costcategories/_editCostCategory.zul:27 +msgid "Category data" +msgstr "Dane kategorii" + +#: libreplan-webapp/src/main/webapp/orders/components/_listOrderElementMaterials.zul:97 +msgid "Search" +msgstr "Znajdź" + +#: libreplan-webapp/src/main/webapp/calendars/_edition.zul:254 +msgid "Valid until" +msgstr "Ważne do" + +#: libreplan-webapp/src/main/webapp/workreports/_editWorkReportType.zul:128 +msgid "Add New Complementary Field" +msgstr "Dodaj nowe pole uzupełniające" + +#: libreplan-webapp/src/main/webapp/calendars/_edition.zul:244 +msgid "Work weeks list" +msgstr "Lista tygodni pracy" + +#: libreplan-webapp/src/main/webapp/scenarios/transferOrders.zul:38 +msgid "Source scenario" +msgstr "Źródłowy scenariusz" + +#: libreplan-webapp/src/main/webapp/resources/criterions/criterions.zul:24 +msgid "LibrePlan: Criteria" +msgstr "LibrePlan: Kryteria" + +#: libreplan-webapp/src/main/webapp/scenarios/transferOrders.zul:23 +msgid "LibrePlan: Transfer Projects Between Scenarios" +msgstr "LibrePlan: Przenieś projekty między scenariuszami" + +#: libreplan-webapp/src/main/webapp/orders/_listOrderElementHours.zul:118 +#: libreplan-webapp/src/main/webapp/orders/_listOrderElementHours.zul:166 +msgid "%" +msgstr "%" + +#: libreplan-webapp/src/main/webapp/resources/worker/_calendar.zul:50 +#: libreplan-webapp/src/main/webapp/resources/machine/_calendar.zul:43 +msgid "Remove calendar" +msgstr "Usuń kalendarz" + +#: libreplan-webapp/src/main/java/org/libreplan/web/workreports/WorkReportCRUDController.java:1536 +#: libreplan-webapp/src/main/java/org/libreplan/web/workreports/WorkReportCRUDController.java:1700 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/OrderPlanningController.java:338 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/company/CompanyPlanningController.java:274 +#: libreplan-webapp/src/main/java/org/libreplan/web/reports/OrderCostsPerResourceController.java:141 +#: libreplan-webapp/src/main/java/org/libreplan/web/resources/worker/WorkerCRUDController.java:633 +#: libreplan-webapp/src/main/java/org/libreplan/web/resources/machine/MachineCRUDController.java:425 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/ProjectDetailsController.java:257 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderElementTreeController.java:673 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:1332 +msgid "must be lower than finish date" +msgstr "Musi być niższa niż data zakończenia" + +#: libreplan-webapp/src/main/java/org/libreplan/web/workreports/WorkReportCRUDController.java:766 +#: libreplan-webapp/src/main/java/org/libreplan/web/common/components/finders/TaskGroupFilterEnum.java:32 +#: libreplan-webapp/src/main/java/org/libreplan/web/common/components/finders/ResourceAllocationFilterEnum.java:30 +#: libreplan-webapp/src/main/java/org/libreplan/web/common/components/finders/TaskElementFilterEnum.java:34 +#: libreplan-webapp/src/main/webapp/workreports/workReport.zul:158 +#: libreplan-webapp/src/main/webapp/workreports/_editWorkReportType.zul:81 +#: libreplan-webapp/src/main/webapp/workreports/workReportQuery.zul:41 +#: libreplan-webapp/src/main/webapp/workreports/workReportQuery.zul:70 +#: libreplan-webapp/src/main/webapp/workreports/workReportQuery.zul:135 +#: libreplan-webapp/src/main/webapp/orders/_listOrderElementHours.zul:33 +msgid "Resource" +msgstr "Zasób" + +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrdersTreeComponent.java:71 +msgid "Total task hours" +msgstr "Wszystkie godziny zadania" + +#: libreplan-webapp/src/main/webapp/subcontract/reportAdvances.zul:46 +msgid "Date last progress reported" +msgstr "Zaraportowano datę ostatniego postępu" + +#: libreplan-webapp/src/main/java/org/libreplan/web/common/entrypoints/RedirectorSynthetiser.java:125 +msgid "Could not load any resource" +msgstr "Nie można załadować dowolnego zasobu" + +#: libreplan-webapp/src/main/java/org/libreplan/web/common/CustomMenuController.java:343 +#: libreplan-webapp/src/main/webapp/reports/schedulingProgressPerOrderReport.zul:37 +msgid "Work And Progress Per Project" +msgstr "Praca i postęp na projekt" + +#: libreplan-webapp/src/main/java/org/libreplan/web/resources/worker/WorkerModel.java:385 +msgid "" +"You must allow multiple active criteria for this type to use this assignment" +" strategy" +msgstr "Musisz umożliwić aktywowanie wielu kryteriów dla tego typu aby korzystać z tej przypisanej strategii" + +#: libreplan-webapp/src/main/webapp/orders/_orderFilter.zul:31 +msgid "sub elements" +msgstr "pod elementy" + +#: libreplan-webapp/src/main/webapp/workreports/_editWorkReportType.zul:158 +msgid "Default Label" +msgstr "Domyślna etykieta" + +#: libreplan-webapp/src/main/webapp/workreports/_editWorkReportType.zul:187 +#: libreplan-webapp/src/main/webapp/planner/taskpanels/_tabPanelLimitingResourceAllocation.zul:85 +#: libreplan-webapp/src/main/webapp/planner/taskpanels/_tabPanelNonLimitingResourceAllocation.zul:113 +msgid "Close" +msgstr "Zamknąć" + +#: libreplan-webapp/src/main/java/org/libreplan/web/resourceload/ResourceLoadModel.java:945 +msgid "Specific Allocations" +msgstr "Szczególne przydziały" + +#: libreplan-webapp/src/main/java/org/libreplan/web/scenarios/ScenarioCRUDController.java:225 +#: libreplan-webapp/src/main/java/org/libreplan/web/common/TemplateController.java:120 +msgid "error doing reassignation: {0}" +msgstr "błąd przy ponownym przypisywaniu: {0}" + +#: libreplan-webapp/src/main/java/org/libreplan/web/resourceload/ResourceLoadController.java:425 +msgid "Time filter" +msgstr "Czas filtrowania" + +#: libreplan-webapp/src/main/webapp/orders/components/_orderElementTree.zul:63 +msgid "Move selected task up" +msgstr "Przenieś w górę zaznaczone zadanie" + +#: libreplan-webapp/src/main/webapp/resources/search/allocation_selector.zul:27 +msgid "Select criteria set or specific resources for allocation" +msgstr "Wybierz zestaw kryteriów lub szczególne zasoby dla alokacji" + +#: libreplan-webapp/src/main/java/org/libreplan/web/calendars/BaseCalendarCRUDController.java:350 +msgid "Create copy" +msgstr "Stwórz kopię" + +#: libreplan-webapp/src/main/webapp/externalcompanies/_editExternalCompany.zul:28 +msgid "Company data" +msgstr "Dane firmy" + +#: libreplan-webapp/src/main/webapp/workreports/workReportQuery.zul:33 +msgid "Work Report Lines List" +msgstr "Lista linii raportów pracy" + +#: libreplan-webapp/src/main/java/org/libreplan/web/materials/UnitTypeController.java:151 +msgid "Unit type code cannot be empty" +msgstr "Kod typu jednostki nie może być pusty" + +#: libreplan-webapp/src/main/java/org/libreplan/web/users/UserCRUDController.java:189 +#: libreplan-webapp/src/main/java/org/libreplan/web/common/CustomMenuController.java:320 +msgid "Users" +msgstr "Użytkownicy" + +#: libreplan-webapp/src/main/webapp/workreports/_editWorkReportType.zul:145 +msgid "Label Type fields" +msgstr "Pola typów etykiety" + +#: libreplan-webapp/src/main/webapp/workreports/_editWorkReportType.zul:105 +msgid "Hours Management" +msgstr "Zarządzanie godzinami" + +#: libreplan-webapp/src/main/webapp/common/layout/login.zul:144 +msgid "" +"Please use some of the compatible browsers: Chrome, Firefox, Safari or " +"Epiphany." +msgstr "Proszę korzystać z niektórych kompatybilnych przeglądarek: Chrome, Firefox, Safari lub Epiphany." + +#: libreplan-webapp/src/main/java/org/libreplan/web/common/components/NewAllocationSelector.java:94 +msgid "specific allocation" +msgstr "specjalny przydział" + +#: libreplan-business/src/main/java/org/libreplan/business/externalcompanies/entities/ExternalCompany.java:149 +msgid "company name has to be unique. It is already used" +msgstr "nazwa firmy musi być unikatowa. Ta jest już w użyciu" + +#: libreplan-webapp/src/main/webapp/common/concurrent_modification.zul:33 +msgid "" +"Another user has modified the same data, so the operation cannot be safely " +"completed." +msgstr "Inny użytkownik zmienił te same dane, więc operacja nie może być bezpiecznie zakończona." + +#: libreplan-webapp/src/main/java/org/libreplan/web/templates/OrderTemplatesController.java:223 +#: libreplan-webapp/src/main/java/org/libreplan/web/templates/OrderTemplatesController.java:244 +msgid "Template saved" +msgstr "Zapisano szablon" + +#: libreplan-webapp/src/main/java/org/libreplan/ws/workreports/impl/WorkReportConverter.java:565 +msgid "work report have not any description value with this field name" +msgstr "raport pracy nie ma żadnego opisu wartości o tej nazwie pola" + +#: libreplan-webapp/src/main/webapp/common/configuration.zul:23 +msgid "LibrePlan: Configuration" +msgstr "LibrePlan: Konfiguracja" + +#: libreplan-webapp/src/main/webapp/orders/_listOrderElementTaskQualityForms.zul:47 +msgid "Task quality form name" +msgstr "Nazwa jakości formy zadania" + +#: libreplan-business/src/main/java/org/libreplan/business/resources/entities/Resource.java:1093 +#: libreplan-business/src/main/java/org/libreplan/business/costcategories/entities/CostCategory.java:158 +#: libreplan-business/src/main/java/org/libreplan/business/costcategories/entities/CostCategory.java:163 +#: libreplan-business/src/main/java/org/libreplan/business/costcategories/entities/CostCategory.java:183 +msgid "Some cost category assignments overlap in time" +msgstr "Niektóre zadania kategorii kosztów pokrywają się w czasie" + +#: libreplan-webapp/src/main/webapp/orders/_listOrderElementHours.zul:26 +msgid "Imputed hours calculation" +msgstr "Kalkulacyjne obliczanie godzin" + +#: libreplan-webapp/src/main/java/org/libreplan/ws/common/impl/OrderElementConverter.java:274 +msgid ": code not found" +msgstr ": Nie znaleziono kodu" + +#: libreplan-webapp/src/main/webapp/common/error.zul:55 +#: libreplan-webapp/src/main/webapp/common/event_error.zul:51 +msgid "Exit session" +msgstr "Wyjdź z sesji" + +#: libreplan-webapp/src/main/webapp/resources/worker/_localizations.zul:31 +#: libreplan-webapp/src/main/webapp/resources/worker/_localizations.zul:53 +#: libreplan-webapp/src/main/webapp/resources/worker/_localizations.zul:67 +#: libreplan-business/src/main/java/org/libreplan/business/templates/entities/OrderLineGroupTemplate.java:244 +msgid "Group" +msgstr "Grupa" + +#: libreplan-webapp/src/main/java/org/libreplan/web/workreports/WorkReportCRUDController.java:1116 +msgid "Please, enter a valid effort" +msgstr "Proszę podać poprawny wysiłek" + +#: libreplan-webapp/src/main/webapp/advance/_listAdvanceTypes.zul:28 +#: libreplan-webapp/src/main/webapp/costcategories/_editCostCategory.zul:58 +#: libreplan-webapp/src/main/webapp/costcategories/_listTypesOfWorkHours.zul:29 +#: libreplan-webapp/src/main/webapp/costcategories/_listCostCategories.zul:27 +#: libreplan-webapp/src/main/webapp/costcategories/_editTypeOfWorkHours.zul:65 +#: libreplan-webapp/src/main/webapp/resources/criterions/_edition.zul:61 +#: libreplan-webapp/src/main/webapp/resources/criterions/_list.zul:28 +msgid "Enabled" +msgstr "Włączone" + +#: libreplan-webapp/src/main/webapp/reports/hoursWorkedPerWorkerReport.zul:111 +msgid "Apply filter to" +msgstr "Zastosuj filtr do" + +#: libreplan-webapp/src/main/webapp/templates/_historicalStatistics.zul:30 +msgid "Statistics list " +msgstr "Lista statystyki " + +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/limiting/allocation/LimitingResourceAllocationModel.java:222 +msgid "All resources must be limiting. " +msgstr "Wszystkie środki muszą być ograniczone. " + +#: libreplan-webapp/src/main/java/org/libreplan/web/resourceload/ResourceLoadController.java:527 +msgid "Filter by worker" +msgstr "Filtruj przez pracownika" + +#: libreplan-webapp/src/main/webapp/planner/_legendLoadChartOrder.zul:47 +msgid "Load due to current project" +msgstr "Załaduj z powodu obecnego projektu" + +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/allocation/AdvancedAllocationController.java:1314 +msgid "You are going to change the assignment function. Are you sure?" +msgstr "Będziesz zmienić funkcję przypisania. Czy na pewno?" + +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/allocation/streches/StretchesFunctionModel.java:183 +msgid "There must be at least 2 stretches for doing interpolation" +msgstr "Muszą być co najmniej 2 odcinki do uprawiania interpolacji" + +#: libreplan-webapp/src/main/java/org/libreplan/web/common/CustomMenuController.java:330 +msgid "Exception Days" +msgstr "Dni wyjątków" + +#: libreplan-webapp/src/main/java/org/libreplan/ws/resources/impl/ResourceConverter.java:296 +msgid "Incompatible update: stored resource is not of type: {0}" +msgstr "Niezgodna aktualizacja: przechowywany zasób nie jest typu: {0}" + +#: libreplan-webapp/src/main/webapp/labels/_editLabelType.zul:114 +#: libreplan-webapp/src/main/webapp/advance/advanceTypes.zul:38 +#: libreplan-webapp/src/main/webapp/externalcompanies/_editExternalCompany.zul:104 +#: libreplan-webapp/src/main/webapp/materials/unitTypes.zul:40 +#: libreplan-webapp/src/main/webapp/workreports/workReport.zul:207 +#: libreplan-webapp/src/main/webapp/workreports/workReportTypes.zul:37 +#: libreplan-webapp/src/main/webapp/workreports/workReportQuery.zul:187 +#: libreplan-webapp/src/main/webapp/scenarios/_edition.zul:67 +#: libreplan-webapp/src/main/webapp/costcategories/_editCostCategory.zul:96 +#: libreplan-webapp/src/main/webapp/costcategories/_editTypeOfWorkHours.zul:78 +#: libreplan-webapp/src/main/webapp/qualityforms/_editQualityForm.zul:134 +#: libreplan-webapp/src/main/webapp/users/_editProfile.zul:72 +#: libreplan-webapp/src/main/webapp/users/_editUser.zul:153 +#: libreplan-webapp/src/main/webapp/templates/templates.zul:145 +#: libreplan-webapp/src/main/webapp/resources/worker/_edition.zul:114 +#: libreplan-webapp/src/main/webapp/resources/machine/_editMachine.zul:100 +#: libreplan-webapp/src/main/webapp/resources/criterions/_edition.zul:92 +msgid "Save & Continue" +msgstr "Zapisz i kontynuuj" + +#: libreplan-webapp/src/main/webapp/orders/_edition.zul:92 +msgid "Scheduling mode" +msgstr "Tryb harmonogramu" + +#: libreplan-webapp/src/main/webapp/workreports/workReport.zul:53 +#: libreplan-webapp/src/main/webapp/workreports/workReportQuery.zul:54 +#: libreplan-webapp/src/main/webapp/qualityforms/_listQualityForm.zul:29 +#: libreplan-webapp/src/main/webapp/resources/search/_resourceFilter.zul:51 +#: libreplan-webapp/src/main/webapp/orders/_orderElementTreeFilter.zul:34 +#: libreplan-webapp/src/main/webapp/orders/_orderFilter.zul:23 +msgid "Filter" +msgstr "Filtrowanie" + +#: libreplan-webapp/src/main/webapp/reports/schedulingProgressPerOrderReport.zul:21 +msgid "LibrePlan: Work And Progress Per Project" +msgstr "LibrePlan: Praca i Postęp na projekt" + +#: libreplan-webapp/src/main/java/org/libreplan/web/workreports/WorkReportTypeCRUDController.java:945 +msgid "Work Report Type" +msgstr "Typ raportu pracy" + +#: libreplan-webapp/src/main/webapp/resources/worker/_localizations.zul:26 +msgid "Assigned locations" +msgstr "Przyznane miejsca" + +#: libreplan-business/src/main/java/org/libreplan/business/costcategories/entities/CostCategory.java:270 +#: libreplan-business/src/main/java/org/libreplan/business/costcategories/entities/CostCategory.java:131 +#: libreplan-business/src/main/java/org/libreplan/business/costcategories/entities/CostCategory.java:140 +msgid "Two hour costs with the same type overlap in time" +msgstr "Dwie godziny kosztów z tym samym typem nakładają się w czasie" + +#: libreplan-webapp/src/main/webapp/qualityforms/_editQualityForm.zul:66 +#: libreplan-webapp/src/main/webapp/orders/_listOrderElementTaskQualityForms.zul:49 +msgid "Report progress" +msgstr "Raport postępu" + +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/chart/EarnedValueChartFiller.java:123 +msgid "ACWP" +msgstr "ACWP" + +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/allocation/AllocationRow.java:791 +msgid "The periods available depend on the resource's calendar." +msgstr "Terminy zależą od zasobu kalendarza." + +#: libreplan-webapp/src/main/webapp/users/_listUsers.zul:29 +#: libreplan-webapp/src/main/webapp/users/_editUser.zul:86 +msgid "Authentication type" +msgstr "Typ uwierzytelniania" + +#: libreplan-webapp/src/main/webapp/common/layout/_customMenu.zul:55 +msgid "START" +msgstr "Start" + +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:347 +msgid "Schedule from the deadline to start" +msgstr "Harmonogram z datą ostateczną do startu" + +#: libreplan-webapp/src/main/java/org/libreplan/web/common/components/NewAllocationSelector.java:71 +msgid "generic machines allocation" +msgstr "ogólny przydział maszyn" + +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/taskedition/TaskPropertiesController.java:384 +msgid "Non limiting resource assignation" +msgstr "Nie ograniczające przypisanie zasobów" + +#: libreplan-webapp/src/main/webapp/planner/montecarlo_function.zul:68 +#: libreplan-webapp/src/main/webapp/planner/order.zul:70 +#: libreplan-webapp/src/main/webapp/templates/_editTemplateWindow.zul:75 +#: libreplan-webapp/src/main/webapp/orders/_editOrderElement.zul:86 +msgid "Back" +msgstr "Powrót" + +#: libreplan-webapp/src/main/webapp/externalcompanies/_listExternalCompanies.zul:30 +#: libreplan-webapp/src/main/webapp/externalcompanies/_editExternalCompany.zul:58 +msgid "Subcontractor" +msgstr "Podwykonawca" + +#: libreplan-webapp/src/main/webapp/resources/criterions/_workers.zul:41 +#: libreplan-business/src/main/java/org/libreplan/business/users/entities/UserRole.java:33 +msgid "Administration" +msgstr "Administracja" + +#: libreplan-webapp/src/main/java/org/libreplan/web/workreports/WorkReportCRUDController.java:1519 +#: libreplan-webapp/src/main/java/org/libreplan/web/workreports/WorkReportCRUDController.java:1682 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/OrderPlanningController.java:319 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/company/CompanyPlanningController.java:256 +#: libreplan-webapp/src/main/java/org/libreplan/web/resources/worker/WorkerCRUDController.java:616 +#: libreplan-webapp/src/main/java/org/libreplan/web/resources/machine/MachineCRUDController.java:408 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/ProjectDetailsController.java:240 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderElementTreeController.java:655 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:1315 +msgid "must be greater than start date" +msgstr "musi być większa od daty rozpoczęcia" + +#: libreplan-webapp/src/main/webapp/resources/worker/_editWorkRelationship.zul:47 +msgid "Cancel and return" +msgstr "Anuluj i wróć" + +#: libreplan-webapp/src/main/webapp/templates/_assignedQualityForms.zul:34 +#: libreplan-webapp/src/main/webapp/orders/_listOrderElementTaskQualityForms.zul:31 +msgid "Assign quality form" +msgstr "Przydziel formularz jakości" + +#: libreplan-webapp/src/main/webapp/orders/_edition.zul:157 +msgid "Calculated budget" +msgstr "" + +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/materials/AssignedMaterialsController.java:387 +msgid "Delete item {0}. Are you sure?" +msgstr "Usuń element {0}. Jesteś pewien?" + +#: libreplan-webapp/src/main/webapp/materials/_editUnitType.zul:51 +msgid "Unit measure name" +msgstr "Nazwa miary jednostki" + +#: libreplan-webapp/src/main/webapp/templates/_historicalAssignment.zul:39 +msgid "worked hours" +msgstr "przepracowane godziny" + +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/ManageOrderElementAdvancesController.java:139 +msgid "cannot include a progress of the same progress type twice" +msgstr "nie może zawierać postępu tego samego rodzaju postępu dwa razy" + +#: libreplan-webapp/src/main/java/org/libreplan/ws/workreports/impl/WorkReportConverter.java:476 +msgid "a work report line has not this label type assigned" +msgstr "Linia raportu pracy nie ma przypisanej tego typu etykiety " + +#: libreplan-webapp/src/main/webapp/planner/taskpanels/_tabPanelLimitingResourceAllocation.zul:52 +#: libreplan-webapp/src/main/webapp/planner/taskpanels/_tabPanelNonLimitingResourceAllocation.zul:59 +msgid "Allocations" +msgstr "Alokacje" + +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/assigntemplates/TemplateFinderPopup.java:137 +msgid "Choosing Template" +msgstr "" + +#: libreplan-webapp/src/main/webapp/calendars/_edition.zul:66 +#: libreplan-webapp/src/main/webapp/resources/worker/_listVirtualWorkers.zul:35 +msgid "Capacity" +msgstr "Pojemność" + +#: libreplan-webapp/src/main/java/org/libreplan/web/common/components/finders/OrderElementBandboxFinder.java:52 +msgid "Task code" +msgstr "Kod zadania" + +#: libreplan-webapp/src/main/webapp/workreports/_editWorkReportType.zul:135 +#: libreplan-webapp/src/main/webapp/planner/stretches_function.zul:49 +msgid "Length" +msgstr "Długość" + +#: libreplan-webapp/src/main/java/org/libreplan/web/scenarios/ScenarioCRUDController.java:133 +#: libreplan-webapp/src/main/java/org/libreplan/web/calendars/BaseCalendarCRUDController.java:333 +msgid "Create derived" +msgstr "Tworzenie pochodzi" + +#: libreplan-webapp/src/main/java/org/libreplan/web/labels/LabelTypeCRUDController.java:302 +msgid "Label Types" +msgstr "Typy etykiet" + +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/allocation/FormBinder.java:638 +msgid "it must be greater than zero" +msgstr "musi być większy od zera" + +#: libreplan-webapp/src/main/webapp/resources/machine/_machineConfigurationUnits.zul:131 +msgid "must be a real positive number" +msgstr "musi być prawdziwa liczba dodatnia" + +#: libreplan-webapp/src/main/webapp/orders/_listOrderElementCriterionRequirements.zul:111 +#: libreplan-webapp/src/main/webapp/orders/_listOrderElementCriterionRequirements.zul:122 +msgid "Total hours task" +msgstr "Całkowite godziny zadania" + +#: libreplan-webapp/src/main/webapp/planner/advance_allocation.zul:33 +msgid "No Allocations have been done" +msgstr "Żadne alokacje zostały wykonane" + +#: libreplan-webapp/src/main/java/org/libreplan/web/calendars/BaseCalendarCRUDController.java:443 +msgid "Removed calendar \"{0}\"" +msgstr "Usunięty kalendarz \"{0}\"" + +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:1072 +msgid "Create project" +msgstr "Stwórz projekt" + +#: libreplan-webapp/src/main/java/org/libreplan/web/calendars/BaseCalendarModel.java:535 +msgid "This date can not include the whole next work week" +msgstr "Data ta nie może obejmować całego następnego tygodnia pracy" + +#: libreplan-webapp/src/main/webapp/resources/criterions/_edition.zul:51 +msgid "" +"Allow multiple values of this type of criterion in the same period of time" +msgstr "Zezwalaj na wiele wartości tego typu kryterium w tym samym czasie" + +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/ManageOrderElementAdvancesController.java:1199 +msgid "Consolidated progress measurement can not be removed" +msgstr "Nie można usunąć skonsolidowanego pomiaru postępu" + +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/ManageOrderElementAdvancesController.java:1301 +msgid "" +"The date is not valid, the date must be unique for this progress assignment" +msgstr "Data nie jest ważna, data musi być unikalna dla tego zadania postępu" + +#: libreplan-webapp/src/main/java/org/libreplan/web/workreports/WorkReportCRUDController.java:453 +msgid "The code cannot be empty." +msgstr "Kod nie może być pusty." + +#: libreplan-webapp/src/main/webapp/resources/machine/_machineConfigurationUnits.zul:36 +msgid "Human hours per machine working hour within configuration unit" +msgstr "Ludzkie godziny na godzinę pracy maszyny w jednostce konfiguracji" + +#: libreplan-webapp/src/main/java/org/libreplan/web/users/OrderAuthorizationController.java:113 +msgid "" +"Could not add those authorizations to user {0} because they were already " +"present." +msgstr "Nie można dodawać tych zezwoleń do użytkownika {0}, ponieważ były już one obecnie użyte." + +#: libreplan-webapp/src/main/webapp/workreports/workReport.zul:103 +#: libreplan-webapp/src/main/webapp/workreports/_listWorkReportTypes.zul:47 +msgid "New work report" +msgstr "Nowy raport pracy" + +#: libreplan-webapp/src/main/java/org/libreplan/web/calendars/BaseCalendarEditionController.java:305 +msgid "Root calendar" +msgstr "Kalendarz główny" + +#: libreplan-webapp/src/main/java/org/libreplan/web/resources/worker/WorkerCRUDController.java:847 +#: libreplan-webapp/src/main/java/org/libreplan/web/resources/machine/MachineCRUDController.java:578 +msgid "yes" +msgstr "tak" + +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:871 +msgid "" +"Deleting this subcontracted project, you are going to lose the relation to " +"report progress. Are you sure?" +msgstr "Usunięcie tego podwykonawcy projektu, spowoduje utracenie relacji do raportu postępu. Jesteś pewien?" + +#: libreplan-webapp/src/main/webapp/limitingresources/manualAllocation.zul:113 +msgid "Select gap" +msgstr "Wybierz lukę" + +#: libreplan-webapp/src/main/webapp/common/configuration.zul:278 +msgid "Port" +msgstr "Port" + +#: libreplan-webapp/src/main/webapp/workreports/workReport.zul:63 +msgid "Date Finish" +msgstr "Data zakończenia" + +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/CriterionRequirementWrapper.java:224 +#: libreplan-webapp/src/main/webapp/orders/_listOrderElementCriterionRequirements.zul:95 +msgid "Validate" +msgstr "Zatwierdź" + +#: libreplan-webapp/src/main/java/org/libreplan/web/reports/HoursWorkedPerWorkerController.java:175 +msgid "This resource has already been added." +msgstr "Ten zasób został już dodany." + +#: libreplan-webapp/src/main/webapp/common/configuration.zul:162 +msgid "Calendar exception types" +msgstr "Typy wyjątków kalendarza" + +#: libreplan-webapp/src/main/webapp/resources/worker/_edition.zul:36 +#: libreplan-webapp/src/main/webapp/resources/_costCategoryAssignment.zul:25 +#: libreplan-webapp/src/main/webapp/resources/machine/_editMachine.zul:34 +msgid "Cost category assignment" +msgstr "Przypisanie kategorii kosztów" + +#: libreplan-webapp/src/main/java/org/libreplan/ws/costcategories/impl/CostCategoryConverter.java:150 +msgid "missing code in a hour cost" +msgstr "brakuje kodu w cenie godziny" + +#: libreplan-webapp/src/main/java/org/libreplan/web/exceptionDays/CalendarExceptionTypeCRUDController.java:247 +msgid "Exception Day Type" +msgstr "" + +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/TaskElementAdapter.java:973 +msgid "All workers" +msgstr "Wszyscy pracownicy" + +#: libreplan-webapp/src/main/webapp/resources/search/allocation_selector_combo.zul:25 +msgid "Select criteria or resources" +msgstr "Wybierz kryteria lub zasoby" + +#: libreplan-webapp/src/main/webapp/resources/search/_resourceFilter.zul:26 +#: libreplan-webapp/src/main/webapp/orders/_orderElementTreeFilter.zul:24 +#: libreplan-webapp/src/main/webapp/orders/_orderFilter.zul:24 +msgid "Select required criteria set and press filter button" +msgstr "Wybierz odpowiedni zestaw kryteriów, a następnie naciśnij przycisk Filtr" + +#: libreplan-webapp/src/main/java/org/libreplan/ws/common/impl/OrderElementConverter.java:632 +msgid "Hours Group {0} : Duplicate code in DB" +msgstr "Grupa godzin {0}: Duplikat kodu w DB" + +#: libreplan-webapp/src/main/java/org/libreplan/web/externalcompanies/ExternalCompanyCRUDController.java:121 +#: libreplan-webapp/src/main/java/org/libreplan/web/externalcompanies/ExternalCompanyCRUDController.java:123 +#: libreplan-webapp/src/main/java/org/libreplan/web/externalcompanies/ExternalCompanyCRUDController.java:125 +#: libreplan-webapp/src/main/java/org/libreplan/web/materials/MaterialsController.java:311 +#: libreplan-webapp/src/main/java/org/libreplan/web/costcategories/CostCategoryCRUDController.java:207 +#: libreplan-webapp/src/main/java/org/libreplan/web/costcategories/CostCategoryCRUDController.java:307 +#: libreplan-webapp/src/main/java/org/libreplan/web/templates/TemplatesTreeController.java:110 +#: libreplan-webapp/src/main/java/org/libreplan/web/templates/TemplatesTreeController.java:130 +#: libreplan-webapp/src/main/java/org/libreplan/web/calendars/BaseCalendarEditionController.java:994 +#: libreplan-webapp/src/main/java/org/libreplan/web/calendars/BaseCalendarEditionController.java:1184 +#: libreplan-webapp/src/main/java/org/libreplan/web/calendars/BaseCalendarEditionController.java:1441 +#: libreplan-webapp/src/main/java/org/libreplan/web/resources/criterion/CriterionTreeController.java:135 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/ProjectDetailsController.java:171 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/labels/AssignedLabelsController.java:115 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:1492 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:1516 +#: libreplan-webapp/src/main/java/org/libreplan/web/common/ConfigurationController.java:757 +#: libreplan-webapp/src/main/webapp/labels/_editLabelType.zul:45 +#: libreplan-webapp/src/main/webapp/labels/_editLabelType.zul:53 +#: libreplan-webapp/src/main/webapp/labels/_editLabelType.zul:89 +#: libreplan-webapp/src/main/webapp/labels/_editLabelType.zul:94 +#: libreplan-webapp/src/main/webapp/excetiondays/_editExceptionDayType.zul:43 +#: libreplan-webapp/src/main/webapp/excetiondays/_editExceptionDayType.zul:54 +#: libreplan-webapp/src/main/webapp/externalcompanies/_editExternalCompany.zul:43 +#: libreplan-webapp/src/main/webapp/externalcompanies/_editExternalCompany.zul:50 +#: libreplan-webapp/src/main/webapp/materials/materials.zul:92 +#: libreplan-webapp/src/main/webapp/materials/materials.zul:94 +#: libreplan-webapp/src/main/webapp/workreports/workReport.zul:134 +#: libreplan-webapp/src/main/webapp/scenarios/_edition.zul:34 +#: libreplan-webapp/src/main/webapp/costcategories/_editCostCategory.zul:44 +#: libreplan-webapp/src/main/webapp/costcategories/_editCostCategory.zul:54 +#: libreplan-webapp/src/main/webapp/costcategories/_editTypeOfWorkHours.zul:44 +#: libreplan-webapp/src/main/webapp/costcategories/_editTypeOfWorkHours.zul:55 +#: libreplan-webapp/src/main/webapp/costcategories/_editTypeOfWorkHours.zul:61 +#: libreplan-webapp/src/main/webapp/users/_editProfile.zul:43 +#: libreplan-webapp/src/main/webapp/users/_editUser.zul:49 +#: libreplan-webapp/src/main/webapp/templates/_materialAssignmentsBox.zul:39 +#: libreplan-webapp/src/main/webapp/calendars/_edition.zul:43 +#: libreplan-webapp/src/main/webapp/calendars/_edition.zul:58 +#: libreplan-webapp/src/main/webapp/resources/worker/_edition.zul:50 +#: libreplan-webapp/src/main/webapp/resources/machine/_machineConfigurationUnits.zul:129 +#: libreplan-webapp/src/main/webapp/resources/machine/_editMachine.zul:48 +#: libreplan-webapp/src/main/webapp/resources/criterions/_edition.zul:46 +#: libreplan-webapp/src/main/webapp/resources/criterions/_edition.zul:74 +#: libreplan-webapp/src/main/webapp/orders/_projectDetails.zul:38 +#: libreplan-webapp/src/main/webapp/orders/_projectDetails.zul:51 +#: libreplan-webapp/src/main/webapp/montecarlo/_montecarlo.zul:96 +msgid "cannot be null or empty" +msgstr "nie może być zerowy lub pusty" + +#: libreplan-webapp/src/main/java/org/libreplan/web/templates/TemplatesTree.java:43 +#: libreplan-webapp/src/main/java/org/libreplan/web/templates/TemplatesTree.java:52 +msgid "New code" +msgstr "Nowy kod" + +#: libreplan-webapp/src/main/java/org/libreplan/web/advance/AdvanceTypeModel.java:91 +msgid "The progress type cannot be modified" +msgstr "Rodzaj postępu nie może być modyfikowany" + +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/allocation/ResourceAllocationController.java:394 +msgid "Calculate Resources per Day" +msgstr "Oblicz zasoby dzienne" + +#: libreplan-webapp/src/main/java/org/libreplan/web/workreports/WorkReportTypeCRUDController.java:906 +msgid "The index fields and labels must be uniques and consecutives" +msgstr "Pola indeksu i etykiet muszą być unikalne i kolejne" + +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/chart/EarnedValueChartFiller.java:130 +msgid "Estimate To Complete" +msgstr "Szacunkowo aby zakończyć" + +#: libreplan-webapp/src/main/webapp/materials/materials.zul:83 +#: libreplan-webapp/src/main/webapp/templates/_materialAssignmentsBox.zul:30 +#: libreplan-webapp/src/main/webapp/orders/_assignmentsBox.zul:30 +#: libreplan-webapp/src/main/webapp/orders/components/_listOrderElementMaterials.zul:111 +msgid "Unit type" +msgstr "Typ jednostki" + +#: libreplan-webapp/src/main/webapp/planner/_legendLoadChartOrder.zul:42 +msgid "Load due to other assignments" +msgstr "Załaduj z powodu innych zadań" + +#: libreplan-webapp/src/main/java/org/libreplan/web/resources/machine/MachineCRUDController.java:554 +msgid "This machine was already removed by other user" +msgstr "Maszyna została już usunięta przez innego użytkownika" + +#: libreplan-webapp/src/main/java/org/libreplan/web/common/CustomMenuController.java:300 +msgid "Work Reports" +msgstr "Raporty pracy" + +#: libreplan-webapp/src/main/webapp/calendars/_edition.zul:26 +msgid "Calendar data" +msgstr "Dane kalendarza" + +#: libreplan-webapp/src/main/webapp/costcategories/_listCostCategories.zul:22 +msgid "Cost Categories List" +msgstr "Lista kategorii kosztów" + +#: libreplan-business/src/main/java/org/libreplan/business/common/IntegrationEntity.java:109 +msgid "code is already used" +msgstr "Kod jest już w użyciu" + +#: libreplan-webapp/src/main/webapp/labels/_editLabelType.zul:67 +msgid "Labels list" +msgstr "Lista etykiet" + +#: libreplan-webapp/src/main/webapp/orders/_listOrderElementCriterionRequirements.zul:152 +msgid "Criterion Requirements" +msgstr "Wymagania kryterium" + +#: libreplan-webapp/src/main/webapp/excetiondays/_editExceptionDayType.zul:76 +#: libreplan-webapp/src/main/webapp/calendars/_edition.zul:200 +#: libreplan-webapp/src/main/webapp/calendars/_edition.zul:227 +msgid "Extra Effort" +msgstr "Dodatkowy wysiłek" + +#: libreplan-webapp/src/main/java/org/libreplan/web/labels/LabelTypeModel.java:269 +msgid "Already exists other label with the same name" +msgstr "Istnieje już inna etykieta o tej samej nazwie" + +#: libreplan-webapp/src/main/webapp/orders/components/_orderElementTree.zul:59 +msgid "Move selected task down" +msgstr "Przesuń zaznaczone zadanie na dół" + +#: libreplan-webapp/src/main/java/org/libreplan/web/common/components/finders/TaskGroupFilterEnum.java:32 +#: libreplan-webapp/src/main/java/org/libreplan/web/common/components/finders/OrderFilterEnum.java:32 +msgid "Customer Reference" +msgstr "Referencje klienta" + +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/ManageOrderElementAdvancesController.java:129 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/ManageOrderElementAdvancesController.java:142 +msgid "spread values are not valid, at least one value should be true" +msgstr "rozprzestrzeniana wartość nie jest prawidłowa, co najmniej jedna wartość powinna być prawidłowa" + +#: libreplan-webapp/src/main/webapp/orders/components/_listOrderElementLabels.zul:89 +msgid "Create and assign label" +msgstr "Tworzenie i przypisywanie etykiety" + +#: libreplan-webapp/src/main/webapp/montecarlo/_montecarlo.zul:42 +msgid "Optimistic" +msgstr "Optymistyczny" + +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/chart/EarnedValueChartFiller.java:125 +msgid "SV" +msgstr "SV" + +#: libreplan-webapp/src/main/webapp/externalcompanies/_editExternalCompany.zul:85 +msgid "Our company login" +msgstr "Login naszej firmy" + +#: libreplan-webapp/src/main/java/org/libreplan/web/workreports/WorkReportCRUDController.java:1471 +msgid "Filter work reports" +msgstr "Filtruj raporty pracy" + +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/TaskElementAdapter.java:1018 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderModel.java:684 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderElementTreeController.java:603 +#: libreplan-webapp/src/main/java/org/libreplan/web/common/CustomMenuController.java:328 +#: libreplan-webapp/src/main/webapp/templates/templates.zul:64 +#: libreplan-webapp/src/main/webapp/templates/_editTemplateWindow.zul:49 +#: libreplan-webapp/src/main/webapp/orders/_editOrderElement.zul:48 +#: libreplan-webapp/src/main/webapp/orders/_edition.zul:46 +msgid "Progress" +msgstr "Postęp" + +#: libreplan-webapp/src/main/java/org/libreplan/web/calendars/BaseCalendarCRUDController.java:429 +msgid "" +"Default calendar cannot be removed. Please, change the default calendar in " +"the Configuration window before." +msgstr "Domyślny kalendarz nie może być usunięty. Proszę zmienić kalendarz domyślny we wcześniejszym oknie konfiguracji." + +#: libreplan-webapp/src/main/java/org/libreplan/web/resources/criterion/CriterionAdminController.java:257 +msgid "" +"This criterion type cannot be deleted because it has assignments to projects" +" or resources" +msgstr "Ten rodzaj kryterium nie może być usunięty, ponieważ ma zadania na rzecz innych projektów lub zasobów" + +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/ManageOrderElementAdvancesController.java:321 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/ManageOrderElementAdvancesController.java:1068 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/ManageOrderElementAdvancesController.java:1129 +msgid "" +"This progress measurement cannot be deleted or changed because it is " +"consolidated" +msgstr "Postęp tego pomiaru nie może być usunięty lub zmieniony, ponieważ jest skonsolidowany" + +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/ManageOrderElementAdvancesController.java:1247 +msgid "All progress types have already been assigned." +msgstr "Wszystkie typy postępów zostały już przypisane." + +#: libreplan-webapp/src/main/webapp/costcategories/_editCostCategory.zul:80 +msgid "Price per hour" +msgstr "Cena za godzinę" + +#: libreplan-webapp/src/main/java/org/libreplan/web/common/CustomMenuController.java:323 +msgid "Calendars" +msgstr "Kalendarze" + +#: libreplan-webapp/src/main/java/org/libreplan/web/limitingresources/QueueComponent.java:211 +msgid "Project: {0} " +msgstr "Projekt: {0} " + +#: libreplan-webapp/src/main/java/org/libreplan/web/workreports/WorkReportCRUDController.java:360 +msgid "The date cannot be null" +msgstr "Data nie może być zerowa" + +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/AssignedTaskQualityFormsToOrderElementController.java:317 +msgid "" +"Another task in the same branch is already reporting progress for this " +"quality form" +msgstr "Inne zadanie z tej samej branży ma już raportowany postęp dla tej formy jakości" + +#: libreplan-webapp/src/main/webapp/orders/_orderElementTreeFilter.zul:30 +msgid "options" +msgstr "opcje" + +#: libreplan-webapp/src/main/webapp/workreports/workReport.zul:23 +#: libreplan-webapp/src/main/webapp/workreports/workReportTypes.zul:23 +#: libreplan-webapp/src/main/webapp/workreports/workReportQuery.zul:23 +msgid "LibrePlan: Work Reports" +msgstr "LibrePlan: Raporty pracy" + +#: libreplan-webapp/src/main/java/org/libreplan/web/templates/OrderTemplatesController.java:393 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/materials/AssignedMaterialsController.java:393 +msgid "Error on showing delete confirm" +msgstr "Błąd na pokazywaniu potwierdzania usunięcia" + +#: libreplan-webapp/src/main/webapp/resources/_criterions.zul:32 +msgid "Show only current satisfied criteria" +msgstr "Pokaż tylko aktualne usatysfakcjonowane kryteria" + +#: libreplan-webapp/src/main/webapp/limitingresources/manualAllocation.zul:92 +msgid "Latest date" +msgstr "Ostateczny termin" + +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/allocation/ResourceAllocationController.java:625 +msgid "Sum of all rows" +msgstr "Suma wszystkich wierszy" + +#: libreplan-webapp/src/main/webapp/montecarlo/_montecarlo.zul:88 +msgid "Group by weeks" +msgstr "Grupa przez tygodnie" + +#: libreplan-webapp/src/main/webapp/workreports/workReportQuery.zul:82 +msgid "Finish hour" +msgstr "Zakończ godzinę" + +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/reassign/ReassignCommand.java:196 +msgid "Done {0} of {1}" +msgstr "Sporządzono {0} z {1}" + +#: libreplan-webapp/src/main/webapp/planner/taskpanels/_allocationConfiguration.zul:31 +msgid "Planned start" +msgstr "Planowane rozpoczęcie" + +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/allocation/streches/StretchesFunctionModel.java:177 +msgid "" +"Last stretch should have one hundred percent for length and amount of work " +"percentage" +msgstr "Ostatni odcinek powinien mieć w stu procentach dla długości i wysokości odsetku pracy" + +#: libreplan-webapp/src/main/webapp/reports/workingProgressPerTaskReport.zul:60 +#: libreplan-webapp/src/main/webapp/reports/completedEstimatedHoursPerTask.zul:60 +#: libreplan-webapp/src/main/webapp/reports/orderCostsPerResource.zul:71 +#: libreplan-webapp/src/main/webapp/reports/schedulingProgressPerOrderReport.zul:96 +#: libreplan-webapp/src/main/webapp/reports/workingArrangementsPerOrderReport.zul:41 +#: libreplan-webapp/src/main/webapp/reports/timeLineMaterialReport.zul:75 +msgid "Filter by projects" +msgstr "Filtruj według projektów" + +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/ManageOrderElementAdvancesController.java:293 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/ManageOrderElementAdvancesController.java:494 +msgid "" +"This progress assignment cannot be deleted or changed because it has some " +"progress consolidation" +msgstr "Przypisany postęp nie może być usunięty lub zmieniony, ponieważ ma jakąś konsolidację postępu" + +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/ManageOrderElementAdvancesController.java:730 +msgid "Consolidated progress can not be removed" +msgstr "Skonsolidowany postęp nie może być usunięty" + +#: libreplan-webapp/src/main/webapp/resources/machine/_machineConfigurationUnits.zul:33 +msgid "Each worker configuration unit name" +msgstr "Każda konfiguracja pracownika nazwy jednostki" + +#: libreplan-webapp/src/main/webapp/resources/criterions/_criterionsTree.zul:23 +msgid "Criteria of selected type " +msgstr "Kryteria zaznaczonego typu" + +#: libreplan-webapp/src/main/webapp/advance/_editAdvanceTypes.zul:44 +#: libreplan-webapp/src/main/webapp/resources/criterions/_criterionsTree.zul:43 +#: libreplan-webapp/src/main/webapp/common/configuration.zul:234 +msgid "Active" +msgstr "Aktywny" + +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/ManageOrderElementAdvancesController.java:1266 +msgid "This progress measurement can not be in " +msgstr "Ten postęp pomiaru nie może być w " + +#: libreplan-webapp/src/main/webapp/orders/components/_listOrderElementLabels.zul:29 +msgid "Inherited labels" +msgstr "Dziedziczone etykiety" + +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/ManageOrderElementAdvancesController.java:939 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/ManageOrderElementAdvancesController.java:1406 +msgid "Value is not valid, the current value must be not empty" +msgstr "Wartość nie jest prawidłowa, wartość nie może być pusta" + +#: libreplan-webapp/src/main/java/org/libreplan/web/tree/TreeController.java:1063 +#: libreplan-webapp/src/main/java/org/libreplan/web/resources/criterion/CriterionTreeController.java:292 +msgid "Unindent" +msgstr "Wsunięcie" + +#: libreplan-webapp/src/main/webapp/orders/components/_listOrderElementLabels.zul:50 +msgid "Direct labels" +msgstr "Główne etykiety" + +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/reassign/Type.java:43 +msgid "From today" +msgstr "Od dzisiaj" + +#: libreplan-webapp/src/main/webapp/common/layout/login.zul:96 +msgid "Log in" +msgstr "Zaloguj" + +#: libreplan-webapp/src/main/java/org/libreplan/web/common/components/finders/OrderBandboxFinder.java:44 +msgid "Project name" +msgstr "Nazwa projektu" + +#: libreplan-webapp/src/main/webapp/advance/_editAdvanceTypes.zul:55 +msgid "Precision" +msgstr "Precyzja" + +#: libreplan-webapp/src/main/java/org/libreplan/ws/workreports/impl/WorkReportConverter.java:359 +msgid "missing code in a work report line" +msgstr "Brakuje kodu w linii raportu pracy" + +#: libreplan-webapp/src/main/webapp/planner/print_configuration.zul:41 +msgid "Show all reported hours" +msgstr "Pokaż wszystkie raportowane godziny" + +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/allocation/AdvancedAllocationController.java:937 +msgid "Efforts" +msgstr "Wysiłki" + +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/tabs/OrdersTabCreator.java:102 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/tabs/OrdersTabCreator.java:113 +#: libreplan-webapp/src/main/java/org/libreplan/web/common/CustomMenuController.java:276 +msgid "Projects List" +msgstr "Lista projektów" + +#: libreplan-webapp/src/main/webapp/labels/_editLabelType.zul:56 +#: libreplan-webapp/src/main/webapp/excetiondays/_editExceptionDayType.zul:44 +#: libreplan-webapp/src/main/webapp/materials/_editUnitType.zul:45 +#: libreplan-webapp/src/main/webapp/materials/materials.zul:60 +#: libreplan-webapp/src/main/webapp/workreports/workReport.zul:136 +#: libreplan-webapp/src/main/webapp/workreports/_editWorkReportType.zul:60 +#: libreplan-webapp/src/main/webapp/costcategories/_editCostCategory.zul:45 +#: libreplan-webapp/src/main/webapp/costcategories/_editTypeOfWorkHours.zul:46 +#: libreplan-webapp/src/main/webapp/calendars/_edition.zul:60 +#: libreplan-webapp/src/main/webapp/resources/worker/_edition.zul:52 +#: libreplan-webapp/src/main/webapp/resources/machine/_editMachine.zul:50 +#: libreplan-webapp/src/main/webapp/resources/criterions/_edition.zul:76 +#: libreplan-webapp/src/main/webapp/orders/_projectDetails.zul:52 +#: libreplan-webapp/src/main/webapp/orders/_edition.zul:82 +msgid "Generate code" +msgstr "Generuj kod" + +#: libreplan-webapp/src/main/java/org/libreplan/web/common/ConfigurationController.java:505 +msgid "The code sequence is already in use and it can not be updated." +msgstr "Sekwencja kodu jest już w użyciu i nie może zostać zaktualizowana." + +#: libreplan-webapp/src/main/java/org/libreplan/web/tree/TreeComponent.java:116 +msgid "Scheduling state" +msgstr "Stan harmonogramu" + +#: libreplan-webapp/src/main/java/org/libreplan/web/templates/OrderTemplatesController.java:389 +msgid "This template can not be removed because it has applications." +msgstr "Ten szablon nie może zostać usunięty ponieważ ma aplikacje." + +#: libreplan-webapp/src/main/webapp/settings/settings.zul:43 +msgid "Personal Data" +msgstr "Dane osobowe" + +#: libreplan-business/src/main/java/org/libreplan/business/resources/entities/CriterionSatisfaction.java:206 +msgid "criterion satisfaction's criterion not specified" +msgstr "Kryterium satysfakcji kryterium nie zostało określone" + +#: libreplan-webapp/src/main/webapp/reports/hoursWorkedPerWorkerReport.zul:21 +msgid "LibrePlan: Hours Worked Per Resource" +msgstr "LibrePlan: godziny przepracowane w Zasobach" + +#: libreplan-webapp/src/main/java/org/libreplan/web/montecarlo/MonteCarloController.java:163 +msgid "Number of iterations should be between 1 and " +msgstr "Liczba powtórzeń powinna wynosić między 1 a " + +#: libreplan-webapp/src/main/webapp/orders/_listOrderElementHours.zul:151 +msgid "Budget in money" +msgstr "" + +#: libreplan-webapp/src/main/java/org/libreplan/web/common/ConfigurationController.java:145 +msgid "Scenarios must be enabled as more elements than master exist" +msgstr "Scenariusze muszą być włączone ponieważ istnieje więcej nadrzędnych elementów" + +#: libreplan-webapp/src/main/webapp/common/error.zul:54 +#: libreplan-webapp/src/main/webapp/common/event_error.zul:50 +msgid "Reload" +msgstr "Załaduj ponownie" + +#: libreplan-webapp/src/main/java/org/libreplan/ws/common/impl/OrderElementConverter.java:558 +#: libreplan-webapp/src/main/java/org/libreplan/ws/common/impl/OrderElementConverter.java:614 +msgid "Task {0} : Task group is incompatible type with {1}" +msgstr "Zadanie {0}: Grupa zadań ma nieprawidłowy typ z {1}" + +#: libreplan-webapp/src/main/java/org/libreplan/web/common/CustomMenuController.java:299 +msgid "Virtual Workers Groups" +msgstr "Wirtualne grupy pracowników" + +#: libreplan-webapp/src/main/webapp/orders/_listOrderElementAuthorizations.zul:26 +msgid "Profiles authorization" +msgstr "Autoryzacja profili" + +#: libreplan-webapp/src/main/webapp/planner/taskpanels/_tabPanelLimitingResourceAllocation.zul:71 +msgid "Assignation" +msgstr "Wyznaczenie" + +#: libreplan-webapp/src/main/webapp/settings/settings.zul:95 +msgid "Planning charts expanded" +msgstr "Wykresy planowania zostały rozszerzone" + +#: libreplan-webapp/src/main/java/org/libreplan/web/workreports/WorkReportTypeCRUDController.java:341 +msgid "Not deletable" +msgstr "Nie usuwalny" + +#: libreplan-webapp/src/main/java/org/libreplan/web/calendars/BaseCalendarEditionController.java:698 +msgid "Inh" +msgstr "Inh" + +#: libreplan-webapp/src/main/webapp/users/_listUsers.zul:28 +msgid "Administrator" +msgstr "Administrator" + +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/reassign/ReassignCommand.java:186 +msgid "Doing {0} reassignations" +msgstr "Robi się {0} ze ponownym wskazaniem" + +#: libreplan-webapp/src/main/webapp/common/configuration.zul:208 +msgid "Select entity" +msgstr "Wybierz wpis" + +#: libreplan-business/src/main/java/org/libreplan/business/common/IntegrationEntity.java:48 +msgid "code not specified" +msgstr "Nie podano kodu" + +#: libreplan-webapp/src/main/webapp/orders/_list.zul:22 +msgid "Projects list" +msgstr "Lista projektów" + +#: libreplan-webapp/src/main/webapp/reports/workingProgressPerTaskReport.zul:181 +#: libreplan-webapp/src/main/webapp/reports/completedEstimatedHoursPerTask.zul:182 +#: libreplan-webapp/src/main/webapp/reports/orderCostsPerResource.zul:221 +#: libreplan-webapp/src/main/webapp/reports/hoursWorkedPerWorkerReport.zul:210 +#: libreplan-webapp/src/main/webapp/reports/hoursWorkedPerWorkerInAMonthReport.zul:89 +#: libreplan-webapp/src/main/webapp/reports/schedulingProgressPerOrderReport.zul:162 +#: libreplan-webapp/src/main/webapp/reports/workingArrangementsPerOrderReport.zul:189 +#: libreplan-webapp/src/main/webapp/reports/timeLineMaterialReport.zul:159 +msgid "if the report is not opened automatically" +msgstr "jeżeli raport nie jest otwierany automatycznie" + +#: libreplan-webapp/src/main/java/org/libreplan/web/workreports/WorkReportTypeCRUDController.java:975 +msgid "" +"Cannot delete work report type. There are some work reports bound to it." +msgstr "Nie można usunąć typu raportu pracy. Istnieją inne raporty pracy powiązane z tym." + +#: libreplan-webapp/src/main/webapp/resources/criterions/_list.zul:22 +msgid "Criterion Type List" +msgstr "Lista typów kryterium" + +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/OrderPlanningModel.java:765 +msgid "Overall progress" +msgstr "Całkowity postęp" + +#: libreplan-webapp/src/main/webapp/orders/components/_orderElementTree.zul:54 +msgid "Create template from selected task" +msgstr "Stwórz szablon z zaznaczonego zadania" + +#: libreplan-webapp/src/main/java/org/libreplan/web/reports/OrderCostsPerResourceModel.java:129 +msgid "All projects" +msgstr "Wszystkie projekty" + +#: libreplan-webapp/src/main/webapp/settings/changePassword.zul:41 +#: libreplan-webapp/src/main/webapp/users/_editUser.zul:64 +#: libreplan-webapp/src/main/webapp/common/layout/login.zul:83 +#: libreplan-webapp/src/main/webapp/common/configuration.zul:299 +msgid "Password" +msgstr "Hasło" + +#: libreplan-webapp/src/main/webapp/resources/worker/_listVirtualWorkers.zul:36 +#: libreplan-webapp/src/main/webapp/resources/worker/_edition.zul:89 +msgid "Observations" +msgstr "Obserwacje" + +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:951 +msgid "Edit project" +msgstr "Edytuj projekt" + +#: libreplan-webapp/src/main/webapp/templates/_advances.zul:27 +#: libreplan-webapp/src/main/webapp/orders/_listOrderElementAdvances.zul:25 +msgid "Progress assignments" +msgstr "Postęp zadań" + +#: libreplan-webapp/src/main/webapp/calendars/_edition.zul:252 +#: libreplan-webapp/src/main/webapp/calendars/_edition.zul:274 +msgid "Valid from" +msgstr "Ważny od" + +#: libreplan-webapp/src/main/webapp/reports/hoursWorkedPerWorkerInAMonthReport.zul:53 +msgid "Month" +msgstr "Miesiąc" + +#: libreplan-webapp/src/main/java/org/libreplan/ws/calendars/impl/CalendarConverter.java:206 +msgid "exception date already exists" +msgstr "data wyjątku już istnieje" + +#: libreplan-webapp/src/main/java/org/libreplan/web/templates/OrderTemplatesModel.java:308 +msgid "There exists other template with the same name." +msgstr "Istnieje już inny szablon o tej samej nazwie." + +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/allocation/FormBinder.java:911 +msgid "{0} could not be allocated. Cannot allocate more than one resource" +msgstr "{0} nie został przyznany. Nie można przydzielić więcej niż jeden zasób" + +#: libreplan-webapp/src/main/webapp/excetiondays/_listExceptionDayTypes.zul:32 +#: libreplan-webapp/src/main/webapp/excetiondays/_editExceptionDayType.zul:58 +msgid "Color" +msgstr "Kolor" + +#: libreplan-webapp/src/main/java/org/libreplan/web/users/settings/PasswordController.java:111 +msgid "Current password is incorrect" +msgstr "Aktualne hasło jest nieprawidłowe" + +#: libreplan-webapp/src/main/java/org/libreplan/web/materials/MaterialsController.java:366 +msgid "Cannot insert material in general view. Please, select a category" +msgstr "Nie można włożyć materiału do widoku głównego. Proszę wybrać kategorię" + +#: libreplan-business/src/main/java/org/libreplan/business/resources/entities/CriterionSatisfaction.java:193 +msgid "criterion satisfaction's start date not specified" +msgstr "data rozpoczęcia kryterium satysfakcji nie została podana" + +#: libreplan-webapp/src/main/java/org/libreplan/web/common/BaseCRUDController.java:311 +msgid "Delete {0} \"{1}\". Are you sure?" +msgstr "Usuń {0} \"{1}\". Jesteś pewien?" + +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/allocation/AllocationRow.java:405 +msgid "Only {0} resources per day were achieved for current allocation" +msgstr "Tylko {0} zasobów na dzień uzyskano dla istniejącej alokacji" + +#: libreplan-webapp/src/main/webapp/planner/editTask.zul:79 +#: libreplan-webapp/src/main/webapp/planner/reassign.zul:48 +#: libreplan-webapp/src/main/webapp/planner/stretches_function.zul:89 +#: libreplan-webapp/src/main/webapp/planner/main.zul:66 +#: libreplan-webapp/src/main/webapp/planner/order.zul:128 +#: libreplan-webapp/src/main/webapp/planner/order.zul:163 +#: libreplan-webapp/src/main/webapp/orders/_projectDetails.zul:87 +#: libreplan-webapp/src/main/webapp/limitingresources/manualAllocation.zul:133 +#: libreplan-webapp/src/main/webapp/common/layout/template.zul:98 +msgid "Accept" +msgstr "Akceptuj" + +#: libreplan-webapp/src/main/webapp/externalcompanies/_editExternalCompany.zul:81 +#: libreplan-webapp/src/main/webapp/common/configuration.zul:274 +#: libreplan-webapp/src/main/webapp/common/configuration.zul:281 +#: libreplan-webapp/src/main/webapp/common/configuration.zul:288 +#: libreplan-webapp/src/main/webapp/common/configuration.zul:295 +#: libreplan-webapp/src/main/webapp/common/configuration.zul:323 +#: libreplan-webapp/src/main/webapp/common/configuration.zul:358 +#: libreplan-webapp/src/main/webapp/common/configuration.zul:365 +#: libreplan-webapp/src/main/webapp/common/configuration.zul:372 +msgid "Example: {0}" +msgstr "Przykład: {0}" + +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/materials/AssignedMaterialsController.java:458 +msgid "" +"Create new material assignment out of material assignment {0}. Are you sure?" +msgstr "Utwórz nowy zadany materiał z zadanym materiałem {0}. Jesteś pewien?" + +#: libreplan-webapp/src/main/webapp/workreports/workReport.zul:190 +#: libreplan-webapp/src/main/webapp/workreports/workReportQuery.zul:167 +msgid "Work report lines" +msgstr "Linie raportu pracy" + +#: libreplan-webapp/src/main/webapp/orders/_listOrderElementAdvances.zul:48 +msgid "Calculated" +msgstr "Kalkulowany" + +#: libreplan-webapp/src/main/java/org/libreplan/web/limitingresources/QueueComponent.java:213 +msgid "Completed: {0}% " +msgstr "Skończono: {0}% " + +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/ManageOrderElementAdvancesController.java:1194 +msgid "Calculated progress measurement can not be removed" +msgstr "Kalkulowany postęp pomiaru nie może być usunięty" + +#: libreplan-webapp/src/main/java/org/libreplan/web/exceptionDays/CalendarExceptionTypeCRUDController.java:252 +msgid "Exception Day Types" +msgstr "" + +#: libreplan-webapp/src/main/java/org/libreplan/web/resources/worker/AssignedCriterionsModel.java:335 +#: libreplan-webapp/src/main/java/org/libreplan/web/resources/worker/AssignedCriterionsModel.java:341 +msgid " The " +msgstr " " + +#: libreplan-webapp/src/main/webapp/common/layout/login.zul:55 +msgid "Access to the system" +msgstr "Dostęp do systemu" + +#: libreplan-webapp/src/main/webapp/planner/montecarlo_function.zul:48 +msgid "Probability" +msgstr "Prawdopodobieństwo" + +#: libreplan-webapp/src/main/webapp/workreports/workReport.zul:112 +#: libreplan-webapp/src/main/webapp/workreports/workReportQuery.zul:115 +msgid "Report data" +msgstr "Data raportu" + +#: libreplan-webapp/src/main/webapp/planner/_legendLoadChartOrder.zul:44 +msgid "External load" +msgstr "Załaduj z zewnątrz" + +#: libreplan-webapp/src/main/java/org/libreplan/web/subcontract/ReportAdvancesController.java:206 +msgid "Progress sent successfully" +msgstr "Postęp został wysłany" + +#: libreplan-webapp/src/main/webapp/planner/taskpanels/_tabPanelLimitingResourceAllocation.zul:73 +msgid "Priority" +msgstr "Priorytet" + +#: libreplan-webapp/src/main/java/org/libreplan/ws/common/impl/InstanceNotFoundRecoverableErrorException.java:46 +msgid "instance not found" +msgstr "Nie znaleziono instancji" + +#: libreplan-webapp/src/main/webapp/planner/advance_allocation.zul:47 +msgid "Apply changes and continue edition" +msgstr "Zaakceptuj zmiany i kontynuuj edycje" + +#: libreplan-webapp/src/main/java/org/libreplan/web/calendars/BaseCalendarEditionController.java:220 +#: libreplan-webapp/src/main/webapp/excetiondays/_editExceptionDayType.zul:80 +msgid "Infinitely Over Assignable" +msgstr "Nieskończenie przez przyporządkowanie" + +#: libreplan-webapp/src/main/webapp/orders/_listOrderElementHours.zul:157 +msgid "Money spent" +msgstr "" + +#: libreplan-business/src/main/java/org/libreplan/business/resources/entities/CriterionType.java:426 +msgid "criterion names must be unique inside a criterion type" +msgstr "Nazwy kryteriów muszą być unikatowe wewnątrz typu kryterium" + +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/allocation/AllocationRow.java:790 +msgid "" +"The periods available depend on the satisfaction of the criteria by the " +"resources and their calendars." +msgstr "Terminy zależą od spełnienia kryteriów z jego zasobów i kalendarza." + +#: libreplan-webapp/src/main/java/org/libreplan/web/workreports/WorkReportCRUDController.java:824 +#: libreplan-webapp/src/main/java/org/libreplan/web/tree/TreeComponent.java:85 +#: libreplan-webapp/src/main/java/org/libreplan/web/common/components/finders/TaskGroupFilterEnum.java:31 +#: libreplan-webapp/src/main/java/org/libreplan/web/common/components/finders/OrderFilterEnum.java:31 +#: libreplan-webapp/src/main/webapp/labels/_editLabelType.zul:49 +#: libreplan-webapp/src/main/webapp/labels/_editLabelType.zul:79 +#: libreplan-webapp/src/main/webapp/labels/_listLabelTypes.zul:27 +#: libreplan-webapp/src/main/webapp/excetiondays/_editExceptionDayType.zul:38 +#: libreplan-webapp/src/main/webapp/materials/_editUnitType.zul:37 +#: libreplan-webapp/src/main/webapp/materials/materials.zul:59 +#: libreplan-webapp/src/main/webapp/materials/materials.zul:80 +#: libreplan-webapp/src/main/webapp/workreports/workReport.zul:65 +#: libreplan-webapp/src/main/webapp/workreports/workReport.zul:131 +#: libreplan-webapp/src/main/webapp/workreports/_editWorkReportType.zul:54 +#: libreplan-webapp/src/main/webapp/scenarios/transferOrders.zul:65 +#: libreplan-webapp/src/main/webapp/scenarios/transferOrders.zul:75 +#: libreplan-webapp/src/main/webapp/scenarios/_edition.zul:51 +#: libreplan-webapp/src/main/webapp/costcategories/_editCostCategory.zul:40 +#: libreplan-webapp/src/main/webapp/costcategories/_editCostCategory.zul:78 +#: libreplan-webapp/src/main/webapp/costcategories/_listTypesOfWorkHours.zul:26 +#: libreplan-webapp/src/main/webapp/costcategories/_editTypeOfWorkHours.zul:40 +#: libreplan-webapp/src/main/webapp/reports/orderCostsPerResource.zul:91 +#: libreplan-webapp/src/main/webapp/reports/hoursWorkedPerWorkerReport.zul:86 +#: libreplan-webapp/src/main/webapp/reports/schedulingProgressPerOrderReport.zul:116 +#: libreplan-webapp/src/main/webapp/reports/timeLineMaterialReport.zul:95 +#: libreplan-webapp/src/main/webapp/templates/templates.zul:86 +#: libreplan-webapp/src/main/webapp/templates/_list.zul:26 +#: libreplan-webapp/src/main/webapp/templates/_materialAssignmentsBox.zul:28 +#: libreplan-webapp/src/main/webapp/calendars/_edition.zul:54 +#: libreplan-webapp/src/main/webapp/calendars/_edition.zul:201 +#: libreplan-webapp/src/main/webapp/calendars/_edition.zul:276 +#: libreplan-webapp/src/main/webapp/resources/worker/_edition.zul:47 +#: libreplan-webapp/src/main/webapp/resources/worker/_list.zul:38 +#: libreplan-webapp/src/main/webapp/resources/machine/_listMachines.zul:37 +#: libreplan-webapp/src/main/webapp/resources/machine/_editMachine.zul:45 +#: libreplan-webapp/src/main/webapp/resources/criterions/_edition.zul:71 +#: libreplan-webapp/src/main/webapp/resources/criterions/_list.zul:26 +#: libreplan-webapp/src/main/webapp/resources/criterions/_criterionsTree.zul:42 +#: libreplan-webapp/src/main/webapp/orders/_projectDetails.zul:47 +#: libreplan-webapp/src/main/webapp/orders/_assignmentsBox.zul:26 +#: libreplan-webapp/src/main/webapp/orders/_edition.zul:77 +#: libreplan-webapp/src/main/webapp/orders/_list.zul:29 +#: libreplan-webapp/src/main/webapp/orders/components/_listOrderElementMaterials.zul:109 +msgid "Code" +msgstr "Kod" + +#: libreplan-webapp/src/main/webapp/planner/stretches_function.zul:40 +msgid "Add stretch" +msgstr "Dodaj odcinek" + +#: libreplan-webapp/src/main/webapp/planner/taskpanels/_tabPanelLimitingResourceAllocation.zul:70 +msgid "Assignation type" +msgstr "Typ przypisany" + +#: libreplan-webapp/src/main/webapp/planner/print_configuration.zul:33 +msgid "Show resource assignments" +msgstr "Pokaż przydział zasobu" + +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/allocation/ResourceAllocationController.java:369 +msgid "Calculate Workable Days" +msgstr "Kalkuluj przepracowane dni" + +#: libreplan-webapp/src/main/java/org/libreplan/web/resources/worker/CriterionsMachineController.java:241 +#: libreplan-webapp/src/main/java/org/libreplan/web/resources/worker/CriterionsController.java:214 +msgid "" +"Start date is not valid, the new start date must be lower than the end date" +msgstr "Data rozpoczęcia nie jest ważna, nowa data rozpoczęcia musi być niższa niż data zakończenia" + +#: libreplan-webapp/src/main/webapp/planner/montecarlo_function.zul:42 +#: libreplan-webapp/src/main/webapp/reports/orderCostsPerResource.zul:92 +#: libreplan-webapp/src/main/webapp/reports/hoursWorkedPerWorkerReport.zul:51 +#: libreplan-webapp/src/main/webapp/reports/schedulingProgressPerOrderReport.zul:117 +#: libreplan-webapp/src/main/webapp/reports/timeLineMaterialReport.zul:53 +#: libreplan-webapp/src/main/webapp/reports/timeLineMaterialReport.zul:96 +#: libreplan-webapp/src/main/webapp/resources/machine/_machineConfigurationUnits.zul:54 +msgid "Start date" +msgstr "Data rozpoczęcia" + +#: libreplan-webapp/src/main/webapp/calendars/_edition.zul:183 +msgid "Update exception" +msgstr "Aktualizuj wyjątek" + +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/TreeElementOperationsController.java:253 +msgid "Operation cannot be done" +msgstr "Operacja nie może być wykonana" + +#: libreplan-webapp/src/main/java/org/libreplan/web/templates/TemplatesTreeComponent.java:91 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrdersTreeComponent.java:80 +#: libreplan-webapp/src/main/webapp/planner/taskpanels/_tabPanelTaskProperties.zul:62 +#: libreplan-webapp/src/main/webapp/templates/templates.zul:107 +#: libreplan-webapp/src/main/webapp/subcontract/subcontractedTasks.zul:52 +#: libreplan-webapp/src/main/webapp/orders/_orderElementDetails.zul:65 +#: libreplan-webapp/src/main/webapp/orders/_edition.zul:140 +msgid "Budget" +msgstr "Budżet" + +#: libreplan-webapp/src/main/java/org/libreplan/web/reports/HoursWorkedPerWorkerInAMonthController.java:44 +msgid "May" +msgstr "Maj" + +#: libreplan-webapp/src/main/java/org/libreplan/web/resources/criterion/CriterionTreeModel.java:330 +msgid "Already exists other criterion with the same name" +msgstr "Już istnieje inne kryterium o tej samej nazwie" + +#: libreplan-webapp/src/main/webapp/advance/_editAdvanceTypes.zul:38 +msgid "Unit name" +msgstr "Nazwa jednostki" + +#: libreplan-webapp/src/main/java/org/libreplan/web/common/components/finders/OrderElementBandboxFinder.java:51 +#: libreplan-webapp/src/main/java/org/libreplan/web/common/components/finders/OrderBandboxFinder.java:44 +#: libreplan-webapp/src/main/webapp/templates/_historicalAssignment.zul:35 +#: libreplan-webapp/src/main/webapp/subcontract/subcontractedTasks.zul:48 +#: libreplan-webapp/src/main/webapp/subcontract/reportAdvances.zul:43 +msgid "Project code" +msgstr "Kod projektu" + +#: libreplan-webapp/src/main/webapp/orders/_listOrderElementAuthorizations.zul:32 +#: libreplan-webapp/src/main/webapp/orders/_listOrderElementAuthorizations.zul:57 +msgid "Write" +msgstr "Pisz" + +#: libreplan-webapp/src/main/webapp/templates/_historicalStatistics.zul:39 +msgid "Number of applications" +msgstr "Liczba aplikacji" + +#: libreplan-webapp/src/main/java/org/libreplan/web/limitingresources/LimitingResourcesController.java:503 +msgid "Assign element to queue automatically" +msgstr "Przydziel element do kolejki automatycznie" + +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrdersTreeComponent.java:92 +msgid "" +"Date which the task must start after (press enter in textbox to open " +"calendar popup or type in date directly)" +msgstr "Data zadania musi rozpocząć się po (naciśnij enter w polu tekstowym aby otworzyć kalendarz albo typ danych bezpośrednio)" + +#: libreplan-webapp/src/main/java/org/libreplan/web/calendars/BaseCalendarEditionController.java:600 +#: libreplan-webapp/src/main/webapp/montecarlo/_montecarlo.zul:43 +msgid "Normal" +msgstr "Normalny" + +#: libreplan-webapp/src/main/java/org/libreplan/web/workreports/WorkReportCRUDController.java:317 +msgid "Date cannot be null" +msgstr "Data nie może być zerowa" + +#: libreplan-webapp/src/main/webapp/settings/settings.zul:108 +msgid "Project view" +msgstr "Widok projektu" + +#: libreplan-webapp/src/main/java/org/libreplan/web/workreports/WorkReportCRUDController.java:774 +#: libreplan-webapp/src/main/webapp/workreports/workReport.zul:166 +#: libreplan-webapp/src/main/webapp/workreports/workReportQuery.zul:76 +#: libreplan-webapp/src/main/webapp/workreports/workReportQuery.zul:142 +msgid "Task Code" +msgstr "Kod zadania" + +#: libreplan-webapp/src/main/java/org/libreplan/web/workreports/WorkReportTypeCRUDController.java:657 +msgid "This label type already is assigned to the work report type." +msgstr "Ten typ etykiety jest już przypisany do typu raportu pracy." + +#: libreplan-webapp/src/main/webapp/montecarlo/_montecarlo.zul:51 +#: libreplan-webapp/src/main/webapp/montecarlo/_montecarlo.zul:53 +#: libreplan-webapp/src/main/webapp/montecarlo/_montecarlo.zul:55 +msgid "Probability %" +msgstr "Prawdopodobieństwo %" + +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/OrderPlanningModel.java:763 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/company/CompanyPlanningModel.java:321 +#: libreplan-webapp/src/main/java/org/libreplan/web/resourceload/ResourceLoadController.java:815 +#: libreplan-webapp/src/main/webapp/planner/_legendLoadChartOrder.zul:49 +msgid "Load" +msgstr "Załaduj" + +#: libreplan-webapp/src/main/webapp/resources/_criterions.zul:27 +#: libreplan-webapp/src/main/webapp/resources/criterions/_criterionsTree.zul:28 +msgid "New criterion" +msgstr "Nowe kryterium" + +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderModel.java:689 +#: libreplan-webapp/src/main/webapp/materials/materials.zul:81 +#: libreplan-webapp/src/main/webapp/scenarios/_edition.zul:43 +#: libreplan-webapp/src/main/webapp/qualityforms/_listQualityForm.zul:37 +#: libreplan-webapp/src/main/webapp/qualityforms/_editQualityForm.zul:49 +#: libreplan-webapp/src/main/webapp/templates/templates.zul:102 +#: libreplan-webapp/src/main/webapp/templates/_list.zul:32 +#: libreplan-webapp/src/main/webapp/subcontract/subcontractedTasks.zul:51 +#: libreplan-webapp/src/main/webapp/resources/machine/_listMachines.zul:36 +#: libreplan-webapp/src/main/webapp/resources/machine/_editMachine.zul:62 +#: libreplan-webapp/src/main/webapp/resources/criterions/_edition.zul:67 +#: libreplan-webapp/src/main/webapp/orders/_orderElementDetails.zul:59 +#: libreplan-webapp/src/main/webapp/orders/_edition.zul:122 +msgid "Description" +msgstr "Opis" + +#: libreplan-webapp/src/main/webapp/planner/advance_allocation.zul:39 +#: libreplan-webapp/src/main/webapp/planner/advance_allocation.zul:45 +msgid "Apply" +msgstr "Zaakceptuj" + +#: libreplan-webapp/src/main/webapp/orders/components/_orderElementTree.zul:48 +msgid "Selected node" +msgstr "Zaznaczony węzeł" + +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/allocation/FormBinder.java:671 +msgid "already exists an allocation for criteria {0}" +msgstr "alokacja już istnieje dla kryterium {0}" + +#: libreplan-webapp/src/main/java/org/libreplan/web/templates/OrderTemplatesController.java:303 +#: libreplan-webapp/src/main/java/org/libreplan/web/common/CustomMenuController.java:294 +msgid "Project Templates" +msgstr "Szablony projektów" + +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:344 +msgid "Forward" +msgstr "Naprzód" + +#: libreplan-webapp/src/main/webapp/templates/_historicalStatistics.zul:43 +msgid "Number of finished applications" +msgstr "Liczba zakończonych aplikacji" + +#: libreplan-webapp/src/main/java/org/libreplan/web/limitingresources/QueueComponent.java:469 +msgid "Invalid queue element" +msgstr "Nieprawidłowy element kolejki" + +#: libreplan-webapp/src/main/java/org/libreplan/web/limitingresources/ManualAllocationController.java:575 +#: libreplan-webapp/src/main/java/org/libreplan/web/limitingresources/ManualAllocationController.java:584 +#: libreplan-webapp/src/main/java/org/libreplan/web/limitingresources/ManualAllocationController.java:592 +msgid "Unnasigned" +msgstr "Nieprzypisany" + +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/criterionrequirements/AssignedCriterionRequirementController.java:405 +msgid "At least one HoursGroup is needed" +msgstr "Co najmniej jedna HoursGroup jest potrzebna" + +#: libreplan-webapp/src/main/java/org/libreplan/web/users/UserCRUDController.java:184 +#: libreplan-webapp/src/main/webapp/externalcompanies/_editExternalCompany.zul:63 +#: libreplan-webapp/src/main/webapp/common/layout/login.zul:74 +#: libreplan-business/src/main/java/org/libreplan/business/advance/entities/AdvanceType.java:165 +msgid "User" +msgstr "Użytkownik" + +#: libreplan-webapp/src/main/webapp/externalcompanies/_editExternalCompany.zul:71 +msgid "Interacts with applications" +msgstr "Interakcja z aplikacjami" + +#: libreplan-webapp/src/main/java/org/libreplan/web/reports/HoursWorkedPerWorkerController.java:289 +msgid "Virtual worker" +msgstr "Wirtualny pracownik" + +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/allocation/streches/StretchesFunctionController.java:343 +msgid "Length percentage should be between 0 and 100" +msgstr "Długość procentowa powinna być między 0 a 100" + +#: libreplan-webapp/src/main/webapp/resources/criterions/_edition.zul:50 +msgid "Multiple values per resource" +msgstr "Wiele wartości na zasób" + +#: libreplan-webapp/src/main/webapp/templates/_materialAssignmentsBox.zul:58 +#: libreplan-webapp/src/main/webapp/orders/_assignmentsBox.zul:57 +msgid "Split" +msgstr "Dzielić" + +#: libreplan-webapp/src/main/java/org/libreplan/web/reports/TimeLineRequiredMaterialController.java:106 +#: libreplan-webapp/src/main/java/org/libreplan/web/reports/OrderCostsPerResourceController.java:107 +#: libreplan-webapp/src/main/java/org/libreplan/web/reports/SchedulingProgressPerOrderController.java:100 +msgid "please, select a project" +msgstr "proszę wybrać projekt" + +#: libreplan-webapp/src/main/webapp/common/layout/login.zul:122 +msgid "Supported Chrome, Firefox, Safari and Epiphany browsers" +msgstr "Wspierane Chrome, Firefox, Safari i Epiphany przeglądarki" + +#: libreplan-webapp/src/main/webapp/reports/schedulingProgressPerOrderReport.zul:51 +#: libreplan-webapp/src/main/webapp/resources/worker/_localizations.zul:33 +#: libreplan-webapp/src/main/webapp/resources/worker/_localizations.zul:68 +#: libreplan-webapp/src/main/webapp/resources/worker/_editWorkRelationship.zul:25 +#: libreplan-webapp/src/main/webapp/resources/worker/_workRelationships.zul:28 +#: libreplan-webapp/src/main/webapp/resources/_criterions.zul:41 +#: libreplan-webapp/src/main/webapp/orders/_projectDetails.zul:57 +#: libreplan-webapp/src/main/webapp/orders/_orderElementDetails.zul:45 +#: libreplan-webapp/src/main/webapp/orders/_edition.zul:96 +#: libreplan-webapp/src/main/webapp/orders/_list.zul:30 +msgid "Starting date" +msgstr "Data rozpoczęcia" + +#: libreplan-webapp/src/main/webapp/orders/components/_listOrderElementMaterials.zul:62 +msgid "Add materials" +msgstr "Dodaj materiały" + +#: libreplan-webapp/src/main/webapp/planner/_legendLoadChartCompany.zul:34 +msgid "Load 100%" +msgstr "Załadowane 100%" + +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/allocation/AdvancedAllocationController.java:943 +#: libreplan-webapp/src/main/webapp/planner/taskpanels/_tabPanelNonLimitingResourceAllocation.zul:84 +msgid "Function" +msgstr "Funkcja" + +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/OrderPlanningModel.java:825 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/company/CompanyPlanningModel.java:360 +msgid "date in future" +msgstr "data w przyszłości" + +#: libreplan-webapp/src/main/webapp/reports/workingProgressPerTaskReport.zul:156 +#: libreplan-webapp/src/main/webapp/reports/completedEstimatedHoursPerTask.zul:157 +#: libreplan-webapp/src/main/webapp/reports/orderCostsPerResource.zul:194 +#: libreplan-webapp/src/main/webapp/reports/hoursWorkedPerWorkerReport.zul:187 +#: libreplan-webapp/src/main/webapp/reports/hoursWorkedPerWorkerInAMonthReport.zul:64 +#: libreplan-webapp/src/main/webapp/reports/schedulingProgressPerOrderReport.zul:137 +#: libreplan-webapp/src/main/webapp/reports/workingArrangementsPerOrderReport.zul:164 +#: libreplan-webapp/src/main/webapp/reports/timeLineMaterialReport.zul:135 +msgid "Format" +msgstr "Format" + +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/SaveCommandBuilder.java:885 +msgid "New project version" +msgstr "Nowa wersja projektu" + +#: libreplan-webapp/src/main/java/org/libreplan/web/templates/TemplatesTreeController.java:79 +#: libreplan-webapp/src/main/java/org/libreplan/web/calendars/BaseCalendarCRUDController.java:366 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderElementTreeController.java:486 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:1235 +#: libreplan-webapp/src/main/java/org/libreplan/web/limitingresources/QueueComponent.java:478 +#: libreplan-webapp/src/main/java/org/libreplan/web/common/Util.java:537 +#: libreplan-webapp/src/main/webapp/labels/_listLabelTypes.zul:37 +#: libreplan-webapp/src/main/webapp/advance/_editAdvanceTypes.zul:26 +#: libreplan-webapp/src/main/webapp/excetiondays/_editExceptionDayType.zul:26 +#: libreplan-webapp/src/main/webapp/externalcompanies/_listExternalCompanies.zul:44 +#: libreplan-webapp/src/main/webapp/materials/_editUnitType.zul:25 +#: libreplan-webapp/src/main/webapp/workreports/workReport.zul:78 +#: libreplan-webapp/src/main/webapp/workreports/_listWorkReportTypes.zul:37 +#: libreplan-webapp/src/main/webapp/workreports/workReportQuery.zul:104 +#: libreplan-webapp/src/main/webapp/costcategories/_listTypesOfWorkHours.zul:42 +#: libreplan-webapp/src/main/webapp/costcategories/_listCostCategories.zul:37 +#: libreplan-webapp/src/main/webapp/qualityforms/_listQualityForm.zul:47 +#: libreplan-webapp/src/main/webapp/users/_listUsers.zul:41 +#: libreplan-webapp/src/main/webapp/users/_listProfiles.zul:35 +#: libreplan-webapp/src/main/webapp/templates/_list.zul:48 +#: libreplan-webapp/src/main/webapp/resources/worker/_listVirtualWorkers.zul:47 +#: libreplan-webapp/src/main/webapp/resources/worker/_workRelationships.zul:42 +#: libreplan-webapp/src/main/webapp/resources/criterions/_edition.zul:28 +#: libreplan-webapp/src/main/webapp/resources/criterions/_list.zul:40 +#: libreplan-webapp/src/main/webapp/resources/criterions/_workers.zul:33 +msgid "Edit" +msgstr "Edytuj" + +#: libreplan-webapp/src/main/webapp/costcategories/_editCostCategory.zul:81 +#: libreplan-webapp/src/main/webapp/resources/_costCategoryAssignment.zul:37 +msgid "Init date" +msgstr "Data init" + +#: libreplan-webapp/src/main/webapp/orders/_edition.zul:106 +msgid "Responsible" +msgstr "Odpowiedzialny" + +#: libreplan-webapp/src/main/webapp/settings/changePassword.zul:63 +msgid "New password" +msgstr "Nowe hasło" + +#: libreplan-webapp/src/main/java/org/libreplan/web/qualityforms/QualityFormCRUDController.java:253 +msgid "percentage must be in range (0,100]" +msgstr "procent musi być w przedziale (0,100]" + +#: libreplan-webapp/src/main/java/org/libreplan/web/templates/TemplatesTree.java:44 +#: libreplan-webapp/src/main/java/org/libreplan/web/templates/TemplatesTree.java:53 +msgid "New Description" +msgstr "Nowy opis" + +#: libreplan-business/src/main/java/org/libreplan/business/resources/entities/Resource.java:1150 +msgid "" +"resources cost category assignment codes must be unique inside a resource" +msgstr "przypisane kody zasobów kosztów kategorii muszą być unikalne wewnątrz zasobu" + +#: libreplan-webapp/src/main/java/org/libreplan/web/subcontract/ReportAdvancesController.java:165 +#: libreplan-webapp/src/main/java/org/libreplan/web/subcontract/SubcontractedTasksController.java:161 +msgid "XML" +msgstr "Xml" + +#: libreplan-webapp/src/main/java/org/libreplan/web/resources/worker/CriterionsMachineController.java:187 +msgid "" +"CriterionType is not valid, the criterionType overlap other " +"criterionSatisfaction whith same criterionType" +msgstr "Typ kryterium nie jest prawidłowy, typ kryterium pokrywa się z innym kryterium satysfakcji z tym samym typem kryterium" + +#: libreplan-webapp/src/main/java/org/libreplan/ws/calendarexceptiontypes/impl/CalendarExceptionTypeColorConverter.java:85 +#: libreplan-webapp/src/main/java/org/libreplan/ws/common/impl/ResourceEnumConverter.java:61 +msgid "Unable to convert {0} value to {1} type" +msgstr "Nie można skonwertować {0} wartości do {1} typu" + +#: libreplan-webapp/src/main/java/org/libreplan/web/resources/criterion/CriterionAdminController.java:114 +msgid "Tree {0} sucessfully flattened" +msgstr "Drzewo {0} pomyślnie spłaszczono" + +#: libreplan-webapp/src/main/webapp/materials/materials.zul:82 +#: libreplan-webapp/src/main/webapp/templates/_materialAssignmentsBox.zul:31 +#: libreplan-webapp/src/main/webapp/orders/_assignmentsBox.zul:31 +#: libreplan-webapp/src/main/webapp/orders/components/_listOrderElementMaterials.zul:112 +msgid "Unit price" +msgstr "Cena jednostki" + +#: libreplan-webapp/src/main/webapp/subcontract/subcontractedTasks.zul:46 +msgid "Communication date" +msgstr "Data komunikacji" + +#: libreplan-webapp/src/main/webapp/workreports/workReportQuery.zul:72 +#: libreplan-webapp/src/main/webapp/reports/completedEstimatedHoursPerTask.zul:64 +msgid "Project Code" +msgstr "Kod projektu" + +#: libreplan-webapp/src/main/webapp/planner/reassign.zul:30 +msgid "Reassigning" +msgstr "Ponowna alokacja" + +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/allocation/FormBinder.java:644 +msgid "{0} already assigned to resource allocation list" +msgstr "{0} już przypisany do listy alokacji zasobów" + +#: libreplan-webapp/src/main/java/org/libreplan/web/materials/UnitTypeController.java:184 +#: libreplan-webapp/src/main/webapp/materials/_listUnitTypes.zul:27 +msgid "Unit Measure" +msgstr "Jednostka miary" + +#: libreplan-webapp/src/main/webapp/labels/_listLabelTypes.zul:22 +msgid "Label Types List" +msgstr "Lista typów etykiet" + +#: libreplan-webapp/src/main/java/org/libreplan/web/common/components/finders/QualityFormBandboxFinder.java:51 +#: libreplan-webapp/src/main/java/org/libreplan/web/common/components/finders/LabelBandboxFinder.java:52 +#: libreplan-webapp/src/main/java/org/libreplan/web/common/components/finders/CriterionBandboxFinder.java:44 +#: libreplan-webapp/src/main/webapp/advance/_editAdvanceTypes.zul:61 +#: libreplan-webapp/src/main/webapp/workreports/workReport.zul:42 +#: libreplan-webapp/src/main/webapp/workreports/workReport.zul:64 +#: libreplan-webapp/src/main/webapp/workreports/workReport.zul:127 +#: libreplan-webapp/src/main/webapp/workreports/_sortFieldsAndLabels.zul:35 +#: libreplan-webapp/src/main/webapp/workreports/_sortFieldsAndLabels.zul:51 +#: libreplan-webapp/src/main/webapp/costcategories/_editCostCategory.zul:79 +#: libreplan-webapp/src/main/webapp/planner/taskpanels/_taskInformation.zul:33 +#: libreplan-webapp/src/main/webapp/reports/workingProgressPerTaskReport.zul:95 +#: libreplan-webapp/src/main/webapp/reports/workingProgressPerTaskReport.zul:136 +#: libreplan-webapp/src/main/webapp/reports/completedEstimatedHoursPerTask.zul:95 +#: libreplan-webapp/src/main/webapp/reports/completedEstimatedHoursPerTask.zul:136 +#: libreplan-webapp/src/main/webapp/reports/orderCostsPerResource.zul:133 +#: libreplan-webapp/src/main/webapp/reports/orderCostsPerResource.zul:174 +#: libreplan-webapp/src/main/webapp/reports/hoursWorkedPerWorkerReport.zul:83 +#: libreplan-webapp/src/main/webapp/reports/hoursWorkedPerWorkerReport.zul:123 +#: libreplan-webapp/src/main/webapp/reports/hoursWorkedPerWorkerReport.zul:165 +#: libreplan-webapp/src/main/webapp/reports/workingArrangementsPerOrderReport.zul:103 +#: libreplan-webapp/src/main/webapp/reports/workingArrangementsPerOrderReport.zul:144 +#: libreplan-webapp/src/main/webapp/templates/_list.zul:25 +#: libreplan-webapp/src/main/webapp/templates/_assignedQualityForms.zul:49 +#: libreplan-webapp/src/main/webapp/templates/_advances.zul:36 +#: libreplan-webapp/src/main/webapp/calendars/_edition.zul:47 +#: libreplan-webapp/src/main/webapp/calendars/_edition.zul:113 +#: libreplan-webapp/src/main/webapp/resources/criterions/_edition.zul:44 +#: libreplan-webapp/src/main/webapp/resources/criterions/_list.zul:27 +#: libreplan-webapp/src/main/webapp/orders/_listHoursGroupCriterionRequirement.zul:28 +#: libreplan-webapp/src/main/webapp/orders/_listOrderElementCriterionRequirements.zul:47 +#: libreplan-webapp/src/main/webapp/orders/_listOrderElementCriterionRequirements.zul:153 +#: libreplan-webapp/src/main/webapp/orders/_listOrderElementTaskQualityForms.zul:48 +#: libreplan-webapp/src/main/webapp/orders/_listOrderElementAdvances.zul:42 +msgid "Type" +msgstr "Typ" + +#: libreplan-webapp/src/main/java/org/libreplan/web/common/TemplateModel.java:348 +msgid "{0} projects reassignation remaining" +msgstr "{0} pozostało ponownie przypisanych projektów" + +#: libreplan-webapp/src/main/java/org/libreplan/web/resources/machine/MachineCRUDController.java:542 +msgid "" +"This machine cannot be deleted because it has assignments to projects or " +"imputed hours" +msgstr "Ta maszyna nie może zostać usunięta ponieważ jest przypisana do projektu lub kalkulowanych godzin" + +#: libreplan-webapp/src/main/java/org/libreplan/web/reports/HoursWorkedPerWorkerInAMonthController.java:45 +msgid "November" +msgstr "Listopad" + +#: libreplan-webapp/src/main/webapp/common/configuration.zul:89 +msgid "Enable/Disable" +msgstr "Włącz / Wyłącz" + +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/ManageOrderElementAdvancesController.java:1289 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/ManageOrderElementAdvancesController.java:1311 +msgid "" +"Value is not valid, the value must be greater than the value of the previous" +" progress." +msgstr "Wartość nie jest prawidłowa, wartość musi być większa niż wartość poprzedniego postępu." + +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/chart/EarnedValueChartFiller.java:122 +msgid "BCWS" +msgstr "Bcws" + +#: libreplan-webapp/src/main/java/org/libreplan/web/print/CutyPrint.java:343 +msgid " in the specified directory." +msgstr " w określonym katalogu." + +#: libreplan-business/src/main/java/org/libreplan/business/resources/entities/Resource.java:1144 +msgid "criterion satisfaction codes must be unique inside a resource" +msgstr "kody kryterium satysfakcji muszą być unikatowe wewnątrz zasobu" + +#: libreplan-webapp/src/main/java/org/libreplan/web/resources/worker/WorkerCRUDController.java:847 +#: libreplan-webapp/src/main/java/org/libreplan/web/resources/machine/MachineCRUDController.java:578 +msgid "no" +msgstr "nie" + +#: libreplan-webapp/src/main/java/org/libreplan/ws/workreports/impl/WorkReportConverter.java:347 +msgid "missing code in a work report." +msgstr "brakuje kodu w raporcie pracy" + +#: libreplan-webapp/src/main/java/org/libreplan/web/common/components/finders/OrderElementFilterEnum.java:36 +#: libreplan-webapp/src/main/java/org/libreplan/web/common/components/finders/TaskGroupFilterEnum.java:30 +#: libreplan-webapp/src/main/java/org/libreplan/web/common/components/finders/ResourceFilterEnum.java:29 +#: libreplan-webapp/src/main/java/org/libreplan/web/common/components/finders/ResourceAllocationFilterEnum.java:30 +#: libreplan-webapp/src/main/java/org/libreplan/web/common/components/finders/OrderFilterEnum.java:30 +#: libreplan-webapp/src/main/java/org/libreplan/web/common/components/finders/TaskElementFilterEnum.java:34 +#: libreplan-webapp/src/main/webapp/common/configuration.zul:118 +msgid "Criterion" +msgstr "Kryterium" + +#: libreplan-webapp/src/main/java/org/libreplan/web/calendars/BaseCalendarEditionController.java:103 +msgid "unl" +msgstr "unl" + +#: libreplan-webapp/src/main/webapp/common/configuration.zul:305 +msgid "Test LDAP connection" +msgstr "Testuj połączenie Ldap" + +#: libreplan-webapp/src/main/webapp/common/configuration.zul:109 +msgid "Generate code for" +msgstr "Generuj kod dla" + +#: libreplan-webapp/src/main/java/org/libreplan/ws/labels/impl/LabelConverter.java:103 +#: libreplan-webapp/src/main/java/org/libreplan/ws/workreports/impl/WorkReportConverter.java:384 +#: libreplan-webapp/src/main/java/org/libreplan/ws/workreports/impl/WorkReportConverter.java:468 +msgid "missing code in a label" +msgstr "brakuje kodu w etykiecie" + +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/chart/EarnedValueChartFiller.java:123 +msgid "Actual Cost Work Performed" +msgstr "Rzeczywisty koszt wykonywanej pracy" + +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:174 +msgid "Create project from Template" +msgstr "Stwórz projekt z szablonu" + +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderElementTreeController.java:420 +msgid "" +"Value is not valid.\n" +" Code cannot contain chars like '_' \n" +" and should not be empty" +msgstr "Wartość nie jest prawidłowa.\n Kod nie może zawierać znaków jak '_'\n i nie może być pusty" + +#: libreplan-business/src/main/java/org/libreplan/business/users/entities/OrderAuthorization.java:43 +msgid "an authorization type must be set" +msgstr "typ upoważnienia musi być ustawiony" + +#: libreplan-webapp/src/main/java/org/libreplan/web/templates/TemplatesTreeComponent.java:101 +msgid "Must start after (days since beginning project)" +msgstr "Musi rozpocząć się po (dni od rozpoczęcia projektu)" + +#: libreplan-webapp/src/main/webapp/orders/_listOrderElementHours.zul:134 +msgid "Percentage of estimated budget in money / money spent" +msgstr "" + +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/SaveCommandBuilder.java:884 +msgid "" +"Confirm creating a new project version for this scenario and derived. Are " +"you sure?" +msgstr "Potwierdź dodanie nowej wersji projektu dla tego scenariusza i pochodzenia. Jesteś pewien?" + +#: libreplan-webapp/src/main/java/org/libreplan/web/tree/TreeComponent.java:156 +#: libreplan-webapp/src/main/webapp/labels/_editLabelType.zul:72 +#: libreplan-webapp/src/main/webapp/materials/materials.zul:45 +#: libreplan-webapp/src/main/webapp/planner/taskpanels/_tabPanelLimitingResourceAllocation.zul:59 +#: libreplan-webapp/src/main/webapp/planner/taskpanels/_tabPanelNonLimitingResourceAllocation.zul:66 +#: libreplan-webapp/src/main/webapp/reports/workingProgressPerTaskReport.zul:84 +#: libreplan-webapp/src/main/webapp/reports/workingProgressPerTaskReport.zul:125 +#: libreplan-webapp/src/main/webapp/reports/completedEstimatedHoursPerTask.zul:84 +#: libreplan-webapp/src/main/webapp/reports/completedEstimatedHoursPerTask.zul:125 +#: libreplan-webapp/src/main/webapp/reports/orderCostsPerResource.zul:80 +#: libreplan-webapp/src/main/webapp/reports/orderCostsPerResource.zul:122 +#: libreplan-webapp/src/main/webapp/reports/orderCostsPerResource.zul:163 +#: libreplan-webapp/src/main/webapp/reports/hoursWorkedPerWorkerReport.zul:73 +#: libreplan-webapp/src/main/webapp/reports/hoursWorkedPerWorkerReport.zul:105 +#: libreplan-webapp/src/main/webapp/reports/hoursWorkedPerWorkerReport.zul:154 +#: libreplan-webapp/src/main/webapp/reports/schedulingProgressPerOrderReport.zul:105 +#: libreplan-webapp/src/main/webapp/reports/workingArrangementsPerOrderReport.zul:92 +#: libreplan-webapp/src/main/webapp/reports/workingArrangementsPerOrderReport.zul:133 +#: libreplan-webapp/src/main/webapp/reports/timeLineMaterialReport.zul:84 +#: libreplan-webapp/src/main/webapp/resources/_criterions.zul:29 +#: libreplan-webapp/src/main/webapp/resources/criterions/_criterionsTree.zul:30 +#: libreplan-webapp/src/main/webapp/orders/_listOrderElementCriterionRequirements.zul:35 +#: libreplan-webapp/src/main/webapp/orders/_listOrderElementCriterionRequirements.zul:166 +msgid "Add" +msgstr "Dodaj" + +#: libreplan-webapp/src/main/webapp/common/error.zul:48 +#: libreplan-webapp/src/main/webapp/common/event_error.zul:43 +msgid "Stacktrace" +msgstr "Stacktrace" + +#: libreplan-webapp/src/main/webapp/materials/materials.zul:48 +#: libreplan-webapp/src/main/webapp/reports/timeLineMaterialReport.zul:120 +#: libreplan-webapp/src/main/webapp/orders/components/_listOrderElementMaterials.zul:43 +#: libreplan-webapp/src/main/webapp/orders/components/_listOrderElementMaterials.zul:79 +msgid "Unselect" +msgstr "Odznacz" + +#: libreplan-webapp/src/main/java/org/libreplan/web/calendars/BaseCalendarEditionController.java:613 +msgid "You should select the type of exception" +msgstr "Powinieneś wybrać typ wyjątku" + +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrdersTreeComponent.java:103 +#: libreplan-webapp/src/main/webapp/planner/taskpanels/_tabPanelTaskProperties.zul:46 +#: libreplan-webapp/src/main/webapp/orders/_projectDetails.zul:63 +#: libreplan-webapp/src/main/webapp/orders/_orderElementDetails.zul:52 +#: libreplan-webapp/src/main/webapp/orders/_edition.zul:101 +#: libreplan-webapp/src/main/webapp/orders/_list.zul:31 +msgid "Deadline" +msgstr "Ostateczny termin" + +#: libreplan-webapp/src/main/webapp/reports/hoursWorkedPerWorkerReport.zul:113 +msgid "Tasks" +msgstr "Zadania" + +#: libreplan-webapp/src/main/webapp/reports/timeLineMaterialReport.zul:118 +msgid "Filter by categories or materials" +msgstr "Filtruj przez kategorie materiałów" + +#: libreplan-webapp/src/main/java/org/libreplan/web/common/CustomMenuController.java:305 +msgid "Subcontracted Tasks" +msgstr "Pod zlecone zadania" + +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/allocation/streches/StretchesFunctionController.java:389 +msgid "Amount work percentage should be between 0 and 100" +msgstr "Odsetek procentowy pracy powinien wynosić między 0 i 100" + +#: libreplan-webapp/src/main/webapp/resources/machine/_editMachine.zul:30 +msgid "Machine data" +msgstr "Dane maszyny" + +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/chart/EarnedValueChartFiller.java:128 +msgid "VAC" +msgstr "Vac" + +#: libreplan-webapp/src/main/webapp/labels/_editLabelType.zul:29 +#: libreplan-webapp/src/main/webapp/orders/components/_listOrderElementLabels.zul:34 +#: libreplan-webapp/src/main/webapp/orders/components/_listOrderElementLabels.zul:55 +msgid "Label type" +msgstr "Typ etykiety" + +#: libreplan-webapp/src/main/java/org/libreplan/web/common/CustomMenuController.java:316 +msgid "Administration / Management" +msgstr "Administracja / zarządzanie" + +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/tabs/AdvancedAllocationTabCreator.java:156 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/tabs/AdvancedAllocationTabCreator.java:236 +msgid "Advanced Allocation" +msgstr "Zaawansowana alokacja" + +#: libreplan-webapp/src/main/webapp/montecarlo/_montecarlo.zul:93 +msgid "Number of iterations" +msgstr "Liczba iteracji" + +#: libreplan-webapp/src/main/webapp/templates/templates.zul:61 +msgid "Template Tree" +msgstr "Drzewo szablonu" + +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/allocation/ResourceAllocationController.java:449 +#: libreplan-webapp/src/main/webapp/resources/machine/_machineConfigurationUnits.zul:35 +msgid "Alpha" +msgstr "Alfa" + +#: libreplan-webapp/src/main/java/org/libreplan/web/resources/criterion/CriterionTreeController.java:329 +msgid "Criterion has subelements" +msgstr "Kryterium posiada sub elementy" + +#: libreplan-webapp/src/main/java/org/libreplan/ws/materials/impl/MaterialConverter.java:163 +#: libreplan-webapp/src/main/java/org/libreplan/ws/materials/impl/MaterialConverter.java:204 +msgid "inconsistent parent code." +msgstr "niespójny kod główny" + +#: libreplan-webapp/src/main/java/org/libreplan/web/workreports/WorkReportCRUDController.java:430 +msgid "effort is not properly calculated based on clock" +msgstr "wysiłek nie jest prawidłowo obliczony na bazie zegara" + +#: libreplan-webapp/src/main/webapp/reports/timeLineMaterialReport.zul:63 +#: libreplan-webapp/src/main/webapp/orders/_assignmentsBox.zul:33 +msgid "Status" +msgstr "Status" + +#: libreplan-webapp/src/main/java/org/libreplan/web/calendars/BaseCalendarEditionController.java:321 +msgid "from {0}" +msgstr "" + +#: libreplan-webapp/src/main/webapp/settings/settings.zul:111 +msgid "Resource load view" +msgstr "Widok załadowania zasobu" + +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/order/OrderPlanningModel.java:813 +msgid "the date must be inside the visualization area" +msgstr "data musi być wewnątrz obszaru wizualizacji" + +#: libreplan-webapp/src/main/java/org/libreplan/web/workreports/WorkReportCRUDController.java:816 +#: libreplan-webapp/src/main/java/org/libreplan/web/templates/TemplatesTreeComponent.java:82 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrdersTreeComponent.java:70 +#: libreplan-webapp/src/main/java/org/libreplan/web/common/components/EffortDurationPicker.java:62 +#: libreplan-webapp/src/main/webapp/workreports/workReportQuery.zul:84 +#: libreplan-webapp/src/main/webapp/planner/stretches_function.zul:72 +#: libreplan-webapp/src/main/webapp/planner/stretches_function.zul:81 +#: libreplan-webapp/src/main/webapp/planner/taskpanels/_taskInformation.zul:34 +#: libreplan-webapp/src/main/webapp/planner/taskpanels/_tabPanelLimitingResourceAllocation.zul:72 +#: libreplan-webapp/src/main/webapp/planner/taskpanels/_tabPanelTaskProperties.zul:54 +#: libreplan-webapp/src/main/webapp/planner/taskpanels/_tabPanelNonLimitingResourceAllocation.zul:82 +#: libreplan-webapp/src/main/webapp/orders/_listOrderElementCriterionRequirements.zul:154 +#: libreplan-webapp/src/main/webapp/orders/_list.zul:34 +#: libreplan-webapp/src/main/webapp/orders/components/_orderElementTree.zul:36 +#: libreplan-webapp/src/main/webapp/orders/_listOrderElementHours.zul:35 +#: libreplan-webapp/src/main/webapp/limitingresources/manualAllocation.zul:37 +msgid "Hours" +msgstr "Godziny" + +#: libreplan-webapp/src/main/webapp/qualityforms/_editQualityForm.zul:56 +msgid "Quality form type" +msgstr "Forma typu jakości" + +#: libreplan-webapp/src/main/java/org/libreplan/web/common/BaseCRUDController.java:318 +msgid "{0} \"{1}\" deleted" +msgstr "{0} \"{1} usunięte" + +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/AssignedTaskQualityFormsToOrderElementController.java:523 +msgid "date not specified." +msgstr "nie podano daty" + +#: libreplan-webapp/src/main/java/org/libreplan/ws/workreports/impl/WorkReportConverter.java:392 +msgid "work report has not this label type assigned" +msgstr "raport pracy nie ma przypisanej tego typu etykiety" + +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/allocation/AdvancedAllocationController.java:1201 +msgid "Limiting assignment" +msgstr "Ograniczone przypisanie" + +#: libreplan-webapp/src/main/java/org/libreplan/web/limitingresources/QueueComponent.java:364 +msgid " hours" +msgstr " godziny" + +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/tabs/LimitingResourcesTabCreator.java:132 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/tabs/LimitingResourcesTabCreator.java:145 +#: libreplan-webapp/src/main/java/org/libreplan/web/common/CustomMenuController.java:288 +msgid "Limiting Resources Planning" +msgstr "Ograniczone planowanie zasobów" + +#: libreplan-webapp/src/main/java/org/libreplan/web/resources/criterion/CriterionTreeModel.java:344 +msgid "The name of the criterion is empty." +msgstr "Nazwa kryterium jest pusta" + +#: libreplan-webapp/src/main/webapp/labels/_editLabelType.zul:69 +msgid "New label" +msgstr "Nowa etykieta" + +#: libreplan-business/src/main/java/org/libreplan/business/resources/entities/Worker.java:137 +msgid "Worker ID cannot be empty" +msgstr "Identyfikator pracownika nie może być pusty" + +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/reassign/Type.java:31 +#: libreplan-webapp/src/main/java/org/libreplan/web/reports/OrderCostsPerResourceModel.java:188 +msgid "All project tasks" +msgstr "Wszystkie zadania projektu" + +#: libreplan-webapp/src/main/java/org/libreplan/web/resources/worker/CriterionsMachineController.java:352 +#: libreplan-webapp/src/main/java/org/libreplan/web/resources/worker/CriterionsController.java:343 +msgid "The start date cannot be null" +msgstr "Data rozpoczęcia nie może być zerowa" + +#: libreplan-webapp/src/main/webapp/common/configuration.zul:386 +msgid "LDAP Roles (separated by ;)" +msgstr "Role Ldap (podzielone przez ;)" + +#: libreplan-webapp/src/main/webapp/planner/taskpanels/_allocationConfiguration.zul:27 +#: libreplan-webapp/src/main/webapp/limitingresources/manualAllocation.zul:78 +msgid "Allocation configuration" +msgstr "Konfiguracja alokacji" + +#: libreplan-webapp/src/main/webapp/workreports/workReport.zul:209 +#: libreplan-webapp/src/main/webapp/workreports/workReportQuery.zul:189 +msgid "Save & New work report" +msgstr "Zapisz i stwórz nowy raport pracy" + +#: libreplan-webapp/src/main/webapp/planner/taskpanels/_tabPanelSubcontract.zul:52 +msgid "Subcontract price" +msgstr "Cena pod zlecenia" + +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/allocation/AllocationRow.java:799 +msgid "Resources per day are zero" +msgstr "Zasoby na dzień są zerowe" + +#: libreplan-webapp/src/main/webapp/resources/worker/_edition.zul:32 +#: libreplan-webapp/src/main/webapp/resources/machine/_editMachine.zul:31 +msgid "Assigned criteria" +msgstr "Przypisane kryterium" + +#: libreplan-webapp/src/main/webapp/common/layout/login.zul:57 +msgid "Help on authentication (opens a new window)" +msgstr "Pomoc w autentyczności (otwarte w nowym oknie)" + +#: libreplan-webapp/src/main/java/org/libreplan/web/common/EffortDurationBox.java:49 +msgid "Not a valid effort duration" +msgstr "Nie ważny " + +#: libreplan-webapp/src/main/java/org/libreplan/web/workreports/WorkReportTypeCRUDController.java:780 +msgid "The length must be greater than 0, and not null." +msgstr "Długość musi być większa niż 0 i nie może być pusta." + +#: libreplan-webapp/src/main/java/org/libreplan/web/exceptionDays/CalendarExceptionTypeCRUDController.java:200 +msgid "Cannot remove the predefined Exception Day Type \"{0}\"" +msgstr "Nie można usunąć zdefiniowanych typów dni wyjątkowych \"{0}\"" + +#: libreplan-webapp/src/main/webapp/calendars/_createNewVersion.zul:34 +msgid "Base calendar type" +msgstr "Typ bazowego kalendarza" + +#: libreplan-webapp/src/main/java/org/libreplan/web/calendars/BaseCalendarModel.java:606 +msgid "Could not save new calendar" +msgstr "Nie można zapisać nowego kalendarza" + +#: libreplan-webapp/src/main/webapp/planner/taskpanels/_allocationConfiguration.zul:35 +msgid "Planned end" +msgstr "Planowanie skończone" + +#: libreplan-webapp/src/main/java/org/libreplan/web/scenarios/ScenarioModel.java:224 +msgid "Could not save the scenario" +msgstr "Nie można zapisać scenariusza" + +#: libreplan-webapp/src/main/java/org/libreplan/web/resources/worker/WorkRelationshipsController.java:136 +msgid "Couldn't find criterion {0}" +msgstr "Nie można znaleźć kryterium {0}" + +#: libreplan-webapp/src/main/webapp/orders/_orderElementTreeFilter.zul:36 +#: libreplan-webapp/src/main/webapp/orders/_orderFilter.zul:33 +#: libreplan-webapp/src/main/webapp/orders/_orderFilter.zul:35 +msgid "Apply filtering to tasks satisfying required criteria" +msgstr "Zastosuj filtrowanie do zadań wymagających satysfakcjonujących kryteriów" + +#: libreplan-webapp/src/main/java/org/libreplan/web/common/CustomMenuController.java:347 +#: libreplan-webapp/src/main/webapp/reports/workingArrangementsPerOrderReport.zul:37 +msgid "Task Scheduling Status In Project" +msgstr "Status harmonogramu zadania w projekcie" + +#: libreplan-webapp/src/main/java/org/libreplan/web/qualityforms/QualityFormCRUDController.java:162 +#: libreplan-webapp/src/main/java/org/libreplan/web/templates/OrderTemplatesController.java:376 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:872 +#: libreplan-webapp/src/main/java/org/libreplan/web/common/BaseCRUDController.java:313 +msgid "Confirm" +msgstr "Potwierdź" + +#: libreplan-webapp/src/main/webapp/labels/_listLabelTypes.zul:48 +#: libreplan-webapp/src/main/webapp/advance/_listAdvanceTypes.zul:33 +#: libreplan-webapp/src/main/webapp/excetiondays/_listExceptionDayTypes.zul:40 +#: libreplan-webapp/src/main/webapp/externalcompanies/_listExternalCompanies.zul:57 +#: libreplan-webapp/src/main/webapp/materials/_listUnitTypes.zul:32 +#: libreplan-webapp/src/main/webapp/workreports/_listWorkReportTypes.zul:56 +#: libreplan-webapp/src/main/webapp/costcategories/_listTypesOfWorkHours.zul:55 +#: libreplan-webapp/src/main/webapp/costcategories/_listCostCategories.zul:49 +#: libreplan-webapp/src/main/webapp/qualityforms/_listQualityForm.zul:58 +#: libreplan-webapp/src/main/webapp/users/_listUsers.zul:54 +#: libreplan-webapp/src/main/webapp/users/_listProfiles.zul:49 +#: libreplan-webapp/src/main/webapp/calendars/_createNewVersion.zul:55 +#: libreplan-webapp/src/main/webapp/calendars/_list.zul:35 +#: libreplan-webapp/src/main/webapp/resources/worker/_list.zul:45 +#: libreplan-webapp/src/main/webapp/resources/machine/_listMachines.zul:43 +#: libreplan-webapp/src/main/webapp/resources/criterions/_list.zul:52 +msgid "Create" +msgstr "Stwórz" + +#: libreplan-webapp/src/main/java/org/libreplan/web/workreports/WorkReportCRUDController.java:1716 +#: libreplan-webapp/src/main/java/org/libreplan/web/workreports/WorkReportCRUDController.java:1722 +msgid "please, select a work report type" +msgstr "proszę wybrać typ raportu pracy" + +#: libreplan-webapp/src/main/webapp/orders/_listOrderElementAuthorizations.zul:43 +#: libreplan-webapp/src/main/webapp/orders/_listOrderElementAuthorizations.zul:67 +msgid "Permissions" +msgstr "Pozwolenia" + +#: libreplan-webapp/src/main/java/org/libreplan/web/materials/MaterialsController.java:487 +msgid "List of materials for category: {0}" +msgstr "Lista materiałów dla kategorii: {0}" + +#: libreplan-webapp/src/main/webapp/orders/_ordersTab.zul:36 +msgid "Cancel edition" +msgstr "Anuluj edycje" + +#: libreplan-webapp/src/main/webapp/templates/_materialAssignmentsBox.zul:32 +#: libreplan-webapp/src/main/webapp/orders/_assignmentsBox.zul:32 +msgid "Total price" +msgstr "Całkowita cena" + +#: libreplan-webapp/src/main/java/org/libreplan/web/materials/MaterialsController.java:271 +#: libreplan-webapp/src/main/java/org/libreplan/web/materials/MaterialsController.java:292 +#: libreplan-webapp/src/main/java/org/libreplan/web/workreports/WorkReportCRUDController.java:1214 +#: libreplan-webapp/src/main/java/org/libreplan/web/workreports/WorkReportCRUDController.java:1226 +#: libreplan-webapp/src/main/java/org/libreplan/web/workreports/WorkReportTypeCRUDController.java:346 +#: libreplan-webapp/src/main/java/org/libreplan/web/tree/TreeController.java:1101 +#: libreplan-webapp/src/main/java/org/libreplan/web/tree/TreeController.java:1107 +#: libreplan-webapp/src/main/java/org/libreplan/web/costcategories/CostCategoryCRUDController.java:289 +#: libreplan-webapp/src/main/java/org/libreplan/web/costcategories/CostCategoryCRUDController.java:457 +#: libreplan-webapp/src/main/java/org/libreplan/web/costcategories/ResourcesCostCategoryAssignmentController.java:143 +#: libreplan-webapp/src/main/java/org/libreplan/web/costcategories/ResourcesCostCategoryAssignmentController.java:163 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/allocation/streches/StretchesFunctionController.java:408 +#: libreplan-webapp/src/main/java/org/libreplan/web/planner/allocation/ResourceAllocationController.java:648 +#: libreplan-webapp/src/main/java/org/libreplan/web/reports/HoursWorkedPerWorkerController.java:264 +#: libreplan-webapp/src/main/java/org/libreplan/web/calendars/BaseCalendarEditionController.java:890 +#: libreplan-webapp/src/main/java/org/libreplan/web/calendars/BaseCalendarEditionController.java:1210 +#: libreplan-webapp/src/main/java/org/libreplan/web/calendars/BaseCalendarEditionController.java:1457 +#: libreplan-webapp/src/main/java/org/libreplan/web/calendars/BaseCalendarCRUDController.java:453 +#: libreplan-webapp/src/main/java/org/libreplan/web/resources/worker/WorkerCRUDController.java:803 +#: libreplan-webapp/src/main/java/org/libreplan/web/resources/criterion/CriterionTreeController.java:324 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/ManageOrderElementAdvancesController.java:1230 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/materials/AssignedMaterialsController.java:388 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/AssignedTaskQualityFormsToOrderElementController.java:201 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/AssignedTaskQualityFormsToOrderElementController.java:333 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/AssignedTaskQualityFormsToOrderElementController.java:406 +#: libreplan-webapp/src/main/java/org/libreplan/web/orders/OrderCRUDController.java:1251 +#: libreplan-webapp/src/main/webapp/labels/_editLabelType.zul:99 +#: libreplan-webapp/src/main/webapp/labels/_listLabelTypes.zul:42 +#: libreplan-webapp/src/main/webapp/externalcompanies/_listExternalCompanies.zul:49 +#: libreplan-webapp/src/main/webapp/materials/materials.zul:104 +#: libreplan-webapp/src/main/webapp/workreports/workReport.zul:84 +#: libreplan-webapp/src/main/webapp/workreports/_listWorkReportTypes.zul:43 +#: libreplan-webapp/src/main/webapp/costcategories/_listTypesOfWorkHours.zul:47 +#: libreplan-webapp/src/main/webapp/costcategories/_listCostCategories.zul:42 +#: libreplan-webapp/src/main/webapp/qualityforms/_listQualityForm.zul:52 +#: libreplan-webapp/src/main/webapp/qualityforms/_editQualityForm.zul:116 +#: libreplan-webapp/src/main/webapp/reports/workingProgressPerTaskReport.zul:105 +#: libreplan-webapp/src/main/webapp/reports/workingProgressPerTaskReport.zul:146 +#: libreplan-webapp/src/main/webapp/reports/completedEstimatedHoursPerTask.zul:105 +#: libreplan-webapp/src/main/webapp/reports/completedEstimatedHoursPerTask.zul:146 +#: libreplan-webapp/src/main/webapp/reports/orderCostsPerResource.zul:102 +#: libreplan-webapp/src/main/webapp/reports/orderCostsPerResource.zul:143 +#: libreplan-webapp/src/main/webapp/reports/orderCostsPerResource.zul:184 +#: libreplan-webapp/src/main/webapp/reports/hoursWorkedPerWorkerReport.zul:133 +#: libreplan-webapp/src/main/webapp/reports/hoursWorkedPerWorkerReport.zul:175 +#: libreplan-webapp/src/main/webapp/reports/schedulingProgressPerOrderReport.zul:127 +#: libreplan-webapp/src/main/webapp/reports/workingArrangementsPerOrderReport.zul:113 +#: libreplan-webapp/src/main/webapp/reports/workingArrangementsPerOrderReport.zul:154 +#: libreplan-webapp/src/main/webapp/reports/timeLineMaterialReport.zul:106 +#: libreplan-webapp/src/main/webapp/users/_listUsers.zul:46 +#: libreplan-webapp/src/main/webapp/users/_listProfiles.zul:40 +#: libreplan-webapp/src/main/webapp/users/_editUser.zul:137 +#: libreplan-webapp/src/main/webapp/templates/_list.zul:53 +#: libreplan-webapp/src/main/webapp/templates/_materialAssignmentsBox.zul:55 +#: libreplan-webapp/src/main/webapp/resources/worker/_listVirtualWorkers.zul:52 +#: libreplan-webapp/src/main/webapp/resources/worker/_workRelationships.zul:46 +#: libreplan-webapp/src/main/webapp/resources/_criterions.zul:88 +#: libreplan-webapp/src/main/webapp/resources/machine/_machineConfigurationUnits.zul:70 +#: libreplan-webapp/src/main/webapp/resources/machine/_machineConfigurationUnits.zul:118 +#: libreplan-webapp/src/main/webapp/resources/machine/_machineConfigurationUnits.zul:133 +#: libreplan-webapp/src/main/webapp/resources/criterions/_list.zul:45 +#: libreplan-webapp/src/main/webapp/orders/_listHoursGroupCriterionRequirement.zul:102 +#: libreplan-webapp/src/main/webapp/orders/_listOrderElementCriterionRequirements.zul:91 +#: libreplan-webapp/src/main/webapp/orders/_listOrderElementCriterionRequirements.zul:212 +#: libreplan-webapp/src/main/webapp/orders/_assignmentsBox.zul:54 +#: libreplan-webapp/src/main/webapp/orders/_listOrderElementAuthorizations.zul:79 +#: libreplan-webapp/src/main/webapp/orders/components/_listOrderElementLabels.zul:67 +msgid "Delete" +msgstr "Usuń" + +#: libreplan-webapp/src/main/webapp/orders/_orderElementTreeFilter.zul:46 +msgid "Labels without inheritance" +msgstr "Etykiety bez dziedziczenia" + +#: libreplan-business/src/main/java/org/libreplan/business/materials/entities/MaterialStatusEnum.java:32 +msgid "RECEIVED" +msgstr "Otrzymany" + +#: libreplan-business/src/main/java/org/libreplan/business/materials/entities/MaterialStatusEnum.java:33 +msgid "PENDING" +msgstr "Spodziewany" + +#: libreplan-business/src/main/java/org/libreplan/business/materials/entities/MaterialStatusEnum.java:34 +msgid "ORDERED" +msgstr "Zamówiony" + +#: libreplan-business/src/main/java/org/libreplan/business/materials/entities/MaterialStatusEnum.java:35 +msgid "PROCESSING" +msgstr "Przetwarzanie" + +#: libreplan-business/src/main/java/org/libreplan/business/materials/entities/MaterialStatusEnum.java:36 +msgid "CANCELED" +msgstr "Anulowany" + +#: libreplan-business/src/main/java/org/libreplan/business/workreports/entities/PositionInWorkReportEnum.java:34 +msgid "heading" +msgstr "nagłówek" + +#: libreplan-business/src/main/java/org/libreplan/business/workreports/entities/PositionInWorkReportEnum.java:34 +msgid "line" +msgstr "linia" + +#: libreplan-business/src/main/java/org/libreplan/business/workreports/entities/HoursManagementEnum.java:31 +msgid "Number of assigned hours" +msgstr "Liczba przypisanych godzin" + +#: libreplan-business/src/main/java/org/libreplan/business/workreports/entities/HoursManagementEnum.java:32 +msgid "Number of hours calculated by clock" +msgstr "Liczba godzin obliczonych przez zegar" + +#: libreplan-business/src/main/java/org/libreplan/business/workreports/entities/HoursManagementEnum.java:33 +msgid "Number of assigned hours and the time" +msgstr "Liczba przypisanych godzin i czasu" + +#: libreplan-business/src/main/java/org/libreplan/business/costcategories/entities/CostCategory.java:109 +msgid "Hours cost type cannot be empty or null" +msgstr "Koszta godzin nie mogą być puste lub zerowe" + +#: libreplan-business/src/main/java/org/libreplan/business/costcategories/entities/CostCategory.java:118 +msgid "Init date cannot be empty or null" +msgstr "Data init nie może być pusta lub zerowa" + +#: libreplan-business/src/main/java/org/libreplan/business/costcategories/entities/CostCategory.java:123 +msgid "End date cannot be empty or null" +msgstr "Data zakończenia nie może być pusta lub zerowa" + +#: libreplan-business/src/main/java/org/libreplan/business/qualityforms/entities/QualityFormType.java:29 +msgid "by percentage" +msgstr "przez procent" + +#: libreplan-business/src/main/java/org/libreplan/business/qualityforms/entities/QualityFormType.java:29 +msgid "by items" +msgstr "przez elementy" + +#: libreplan-business/src/main/java/org/libreplan/business/settings/entities/Language.java:34 +msgid "Use browser language configuration" +msgstr "Użyj konfiguracji języka przeglądarki" + +#: libreplan-business/src/main/java/org/libreplan/business/planner/entities/StretchesFunction.java:410 +msgid "Stretches must sum 100%" +msgstr "Odcinki należy zsumować do 100%" + +#: libreplan-business/src/main/java/org/libreplan/business/planner/entities/AssignmentFunction.java:76 +msgid "Flat" +msgstr "Płaski" + +#: libreplan-business/src/main/java/org/libreplan/business/planner/entities/AssignmentFunction.java:78 +msgid "Stretches" +msgstr "Rozciąga" + +#: libreplan-business/src/main/java/org/libreplan/business/planner/entities/AssignmentFunction.java:79 +msgid "Interpolation" +msgstr "" + +#: libreplan-business/src/main/java/org/libreplan/business/planner/entities/AssignmentFunction.java:80 +msgid "Sigmoid" +msgstr "Esicy" + +#: libreplan-business/src/main/java/org/libreplan/business/planner/entities/SubcontractState.java:32 +#: libreplan-business/src/main/java/org/libreplan/business/planner/entities/TaskStatusEnum.java:30 +msgid "Pending" +msgstr "Do czasu" + +#: libreplan-business/src/main/java/org/libreplan/business/planner/entities/SubcontractState.java:32 +msgid "Failed sent" +msgstr "Nie udało się wysłać" + +#: libreplan-business/src/main/java/org/libreplan/business/planner/entities/SubcontractState.java:33 +msgid "Success sent" +msgstr "Sukces wysłany" + +#: libreplan-business/src/main/java/org/libreplan/business/planner/entities/allocationalgorithms/ResourcesPerDayModification.java:95 +msgid "There are no days available due to not satisfying the criteria." +msgstr "Brakuje dni dostępnych ze względu na nie spełnienie kryteriów." + +#: libreplan-business/src/main/java/org/libreplan/business/planner/entities/allocationalgorithms/ResourcesPerDayModification.java:96 +msgid "" +"Another possibility is that the resources don't have days available due to " +"their calendars." +msgstr "Inną możliwością jest, że zasoby nie mają dni dostępnych ze względu na ich kalendarz." + +#: libreplan-business/src/main/java/org/libreplan/business/planner/entities/allocationalgorithms/ResourcesPerDayModification.java:102 +msgid "" +"There are no days available in the days marked available by the task " +"calendar." +msgstr "Brak dni dostępnych w dniach zaznaczonych przez kalendarz zadania." + +#: libreplan-business/src/main/java/org/libreplan/business/planner/entities/allocationalgorithms/ResourcesPerDayModification.java:103 +msgid "Maybe the criteria are not satisfied in those days." +msgstr "Być może kryteria nie są spełnione w tych dniach." + +#: libreplan-business/src/main/java/org/libreplan/business/planner/entities/allocationalgorithms/ResourcesPerDayModification.java:170 +msgid "" +"The resource's calendar has no available days starting from the start of the" +" task." +msgstr "Kalendarz zasobów nie ma dostępnych dni rozpoczynających się od momentu rozpoczęcia zadania." + +#: libreplan-business/src/main/java/org/libreplan/business/planner/entities/allocationalgorithms/ResourcesPerDayModification.java:175 +msgid "" +"There are no days available at resource's calendar in the days marked " +"available by the task's calendar." +msgstr "Nie ma tutaj dni dostępnych w kalendarzu zasobów w zaznaczonych dniach przez zadania kalendarza." + +#: libreplan-business/src/main/java/org/libreplan/business/planner/entities/TaskStatusEnum.java:28 +msgid "Finished" +msgstr "Skończone" + +#: libreplan-business/src/main/java/org/libreplan/business/planner/entities/TaskStatusEnum.java:29 +msgid "In progress" +msgstr "W postępie" + +#: libreplan-business/src/main/java/org/libreplan/business/planner/entities/TaskStatusEnum.java:31 +msgid "Blocked" +msgstr "Zablokowany" + +#: libreplan-business/src/main/java/org/libreplan/business/planner/entities/PositionConstraintType.java:31 +msgid "as soon as possible" +msgstr "najszybciej jak to możliwe" + +#: libreplan-business/src/main/java/org/libreplan/business/planner/entities/PositionConstraintType.java:38 +msgid "start not earlier than" +msgstr "rozpoczęcie nie szybciej niż" + +#: libreplan-business/src/main/java/org/libreplan/business/planner/entities/PositionConstraintType.java:45 +msgid "start in fixed date" +msgstr "rozpocznie się w ustalonym terminie" + +#: libreplan-business/src/main/java/org/libreplan/business/planner/entities/PositionConstraintType.java:57 +msgid "as late as possible" +msgstr "możliwie jak najpóźniej" + +#: libreplan-business/src/main/java/org/libreplan/business/planner/entities/PositionConstraintType.java:64 +msgid "finish not later than" +msgstr "zakończyć nie później niż" + +#: libreplan-business/src/main/java/org/libreplan/business/planner/limiting/entities/QueuePosition.java:53 +msgid "Hour should be a value between 0 and 23" +msgstr "Wartość godziny powinna być między 0 a 23" + +#: libreplan-business/src/main/java/org/libreplan/business/planner/limiting/entities/LimitingResourceQueueDependency.java:170 +msgid "A queue dependency has to have an origin different from destiny" +msgstr "Zależność kolejki musi mieć swój początek inny od losowej" + +#: libreplan-business/src/main/java/org/libreplan/business/users/entities/OrderAuthorizationType.java:33 +msgid "Read authorization" +msgstr "Autoryzacja odczytania" + +#: libreplan-business/src/main/java/org/libreplan/business/users/entities/OrderAuthorizationType.java:34 +msgid "Write authorization" +msgstr "Autoryzacja zapisania" + +#: libreplan-business/src/main/java/org/libreplan/business/users/entities/UserRole.java:34 +msgid "Web service reader" +msgstr "Czytnik webowy" + +#: libreplan-business/src/main/java/org/libreplan/business/users/entities/UserRole.java:35 +msgid "Web service writer" +msgstr "Pisz webowy" + +#: libreplan-business/src/main/java/org/libreplan/business/users/entities/UserRole.java:36 +msgid "All projects read allowed" +msgstr "Dostępne jest czytanie wszystkich projektów" + +#: libreplan-business/src/main/java/org/libreplan/business/users/entities/UserRole.java:37 +msgid "All projects edition allowed" +msgstr "Dostępne jest edytowanie wszystkich projektów" + +#: libreplan-business/src/main/java/org/libreplan/business/users/entities/UserRole.java:38 +msgid "Project creation allowed" +msgstr "Dostępne jest tworzenie projektów" + +#: libreplan-business/src/main/java/org/libreplan/business/templates/entities/OrderLineTemplate.java:132 +msgid "Line" +msgstr "Linia" + +#: libreplan-business/src/main/java/org/libreplan/business/calendars/entities/CalendarExceptionTypeColor.java:31 +msgid "red (default)" +msgstr "czerwony (domyślny)" + +#: libreplan-business/src/main/java/org/libreplan/business/calendars/entities/CalendarExceptionTypeColor.java:32 +msgid "green" +msgstr "zielony" + +#: libreplan-business/src/main/java/org/libreplan/business/calendars/entities/CalendarExceptionTypeColor.java:33 +msgid "blue" +msgstr "niebieski" + +#: libreplan-business/src/main/java/org/libreplan/business/calendars/entities/CalendarExceptionTypeColor.java:34 +msgid "cyan" +msgstr "cyjan" + +#: libreplan-business/src/main/java/org/libreplan/business/calendars/entities/CalendarExceptionTypeColor.java:35 +msgid "magenta" +msgstr "magenta" + +#: libreplan-business/src/main/java/org/libreplan/business/calendars/entities/CalendarExceptionTypeColor.java:36 +msgid "yellow" +msgstr "żółty" + +#: libreplan-business/src/main/java/org/libreplan/business/calendars/entities/CalendarExceptionTypeColor.java:37 +msgid "black" +msgstr "czarny" + +#: libreplan-business/src/main/java/org/libreplan/business/calendars/entities/CalendarExceptionTypeColor.java:38 +msgid "orange" +msgstr "pomarańczowy" + +#: libreplan-business/src/main/java/org/libreplan/business/calendars/entities/CalendarExceptionTypeColor.java:39 +msgid "purple" +msgstr "fioletowy" + +#: libreplan-business/src/main/java/org/libreplan/business/calendars/entities/Capacity.java:172 +msgid "unlimited" +msgstr "Nielimitowany" + +#: libreplan-business/src/main/java/org/libreplan/business/calendars/entities/CalendarData.java:99 +msgid "Monday" +msgstr "Poniedziałek" + +#: libreplan-business/src/main/java/org/libreplan/business/calendars/entities/CalendarData.java:99 +msgid "Tuesday" +msgstr "Wtorek" + +#: libreplan-business/src/main/java/org/libreplan/business/calendars/entities/CalendarData.java:99 +msgid "Wednesday" +msgstr "Środa" + +#: libreplan-business/src/main/java/org/libreplan/business/calendars/entities/CalendarData.java:100 +msgid "Thursday" +msgstr "Czwartek" + +#: libreplan-business/src/main/java/org/libreplan/business/calendars/entities/CalendarData.java:100 +msgid "Friday" +msgstr "Piątek" + +#: libreplan-business/src/main/java/org/libreplan/business/calendars/entities/CalendarData.java:100 +msgid "Saturday" +msgstr "Sobota" + +#: libreplan-business/src/main/java/org/libreplan/business/calendars/entities/CalendarData.java:101 +msgid "Sunday" +msgstr "Niedziela" + +#: libreplan-business/src/main/java/org/libreplan/business/calendars/entities/CalendarExceptionType.java:139 +msgid "Yes" +msgstr "Tak" + +#: libreplan-business/src/main/java/org/libreplan/business/calendars/entities/CalendarExceptionType.java:139 +msgid "No" +msgstr "Nie" + +#: libreplan-business/src/main/java/org/libreplan/business/resources/entities/Criterion.java:207 +msgid "[generic all machines]" +msgstr "[ogólnie wszystkich maszyn]" + +#: libreplan-business/src/main/java/org/libreplan/business/resources/entities/ResourceType.java:35 +msgid "STRATEGIC RESOURCE" +msgstr "Strategiczny zasób" + +#: libreplan-business/src/main/java/org/libreplan/business/resources/entities/PredefinedCriterionTypes.java:39 +msgid "LOCATION" +msgstr "Lokacja" + +#: libreplan-business/src/main/java/org/libreplan/business/resources/entities/PredefinedCriterionTypes.java:46 +msgid "CATEGORY" +msgstr "Kategoria" + +#: libreplan-business/src/main/java/org/libreplan/business/resources/entities/PredefinedCriterionTypes.java:53 +msgid "SKILL" +msgstr "Umiejętność" + +#: libreplan-business/src/main/java/org/libreplan/business/resources/entities/ResourceEnum.java:32 +msgid "WORKER" +msgstr "Pracownik" + +#: libreplan-business/src/main/java/org/libreplan/business/resources/entities/ResourceEnum.java:33 +msgid "MACHINE" +msgstr "Maszyna" + +#: libreplan-business/src/main/java/org/libreplan/business/orders/entities/OrderStatusEnum.java:33 +msgid "OFFERED" +msgstr "Oferowany" + +#: libreplan-business/src/main/java/org/libreplan/business/orders/entities/OrderStatusEnum.java:33 +msgid "ACCEPTED" +msgstr "Akceptuj" + +#: libreplan-business/src/main/java/org/libreplan/business/orders/entities/OrderStatusEnum.java:33 +msgid "STARTED" +msgstr "Wystartowane" + +#: libreplan-business/src/main/java/org/libreplan/business/orders/entities/OrderStatusEnum.java:34 +msgid "FINISHED" +msgstr "Zakończone" + +#: libreplan-business/src/main/java/org/libreplan/business/orders/entities/OrderStatusEnum.java:34 +msgid "CANCELLED" +msgstr "Anulowane" + +#: libreplan-business/src/main/java/org/libreplan/business/orders/entities/OrderStatusEnum.java:35 +msgid "SUBCONTRACTED PENDING PROJECT" +msgstr "Nierozstrzygnięty pracowany" + +#: libreplan-business/src/main/java/org/libreplan/business/orders/entities/OrderStatusEnum.java:35 +msgid "STORED" +msgstr "Przechowywane" + +#: libreplan-business/src/main/java/org/libreplan/business/orders/entities/SchedulingState.java:215 +msgid "it's already somewhat scheduled" +msgstr "jest już gdzieś zaplanowany" + +#: libreplan-business/src/main/java/org/libreplan/business/orders/entities/SchedulingState.java:229 +msgid "it can't be unscheduled" +msgstr "nie mogą być nieplanowane" + +#: libreplan-business/src/main/java/org/libreplan/business/orders/entities/SchedulingState.java:367 +msgid "Completely scheduled" +msgstr "Całkowicie zaplanowane" + +#: libreplan-business/src/main/java/org/libreplan/business/orders/entities/SchedulingState.java:369 +msgid "Partially scheduled" +msgstr "Częściowo zaplanowane" + +#: libreplan-business/src/main/java/org/libreplan/business/orders/entities/SchedulingState.java:371 +msgid "Unscheduled" +msgstr "Nieplanowany" + +#: libreplan-business/src/main/java/org/libreplan/business/orders/entities/SchedulingState.java:377 +msgid "C" +msgstr "c" + +#: libreplan-business/src/main/java/org/libreplan/business/orders/entities/SchedulingState.java:379 +msgid "P" +msgstr "p" + +#: libreplan-business/src/main/java/org/libreplan/business/orders/entities/SchedulingState.java:381 +msgid "U" +msgstr "u" + +#: libreplan-business/src/main/java/org/libreplan/business/orders/entities/OrderElement.java:629 +msgid "" +"Some ancestor has the same label assigned, so this element is already " +"inheriting this label" +msgstr "Jakiś główny element ma już taką samą przypisaną etykietę, więc ten element jest już dziedziczy tę etykietę" + +#: libreplan-business/src/main/java/org/libreplan/business/orders/entities/OrderElement.java:728 +#: libreplan-business/src/main/java/org/libreplan/business/orders/entities/OrderLineGroup.java:963 +msgid "Cannot spread two progress in the same task" +msgstr "Nie można podzielić dwóch postępów w tym samym zadaniu" + +#: libreplan-business/src/main/java/org/libreplan/business/orders/entities/OrderElement.java:752 +#: libreplan-business/src/main/java/org/libreplan/business/orders/entities/OrderElement.java:778 +msgid "Duplicate Progress Assignment For Task" +msgstr "Duplikuj postęp pracy przypisany do zadania" + +#: libreplan-business/src/main/java/org/libreplan/business/orders/entities/OrderElement.java:1105 +msgid "Quality form already exists" +msgstr "Forma jakości już istnieje" + +#: libreplan-business/src/main/java/org/libreplan/business/orders/entities/HoursGroupHandler.java:260 +msgid "workHours should be greater or equals to 0" +msgstr "Godziny pracy powinny być większe lub równe 0" + +#: libreplan-business/src/main/java/org/libreplan/business/orders/entities/HoursGroupHandler.java:272 +msgid "" +"\"workHours\" value is not valid, taking into account the current list of " +"HoursGroup" +msgstr "Wartość \"godzin pracy\" nie jest prawidłowa, biorąc pod uwagę aktualną listę grupy godzin" + +#: libreplan-business/src/main/java/org/libreplan/business/orders/entities/HoursGroup.java:180 +msgid "Working hours shouldn't be negative" +msgstr "Czas pracy nie powinien być ujemny" + +#: libreplan-business/src/main/java/org/libreplan/business/orders/entities/HoursGroup.java:209 +msgid "Total percentage should be less than 100%" +msgstr "Procent ogólny powinien być mniejszy niż 100%" + +#: libreplan-business/src/main/java/org/libreplan/business/orders/entities/HoursGroup.java:257 +msgid "" +"The criterion can not be assigned to this hoursGroup because its resource " +"type is diferent" +msgstr "Kryterium nie może być przypisany do tej grupy godzin ponieważ typ zasobu jest inny" + +#: libreplan-business/src/main/java/org/libreplan/business/orders/entities/HoursGroup.java:261 +msgid "" +"The criterion can not be assigned to this hoursGroup because it already " +"exist into the hoursGroup" +msgstr "Kryterium nie może być przypisane do tej grupy godzin ponieważ już istnieje w grupie godzin." + +#: libreplan-business/src/main/java/org/libreplan/business/orders/entities/CriterionRequirementHandler.java:539 +msgid "The criterion already exist into other task" +msgstr "Kryterium już istnieje w innym zadaniu" + +#: libreplan-business/src/main/java/org/libreplan/business/common/entities/ProgressType.java:36 +msgid "Spreading progress" +msgstr "Postęp rozprzestrzeniania" + +#: libreplan-business/src/main/java/org/libreplan/business/common/entities/ProgressType.java:37 +msgid "Progress with all tasks by hours" +msgstr "Postęp z wszystkimi zadaniami przez godziny" + +#: libreplan-business/src/main/java/org/libreplan/business/common/entities/ProgressType.java:38 +msgid "Progress with critical path tasks by hours" +msgstr "Postęp z krytycznymi ścieżkami zadań przez godziny" + +#: libreplan-business/src/main/java/org/libreplan/business/common/entities/ProgressType.java:39 +msgid "Progress with critical path tasks by duration" +msgstr "Postęp w krytycznych ścieżkach zadań przez okres" + +#: libreplan-business/src/main/java/org/libreplan/business/common/entities/EntitySequence.java:90 +#: libreplan-business/src/main/java/org/libreplan/business/common/entities/EntitySequence.java:131 +msgid "You can not modifiy this entity sequence, it is already in use" +msgstr "Nie możesz modyfikować tej sekwencji jednostki, jest ona aktualnie w użyciu" + +#: libreplan-business/src/main/java/org/libreplan/business/common/daos/EntitySequenceDAO.java:82 +msgid "You can not remove this entity sequence, it is already in use" +msgstr "Nie można usunąć tę sekwencję jednostki, jest już w użyciu" From 6df0d070afb3e7a1e110e36b2a57e2ac4c176ba2 Mon Sep 17 00:00:00 2001 From: Manuel Rego Casasnovas Date: Thu, 19 Apr 2012 09:01:07 +0200 Subject: [PATCH 026/108] i18n: Add Polish language to enum and modify pom.xml to use English userguide --- .../org/libreplan/business/settings/entities/Language.java | 5 ++++- libreplan-webapp/pom.xml | 3 +++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/libreplan-business/src/main/java/org/libreplan/business/settings/entities/Language.java b/libreplan-business/src/main/java/org/libreplan/business/settings/entities/Language.java index 1b12bb406..926712078 100644 --- a/libreplan-business/src/main/java/org/libreplan/business/settings/entities/Language.java +++ b/libreplan-business/src/main/java/org/libreplan/business/settings/entities/Language.java @@ -2,6 +2,7 @@ * This file is part of LibrePlan * * Copyright (C) 2011 ComtecSF, S.L. + * Copyright (C) 2012 Igalia, S.L. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as published by @@ -28,6 +29,7 @@ import java.util.Locale; * * @author Cristina Alavarino Perez * @author Ignacio Diaz Teijido + * @author Manuel Rego Casasnovas */ public enum Language { @@ -39,7 +41,8 @@ public enum Language { PORTUGUESE_LANGUAGE("Português", new Locale("pt")), ITALIAN_LANGUAGE("Italiano", new Locale("it")), FRENCH_LANGUAGE("Français", new Locale("fr")), - DUTCH_LANGUAGE("Nederlands", new Locale("nl")); + DUTCH_LANGUAGE("Nederlands", new Locale("nl")), + POLISH_LANGUAGE("Polski", new Locale("pl")); private final String displayName; diff --git a/libreplan-webapp/pom.xml b/libreplan-webapp/pom.xml index ce21785ca..1fc61c8ee 100644 --- a/libreplan-webapp/pom.xml +++ b/libreplan-webapp/pom.xml @@ -126,6 +126,9 @@ + + + From 75f4da9e8941ddc94c02eef72a2c9d33711da67e Mon Sep 17 00:00:00 2001 From: Manuel Rego Casasnovas Date: Thu, 19 Apr 2012 09:03:09 +0200 Subject: [PATCH 027/108] doc: Update AUTHORS file info about new Polish translator --- AUTHORS | 1 + doc/src/user/en/20-acerca-de.rst | 1 + doc/src/user/es/20-acerca-de.rst | 1 + doc/src/user/gl/20-acerca-de.rst | 1 + 4 files changed, 4 insertions(+) diff --git a/AUTHORS b/AUTHORS index 32ea817b1..63b1888f0 100644 --- a/AUTHORS +++ b/AUTHORS @@ -42,6 +42,7 @@ Translators Diego Pino García * [it] Giuseppe Zizza * [nl] Jeroen Baten +* [pl] Krzysztof Kamecki * [pt] Helena Grosso , Joaquim Rocha * [ru] Pavel Rudensky diff --git a/doc/src/user/en/20-acerca-de.rst b/doc/src/user/en/20-acerca-de.rst index 699cce057..3cc32ab77 100644 --- a/doc/src/user/en/20-acerca-de.rst +++ b/doc/src/user/en/20-acerca-de.rst @@ -77,6 +77,7 @@ Translators Diego Pino García * [it] Giuseppe Zizza * [nl] Jeroen Baten +* [pl] Krzysztof Kamecki * [pt] Helena Grosso , Joaquim Rocha * [ru] Pavel Rudensky diff --git a/doc/src/user/es/20-acerca-de.rst b/doc/src/user/es/20-acerca-de.rst index 6c58945ea..dfceb6c21 100644 --- a/doc/src/user/es/20-acerca-de.rst +++ b/doc/src/user/es/20-acerca-de.rst @@ -77,6 +77,7 @@ Traductores Diego Pino García * [it] Giuseppe Zizza * [nl] Jeroen Baten +* [pl] Krzysztof Kamecki * [pt] Helena Grosso , Joaquim Rocha * [ru] Pavel Rudensky diff --git a/doc/src/user/gl/20-acerca-de.rst b/doc/src/user/gl/20-acerca-de.rst index 41951a38c..a4b489556 100644 --- a/doc/src/user/gl/20-acerca-de.rst +++ b/doc/src/user/gl/20-acerca-de.rst @@ -77,6 +77,7 @@ Traductores Diego Pino García * [it] Giuseppe Zizza * [nl] Jeroen Baten +* [pl] Krzysztof Kamecki * [pt] Helena Grosso , Joaquim Rocha * [ru] Pavel Rudensky From 212d2490d40647a3566d731241caf2d946a46675 Mon Sep 17 00:00:00 2001 From: Manuel Rego Casasnovas Date: Thu, 19 Apr 2012 11:28:35 +0200 Subject: [PATCH 028/108] Bug #1417: Add UI validation to prevent empty codes FEA: ItEr76S04BugFixing --- libreplan-webapp/src/main/webapp/templates/_editTemplate.zul | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/libreplan-webapp/src/main/webapp/templates/_editTemplate.zul b/libreplan-webapp/src/main/webapp/templates/_editTemplate.zul index 64f12a350..18bd32ed1 100644 --- a/libreplan-webapp/src/main/webapp/templates/_editTemplate.zul +++ b/libreplan-webapp/src/main/webapp/templates/_editTemplate.zul @@ -66,7 +66,8 @@ @@ -128,4 +129,4 @@ + + +
+ + +
+ +

+
+
+
+
+
+
+    
+    
+    
+    
+
+
+
+  
+  
+  
+  
+
+
+
+
+		
+	
+
+
+
+
+
\ No newline at end of file
diff --git a/libreplan-webapp/src/main/webapp/jqplot/examples/bandedLine.html b/libreplan-webapp/src/main/webapp/jqplot/examples/bandedLine.html
new file mode 100644
index 000000000..e94f472b8
--- /dev/null
+++ b/libreplan-webapp/src/main/webapp/jqplot/examples/bandedLine.html
@@ -0,0 +1,310 @@
+
+
+
+
+	
+	Error Bands and Confidence Intervals
+
+    
+    
+    
+    
+  
+  
+    
+    
+   
+
+
+    
+    
+ + + + + +

Bands (like confidence intervals or error bands) can be added to line charts through the "bands" option of the line renderer. The band data can be automatically computed or manually assigned. If assigned manually, the simpliest approach is to set the "rendererOptions: { bandData: [] }" array on the series. Note that band data is taken into account when axes scale themselves so bands will not get clipped.

+ + +

Band data can be supplied as arrays of [x,y] values. One array for the upper band line and one for the lower band line.

+ +
+

+
+
+

The number of points in the band data arrays does not have to correspond to the number of points in the data series. Also, band data will be drawn as smoothed lines if the data series is smoothed.

+ +
+

+
+

In this example, band data is supplied as an array of arrays of y values for the low and hi bands. X values for the bands are taken from the x values of the series. The band data is of the form: [ [y low 1, y hi 1], [y low 2, y hi 2], ... ] and there must be a corresponding array of low/hi y values for each x value in the data series.

+ +
+

+
+

The band data can also be supplied as an array of [low y values], [hi y values]. In this case there must also be an equal number of low y values and hi y values as there are data points in the series. X values for the low and hi bands will be taken from the series data. Additionally, the order of low/hi values does not matter as long as they are consistent. jqPlot will figure out which is the low values and which are the high values.

+ +
+

+
+

Band data does not have to be provided. By default, jqPlot will compute +/- 3% band intervals if the "rendererOptions: { bands: { show: true } }" option is set. The band intervals can be customized as well through the "rendererOptions: { bands: { interval: [number|string|arry] } }" option. Valid intervals are:

+ +
    +
  • '1.7' - will add bands at y +/- 1.7 above and below the line.
  • +
  • '10%' - will compute +/- 10% interval bands.
  • +
  • [3, '-10%'] - will add bands at y + 3 and y - 10% above and below the line.
  • +
+ +

Examples of such interval specifications are shown below:

+ +
+

+ 
+

+
+ 
+

+    
+

You can also customize the fill color of the bands and turn on/off band lines. By default, bands respond to the mouse over event, but they can be set to respond to mouse down as well.

+
+

+
+

Note, the plots on this page all extend the following pre-defined theme:

+ +

+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+    
+    
+    
+    
+
+
+    
+    
+    
+    
+
+
+
+
+	
+ + + + + + \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/examples/bar-charts.html b/libreplan-webapp/src/main/webapp/jqplot/examples/bar-charts.html new file mode 100644 index 000000000..4c6f824e3 --- /dev/null +++ b/libreplan-webapp/src/main/webapp/jqplot/examples/bar-charts.html @@ -0,0 +1,219 @@ + + + + + + Vertical and Horizontal Bar Charts + + + + + + + + + + + + + +
+ + + + + + + + + +
+ +

+
+    
+ +

+
+    

Click on a bar in the plot below to update the text box.

+

You Clicked: + Nothing yet. +

+
+ +

+
+  
+  
+
+
+
+    
+
+
+
+
+
+
+    
+    
+    
+    
+
+
+
+
+    
+    
+    
+
+
+
+
+	
+ + + + + + \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/examples/barLineAnimated.html b/libreplan-webapp/src/main/webapp/jqplot/examples/barLineAnimated.html new file mode 100644 index 000000000..41a60ac97 --- /dev/null +++ b/libreplan-webapp/src/main/webapp/jqplot/examples/barLineAnimated.html @@ -0,0 +1,165 @@ + + + + + + Animated Charts + + + + + + + + + + + + + +
+ + + + + + +
+ +

This plot animates the bars bottom to top and the line series left to right upon initial page load. Since the animateReplot: true option is set, the bars and line will also animate upon calls to plot1.replot( { resetAxes: true } ).

+ +

+
+
+ 
+
+
+
+
+
+    
+    
+    
+    
+
+
+  
+  
+   
+  
+
+
+
+
+	
+ + + + + + \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/examples/barTest.html b/libreplan-webapp/src/main/webapp/jqplot/examples/barTest.html new file mode 100644 index 000000000..b4b495f87 --- /dev/null +++ b/libreplan-webapp/src/main/webapp/jqplot/examples/barTest.html @@ -0,0 +1,299 @@ + + + + + + Bar Charts + + + + + + + + + + + + + +
+ + + + + + +

Below is a default bar plot. Bars will highlight on mouseover. Events are triggered when you mouseover a bar and also when you click on a bar. Here We capture the 'jqplotDataClick' event and display the clicked series index, point index and data values. When series data is assigned as a 1-dimensional array as in this example, jqPlot automatically converts it into a 2-dimensional array for plotting. So a series defined as [2, 6, 7, 10] will become [[1,2], [2,6], [3,7], [4,10]].

+ +

You Clicked: Nothing yet
+ +
+

+
+    

The plot target also fires a 'jqplotDataMouseOver' when the cursor is moused over a bar even if highlighting is turned off. This event will fire continuously as the user mouses over the bar. 'jqplotDataHighlight' fires only once when the user first passes over the bar. Additionally, a 'jqplotDataUnhighlight' event is fired when the user moves out of a bar (if highlighting is enabled).

+ +

Moused Over: Nothing
+ +
+

+    
+    
Moused Over: Nothing
+
Clicked: Nothing
+ +
+

+    
+    

The next example has the plot's 'captureRightClick' option set to true. This causes the plot to fire a 'jqplotRightClick' event the the user clicks the right mouse button over a bar. Here, the 'highlightMouseDown' option is also set to true. This will highlight a slice on mouse down instead of on move over. Highlighting will occur for either left or right click.

+ +
You Right Clicked: Nothing yet
+ +
+

+    
+    
+

+    
+    
+

+        
+

A pie chart is added to test for incompatibilities.

+
+

+
+

The nex example shows the placement of point labels on negative bars. They shou be placed on the opposite position. That is, if it is placed 'north' to the positive bars, then it should be placed 'south' to the negative bars.

+
+

+
+  
+    
+  
+    
+  
+    
+  
+    
+  
+    
+  
+
+   
+
+     
+
+
+
+
+
+    
+    
+    
+    
+
+
+  
+  
+  
+  
+  
+
+
+
+
+	
+ + + + + + \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/examples/bezierCurve.html b/libreplan-webapp/src/main/webapp/jqplot/examples/bezierCurve.html new file mode 100644 index 000000000..2c5a61409 --- /dev/null +++ b/libreplan-webapp/src/main/webapp/jqplot/examples/bezierCurve.html @@ -0,0 +1,125 @@ + + + + + + Bezier Curve Plots + + + + + + + + + + + + + +
+ + + + + + +

The Bezier curve renderer can distinguish between two different input data formats. This first example has the data passed in as 2 data points, the second one defining the Bezier curve to the end point. With this format, non-default axes renderers will require specifying the minimum and maximum on the axes.

+
+    [[xstart, ystart], [cp1x, cp1y, cp2x, cp2y, xend, yend]];
+
+
+

This second example has the data broken out into 4 points, which will be assembled to define the Bezier Curve. With this format, any axes renderer can be used without explicitly specifying the minimum and maximum.

+
+    [[xstart, ystart], [cp1x, cp1y], [cp2x, cp2y], [xend, yend]];
+
+
+

Here is an example using a date axis renderer with Bezier curves. The data looks like:

+
+    [['01/01/2010', 6], ['02/01/2010', 9], ['03/01/2010', 8], ['04/01/2010', 3]]
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/examples/blockPlot.html b/libreplan-webapp/src/main/webapp/jqplot/examples/blockPlot.html new file mode 100644 index 000000000..f648fd79c --- /dev/null +++ b/libreplan-webapp/src/main/webapp/jqplot/examples/blockPlot.html @@ -0,0 +1,197 @@ + + + + + + Block Plots + + + + + + + + + + + + + +
+ + + + + + +

Below is an example block plot. This plot also uses the Enhanced Legend Renderer plugin. Clicking on an item in the legend will toggle display of the appropriate series.

+ +
+ +

Blocks can be moved by selecting the series, the point, and an optional duration parameter. If specified, duration will animate the movement. Duration is either a number in milliseconds, or the keywords 'fast' or 'slow'. Higher numbers will cause a slower animation.

+ Series: + Point: + Duration: + X: + Y: + +

+    
+    
+    

This second chart is like the first except the "varyBlockColors" renderer option is set to true. This will vary the color of each block in a series separately. This allows displaying a third dimension to the data such as grouping beverage products by producer and by category such as "cola", "tea", "energy drink", etc.

+ +

Also, the legend has it's "showSwathces" option set to false, since the blocks of each series will be of varying color and won't correspond to one swatch color. This still enables the user to show and hide the series by clicking on a label in the legend.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/examples/bubble-plots.html b/libreplan-webapp/src/main/webapp/jqplot/examples/bubble-plots.html new file mode 100644 index 000000000..7733804da --- /dev/null +++ b/libreplan-webapp/src/main/webapp/jqplot/examples/bubble-plots.html @@ -0,0 +1,213 @@ + + + + + + Bubble Plots + + + + + + + + + + + + + +
+ + + + + + + + +

Bubble charts represent 3 dimensional data. First, a basic bubble chart with the "bubbleGradients: true" option to specify gradient fills. Radial gradients are not supported in IE version before IE 9 and will be automatically disabled.

+ +
+ +

+
+
+

Data is passed in to a bubble chart as a series of [x, y, radius, <label or object>]. The optional fourth element of the data point can either be either a label string or an object having 'label' and/or 'color' properties to assign to the bubble.

+ +

By default, all bubbles are scaled according to the size of the plot area. The radius value in the data point will be adjusted to fit the bubbles in the chart. If the "autoscaleBubbles" option is set to false, the radius value in the data will be taken as a literal pixel value for the radius of the points.

+ +

Next are some basic customizations of bubble appearance with the "bubbleAlpha" and "highlightAlpha" options.

+ +
+ +

+
+
+

In the following example, display of a custom toolip and highlighting of a custom table legend is performed by binding to the "jqplotDataHighlight" and "jqplotDataUnhighlight" events. The custom legend table here is dynamically created with a few lines of jQuery (O.K., it could be done in one line) based on the data array of the plot.

+ + + + + + +
CompanyR Value
+ +

+
+
+
+  
+
+
+
+
+
+
+
+
+
+    
+    
+    
+    
+
+
+
+
+    
+
+
+
+
+	
+ + + + + + \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/examples/bubbleChart.html b/libreplan-webapp/src/main/webapp/jqplot/examples/bubbleChart.html new file mode 100644 index 000000000..99a907d62 --- /dev/null +++ b/libreplan-webapp/src/main/webapp/jqplot/examples/bubbleChart.html @@ -0,0 +1,264 @@ + + + + + + Bubble Charts + + + + + + + + + + + + + +
+ + + + + + + + + +

Bubble charts represent 3 dimensional data. Data is passed in to a bubble chart as a series of [x, y, radius, <label or object>]. The optional fourth element of the data point can either be either a label string or an object having 'label' and/or 'color' properties to assign to the bubble.

+ +

By default, all bubbles are scaled according to the size of the plot area. The radius value in the data point will be adjusted to fit the bubbles in the chart. If the "autoscaleBubbles" option is set to false, the radius value in the data will be taken as a literal pixel value for the radius of the points.

+ +

The below chart show basic customization of bubble appearance with the "bubbleAlpha" and "highlightAlpha" options.

+ +
+

+
+
+
+
+    
+    
+
CompanyR Value
+

+
+

Below is a basic bubble chart showing usage of the optional label and color properties passed in with the data.

+ +
+

+
+

The next chart uses the "bubbleGradients: true" option to specify gradient fills on the bubbles. Radial gradients are not supported in IE* and will be automatically disabled.

+ +
+ +

*Radial gradients are not supported in IE 7 and IE 8 because they are not supported in the excanvas emulation layer used by jqPlot to render charts in IE 7 and IE 8. jqPlot renders charts using the HTML canvas element which is supported by nearly every browser including IE 9. Excanvas translates the canvas rendering to VML rendering for IE 7 and 8, but unfortunately does not properly handle radial gradients.

+ +

+
+

The following bubble chart shows the "autoscalePointsFactor" and "autoscaleMultiplier" options which can be used to control bubble scaling. The "autoscalePointsFactor" options controls bubble scaling with the number of points on the plot. A negative value will decrease bubble size and number of bubbles increases. The "autoscaleMultiplier" will makes all bubbles larger or smaller for values greater or less than 1.0.

+ +

This chart also demonstrates some of the highlighting options. Bubble highlighting is controlled with the "highlightMouseOver" and "highlightMouseDown" boolean options. Here the "highlightMouseDown: true" option is set which causes the plot to highlight on mousedown (click). This automatically sets the "highlightMouseOver" option to false.

+ +

Events are also trigger with plot interaction. Specifically, "jqplotDataHighlight", "jqplotDataUnhighlight", "jqplotDataClick" and "jqplotDataRightClick" events are triggered. Handlers are passed an event object, the series index, the point index, and the bubble data.

+ +
+

+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+    
+    
+    
+    
+
+
+  
+
+
+
+
+	
+ + + + + + \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/examples/candlestick-charts.html b/libreplan-webapp/src/main/webapp/jqplot/examples/candlestick-charts.html new file mode 100644 index 000000000..00475f6a0 --- /dev/null +++ b/libreplan-webapp/src/main/webapp/jqplot/examples/candlestick-charts.html @@ -0,0 +1,209 @@ + + + + + + Open Hi Low Close and Candlestick Charts + + + + + + + + + + + + + +
+ + + + + + +

OHLC, HLC and Candlestick charts are all created using the $.jqplot.OHLCRenderer plugin. The plots on this page make use of the highlighter plugin which shows a customized tooltip as the mouse moves over a data point.

+
+ +

+
+
+ +

+
+

The previous plots use the following data set. jqPlot will parse most human readable date formats. It is always safest, however, to pass a date in as a JavaScript timestamp rather than have jqPlot parse an arbitrary date string.

+ +

+
+
+
+
+
+
+
+
+
+
+
+
+
+
+    
+    
+    
+    
+
+
+
+
+    
+    
+    
+
+
+
+
+	
+ + + + + + \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/examples/candlestick.html b/libreplan-webapp/src/main/webapp/jqplot/examples/candlestick.html new file mode 100644 index 000000000..d2da3dd72 --- /dev/null +++ b/libreplan-webapp/src/main/webapp/jqplot/examples/candlestick.html @@ -0,0 +1,322 @@ + + + + + + Candlestick and Open Hi Low Close charts + + + + + + + + + + + + + +
+ + + + + + +
+

+
+

+
+

+
+

+
+

+

The examples on this page use the folowing code:

+

+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+    
+    
+    
+    
+
+
+
+
+    
+    
+    
+    
+    
+
+
+
+
+	
+ + + + + + \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/examples/cursor-highlighter.html b/libreplan-webapp/src/main/webapp/jqplot/examples/cursor-highlighter.html new file mode 100644 index 000000000..f2268de75 --- /dev/null +++ b/libreplan-webapp/src/main/webapp/jqplot/examples/cursor-highlighter.html @@ -0,0 +1,137 @@ + + + + + + Data Point Highlighting, Tooltips and Cursor Tracking + + + + + + + + + + + + + +
+ + + + + + +

The Highlighter plugin will highlight data points near the mouse and display an optional tooltip with the data point value. By default, the tooltip values will be formatted with the same formatter as used to display the axes tick values. The text format can be customized with an optional sprintf style format string.

+ +
+ +

+
+

The Cursor plugin changes the mouse cursor when it enters the graph area and displays an optional tooltip with the mouse position. The tooltip can be in a fixed location, or it can follow the mouse. The pointer style, set to "crosshair" by default, can also be customized. Tooltip values are formatted similar to the Highlighter plugin. By default they use the axes formatters, but can be customized with a sprintf format string.

+ +
+ +

+
+
+  
+
+
+
+
+
+
+
+
+    
+    
+    
+    
+
+
+
+
+    
+    
+    
+
+
+
+
+	
+ + + + + + \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/examples/customHighlighterCursorTrendline.html b/libreplan-webapp/src/main/webapp/jqplot/examples/customHighlighterCursorTrendline.html new file mode 100644 index 000000000..e85fa64f5 --- /dev/null +++ b/libreplan-webapp/src/main/webapp/jqplot/examples/customHighlighterCursorTrendline.html @@ -0,0 +1,104 @@ + + + + + + Highlighting, Dragging Points, Cursor and Trend Lines. + + + + + + + + + + + + + +
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/examples/dashboardWidget.html b/libreplan-webapp/src/main/webapp/jqplot/examples/dashboardWidget.html new file mode 100644 index 000000000..ee1191426 --- /dev/null +++ b/libreplan-webapp/src/main/webapp/jqplot/examples/dashboardWidget.html @@ -0,0 +1,212 @@ + + + + + + Animated Dashboard Sample - Filled Line with Log Axis + + + + + + + + + + + + + +
+ + + + + + + + + +
+
Hi Powered Data
+
+
+
+
+ +

+
+    
+
+
+
+
+
+
+
+    
+    
+    
+    
+
+
+
+    
+    
+    
+    
+    
+
+
+
+
+	
+ + + + + + \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/examples/dashedLines.html b/libreplan-webapp/src/main/webapp/jqplot/examples/dashedLines.html new file mode 100644 index 000000000..13aca5a5e --- /dev/null +++ b/libreplan-webapp/src/main/webapp/jqplot/examples/dashedLines.html @@ -0,0 +1,227 @@ + + + + + + Dashed Lines with Smoothing + + + + + + + + + + + + + +
+ + + + + + + + + +
+ +
+ +
+ +
+ +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/examples/data-renderers.html b/libreplan-webapp/src/main/webapp/jqplot/examples/data-renderers.html new file mode 100644 index 000000000..ac2e96d43 --- /dev/null +++ b/libreplan-webapp/src/main/webapp/jqplot/examples/data-renderers.html @@ -0,0 +1,144 @@ + + + + + + AJAX and JSON Data Loading via Data Renderers + + + + + + + + + + + + + +
+ + + + + + +

Data renderers allow jqPlot to pull data from any external source (e.g. a function implementing an AJAX call). Simply assign the external source to the "dataRenderer" plot option. The only requirement on data renderers is that it must return a valid jqPlot data array.

+ +
+ +

+
+
+

Data renderers get passed options by the plot. The signiture for a data renderer is:

+ + +
+function(userData, plotObject, options) {
+  ...
+  return data;
+}
+
+ + +

Where userData is whatever data was passed into the plot, plotObject is a reference back to the plot itself, and options are any options passed into the plots "dataRendererOption" option. The following example shows a more complicated example which uses ajax pulls data from an external json data source.

+ +
+ +

+
+
+
+
+  
+
+
+
+
+
+
+
+
+    
+    
+    
+    
+
+
+
+
+    
+
+
+
+
+	
+ + + + + + \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/examples/date-axes.html b/libreplan-webapp/src/main/webapp/jqplot/examples/date-axes.html new file mode 100644 index 000000000..1047e6adc --- /dev/null +++ b/libreplan-webapp/src/main/webapp/jqplot/examples/date-axes.html @@ -0,0 +1,107 @@ + + + + + + Date Axes + + + + + + + + + + + + + +
+ + + + + +

Date axes support is provided through the dateAxisRenderer plugin. Date axes expand javascripts native date handling capabilities. This allow dates to be input in almost any unambiguous form, not just in milliseconds!

+ +

Note, although jqPlot will parse most any human readable date, it is safest to use javascript time stamps when possible. Also, it is best to specify a date and time and not just a date alone. This is due to inconsistent browser handling of local time vs. UTC with bare dates.

+ +
+ +

+
+

Date Axes also provide powerful formatting features. This allows custom formatter strings to be used to format axis tick labels precisely the way you want.

+ +
+ +

+  
+
+
+
+
+
+
+
+
+
+
+    
+    
+    
+    
+
+
+
+
+    
+
+
+
+
+	
+ + + + + + \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/examples/dateAxisLogAxisZooming.html b/libreplan-webapp/src/main/webapp/jqplot/examples/dateAxisLogAxisZooming.html new file mode 100644 index 000000000..9692d8f3f --- /dev/null +++ b/libreplan-webapp/src/main/webapp/jqplot/examples/dateAxisLogAxisZooming.html @@ -0,0 +1,105 @@ + + + + + + Zooming with Date and Log Axes + + + + + + + + + + + + + +
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/examples/dateAxisRenderer.html b/libreplan-webapp/src/main/webapp/jqplot/examples/dateAxisRenderer.html new file mode 100644 index 000000000..130292660 --- /dev/null +++ b/libreplan-webapp/src/main/webapp/jqplot/examples/dateAxisRenderer.html @@ -0,0 +1,292 @@ + + + + + + Date Axes + + + + + + + + + + + + + +
+ + + + + + +

Date axis renderer with default settings. Ticks are given wider spacing by default since date axes typically have longer tick labels.

+
+

Date axis recognizes rotated tick labels. It will space ticks a little closer when labels are rotated.

+
+

If you want more or less ticks, specify the "numberTicks" options. Date axes will try to produce the desired number of ticks, but may adjust to get a nice interval.

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/examples/example.js b/libreplan-webapp/src/main/webapp/jqplot/examples/example.js new file mode 100644 index 000000000..ff85cd205 --- /dev/null +++ b/libreplan-webapp/src/main/webapp/jqplot/examples/example.js @@ -0,0 +1,114 @@ +$(document).ready(function(){ + if (!$.jqplot._noCodeBlock) { + $('script.code').each(function(index) { + if ($('pre.code').eq(index).length ) { + $('pre.code').eq(index).text($(this).html()); + } + else { + // var str = $(this).text(); + // $('div.jqplot-target').eq(index).after($('
'+str+'
')); + var pre = $('
');
+                $('div.jqplot-target').eq(index).after(pre);
+                pre.text($(this).html());
+                pre = null;
+            }
+        });
+
+        $('script.common').each(function(index) {
+            $('pre.common').eq(index).text($(this).html());
+        });
+
+        var elstr='';
+        if ($('script.include, link.include').length > 0) {
+
+            if ($('pre.include').length == 0) {
+                var temp = [
+                    '
', + '

The charts on this page depend on the following files:

', + '
',
+                    '
' + ]; + + temp = $(temp.join('\n')); + $('div.example-content').append(temp); + temp = null; + } + + + $('script.include').each(function(index) { + if (elstr !== '') { + elstr += '\n'; + } + elstr += ''; + }); + + $('link.include').each(function(index) { + if (elstr !== '') { + elstr += '\n'; + } + elstr += ''; + }) + + $('pre.include').text(elstr); + } + + else { + $('pre.include').remove(); + $('div.include').remove(); + } + } + + if (!$.jqplot.use_excanvas) { + $('div.jqplot-target').each(function(){ + var outerDiv = $(document.createElement('div')); + var header = $(document.createElement('div')); + var div = $(document.createElement('div')); + + outerDiv.append(header); + outerDiv.append(div); + + outerDiv.addClass('jqplot-image-container'); + header.addClass('jqplot-image-container-header'); + div.addClass('jqplot-image-container-content'); + + header.html('Right Click to Save Image As...'); + + var close = $(document.createElement('a')); + close.addClass('jqplot-image-container-close'); + close.html('Close'); + close.attr('href', '#'); + close.click(function() { + $(this).parents('div.jqplot-image-container').hide(500); + }) + header.append(close); + + $(this).after(outerDiv); + outerDiv.hide(); + + outerDiv = header = div = close = null; + + if (!$.jqplot._noToImageButton) { + var btn = $(document.createElement('button')); + btn.text('View Plot Image'); + btn.addClass('jqplot-image-button'); + btn.bind('click', {chart: $(this)}, function(evt) { + var imgelem = evt.data.chart.jqplotToImageElem(); + var div = $(this).nextAll('div.jqplot-image-container').first(); + div.children('div.jqplot-image-container-content').empty(); + div.children('div.jqplot-image-container-content').append(imgelem); + div.show(500); + div = null; + }); + + $(this).after(btn); + btn.after('
'); + btn = null; + } + }); + } + + SyntaxHighlighter.defaults['toolbar'] = true; + SyntaxHighlighter.all(); + + $(document).unload(function() {$('*').unbind(); }); +}); \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/examples/example.min.js b/libreplan-webapp/src/main/webapp/jqplot/examples/example.min.js new file mode 100644 index 000000000..132e22953 --- /dev/null +++ b/libreplan-webapp/src/main/webapp/jqplot/examples/example.min.js @@ -0,0 +1 @@ +$(document).ready(function(){if(!$.jqplot._noCodeBlock){$("script.code").each(function(c){if($("pre.code").eq(c).length){$("pre.code").eq(c).text($(this).html())}else{var d=$('
');$("div.jqplot-target").eq(c).after(d);d.text($(this).html());d=null}});$("script.common").each(function(c){$("pre.common").eq(c).text($(this).html())});var b="";if($("script.include, link.include").length>0){if($("pre.include").length==0){var a=['
','

The charts on this page depend on the following files:

','
',"
"];a=$(a.join("\n"));$("div.example-content").append(a);a=null}$("script.include").each(function(c){if(b!==""){b+="\n"}b+=' + + + + + +
+ + + + + + + + + +
+ +

Enter 2 series to fill between:

+ + + + + + + +

+
+
+    
+
+
+
+
+
+
+    
+    
+    
+    
+
+
+
+
+
+
+
+	
+ + + + + + \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/examples/hiddenPlotsInTabs.html b/libreplan-webapp/src/main/webapp/jqplot/examples/hiddenPlotsInTabs.html new file mode 100644 index 000000000..875582f19 --- /dev/null +++ b/libreplan-webapp/src/main/webapp/jqplot/examples/hiddenPlotsInTabs.html @@ -0,0 +1,225 @@ + + + + + + Hidden Plots + + + + + + + + + + + + + +
+ + + + + + + + +

This page demonstrates placing plots within jQuery UI widgets. Tab 2 and tab 3 contain plots. Using a combination of alternate sizing specification and the jqplot "replot" method the plots are properly displayed when their containers are shown.

+ +

The alternate sizing specifications for setting plot height and width are needed because a hidden element (or child of a hidden element) has no size. The first example in tab 2 uses custom "data-height" and "data-width" attributes on the plot target element. The second example uses "width" and "height" properties specified on the options object passed into the $.jqplot() function.

+ +

The default plot size is 300px wide by 400px high. The default setting can be overridden by specifying different values to the $.jqplot.config.defaultHeight and $.jqplot.config.defaultWidth properties. Height and width values are taken in this order of precedence: +

+ +
    +
  1. The css properties of the plot target if available (not available with display:none;).
  2. +
  3. Options object passed into the $.jqplot() function.
  4. +
  5. Custom data-height and data-width attributes on the plot target.
  6. +
  7. The config defaults.
  8. +
+ +
+ +
+ Tabs 2 and 3 have plots. Since tabs 2 and 3 are initially inactive, their contents (and the plots) are initially hidden. +
+ +
+

This plot was in an initially hidden container. It's hieght and width are set by the "data-height" and "data-width" properties of the plot container.

+
+
+ +
+

This plot is in an initially hidden container. It's height and width are set by the 'height' and 'width' properties of the options object passed into the plot constructor.

+
+
+ +
+ +

In the accordion below, section 2 contains a plot. Sizing plots in hidden accordion sections is very similar to sizing in a tab widget. Because of the default animation on accordions, however, the plot will not draw itself until the entire accordion panel is shown.

+ +
+ +

Section 1

+
+ Here is section 1 there is no plot. Section 2 has a plot that will display once the section is completely shown. +
+ +

Section 2

+
+

+ This plot also has it's height and width set with the data-height and data-width attributes. Note, if you want the accordion widget to properly size itself before the plot is shown, you must also specify a css height and width on the plot target. +

+
+
+ +
+ +

Code for generating the plots follows. It is critical to bind the callback to the UI widgets "show" or "change" method which calls the plots "replot" method. Without this, the plot won't properly redraw itself when it's container becomes visible.

+ +

+ Note in the ui.index and plot._drawCount properties in the tabsshow callback. ui.index gives the index of the activated tab. plot._drawCount keeps track of how many times the plot was visibly drawn (or redrawn/replotted). Generally, replot only needs to be called the first time the plot is visibly drawn, hence the check for plot._drawCount == 0. +

+ +

+
+ 
+
+
+
+
+
+
+    
+    
+    
+    
+
+
+
+  
+  
+  
+  
+   
+  
+
+
+
+
+	
+ + + + + + \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/examples/images/logo.jpg b/libreplan-webapp/src/main/webapp/jqplot/examples/images/logo.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a12fffcd5e43de9e69d5b2e42842837972123577 GIT binary patch literal 14632 zcmb7rbyOWev*+asE*E!qcPF?@aCZytF2UX1gF6IwcL)%IyF>60Bmoj^$@kvA-LwB~ zO`m(uOwUwz*K}9cud3#C^>r5jm6w*22Ef3;0A$||!0QWuNW#_9)ZNm8%*)2znoLGc zNrlYGk<64#$<+LH10eD5-v2{DAPD%6z#tG11OY=J5HJ`FfrW#GK;U4(U|0lLIQV}A zfki+>fJgjy@{h?s2LGOVEAVem{pXhdubp5Uzp^nX_a0RJk%Ft6)?H%dEnQ2a5l41CumxE*-XkXK2T6c&XL9IJmRhclT2 zq6IP{uL&vP zx^8^I`Q-m1X`V?YJ4tBRz{UhX35t!{2XG?mdXedmIs^K9fR${8t=6KSqnq-X0nt&h zkV*uYtBl{5NC=PyL`V=)?fia_HBh0gp?HRYsaYX*AQTQk^1gR>i}>p^Q9#U#*0b6! zsPe_aeP`m}4(^Zmv(AgUoqC`w|BlZUE9Ea zxYcp;-a3c77lbZY(+u&o$ z^RrdB7L6TPWDeP0^IGGy8&+Ur8_-7_n1MF1<4>07jQe65Wc<)?z5?;Cb(y<`Ee5X@ z)=Nc!N!#%{qA?zvo0#G!q-w(?t!*9{#K)!zYI*0Hrbb}Jg58 z024dq)#K83JSGq~yBaCSViNQF1G07Q-2{Jlzw-uc;YzNhI%KtB?dbCwk5JEw=9*5l z!;pZ!Vix)+hh}ZmNE-HvJ{NVf;*=u}a$j4>HKF;4gEpaQf^;iuGYlf41Q|l1^uTCO zbI2)Md#OGWng%h_o~DtkVq@0Y&>TFcm}nQdHId1w4hUhFp*sk}a49Uq#T45>QI1vv zLv?W!+eOs{Pt-&#|Gvj3e1bb*Jc|{mnmo2((RKLXXF0e?MC!Z!@L1VneAab=ea-BFz~LA~>(lBx*ntR~E{f+o<)3u#@; z_U)PrEk9p?+P3E?~V zwecr7)isnr1G`D)sSO^E`DmVO&y|iZ+Stu!)rKc+npnO%v!@6B5_@rGrG_qZEANP% z|CsN^`Ln;3zbAYD!&V$`$`VdoM#jM1-Tfo2fyc140-+u4hp}FQg|7$wtey9jy`GEs zfy3s+fl_Bn-ClK?JinuUtug!it`iU(H22|6rhJD#Igdz4h#WQ$#v5b5dMnTFIV=P; zqa8j-SNBC{f7PI2c6<+i?2ms<8HkkUobrxA4SOPZj2MhqC59Bnl$s@dD#g)pJh^+>hPxB0xa=^Lq0cJ$>+%X9 zYO6{eQ4bm1`nnZLJQDtCiAuUCV^SCcLtyV;!vc4*cW;fCl$2_nmKk>&N&oKg=;qR@ z)31&>t*!|q`o$$8AwaNKhxZ^QT;7X<;ygRX9%qg>*%8pCj2W2n^!0`1iOIInwVOBJ zzer@f!-4QycORt*m(yi!9D^$x{k0>v5DOA<{rFDv+)b*pNTbBKdfJ8?K9aYA-bNc* ze{_Mg6>icCqtUe4rM4e_=CsA-L?BNLn97|T0fCs9*yX~Hm{gg2xw8CeDw}Z5OqF0O z5I4ZE-La$h| zWgyM-=GZynXoaTcQvDCSpSwKB5&g9IFF&xJ$l*_n65?w4+nUnV?{2i(_&j19yr;{y zGHPtM0$sN>)s;BPwx?wy5f>E&Tng6oE{oJH#>Uk@YXZ}v9AEZ zyY8>&8E&v7%K?bNW_fMm-6@`O8Vibk9OcF{JK?}-x>o?@{;Bp?5iVk6OO2v=&$)Y~ zOjXZonI-jh(WD3S@8smHv;K`man^5Sj`tAI!ou$Thu=Rek;p!|GCL|eF;XVM)Ax9M z*3D~imE$^<)z;1Gy)TK4d}Qc^LR*ht1EcpABYSdm;$kzVU5WH+&4kfXsr1<9^~<1b zch09=-vCmC54FS<7DOD}SA*iT3Lf?E<2 zx(_xV7%R? zqlHnvEvu59#WD7xICFeeRh2Ojy*(0&B@4p>Ut}otgE(3c4M9AyS?})gvS`I7?R@`(dIU053e}8f5r^rOZkK6vK7@o1< z@BdjdsZm-)Z{XYHK8Ks5-1uHY%n?s~JsJlX1mWTCa$F0|`R2gyi}7SjqKUu>l61{0P?3N!bbXQY~sR zDhW}Kj=tPgO=s;&o8`)5(Wgz^}Ep9m(5S+>C zDHZcQlWetoD<_4aSM{g02JNnd0iy2vl59FW&w(GwyhBIj%;ROfeX9 z=s6_c+1_p%<0w(1VE2vf%e-Hbh$~xdJ3mJlHIGC^@NFAsqEeW(LocLB1G3VOLxP(T zFrWCd;t#S1uu3|SyiwhxqsGB;OL_*1CUf% z8qLnRW1a;@I_cb4LMOKkV)2i|lF{75aPGMW)ovtGJS^epHJ|?cmJ!AU>Xr0G zE=f5~nEdFq!x~HmImK(~#^f3qCqYKn9abAkbq+q;vljpcL4$fpF-R zz=FOcXQnm@Y=uizo^)_wi+{k6&Qmh}UCg)RO0W0neGUqQIbx2LqiUhy72rUpO5*!D z$jeq6m&xZLWB#Dbf@pvM5z%SKScK7(ijlsj@n%`t+UPTC)v3DMBPK*Cn<${V^f;7qESWu~S*qPL58-m^evj?$zT`_QX#JwP&5772Crj@;K#OEcQx zrtkFz^_E;Q0QxElNnL_^hu#+)59=FrhqESg=!L*mZ^^hl|1b?nIaGW}jr6eQZ?*)h z`!3kd-qr7Fzr7wM=)c(y0>c7P!N_p`7QnyR4?u@tki%lKt3t6T#7tetIIt<%IK@@e zT-}3{8=L0fxI~L^sJMC5O*}$UQU|Xj%-quU_W$d}!2n=IfDe&f-CgQS8!UZwa9z0> zk8HE&ix&Ip_zuHY>YI$5j+x3qg}d)n4-9+}R9kg?Ti`D8UICSQ39&g_0`02%sj}(` zz0@{)J-l@tn{nqNFy`{80vx@YX)!zU83z(wV<8&tM9Q2}lIu+si-myaSam(Ls5>iQ zz7e!++9uNL!{nq=3wMj3SVVVX_MCa9{NoqZ>jFI)Lx?flvo?$D>Th?$q(Z+8t5X=X6H=H65#Z}dqDlp@{0 z%_Y)zLV-l0&W7^6Q8yJ?hA~OSsZOhW+Nfy^@bemy|NIRew*fgfZ4WiQ$a$#c7?| zZW@Icc!w66GrdFroPe#-oO#2Y!)V-)fbKae?XhPH%neO`c5}ytVX+>JwzfWDBo;qy zOQG_bswHvxP!jSWzbC9bqdiyl z6-KiM=n11`Rjk__t*IJ}# zKxRtPd@bl%YHm$iJ|if?u2S!X8?seAwlj7`O9Y>`u zgCKIMJO!`ZT1wsGWgLXve|~o0pDk_7sE#p-`6Ie%ZYuz+@$lexDJ}J@{fj{G<2kCw z5_U&9w2Z`xSvlfxJe|gMM0&z z$&RGm6{4>d}rFC1>G$u_fIs{gHa-WF|(*OPeI5 z%;rFvN&ix&wt6D$bm!nQ&*|E87+hNUNHw@{thMnG{&~OX2M$rvUzyeklUxMkeENPb zfY=d)IlJQs4Lvh=iUNm0ZRK9GpsBtxCq3$-$Klhbgeovk92*=~KgvmmxX<}-k~kiV zaS8OKVvUlmHSURET8_>Y!pMOJYcQAywLB??coL__}*@|K{2{!RDKO3n|%;4v3o zPXW}WGFO$>IF6+HtX1J)f*+A!Edn)^p5~YCcWg$?Zpbvv@qUs0z;i=_v-bPN z5S)9NB={9iMLvxEX9DV91>|_Rj@w@zb=>3oCprdfq4f74r6V5vctzYH3#EjVgE@kX z@CgUd9?rvhL)APGgh{AgySgJ<+x2YLn8%GQrIAIL-~3~M8fN4O_EJ;4y!o{lXA^E7?-O!`C@$A)%V$r&2z+0a4L z3mSJ-th%D`Na^P?KFG}x5sEo#SxZY4-8WkPHYEoq!F#o4B4*BE{g<-kj73 z{5D>Q5mW)S(HJS~hv$w%$^`jXQ5|mV2AdO}>R)WyR&Lx#{<&)TT&zl$Q0>nN5`Yo@}ccHQ?GwYq=Iq_2c{x6R`0I7j->;9b0CS${TtJ z&F6E|AjcKmWvJA+ozDK!SI~}!ijrMlm-S_hB52pfjnmhV!J3yC@*%Rb)h`C$jiY^p zFAEy&bmn%k(|i^Vh(wbxj&0LF{Tje9>N%vfY>Khh^pvTNUshAwwcm`gCe^Zdy{Aw4 zv2^e%lB{T%x|J-cC1g)U-3HWNR6k!_xSwo*`5w1pvOf?(*>>CTce9I*mx*2`dR;wv zkFBuTCwFz*pKzH1BUTN6sX5miSju{W2hxI_^DnW(;xtc`n%b9ptTF;y@;qp>~*S7qmF>;pDZd>Xi7g zYATPG_#YhuJ}$*e#<$3i5aA(BJ0az-^sA+=nh!N(5#DtjU&RP^*W5K(wEmd<&1(JK zfd!AEnOd2-u*@TFXYR0l>APCC;;PC~do(|1O-BvAHT?t8!^_z?##1PIXt>E8U5ZV?eV5ihZ0_BOU{LBR=6$*~g?$O!bud zMivt`)F5g{{OSgY#r|Z?$lxbFsC%fRWT+(nf9N0DRYY3spW>Wio zL9Oj*)muwb`c}A6*`Oz@GXJYb0xQK*K?P7fU@ch7MUso5qb0MUqK8JoAbINOWGPVG zj%~scP!}ytxbf+hG2z&P=xa^X%7SIacP=m4iTTAztOJ`vEU8mhB5FrWH@A^_BMGLm z0!%qCQGWrrKsl-)I084sA&oZY!;{;7#>p`2(S=hgv?f zI!PFxNmZ7M7pVDw6jU{e*S)Fg^0Yi$8m=lZvp=kBeW#rM6-UI^hW84H5^LnjY9!cd zE7;LdxRXv|IX-w3Qd@+DS; zB>2A$&N(|c@xQ4c8=$0_hhj6Z4ROkjp+!+hY+?;&<%SaRdcXV1Cz!ZjjjXDni}yZN zw{yIH|E~lxE;4@z5p>8ljJVLilu!k>G>NgVDsp{BSCmJ~&8KJI ziB76uRay?^dp@K(dm!Yd**aAteg@a1GkT#@{>HnpmHrY|GI$9Y+Z7-MyUZaOYz!!| z=xO|t#zW`BD*@w$V(L&hdLD1TyE3mI_oSsMBCmnXdk9DS{z)2G?msG^yzU;uVH!n< zwg^%wl)sd?K+{6M%?=*z*^v{(^Kln0*4)c(O{iT%dX|7K%o!?r)B*Pkjmp){NjLu8 zt44)}?0NxO>C@fzSdYqK>%1k$wk8?*ryHV#%@;=&-T*{p?=HA-UIQ$eauA7Z8}c+5 zhc}rBWDj8%COZg7=Df7nlG$PzV=yOfsN`gm*G7z^9uFD_Ws`QmZy|h>BYtS4&ZXz> z_|;O(^odN+eg)sO_PbW9X^*~rCjliorYhSgx{$=VS~6XGJY1*25wfV zi~eSy?KJ9OT$If-s?19UuRB1ZQTZi5%q5gO*oYiGT&)6+T7>&VeQUZx{4GJa_$r4y z<;BipIKdFq)6XPHlIWNTmL;<-F->?Mz56ejYro0Wn8Uh!o{n8`4EeDNF;3s7UZ>es zBlZ3`>cj;!MD3r$_v?;W%r@U=x*)mP|iAch}Z;(WScYT($BaUXXvu#lf0 zPBh~RLISNH6R>MCN<^jtI?6q})Nn-7p2sa*X+uQHztvGvK+OYO>*IsJyc<4)OQ80q zX1b@}l$~Gv@&eTJ(lRb)6#QEnoJP>r+l7NU9zAEmM~eI@pam}Z}T4%^Jol*zyW4m`);;DSC9D{G_Vgq z)U$o-ffrz=K_D27$e=Q%1dL7|0qM@`;k2c~Xk z$y+n$E=i3qdNJW(`;eX(*0$vxyaIT=p}6+)6)DE)jvV^(m#eHyikTs%ODP57uYl67 zUU^d&ZAI$hxoJOn{rzeN^m@Knvsl6WV&PrQ)uRPg82Jr;4PZg> z%8W$qbdaN!tF_0(oz$9EOpEIw|C>W%wAROnI04uUydLz9T#;eSr>Lb}QuMth91u4# zx^{Ym2rdTY9^?aeE5;o0YMbR^;i3!2nZ`#-QoPN6sPvqLsSveH1Qjw-Fqka>^Me!5 z{?Ev3B9Yw(X>bnR!zo{m$V++WNj{^ zaMnkm<+%KQezK?GrJ^Ym23?ULAlH`7gDOC#prt-rnU9v3p_8N9dh*ElFsi*YPNsQR z*dwTX&UVYmyt}4bZfRnI8G;$8k^n2R()t{g`FSlrWb?ZmT*6*~glGm~;vc zWcR^b0}JoF2n0uA^ilgeo4Qc`jYdD@LvdavG>LR}c{4FOURW#N=j~~Zmw)hhpeBV> zrLn309vQAA57y0O>dbFD`G%bUZxT1y`%#|jopm!~p8W@D3N^Zfm(FP9_8+WFZJ9u8 zj#m4T%D>#iM;bp|PFVDQvtu(auh`+~`Z`==8Zc*Es>o*Bmggj7WYA^Ra>`np-!F=XXSj9-lWC~Eq zC_0rvHkfI$c}V~n9M=50m;ydQAq-Y(B9lra7FjSEn;8588WH&0uKX16e=ThErF+w1Q4HLGmYc|MF7|k!41>M!LWRL zQG7#aWP@^8;=usUSUgNgG7y-q0fvYzUWft~K1mX<0S16Efh;Z#?*@nG5{Y~(2i^Tb z7Nq>&p(?7*{}UL2K1wXIxkpp(v5!tzz;FugrtcdB zv*(C$FpynFx#yA-)jnzmV@z{>n>Bk!PU6VGgo`9)9h#iAgGa@ng4n3Ut8J{qzOVHe z(e&n68NtqTP%JpezEyjR3A}p>rQBn?s<@VAVR~pnb(9~Y$ z%gI9#E&LU{DRdtg_8%nhZ=i3CI666iT}(yQ6zc5qKQRjEADJiaA^ulfGs2@#;TnFjUB-!8L1X*e2?KXc!h<9X<=~NGB)_{2O33Wl(%&lpvwR}YWfY_0fu}# zDXk=Op4`Vln*;GLZPsCOq2_4{!DWfhCt_DC%K-!w#dT8!+#;frP*C~OL{~0jt8}tDI-hj`4fuDZ^{s(>j zgM5;qMP!YGb9?_CocV`+pjyqY42G+>k1^++12Pu-jD56c`NOyTidxO}U&Oeos`vfL zMcBBw$it!J=@@$!852UN+Xrur$NF>zeuztTGkkz5Va{D9XY=!iz4a0;I``NHT17 z8E&)CVVZyqu)i_^reYr8lS-HgcG%#@Xn`Hf{NSir9QaZed6OG(;Q}u%L63dj-wfxM zIbw!g`W7)0O>vcF7kwyzL_y`8%6p$vMWiDR?NYEapm^v{>=paz{(-S1PnS=|1z77h z>e%{-og%d|Kb?mcUnriHyybx9RCTCRr3e)fTLwdvgXK(W4n~IC3xR?DK90dzZw6Y^ zXY?E8(sGtn*iqq`E9=PE5Ja)a%no}@34A5Cp|Zirp)%FRnL++KgOnyjooD%!m`6rQ zEf;J!^w5YxI%@J#F3}aI5xw()VB(Zt)tkZ;iuoz<;l9#sf=PtV&QmJ5zCPy^Tf_w3 zFi4^m5eNGv;6dq<;-b26ds0QAfnJ~JKS@cK(RRqM ztujYI-cocOD<3$?8sx z95SD|fnAXEc|A#ONk_Cwa~c%+=Fni`MPrknG-2*cG_!`$9hn;>n++c<=e`$!7WEsS z0cHaxORJp?7qxcP5oDB==Es~FclQPLj0GPPwu2E%Ekcet5A7((%=Z{qQJ4Z%}$GoUKnk65f~ghHYlWSV_sIIs#24wvL&b>VK1 zj=t3^r_K=x1>v~ofmJ#oc^Fxb&2Ep6DOXzJ#jAsmYb+Z@2{YVFRrdju)a=^Kf-_!( ze*PFEgDT?p#xEW8u2Jq}5(@revT0RrSw7@eHkzHC&Pm%IX!KtpH107`vzXr=$eO1e zCJjT1@R}j!VA%cWqWOpz3m|%El^z+4CJ<%;>{RPe&4a=NgLA^xR%ysnW5X|e=|IS6 zQYZ634KD(XNCdb`Pu!IainIloe&}8>E2P3glIm7a9Oqkx@rH$tWSj^bRRGKBt9n{< z!fb-Zi+wjvdkcb18H{9wr z8mN)T=2thl$#+u&Q5D3FC+b_2CYUqkb|#+stZ4)_&SZ9jtnTZ^jQZ>77P3}?l8Wi1sZtxiH;*W!Qo&Smx{(m`;ZXVl zBLohsZx_SM?B^uf84NfDK1xhN6u6{UnMLJ61{^Llmmbi?ipKfs;8TV@L&iLS)Tj`w zD&DdW_$#igfd6QCVSVzoS?)Wf#N4!IQCpDN)~x~x|S*lnfX>i{c>u>FAV#mo!6h{`z5Q4p^OQvBe2%wXtXSuDwkm8&dq$da@T zCu`ZM`r`IdX2e3dHJ;AVBRNMsU0m3wKuw*NZ&LCF6y7-nRpoJRwOCc<*D>r0I_@-2 zXWN5tTJ%*orAFTov+Gn)?Y;sc#LlCBws`&`eyWgxF1AEXMPlv_;+DnjMV-gyORr0}wm4r|cRTI2Pnk&HAa zjo>5+62Z+8J#&((k)*tDFh2`Z(!c zz_>3Y$vmuh8=}(&r=Cj61MeVi1WcUfw+dHjYhg`~B-9{h3Q}EqB=o4?{P96rJq&RV zxcRe=W<@!jPBDEpCfyxcC{IClsm1av3VOz9St>=m;S4eqUjZRiK$FX(LqB|#`-04$ zGBx)7fKk_Q63bFHQhSrDrn&#i$gPNm5MLf?YUu3~Vw#IH=tCLyz$s_|@%l;3S!6EC zq;i&d5TB>h8Par@{j~>?THK`?j;#$n@=Dtz3|55^mUy(ivm6klcbB|(E0CGbAYyO1 z!c}|{4jpU4pkgDJ8+GNAbA@YET+{lFk(W~zS;g{v@A=ygTYqt@*+L-+$#p+hL2C5# z`z5XY0g*jMF%>Qw%WbRJfeO3y_nQW^XllV(1F9-m2@OPDXIOP)l&GQT7B0R)+@Rlt z;-IP~MCVt)kq!za#9zeG{4VWd55S*?KZFg@om^%W&}hZ-DOuT8`>N*Pf~Acb@bMNU zoef6zc{1jy@EVm15>Zd1RY`;b8o9^)R(WYSgRT`M5tOC`v+EO5)=$+oN2=;<^l69; ztyjiU7}CV45a0-7I|rk{Vifck9YkfuvuJ%az5Q-dT?tBPci-`Ze-i0{ODE%#FdsgU z9(@seW-Lhe(68E#sysHrk_%Z4!;Hr_T7$qZ>WOY?&4(vV=(nog!;$ zcD$NkLbLA!g|uIRJTSK#O!AC{nX?PI;?Mh*@&(BnA$9zg?rDv%v=WcVAXIys9}XT3 zU)Tv5%Lg^uDA`r44gTa=k%nEL>m8aE*H90m+H6PYTW)BY>W-S6w+pIReDTgE-)jM zxJBO#x`DSpB!_f|2^sJ6=4}GepY>nu>STLfv1wJu> zYr3*Ow$v&~Sphl09@5RQj$kf%>XmejrxE zlyTP?;FJQz4NC8~CIB|fso6RNaZP41S%OOChQdQM1nBD81d;ed+y1&9LlzIFq2vPc z;o&xCxJIN(q`bgo0m`UDv056+s0ugJO|19&xN9>5A1eY)&-Fk5*84SN1R>7X+^q3T zAg;ZT_-;Qe7O;9;Qr4VqYZSe>C{Kw zclKLl>UTCCa`6vIe&VN`;uE3RxnZ`;_JclRtk}0X3&Mzs=+lSspeoCZ`~k--ut-hA zby>3OQ^6(q$T^Li1g(`(Cpb<@`MuAmK-4aIPg=+Ap^d)DJnT!!QVF{vhyT8knvN!TDDwgl9WkW9Stf==;CDkcVKXfrRS>zgTDs043pQ=K z0Co}5up{LFEq=e2v;DhkCjrX@OpfgwF7FhzFvP1hQy)g!aFjnCJQ>P+!U?is@rmNF zT2=x~)rJ}{jA^#4G5)F{v$I;o`&F%W2$t;f!%?f7VHBpglqX_e1k!a$;hp_y^ zThvf!+@HkpUK*pVd7KK_qyj;UUi^ou*;aS{i zC2d4`{irst8-ABUwZwazyZR9nbRNA?1DO4&>e;GT25M_9)cD}_CPqo9=pOkraIB^T zMgZ?QwlP79B6f;AzaWcQOeQ$yp?{iaEj6d*lBUSQ*NwUmDC1&}%0O(&pQuU?V&On6 z=ic%)-{#@&EEQEvtvw8xdw~byz)n=lYNgVgzRDr_)9O1kHB)v zQqY7)gn3KDKH4Sek^#}sZ|lTHjbCB0W=oR@oD3JE0r@KEk{UliqcLB-Yq z3TAu{=Ky??u;R6u8CX>*Jq1w$nhJD&RMRFG6cz4t0k&%DczY0HiKeE}rGTFv0_$UB z6cC2>!s5oN;38v!#XT9IBGmIzd?0oqZlG5PW4lv%g&Fp(!Drv9ie`N4o*j=*P?Djs z_=ca@z(K~t2wUz?mh`7$ly{JKWpq^x`sg?}IKhfBMJU<9 z6d)H9Jqn*iV~@rvcHsdVIjrp>eIBfuBhAG};)zbaELx@yBk(+Pf9Q`p!|x0b)F%Q} zM*e13Q$rKU`=_6YG!}sd}VSw{NF&T5e*j zC`M9Z?b|8dCstRjLw(q=t%0-B8Qr7!8@2kV{2?P2g)IrJ`AI>i?bLE0(RKS-A!G@t z9aP=#!i5<^$ZwZV!LYwdTHmh`zIYAo zaBcZlV4?mmN&jrsuvA&Z13d{Y1b literal 0 HcmV?d00001 diff --git a/libreplan-webapp/src/main/webapp/jqplot/examples/index.html b/libreplan-webapp/src/main/webapp/jqplot/examples/index.html new file mode 100644 index 000000000..7d47fb769 --- /dev/null +++ b/libreplan-webapp/src/main/webapp/jqplot/examples/index.html @@ -0,0 +1,100 @@ + + + + + + jqPlot Sample Charts + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/libreplan-webapp/src/main/webapp/jqplot/examples/jquery-ui/css/ui-lightness/images/ui-bg_flat_0_aaaaaa_40x100.png b/libreplan-webapp/src/main/webapp/jqplot/examples/jquery-ui/css/ui-lightness/images/ui-bg_flat_0_aaaaaa_40x100.png new file mode 100644 index 0000000000000000000000000000000000000000..5b5dab2ab7b1c50dea9cfe73dc5a269a92d2d4b4 GIT binary patch literal 180 zcmeAS@N?(olHy`uVBq!ia0vp^8bF-F!3HG1q!d*FscKIb$B>N1x91EQ4=4yQ7#`R^ z$vje}bP0l+XkK DSH>_4 literal 0 HcmV?d00001 diff --git a/libreplan-webapp/src/main/webapp/jqplot/examples/jquery-ui/css/ui-lightness/images/ui-bg_flat_75_ffffff_40x100.png b/libreplan-webapp/src/main/webapp/jqplot/examples/jquery-ui/css/ui-lightness/images/ui-bg_flat_75_ffffff_40x100.png new file mode 100644 index 0000000000000000000000000000000000000000..ac8b229af950c29356abf64a6c4aa894575445f0 GIT binary patch literal 178 zcmeAS@N?(olHy`uVBq!ia0vp^8bF-F!3HG1q!d*FsY*{5$B>N1x91EQ4=4yQYz+E8 zPo9&<{J;c_6SHRil>2s{Zw^OT)6@jj2u|u!(plXsM>LJD`vD!n;OXk;vd$@?2>^GI BH@yG= literal 0 HcmV?d00001 diff --git a/libreplan-webapp/src/main/webapp/jqplot/examples/jquery-ui/css/ui-lightness/images/ui-bg_glass_55_fbf9ee_1x400.png b/libreplan-webapp/src/main/webapp/jqplot/examples/jquery-ui/css/ui-lightness/images/ui-bg_glass_55_fbf9ee_1x400.png new file mode 100644 index 0000000000000000000000000000000000000000..ad3d6346e00f246102f72f2e026ed0491988b394 GIT binary patch literal 120 zcmeAS@N?(olHy`uVBq!ia0vp^j6gJjgAK^akKnour0hLi978O6-<~(*I$*%ybaDOn z{W;e!B}_MSUQoPXhYd^Y6RUoS1yepnPx`2Kz)7OXQG!!=-jY=F+d2OOy?#DnJ32>z UEim$g7SJdLPgg&ebxsLQ09~*s;{X5v literal 0 HcmV?d00001 diff --git a/libreplan-webapp/src/main/webapp/jqplot/examples/jquery-ui/css/ui-lightness/images/ui-bg_glass_65_ffffff_1x400.png b/libreplan-webapp/src/main/webapp/jqplot/examples/jquery-ui/css/ui-lightness/images/ui-bg_glass_65_ffffff_1x400.png new file mode 100644 index 0000000000000000000000000000000000000000..42ccba269b6e91bef12ad0fa18be651b5ef0ee68 GIT binary patch literal 105 zcmeAS@N?(olHy`uVBq!ia0vp^j6gJjgAK^akKnouqzpV=978O6-=0?FV^9z|eBtf= z|7WztIJ;WT>{+tN>ySr~=F{k$>;_x^_y?afmf9pRKH0)6?eSP?3s5hEr>mdKI;Vst E0O;M1& literal 0 HcmV?d00001 diff --git a/libreplan-webapp/src/main/webapp/jqplot/examples/jquery-ui/css/ui-lightness/images/ui-bg_glass_75_dadada_1x400.png b/libreplan-webapp/src/main/webapp/jqplot/examples/jquery-ui/css/ui-lightness/images/ui-bg_glass_75_dadada_1x400.png new file mode 100644 index 0000000000000000000000000000000000000000..5a46b47cb16631068aee9e0bd61269fc4e95e5cd GIT binary patch literal 111 zcmeAS@N?(olHy`uVBq!ia0vp^j6gJjgAK^akKnouq|7{B978O6lPf+wIa#m9#>Unb zm^4K~wN3Zq+uP{vDV26o)#~38k_!`W=^oo1w6ixmPC4R1b Tyd6G3lNdZ*{an^LB{Ts5`idse literal 0 HcmV?d00001 diff --git a/libreplan-webapp/src/main/webapp/jqplot/examples/jquery-ui/css/ui-lightness/images/ui-bg_highlight-soft_75_cccccc_1x100.png b/libreplan-webapp/src/main/webapp/jqplot/examples/jquery-ui/css/ui-lightness/images/ui-bg_highlight-soft_75_cccccc_1x100.png new file mode 100644 index 0000000000000000000000000000000000000000..7c9fa6c6edcfcdd3e5b77e6f547b719e6fc66e30 GIT binary patch literal 101 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 literal 0 HcmV?d00001 diff --git a/libreplan-webapp/src/main/webapp/jqplot/examples/jquery-ui/css/ui-lightness/images/ui-icons_2e83ff_256x240.png b/libreplan-webapp/src/main/webapp/jqplot/examples/jquery-ui/css/ui-lightness/images/ui-icons_2e83ff_256x240.png new file mode 100644 index 0000000000000000000000000000000000000000..45e8928e5284adacea3f9ec07b9b50667d2ac65f GIT binary patch literal 4369 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 literal 0 HcmV?d00001 diff --git a/libreplan-webapp/src/main/webapp/jqplot/examples/jquery-ui/css/ui-lightness/images/ui-icons_454545_256x240.png b/libreplan-webapp/src/main/webapp/jqplot/examples/jquery-ui/css/ui-lightness/images/ui-icons_454545_256x240.png new file mode 100644 index 0000000000000000000000000000000000000000..7ec70d11bfb2f77374dfd00ef61ba0c3647b5a0c GIT binary patch literal 4369 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 k*Kv;w;*%(i9W@fAqs5i2wiq literal 0 HcmV?d00001 diff --git a/libreplan-webapp/src/main/webapp/jqplot/examples/jquery-ui/css/ui-lightness/images/ui-icons_888888_256x240.png b/libreplan-webapp/src/main/webapp/jqplot/examples/jquery-ui/css/ui-lightness/images/ui-icons_888888_256x240.png new file mode 100644 index 0000000000000000000000000000000000000000..5ba708c39172a69e069136bd1309c4322c61f571 GIT binary patch literal 4369 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 literal 0 HcmV?d00001 diff --git a/libreplan-webapp/src/main/webapp/jqplot/examples/jquery-ui/css/ui-lightness/jquery-ui.css b/libreplan-webapp/src/main/webapp/jqplot/examples/jquery-ui/css/ui-lightness/jquery-ui.css new file mode 100644 index 000000000..cd66d5377 --- /dev/null +++ b/libreplan-webapp/src/main/webapp/jqplot/examples/jquery-ui/css/ui-lightness/jquery-ui.css @@ -0,0 +1,612 @@ +/* + * jQuery UI CSS Framework 1.9pre + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Theming/API + */ + +/* Layout helpers +----------------------------------*/ +.ui-helper-hidden { display: none; } +.ui-helper-hidden-accessible { position: absolute !important; clip: rect(1px 1px 1px 1px); clip: rect(1px,1px,1px,1px); } +.ui-helper-reset { margin: 0; padding: 0; border: 0; outline: 0; line-height: 1.3; text-decoration: none; font-size: 100%; list-style: none; } +.ui-helper-clearfix:after { content: "."; display: block; height: 0; clear: both; visibility: hidden; } +.ui-helper-clearfix { display: inline-block; } +/* required comment for clearfix to work in Opera \*/ +* html .ui-helper-clearfix { height:1%; } +.ui-helper-clearfix { display:block; } +/* end clearfix */ +.ui-helper-zfix { width: 100%; height: 100%; top: 0; left: 0; position: absolute; opacity: 0; filter:Alpha(Opacity=0); } + + +/* Interaction Cues +----------------------------------*/ +.ui-state-disabled { cursor: default !important; } + + +/* Icons +----------------------------------*/ + +/* states and images */ +.ui-icon { display: block; text-indent: -99999px; overflow: hidden; background-repeat: no-repeat; } + + +/* Misc visuals +----------------------------------*/ + +/* Overlays */ +.ui-widget-overlay { position: absolute; top: 0; left: 0; width: 100%; height: 100%; } +/* + * jQuery UI Accordion 1.9pre + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Accordion#theming + */ +/* IE/Win - Fix animation bug - #4615 */ +.ui-accordion { width: 100%; } +.ui-accordion .ui-accordion-header { cursor: pointer; position: relative; margin-top: 1px; zoom: 1; } +.ui-accordion .ui-accordion-header-active { border-bottom: 0 !important; } +.ui-accordion .ui-accordion-heading { display: block; font-size: 1em; padding: .5em .5em .5em .7em; } +.ui-accordion-icons .ui-accordion-heading { padding-left: 2.2em; } +.ui-accordion .ui-accordion-header .ui-accordion-header-icon { position: absolute; left: .5em; top: 50%; margin-top: -8px; } +.ui-accordion .ui-accordion-content { padding: 1em 2.2em; border-top: 0; margin-top: -2px; position: relative; top: 1px; margin-bottom: 2px; overflow: auto; display: none; zoom: 1; } +.ui-accordion .ui-accordion-content-active { display: block; } +/* + * jQuery UI Autocomplete 1.9pre + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Autocomplete#theming + */ +.ui-autocomplete { position: absolute; cursor: default; } + +/* workarounds */ +* html .ui-autocomplete { width:1px; } /* without this, the menu expands to 100% in IE6 */ +/* + * jQuery UI Button 1.9pre + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Button#theming + */ +.ui-button { display: inline-block; position: relative; padding: 0; margin-right: .1em; text-decoration: none !important; cursor: pointer; text-align: center; zoom: 1; overflow: visible; } /* the overflow property removes extra width in IE */ +.ui-button-icon-only { width: 2.2em; } /* to make room for the icon, a width needs to be set here */ +button.ui-button-icon-only { width: 2.4em; } /* button elements seem to need a little more width */ +.ui-button-icons-only { width: 3.4em; } +button.ui-button-icons-only { width: 3.7em; } + +/*button text element */ +.ui-button .ui-button-text { display: block; line-height: 1.4; } +.ui-button-text-only .ui-button-text { padding: .4em 1em; } +.ui-button-icon-only .ui-button-text, .ui-button-icons-only .ui-button-text { padding: .4em; text-indent: -9999999px; } +.ui-button-text-icon-primary .ui-button-text, .ui-button-text-icons .ui-button-text { padding: .4em 1em .4em 2.1em; } +.ui-button-text-icon-secondary .ui-button-text, .ui-button-text-icons .ui-button-text { padding: .4em 2.1em .4em 1em; } +.ui-button-text-icons .ui-button-text { padding-left: 2.1em; padding-right: 2.1em; } +/* no icon support for input elements, provide padding by default */ +input.ui-button { padding: .4em 1em; } + +/*button icon element(s) */ +.ui-button-icon-only .ui-icon, .ui-button-text-icon-primary .ui-icon, .ui-button-text-icon-secondary .ui-icon, .ui-button-text-icons .ui-icon, .ui-button-icons-only .ui-icon { position: absolute; top: 50%; margin-top: -8px; } +.ui-button-icon-only .ui-icon { left: 50%; margin-left: -8px; } +.ui-button-text-icon-primary .ui-button-icon-primary, .ui-button-text-icons .ui-button-icon-primary, .ui-button-icons-only .ui-button-icon-primary { left: .5em; } +.ui-button-text-icon-secondary .ui-button-icon-secondary, .ui-button-text-icons .ui-button-icon-secondary, .ui-button-icons-only .ui-button-icon-secondary { right: .5em; } +.ui-button-text-icons .ui-button-icon-secondary, .ui-button-icons-only .ui-button-icon-secondary { right: .5em; } + +/*button sets*/ +.ui-buttonset { margin-right: 7px; } +.ui-buttonset .ui-button { margin-left: 0; margin-right: -.3em; } + +/* workarounds */ +button.ui-button::-moz-focus-inner { border: 0; padding: 0; } /* reset extra padding in Firefox */ +/* + * jQuery UI Datepicker 1.9pre + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Datepicker#theming + */ +.ui-datepicker { width: 17em; padding: .2em .2em 0; display: none; } +.ui-datepicker .ui-datepicker-header { position:relative; padding:.2em 0; } +.ui-datepicker .ui-datepicker-prev, .ui-datepicker .ui-datepicker-next { position:absolute; top: 2px; width: 1.8em; height: 1.8em; } +.ui-datepicker .ui-datepicker-prev-hover, .ui-datepicker .ui-datepicker-next-hover { top: 1px; } +.ui-datepicker .ui-datepicker-prev { left:2px; } +.ui-datepicker .ui-datepicker-next { right:2px; } +.ui-datepicker .ui-datepicker-prev-hover { left:1px; } +.ui-datepicker .ui-datepicker-next-hover { right:1px; } +.ui-datepicker .ui-datepicker-prev span, .ui-datepicker .ui-datepicker-next span { display: block; position: absolute; left: 50%; margin-left: -8px; top: 50%; margin-top: -8px; } +.ui-datepicker .ui-datepicker-title { margin: 0 2.3em; line-height: 1.8em; text-align: center; } +.ui-datepicker .ui-datepicker-title select { font-size:1em; margin:1px 0; } +.ui-datepicker select.ui-datepicker-month-year {width: 100%;} +.ui-datepicker select.ui-datepicker-month, +.ui-datepicker select.ui-datepicker-year { width: 49%;} +.ui-datepicker table {width: 100%; font-size: .9em; border-collapse: collapse; margin:0 0 .4em; } +.ui-datepicker th { padding: .7em .3em; text-align: center; font-weight: bold; border: 0; } +.ui-datepicker td { border: 0; padding: 1px; } +.ui-datepicker td span, .ui-datepicker td a { display: block; padding: .2em; text-align: right; text-decoration: none; } +.ui-datepicker .ui-datepicker-buttonpane { background-image: none; margin: .7em 0 0 0; padding:0 .2em; border-left: 0; border-right: 0; border-bottom: 0; } +.ui-datepicker .ui-datepicker-buttonpane button { float: right; margin: .5em .2em .4em; cursor: pointer; padding: .2em .6em .3em .6em; width:auto; overflow:visible; } +.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current { float:left; } + +/* with multiple calendars */ +.ui-datepicker.ui-datepicker-multi { width:auto; } +.ui-datepicker-multi .ui-datepicker-group { float:left; } +.ui-datepicker-multi .ui-datepicker-group table { width:95%; margin:0 auto .4em; } +.ui-datepicker-multi-2 .ui-datepicker-group { width:50%; } +.ui-datepicker-multi-3 .ui-datepicker-group { width:33.3%; } +.ui-datepicker-multi-4 .ui-datepicker-group { width:25%; } +.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header { border-left-width:0; } +.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header { border-left-width:0; } +.ui-datepicker-multi .ui-datepicker-buttonpane { clear:left; } +.ui-datepicker-row-break { clear:both; width:100%; font-size:0em; } + +/* RTL support */ +.ui-datepicker-rtl { direction: rtl; } +.ui-datepicker-rtl .ui-datepicker-prev { right: 2px; left: auto; } +.ui-datepicker-rtl .ui-datepicker-next { left: 2px; right: auto; } +.ui-datepicker-rtl .ui-datepicker-prev:hover { right: 1px; left: auto; } +.ui-datepicker-rtl .ui-datepicker-next:hover { left: 1px; right: auto; } +.ui-datepicker-rtl .ui-datepicker-buttonpane { clear:right; } +.ui-datepicker-rtl .ui-datepicker-buttonpane button { float: left; } +.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current { float:right; } +.ui-datepicker-rtl .ui-datepicker-group { float:right; } +.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header { border-right-width:0; border-left-width:1px; } +.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header { border-right-width:0; border-left-width:1px; } + +/* IE6 IFRAME FIX (taken from datepicker 1.5.3 */ +.ui-datepicker-cover { + display: none; /*sorry for IE5*/ + display/**/: block; /*sorry for IE5*/ + position: absolute; /*must have*/ + z-index: -1; /*must have*/ + filter: mask(); /*must have*/ + top: -4px; /*must have*/ + left: -4px; /*must have*/ + width: 200px; /*must have*/ + height: 200px; /*must have*/ +}/* + * jQuery UI Dialog 1.9pre + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Dialog#theming + */ +.ui-dialog { position: absolute; padding: .2em; width: 300px; overflow: hidden; } +.ui-dialog .ui-dialog-titlebar { padding: .4em 1em; position: relative; } +.ui-dialog .ui-dialog-title { float: left; margin: .1em 16px .1em 0; } +.ui-dialog .ui-dialog-titlebar-close { position: absolute; right: .3em; top: 50%; width: 19px; margin: -10px 0 0 0; padding: 1px; height: 18px; } +.ui-dialog .ui-dialog-titlebar-close span { display: block; margin: 1px; } +.ui-dialog .ui-dialog-titlebar-close:hover, .ui-dialog .ui-dialog-titlebar-close:focus { padding: 0; } +.ui-dialog .ui-dialog-content { position: relative; border: 0; padding: .5em 1em; background: none; overflow: auto; zoom: 1; } +.ui-dialog .ui-dialog-buttonpane { text-align: left; border-width: 1px 0 0 0; background-image: none; margin: .5em 0 0 0; padding: .3em 1em .5em .4em; } +.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset { float: right; } +.ui-dialog .ui-dialog-buttonpane button { margin: .5em .4em .5em 0; cursor: pointer; } +.ui-dialog .ui-resizable-se { width: 14px; height: 14px; right: 3px; bottom: 3px; } +.ui-draggable .ui-dialog-titlebar { cursor: move; } +/* + * jQuery UI Menu 1.9pre + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Menu#theming + */ +.ui-menu { list-style:none; padding: 2px; margin: 0; display:block; outline: none; } +.ui-menu .ui-menu { margin-top: -3px; position: absolute; } +.ui-menu .ui-menu-item { margin: 0; padding: 0; zoom: 1; width: 100%; } +.ui-menu .ui-menu-item a { text-decoration: none; display: block; padding: 2px .4em; line-height: 1.5; zoom: 1; font-weight: normal; } +.ui-menu .ui-menu-item a.ui-state-focus, +.ui-menu .ui-menu-item a.ui-state-active { font-weight: normal; margin: -1px; } + +.ui-menu li.ui-state-disabled { font-weight: normal; padding: .0em .4em; margin: .4em 0 .2em; line-height: 1.5; } + +/* icon support */ +.ui-menu-icons { position: relative; } +.ui-menu-icons .ui-menu-item a { position: relative; padding-left: 2em; } + +/* left-aligned */ +.ui-menu .ui-icon { position: absolute; top: .2em; left: .2em; } + +/* right-aligned */ +.ui-menu .ui-menu-icon { position: static; float: right; } +/* + * jQuery UI Menubar 1.9pre + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + */ +.ui-menubar { list-style: none; margin: 0; padding-left: 0; } + +.ui-menubar-item { float: left; } + +.ui-menubar .ui-button { float: left; font-weight: normal; border-top-width: 0 !important; border-bottom-width: 0 !important; margin: 0; outline: none; } +.ui-menubar .ui-menubar-link { border-right: 1px dashed transparent; border-left: 1px dashed transparent; } + +.ui-menubar .ui-menu { width: 200px; position: absolute; z-index: 9999; } +/* + * jQuery UI Progressbar 1.9pre + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Progressbar#theming + */ +.ui-progressbar { height:2em; text-align: left; overflow: hidden; } +.ui-progressbar .ui-progressbar-value {margin: -1px; height:100%; }/* + * jQuery UI Resizable 1.9pre + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Resizable#theming + */ +.ui-resizable { position: relative;} +.ui-resizable-handle { position: absolute;font-size: 0.1px;z-index: 99999; display: block; } +.ui-resizable-disabled .ui-resizable-handle, .ui-resizable-autohide .ui-resizable-handle { display: none; } +.ui-resizable-n { cursor: n-resize; height: 7px; width: 100%; top: -5px; left: 0; } +.ui-resizable-s { cursor: s-resize; height: 7px; width: 100%; bottom: -5px; left: 0; } +.ui-resizable-e { cursor: e-resize; width: 7px; right: -5px; top: 0; height: 100%; } +.ui-resizable-w { cursor: w-resize; width: 7px; left: -5px; top: 0; height: 100%; } +.ui-resizable-se { cursor: se-resize; width: 12px; height: 12px; right: 1px; bottom: 1px; } +.ui-resizable-sw { cursor: sw-resize; width: 9px; height: 9px; left: -5px; bottom: -5px; } +.ui-resizable-nw { cursor: nw-resize; width: 9px; height: 9px; left: -5px; top: -5px; } +.ui-resizable-ne { cursor: ne-resize; width: 9px; height: 9px; right: -5px; top: -5px;}/* + * jQuery UI Selectable 1.9pre + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Selectable#theming + */ +.ui-selectable-helper { position: absolute; z-index: 100; border:1px dotted black; } +/* + * jQuery UI Slider 1.9pre + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Slider#theming + */ +.ui-slider { position: relative; text-align: left; } +.ui-slider .ui-slider-handle { position: absolute; z-index: 2; width: 1.2em; height: 1.2em; cursor: default; } +.ui-slider .ui-slider-range { position: absolute; z-index: 1; font-size: .7em; display: block; border: 0; background-position: 0 0; } + +.ui-slider-horizontal { height: .8em; } +.ui-slider-horizontal .ui-slider-handle { top: -.3em; margin-left: -.6em; } +.ui-slider-horizontal .ui-slider-range { top: 0; height: 100%; } +.ui-slider-horizontal .ui-slider-range-min { left: 0; } +.ui-slider-horizontal .ui-slider-range-max { right: 0; } + +.ui-slider-vertical { width: .8em; height: 100px; } +.ui-slider-vertical .ui-slider-handle { left: -.3em; margin-left: 0; margin-bottom: -.6em; } +.ui-slider-vertical .ui-slider-range { left: 0; width: 100%; } +.ui-slider-vertical .ui-slider-range-min { bottom: 0; } +.ui-slider-vertical .ui-slider-range-max { top: 0; }/* + * jQuery UI Spinner 1.9pre + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Spinner#theming + */ +.ui-spinner { position:relative; display: inline-block; overflow: hidden; padding: 0; vertical-align: middle; } +.ui-spinner-input { border: none; background: none; padding: 0; margin: .2em 0; vertical-align: middle; margin-left: .4em; margin-right: 22px; } +.ui-spinner-button { width: 16px; height: 50%; font-size: .5em; padding: 0; margin: 0; z-index: 100; text-align: center; vertical-align: middle; position: absolute; cursor: default; display: block; overflow: hidden; right: 0; } +.ui-spinner a.ui-spinner-button { border-top: none; border-bottom: none; border-right: none; } /* more specificity required here to overide default borders */ +.ui-spinner .ui-icon { position: absolute; margin-top: -8px; top: 50%; left: 0; } /* vertical centre icon */ +.ui-spinner-up { top: 0; } +.ui-spinner-down { bottom: 0; } + +/* TR overrides */ +span.ui-spinner { background: none; } +.ui-spinner .ui-icon-triangle-1-s { + /* need to fix icons sprite */ + background-position:-65px -16px; +} +/* + * jQuery UI Tabs 1.9pre + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Tabs#theming + */ +.ui-tabs { position: relative; padding: .2em; zoom: 1; } /* position: relative prevents IE scroll bug (element with position: relative inside container with overflow: auto appear as "fixed") */ +.ui-tabs .ui-tabs-nav { margin: 0; padding: .2em .2em 0; } +.ui-tabs .ui-tabs-nav li { list-style: none; float: left; position: relative; top: 0; margin: 1px .2em 0 0; border-bottom: 0 !important; padding: 0; white-space: nowrap; } +.ui-tabs .ui-tabs-nav li a { float: left; padding: .5em 1em; text-decoration: none; } +.ui-tabs .ui-tabs-nav li.ui-tabs-active { margin-bottom: -1px; padding-bottom: 1px; } +.ui-tabs .ui-tabs-nav li.ui-tabs-active a, .ui-tabs .ui-tabs-nav li.ui-state-disabled a, .ui-tabs .ui-tabs-nav li.ui-tabs-loading a { cursor: text; } +.ui-tabs .ui-tabs-nav li a, .ui-tabs.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active a { cursor: pointer; } /* first selector in group seems obsolete, but required to overcome bug in Opera applying cursor: text overall if defined elsewhere... */ +.ui-tabs .ui-tabs-panel { display: block; border-width: 0; padding: 1em 1.4em; background: none; } +/* + * jQuery UI Tooltip 1.9pre + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Tooltip#theming + */ +.ui-tooltip { + padding:8px; + position:absolute; + z-index:9999; + -o-box-shadow: 0 0 5px #aaa; + -moz-box-shadow: 0 0 5px #aaa; + -webkit-box-shadow: 0 0 5px #aaa; + box-shadow: 0 0 5px #aaa; +} +/* Fades and background-images don't work well together in IE6, drop the image */ +* html .ui-tooltip { + background-image: none; +} +body .ui-tooltip { border-width:2px; } +/* + * jQuery UI CSS Framework 1.9pre + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Theming/API + * + * To view and modify this theme, visit http://jqueryui.com/themeroller/ + */ + + +/* Component containers +----------------------------------*/ +.ui-widget { font-family: Verdana,Arial,sans-serif/*{ffDefault}*/; font-size: 1.1em/*{fsDefault}*/; } +.ui-widget .ui-widget { font-size: 1em; } +.ui-widget input, .ui-widget select, .ui-widget textarea, .ui-widget button { font-family: Verdana,Arial,sans-serif/*{ffDefault}*/; font-size: 1em; } +.ui-widget-content { border: 1px solid #aaaaaa/*{borderColorContent}*/; background: #ffffff/*{bgColorContent}*/ url(images/ui-bg_flat_75_ffffff_40x100.png)/*{bgImgUrlContent}*/ 50%/*{bgContentXPos}*/ 50%/*{bgContentYPos}*/ repeat-x/*{bgContentRepeat}*/; color: #222222/*{fcContent}*/; } +.ui-widget-content a { color: #222222/*{fcContent}*/; } +.ui-widget-header { border: 1px solid #aaaaaa/*{borderColorHeader}*/; background: #cccccc/*{bgColorHeader}*/ url(images/ui-bg_highlight-soft_75_cccccc_1x100.png)/*{bgImgUrlHeader}*/ 50%/*{bgHeaderXPos}*/ 50%/*{bgHeaderYPos}*/ repeat-x/*{bgHeaderRepeat}*/; color: #222222/*{fcHeader}*/; font-weight: bold; } +.ui-widget-header a { color: #222222/*{fcHeader}*/; } + +/* Interaction states +----------------------------------*/ +.ui-state-default, .ui-widget-content .ui-state-default, .ui-widget-header .ui-state-default { border: 1px solid #d3d3d3/*{borderColorDefault}*/; background: #e6e6e6/*{bgColorDefault}*/ url(images/ui-bg_glass_75_e6e6e6_1x400.png)/*{bgImgUrlDefault}*/ 50%/*{bgDefaultXPos}*/ 50%/*{bgDefaultYPos}*/ repeat-x/*{bgDefaultRepeat}*/; font-weight: normal/*{fwDefault}*/; color: #555555/*{fcDefault}*/; } +.ui-state-default a, .ui-state-default a:link, .ui-state-default a:visited { color: #555555/*{fcDefault}*/; text-decoration: none; } +.ui-state-hover, .ui-widget-content .ui-state-hover, .ui-widget-header .ui-state-hover, .ui-state-focus, .ui-widget-content .ui-state-focus, .ui-widget-header .ui-state-focus { border: 1px solid #999999/*{borderColorHover}*/; background: #dadada/*{bgColorHover}*/ url(images/ui-bg_glass_75_dadada_1x400.png)/*{bgImgUrlHover}*/ 50%/*{bgHoverXPos}*/ 50%/*{bgHoverYPos}*/ repeat-x/*{bgHoverRepeat}*/; font-weight: normal/*{fwDefault}*/; color: #212121/*{fcHover}*/; } +.ui-state-hover a, .ui-state-hover a:hover { color: #212121/*{fcHover}*/; text-decoration: none; } +.ui-state-active, .ui-widget-content .ui-state-active, .ui-widget-header .ui-state-active { border: 1px solid #aaaaaa/*{borderColorActive}*/; background: #ffffff/*{bgColorActive}*/ url(images/ui-bg_glass_65_ffffff_1x400.png)/*{bgImgUrlActive}*/ 50%/*{bgActiveXPos}*/ 50%/*{bgActiveYPos}*/ repeat-x/*{bgActiveRepeat}*/; font-weight: normal/*{fwDefault}*/; color: #212121/*{fcActive}*/; } +.ui-state-active a, .ui-state-active a:link, .ui-state-active a:visited { color: #212121/*{fcActive}*/; text-decoration: none; } +.ui-widget :active { outline: none; } + +/* Interaction Cues +----------------------------------*/ +.ui-state-highlight, .ui-widget-content .ui-state-highlight, .ui-widget-header .ui-state-highlight {border: 1px solid #fcefa1/*{borderColorHighlight}*/; background: #fbf9ee/*{bgColorHighlight}*/ url(images/ui-bg_glass_55_fbf9ee_1x400.png)/*{bgImgUrlHighlight}*/ 50%/*{bgHighlightXPos}*/ 50%/*{bgHighlightYPos}*/ repeat-x/*{bgHighlightRepeat}*/; color: #363636/*{fcHighlight}*/; } +.ui-state-highlight a, .ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a { color: #363636/*{fcHighlight}*/; } +.ui-state-error, .ui-widget-content .ui-state-error, .ui-widget-header .ui-state-error {border: 1px solid #cd0a0a/*{borderColorError}*/; background: #fef1ec/*{bgColorError}*/ url(images/ui-bg_glass_95_fef1ec_1x400.png)/*{bgImgUrlError}*/ 50%/*{bgErrorXPos}*/ 50%/*{bgErrorYPos}*/ repeat-x/*{bgErrorRepeat}*/; color: #cd0a0a/*{fcError}*/; } +.ui-state-error a, .ui-widget-content .ui-state-error a, .ui-widget-header .ui-state-error a { color: #cd0a0a/*{fcError}*/; } +.ui-state-error-text, .ui-widget-content .ui-state-error-text, .ui-widget-header .ui-state-error-text { color: #cd0a0a/*{fcError}*/; } +.ui-priority-primary, .ui-widget-content .ui-priority-primary, .ui-widget-header .ui-priority-primary { font-weight: bold; } +.ui-priority-secondary, .ui-widget-content .ui-priority-secondary, .ui-widget-header .ui-priority-secondary { opacity: .7; filter:Alpha(Opacity=70); font-weight: normal; } +.ui-state-disabled, .ui-widget-content .ui-state-disabled, .ui-widget-header .ui-state-disabled { opacity: .35; filter:Alpha(Opacity=35); background-image: none; } + +/* Icons +----------------------------------*/ + +/* states and images */ +.ui-icon { width: 16px; height: 16px; background-image: url(images/ui-icons_222222_256x240.png)/*{iconsContent}*/; } +.ui-widget-content .ui-icon {background-image: url(images/ui-icons_222222_256x240.png)/*{iconsContent}*/; } +.ui-widget-header .ui-icon {background-image: url(images/ui-icons_222222_256x240.png)/*{iconsHeader}*/; } +.ui-state-default .ui-icon { background-image: url(images/ui-icons_888888_256x240.png)/*{iconsDefault}*/; } +.ui-state-hover .ui-icon, .ui-state-focus .ui-icon {background-image: url(images/ui-icons_454545_256x240.png)/*{iconsHover}*/; } +.ui-state-active .ui-icon {background-image: url(images/ui-icons_454545_256x240.png)/*{iconsActive}*/; } +.ui-state-highlight .ui-icon {background-image: url(images/ui-icons_2e83ff_256x240.png)/*{iconsHighlight}*/; } +.ui-state-error .ui-icon, .ui-state-error-text .ui-icon {background-image: url(images/ui-icons_cd0a0a_256x240.png)/*{iconsError}*/; } + +/* positioning */ +.ui-icon-carat-1-n { background-position: 0 0; } +.ui-icon-carat-1-ne { background-position: -16px 0; } +.ui-icon-carat-1-e { background-position: -32px 0; } +.ui-icon-carat-1-se { background-position: -48px 0; } +.ui-icon-carat-1-s { background-position: -64px 0; } +.ui-icon-carat-1-sw { background-position: -80px 0; } +.ui-icon-carat-1-w { background-position: -96px 0; } +.ui-icon-carat-1-nw { background-position: -112px 0; } +.ui-icon-carat-2-n-s { background-position: -128px 0; } +.ui-icon-carat-2-e-w { background-position: -144px 0; } +.ui-icon-triangle-1-n { background-position: 0 -16px; } +.ui-icon-triangle-1-ne { background-position: -16px -16px; } +.ui-icon-triangle-1-e { background-position: -32px -16px; } +.ui-icon-triangle-1-se { background-position: -48px -16px; } +.ui-icon-triangle-1-s { background-position: -64px -16px; } +.ui-icon-triangle-1-sw { background-position: -80px -16px; } +.ui-icon-triangle-1-w { background-position: -96px -16px; } +.ui-icon-triangle-1-nw { background-position: -112px -16px; } +.ui-icon-triangle-2-n-s { background-position: -128px -16px; } +.ui-icon-triangle-2-e-w { background-position: -144px -16px; } +.ui-icon-arrow-1-n { background-position: 0 -32px; } +.ui-icon-arrow-1-ne { background-position: -16px -32px; } +.ui-icon-arrow-1-e { background-position: -32px -32px; } +.ui-icon-arrow-1-se { background-position: -48px -32px; } +.ui-icon-arrow-1-s { background-position: -64px -32px; } +.ui-icon-arrow-1-sw { background-position: -80px -32px; } +.ui-icon-arrow-1-w { background-position: -96px -32px; } +.ui-icon-arrow-1-nw { background-position: -112px -32px; } +.ui-icon-arrow-2-n-s { background-position: -128px -32px; } +.ui-icon-arrow-2-ne-sw { background-position: -144px -32px; } +.ui-icon-arrow-2-e-w { background-position: -160px -32px; } +.ui-icon-arrow-2-se-nw { background-position: -176px -32px; } +.ui-icon-arrowstop-1-n { background-position: -192px -32px; } +.ui-icon-arrowstop-1-e { background-position: -208px -32px; } +.ui-icon-arrowstop-1-s { background-position: -224px -32px; } +.ui-icon-arrowstop-1-w { background-position: -240px -32px; } +.ui-icon-arrowthick-1-n { background-position: 0 -48px; } +.ui-icon-arrowthick-1-ne { background-position: -16px -48px; } +.ui-icon-arrowthick-1-e { background-position: -32px -48px; } +.ui-icon-arrowthick-1-se { background-position: -48px -48px; } +.ui-icon-arrowthick-1-s { background-position: -64px -48px; } +.ui-icon-arrowthick-1-sw { background-position: -80px -48px; } +.ui-icon-arrowthick-1-w { background-position: -96px -48px; } +.ui-icon-arrowthick-1-nw { background-position: -112px -48px; } +.ui-icon-arrowthick-2-n-s { background-position: -128px -48px; } +.ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; } +.ui-icon-arrowthick-2-e-w { background-position: -160px -48px; } +.ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; } +.ui-icon-arrowthickstop-1-n { background-position: -192px -48px; } +.ui-icon-arrowthickstop-1-e { background-position: -208px -48px; } +.ui-icon-arrowthickstop-1-s { background-position: -224px -48px; } +.ui-icon-arrowthickstop-1-w { background-position: -240px -48px; } +.ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; } +.ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; } +.ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; } +.ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; } +.ui-icon-arrowreturn-1-w { background-position: -64px -64px; } +.ui-icon-arrowreturn-1-n { background-position: -80px -64px; } +.ui-icon-arrowreturn-1-e { background-position: -96px -64px; } +.ui-icon-arrowreturn-1-s { background-position: -112px -64px; } +.ui-icon-arrowrefresh-1-w { background-position: -128px -64px; } +.ui-icon-arrowrefresh-1-n { background-position: -144px -64px; } +.ui-icon-arrowrefresh-1-e { background-position: -160px -64px; } +.ui-icon-arrowrefresh-1-s { background-position: -176px -64px; } +.ui-icon-arrow-4 { background-position: 0 -80px; } +.ui-icon-arrow-4-diag { background-position: -16px -80px; } +.ui-icon-extlink { background-position: -32px -80px; } +.ui-icon-newwin { background-position: -48px -80px; } +.ui-icon-refresh { background-position: -64px -80px; } +.ui-icon-shuffle { background-position: -80px -80px; } +.ui-icon-transfer-e-w { background-position: -96px -80px; } +.ui-icon-transferthick-e-w { background-position: -112px -80px; } +.ui-icon-folder-collapsed { background-position: 0 -96px; } +.ui-icon-folder-open { background-position: -16px -96px; } +.ui-icon-document { background-position: -32px -96px; } +.ui-icon-document-b { background-position: -48px -96px; } +.ui-icon-note { background-position: -64px -96px; } +.ui-icon-mail-closed { background-position: -80px -96px; } +.ui-icon-mail-open { background-position: -96px -96px; } +.ui-icon-suitcase { background-position: -112px -96px; } +.ui-icon-comment { background-position: -128px -96px; } +.ui-icon-person { background-position: -144px -96px; } +.ui-icon-print { background-position: -160px -96px; } +.ui-icon-trash { background-position: -176px -96px; } +.ui-icon-locked { background-position: -192px -96px; } +.ui-icon-unlocked { background-position: -208px -96px; } +.ui-icon-bookmark { background-position: -224px -96px; } +.ui-icon-tag { background-position: -240px -96px; } +.ui-icon-home { background-position: 0 -112px; } +.ui-icon-flag { background-position: -16px -112px; } +.ui-icon-calendar { background-position: -32px -112px; } +.ui-icon-cart { background-position: -48px -112px; } +.ui-icon-pencil { background-position: -64px -112px; } +.ui-icon-clock { background-position: -80px -112px; } +.ui-icon-disk { background-position: -96px -112px; } +.ui-icon-calculator { background-position: -112px -112px; } +.ui-icon-zoomin { background-position: -128px -112px; } +.ui-icon-zoomout { background-position: -144px -112px; } +.ui-icon-search { background-position: -160px -112px; } +.ui-icon-wrench { background-position: -176px -112px; } +.ui-icon-gear { background-position: -192px -112px; } +.ui-icon-heart { background-position: -208px -112px; } +.ui-icon-star { background-position: -224px -112px; } +.ui-icon-link { background-position: -240px -112px; } +.ui-icon-cancel { background-position: 0 -128px; } +.ui-icon-plus { background-position: -16px -128px; } +.ui-icon-plusthick { background-position: -32px -128px; } +.ui-icon-minus { background-position: -48px -128px; } +.ui-icon-minusthick { background-position: -64px -128px; } +.ui-icon-close { background-position: -80px -128px; } +.ui-icon-closethick { background-position: -96px -128px; } +.ui-icon-key { background-position: -112px -128px; } +.ui-icon-lightbulb { background-position: -128px -128px; } +.ui-icon-scissors { background-position: -144px -128px; } +.ui-icon-clipboard { background-position: -160px -128px; } +.ui-icon-copy { background-position: -176px -128px; } +.ui-icon-contact { background-position: -192px -128px; } +.ui-icon-image { background-position: -208px -128px; } +.ui-icon-video { background-position: -224px -128px; } +.ui-icon-script { background-position: -240px -128px; } +.ui-icon-alert { background-position: 0 -144px; } +.ui-icon-info { background-position: -16px -144px; } +.ui-icon-notice { background-position: -32px -144px; } +.ui-icon-help { background-position: -48px -144px; } +.ui-icon-check { background-position: -64px -144px; } +.ui-icon-bullet { background-position: -80px -144px; } +.ui-icon-radio-on { background-position: -96px -144px; } +.ui-icon-radio-off { background-position: -112px -144px; } +.ui-icon-pin-w { background-position: -128px -144px; } +.ui-icon-pin-s { background-position: -144px -144px; } +.ui-icon-play { background-position: 0 -160px; } +.ui-icon-pause { background-position: -16px -160px; } +.ui-icon-seek-next { background-position: -32px -160px; } +.ui-icon-seek-prev { background-position: -48px -160px; } +.ui-icon-seek-end { background-position: -64px -160px; } +.ui-icon-seek-start { background-position: -80px -160px; } +/* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */ +.ui-icon-seek-first { background-position: -80px -160px; } +.ui-icon-stop { background-position: -96px -160px; } +.ui-icon-eject { background-position: -112px -160px; } +.ui-icon-volume-off { background-position: -128px -160px; } +.ui-icon-volume-on { background-position: -144px -160px; } +.ui-icon-power { background-position: 0 -176px; } +.ui-icon-signal-diag { background-position: -16px -176px; } +.ui-icon-signal { background-position: -32px -176px; } +.ui-icon-battery-0 { background-position: -48px -176px; } +.ui-icon-battery-1 { background-position: -64px -176px; } +.ui-icon-battery-2 { background-position: -80px -176px; } +.ui-icon-battery-3 { background-position: -96px -176px; } +.ui-icon-circle-plus { background-position: 0 -192px; } +.ui-icon-circle-minus { background-position: -16px -192px; } +.ui-icon-circle-close { background-position: -32px -192px; } +.ui-icon-circle-triangle-e { background-position: -48px -192px; } +.ui-icon-circle-triangle-s { background-position: -64px -192px; } +.ui-icon-circle-triangle-w { background-position: -80px -192px; } +.ui-icon-circle-triangle-n { background-position: -96px -192px; } +.ui-icon-circle-arrow-e { background-position: -112px -192px; } +.ui-icon-circle-arrow-s { background-position: -128px -192px; } +.ui-icon-circle-arrow-w { background-position: -144px -192px; } +.ui-icon-circle-arrow-n { background-position: -160px -192px; } +.ui-icon-circle-zoomin { background-position: -176px -192px; } +.ui-icon-circle-zoomout { background-position: -192px -192px; } +.ui-icon-circle-check { background-position: -208px -192px; } +.ui-icon-circlesmall-plus { background-position: 0 -208px; } +.ui-icon-circlesmall-minus { background-position: -16px -208px; } +.ui-icon-circlesmall-close { background-position: -32px -208px; } +.ui-icon-squaresmall-plus { background-position: -48px -208px; } +.ui-icon-squaresmall-minus { background-position: -64px -208px; } +.ui-icon-squaresmall-close { background-position: -80px -208px; } +.ui-icon-grip-dotted-vertical { background-position: 0 -224px; } +.ui-icon-grip-dotted-horizontal { background-position: -16px -224px; } +.ui-icon-grip-solid-vertical { background-position: -32px -224px; } +.ui-icon-grip-solid-horizontal { background-position: -48px -224px; } +.ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; } +.ui-icon-grip-diagonal-se { background-position: -80px -224px; } + + +/* Misc visuals +----------------------------------*/ + +/* Corner radius */ +.ui-corner-all, .ui-corner-top, .ui-corner-left, .ui-corner-tl { -moz-border-radius-topleft: 4px/*{cornerRadius}*/; -webkit-border-top-left-radius: 4px/*{cornerRadius}*/; -khtml-border-top-left-radius: 4px/*{cornerRadius}*/; border-top-left-radius: 4px/*{cornerRadius}*/; } +.ui-corner-all, .ui-corner-top, .ui-corner-right, .ui-corner-tr { -moz-border-radius-topright: 4px/*{cornerRadius}*/; -webkit-border-top-right-radius: 4px/*{cornerRadius}*/; -khtml-border-top-right-radius: 4px/*{cornerRadius}*/; border-top-right-radius: 4px/*{cornerRadius}*/; } +.ui-corner-all, .ui-corner-bottom, .ui-corner-left, .ui-corner-bl { -moz-border-radius-bottomleft: 4px/*{cornerRadius}*/; -webkit-border-bottom-left-radius: 4px/*{cornerRadius}*/; -khtml-border-bottom-left-radius: 4px/*{cornerRadius}*/; border-bottom-left-radius: 4px/*{cornerRadius}*/; } +.ui-corner-all, .ui-corner-bottom, .ui-corner-right, .ui-corner-br { -moz-border-radius-bottomright: 4px/*{cornerRadius}*/; -webkit-border-bottom-right-radius: 4px/*{cornerRadius}*/; -khtml-border-bottom-right-radius: 4px/*{cornerRadius}*/; border-bottom-right-radius: 4px/*{cornerRadius}*/; } + +/* Overlays */ +.ui-widget-overlay { background: #aaaaaa/*{bgColorOverlay}*/ url(images/ui-bg_flat_0_aaaaaa_40x100.png)/*{bgImgUrlOverlay}*/ 50%/*{bgOverlayXPos}*/ 50%/*{bgOverlayYPos}*/ repeat-x/*{bgOverlayRepeat}*/; opacity: .3;filter:Alpha(Opacity=30)/*{opacityOverlay}*/; } +.ui-widget-shadow { margin: -8px/*{offsetTopShadow}*/ 0 0 -8px/*{offsetLeftShadow}*/; padding: 8px/*{thicknessShadow}*/; background: #aaaaaa/*{bgColorShadow}*/ url(images/ui-bg_flat_0_aaaaaa_40x100.png)/*{bgImgUrlShadow}*/ 50%/*{bgShadowXPos}*/ 50%/*{bgShadowYPos}*/ repeat-x/*{bgShadowRepeat}*/; opacity: .3;filter:Alpha(Opacity=30)/*{opacityShadow}*/; -moz-border-radius: 8px/*{cornerRadiusShadow}*/; -khtml-border-radius: 8px/*{cornerRadiusShadow}*/; -webkit-border-radius: 8px/*{cornerRadiusShadow}*/; border-radius: 8px/*{cornerRadiusShadow}*/; } \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/examples/jquery-ui/css/ui-lightness/jquery-ui.min.css b/libreplan-webapp/src/main/webapp/jqplot/examples/jquery-ui/css/ui-lightness/jquery-ui.min.css new file mode 100644 index 000000000..56a9be11a --- /dev/null +++ b/libreplan-webapp/src/main/webapp/jqplot/examples/jquery-ui/css/ui-lightness/jquery-ui.min.css @@ -0,0 +1,10 @@ +/* + * jQuery UI CSS Framework 1.9pre + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Theming/API + */ +.ui-helper-hidden{display:none;}.ui-helper-hidden-accessible{position:absolute!important;clip:rect(1px 1px 1px 1px);clip:rect(1px,1px,1px,1px);}.ui-helper-reset{margin:0;padding:0;border:0;outline:0;line-height:1.3;text-decoration:none;font-size:100%;list-style:none;}.ui-helper-clearfix:after{content:".";display:block;height:0;clear:both;visibility:hidden;}.ui-helper-clearfix{display:inline-block;}/* required comment for clearfix to work in Opera \*/ * html .ui-helper-clearfix{height:1%;}.ui-helper-clearfix{display:block;}/* end clearfix */ .ui-helper-zfix{width:100%;height:100%;top:0;left:0;position:absolute;opacity:0;filter:Alpha(Opacity=0);}.ui-state-disabled{cursor:default!important;}.ui-icon{display:block;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat;}.ui-widget-overlay{position:absolute;top:0;left:0;width:100%;height:100%;}.ui-accordion{width:100%;}.ui-accordion .ui-accordion-header{cursor:pointer;position:relative;margin-top:1px;zoom:1;}.ui-accordion .ui-accordion-header-active{border-bottom:0!important;}.ui-accordion .ui-accordion-heading{display:block;font-size:1em;padding:.5em .5em .5em .7em;}.ui-accordion-icons .ui-accordion-heading{padding-left:2.2em;}.ui-accordion .ui-accordion-header .ui-accordion-header-icon{position:absolute;left:.5em;top:50%;margin-top:-8px;}.ui-accordion .ui-accordion-content{padding:1em 2.2em;border-top:0;margin-top:-2px;position:relative;top:1px;margin-bottom:2px;overflow:auto;display:none;zoom:1;}.ui-accordion .ui-accordion-content-active{display:block;}.ui-autocomplete{position:absolute;cursor:default;}* html .ui-autocomplete{width:1px;}.ui-button{display:inline-block;position:relative;padding:0;margin-right:.1em;text-decoration:none!important;cursor:pointer;text-align:center;zoom:1;overflow:visible;}.ui-button-icon-only{width:2.2em;}button.ui-button-icon-only{width:2.4em;}.ui-button-icons-only{width:3.4em;}button.ui-button-icons-only{width:3.7em;}.ui-button .ui-button-text{display:block;line-height:1.4;}.ui-button-text-only .ui-button-text{padding:.4em 1em;}.ui-button-icon-only .ui-button-text,.ui-button-icons-only .ui-button-text{padding:.4em;text-indent:-9999999px;}.ui-button-text-icon-primary .ui-button-text,.ui-button-text-icons .ui-button-text{padding:.4em 1em .4em 2.1em;}.ui-button-text-icon-secondary .ui-button-text,.ui-button-text-icons .ui-button-text{padding:.4em 2.1em .4em 1em;}.ui-button-text-icons .ui-button-text{padding-left:2.1em;padding-right:2.1em;}input.ui-button{padding:.4em 1em;}.ui-button-icon-only .ui-icon,.ui-button-text-icon-primary .ui-icon,.ui-button-text-icon-secondary .ui-icon,.ui-button-text-icons .ui-icon,.ui-button-icons-only .ui-icon{position:absolute;top:50%;margin-top:-8px;}.ui-button-icon-only .ui-icon{left:50%;margin-left:-8px;}.ui-button-text-icon-primary .ui-button-icon-primary,.ui-button-text-icons .ui-button-icon-primary,.ui-button-icons-only .ui-button-icon-primary{left:.5em;}.ui-button-text-icon-secondary .ui-button-icon-secondary,.ui-button-text-icons .ui-button-icon-secondary,.ui-button-icons-only .ui-button-icon-secondary{right:.5em;}.ui-button-text-icons .ui-button-icon-secondary,.ui-button-icons-only .ui-button-icon-secondary{right:.5em;}.ui-buttonset{margin-right:7px;}.ui-buttonset .ui-button{margin-left:0;margin-right:-.3em;}button.ui-button::-moz-focus-inner{border:0;padding:0;}.ui-datepicker{width:17em;padding:.2em .2em 0;display:none;}.ui-datepicker .ui-datepicker-header{position:relative;padding:.2em 0;}.ui-datepicker .ui-datepicker-prev,.ui-datepicker .ui-datepicker-next{position:absolute;top:2px;width:1.8em;height:1.8em;}.ui-datepicker .ui-datepicker-prev-hover,.ui-datepicker .ui-datepicker-next-hover{top:1px;}.ui-datepicker .ui-datepicker-prev{left:2px;}.ui-datepicker .ui-datepicker-next{right:2px;}.ui-datepicker .ui-datepicker-prev-hover{left:1px;}.ui-datepicker .ui-datepicker-next-hover{right:1px;}.ui-datepicker .ui-datepicker-prev span,.ui-datepicker .ui-datepicker-next span{display:block;position:absolute;left:50%;margin-left:-8px;top:50%;margin-top:-8px;}.ui-datepicker .ui-datepicker-title{margin:0 2.3em;line-height:1.8em;text-align:center;}.ui-datepicker .ui-datepicker-title select{font-size:1em;margin:1px 0;}.ui-datepicker select.ui-datepicker-month-year{width:100%;}.ui-datepicker select.ui-datepicker-month,.ui-datepicker select.ui-datepicker-year{width:49%;}.ui-datepicker table{width:100%;font-size:.9em;border-collapse:collapse;margin:0 0 .4em;}.ui-datepicker th{padding:.7em .3em;text-align:center;font-weight:bold;border:0;}.ui-datepicker td{border:0;padding:1px;}.ui-datepicker td span,.ui-datepicker td a{display:block;padding:.2em;text-align:right;text-decoration:none;}.ui-datepicker .ui-datepicker-buttonpane{background-image:none;margin:.7em 0 0 0;padding:0 .2em;border-left:0;border-right:0;border-bottom:0;}.ui-datepicker .ui-datepicker-buttonpane button{float:right;margin:.5em .2em .4em;cursor:pointer;padding:.2em .6em .3em .6em;width:auto;overflow:visible;}.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current{float:left;}.ui-datepicker.ui-datepicker-multi{width:auto;}.ui-datepicker-multi .ui-datepicker-group{float:left;}.ui-datepicker-multi .ui-datepicker-group table{width:95%;margin:0 auto .4em;}.ui-datepicker-multi-2 .ui-datepicker-group{width:50%;}.ui-datepicker-multi-3 .ui-datepicker-group{width:33.3%;}.ui-datepicker-multi-4 .ui-datepicker-group{width:25%;}.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header{border-left-width:0;}.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header{border-left-width:0;}.ui-datepicker-multi .ui-datepicker-buttonpane{clear:left;}.ui-datepicker-row-break{clear:both;width:100%;font-size:0;}.ui-datepicker-rtl{direction:rtl;}.ui-datepicker-rtl .ui-datepicker-prev{right:2px;left:auto;}.ui-datepicker-rtl .ui-datepicker-next{left:2px;right:auto;}.ui-datepicker-rtl .ui-datepicker-prev:hover{right:1px;left:auto;}.ui-datepicker-rtl .ui-datepicker-next:hover{left:1px;right:auto;}.ui-datepicker-rtl .ui-datepicker-buttonpane{clear:right;}.ui-datepicker-rtl .ui-datepicker-buttonpane button{float:left;}.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current{float:right;}.ui-datepicker-rtl .ui-datepicker-group{float:right;}.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header{border-right-width:0;border-left-width:1px;}.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header{border-right-width:0;border-left-width:1px;}.ui-datepicker-cover{display:none;display:block;position:absolute;z-index:-1;filter:mask();top:-4px;left:-4px;width:200px;height:200px;}.ui-dialog{position:absolute;padding:.2em;width:300px;overflow:hidden;}.ui-dialog .ui-dialog-titlebar{padding:.4em 1em;position:relative;}.ui-dialog .ui-dialog-title{float:left;margin:.1em 16px .1em 0;}.ui-dialog .ui-dialog-titlebar-close{position:absolute;right:.3em;top:50%;width:19px;margin:-10px 0 0 0;padding:1px;height:18px;}.ui-dialog .ui-dialog-titlebar-close span{display:block;margin:1px;}.ui-dialog .ui-dialog-titlebar-close:hover,.ui-dialog .ui-dialog-titlebar-close:focus{padding:0;}.ui-dialog .ui-dialog-content{position:relative;border:0;padding:.5em 1em;background:none;overflow:auto;zoom:1;}.ui-dialog .ui-dialog-buttonpane{text-align:left;border-width:1px 0 0 0;background-image:none;margin:.5em 0 0 0;padding:.3em 1em .5em .4em;}.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset{float:right;}.ui-dialog .ui-dialog-buttonpane button{margin:.5em .4em .5em 0;cursor:pointer;}.ui-dialog .ui-resizable-se{width:14px;height:14px;right:3px;bottom:3px;}.ui-draggable .ui-dialog-titlebar{cursor:move;}.ui-menu{list-style:none;padding:2px;margin:0;display:block;outline:none;}.ui-menu .ui-menu{margin-top:-3px;position:absolute;}.ui-menu .ui-menu-item{margin:0;padding:0;zoom:1;width:100%;}.ui-menu .ui-menu-item a{text-decoration:none;display:block;padding:2px .4em;line-height:1.5;zoom:1;font-weight:normal;}.ui-menu .ui-menu-item a.ui-state-focus,.ui-menu .ui-menu-item a.ui-state-active{font-weight:normal;margin:-1px;}.ui-menu li.ui-state-disabled{font-weight:normal;padding:.0em .4em;margin:.4em 0 .2em;line-height:1.5;}.ui-menu-icons{position:relative;}.ui-menu-icons .ui-menu-item a{position:relative;padding-left:2em;}.ui-menu .ui-icon{position:absolute;top:.2em;left:.2em;}.ui-menu .ui-menu-icon{position:static;float:right;}.ui-menubar{list-style:none;margin:0;padding-left:0;}.ui-menubar-item{float:left;}.ui-menubar .ui-button{float:left;font-weight:normal;border-top-width:0!important;border-bottom-width:0!important;margin:0;outline:none;}.ui-menubar .ui-menubar-link{border-right:1px dashed transparent;border-left:1px dashed transparent;}.ui-menubar .ui-menu{width:200px;position:absolute;z-index:9999;}.ui-progressbar{height:2em;text-align:left;overflow:hidden;}.ui-progressbar .ui-progressbar-value{margin:-1px;height:100%;}.ui-resizable{position:relative;}.ui-resizable-handle{position:absolute;font-size:.1px;z-index:99999;display:block;}.ui-resizable-disabled .ui-resizable-handle,.ui-resizable-autohide .ui-resizable-handle{display:none;}.ui-resizable-n{cursor:n-resize;height:7px;width:100%;top:-5px;left:0;}.ui-resizable-s{cursor:s-resize;height:7px;width:100%;bottom:-5px;left:0;}.ui-resizable-e{cursor:e-resize;width:7px;right:-5px;top:0;height:100%;}.ui-resizable-w{cursor:w-resize;width:7px;left:-5px;top:0;height:100%;}.ui-resizable-se{cursor:se-resize;width:12px;height:12px;right:1px;bottom:1px;}.ui-resizable-sw{cursor:sw-resize;width:9px;height:9px;left:-5px;bottom:-5px;}.ui-resizable-nw{cursor:nw-resize;width:9px;height:9px;left:-5px;top:-5px;}.ui-resizable-ne{cursor:ne-resize;width:9px;height:9px;right:-5px;top:-5px;}.ui-selectable-helper{position:absolute;z-index:100;border:1px dotted black;}.ui-slider{position:relative;text-align:left;}.ui-slider .ui-slider-handle{position:absolute;z-index:2;width:1.2em;height:1.2em;cursor:default;}.ui-slider .ui-slider-range{position:absolute;z-index:1;font-size:.7em;display:block;border:0;background-position:0 0;}.ui-slider-horizontal{height:.8em;}.ui-slider-horizontal .ui-slider-handle{top:-.3em;margin-left:-.6em;}.ui-slider-horizontal .ui-slider-range{top:0;height:100%;}.ui-slider-horizontal .ui-slider-range-min{left:0;}.ui-slider-horizontal .ui-slider-range-max{right:0;}.ui-slider-vertical{width:.8em;height:100px;}.ui-slider-vertical .ui-slider-handle{left:-.3em;margin-left:0;margin-bottom:-.6em;}.ui-slider-vertical .ui-slider-range{left:0;width:100%;}.ui-slider-vertical .ui-slider-range-min{bottom:0;}.ui-slider-vertical .ui-slider-range-max{top:0;}.ui-spinner{position:relative;display:inline-block;overflow:hidden;padding:0;vertical-align:middle;}.ui-spinner-input{border:none;background:none;padding:0;margin:.2em 0;vertical-align:middle;margin-left:.4em;margin-right:22px;}.ui-spinner-button{width:16px;height:50%;font-size:.5em;padding:0;margin:0;z-index:100;text-align:center;vertical-align:middle;position:absolute;cursor:default;display:block;overflow:hidden;right:0;}.ui-spinner a.ui-spinner-button{border-top:none;border-bottom:none;border-right:none;}.ui-spinner .ui-icon{position:absolute;margin-top:-8px;top:50%;left:0;}.ui-spinner-up{top:0;}.ui-spinner-down{bottom:0;}span.ui-spinner{background:none;}.ui-spinner .ui-icon-triangle-1-s{background-position:-65px -16px;}.ui-tabs{position:relative;padding:.2em;zoom:1;}.ui-tabs .ui-tabs-nav{margin:0;padding:.2em .2em 0;}.ui-tabs .ui-tabs-nav li{list-style:none;float:left;position:relative;top:0;margin:1px .2em 0 0;border-bottom:0!important;padding:0;white-space:nowrap;}.ui-tabs .ui-tabs-nav li a{float:left;padding:.5em 1em;text-decoration:none;}.ui-tabs .ui-tabs-nav li.ui-tabs-active{margin-bottom:-1px;padding-bottom:1px;}.ui-tabs .ui-tabs-nav li.ui-tabs-active a,.ui-tabs .ui-tabs-nav li.ui-state-disabled a,.ui-tabs .ui-tabs-nav li.ui-tabs-loading a{cursor:text;}.ui-tabs .ui-tabs-nav li a,.ui-tabs.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active a{cursor:pointer;}.ui-tabs .ui-tabs-panel{display:block;border-width:0;padding:1em 1.4em;background:none;}.ui-tooltip{padding:8px;position:absolute;z-index:9999;-o-box-shadow:0 0 5px #aaa;-moz-box-shadow:0 0 5px #aaa;-webkit-box-shadow:0 0 5px #aaa;box-shadow:0 0 5px #aaa;}* html .ui-tooltip{background-image:none;}body .ui-tooltip{border-width:2px;}.ui-widget{font-family:Verdana,Arial,sans-serif;font-size:1.1em;}.ui-widget .ui-widget{font-size:1em;}.ui-widget input,.ui-widget select,.ui-widget textarea,.ui-widget button{font-family:Verdana,Arial,sans-serif;font-size:1em;}.ui-widget-content{border:1px solid #aaa;background:#fff url(images/ui-bg_flat_75_ffffff_40x100.png) 50% 50% repeat-x;color:#222;}.ui-widget-content a{color:#222;}.ui-widget-header{border:1px solid #aaa;background:#ccc url(images/ui-bg_highlight-soft_75_cccccc_1x100.png) 50% 50% repeat-x;color:#222;font-weight:bold;}.ui-widget-header a{color:#222;}.ui-state-default,.ui-widget-content .ui-state-default,.ui-widget-header .ui-state-default{border:1px solid #d3d3d3;background:#e6e6e6 url(images/ui-bg_glass_75_e6e6e6_1x400.png) 50% 50% repeat-x;font-weight:normal;color:#555;}.ui-state-default a,.ui-state-default a:link,.ui-state-default a:visited{color:#555;text-decoration:none;}.ui-state-hover,.ui-widget-content .ui-state-hover,.ui-widget-header .ui-state-hover,.ui-state-focus,.ui-widget-content .ui-state-focus,.ui-widget-header .ui-state-focus{border:1px solid #999;background:#dadada url(images/ui-bg_glass_75_dadada_1x400.png) 50% 50% repeat-x;font-weight:normal;color:#212121;}.ui-state-hover a,.ui-state-hover a:hover{color:#212121;text-decoration:none;}.ui-state-active,.ui-widget-content .ui-state-active,.ui-widget-header .ui-state-active{border:1px solid #aaa;background:#fff url(images/ui-bg_glass_65_ffffff_1x400.png) 50% 50% repeat-x;font-weight:normal;color:#212121;}.ui-state-active a,.ui-state-active a:link,.ui-state-active a:visited{color:#212121;text-decoration:none;}.ui-widget :active{outline:none;}.ui-state-highlight,.ui-widget-content .ui-state-highlight,.ui-widget-header .ui-state-highlight{border:1px solid #fcefa1;background:#fbf9ee url(images/ui-bg_glass_55_fbf9ee_1x400.png) 50% 50% repeat-x;color:#363636;}.ui-state-highlight a,.ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a{color:#363636;}.ui-state-error,.ui-widget-content .ui-state-error,.ui-widget-header .ui-state-error{border:1px solid #cd0a0a;background:#fef1ec url(images/ui-bg_glass_95_fef1ec_1x400.png) 50% 50% repeat-x;color:#cd0a0a;}.ui-state-error a,.ui-widget-content .ui-state-error a,.ui-widget-header .ui-state-error a{color:#cd0a0a;}.ui-state-error-text,.ui-widget-content .ui-state-error-text,.ui-widget-header .ui-state-error-text{color:#cd0a0a;}.ui-priority-primary,.ui-widget-content .ui-priority-primary,.ui-widget-header .ui-priority-primary{font-weight:bold;}.ui-priority-secondary,.ui-widget-content .ui-priority-secondary,.ui-widget-header .ui-priority-secondary{opacity:.7;filter:Alpha(Opacity=70);font-weight:normal;}.ui-state-disabled,.ui-widget-content .ui-state-disabled,.ui-widget-header .ui-state-disabled{opacity:.35;filter:Alpha(Opacity=35);background-image:none;}.ui-icon{width:16px;height:16px;background-image:url(images/ui-icons_222222_256x240.png);}.ui-widget-content .ui-icon{background-image:url(images/ui-icons_222222_256x240.png);}.ui-widget-header .ui-icon{background-image:url(images/ui-icons_222222_256x240.png);}.ui-state-default .ui-icon{background-image:url(images/ui-icons_888888_256x240.png);}.ui-state-hover .ui-icon,.ui-state-focus .ui-icon{background-image:url(images/ui-icons_454545_256x240.png);}.ui-state-active .ui-icon{background-image:url(images/ui-icons_454545_256x240.png);}.ui-state-highlight .ui-icon{background-image:url(images/ui-icons_2e83ff_256x240.png);}.ui-state-error .ui-icon,.ui-state-error-text .ui-icon{background-image:url(images/ui-icons_cd0a0a_256x240.png);}.ui-icon-carat-1-n{background-position:0 0;}.ui-icon-carat-1-ne{background-position:-16px 0;}.ui-icon-carat-1-e{background-position:-32px 0;}.ui-icon-carat-1-se{background-position:-48px 0;}.ui-icon-carat-1-s{background-position:-64px 0;}.ui-icon-carat-1-sw{background-position:-80px 0;}.ui-icon-carat-1-w{background-position:-96px 0;}.ui-icon-carat-1-nw{background-position:-112px 0;}.ui-icon-carat-2-n-s{background-position:-128px 0;}.ui-icon-carat-2-e-w{background-position:-144px 0;}.ui-icon-triangle-1-n{background-position:0 -16px;}.ui-icon-triangle-1-ne{background-position:-16px -16px;}.ui-icon-triangle-1-e{background-position:-32px -16px;}.ui-icon-triangle-1-se{background-position:-48px -16px;}.ui-icon-triangle-1-s{background-position:-64px -16px;}.ui-icon-triangle-1-sw{background-position:-80px -16px;}.ui-icon-triangle-1-w{background-position:-96px -16px;}.ui-icon-triangle-1-nw{background-position:-112px -16px;}.ui-icon-triangle-2-n-s{background-position:-128px -16px;}.ui-icon-triangle-2-e-w{background-position:-144px -16px;}.ui-icon-arrow-1-n{background-position:0 -32px;}.ui-icon-arrow-1-ne{background-position:-16px -32px;}.ui-icon-arrow-1-e{background-position:-32px -32px;}.ui-icon-arrow-1-se{background-position:-48px -32px;}.ui-icon-arrow-1-s{background-position:-64px -32px;}.ui-icon-arrow-1-sw{background-position:-80px -32px;}.ui-icon-arrow-1-w{background-position:-96px -32px;}.ui-icon-arrow-1-nw{background-position:-112px -32px;}.ui-icon-arrow-2-n-s{background-position:-128px -32px;}.ui-icon-arrow-2-ne-sw{background-position:-144px -32px;}.ui-icon-arrow-2-e-w{background-position:-160px -32px;}.ui-icon-arrow-2-se-nw{background-position:-176px -32px;}.ui-icon-arrowstop-1-n{background-position:-192px -32px;}.ui-icon-arrowstop-1-e{background-position:-208px -32px;}.ui-icon-arrowstop-1-s{background-position:-224px -32px;}.ui-icon-arrowstop-1-w{background-position:-240px -32px;}.ui-icon-arrowthick-1-n{background-position:0 -48px;}.ui-icon-arrowthick-1-ne{background-position:-16px -48px;}.ui-icon-arrowthick-1-e{background-position:-32px -48px;}.ui-icon-arrowthick-1-se{background-position:-48px -48px;}.ui-icon-arrowthick-1-s{background-position:-64px -48px;}.ui-icon-arrowthick-1-sw{background-position:-80px -48px;}.ui-icon-arrowthick-1-w{background-position:-96px -48px;}.ui-icon-arrowthick-1-nw{background-position:-112px -48px;}.ui-icon-arrowthick-2-n-s{background-position:-128px -48px;}.ui-icon-arrowthick-2-ne-sw{background-position:-144px -48px;}.ui-icon-arrowthick-2-e-w{background-position:-160px -48px;}.ui-icon-arrowthick-2-se-nw{background-position:-176px -48px;}.ui-icon-arrowthickstop-1-n{background-position:-192px -48px;}.ui-icon-arrowthickstop-1-e{background-position:-208px -48px;}.ui-icon-arrowthickstop-1-s{background-position:-224px -48px;}.ui-icon-arrowthickstop-1-w{background-position:-240px -48px;}.ui-icon-arrowreturnthick-1-w{background-position:0 -64px;}.ui-icon-arrowreturnthick-1-n{background-position:-16px -64px;}.ui-icon-arrowreturnthick-1-e{background-position:-32px -64px;}.ui-icon-arrowreturnthick-1-s{background-position:-48px -64px;}.ui-icon-arrowreturn-1-w{background-position:-64px -64px;}.ui-icon-arrowreturn-1-n{background-position:-80px -64px;}.ui-icon-arrowreturn-1-e{background-position:-96px -64px;}.ui-icon-arrowreturn-1-s{background-position:-112px -64px;}.ui-icon-arrowrefresh-1-w{background-position:-128px -64px;}.ui-icon-arrowrefresh-1-n{background-position:-144px -64px;}.ui-icon-arrowrefresh-1-e{background-position:-160px -64px;}.ui-icon-arrowrefresh-1-s{background-position:-176px -64px;}.ui-icon-arrow-4{background-position:0 -80px;}.ui-icon-arrow-4-diag{background-position:-16px -80px;}.ui-icon-extlink{background-position:-32px -80px;}.ui-icon-newwin{background-position:-48px -80px;}.ui-icon-refresh{background-position:-64px -80px;}.ui-icon-shuffle{background-position:-80px -80px;}.ui-icon-transfer-e-w{background-position:-96px -80px;}.ui-icon-transferthick-e-w{background-position:-112px -80px;}.ui-icon-folder-collapsed{background-position:0 -96px;}.ui-icon-folder-open{background-position:-16px -96px;}.ui-icon-document{background-position:-32px -96px;}.ui-icon-document-b{background-position:-48px -96px;}.ui-icon-note{background-position:-64px -96px;}.ui-icon-mail-closed{background-position:-80px -96px;}.ui-icon-mail-open{background-position:-96px -96px;}.ui-icon-suitcase{background-position:-112px -96px;}.ui-icon-comment{background-position:-128px -96px;}.ui-icon-person{background-position:-144px -96px;}.ui-icon-print{background-position:-160px -96px;}.ui-icon-trash{background-position:-176px -96px;}.ui-icon-locked{background-position:-192px -96px;}.ui-icon-unlocked{background-position:-208px -96px;}.ui-icon-bookmark{background-position:-224px -96px;}.ui-icon-tag{background-position:-240px -96px;}.ui-icon-home{background-position:0 -112px;}.ui-icon-flag{background-position:-16px -112px;}.ui-icon-calendar{background-position:-32px -112px;}.ui-icon-cart{background-position:-48px -112px;}.ui-icon-pencil{background-position:-64px -112px;}.ui-icon-clock{background-position:-80px -112px;}.ui-icon-disk{background-position:-96px -112px;}.ui-icon-calculator{background-position:-112px -112px;}.ui-icon-zoomin{background-position:-128px -112px;}.ui-icon-zoomout{background-position:-144px -112px;}.ui-icon-search{background-position:-160px -112px;}.ui-icon-wrench{background-position:-176px -112px;}.ui-icon-gear{background-position:-192px -112px;}.ui-icon-heart{background-position:-208px -112px;}.ui-icon-star{background-position:-224px -112px;}.ui-icon-link{background-position:-240px -112px;}.ui-icon-cancel{background-position:0 -128px;}.ui-icon-plus{background-position:-16px -128px;}.ui-icon-plusthick{background-position:-32px -128px;}.ui-icon-minus{background-position:-48px -128px;}.ui-icon-minusthick{background-position:-64px -128px;}.ui-icon-close{background-position:-80px -128px;}.ui-icon-closethick{background-position:-96px -128px;}.ui-icon-key{background-position:-112px -128px;}.ui-icon-lightbulb{background-position:-128px -128px;}.ui-icon-scissors{background-position:-144px -128px;}.ui-icon-clipboard{background-position:-160px -128px;}.ui-icon-copy{background-position:-176px -128px;}.ui-icon-contact{background-position:-192px -128px;}.ui-icon-image{background-position:-208px -128px;}.ui-icon-video{background-position:-224px -128px;}.ui-icon-script{background-position:-240px -128px;}.ui-icon-alert{background-position:0 -144px;}.ui-icon-info{background-position:-16px -144px;}.ui-icon-notice{background-position:-32px -144px;}.ui-icon-help{background-position:-48px -144px;}.ui-icon-check{background-position:-64px -144px;}.ui-icon-bullet{background-position:-80px -144px;}.ui-icon-radio-on{background-position:-96px -144px;}.ui-icon-radio-off{background-position:-112px -144px;}.ui-icon-pin-w{background-position:-128px -144px;}.ui-icon-pin-s{background-position:-144px -144px;}.ui-icon-play{background-position:0 -160px;}.ui-icon-pause{background-position:-16px -160px;}.ui-icon-seek-next{background-position:-32px -160px;}.ui-icon-seek-prev{background-position:-48px -160px;}.ui-icon-seek-end{background-position:-64px -160px;}.ui-icon-seek-start{background-position:-80px -160px;}.ui-icon-seek-first{background-position:-80px -160px;}.ui-icon-stop{background-position:-96px -160px;}.ui-icon-eject{background-position:-112px -160px;}.ui-icon-volume-off{background-position:-128px -160px;}.ui-icon-volume-on{background-position:-144px -160px;}.ui-icon-power{background-position:0 -176px;}.ui-icon-signal-diag{background-position:-16px -176px;}.ui-icon-signal{background-position:-32px -176px;}.ui-icon-battery-0{background-position:-48px -176px;}.ui-icon-battery-1{background-position:-64px -176px;}.ui-icon-battery-2{background-position:-80px -176px;}.ui-icon-battery-3{background-position:-96px -176px;}.ui-icon-circle-plus{background-position:0 -192px;}.ui-icon-circle-minus{background-position:-16px -192px;}.ui-icon-circle-close{background-position:-32px -192px;}.ui-icon-circle-triangle-e{background-position:-48px -192px;}.ui-icon-circle-triangle-s{background-position:-64px -192px;}.ui-icon-circle-triangle-w{background-position:-80px -192px;}.ui-icon-circle-triangle-n{background-position:-96px -192px;}.ui-icon-circle-arrow-e{background-position:-112px -192px;}.ui-icon-circle-arrow-s{background-position:-128px -192px;}.ui-icon-circle-arrow-w{background-position:-144px -192px;}.ui-icon-circle-arrow-n{background-position:-160px -192px;}.ui-icon-circle-zoomin{background-position:-176px -192px;}.ui-icon-circle-zoomout{background-position:-192px -192px;}.ui-icon-circle-check{background-position:-208px -192px;}.ui-icon-circlesmall-plus{background-position:0 -208px;}.ui-icon-circlesmall-minus{background-position:-16px -208px;}.ui-icon-circlesmall-close{background-position:-32px -208px;}.ui-icon-squaresmall-plus{background-position:-48px -208px;}.ui-icon-squaresmall-minus{background-position:-64px -208px;}.ui-icon-squaresmall-close{background-position:-80px -208px;}.ui-icon-grip-dotted-vertical{background-position:0 -224px;}.ui-icon-grip-dotted-horizontal{background-position:-16px -224px;}.ui-icon-grip-solid-vertical{background-position:-32px -224px;}.ui-icon-grip-solid-horizontal{background-position:-48px -224px;}.ui-icon-gripsmall-diagonal-se{background-position:-64px -224px;}.ui-icon-grip-diagonal-se{background-position:-80px -224px;}.ui-corner-all,.ui-corner-top,.ui-corner-left,.ui-corner-tl{-moz-border-radius-topleft:4px;-webkit-border-top-left-radius:4px;-khtml-border-top-left-radius:4px;border-top-left-radius:4px;}.ui-corner-all,.ui-corner-top,.ui-corner-right,.ui-corner-tr{-moz-border-radius-topright:4px;-webkit-border-top-right-radius:4px;-khtml-border-top-right-radius:4px;border-top-right-radius:4px;}.ui-corner-all,.ui-corner-bottom,.ui-corner-left,.ui-corner-bl{-moz-border-radius-bottomleft:4px;-webkit-border-bottom-left-radius:4px;-khtml-border-bottom-left-radius:4px;border-bottom-left-radius:4px;}.ui-corner-all,.ui-corner-bottom,.ui-corner-right,.ui-corner-br{-moz-border-radius-bottomright:4px;-webkit-border-bottom-right-radius:4px;-khtml-border-bottom-right-radius:4px;border-bottom-right-radius:4px;}.ui-widget-overlay{background:#aaa url(images/ui-bg_flat_0_aaaaaa_40x100.png) 50% 50% repeat-x;opacity:.3;filter:Alpha(Opacity=30);}.ui-widget-shadow{margin:-8px 0 0 -8px;padding:8px;background:#aaa url(images/ui-bg_flat_0_aaaaaa_40x100.png) 50% 50% repeat-x;opacity:.3;filter:Alpha(Opacity=30);-moz-border-radius:8px;-khtml-border-radius:8px;-webkit-border-radius:8px;border-radius:8px;} \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/examples/jquery-ui/js/jquery-ui.min.js b/libreplan-webapp/src/main/webapp/jqplot/examples/jquery-ui/js/jquery-ui.min.js new file mode 100644 index 000000000..5ca2642d2 --- /dev/null +++ b/libreplan-webapp/src/main/webapp/jqplot/examples/jquery-ui/js/jquery-ui.min.js @@ -0,0 +1,473 @@ +/*! + * jQuery UI 1.9pre + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI + */ +(function(a,g){function d(e,f){var i=e.nodeName.toLowerCase();if("area"===i){i=e.parentNode;var b=i.name;if(!e.href||!b||i.nodeName.toLowerCase()!=="map")return false;i=a("img[usemap=#"+b+"]")[0];return!!i&&c(i)}return(/input|select|textarea|button|object/.test(i)?!e.disabled:"a"==i?e.href||f:f)&&c(e)}function c(e){return!a(e).parents().andSelf().filter(function(){return a.curCSS(this,"visibility")==="hidden"||a.expr.filters.hidden(this)}).length}a.ui=a.ui||{};if(!a.ui.version){a.extend(a.ui,{version:"1.9pre", +keyCode:{ALT:18,BACKSPACE:8,CAPS_LOCK:20,COMMA:188,COMMAND:91,COMMAND_LEFT:91,COMMAND_RIGHT:93,CONTROL:17,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,INSERT:45,LEFT:37,MENU:93,NUMPAD_ADD:107,NUMPAD_DECIMAL:110,NUMPAD_DIVIDE:111,NUMPAD_ENTER:108,NUMPAD_MULTIPLY:106,NUMPAD_SUBTRACT:109,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SHIFT:16,SPACE:32,TAB:9,UP:38,WINDOWS:91}});a.fn.extend({_focus:a.fn.focus,focus:function(e,f){return typeof e==="number"?this.each(function(){var i=this;setTimeout(function(){a(i).focus(); +f&&f.call(i)},e)}):this._focus.apply(this,arguments)},scrollParent:function(){var e;e=a.browser.msie&&/(static|relative)/.test(this.css("position"))||/absolute/.test(this.css("position"))?this.parents().filter(function(){return/(relative|absolute|fixed)/.test(a.curCSS(this,"position",1))&&/(auto|scroll)/.test(a.curCSS(this,"overflow",1)+a.curCSS(this,"overflow-y",1)+a.curCSS(this,"overflow-x",1))}).eq(0):this.parents().filter(function(){return/(auto|scroll)/.test(a.curCSS(this,"overflow",1)+a.curCSS(this, +"overflow-y",1)+a.curCSS(this,"overflow-x",1))}).eq(0);return/fixed/.test(this.css("position"))||!e.length?a(document):e},zIndex:function(e){if(e!==g)return this.css("zIndex",e);if(this.length){e=a(this[0]);for(var f;e.length&&e[0]!==document;){f=e.css("position");if(f==="absolute"||f==="relative"||f==="fixed"){f=parseInt(e.css("zIndex"),10);if(!isNaN(f)&&f!==0)return f}e=e.parent()}}return 0},disableSelection:function(){return this.bind((a.support.selectstart?"selectstart":"mousedown")+".ui-disableSelection", +function(e){e.preventDefault()})},enableSelection:function(){return this.unbind(".ui-disableSelection")}});a.each(["Width","Height"],function(e,f){function i(l,j,m,n){a.each(b,function(){j-=parseFloat(a.curCSS(l,"padding"+this,true))||0;if(m)j-=parseFloat(a.curCSS(l,"border"+this+"Width",true))||0;if(n)j-=parseFloat(a.curCSS(l,"margin"+this,true))||0});return j}var b=f==="Width"?["Left","Right"]:["Top","Bottom"],h=f.toLowerCase(),k={innerWidth:a.fn.innerWidth,innerHeight:a.fn.innerHeight,outerWidth:a.fn.outerWidth, +outerHeight:a.fn.outerHeight};a.fn["inner"+f]=function(l){if(l===g)return k["inner"+f].call(this);return this.each(function(){a(this).css(h,i(this,l)+"px")})};a.fn["outer"+f]=function(l,j){if(typeof l!=="number")return k["outer"+f].call(this,l);return this.each(function(){a(this).css(h,i(this,l,true,j)+"px")})}});a.extend(a.expr[":"],{data:function(e,f,i){return!!a.data(e,i[3])},focusable:function(e){return d(e,!isNaN(a.attr(e,"tabindex")))},tabbable:function(e){var f=a.attr(e,"tabindex"),i=isNaN(f); +return(i||f>=0)&&d(e,!i)}});a(function(){var e=document.body,f=e.appendChild(f=document.createElement("div"));a.extend(f.style,{minHeight:"100px",height:"auto",padding:0,borderWidth:0});a.support.minHeight=f.offsetHeight===100;a.support.selectstart="onselectstart"in f;e.removeChild(f).style.display="none"});a.extend(a.ui,{plugin:{add:function(e,f,i){e=a.ui[e].prototype;for(var b in i){e.plugins[b]=e.plugins[b]||[];e.plugins[b].push([f,i[b]])}},call:function(e,f,i){if((f=e.plugins[f])&&e.element[0].parentNode)for(var b= +0;b0)return true;e[i]=1;b=e[i]>0;e[i]=0;return b},isOverAxis:function(e,f,i){return e>f&&e", +options:{disabled:false,create:null},_createWidget:function(e,f){f=a(f||this.defaultElement||this)[0];this.element=a(f);this.options=a.widget.extend({},this.options,this._getCreateOptions(),e);this.bindings=a();this.hoverable=a();this.focusable=a();if(f!==this){a.data(f,this.widgetName,this);this._bind({remove:"destroy"})}this._create();this._trigger("create");this._init()},_getCreateOptions:a.noop,_create:a.noop,_init:a.noop,destroy:function(){this._destroy();this.element.unbind("."+this.widgetName).removeData(this.widgetName); +this.widget().unbind("."+this.widgetName).removeAttr("aria-disabled").removeClass(this.widgetBaseClass+"-disabled ui-state-disabled");this.bindings.unbind("."+this.widgetName);this.hoverable.removeClass("ui-state-hover");this.focusable.removeClass("ui-state-focus")},_destroy:a.noop,widget:function(){return this.element},option:function(e,f){var i=e,b,h,k;if(arguments.length===0)return a.widget.extend({},this.options);if(typeof e==="string"){i={};b=e.split(".");e=b.shift();if(b.length){h=i[e]=a.widget.extend({}, +this.options[e]);for(k=0;k=9)&&!d.button)return this._mouseUp(d);if(this._mouseStarted){this._mouseDrag(d);return d.preventDefault()}if(this._mouseDistanceMet(d)&&this._mouseDelayMet(d))(this._mouseStarted=this._mouseStart(this._mouseDownEvent,d)!==false)?this._mouseDrag(d):this._mouseUp(d);return!this._mouseStarted},_mouseUp:function(d){a(document).unbind("mousemove."+this.widgetName,this._mouseMoveDelegate).unbind("mouseup."+this.widgetName, +this._mouseUpDelegate);if(this._mouseStarted){this._mouseStarted=false;d.target==this._mouseDownEvent.target&&a.data(d.target,this.widgetName+".preventClickEvent",true);this._mouseStop(d)}return false},_mouseDistanceMet:function(d){return Math.max(Math.abs(this._mouseDownEvent.pageX-d.pageX),Math.abs(this._mouseDownEvent.pageY-d.pageY))>=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return true}})})(jQuery); +(function(a){a.widget("ui.draggable",a.ui.mouse,{version:"1.9pre",widgetEventPrefix:"drag",options:{addClasses:true,appendTo:"parent",axis:false,connectToSortable:false,containment:false,cursor:"auto",cursorAt:false,grid:false,handle:false,helper:"original",iframeFix:false,opacity:false,refreshPositions:false,revert:false,revertDuration:500,scope:"default",scroll:true,scrollSensitivity:20,scrollSpeed:20,snap:false,snapMode:"both",snapTolerance:20,stack:false,zIndex:false},_create:function(){if(this.options.helper== +"original"&&!/^(?:r|a|f)/.test(this.element.css("position")))this.element[0].style.position="relative";this.options.addClasses&&this.element.addClass("ui-draggable");this.options.disabled&&this.element.addClass("ui-draggable-disabled");this._mouseInit()},destroy:function(){if(this.element.data("draggable")){this.element.removeData("draggable").unbind(".draggable").removeClass("ui-draggable ui-draggable-dragging ui-draggable-disabled");this._mouseDestroy();return this}},_mouseCapture:function(g){var d= +this.options;if(this.helper||d.disabled||a(g.target).is(".ui-resizable-handle"))return false;this.handle=this._getHandle(g);if(!this.handle)return false;a(d.iframeFix===true?"iframe":d.iframeFix).each(function(){a('
').css({width:this.offsetWidth+"px",height:this.offsetHeight+"px",position:"absolute",opacity:"0.001",zIndex:1E3}).css(a(this).offset()).appendTo("body")});return true},_mouseStart:function(g){var d=this.options;this.helper= +this._createHelper(g);this._cacheHelperProportions();if(a.ui.ddmanager)a.ui.ddmanager.current=this;this._cacheMargins();this.cssPosition=this.helper.css("position");this.scrollParent=this.helper.scrollParent();this.offset=this.positionAbs=this.element.offset();this.offset={top:this.offset.top-this.margins.top,left:this.offset.left-this.margins.left};a.extend(this.offset,{click:{left:g.pageX-this.offset.left,top:g.pageY-this.offset.top},parent:this._getParentOffset(),relative:this._getRelativeOffset()}); +this.originalPosition=this.position=this._generatePosition(g);this.originalPageX=g.pageX;this.originalPageY=g.pageY;d.cursorAt&&this._adjustOffsetFromHelper(d.cursorAt);d.containment&&this._setContainment();if(this._trigger("start",g)===false){this._clear();return false}this._cacheHelperProportions();a.ui.ddmanager&&!d.dropBehaviour&&a.ui.ddmanager.prepareOffsets(this,g);this.helper.addClass("ui-draggable-dragging");this._mouseDrag(g,true);a.ui.ddmanager&&a.ui.ddmanager.dragStart(this,g);return true}, +_mouseDrag:function(g,d){this.position=this._generatePosition(g);this.positionAbs=this._convertPositionTo("absolute");if(!d){var c=this._uiHash();if(this._trigger("drag",g,c)===false){this._mouseUp({});return false}this.position=c.position}if(!this.options.axis||this.options.axis!="y")this.helper[0].style.left=this.position.left+"px";if(!this.options.axis||this.options.axis!="x")this.helper[0].style.top=this.position.top+"px";a.ui.ddmanager&&a.ui.ddmanager.drag(this,g);return false},_mouseStop:function(g){var d= +false;if(a.ui.ddmanager&&!this.options.dropBehaviour)d=a.ui.ddmanager.drop(this,g);if(this.dropped){d=this.dropped;this.dropped=false}if(!this.element[0]||!this.element[0].parentNode)return false;if(this.options.revert=="invalid"&&!d||this.options.revert=="valid"&&d||this.options.revert===true||a.isFunction(this.options.revert)&&this.options.revert.call(this.element,d)){var c=this;a(this.helper).animate(this.originalPosition,parseInt(this.options.revertDuration,10),function(){c._trigger("stop",g)!== +false&&c._clear()})}else this._trigger("stop",g)!==false&&this._clear();return false},_mouseUp:function(g){this.options.iframeFix===true&&a("div.ui-draggable-iframeFix").each(function(){this.parentNode.removeChild(this)});a.ui.ddmanager&&a.ui.ddmanager.dragStop(this,g);return a.ui.mouse.prototype._mouseUp.call(this,g)},cancel:function(){this.helper.is(".ui-draggable-dragging")?this._mouseUp({}):this._clear();return this},_getHandle:function(g){var d=!this.options.handle||!a(this.options.handle,this.element).length? +true:false;a(this.options.handle,this.element).find("*").andSelf().each(function(){if(this==g.target)d=true});return d},_createHelper:function(g){var d=this.options;g=a.isFunction(d.helper)?a(d.helper.apply(this.element[0],[g])):d.helper=="clone"?this.element.clone().removeAttr("id"):this.element;g.parents("body").length||g.appendTo(d.appendTo=="parent"?this.element[0].parentNode:d.appendTo);g[0]!=this.element[0]&&!/(fixed|absolute)/.test(g.css("position"))&&g.css("position","absolute");return g}, +_adjustOffsetFromHelper:function(g){if(typeof g=="string")g=g.split(" ");if(a.isArray(g))g={left:+g[0],top:+g[1]||0};if("left"in g)this.offset.click.left=g.left+this.margins.left;if("right"in g)this.offset.click.left=this.helperProportions.width-g.right+this.margins.left;if("top"in g)this.offset.click.top=g.top+this.margins.top;if("bottom"in g)this.offset.click.top=this.helperProportions.height-g.bottom+this.margins.top},_getParentOffset:function(){this.offsetParent=this.helper.offsetParent();var g= +this.offsetParent.offset();if(this.cssPosition=="absolute"&&this.scrollParent[0]!=document&&a.contains(this.scrollParent[0],this.offsetParent[0])){g.left+=this.scrollParent.scrollLeft();g.top+=this.scrollParent.scrollTop()}if(this.offsetParent[0]==document.body||this.offsetParent[0].tagName&&this.offsetParent[0].tagName.toLowerCase()=="html"&&a.browser.msie)g={top:0,left:0};return{top:g.top+(parseInt(this.offsetParent.css("borderTopWidth"),10)||0),left:g.left+(parseInt(this.offsetParent.css("borderLeftWidth"), +10)||0)}},_getRelativeOffset:function(){if(this.cssPosition=="relative"){var g=this.element.position();return{top:g.top-(parseInt(this.helper.css("top"),10)||0)+this.scrollParent.scrollTop(),left:g.left-(parseInt(this.helper.css("left"),10)||0)+this.scrollParent.scrollLeft()}}else return{top:0,left:0}},_cacheMargins:function(){this.margins={left:parseInt(this.element.css("marginLeft"),10)||0,top:parseInt(this.element.css("marginTop"),10)||0,right:parseInt(this.element.css("marginRight"),10)||0,bottom:parseInt(this.element.css("marginBottom"), +10)||0}},_cacheHelperProportions:function(){this.helperProportions={width:this.helper.outerWidth(),height:this.helper.outerHeight()}},_setContainment:function(){var g=this.options;if(g.containment=="parent")g.containment=this.helper[0].parentNode;if(g.containment=="document"||g.containment=="window")this.containment=[g.containment=="document"?0:a(window).scrollLeft()-this.offset.relative.left-this.offset.parent.left,g.containment=="document"?0:a(window).scrollTop()-this.offset.relative.top-this.offset.parent.top, +(g.containment=="document"?0:a(window).scrollLeft())+a(g.containment=="document"?document:window).width()-this.helperProportions.width-this.margins.left,(g.containment=="document"?0:a(window).scrollTop())+(a(g.containment=="document"?document:window).height()||document.body.parentNode.scrollHeight)-this.helperProportions.height-this.margins.top];if(!/^(document|window|parent)$/.test(g.containment)&&g.containment.constructor!=Array){g=a(g.containment);var d=g[0];if(d){g.offset();var c=a(d).css("overflow")!= +"hidden";this.containment=[(parseInt(a(d).css("borderLeftWidth"),10)||0)+(parseInt(a(d).css("paddingLeft"),10)||0),(parseInt(a(d).css("borderTopWidth"),10)||0)+(parseInt(a(d).css("paddingTop"),10)||0),(c?Math.max(d.scrollWidth,d.offsetWidth):d.offsetWidth)-(parseInt(a(d).css("borderLeftWidth"),10)||0)-(parseInt(a(d).css("paddingRight"),10)||0)-this.helperProportions.width-this.margins.left-this.margins.right,(c?Math.max(d.scrollHeight,d.offsetHeight):d.offsetHeight)-(parseInt(a(d).css("borderTopWidth"), +10)||0)-(parseInt(a(d).css("paddingBottom"),10)||0)-this.helperProportions.height-this.margins.top-this.margins.bottom];this.relative_container=g}}else if(g.containment.constructor==Array)this.containment=g.containment},_convertPositionTo:function(g,d){if(!d)d=this.position;var c=g=="absolute"?1:-1,e=this.cssPosition=="absolute"&&!(this.scrollParent[0]!=document&&a.contains(this.scrollParent[0],this.offsetParent[0]))?this.offsetParent:this.scrollParent,f=/(html|body)/i.test(e[0].tagName);return{top:d.top+ +this.offset.relative.top*c+this.offset.parent.top*c-(a.browser.safari&&a.browser.version<526&&this.cssPosition=="fixed"?0:(this.cssPosition=="fixed"?-this.scrollParent.scrollTop():f?0:e.scrollTop())*c),left:d.left+this.offset.relative.left*c+this.offset.parent.left*c-(a.browser.safari&&a.browser.version<526&&this.cssPosition=="fixed"?0:(this.cssPosition=="fixed"?-this.scrollParent.scrollLeft():f?0:e.scrollLeft())*c)}},_generatePosition:function(g){var d=this.options,c=this.cssPosition=="absolute"&& +!(this.scrollParent[0]!=document&&a.contains(this.scrollParent[0],this.offsetParent[0]))?this.offsetParent:this.scrollParent,e=/(html|body)/i.test(c[0].tagName),f=g.pageX,i=g.pageY;if(this.originalPosition){var b;if(this.containment){if(this.relative_container){b=this.relative_container.offset();b=[this.containment[0]+b.left,this.containment[1]+b.top,this.containment[2]+b.left,this.containment[3]+b.top]}else b=this.containment;if(g.pageX-this.offset.click.leftb[2])f=b[2]+this.offset.click.left;if(g.pageY-this.offset.click.top>b[3])i=b[3]+this.offset.click.top}if(d.grid){i=d.grid[1]?this.originalPageY+Math.round((i-this.originalPageY)/d.grid[1])*d.grid[1]:this.originalPageY;i=b?!(i-this.offset.click.topb[3])?i:!(i-this.offset.click.topb[2])?f:!(f-this.offset.click.left=0;l--){var j=c.snapElements[l].left,m=j+c.snapElements[l].width,n=c.snapElements[l].top,o=n+c.snapElements[l].height;if(j-f=l&&i<=j||b>=l&&b<=j||ij)&&(e>=h&&e<=k||f>=h&&f<=k||ek);default:return false}}; +a.ui.ddmanager={current:null,droppables:{"default":[]},prepareOffsets:function(g,d){var c=a.ui.ddmanager.droppables[g.options.scope]||[],e=d?d.type:null,f=(g.currentItem||g.element).find(":data(droppable)").andSelf(),i=0;a:for(;i').css({position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(), +top:this.element.css("top"),left:this.element.css("left")}));this.element=this.element.parent().data("resizable",this.element.data("resizable"));this.elementIsWrapper=true;this.element.css({marginLeft:this.originalElement.css("marginLeft"),marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom")});this.originalElement.css({marginLeft:0,marginTop:0,marginRight:0,marginBottom:0});this.originalResizeStyle= +this.originalElement.css("resize");this.originalElement.css("resize","none");this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"}));this.originalElement.css({margin:this.originalElement.css("margin")});this._proportionallyResize()}this.handles=e.handles||(!a(".ui-resizable-handle",this.element).length?"e,s,se":{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne", +nw:".ui-resizable-nw"});if(this.handles.constructor==String){if(this.handles=="all")this.handles="n,e,s,w,se,sw,ne,nw";var f=this.handles.split(",");this.handles={};for(var i=0;i');/sw|se|ne|nw/.test(b)&&h.css({zIndex:++e.zIndex});"se"==b&&h.addClass("ui-icon ui-icon-gripsmall-diagonal-se");this.handles[b]=".ui-resizable-"+b;this.element.append(h)}}this._renderAxis=function(k){k=k||this.element;for(var l in this.handles){if(this.handles[l].constructor== +String)this.handles[l]=a(this.handles[l],this.element).show();if(this.elementIsWrapper&&this.originalElement[0].nodeName.match(/textarea|input|select|button/i)){var j=a(this.handles[l],this.element),m=0;m=/sw|ne|nw|se|n|s/.test(l)?j.outerHeight():j.outerWidth();j=["padding",/ne|nw|n/.test(l)?"Top":/se|sw|s/.test(l)?"Bottom":/^e$/.test(l)?"Right":"Left"].join("");k.css(j,m);this._proportionallyResize()}a(this.handles[l])}};this._renderAxis(this.element);this._handles=a(".ui-resizable-handle",this.element).disableSelection(); +this._handles.mouseover(function(){if(!c.resizing){if(this.className)var k=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i);c.axis=k&&k[1]?k[1]:"se"}});if(e.autoHide){this._handles.hide();a(this.element).addClass("ui-resizable-autohide").hover(function(){if(!e.disabled){a(this).removeClass("ui-resizable-autohide");c._handles.show()}},function(){if(!e.disabled)if(!c.resizing){a(this).addClass("ui-resizable-autohide");c._handles.hide()}})}this._mouseInit()},destroy:function(){this._mouseDestroy(); +var c=function(f){a(f).removeClass("ui-resizable ui-resizable-disabled ui-resizable-resizing").removeData("resizable").unbind(".resizable").find(".ui-resizable-handle").remove()};if(this.elementIsWrapper){c(this.element);var e=this.element;e.after(this.originalElement.css({position:e.css("position"),width:e.outerWidth(),height:e.outerHeight(),top:e.css("top"),left:e.css("left")})).remove()}this.originalElement.css("resize",this.originalResizeStyle);c(this.originalElement);return this},_mouseCapture:function(c){var e= +false,f;for(f in this.handles)if(a(this.handles[f])[0]==c.target)e=true;return!this.options.disabled&&e},_mouseStart:function(c){var e=this.options,f=this.element.position(),i=this.element;this.resizing=true;this.documentScroll={top:a(document).scrollTop(),left:a(document).scrollLeft()};if(i.is(".ui-draggable")||/absolute/.test(i.css("position")))i.css({position:"absolute",top:f.top,left:f.left});a.browser.opera&&/relative/.test(i.css("position"))&&i.css({position:"relative",top:"auto",left:"auto"}); +this._renderProxy();f=g(this.helper.css("left"));var b=g(this.helper.css("top"));if(e.containment){f+=a(e.containment).scrollLeft()||0;b+=a(e.containment).scrollTop()||0}this.offset=this.helper.offset();this.position={left:f,top:b};this.size=this._helper?{width:i.outerWidth(),height:i.outerHeight()}:{width:i.width(),height:i.height()};this.originalSize=this._helper?{width:i.outerWidth(),height:i.outerHeight()}:{width:i.width(),height:i.height()};this.originalPosition={left:f,top:b};this.sizeDiff= +{width:i.outerWidth()-i.width(),height:i.outerHeight()-i.height()};this.originalMousePosition={left:c.pageX,top:c.pageY};this.aspectRatio=typeof e.aspectRatio=="number"?e.aspectRatio:this.originalSize.width/this.originalSize.height||1;e=a(".ui-resizable-"+this.axis).css("cursor");a("body").css("cursor",e=="auto"?this.axis+"-resize":e);i.addClass("ui-resizable-resizing");this._propagate("start",c);return true},_mouseDrag:function(c){var e=this.helper,f=this.originalMousePosition,i=this._change[this.axis]; +if(!i)return false;f=i.apply(this,[c,c.pageX-f.left||0,c.pageY-f.top||0]);this._updateVirtualBoundaries(c.shiftKey);if(this._aspectRatio||c.shiftKey)f=this._updateRatio(f,c);f=this._respectSize(f,c);this._propagate("resize",c);e.css({top:this.position.top+"px",left:this.position.left+"px",width:this.size.width+"px",height:this.size.height+"px"});!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize();this._updateCache(f);this._trigger("resize",c,this.ui());return false}, +_mouseStop:function(c){this.resizing=false;var e=this.options;if(this._helper){var f=this._proportionallyResizeElements,i=f.length&&/textarea/i.test(f[0].nodeName);f=i&&a.ui.hasScroll(f[0],"left")?0:this.sizeDiff.height;i=i?0:this.sizeDiff.width;i={width:this.helper.width()-i,height:this.helper.height()-f};f=parseInt(this.element.css("left"),10)+(this.position.left-this.originalPosition.left)||null;var b=parseInt(this.element.css("top"),10)+(this.position.top-this.originalPosition.top)||null;e.animate|| +this.element.css(a.extend(i,{top:b,left:f}));this.helper.height(this.size.height);this.helper.width(this.size.width);this._helper&&!e.animate&&this._proportionallyResize()}a("body").css("cursor","auto");this.element.removeClass("ui-resizable-resizing");this._propagate("stop",c);this._helper&&this.helper.remove();return false},_updateVirtualBoundaries:function(c){var e=this.options,f,i,b;e={minWidth:d(e.minWidth)?e.minWidth:0,maxWidth:d(e.maxWidth)?e.maxWidth:Infinity,minHeight:d(e.minHeight)?e.minHeight: +0,maxHeight:d(e.maxHeight)?e.maxHeight:Infinity};if(this._aspectRatio||c){c=e.minHeight*this.aspectRatio;i=e.minWidth/this.aspectRatio;f=e.maxHeight*this.aspectRatio;b=e.maxWidth/this.aspectRatio;if(c>e.minWidth)e.minWidth=c;if(i>e.minHeight)e.minHeight=i;if(fc.width,k=d(c.height)&&e.minHeight&&e.minHeight>c.height;if(h)c.width=e.minWidth;if(k)c.height=e.minHeight;if(i)c.width=e.maxWidth;if(b)c.height=e.maxHeight;var l=this.originalPosition.left+this.originalSize.width,j=this.position.top+this.size.height,m=/sw|nw|w/.test(f);f=/nw|ne|n/.test(f);if(h&&m)c.left=l-e.minWidth;if(i&&m)c.left=l-e.maxWidth;if(k&&f)c.top=j-e.minHeight;if(b&&f)c.top=j-e.maxHeight;if((e=!c.width&&!c.height)&&!c.left&&c.top)c.top=null; +else if(e&&!c.top&&c.left)c.left=null;return c},_proportionallyResize:function(){if(this._proportionallyResizeElements.length)for(var c=this.helper||this.element,e=0;e');var e=a.browser.msie&&a.browser.version<7,f=e?1:0;e=e?2:-1;this.helper.addClass(this._helper).css({width:this.element.outerWidth()+ +e,height:this.element.outerHeight()+e,position:"absolute",left:this.elementOffset.left-f+"px",top:this.elementOffset.top-f+"px",zIndex:++c.zIndex});this.helper.appendTo("body").disableSelection()}else this.helper=this.element},_change:{e:function(c,e){return{width:this.originalSize.width+e}},w:function(c,e){return{left:this.originalPosition.left+e,width:this.originalSize.width-e}},n:function(c,e,f){return{top:this.originalPosition.top+f,height:this.originalSize.height-f}},s:function(c,e,f){return{height:this.originalSize.height+ +f}},se:function(c,e,f){return a.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[c,e,f]))},sw:function(c,e,f){return a.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[c,e,f]))},ne:function(c,e,f){return a.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[c,e,f]))},nw:function(c,e,f){return a.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[c,e,f]))}},_propagate:function(c,e){a.ui.plugin.call(this,c,[e,this.ui()]); +c!="resize"&&this._trigger(c,e,this.ui())},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}});a.ui.plugin.add("resizable","alsoResize",{start:function(){var c=a(this).data("resizable").options,e=function(f){a(f).each(function(){var i=a(this);i.data("resizable-alsoresize",{width:parseInt(i.width(),10),height:parseInt(i.height(),10), +left:parseInt(i.css("left"),10),top:parseInt(i.css("top"),10),position:i.css("position")})})};if(typeof c.alsoResize=="object"&&!c.alsoResize.parentNode)if(c.alsoResize.length){c.alsoResize=c.alsoResize[0];e(c.alsoResize)}else a.each(c.alsoResize,function(f){e(f)});else e(c.alsoResize)},resize:function(c,e){var f=a(this).data("resizable"),i=f.options,b=f.originalSize,h=f.originalPosition,k={height:f.size.height-b.height||0,width:f.size.width-b.width||0,top:f.position.top-h.top||0,left:f.position.left- +h.left||0},l=function(j,m){a(j).each(function(){var n=a(this),o=a(this).data("resizable-alsoresize"),p={},q=m&&m.length?m:n.parents(e.originalElement[0]).length?["width","height"]:["width","height","top","left"];a.each(q,function(u,s){var r=(o[s]||0)+(k[s]||0);if(r&&r>=0)p[s]=r||null});if(a.browser.opera&&/relative/.test(n.css("position"))){f._revertToRelativePosition=true;n.css({position:"absolute",top:"auto",left:"auto"})}n.css(p)})};typeof i.alsoResize=="object"&&!i.alsoResize.nodeType?a.each(i.alsoResize, +function(j,m){l(j,m)}):l(i.alsoResize)},stop:function(){var c=a(this).data("resizable"),e=c.options,f=function(i){a(i).each(function(){var b=a(this);b.css({position:b.data("resizable-alsoresize").position})})};if(c._revertToRelativePosition){c._revertToRelativePosition=false;typeof e.alsoResize=="object"&&!e.alsoResize.nodeType?a.each(e.alsoResize,function(i){f(i)}):f(e.alsoResize)}a(this).removeData("resizable-alsoresize")}});a.ui.plugin.add("resizable","animate",{stop:function(c){var e=a(this).data("resizable"), +f=e.options,i=e._proportionallyResizeElements,b=i.length&&/textarea/i.test(i[0].nodeName),h=b&&a.ui.hasScroll(i[0],"left")?0:e.sizeDiff.height;b={width:e.size.width-(b?0:e.sizeDiff.width),height:e.size.height-h};h=parseInt(e.element.css("left"),10)+(e.position.left-e.originalPosition.left)||null;var k=parseInt(e.element.css("top"),10)+(e.position.top-e.originalPosition.top)||null;e.element.animate(a.extend(b,k&&h?{top:k,left:h}:{}),{duration:f.animateDuration,easing:f.animateEasing,step:function(){var l= +{width:parseInt(e.element.css("width"),10),height:parseInt(e.element.css("height"),10),top:parseInt(e.element.css("top"),10),left:parseInt(e.element.css("left"),10)};i&&i.length&&a(i[0]).css({width:l.width,height:l.height});e._updateCache(l);e._propagate("resize",c)}})}});a.ui.plugin.add("resizable","containment",{start:function(){var c=a(this).data("resizable"),e=c.element,f=c.options.containment;if(e=f instanceof a?f.get(0):/parent/.test(f)?e.parent().get(0):f){c.containerElement=a(e);if(/document/.test(f)|| +f==document){c.containerOffset={left:0,top:0};c.containerPosition={left:0,top:0};c.parentData={element:a(document),left:0,top:0,width:a(document).width(),height:a(document).height()||document.body.parentNode.scrollHeight}}else{var i=a(e),b=[];a(["Top","Right","Left","Bottom"]).each(function(l,j){b[l]=g(i.css("padding"+j))});c.containerOffset=i.offset();c.containerPosition=i.position();c.containerSize={height:i.innerHeight()-b[3],width:i.innerWidth()-b[1]};f=c.containerOffset;var h=c.containerSize.height, +k=c.containerSize.width;k=a.ui.hasScroll(e,"left")?e.scrollWidth:k;h=a.ui.hasScroll(e)?e.scrollHeight:h;c.parentData={element:e,left:f.left,top:f.top,width:k,height:h}}}},resize:function(c){var e=a(this).data("resizable"),f=e.options,i=e.containerOffset,b=e.position;c=e._aspectRatio||c.shiftKey;var h={top:0,left:0},k=e.containerElement;if(k[0]!=document&&/static/.test(k.css("position")))h=i;if(b.left<(e._helper?i.left:0)){e.size.width+=e._helper?e.position.left-i.left:e.position.left-h.left;if(c)e.size.height= +e.size.width/f.aspectRatio;e.position.left=f.helper?i.left:0}if(b.top<(e._helper?i.top:0)){e.size.height+=e._helper?e.position.top-i.top:e.position.top;if(c)e.size.width=e.size.height*f.aspectRatio;e.position.top=e._helper?i.top:0}e.offset.left=e.parentData.left+e.position.left;e.offset.top=e.parentData.top+e.position.top;f=Math.abs((e._helper?e.offset.left-h.left:e.offset.left-h.left)+e.sizeDiff.width);i=Math.abs((e._helper?e.offset.top-h.top:e.offset.top-i.top)+e.sizeDiff.height);b=e.containerElement.get(0)== +e.element.parent().get(0);h=/relative|absolute/.test(e.containerElement.css("position"));if(b&&h)f-=e.parentData.left;if(f+e.size.width>=e.parentData.width){e.size.width=e.parentData.width-f;if(c)e.size.height=e.size.width/e.aspectRatio}if(i+e.size.height>=e.parentData.height){e.size.height=e.parentData.height-i;if(c)e.size.width=e.size.height*e.aspectRatio}},stop:function(){var c=a(this).data("resizable"),e=c.options,f=c.containerOffset,i=c.containerPosition,b=c.containerElement,h=a(c.helper),k= +h.offset(),l=h.outerWidth()-c.sizeDiff.width;h=h.outerHeight()-c.sizeDiff.height;c._helper&&!e.animate&&/relative/.test(b.css("position"))&&a(this).css({left:k.left-i.left-f.left,width:l,height:h});c._helper&&!e.animate&&/static/.test(b.css("position"))&&a(this).css({left:k.left-i.left-f.left,width:l,height:h})}});a.ui.plugin.add("resizable","ghost",{start:function(){var c=a(this).data("resizable"),e=c.options,f=c.size;c.ghost=c.originalElement.clone();c.ghost.css({opacity:0.25,display:"block",position:"relative", +height:f.height,width:f.width,margin:0,left:0,top:0}).addClass("ui-resizable-ghost").addClass(typeof e.ghost=="string"?e.ghost:"");c.ghost.appendTo(c.helper)},resize:function(){var c=a(this).data("resizable");c.ghost&&c.ghost.css({position:"relative",height:c.size.height,width:c.size.width})},stop:function(){var c=a(this).data("resizable");c.ghost&&c.helper&&c.helper.get(0).removeChild(c.ghost.get(0))}});a.ui.plugin.add("resizable","grid",{resize:function(){var c=a(this).data("resizable"),e=c.options, +f=c.size,i=c.originalSize,b=c.originalPosition,h=c.axis;e.grid=typeof e.grid=="number"?[e.grid,e.grid]:e.grid;var k=Math.round((f.width-i.width)/(e.grid[0]||1))*(e.grid[0]||1);e=Math.round((f.height-i.height)/(e.grid[1]||1))*(e.grid[1]||1);if(/^(se|s|e)$/.test(h)){c.size.width=i.width+k;c.size.height=i.height+e}else if(/^(ne)$/.test(h)){c.size.width=i.width+k;c.size.height=i.height+e;c.position.top=b.top-e}else{if(/^(sw)$/.test(h)){c.size.width=i.width+k;c.size.height=i.height+e}else{c.size.width= +i.width+k;c.size.height=i.height+e;c.position.top=b.top-e}c.position.left=b.left-k}}});var g=function(c){return parseInt(c,10)||0},d=function(c){return!isNaN(parseInt(c,10))}})(jQuery); +(function(a){a.widget("ui.selectable",a.ui.mouse,{version:"1.9pre",options:{appendTo:"body",autoRefresh:true,distance:0,filter:"*",tolerance:"touch"},_create:function(){var g=this;this.element.addClass("ui-selectable");this.dragged=false;var d;this.refresh=function(){d=a(g.options.filter,g.element[0]);d.each(function(){var c=a(this),e=c.offset();a.data(this,"selectable-item",{element:this,$element:c,left:e.left,top:e.top,right:e.left+c.outerWidth(),bottom:e.top+c.outerHeight(),startselected:false, +selected:c.hasClass("ui-selected"),selecting:c.hasClass("ui-selecting"),unselecting:c.hasClass("ui-unselecting")})})};this.refresh();this.selectees=d.addClass("ui-selectee");this._mouseInit();this.helper=a("
")},destroy:function(){this.selectees.removeClass("ui-selectee").removeData("selectable-item");this.element.removeClass("ui-selectable ui-selectable-disabled").removeData("selectable").unbind(".selectable");this._mouseDestroy();return this},_mouseStart:function(g){var d= +this;this.opos=[g.pageX,g.pageY];if(!this.options.disabled){var c=this.options;this.selectees=a(c.filter,this.element[0]);this._trigger("start",g);a(c.appendTo).append(this.helper);this.helper.css({left:g.clientX,top:g.clientY,width:0,height:0});c.autoRefresh&&this.refresh();this.selectees.filter(".ui-selected").each(function(){var e=a.data(this,"selectable-item");e.startselected=true;if(!g.metaKey){e.$element.removeClass("ui-selected");e.selected=false;e.$element.addClass("ui-unselecting");e.unselecting= +true;d._trigger("unselecting",g,{unselecting:e.element})}});a(g.target).parents().andSelf().each(function(){var e=a.data(this,"selectable-item");if(e){var f=!g.metaKey||!e.$element.hasClass("ui-selected");e.$element.removeClass(f?"ui-unselecting":"ui-selected").addClass(f?"ui-selecting":"ui-unselecting");e.unselecting=!f;e.selecting=f;(e.selected=f)?d._trigger("selecting",g,{selecting:e.element}):d._trigger("unselecting",g,{unselecting:e.element});return false}})}},_mouseDrag:function(g){var d=this; +this.dragged=true;if(!this.options.disabled){var c=this.options,e=this.opos[0],f=this.opos[1],i=g.pageX,b=g.pageY;if(e>i){var h=i;i=e;e=h}if(f>b){h=b;b=f;f=h}this.helper.css({left:e,top:f,width:i-e,height:b-f});this.selectees.each(function(){var k=a.data(this,"selectable-item");if(!(!k||k.element==d.element[0])){var l=false;if(c.tolerance=="touch")l=!(k.left>i||k.rightb||k.bottome&&k.rightf&&k.bottom *",opacity:false,placeholder:false,revert:false,scroll:true,scrollSensitivity:20,scrollSpeed:20,scope:"default",tolerance:"intersect",zIndex:1E3},_create:function(){var g=this.options;this.containerCache= +{};this.element.addClass("ui-sortable");this.refresh();this.floating=this.items.length?g.axis==="x"||/left|right/.test(this.items[0].item.css("float"))||/inline|table-cell/.test(this.items[0].item.css("display")):false;this.offset=this.element.offset();this._mouseInit()},destroy:function(){this.element.removeClass("ui-sortable ui-sortable-disabled");this._mouseDestroy();for(var g=this.items.length-1;g>=0;g--)this.items[g].item.removeData(this.widgetName+"-item");return this},_setOption:function(g, +d){if(g==="disabled"){this.options[g]=d;this.widget().toggleClass("ui-sortable-disabled",!!d)}else a.Widget.prototype._setOption.apply(this,arguments)},_mouseCapture:function(g,d){var c=this;if(this.reverting)return false;if(this.options.disabled||this.options.type=="static")return false;this._refreshItems(g);var e=null,f=this;a(g.target).parents().each(function(){if(a.data(this,c.widgetName+"-item")==f){e=a(this);return false}});if(a.data(g.target,c.widgetName+"-item")==f)e=a(g.target);if(!e)return false; +if(this.options.handle&&!d){var i=false;a(this.options.handle,e).find("*").andSelf().each(function(){if(this==g.target)i=true});if(!i)return false}this.currentItem=e;this._removeCurrentsFromItems();return true},_mouseStart:function(g,d,c){d=this.options;this.currentContainer=this;this.refreshPositions();this.helper=this._createHelper(g);this._cacheHelperProportions();this._cacheMargins();this.scrollParent=this.helper.scrollParent();this.offset=this.currentItem.offset();this.offset={top:this.offset.top- +this.margins.top,left:this.offset.left-this.margins.left};this.helper.css("position","absolute");this.cssPosition=this.helper.css("position");a.extend(this.offset,{click:{left:g.pageX-this.offset.left,top:g.pageY-this.offset.top},parent:this._getParentOffset(),relative:this._getRelativeOffset()});this.originalPosition=this._generatePosition(g);this.originalPageX=g.pageX;this.originalPageY=g.pageY;d.cursorAt&&this._adjustOffsetFromHelper(d.cursorAt);this.domPosition={prev:this.currentItem.prev()[0], +parent:this.currentItem.parent()[0]};this.helper[0]!=this.currentItem[0]&&this.currentItem.hide();this._createPlaceholder();d.containment&&this._setContainment();if(d.cursor){if(a("body").css("cursor"))this._storedCursor=a("body").css("cursor");a("body").css("cursor",d.cursor)}if(d.opacity){if(this.helper.css("opacity"))this._storedOpacity=this.helper.css("opacity");this.helper.css("opacity",d.opacity)}if(d.zIndex){if(this.helper.css("zIndex"))this._storedZIndex=this.helper.css("zIndex");this.helper.css("zIndex", +d.zIndex)}if(this.scrollParent[0]!=document&&this.scrollParent[0].tagName!="HTML")this.overflowOffset=this.scrollParent.offset();this._trigger("start",g,this._uiHash());this._preserveHelperProportions||this._cacheHelperProportions();if(!c)for(c=this.containers.length-1;c>=0;c--)this.containers[c]._trigger("activate",g,this._uiHash(this));if(a.ui.ddmanager)a.ui.ddmanager.current=this;a.ui.ddmanager&&!d.dropBehaviour&&a.ui.ddmanager.prepareOffsets(this,g);this.dragging=true;this.helper.addClass("ui-sortable-helper"); +this._mouseDrag(g);return true},_mouseDrag:function(g){this.position=this._generatePosition(g);this.positionAbs=this._convertPositionTo("absolute");if(!this.lastPositionAbs)this.lastPositionAbs=this.positionAbs;if(this.options.scroll){var d=this.options,c=false;if(this.scrollParent[0]!=document&&this.scrollParent[0].tagName!="HTML"){if(this.overflowOffset.top+this.scrollParent[0].offsetHeight-g.pageY=0;d--){c=this.items[d];var e=c.item[0],f=this._intersectsWithPointer(c);if(f)if(e!=this.currentItem[0]&&this.placeholder[f==1?"next":"prev"]()[0]!=e&&!a.contains(this.placeholder[0],e)&&(this.options.type== +"semi-dynamic"?!a.contains(this.element[0],e):1)){this.direction=f==1?"down":"up";if(this.options.tolerance=="pointer"||this._intersectsWithSides(c))this._rearrange(g,c);else break;this._trigger("change",g,this._uiHash());break}}this._contactContainers(g);a.ui.ddmanager&&a.ui.ddmanager.drag(this,g);this._trigger("sort",g,this._uiHash());this.lastPositionAbs=this.positionAbs;return false},_mouseStop:function(g,d){if(g){a.ui.ddmanager&&!this.options.dropBehaviour&&a.ui.ddmanager.drop(this,g);if(this.options.revert){var c= +this,e=c.placeholder.offset();c.reverting=true;a(this.helper).animate({left:e.left-this.offset.parent.left-c.margins.left+(this.offsetParent[0]==document.body?0:this.offsetParent[0].scrollLeft),top:e.top-this.offset.parent.top-c.margins.top+(this.offsetParent[0]==document.body?0:this.offsetParent[0].scrollTop)},parseInt(this.options.revert,10)||500,function(){c._clear(g)})}else this._clear(g,d);return false}},cancel:function(){if(this.dragging){this._mouseUp({target:null});this.options.helper=="original"? +this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper"):this.currentItem.show();for(var g=this.containers.length-1;g>=0;g--){this.containers[g]._trigger("deactivate",null,this._uiHash(this));if(this.containers[g].containerCache.over){this.containers[g]._trigger("out",null,this._uiHash(this));this.containers[g].containerCache.over=0}}}if(this.placeholder){this.placeholder[0].parentNode&&this.placeholder[0].parentNode.removeChild(this.placeholder[0]);this.options.helper!="original"&& +this.helper&&this.helper[0].parentNode&&this.helper.remove();a.extend(this,{helper:null,dragging:false,reverting:false,_noFinalSort:null});this.domPosition.prev?a(this.domPosition.prev).after(this.currentItem):a(this.domPosition.parent).prepend(this.currentItem)}return this},serialize:function(g){var d=this._getItemsAsjQuery(g&&g.connected),c=[];g=g||{};a(d).each(function(){var e=(a(g.item||this).attr(g.attribute||"id")||"").match(g.expression||/(.+)[-=_](.+)/);if(e)c.push((g.key||e[1]+"[]")+"="+ +(g.key&&g.expression?e[1]:e[2]))});!c.length&&g.key&&c.push(g.key+"=");return c.join("&")},toArray:function(g){var d=this._getItemsAsjQuery(g&&g.connected),c=[];g=g||{};d.each(function(){c.push(a(g.item||this).attr(g.attribute||"id")||"")});return c},_intersectsWith:function(g){var d=this.positionAbs.left,c=d+this.helperProportions.width,e=this.positionAbs.top,f=e+this.helperProportions.height,i=g.left,b=i+g.width,h=g.top,k=h+g.height,l=this.offset.click.top,j=this.offset.click.left;return this.options.tolerance== +"pointer"||this.options.forcePointerForContainers||this.options.tolerance!="pointer"&&this.helperProportions[this.floating?"width":"height"]>g[this.floating?"width":"height"]?e+l>h&&e+li&&d+j0?"down":"up")},_getDragHorizontalDirection:function(){var g=this.positionAbs.left-this.lastPositionAbs.left;return g!=0&&(g>0?"right":"left")},refresh:function(g){this._refreshItems(g);this.refreshPositions();return this},_connectWith:function(){var g=this.options;return g.connectWith.constructor==String?[g.connectWith]: +g.connectWith},_getItemsAsjQuery:function(g){var d=[],c=[],e=this._connectWith();if(e&&g)for(g=e.length-1;g>=0;g--)for(var f=a(e[g]),i=f.length-1;i>=0;i--){var b=a.data(f[i],this.widgetName);if(b&&b!=this&&!b.options.disabled)c.push([a.isFunction(b.options.items)?b.options.items.call(b.element):a(b.options.items,b.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"),b])}c.push([a.isFunction(this.options.items)?this.options.items.call(this.element,null,{options:this.options,item:this.currentItem}): +a(this.options.items,this.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"),this]);for(g=c.length-1;g>=0;g--)c[g][0].each(function(){d.push(this)});return a(d)},_removeCurrentsFromItems:function(){for(var g=this.currentItem.find(":data("+this.widgetName+"-item)"),d=0;d=0;f--)for(var i=a(e[f]),b=i.length-1;b>=0;b--){var h=a.data(i[b],this.widgetName);if(h&&h!=this&&!h.options.disabled){c.push([a.isFunction(h.options.items)?h.options.items.call(h.element[0],g,{item:this.currentItem}):a(h.options.items,h.element),h]);this.containers.push(h)}}for(f=c.length-1;f>=0;f--){g=c[f][1];e=c[f][0];b=0;for(i=e.length;b< +i;b++){h=a(e[b]);h.data(this.widgetName+"-item",g);d.push({item:h,instance:g,width:0,height:0,left:0,top:0})}}},refreshPositions:function(g){if(this.offsetParent&&this.helper)this.offset.parent=this._getParentOffset();for(var d=this.items.length-1;d>=0;d--){var c=this.items[d];if(!(c.instance!=this.currentContainer&&this.currentContainer&&c.item[0]!=this.currentItem[0])){var e=this.options.toleranceElement?a(this.options.toleranceElement,c.item):c.item;if(!g){c.width=e.outerWidth();c.height=e.outerHeight()}e= +e.offset();c.left=e.left;c.top=e.top}}if(this.options.custom&&this.options.custom.refreshContainers)this.options.custom.refreshContainers.call(this);else for(d=this.containers.length-1;d>=0;d--){e=this.containers[d].element.offset();this.containers[d].containerCache.left=e.left;this.containers[d].containerCache.top=e.top;this.containers[d].containerCache.width=this.containers[d].element.outerWidth();this.containers[d].containerCache.height=this.containers[d].element.outerHeight()}return this},_createPlaceholder:function(g){var d= +g||this,c=d.options;if(!c.placeholder||c.placeholder.constructor==String){var e=c.placeholder;c.placeholder={element:function(){var f=a(document.createElement(d.currentItem[0].nodeName)).addClass(e||d.currentItem[0].className+" ui-sortable-placeholder").removeClass("ui-sortable-helper")[0];if(!e)f.style.visibility="hidden";return f},update:function(f,i){if(!(e&&!c.forcePlaceholderSize)){i.height()||i.height(d.currentItem.innerHeight()-parseInt(d.currentItem.css("paddingTop")||0,10)-parseInt(d.currentItem.css("paddingBottom")|| +0,10));i.width()||i.width(d.currentItem.innerWidth()-parseInt(d.currentItem.css("paddingLeft")||0,10)-parseInt(d.currentItem.css("paddingRight")||0,10))}}}}d.placeholder=a(c.placeholder.element.call(d.element,d.currentItem));d.currentItem.after(d.placeholder);c.placeholder.update(d,d.placeholder)},_contactContainers:function(g){for(var d=null,c=null,e=this.containers.length-1;e>=0;e--)if(!a.contains(this.currentItem[0],this.containers[e].element[0]))if(this._intersectsWith(this.containers[e].containerCache)){if(!(d&& +a.contains(this.containers[e].element[0],d.element[0]))){d=this.containers[e];c=e}}else if(this.containers[e].containerCache.over){this.containers[e]._trigger("out",g,this._uiHash(this));this.containers[e].containerCache.over=0}if(d)if(this.containers.length===1){this.containers[c]._trigger("over",g,this._uiHash(this));this.containers[c].containerCache.over=1}else if(this.currentContainer!=this.containers[c]){d=1E4;e=null;for(var f=this.positionAbs[this.containers[c].floating?"left":"top"],i=this.items.length- +1;i>=0;i--)if(a.contains(this.containers[c].element[0],this.items[i].item[0])){var b=this.items[i][this.containers[c].floating?"left":"top"];if(Math.abs(b-f) +this.containment[2])f=this.containment[2]+this.offset.click.left;if(g.pageY-this.offset.click.top>this.containment[3])i=this.containment[3]+this.offset.click.top}if(d.grid){i=this.originalPageY+Math.round((i-this.originalPageY)/d.grid[1])*d.grid[1];i=this.containment?!(i-this.offset.click.topthis.containment[3])?i:!(i-this.offset.click.topthis.containment[2])?f:!(f-this.offset.click.left=0;e--)if(a.contains(this.containers[e].element[0],this.currentItem[0])&&!d){c.push(function(f){return function(i){f._trigger("receive",i,this._uiHash(this))}}.call(this,this.containers[e]));c.push(function(f){return function(i){f._trigger("update", +i,this._uiHash(this))}}.call(this,this.containers[e]))}}for(e=this.containers.length-1;e>=0;e--){d||c.push(function(f){return function(i){f._trigger("deactivate",i,this._uiHash(this))}}.call(this,this.containers[e]));if(this.containers[e].containerCache.over){c.push(function(f){return function(i){f._trigger("out",i,this._uiHash(this))}}.call(this,this.containers[e]));this.containers[e].containerCache.over=0}}this._storedCursor&&a("body").css("cursor",this._storedCursor);this._storedOpacity&&this.helper.css("opacity", +this._storedOpacity);if(this._storedZIndex)this.helper.css("zIndex",this._storedZIndex=="auto"?"":this._storedZIndex);this.dragging=false;if(this.cancelHelperRemoval){if(!d){this._trigger("beforeStop",g,this._uiHash());for(e=0;e").addClass("ui-effects-wrapper").css({fontSize:"100%",background:"transparent",border:"none",margin:0,padding:0}), +n={width:l.width(),height:l.height()},o=document.activeElement;l.wrap(m);if(l[0]===o||a.contains(l[0],o))a(o).focus();m=l.parent();if(l.css("position")==="static"){m.css({position:"relative"});l.css({position:"relative"})}else{a.extend(j,{position:l.css("position"),zIndex:l.css("z-index")});a.each(["top","left","bottom","right"],function(p,q){j[q]=l.css(q);if(isNaN(parseInt(j[q],10)))j[q]="auto"});l.css({position:"relative",top:0,left:0,right:"auto",bottom:"auto"})}l.css(n);return m.css(j).show()}, +removeWrapper:function(l){var j=document.activeElement;if(l.parent().is(".ui-effects-wrapper")){l.parent().replaceWith(l);if(l[0]===j||a.contains(l[0],j))a(j).focus()}return l},setTransition:function(l,j,m,n){n=n||{};a.each(j,function(o,p){var q=l.cssUnit(p);if(q[0]>0)n[p]=q[0]*m+q[1]});return n}});a.fn.extend({effect:function(){function l(q){function u(){a.isFunction(r)&&r.call(s[0]);a.isFunction(q)&&q()}var s=a(this),r=j.complete,t=j.mode;(s.is(":hidden")?t==="hide":t==="show")?u():o.call(s[0], +j,u)}var j=e.apply(this,arguments),m=j.mode,n=j.queue,o=a.effects.effect[j.effect],p=!o&&i&&a.effects[j.effect];if(a.fx.off||!(o||p))return m?this[m](j.duration,j.complete):this.each(function(){j.complete&&j.complete.call(this)});return o?n===false?this.each(l):this.queue(n||"fx",l):p.call(this,{options:j,duration:j.duration,callback:j.complete,mode:j.mode})},_show:a.fn.show,show:function(l){if(f(l))return this._show.apply(this,arguments);else{var j=e.apply(this,arguments);j.mode="show";return this.effect.call(this, +j)}},_hide:a.fn.hide,hide:function(l){if(f(l))return this._hide.apply(this,arguments);else{var j=e.apply(this,arguments);j.mode="hide";return this.effect.call(this,j)}},__toggle:a.fn.toggle,toggle:function(l){if(f(l)||typeof l==="boolean"||a.isFunction(l))return this.__toggle.apply(this,arguments);else{var j=e.apply(this,arguments);j.mode="toggle";return this.effect.call(this,j)}},cssUnit:function(l){var j=this.css(l),m=[];a.each(["em","px","%","pt"],function(n,o){if(j.indexOf(o)>0)m=[parseFloat(j), +o]});return m}});a.easing.jswing=a.easing.swing;a.extend(a.easing,{def:"easeOutQuad",swing:function(l,j,m,n,o){return a.easing[a.easing.def](l,j,m,n,o)},easeInQuad:function(l,j,m,n,o){return n*(j/=o)*j+m},easeOutQuad:function(l,j,m,n,o){return-n*(j/=o)*(j-2)+m},easeInOutQuad:function(l,j,m,n,o){if((j/=o/2)<1)return n/2*j*j+m;return-n/2*(--j*(j-2)-1)+m},easeInCubic:function(l,j,m,n,o){return n*(j/=o)*j*j+m},easeOutCubic:function(l,j,m,n,o){return n*((j=j/o-1)*j*j+1)+m},easeInOutCubic:function(l,j, +m,n,o){if((j/=o/2)<1)return n/2*j*j*j+m;return n/2*((j-=2)*j*j+2)+m},easeInQuart:function(l,j,m,n,o){return n*(j/=o)*j*j*j+m},easeOutQuart:function(l,j,m,n,o){return-n*((j=j/o-1)*j*j*j-1)+m},easeInOutQuart:function(l,j,m,n,o){if((j/=o/2)<1)return n/2*j*j*j*j+m;return-n/2*((j-=2)*j*j*j-2)+m},easeInQuint:function(l,j,m,n,o){return n*(j/=o)*j*j*j*j+m},easeOutQuint:function(l,j,m,n,o){return n*((j=j/o-1)*j*j*j*j+1)+m},easeInOutQuint:function(l,j,m,n,o){if((j/=o/2)<1)return n/2*j*j*j*j*j+m;return n/2* +((j-=2)*j*j*j*j+2)+m},easeInSine:function(l,j,m,n,o){return-n*Math.cos(j/o*(Math.PI/2))+n+m},easeOutSine:function(l,j,m,n,o){return n*Math.sin(j/o*(Math.PI/2))+m},easeInOutSine:function(l,j,m,n,o){return-n/2*(Math.cos(Math.PI*j/o)-1)+m},easeInExpo:function(l,j,m,n,o){return j==0?m:n*Math.pow(2,10*(j/o-1))+m},easeOutExpo:function(l,j,m,n,o){return j==o?m+n:n*(-Math.pow(2,-10*j/o)+1)+m},easeInOutExpo:function(l,j,m,n,o){if(j==0)return m;if(j==o)return m+n;if((j/=o/2)<1)return n/2*Math.pow(2,10*(j-1))+ +m;return n/2*(-Math.pow(2,-10*--j)+2)+m},easeInCirc:function(l,j,m,n,o){return-n*(Math.sqrt(1-(j/=o)*j)-1)+m},easeOutCirc:function(l,j,m,n,o){return n*Math.sqrt(1-(j=j/o-1)*j)+m},easeInOutCirc:function(l,j,m,n,o){if((j/=o/2)<1)return-n/2*(Math.sqrt(1-j*j)-1)+m;return n/2*(Math.sqrt(1-(j-=2)*j)+1)+m},easeInElastic:function(l,j,m,n,o){l=1.70158;var p=o*0.3,q=n;if(j==0)return m;if((j/=o)==1)return m+n;if(q1&&q.splice.apply(q,[1,0].concat(q.splice(u,l+1)));c.dequeue()}})(jQuery); +(function(a){a.effects.effect.clip=function(g,d){var c=a(this),e=["position","top","bottom","left","right","height","width"],f=a.effects.setMode(c,g.mode||"hide")==="show",i=(g.direction||"vertical")==="vertical",b=i?"height":"width";i=i?"top":"left";var h={},k,l;a.effects.save(c,e);c.show();k=a.effects.createWrapper(c).css({overflow:"hidden"});k=c[0].tagName==="IMG"?k:c;l=k[b]();if(f){k.css(b,0);k.css(i,l/2)}h[b]=f?l:0;h[i]=f?0:l/2;k.animate(h,{queue:false,duration:g.duration,easing:g.easing,complete:function(){f|| +c.hide();a.effects.restore(c,e);a.effects.removeWrapper(c);d()}})}})(jQuery); +(function(a){a.effects.effect.drop=function(g,d){var c=a(this),e=["position","top","bottom","left","right","opacity","height","width"],f=a.effects.setMode(c,g.mode||"hide"),i=f==="show",b=g.direction||"left",h=b==="up"||b==="down"?"top":"left";b=b==="up"||b==="left"?"pos":"neg";var k={opacity:i?1:0},l;a.effects.save(c,e);c.show();a.effects.createWrapper(c);l=g.distance||c[h=="top"?"outerHeight":"outerWidth"]({margin:true})/2;if(i)c.css("opacity",0).css(h,b=="pos"?-l:l);k[h]=(i?b==="pos"?"+=":"-=": +b==="pos"?"-=":"+=")+l;c.animate(k,{queue:false,duration:g.duration,easing:g.easing,complete:function(){f=="hide"&&c.hide();a.effects.restore(c,e);a.effects.removeWrapper(c);d()}})}})(jQuery); +(function(a){a.effects.effect.explode=function(g,d){function c(){j.push(this);if(j.length==e*f){i.css({visibility:"visible"});a(j).remove();b||i.hide();d()}}var e=g.pieces?Math.round(Math.sqrt(g.pieces)):3,f=e,i=a(this),b=a.effects.setMode(i,g.mode||"hide")==="show",h=i.show().css("visibility","hidden").offset(),k=Math.ceil(i.outerWidth()/f),l=Math.ceil(i.outerHeight()/e),j=[],m,n,o,p,q,u;for(m=0;m").css({position:"absolute", +visibility:"visible",left:-n*k,top:-m*l}).parent().addClass("ui-effects-explode").css({position:"absolute",overflow:"hidden",width:k,height:l,left:o+(b?q*k:0),top:p+(b?u*l:0),opacity:b?0:1}).animate({left:o+(b?0:q*k),top:p+(b?0:u*l),opacity:b?1:0},g.duration||500,g.easing,c)}}}})(jQuery); +(function(a){a.effects.effect.fade=function(g,d){var c=a(this),e=a.effects.setMode(c,g.mode||"toggle")==="hide";c.show();c.animate({opacity:e?0:1},{queue:false,duration:g.duration,easing:g.easing,complete:function(){e&&c.hide();d()}})}})(jQuery); +(function(a){a.effects.effect.fold=function(g,d){var c=a(this),e=["position","top","bottom","left","right","height","width"],f=a.effects.setMode(c,g.mode||"hide"),i=f==="show",b=f==="hide";f=g.size||15;var h=/([0-9]+)%/.exec(f),k=!!g.horizFirst,l=i!=k,j=l?["width","height"]:["height","width"],m=g.duration/2,n,o={},p={};a.effects.save(c,e);c.show();n=a.effects.createWrapper(c).css({overflow:"hidden"});l=l?[n.width(),n.height()]:[n.height(),n.width()];if(h)f=parseInt(h[1],10)/100*l[b?0:1];if(i)n.css(k? +{height:0,width:f}:{height:f,width:0});o[j[0]]=i?l[0]:f;p[j[1]]=i?l[1]:0;n.animate(o,m,g.easing).animate(p,m,g.easing,function(){b&&c.hide();a.effects.restore(c,e);a.effects.removeWrapper(c);d()})}})(jQuery); +(function(a){a.effects.effect.highlight=function(g,d){var c=a(this),e=["backgroundImage","backgroundColor","opacity"],f=a.effects.setMode(c,g.mode||"show"),i={backgroundColor:c.css("backgroundColor")};if(f==="hide")i.opacity=0;a.effects.save(c,e);c.show().css({backgroundImage:"none",backgroundColor:g.color||"#ffff99"}).animate(i,{queue:false,duration:g.duration,easing:g.easing,complete:function(){f==="hide"&&c.hide();a.effects.restore(c,e);d()}})}})(jQuery); +(function(a){a.effects.effect.pulsate=function(g,d){var c=a(this),e=a.effects.setMode(c,g.mode||"show"),f=e==="show",i=e==="hide";e=(g.times||5)*2+(f||e==="hide"?1:0);var b=g.duration/e,h=0,k=c.queue(),l=k.length;if(f||!c.is(":visible")){c.css("opacity",0).show();h=1}for(f=1;f1&&k.splice.apply(k,[1,0].concat(k.splice(l,e+1)));c.dequeue()}})(jQuery); +(function(a){a.effects.effect.puff=function(g,d){var c=a(this),e=a.effects.setMode(c,g.mode||"hide"),f=e==="hide",i=parseInt(g.percent,10)||150,b=i/100,h={height:c.height(),width:c.width()};a.extend(g,{effect:"scale",queue:false,fade:true,mode:e,complete:d,percent:f?i:100,from:f?h:{height:h.height*b,width:h.width*b}});c.effect(g)};a.effects.effect.scale=function(g,d){var c=a(this),e=a.extend(true,{},g),f=a.effects.setMode(c,g.mode||"effect"),i=parseInt(g.percent,10)||(parseInt(g.percent,10)==0?0: +f=="hide"?0:100),b=g.direction||"both",h=g.origin,k={height:c.height(),width:c.width(),outerHeight:c.outerHeight(),outerWidth:c.outerWidth()};i={y:b!="horizontal"?i/100:1,x:b!="vertical"?i/100:1};e.effect="size";e.queue=false;e.complete=d;if(f!="effect"){e.origin=h||["middle","center"];e.restore=true}e.from=g.from||(f=="show"?{height:0,width:0}:k);e.to={height:k.height*i.y,width:k.width*i.x,outerHeight:k.outerHeight*i.y,outerWidth:k.outerWidth*i.x};if(e.fade){if(f=="show"){e.from.opacity=0;e.to.opacity= +1}if(f=="hide"){e.from.opacity=1;e.to.opacity=0}}c.effect(e)};a.effects.effect.size=function(g,d){var c=a(this),e=["position","top","bottom","left","right","width","height","overflow","opacity"],f=["position","top","bottom","left","right","overflow","opacity"],i=["width","height","overflow"],b=["fontSize"],h=["borderTopWidth","borderBottomWidth","paddingTop","paddingBottom"],k=["borderLeftWidth","borderRightWidth","paddingLeft","paddingRight"],l=a.effects.setMode(c,g.mode||"effect"),j=g.restore|| +l!=="effect",m=g.scale||"both",n=g.origin||["middle","center"],o,p,q,u=c.css("position"),s=c.css("bottom")!=="auto"?"bottom":"top";originalHorizontalPositioning=c.css("right")!=="auto"?"right":"left";l==="show"&&c.show();o={height:c.height(),width:c.width(),outerHeight:c.outerHeight(),outerWidth:c.outerWidth()};c.from=g.from||o;c.to=g.to||o;q={from:{y:c.from.height/o.height,x:c.from.width/o.width},to:{y:c.to.height/o.height,x:c.to.width/o.width}};if(m=="box"||m=="both"){if(q.from.y!==q.to.y){e=e.concat(h); +c.from=a.effects.setTransition(c,h,q.from.y,c.from);c.to=a.effects.setTransition(c,h,q.to.y,c.to)}if(q.from.x!==q.to.x){e=e.concat(k);c.from=a.effects.setTransition(c,k,q.from.x,c.from);c.to=a.effects.setTransition(c,k,q.to.x,c.to)}}if(m=="content"||m=="both")if(q.from.y!==q.to.y){e=e.concat(b);c.from=a.effects.setTransition(c,b,q.from.y,c.from);c.to=a.effects.setTransition(c,b,q.to.y,c.to)}a.effects.save(c,j?e:f);c.show();a.effects.createWrapper(c);c.css("overflow","hidden").css(c.from);if(n){p= +a.effects.getBaseline(n,o);c.from.top=(o.outerHeight-c.outerHeight())*p.y;c.from.left=(o.outerWidth-c.outerWidth())*p.x;c.to.top=(o.outerHeight-c.to.outerHeight)*p.y;c.to.left=(o.outerWidth-c.to.outerWidth)*p.x}c.css(c.from);if(m=="content"||m=="both"){h=h.concat(["marginTop","marginBottom"]).concat(b);k=k.concat(["marginLeft","marginRight"]);i=e.concat(h).concat(k);c.find("*[width]").each(function(){var r=a(this),t={height:r.height(),width:r.width()};j&&a.effects.save(r,i);r.from={height:t.height* +q.from.y,width:t.width*q.from.x};r.to={height:t.height*q.to.y,width:t.width*q.to.x};if(q.from.y!=q.to.y){r.from=a.effects.setTransition(r,h,q.from.y,r.from);r.to=a.effects.setTransition(r,h,q.to.y,r.to)}if(q.from.x!=q.to.x){r.from=a.effects.setTransition(r,k,q.from.x,r.from);r.to=a.effects.setTransition(r,k,q.to.x,r.to)}r.css(r.from);r.animate(r.to,g.duration,g.easing,function(){j&&a.effects.restore(r,i)})})}c.animate(c.to,{queue:false,duration:g.duration,easing:g.easing,complete:function(){c.to.opacity=== +0&&c.css("opacity",c.from.opacity);l=="hide"&&c.hide();a.effects.restore(c,j?e:f);j||(u==="static"?c.css({position:"relative",top:c.to.top,left:c.to.left}):a.each([s,originalHorizontalPositioning],function(r,t){c.css(t,function(v,w){var x=parseInt(w,10),C=r?c.to.left:c.to.top,A=r?c.to.outerWidth-c.from.outerWidth:c.to.outerHeight-c.from.outerHeight,y=n[r]===t,D=n[r]==="middle"||n[r]==="center";if(w==="auto")return C+"px";if(!(t=="left"||t=="top"))if(u==="relative")C*=-1;else D||(C-=A*(y?-1:1));return x+ +C+"px"})}));a.effects.removeWrapper(c);d()}})}})(jQuery); +(function(a){a.effects.effect.shake=function(g,d){var c=a(this),e=["position","top","bottom","left","right","height","width"],f=a.effects.setMode(c,g.mode||"effect"),i=g.direction||"left",b=g.distance||20,h=g.times||3,k=h*2+1,l=g.duration,j=i=="up"||i=="down"?"top":"left",m=i=="up"||i=="left";i={};var n={},o={},p=c.queue(),q=p.length;a.effects.save(c,e);c.show();a.effects.createWrapper(c);i[j]=(m?"-=":"+=")+b;n[j]=(m?"+=":"-=")+b*2;o[j]=(m?"-=":"+=")+b*2;c.animate(i,l,g.easing);for(b=1;b1&&p.splice.apply(p,[1,0].concat(p.splice(q,k+1)));c.dequeue()}})(jQuery); +(function(a){a.effects.effect.slide=function(g,d){var c=a(this),e=["position","top","bottom","left","right","width","height"],f=a.effects.setMode(c,g.mode||"show"),i=f==="show",b=g.direction||"left",h=b=="up"||b=="down"?"top":"left";b=b=="up"||b=="left";var k,l={};a.effects.save(c,e);c.show();k=g.distance||c[h==="top"?"outerHeight":"outerWidth"]({margin:true});a.effects.createWrapper(c).css({overflow:"hidden"});if(i)c.css(h,b?isNaN(k)?"-"+k:-k:k);l[h]=(i?b?"+=":"-=":b?"-=":"+=")+k;c.animate(l,{queue:false, +duration:g.duration,easing:g.easing,complete:function(){f==="hide"&&c.hide();a.effects.restore(c,e);a.effects.removeWrapper(c);d()}})}})(jQuery); +(function(a){a.effects.effect.transfer=function(g,d){var c=a(this),e=a(g.to),f=e.css("position")==="fixed",i=a("body"),b=f?i.scrollTop():0;i=f?i.scrollLeft():0;var h=e.offset();e={top:h.top-b,left:h.left-i,height:e.innerHeight(),width:e.innerWidth()};h=c.offset();var k=a('
').appendTo(document.body).addClass(g.className).css({top:h.top-b,left:h.left-i,height:c.innerHeight(),width:c.innerWidth(),position:f?"fixed":"absolute"}).animate(e,g.duration,g.easing,function(){k.remove(); +d()})}})(jQuery); +(function(a){a.widget("ui.accordion",{version:"1.9pre",options:{active:0,animated:"slide",collapsible:false,event:"click",header:"> li > :first-child,> :not(li):even",heightStyle:"auto",icons:{activeHeader:"ui-icon-triangle-1-s",header:"ui-icon-triangle-1-e"},activate:null,beforeActivate:null},_create:function(){var g=this.options;this.lastToggle={};this.element.addClass("ui-accordion ui-widget ui-helper-reset");this.headers=this.element.find(g.header).addClass("ui-accordion-header ui-helper-reset ui-state-default ui-corner-all");this._hoverable(this.headers); +this._focusable(this.headers);this.headers.find(":first-child").addClass("ui-accordion-heading");this.headers.next().addClass("ui-accordion-content ui-helper-reset ui-widget-content ui-corner-bottom");if(!g.collapsible&&g.active===false)g.active=0;if(g.active<0)g.active+=this.headers.length;this.active=this._findActive(g.active).addClass("ui-state-default ui-state-active").toggleClass("ui-corner-all").toggleClass("ui-corner-top");this.active.next().addClass("ui-accordion-content-active");this._createIcons(); +this.refresh();this.element.attr("role","tablist");this.headers.attr("role","tab").bind("keydown.accordion",a.proxy(this,"_keydown")).next().attr("role","tabpanel");this.headers.not(this.active).attr({"aria-expanded":"false","aria-selected":"false",tabIndex:-1}).next().hide();this.active.length?this.active.attr({"aria-expanded":"true","aria-selected":"true",tabIndex:0}):this.headers.eq(0).attr("tabIndex",0);a.browser.safari||this.headers.find("a").attr("tabIndex",-1);this._setupEvents(g.event)},_createIcons:function(){var g= +this.options.icons;if(g){a("").addClass("ui-accordion-header-icon ui-icon "+g.header).prependTo(this.headers);this.active.children(".ui-accordion-header-icon").removeClass(g.header).addClass(g.activeHeader);this.element.addClass("ui-accordion-icons")}},_destroyIcons:function(){this.headers.children(".ui-accordion-header-icon").remove();this.element.removeClass("ui-accordion-icons")},_destroy:function(){this.element.removeClass("ui-accordion ui-widget ui-helper-reset").removeAttr("role");this.headers.unbind(".accordion").removeClass("ui-accordion-header ui-accordion-disabled ui-helper-reset ui-state-default ui-corner-all ui-state-active ui-state-disabled ui-corner-top").removeAttr("role").removeAttr("aria-expanded").removeAttr("aria-selected").removeAttr("tabIndex").find("a").removeAttr("tabIndex").end().find(".ui-accordion-heading").removeClass("ui-accordion-heading"); +this._destroyIcons();var g=this.headers.next().css("display","").removeAttr("role").removeClass("ui-helper-reset ui-widget-content ui-corner-bottom ui-accordion-content ui-accordion-content-active ui-accordion-disabled ui-state-disabled");this.options.heightStyle!=="content"&&g.css("height","")},_setOption:function(g,d){if(g==="active")this._activate(d);else{if(g==="event"){this.options.event&&this.headers.unbind(this.options.event+".accordion",this._eventHandler);this._setupEvents(d)}this._super("_setOption", +g,d);g==="collapsible"&&!d&&this.options.active===false&&this._activate(0);if(g==="icons"){this._destroyIcons();d&&this._createIcons()}g==="disabled"&&this.headers.add(this.headers.next()).toggleClass("ui-accordion-disabled ui-state-disabled",!!d)}},_keydown:function(g){if(!(this.options.disabled||g.altKey||g.ctrlKey)){var d=a.ui.keyCode,c=this.headers.length,e=this.headers.index(g.target),f=false;switch(g.keyCode){case d.RIGHT:case d.DOWN:f=this.headers[(e+1)%c];break;case d.LEFT:case d.UP:f=this.headers[(e- +1+c)%c];break;case d.SPACE:case d.ENTER:this._eventHandler(g)}if(f){a(g.target).attr("tabIndex",-1);a(f).attr("tabIndex",0);f.focus();g.preventDefault()}}},refresh:function(){var g=this.options,d=this.element.parent(),c,e;if(g.heightStyle==="fill"){if(!a.support.minHeight){e=d.css("overflow");d.css("overflow","hidden")}c=d.height();this.element.siblings(":visible").each(function(){var f=a(this),i=f.css("position");i==="absolute"||i==="fixed"||(c-=f.outerHeight(true))});e&&d.css("overflow",e);this.headers.each(function(){c-= +a(this).outerHeight(true)});this.headers.next().each(function(){a(this).height(Math.max(0,c-a(this).innerHeight()+a(this).height()))}).css("overflow","auto")}else if(g.heightStyle==="auto"){c=0;this.headers.next().each(function(){c=Math.max(c,a(this).height("").height())}).height(c)}return this},_activate:function(g){g=this._findActive(g)[0];if(g!==this.active[0]){g=g||this.active[0];this._eventHandler({target:g,currentTarget:g,preventDefault:a.noop})}},_findActive:function(g){return typeof g==="number"? +this.headers.eq(g):a()},_setupEvents:function(g){g&&this.headers.bind(g.split(" ").join(".accordion ")+".accordion",a.proxy(this,"_eventHandler"))},_eventHandler:function(g){var d=this.options,c=this.active,e=a(g.currentTarget),f=e[0]===c[0],i=f&&d.collapsible,b=i?a():e.next(),h=c.next();b={oldHeader:c,oldContent:h,newHeader:i?a():e,newContent:b};g.preventDefault();if(!(d.disabled||f&&!d.collapsible||this._trigger("beforeActivate",g,b)===false)){d.active=i?false:this.headers.index(e);this.active= +f?a():e;this._toggle(b);c.removeClass("ui-state-active ui-corner-top").addClass("ui-state-default ui-corner-all").children(".ui-accordion-header-icon").removeClass(d.icons.activeHeader).addClass(d.icons.header);if(!f){e.removeClass("ui-state-default ui-corner-all").addClass("ui-state-active ui-corner-top").children(".ui-accordion-header-icon").removeClass(d.icons.header).addClass(d.icons.activeHeader);e.next().addClass("ui-accordion-content-active")}}},_toggle:function(g){function d(){c._completed(g)} +var c=this,e=c.options,f=g.newContent,i=g.oldContent;if(e.animated){var b=a.ui.accordion.animations;e=e.animated;var h;if(!b[e]){h={easing:a.easing[e]?e:"slide",duration:700};e="slide"}b[e]({widget:c,toShow:f,toHide:i,prevShow:c.lastToggle.toShow,prevHide:c.lastToggle.toHide,complete:d,down:f.length&&(!i.length||f.index()",options:{appendTo:"body",autoFocus:false,delay:300,minLength:1,position:{my:"left top",at:"left bottom",collision:"none"},source:null,change:null,close:null,focus:null,open:null,response:null,search:null,select:null},pending:0,_create:function(){var d=this,c=this.element[0].ownerDocument,e,f;this.valueMethod=this.element[this.element.is("input,textarea")?"val":"text"];this.element.addClass("ui-autocomplete-input").attr("autocomplete", +"off").attr({role:"textbox","aria-autocomplete":"list","aria-haspopup":"true"}).bind("keydown.autocomplete",function(i){if(d.options.disabled||d.element.prop("readOnly"))f=e=true;else{f=e=false;var b=a.ui.keyCode;switch(i.keyCode){case b.PAGE_UP:e=true;d._move("previousPage",i);break;case b.PAGE_DOWN:e=true;d._move("nextPage",i);break;case b.UP:e=true;d._move("previous",i);i.preventDefault();break;case b.DOWN:e=true;d._move("next",i);i.preventDefault();break;case b.ENTER:case b.NUMPAD_ENTER:if(d.menu.active){e= +true;i.preventDefault()}case b.TAB:if(!d.menu.active)break;d.menu.select(i);break;case b.ESCAPE:if(d.menu.element.is(":visible")){d._value(d.term);d.close(i)}break;default:d._searchTimeout(i)}}}).bind("keypress.autocomplete",function(i){if(e){e=false;i.preventDefault()}else{var b=a.ui.keyCode;switch(i.keyCode){case b.PAGE_UP:d._move("previousPage",i);break;case b.PAGE_DOWN:d._move("nextPage",i);break;case b.UP:d._move("previous",i);i.preventDefault();break;case b.DOWN:d._move("next",i);i.preventDefault()}}}).bind("input.autocomplete", +function(i){if(f){f=false;i.preventDefault()}else d._searchTimeout(i)}).bind("focus.autocomplete",function(){if(!d.options.disabled){d.selectedItem=null;d.previous=d._value()}}).bind("blur.autocomplete",function(i){if(!d.options.disabled){clearTimeout(d.searching);d.closing=setTimeout(function(){d.close(i);d._change(i)},150)}});this._initSource();this.response=function(){return d._response.apply(d,arguments)};this.menu=a("
    ").addClass("ui-autocomplete").appendTo(a(this.options.appendTo||"body", +c)[0]).mousedown(function(i){var b=d.menu.element[0];a(i.target).closest(".ui-menu-item").length||setTimeout(function(){a(document).one("mousedown",function(h){h.target!==d.element[0]&&h.target!==b&&!a.contains(b,h.target)&&d.close()})},1);setTimeout(function(){clearTimeout(d.closing)},13)}).menu({input:a(),focus:function(i,b){var h=b.item.data("item.autocomplete");false!==d._trigger("focus",i,{item:h})&&/^key/.test(i.originalEvent.type)&&d._value(h.value)},select:function(i,b){var h=b.item.data("item.autocomplete"), +k=d.previous;if(d.element[0]!==c.activeElement){d.element.focus();d.previous=k;setTimeout(function(){d.previous=k;d.selectedItem=h},1)}false!==d._trigger("select",i,{item:h})&&d._value(h.value);d.term=d._value();d.close(i);d.selectedItem=h}}).zIndex(this.element.zIndex()+1).hide().data("menu");a.fn.bgiframe&&this.menu.element.bgiframe()},_destroy:function(){clearTimeout(this.searching);this.element.removeClass("ui-autocomplete-input").removeAttr("autocomplete").removeAttr("role").removeAttr("aria-autocomplete").removeAttr("aria-haspopup"); +this.menu.element.remove()},_setOption:function(d,c){this._super("_setOption",d,c);d==="source"&&this._initSource();if(d==="appendTo")this.menu.element.appendTo(a(c||"body",this.element[0].ownerDocument)[0]);d==="disabled"&&c&&this.xhr&&this.xhr.abort()},_initSource:function(){var d=this,c,e;if(a.isArray(this.options.source)){c=this.options.source;this.source=function(f,i){i(a.ui.autocomplete.filter(c,f.term))}}else if(typeof this.options.source==="string"){e=this.options.source;this.source=function(f, +i){d.xhr&&d.xhr.abort();d.xhr=a.ajax({url:e,data:f,dataType:"json",autocompleteRequest:++g,success:function(b){this.autocompleteRequest===g&&i(b)},error:function(){this.autocompleteRequest===g&&i([])}})}}else this.source=this.options.source},_searchTimeout:function(d){var c=this;clearTimeout(c.searching);c.searching=setTimeout(function(){if(c.term!==c._value()){c.selectedItem=null;c.search(null,d)}},c.options.delay)},search:function(d,c){d=d!=null?d:this._value();this.term=this._value();if(d.length< +this.options.minLength)return this.close(c);clearTimeout(this.closing);if(this._trigger("search",c)!==false)return this._search(d)},_search:function(d){this.pending++;this.element.addClass("ui-autocomplete-loading");this.source({term:d},this.response)},_response:function(d){if(d)d=this._normalize(d);this._trigger("response",null,{content:d});if(!this.options.disabled&&d&&d.length){this._suggest(d);this._trigger("open")}else this.close();this.pending--;this.pending||this.element.removeClass("ui-autocomplete-loading")}, +close:function(d){clearTimeout(this.closing);if(this.menu.element.is(":visible")){this.menu.element.hide();this.menu.blur();this._trigger("close",d)}},_change:function(d){this.previous!==this._value()&&this._trigger("change",d,{item:this.selectedItem})},_normalize:function(d){if(d.length&&d[0].label&&d[0].value)return d;return a.map(d,function(c){if(typeof c==="string")return{label:c,value:c};return a.extend({label:c.label||c.value,value:c.value||c.label},c)})},_suggest:function(d){var c=this.menu.element.empty().zIndex(this.element.zIndex()+ +1);this._renderMenu(c,d);this.menu.blur();this.menu.refresh();c.show();this._resizeMenu();c.position(a.extend({of:this.element},this.options.position));this.options.autoFocus&&this.menu.next(new a.Event("mouseover"))},_resizeMenu:function(){var d=this.menu.element;d.outerWidth(Math.max(d.width("").outerWidth(),this.element.outerWidth()))},_renderMenu:function(d,c){var e=this;a.each(c,function(f,i){e._renderItem(d,i)})},_renderItem:function(d,c){return a("
  • ").data("item.autocomplete",c).append(a("").text(c.label)).appendTo(d)}, +_move:function(d,c){if(this.menu.element.is(":visible"))if(this.menu.first()&&/^previous/.test(d)||this.menu.last()&&/^next/.test(d)){this._value(this.term);this.menu.blur()}else this.menu[d](c);else this.search(null,c)},widget:function(){return this.menu.element},_value:function(){return this.valueMethod.apply(this.element,arguments)}});a.extend(a.ui.autocomplete,{escapeRegex:function(d){return d.replace(/[-[\]{}()*+?.,\\^$|#\s]/g,"\\$&")},filter:function(d,c){var e=RegExp(a.ui.autocomplete.escapeRegex(c), +"i");return a.grep(d,function(f){return e.test(f.label||f.value||f)})}})})(jQuery); +(function(a){var g,d,c,e,f=function(){var b=a(this).find(":ui-button");setTimeout(function(){b.button("refresh")},1)},i=function(b){var h=b.name,k=b.form,l=a([]);if(h)l=k?a(k).find("[name='"+h+"']"):a("[name='"+h+"']",b.ownerDocument).filter(function(){return!this.form});return l};a.widget("ui.button",{version:"1.9pre",defaultElement:"').addClass(this._triggerClass).html(j==""?k:a("").attr({src:j,alt:k,title:k})));b[l?"before":"after"](h.trigger);h.trigger.click(function(){a.datepicker._datepickerShowing&&a.datepicker._lastInput==b[0]?a.datepicker._hideDatepicker(): +a.datepicker._showDatepicker(b[0]);return false})}},_autoSize:function(b){if(this._get(b,"autoSize")&&!b.inline){var h=new Date(2009,11,20),k=this._get(b,"dateFormat");if(k.match(/[DM]/)){var l=function(j){for(var m=0,n=0,o=0;om){m=j[o].length;n=o}return n};h.setMonth(l(this._get(b,k.match(/MM/)?"monthNames":"monthNamesShort")));h.setDate(l(this._get(b,k.match(/DD/)?"dayNames":"dayNamesShort"))+20-h.getDay())}b.input.attr("size",this._formatDate(b,h).length)}},_inlineDatepicker:function(b, +h){var k=a(b);if(!k.hasClass(this.markerClassName)){k.addClass(this.markerClassName).append(h.dpDiv).bind("setData.datepicker",function(l,j,m){h.settings[j]=m}).bind("getData.datepicker",function(l,j){return this._get(h,j)});a.data(b,"datepicker",h);this._setDate(h,this._getDefaultDate(h),true);this._updateDatepicker(h);this._updateAlternate(h);h.settings.disabled&&this._disableDatepicker(b);h.dpDiv.css("display","block")}},_dialogDatepicker:function(b,h,k,l,j){b=this._dialogInst;if(!b){this.uuid+= +1;this._dialogInput=a('');this._dialogInput.keydown(this._doKeyDown);a("body").append(this._dialogInput);b=this._dialogInst=this._newInst(this._dialogInput,false);b.settings={};a.data(this._dialogInput[0],"datepicker",b)}e(b.settings,l||{});h=h&&h.constructor==Date?this._formatDate(b,h):h;this._dialogInput.val(h);this._pos=j?j.length?j:[j.pageX,j.pageY]:null;if(!this._pos)this._pos=[document.documentElement.clientWidth/ +2-100+(document.documentElement.scrollLeft||document.body.scrollLeft),document.documentElement.clientHeight/2-150+(document.documentElement.scrollTop||document.body.scrollTop)];this._dialogInput.css("left",this._pos[0]+20+"px").css("top",this._pos[1]+"px");b.settings.onSelect=k;this._inDialog=true;this.dpDiv.addClass(this._dialogClass);this._showDatepicker(this._dialogInput[0]);a.blockUI&&a.blockUI(this.dpDiv);a.data(this._dialogInput[0],"datepicker",b);return this},_destroyDatepicker:function(b){var h= +a(b),k=a.data(b,"datepicker");if(h.hasClass(this.markerClassName)){var l=b.nodeName.toLowerCase();a.removeData(b,"datepicker");if(l=="input"){k.append.remove();k.trigger.remove();h.removeClass(this.markerClassName).unbind("focus",this._showDatepicker).unbind("keydown",this._doKeyDown).unbind("keypress",this._doKeyPress).unbind("keyup",this._doKeyUp)}else if(l=="div"||l=="span")h.removeClass(this.markerClassName).empty()}},_enableDatepicker:function(b){var h=a(b),k=a.data(b,"datepicker");if(h.hasClass(this.markerClassName)){var l= +b.nodeName.toLowerCase();if(l=="input"){b.disabled=false;k.trigger.filter("button").each(function(){this.disabled=false}).end().filter("img").css({opacity:"1.0",cursor:""})}else if(l=="div"||l=="span"){h=h.children("."+this._inlineClass);h.children().removeClass("ui-state-disabled");h.find("select.ui-datepicker-month, select.ui-datepicker-year").prop("disabled",false)}this._disabledInputs=a.map(this._disabledInputs,function(j){return j==b?null:j})}},_disableDatepicker:function(b){var h=a(b),k=a.data(b, +"datepicker");if(h.hasClass(this.markerClassName)){var l=b.nodeName.toLowerCase();if(l=="input"){b.disabled=true;k.trigger.filter("button").each(function(){this.disabled=true}).end().filter("img").css({opacity:"0.5",cursor:"default"})}else if(l=="div"||l=="span"){h=h.children("."+this._inlineClass);h.children().addClass("ui-state-disabled");h.find("select.ui-datepicker-month, select.ui-datepicker-year").prop("disabled",true)}this._disabledInputs=a.map(this._disabledInputs,function(j){return j==b? +null:j});this._disabledInputs[this._disabledInputs.length]=b}},_isDisabledDatepicker:function(b){if(!b)return false;for(var h=0;h-1}},_doKeyUp:function(b){b=a.datepicker._getInst(b.target);if(b.input.val()!=b.lastVal)try{if(a.datepicker.parseDate(a.datepicker._get(b,"dateFormat"),b.input?b.input.val():null,a.datepicker._getFormatConfig(b))){a.datepicker._setDateFromField(b);a.datepicker._updateAlternate(b);a.datepicker._updateDatepicker(b)}}catch(h){a.datepicker.log(h)}return true},_showDatepicker:function(b){b=b.target||b;if(b.nodeName.toLowerCase()!= +"input")b=a("input",b.parentNode)[0];if(!(a.datepicker._isDisabledDatepicker(b)||a.datepicker._lastInput==b)){var h=a.datepicker._getInst(b);if(a.datepicker._curInst&&a.datepicker._curInst!=h){a.datepicker._curInst.dpDiv.stop(true,true);h&&a.datepicker._datepickerShowing&&a.datepicker._hideDatepicker(a.datepicker._curInst.input[0])}var k=a.datepicker._get(h,"beforeShow");k=k?k.apply(b,[b,h]):{};if(k!==false){e(h.settings,k);h.lastVal=null;a.datepicker._lastInput=b;a.datepicker._setDateFromField(h); +if(a.datepicker._inDialog)b.value="";if(!a.datepicker._pos){a.datepicker._pos=a.datepicker._findPos(b);a.datepicker._pos[1]+=b.offsetHeight}var l=false;a(b).parents().each(function(){l|=a(this).css("position")=="fixed";return!l});if(l&&a.browser.opera){a.datepicker._pos[0]-=document.documentElement.scrollLeft;a.datepicker._pos[1]-=document.documentElement.scrollTop}k={left:a.datepicker._pos[0],top:a.datepicker._pos[1]};a.datepicker._pos=null;h.dpDiv.empty();h.dpDiv.css({position:"absolute",display:"block", +top:"-1000px"});a.datepicker._updateDatepicker(h);k=a.datepicker._checkOffset(h,k,l);h.dpDiv.css({position:a.datepicker._inDialog&&a.blockUI?"static":l?"fixed":"absolute",display:"none",left:k.left+"px",top:k.top+"px"});if(!h.inline){k=a.datepicker._get(h,"showAnim");var j=a.datepicker._get(h,"duration"),m=function(){var n=h.dpDiv.find("iframe.ui-datepicker-cover");if(n.length){var o=a.datepicker._getBorders(h.dpDiv);n.css({left:-o[0],top:-o[1],width:h.dpDiv.outerWidth(),height:h.dpDiv.outerHeight()})}}; +h.dpDiv.zIndex(a(b).zIndex()+1);a.datepicker._datepickerShowing=true;if(a.effects&&(a.effects.effect[k]||a.effects[k]))h.dpDiv.show(k,a.datepicker._get(h,"showOptions"),j,m);else h.dpDiv[k||"show"](k?j:null,m);if(!k||!j)m();h.input.is(":visible")&&!h.input.is(":disabled")&&h.input.focus();a.datepicker._curInst=h}}}},_updateDatepicker:function(b){this.maxRows=4;var h=a.datepicker._getBorders(b.dpDiv);i=b;b.dpDiv.empty().append(this._generateHTML(b));var k=b.dpDiv.find("iframe.ui-datepicker-cover"); +k.length&&k.css({left:-h[0],top:-h[1],width:b.dpDiv.outerWidth(),height:b.dpDiv.outerHeight()});b.dpDiv.find("."+this._dayOverClass+" a").mouseover();h=this._getNumberOfMonths(b);k=h[1];b.dpDiv.removeClass("ui-datepicker-multi-2 ui-datepicker-multi-3 ui-datepicker-multi-4").width("");k>1&&b.dpDiv.addClass("ui-datepicker-multi-"+k).css("width",17*k+"em");b.dpDiv[(h[0]!=1||h[1]!=1?"add":"remove")+"Class"]("ui-datepicker-multi");b.dpDiv[(this._get(b,"isRTL")?"add":"remove")+"Class"]("ui-datepicker-rtl"); +b==a.datepicker._curInst&&a.datepicker._datepickerShowing&&b.input&&b.input.is(":visible")&&!b.input.is(":disabled")&&b.input[0]!=document.activeElement&&b.input.focus();if(b.yearshtml){var l=b.yearshtml;setTimeout(function(){l===b.yearshtml&&b.yearshtml&&b.dpDiv.find("select.ui-datepicker-year:first").replaceWith(b.yearshtml);l=b.yearshtml=null},0)}},_getBorders:function(b){var h=function(k){return{thin:1,medium:2,thick:3}[k]||k};return[parseFloat(h(b.css("border-left-width"))),parseFloat(h(b.css("border-top-width")))]}, +_checkOffset:function(b,h,k){var l=b.dpDiv.outerWidth(),j=b.dpDiv.outerHeight(),m=b.input?b.input.outerWidth():0,n=b.input?b.input.outerHeight():0,o=document.documentElement.clientWidth+a(document).scrollLeft(),p=document.documentElement.clientHeight+a(document).scrollTop();h.left-=this._get(b,"isRTL")?l-m:0;h.left-=k&&h.left==b.input.offset().left?a(document).scrollLeft():0;h.top-=k&&h.top==b.input.offset().top+n?a(document).scrollTop():0;h.left-=Math.min(h.left,h.left+l>o&&o>l?Math.abs(h.left+l- +o):0);h.top-=Math.min(h.top,h.top+j>p&&p>j?Math.abs(j+n):0);return h},_findPos:function(b){for(var h=this._get(this._getInst(b),"isRTL");b&&(b.type=="hidden"||b.nodeType!=1||a.expr.filters.hidden(b));)b=b[h?"previousSibling":"nextSibling"];b=a(b).offset();return[b.left,b.top]},_hideDatepicker:function(b){var h=this._curInst;if(!(!h||b&&h!=a.data(b,"datepicker")))if(this._datepickerShowing){b=this._get(h,"showAnim");var k=this._get(h,"duration"),l=function(){a.datepicker._tidyDialog(h);this._curInst= +null};if(a.effects&&(a.effects.effect[b]||a.effects[b]))h.dpDiv.hide(b,a.datepicker._get(h,"showOptions"),k,l);else h.dpDiv[b=="slideDown"?"slideUp":b=="fadeIn"?"fadeOut":"hide"](b?k:null,l);b||l();this._datepickerShowing=false;if(b=this._get(h,"onClose"))b.apply(h.input?h.input[0]:null,[h.input?h.input.val():"",h]);this._lastInput=null;if(this._inDialog){this._dialogInput.css({position:"absolute",left:"0",top:"-100px"});if(a.blockUI){a.unblockUI();a("body").append(this.dpDiv)}}this._inDialog=false}}, +_tidyDialog:function(b){b.dpDiv.removeClass(this._dialogClass).unbind(".ui-datepicker-calendar")},_checkExternalClick:function(b){if(a.datepicker._curInst){b=a(b.target);var h=a.datepicker._getInst(b[0]);if(b[0].id!=a.datepicker._mainDivId&&b.parents("#"+a.datepicker._mainDivId).length==0&&!b.hasClass(a.datepicker.markerClassName)&&!b.hasClass(a.datepicker._triggerClass)&&a.datepicker._datepickerShowing&&!(a.datepicker._inDialog&&a.blockUI)||b.hasClass(a.datepicker.markerClassName)&&a.datepicker._curInst!= +h)a.datepicker._hideDatepicker()}},_adjustDate:function(b,h,k){b=a(b);var l=this._getInst(b[0]);if(!this._isDisabledDatepicker(b[0])){this._adjustInstDate(l,h+(k=="M"?this._get(l,"showCurrentAtPos"):0),k);this._updateDatepicker(l)}},_gotoToday:function(b){b=a(b);var h=this._getInst(b[0]);if(this._get(h,"gotoCurrent")&&h.currentDay){h.selectedDay=h.currentDay;h.drawMonth=h.selectedMonth=h.currentMonth;h.drawYear=h.selectedYear=h.currentYear}else{var k=new Date;h.selectedDay=k.getDate();h.drawMonth= +h.selectedMonth=k.getMonth();h.drawYear=h.selectedYear=k.getFullYear()}this._notifyChange(h);this._adjustDate(b)},_selectMonthYear:function(b,h,k){b=a(b);var l=this._getInst(b[0]);l["selected"+(k=="M"?"Month":"Year")]=l["draw"+(k=="M"?"Month":"Year")]=parseInt(h.options[h.selectedIndex].value,10);this._notifyChange(l);this._adjustDate(b)},_selectDay:function(b,h,k,l){var j=a(b);if(!(a(l).hasClass(this._unselectableClass)||this._isDisabledDatepicker(j[0]))){j=this._getInst(j[0]);j.selectedDay=j.currentDay= +a("a",l).html();j.selectedMonth=j.currentMonth=h;j.selectedYear=j.currentYear=k;this._selectDate(b,this._formatDate(j,j.currentDay,j.currentMonth,j.currentYear))}},_clearDate:function(b){b=a(b);this._getInst(b[0]);this._selectDate(b,"")},_selectDate:function(b,h){var k=this._getInst(a(b)[0]);h=h!=null?h:this._formatDate(k);k.input&&k.input.val(h);this._updateAlternate(k);var l=this._get(k,"onSelect");if(l)l.apply(k.input?k.input[0]:null,[h,k]);else k.input&&k.input.trigger("change");if(k.inline)this._updateDatepicker(k); +else{this._hideDatepicker();this._lastInput=k.input[0];typeof k.input[0]!="object"&&k.input.focus();this._lastInput=null}},_updateAlternate:function(b){var h=this._get(b,"altField");if(h){var k=this._get(b,"altFormat")||this._get(b,"dateFormat"),l=this._getDate(b),j=this.formatDate(k,l,this._getFormatConfig(b));a(h).each(function(){a(this).val(j)})}},noWeekends:function(b){b=b.getDay();return[b>0&&b<6,""]},iso8601Week:function(b){b=new Date(b.getTime());b.setDate(b.getDate()+4-(b.getDay()||7));var h= +b.getTime();b.setMonth(0);b.setDate(1);return Math.floor(Math.round((h-b)/864E5)/7)+1},parseDate:function(b,h,k){if(b==null||h==null)throw"Invalid arguments";h=typeof h=="object"?h.toString():h+"";if(h=="")return null;var l=(k?k.shortYearCutoff:null)||this._defaults.shortYearCutoff;l=typeof l!="string"?l:(new Date).getFullYear()%100+parseInt(l,10);for(var j=(k?k.dayNamesShort:null)||this._defaults.dayNamesShort,m=(k?k.dayNames:null)||this._defaults.dayNames,n=(k?k.monthNamesShort:null)||this._defaults.monthNamesShort, +o=(k?k.monthNames:null)||this._defaults.monthNames,p=k=-1,q=-1,u=-1,s=false,r=function(y){(y=C+1-1){p=1;q=u;do{l=this._getDaysInMonth(k,p-1); +if(q<=l)break;p++;q-=l}while(1)}A=this._daylightSavingAdjust(new Date(k,p-1,q));if(A.getFullYear()!=k||A.getMonth()+1!=p||A.getDate()!=q)throw"Invalid date";return A},ATOM:"yy-mm-dd",COOKIE:"D, dd M yy",ISO_8601:"yy-mm-dd",RFC_822:"D, d M y",RFC_850:"DD, dd-M-y",RFC_1036:"D, d M y",RFC_1123:"D, d M yy",RFC_2822:"D, d M yy",RSS:"D, d M y",TICKS:"!",TIMESTAMP:"@",W3C:"yy-mm-dd",_ticksTo1970:(718685+Math.floor(492.5)-Math.floor(19.7)+Math.floor(4.925))*864E9,formatDate:function(b,h,k){if(!h)return""; +var l=(k?k.dayNamesShort:null)||this._defaults.dayNamesShort,j=(k?k.dayNames:null)||this._defaults.dayNames,m=(k?k.monthNamesShort:null)||this._defaults.monthNamesShort;k=(k?k.monthNames:null)||this._defaults.monthNames;var n=function(r){(r=s+112?b.getHours()+2:0);return b},_setDate:function(b,h,k){var l=!h,j=b.selectedMonth,m=b.selectedYear;h=this._restrictMinMax(b,this._determineDate(b,h,new Date));b.selectedDay=b.currentDay=h.getDate();b.drawMonth=b.selectedMonth=b.currentMonth=h.getMonth();b.drawYear=b.selectedYear=b.currentYear=h.getFullYear();if((j!=b.selectedMonth||m!=b.selectedYear)&& +!k)this._notifyChange(b);this._adjustInstDate(b);if(b.input)b.input.val(l?"":this._formatDate(b))},_getDate:function(b){return!b.currentYear||b.input&&b.input.val()==""?null:this._daylightSavingAdjust(new Date(b.currentYear,b.currentMonth,b.currentDay))},_generateHTML:function(b){var h=new Date;h=this._daylightSavingAdjust(new Date(h.getFullYear(),h.getMonth(),h.getDate()));var k=this._get(b,"isRTL"),l=this._get(b,"showButtonPanel"),j=this._get(b,"hideIfNoPrevNext"),m=this._get(b,"navigationAsDateFormat"), +n=this._getNumberOfMonths(b),o=this._get(b,"showCurrentAtPos"),p=this._get(b,"stepMonths"),q=n[0]!=1||n[1]!=1,u=this._daylightSavingAdjust(!b.currentDay?new Date(9999,9,9):new Date(b.currentYear,b.currentMonth,b.currentDay)),s=this._getMinMaxDate(b,"min"),r=this._getMinMaxDate(b,"max");o=b.drawMonth-o;var t=b.drawYear;if(o<0){o+=12;t--}if(r){var v=this._daylightSavingAdjust(new Date(r.getFullYear(),r.getMonth()-n[0]*n[1]+1,r.getDate()));for(v=s&&v +v;){o--;if(o<0){o=11;t--}}}b.drawMonth=o;b.drawYear=t;v=this._get(b,"prevText");v=!m?v:this.formatDate(v,this._daylightSavingAdjust(new Date(t,o-p,1)),this._getFormatConfig(b));v=this._canAdjustMonth(b,-1,t,o)?''+v+"":j?"":''+v+"";var w=this._get(b,"nextText");w=!m?w:this.formatDate(w,this._daylightSavingAdjust(new Date(t,o+p,1)),this._getFormatConfig(b));j=this._canAdjustMonth(b,+1,t,o)?''+w+"":j?"":''+w+"";p=this._get(b,"currentText");w=this._get(b,"gotoCurrent")&&b.currentDay?u:h;p=!m?p:this.formatDate(p,w,this._getFormatConfig(b));m=!b.inline?'":"";l=l?'
    '+(k?m:"")+(this._isInRange(b, +w)?'":"")+(k?"":m)+"
    ":"";m=parseInt(this._get(b,"firstDay"),10);m=isNaN(m)?0:m;p=this._get(b,"showWeek");w=this._get(b,"dayNames");this._get(b,"dayNamesShort");var x=this._get(b,"dayNamesMin"),C=this._get(b,"monthNames"),A=this._get(b,"monthNamesShort"),y=this._get(b,"beforeShowDay"),D=this._get(b,"showOtherMonths"), +J=this._get(b,"selectOtherMonths");this._get(b,"calculateWeek");for(var I=this._getDefaultDate(b),H="",E=0;E1)switch(M){case 0:F+=" ui-datepicker-group-first";B=" ui-corner-"+(k?"right":"left");break;case n[1]-1:F+=" ui-datepicker-group-last";B=" ui-corner-"+(k?"left":"right");break;default:F+=" ui-datepicker-group-middle"; +B=""}F+='">'}F+='
    '+(/all|left/.test(B)&&E==0?k?j:v:"")+(/all|right/.test(B)&&E==0?k?v:j:"")+this._generateMonthYearHeader(b,o,t,s,r,E>0||M>0,C,A)+'
    ';var G=p?'":"";for(B=0;B<7;B++){var z=(B+m)%7;G+="=5?' class="ui-datepicker-week-end"':"")+'>'+x[z]+""}F+= +G+"";G=this._getDaysInMonth(t,o);if(t==b.selectedYear&&o==b.selectedMonth)b.selectedDay=Math.min(b.selectedDay,G);B=(this._getFirstDayOfMonth(t,o)-m+7)%7;G=Math.ceil((B+G)/7);this.maxRows=G=q?this.maxRows>G?this.maxRows:G:G;z=this._daylightSavingAdjust(new Date(t,o,1-B));for(var Q=0;Q";var R=!p?"":'";for(B=0;B<7;B++){var N=y?y.apply(b.input?b.input[0]:null,[z]):[true,""],L=z.getMonth()!= +o,O=L&&!J||!N[0]||s&&zr;R+='";z.setDate(z.getDate()+1);z=this._daylightSavingAdjust(z)}F+=R+""}o++;if(o>11){o=0;t++}F+="
    '+this._get(b,"weekHeader")+"
    '+this._get(b,"calculateWeek")(z)+""+(L&&!D?" ":O?''+z.getDate()+"":''+z.getDate()+"")+"
    "+(q?""+ +(n[0]>0&&M==n[1]-1?'
    ':""):"");K+=F}H+=K}H+=l+(a.browser.msie&&parseInt(a.browser.version,10)<7&&!b.inline?'':"");b._keyEvent=false;return H},_generateMonthYearHeader:function(b,h,k,l,j,m,n,o){var p=this._get(b,"changeMonth"),q=this._get(b,"changeYear"),u=this._get(b,"showMonthAfterYear"),s='
    ',r="";if(m||!p)r+=''+ +n[h]+"";else{n=l&&l.getFullYear()==k;var t=j&&j.getFullYear()==k;r+='"}u||(s+=r+(m||!(p&&q)?" ":""));if(!b.yearshtml){b.yearshtml="";if(m||!q)s+=''+k+"";else{o=this._get(b, +"yearRange").split(":");var w=(new Date).getFullYear();n=function(x){x=x.match(/c[+-].*/)?k+parseInt(x.substring(1),10):x.match(/[+-].*/)?w+parseInt(x,10):parseInt(x,10);return isNaN(x)?w:x};h=n(o[0]);o=Math.max(h,n(o[1]||""));h=l?Math.max(h,l.getFullYear()):h;o=j?Math.min(o,j.getFullYear()):o;for(b.yearshtml+='";s+=b.yearshtml;b.yearshtml=null}}s+=this._get(b,"yearSuffix");if(u)s+=(m||!(p&&q)?" ":"")+r;s+="
    ";return s},_adjustInstDate:function(b,h,k){var l=b.drawYear+(k=="Y"?h:0),j=b.drawMonth+(k=="M"?h:0);h=Math.min(b.selectedDay,this._getDaysInMonth(l,j))+(k=="D"?h:0);l=this._restrictMinMax(b,this._daylightSavingAdjust(new Date(l,j,h)));b.selectedDay=l.getDate();b.drawMonth=b.selectedMonth=l.getMonth();b.drawYear=b.selectedYear=l.getFullYear();if(k== +"M"||k=="Y")this._notifyChange(b)},_restrictMinMax:function(b,h){var k=this._getMinMaxDate(b,"min"),l=this._getMinMaxDate(b,"max");k=k&&hl?l:k},_notifyChange:function(b){var h=this._get(b,"onChangeMonthYear");if(h)h.apply(b.input?b.input[0]:null,[b.selectedYear,b.selectedMonth+1,b])},_getNumberOfMonths:function(b){b=this._get(b,"numberOfMonths");return b==null?[1,1]:typeof b=="number"?[1,b]:b},_getMinMaxDate:function(b,h){return this._determineDate(b,this._get(b,h+"Date"),null)}, +_getDaysInMonth:function(b,h){return 32-this._daylightSavingAdjust(new Date(b,h,32)).getDate()},_getFirstDayOfMonth:function(b,h){return(new Date(b,h,1)).getDay()},_canAdjustMonth:function(b,h,k,l){var j=this._getNumberOfMonths(b);k=this._daylightSavingAdjust(new Date(k,l+(h<0?h:j[0]*j[1]),1));h<0&&k.setDate(this._getDaysInMonth(k.getFullYear(),k.getMonth()));return this._isInRange(b,k)},_isInRange:function(b,h){var k=this._getMinMaxDate(b,"min"),l=this._getMinMaxDate(b,"max");return(!k||h.getTime()>= +k.getTime())&&(!l||h.getTime()<=l.getTime())},_getFormatConfig:function(b){var h=this._get(b,"shortYearCutoff");h=typeof h!="string"?h:(new Date).getFullYear()%100+parseInt(h,10);return{shortYearCutoff:h,dayNamesShort:this._get(b,"dayNamesShort"),dayNames:this._get(b,"dayNames"),monthNamesShort:this._get(b,"monthNamesShort"),monthNames:this._get(b,"monthNames")}},_formatDate:function(b,h,k,l){if(!h){b.currentDay=b.selectedDay;b.currentMonth=b.selectedMonth;b.currentYear=b.selectedYear}h=h?typeof h== +"object"?h:this._daylightSavingAdjust(new Date(l,k,h)):this._daylightSavingAdjust(new Date(b.currentYear,b.currentMonth,b.currentDay));return this.formatDate(this._get(b,"dateFormat"),h,this._getFormatConfig(b))}});a.fn.datepicker=function(b){if(!this.length)return this;if(!a.datepicker.initialized){a(document).mousedown(a.datepicker._checkExternalClick).find("body").append(a.datepicker.dpDiv);a.datepicker.initialized=true}var h=Array.prototype.slice.call(arguments,1);if(typeof b=="string"&&(b=="isDisabled"|| +b=="getDate"||b=="widget"))return a.datepicker["_"+b+"Datepicker"].apply(a.datepicker,[this[0]].concat(h));if(b=="option"&&arguments.length==2&&typeof arguments[1]=="string")return a.datepicker["_"+b+"Datepicker"].apply(a.datepicker,[this[0]].concat(h));return this.each(function(){typeof b=="string"?a.datepicker["_"+b+"Datepicker"].apply(a.datepicker,[this].concat(h)):a.datepicker._attachDatepicker(this,b)})};a.datepicker=new d;a.datepicker.initialized=false;a.datepicker.uuid=(new Date).getTime(); +a.datepicker.version="1.9pre";window["DP_jQuery_"+f]=a})(jQuery); +(function(a,g){var d={buttons:true,height:true,maxHeight:true,maxWidth:true,minHeight:true,minWidth:true,width:true},c={maxHeight:true,maxWidth:true,minHeight:true,minWidth:true};a.widget("ui.dialog",{version:"1.9pre",options:{autoOpen:true,buttons:{},closeOnEscape:true,closeText:"close",dialogClass:"",draggable:true,hide:null,height:"auto",maxHeight:false,maxWidth:false,minHeight:150,minWidth:150,modal:false,position:{my:"center",at:"center",of:window,collision:"fit",using:function(e){var f=a(this).css(e).offset().top; +f<0&&a(this).css("top",e.top-f)}},resizable:true,show:null,stack:true,title:"",width:300,zIndex:1E3},_create:function(){this.originalTitle=this.element.attr("title");if(typeof this.originalTitle!=="string")this.originalTitle="";this.options.title=this.options.title||this.originalTitle;var e=this,f=e.options,i=f.title||" ",b=a.ui.dialog.getTitleId(e.element),h=(e.uiDialog=a("
    ")).addClass("ui-dialog ui-widget ui-widget-content ui-corner-all "+f.dialogClass).css({display:"none",outline:0,zIndex:f.zIndex}).attr("tabIndex", +-1).keydown(function(j){if(f.closeOnEscape&&!j.isDefaultPrevented()&&j.keyCode&&j.keyCode===a.ui.keyCode.ESCAPE){e.close(j);j.preventDefault()}}).attr({role:"dialog","aria-labelledby":b}).mousedown(function(j){e.moveToTop(false,j)}).appendTo("body");e.element.show().removeAttr("title").addClass("ui-dialog-content ui-widget-content").appendTo(h);var k=(e.uiDialogTitlebar=a("
    ")).addClass("ui-dialog-titlebar ui-widget-header ui-corner-all ui-helper-clearfix").prependTo(h),l=a("").addClass("ui-dialog-titlebar-close ui-corner-all").attr("role", +"button").click(function(j){j.preventDefault();e.close(j)}).appendTo(k);(e.uiDialogTitlebarCloseText=a("")).addClass("ui-icon ui-icon-closethick").text(f.closeText).appendTo(l);a("").addClass("ui-dialog-title").attr("id",b).html(i).prependTo(k);k.find("*").add(k).disableSelection();this._hoverable(l);this._focusable(l);f.draggable&&a.fn.draggable&&e._makeDraggable();f.resizable&&a.fn.resizable&&e._makeResizable();e._createButtons(f.buttons);e._isOpen=false;a.fn.bgiframe&&h.bgiframe()}, +_init:function(){this.options.autoOpen&&this.open()},_destroy:function(){this.overlay&&this.overlay.destroy();this.uiDialog.hide();this.element.removeClass("ui-dialog-content ui-widget-content").hide().appendTo("body");this.uiDialog.remove();this.originalTitle&&this.element.attr("title",this.originalTitle)},widget:function(){return this.uiDialog},close:function(e){if(!this._isOpen)return f;var f=this,i,b;if(false!==f._trigger("beforeClose",e)){f._isOpen=false;f.overlay&&f.overlay.destroy();f.uiDialog.unbind("keypress.ui-dialog"); +if(f.options.hide)f.uiDialog.hide(f.options.hide,function(){f._trigger("close",e)});else{f.uiDialog.hide();f._trigger("close",e)}a.ui.dialog.overlay.resize();if(f.options.modal){i=0;a(".ui-dialog").each(function(){if(this!==f.uiDialog[0]){b=a(this).css("z-index");isNaN(b)||(i=Math.max(i,b))}});a.ui.dialog.maxZ=i}return f}},isOpen:function(){return this._isOpen},moveToTop:function(e,f){var i=this.options;if(i.modal&&!e||!i.stack&&!i.modal)return this._trigger("focus",f);if(i.zIndex>a.ui.dialog.maxZ)a.ui.dialog.maxZ= +i.zIndex;if(this.overlay){a.ui.dialog.maxZ+=1;a.ui.dialog.overlay.maxZ=a.ui.dialog.maxZ;this.overlay.$el.css("z-index",a.ui.dialog.overlay.maxZ)}i={scrollTop:this.element.scrollTop(),scrollLeft:this.element.scrollLeft()};a.ui.dialog.maxZ+=1;this.uiDialog.css("z-index",a.ui.dialog.maxZ);this.element.attr(i);this._trigger("focus",f);return this},open:function(){if(!this._isOpen){var e=this.options,f=this.uiDialog;this._size();this._position(e.position);f.show(e.show);this.overlay=e.modal?new a.ui.dialog.overlay(this): +null;this.moveToTop(true);e.modal&&f.bind("keydown.ui-dialog",function(i){if(i.keyCode===a.ui.keyCode.TAB){var b=a(":tabbable",this),h=b.filter(":first");b=b.filter(":last");if(i.target===b[0]&&!i.shiftKey){h.focus(1);return false}else if(i.target===h[0]&&i.shiftKey){b.focus(1);return false}}});e=this.element.find(":tabbable");if(!e.length){e=f.find(".ui-dialog-buttonpane :tabbable");e.length||(e=f)}e.eq(0).focus();this._isOpen=true;this._trigger("open");return this}},_createButtons:function(e){var f= +this,i=false;f.uiDialog.find(".ui-dialog-buttonpane").remove();typeof e==="object"&&e!==null&&a.each(e,function(){return!(i=true)});if(i){var b=a("
    ").addClass("ui-dialog-buttonpane ui-widget-content ui-helper-clearfix"),h=a("
    ").addClass("ui-dialog-buttonset").appendTo(b);a.each(e,function(k,l){l=a.isFunction(l)?{click:l,text:k}:l;var j=a("
    ").appendTo(this.element);this.oldValue=this._value();this._refreshValue()},_destroy:function(){this.element.removeClass("ui-progressbar ui-widget ui-widget-content ui-corner-all").removeAttr("role").removeAttr("aria-valuemin").removeAttr("aria-valuemax").removeAttr("aria-valuenow"); +this.valueDiv.remove()},value:function(d){if(d===g)return this._value();this._setOption("value",d);return this},_setOption:function(d,c){if(d==="value"){this.options.value=c;this._refreshValue();this._value()===this.options.max&&this._trigger("complete")}this._super("_setOption",d,c)},_value:function(){var d=this.options.value;if(typeof d!=="number")d=0;return Math.min(this.options.max,Math.max(this.min,d))},_percentage:function(){return 100*this._value()/this.options.max},_refreshValue:function(){var d= +this.value(),c=this._percentage();if(this.oldValue!==d){this.oldValue=d;this._trigger("change")}this.valueDiv.toggle(d>this.min).toggleClass("ui-corner-right",d===this.options.max).width(c.toFixed(0)+"%");this.element.attr("aria-valuenow",d)}})})(jQuery); +(function(a){a.widget("ui.slider",a.ui.mouse,{version:"1.9pre",widgetEventPrefix:"slide",options:{animate:false,distance:0,max:100,min:0,orientation:"horizontal",range:false,step:1,value:0,values:null},_create:function(){var g=this,d=this.options,c=this.element.find(".ui-slider-handle").addClass("ui-state-default ui-corner-all"),e=d.values&&d.values.length||1,f=[];this._mouseSliding=this._keySliding=false;this._animateOff=true;this._handleIndex=null;this._detectOrientation();this._mouseInit();this.element.addClass("ui-slider ui-slider-"+ +this.orientation+" ui-widget ui-widget-content ui-corner-all"+(d.disabled?" ui-slider-disabled ui-disabled":""));this.range=a([]);if(d.range){if(d.range===true){if(!d.values)d.values=[this._valueMin(),this._valueMin()];if(d.values.length&&d.values.length!==2)d.values=[d.values[0],d.values[0]]}this.range=a("
    ").appendTo(this.element).addClass("ui-slider-range ui-widget-header"+(d.range==="min"||d.range==="max"?" ui-slider-range-"+d.range:""))}for(var i=c.length;i"); +this.handles=c.add(a(f.join("")).appendTo(g.element));this.handle=this.handles.eq(0);this.handles.add(this.range).filter("a").click(function(b){b.preventDefault()}).hover(function(){d.disabled||a(this).addClass("ui-state-hover")},function(){a(this).removeClass("ui-state-hover")}).focus(function(){if(d.disabled)a(this).blur();else{a(".ui-slider .ui-state-focus").removeClass("ui-state-focus");a(this).addClass("ui-state-focus")}}).blur(function(){a(this).removeClass("ui-state-focus")});this.handles.each(function(b){a(this).data("index.ui-slider-handle", +b)});this.handles.keydown(function(b){var h=true,k=a(this).data("index.ui-slider-handle"),l,j,m;if(!g.options.disabled){switch(b.keyCode){case a.ui.keyCode.HOME:case a.ui.keyCode.END:case a.ui.keyCode.PAGE_UP:case a.ui.keyCode.PAGE_DOWN:case a.ui.keyCode.UP:case a.ui.keyCode.RIGHT:case a.ui.keyCode.DOWN:case a.ui.keyCode.LEFT:h=false;if(!g._keySliding){g._keySliding=true;a(this).addClass("ui-state-active");l=g._start(b,k);if(l===false)return}}m=g.options.step;l=g.options.values&&g.options.values.length? +j=g.values(k):j=g.value();switch(b.keyCode){case a.ui.keyCode.HOME:j=g._valueMin();break;case a.ui.keyCode.END:j=g._valueMax();break;case a.ui.keyCode.PAGE_UP:j=g._trimAlignValue(l+(g._valueMax()-g._valueMin())/5);break;case a.ui.keyCode.PAGE_DOWN:j=g._trimAlignValue(l-(g._valueMax()-g._valueMin())/5);break;case a.ui.keyCode.UP:case a.ui.keyCode.RIGHT:if(l===g._valueMax())return;j=g._trimAlignValue(l+m);break;case a.ui.keyCode.DOWN:case a.ui.keyCode.LEFT:if(l===g._valueMin())return;j=g._trimAlignValue(l- +m)}g._slide(b,k,j);return h}}).keyup(function(b){var h=a(this).data("index.ui-slider-handle");if(g._keySliding){g._keySliding=false;g._stop(b,h);g._change(b,h);a(this).removeClass("ui-state-active")}});this._refreshValue();this._animateOff=false},destroy:function(){this.handles.remove();this.range.remove();this.element.removeClass("ui-slider ui-slider-horizontal ui-slider-vertical ui-slider-disabled ui-widget ui-widget-content ui-corner-all").removeData("slider").unbind(".slider");this._mouseDestroy(); +return this},_mouseCapture:function(g){var d=this.options,c,e,f,i,b;if(d.disabled)return false;this.elementSize={width:this.element.outerWidth(),height:this.element.outerHeight()};this.elementOffset=this.element.offset();c=this._normValueFromMouse({x:g.pageX,y:g.pageY});e=this._valueMax()-this._valueMin()+1;i=this;this.handles.each(function(h){var k=Math.abs(c-i.values(h));if(e>k){e=k;f=a(this);b=h}});if(d.range===true&&this.values(1)===d.min){b+=1;f=a(this.handles[b])}if(this._start(g,b)===false)return false; +this._mouseSliding=true;i._handleIndex=b;f.addClass("ui-state-active").focus();d=f.offset();this._clickOffset=!a(g.target).parents().andSelf().is(".ui-slider-handle")?{left:0,top:0}:{left:g.pageX-d.left-f.width()/2,top:g.pageY-d.top-f.height()/2-(parseInt(f.css("borderTopWidth"),10)||0)-(parseInt(f.css("borderBottomWidth"),10)||0)+(parseInt(f.css("marginTop"),10)||0)};this.handles.hasClass("ui-state-hover")||this._slide(g,b,c);return this._animateOff=true},_mouseStart:function(){return true},_mouseDrag:function(g){var d= +this._normValueFromMouse({x:g.pageX,y:g.pageY});this._slide(g,this._handleIndex,d);return false},_mouseStop:function(g){this.handles.removeClass("ui-state-active");this._mouseSliding=false;this._stop(g,this._handleIndex);this._change(g,this._handleIndex);this._clickOffset=this._handleIndex=null;return this._animateOff=false},_detectOrientation:function(){this.orientation=this.options.orientation==="vertical"?"vertical":"horizontal"},_normValueFromMouse:function(g){var d;if(this.orientation==="horizontal"){d= +this.elementSize.width;g=g.x-this.elementOffset.left-(this._clickOffset?this._clickOffset.left:0)}else{d=this.elementSize.height;g=g.y-this.elementOffset.top-(this._clickOffset?this._clickOffset.top:0)}d=g/d;if(d>1)d=1;if(d<0)d=0;if(this.orientation==="vertical")d=1-d;g=this._valueMax()-this._valueMin();return this._trimAlignValue(this._valueMin()+d*g)},_start:function(g,d){var c={handle:this.handles[d],value:this.value()};if(this.options.values&&this.options.values.length){c.value=this.values(d); +c.values=this.values()}return this._trigger("start",g,c)},_slide:function(g,d,c){var e;if(this.options.values&&this.options.values.length){e=this.values(d?0:1);if(this.options.values.length===2&&this.options.range===true&&(d===0&&c>e||d===1&&c1){this.options.values[g]=this._trimAlignValue(d);this._refreshValue();this._change(null,g)}else if(arguments.length)if(a.isArray(arguments[0])){c=this.options.values;e=arguments[0];for(f=0;f=this._valueMax())return this._valueMax();var d=this.options.step>0?this.options.step:1,c=(g-this._valueMin())%d;g-=c;if(Math.abs(c)*2>=d)g+=c>0?d:-d;return parseFloat(g.toFixed(5))},_valueMin:function(){return this.options.min},_valueMax:function(){return this.options.max},_refreshValue:function(){var g= +this.options.range,d=this.options,c=this,e=!this._animateOff?d.animate:false,f,i={},b,h,k,l;if(this.options.values&&this.options.values.length)this.handles.each(function(j){f=(c.values(j)-c._valueMin())/(c._valueMax()-c._valueMin())*100;i[c.orientation==="horizontal"?"left":"bottom"]=f+"%";a(this).stop(1,1)[e?"animate":"css"](i,d.animate);if(c.options.range===true)if(c.orientation==="horizontal"){if(j===0)c.range.stop(1,1)[e?"animate":"css"]({left:f+"%"},d.animate);if(j===1)c.range[e?"animate":"css"]({width:f- +b+"%"},{queue:false,duration:d.animate})}else{if(j===0)c.range.stop(1,1)[e?"animate":"css"]({bottom:f+"%"},d.animate);if(j===1)c.range[e?"animate":"css"]({height:f-b+"%"},{queue:false,duration:d.animate})}b=f});else{h=this.value();k=this._valueMin();l=this._valueMax();f=l!==k?(h-k)/(l-k)*100:0;i[c.orientation==="horizontal"?"left":"bottom"]=f+"%";this.handle.stop(1,1)[e?"animate":"css"](i,d.animate);if(g==="min"&&this.orientation==="horizontal")this.range.stop(1,1)[e?"animate":"css"]({width:f+"%"}, +d.animate);if(g==="max"&&this.orientation==="horizontal")this.range[e?"animate":"css"]({width:100-f+"%"},{queue:false,duration:d.animate});if(g==="min"&&this.orientation==="vertical")this.range.stop(1,1)[e?"animate":"css"]({height:f+"%"},d.animate);if(g==="max"&&this.orientation==="vertical")this.range[e?"animate":"css"]({height:100-f+"%"},{queue:false,duration:d.animate})}}})})(jQuery); +(function(a){function g(d){return function(){var c=this.element.val();d.apply(this,arguments);this._refresh();c!==this.element.val()&&this._trigger("change")}}a.widget("ui.spinner",{version:"1.9pre",defaultElement:"",widgetEventPrefix:"spin",options:{culture:null,incremental:true,max:null,min:null,numberFormat:null,page:10,step:1,change:null,spin:null,start:null,stop:null},_create:function(){this._value(this.element.val(),true);this._draw();this._bind(this._events);this._refresh()},_getCreateOptions:function(){var d= +{},c=this.element;a.each(["min","max","step"],function(e,f){var i=c.attr(f);if(i!==undefined&&i.length)d[f]=i});return d},_events:{keydown:function(d){this._start(d)&&this._keydown(d)&&d.preventDefault()},keyup:"_stop",focus:function(){this.uiSpinner.addClass("ui-state-active");this.previous=this.element.val()},blur:function(d){this._refresh();this.uiSpinner.removeClass("ui-state-active");this.previous!==this.element.val()&&this._trigger("change",d)},mousewheel:function(d,c){if(c){if(!this.spinning&& +!this._start(d))return false;this._spin((c>0?1:-1)*this.options.step,d);clearTimeout(this.mousewheelTimer);this.mousewheelTimer=setTimeout(function(){this.spinning&&this._stop(d)},100);d.preventDefault()}},"mousedown .ui-spinner-button":function(d){d.preventDefault();document.activeElement!==this.element[0]&&this.element.focus();if(this._start(d)!==false)this._repeat(null,a(d.currentTarget).hasClass("ui-spinner-up")?1:-1,d)},"mouseup .ui-spinner-button":"_stop","mouseenter .ui-spinner-button":function(d){if(a(d.currentTarget).hasClass("ui-state-active")){if(this._start(d)=== +false)return false;this._repeat(null,a(d.currentTarget).hasClass("ui-spinner-up")?1:-1,d)}},"mouseleave .ui-spinner-button":"_stop"},_draw:function(){var d=this.uiSpinner=this.element.addClass("ui-spinner-input").attr("autocomplete","off").wrap(this._uiSpinnerHtml()).parent().append(this._buttonHtml());this._hoverable(d);this.element.attr("role","spinbutton");this.buttons=d.find(".ui-spinner-button").attr("tabIndex",-1).button().removeClass("ui-corner-all");this.buttons.height()===d.height()&&d.height()> +0&&d.height(d.height());this.options.disabled&&this.disable()},_keydown:function(d){var c=this.options,e=a.ui.keyCode;switch(d.keyCode){case e.UP:this._repeat(null,1,d);return true;case e.DOWN:this._repeat(null,-1,d);return true;case e.PAGE_UP:this._repeat(null,c.page,d);return true;case e.PAGE_DOWN:this._repeat(null,-c.page,d);return true}return false},_uiSpinnerHtml:function(){return""},_buttonHtml:function(){return""}, +_start:function(d){if(!this.spinning&&this._trigger("start",d)===false)return false;if(!this.counter)this.counter=1;return this.spinning=true},_repeat:function(d,c,e){d=d||500;clearTimeout(this.timer);this.timer=this._delay(function(){this._repeat(40,c,e)},d);this._spin(c*this.options.step,e)},_spin:function(d,c){var e=this.value()||0;if(!this.counter)this.counter=1;e=this._adjustValue(e+d*this._increment(this.counter));if(!this.spinning||this._trigger("spin",c,{value:e})!==false){this._value(e); +this.counter++}},_increment:function(d){var c=this.options.incremental;if(c)return a.isFunction(c)?c(d):Math.floor(d*d*d/5E4-d*d/500+17*d/200+1);return 1},_precision:function(){var d=this._precisionOf(this.options.step);if(this.options.min!==null)d=Math.max(d,this._precisionOf(this.options.min));return d},_precisionOf:function(d){d=d.toString();var c=d.indexOf(".");return c===-1?0:d.length-c-1},_adjustValue:function(d){var c,e=this.options;c=e.min!==null?e.min:0;d=Math.round((d-c)/e.step)*e.step; +d=parseFloat((c+d).toFixed(this._precision()));if(e.max!==null&&d>e.max)return e.max;if(e.min!==null&&d1&&b.href.replace(f,"")===i}}();a.widget("ui.tabs",{version:"1.9pre",options:{active:null,collapsible:false,event:"click",fx:null,activate:null,beforeActivate:null,beforeLoad:null,load:null},_create:function(){var f=this,i=f.options,b=i.active;f.running=false;f.element.addClass("ui-tabs ui-widget ui-widget-content ui-corner-all");f._processTabs();if(b===null){location.hash&& +f.anchors.each(function(h,k){if(k.hash===location.hash){b=h;return false}});if(b===null)b=f.lis.filter(".ui-tabs-active").index();if(b===null||b===-1)b=f.lis.length?0:false}if(b!==false){b=this.lis.eq(b).index();if(b===-1)b=i.collapsible?false:0}i.active=b;if(!i.collapsible&&i.active===false&&this.anchors.length)i.active=0;if(a.isArray(i.disabled))i.disabled=a.unique(i.disabled.concat(a.map(this.lis.filter(".ui-state-disabled"),function(h){return f.lis.index(h)}))).sort();this._setupFx(i.fx);this._refresh(); +this.panels.hide();this.lis.removeClass("ui-tabs-active ui-state-active");if(i.active!==false&&this.anchors.length){this.active=this._findActive(i.active);f._getPanelForTab(this.active).show();this.lis.eq(i.active).addClass("ui-tabs-active ui-state-active");this.load(i.active)}else this.active=a()},_setOption:function(f,i){if(f=="active")this._activate(i);else if(f==="disabled")this._setupDisabled(i);else{this._super("_setOption",f,i);f==="collapsible"&&!i&&this.options.active===false&&this._activate(0); +f==="event"&&this._setupEvents(i);f==="fx"&&this._setupFx(i)}},_tabId:function(f){return a(f).attr("aria-controls")||"ui-tabs-"+ ++d},_sanitizeSelector:function(f){return f?f.replace(/[!"$%&'()*+,.\/:;<=>?@[\]^`{|}~]/g,"\\$&"):""},refresh:function(){var f=this.options,i=this.list.children(":has(a[href])");f.disabled=a.map(i.filter(".ui-state-disabled"),function(b){return i.index(b)});this._processTabs();this._refresh();this.panels.not(this._getPanelForTab(this.active)).hide();if(f.active===false|| +!this.anchors.length){f.active=false;this.active=a()}else if(this.active.length&&!a.contains(this.list[0],this.active[0])){f=f.active-1;this._activate(f>=0?f:0)}else f.active=this.anchors.index(this.active)},_refresh:function(){var f=this.options;this.element.toggleClass("ui-tabs-collapsible",f.collapsible);this.list.addClass("ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all");this.lis.addClass("ui-state-default ui-corner-top");this.panels.addClass("ui-tabs-panel ui-widget-content ui-corner-bottom"); +this._setupDisabled(f.disabled);this._setupEvents(f.event);this.lis.unbind(".tabs");this._focusable(this.lis);this._hoverable(this.lis)},_processTabs:function(){var f=this;this.list=this.element.find("ol,ul").eq(0);this.lis=a(" > li:has(a[href])",this.list);this.anchors=this.lis.map(function(){return a("a",this)[0]});this.panels=a([]);this.anchors.each(function(i,b){var h,k;if(c(b)){h=b.hash;k=f.element.find(f._sanitizeSelector(h))}else{var l=f._tabId(b);h="#"+l;k=f.element.find(h);if(!k.length){k= +f._createPanel(l);k.insertAfter(f.panels[i-1]||f.list)}}if(k.length)f.panels=f.panels.add(k);a(b).attr("aria-controls",h.substring(1))})},_createPanel:function(f){return a("
    ").attr("id",f).addClass("ui-tabs-panel ui-widget-content ui-corner-bottom").data("destroy.tabs",true)},_setupDisabled:function(f){if(a.isArray(f))if(f.length){if(f.length===this.anchors.length)f=true}else f=false;for(var i=0,b;b=this.lis[i];i++)a(b).toggleClass("ui-state-disabled",f===true||a.inArray(i,f)!==-1);this.options.disabled= +f},_setupFx:function(f){if(f)if(a.isArray(f)){this.hideFx=f[0];this.showFx=f[1]}else this.hideFx=this.showFx=f},_resetStyle:function(f,i){!a.support.opacity&&i.opacity&&f[0].style.removeAttribute("filter")},_setupEvents:function(f){this.anchors.unbind(".tabs");f&&this.anchors.bind(f.split(" ").join(".tabs ")+".tabs",a.proxy(this,"_eventHandler"));this.anchors.bind("click.tabs",function(i){i.preventDefault()})},_eventHandler:function(f){var i=this.options,b=this.active,h=a(f.currentTarget),k=h[0]=== +b[0],l=k&&i.collapsible,j=l?a():this._getPanelForTab(h),m=!b.length?a():this._getPanelForTab(b),n=h.closest("li");b={oldTab:b,oldPanel:m,newTab:l?a():h,newPanel:j};f.preventDefault();if(n.hasClass("ui-state-disabled")||n.hasClass("ui-tabs-loading")||this.running||k&&!i.collapsible||this._trigger("beforeActivate",f,b)===false)h[0].blur();else{i.active=l?false:this.anchors.index(h);this.active=k?a():h;this.xhr&&this.xhr.abort();if(!m.length&&!j.length)throw"jQuery UI Tabs: Mismatching fragment identifier."; +if(j.length){this.load(this.anchors.index(h),f);h[0].blur()}this._toggle(f,b)}},_toggle:function(f,i){function b(){k.running=false;k._trigger("activate",f,i)}function h(){i.newTab.closest("li").addClass("ui-tabs-active ui-state-active");if(l.length&&k.showFx)l.animate(k.showFx,k.showFx.duration||"normal",function(){k._resetStyle(a(this),k.showFx);b()});else{l.show();b()}}var k=this,l=i.newPanel,j=i.oldPanel;k.running=true;if(j.length&&k.hideFx)j.animate(k.hideFx,k.hideFx.duration||"normal",function(){i.oldTab.closest("li").removeClass("ui-tabs-active ui-state-active"); +k._resetStyle(a(this),k.hideFx);h()});else{i.oldTab.closest("li").removeClass("ui-tabs-active ui-state-active");j.hide();h()}},_activate:function(f){f=this._findActive(f)[0];if(f!==this.active[0]){f=f||this.active[0];this._eventHandler({target:f,currentTarget:f,preventDefault:a.noop})}},_findActive:function(f){return typeof f==="number"?this.anchors.eq(f):typeof f==="string"?this.anchors.filter("[href$='"+f+"']"):a()},_getIndex:function(f){if(typeof f=="string")f=this.anchors.index(this.anchors.filter("[href$="+ +f+"]"));return f},_destroy:function(){this.xhr&&this.xhr.abort();this.element.removeClass("ui-tabs ui-widget ui-widget-content ui-corner-all ui-tabs-collapsible");this.list.removeClass("ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all");this.anchors.unbind(".tabs").removeData("href.tabs").removeData("load.tabs");this.lis.unbind(".tabs").add(this.panels).each(function(){a.data(this,"destroy.tabs")?a(this).remove():a(this).removeClass("ui-state-default ui-corner-top ui-tabs-active ui-state-active ui-state-disabled ui-tabs-panel ui-widget-content ui-corner-bottom")}); +return this},enable:function(f){var i=this.options.disabled;if(i!==false){if(f===g)i=false;else{f=this._getIndex(f);i=a.isArray(i)?a.map(i,function(b){return b!==f?b:null}):a.map(this.lis,function(b,h){return h!==f?h:null})}this._setupDisabled(i)}},disable:function(f){var i=this.options.disabled;if(i!==true){if(f===g)i=true;else{f=this._getIndex(f);if(a.inArray(f,i)!==-1)return;i=a.isArray(i)?a.merge([f],i).sort():[f]}this._setupDisabled(i)}},load:function(f,i){f=this._getIndex(f);var b=this,h=this.anchors.eq(f), +k=b._getPanelForTab(h),l={tab:h,panel:k};if(!c(h[0])){if(this.xhr=a.ajax({url:h.attr("href"),beforeSend:function(j,m){return b._trigger("beforeLoad",i,a.extend({jqXHR:j,ajaxSettings:m},l))}})){this.lis.eq(f).addClass("ui-tabs-loading");this.xhr.success(function(j){setTimeout(function(){k.html(j);b._trigger("load",i,l)},1)}).complete(function(j,m){setTimeout(function(){m==="abort"&&b.panels.stop(false,true);b.lis.eq(f).removeClass("ui-tabs-loading");j===b.xhr&&delete b.xhr})})}return this}},_getPanelForTab:function(f){return this.element.find(this._sanitizeSelector("#"+ +a(f).attr("aria-controls")))}});if(a.uiBackCompat!==false){a.ui.tabs.prototype._ui=function(f,i){return{tab:f,panel:i,index:this.anchors.index(f)}};(function(f,i){i.url=function(b,h){this.anchors.eq(b).attr("href",h)}})(jQuery,jQuery.ui.tabs.prototype);(function(f,i){f.extend(i.options,{ajaxOptions:null,cache:false});var b=i._create,h=i._setOption,k=i._destroy,l=i.url||f.noop;f.extend(i,{_create:function(){b.call(this);var j=this;this.element.bind("tabsbeforeload.tabs",function(m,n){if(f.data(n.tab[0], +"cache.tabs"))m.preventDefault();else{f.extend(n.ajaxSettings,j.options.ajaxOptions,{error:function(o,p){try{j.options.ajaxOptions.error(o,p,n.tab.closest("li").index(),n.tab[0])}catch(q){}}});n.jqXHR.success(function(){j.options.cache&&f.data(n.tab[0],"cache.tabs",true)})}})},_setOption:function(j,m){j==="cache"&&m===false&&this.anchors.removeData("cache.tabs");h.apply(this,arguments)},_destroy:function(){this.anchors.removeData("cache.tabs");k.call(this)},url:function(j){this.anchors.eq(j).removeData("cache.tabs"); +l.apply(this,arguments)}})})(jQuery,jQuery.ui.tabs.prototype);(function(f,i){i.abort=function(){this.xhr&&this.xhr.abort()}})(jQuery,jQuery.ui.tabs.prototype);a.widget("ui.tabs",a.ui.tabs,{options:{spinner:"Loading…"},_create:function(){this._super("_create");this._bind({tabsbeforeload:function(f,i){if(this.options.spinner){var b=i.tab.find("span"),h=b.html();b.html(this.options.spinner);i.jqXHR.complete(function(){b.html(h)})}}})}});(function(f,i){f.extend(i.options,{enable:null,disable:null}); +var b=i.enable,h=i.disable;i.enable=function(k){var l=this.options,j;if(k&&l.disabled===true||f.isArray(l.disabled)&&f.inArray(k,l.disabled)!==-1)j=true;b.apply(this,arguments);j&&this._trigger("enable",null,this._ui(this.anchors[k],this.panels[k]))};i.disable=function(k){var l=this.options,j;if(k&&l.disabled===false||f.isArray(l.disabled)&&f.inArray(k,l.disabled)===-1)j=true;h.apply(this,arguments);j&&this._trigger("disable",null,this._ui(this.anchors[k],this.panels[k]))}})(jQuery,jQuery.ui.tabs.prototype); +(function(f,i){f.extend(i.options,{add:null,remove:null,tabTemplate:"
  • #{label}
  • "});i.add=function(b,h,k){if(k===g)k=this.anchors.length;var l=this.options;h=f(l.tabTemplate.replace(/#\{href\}/g,b).replace(/#\{label\}/g,h));b=!b.indexOf("#")?b.replace("#",""):this._tabId(h.find("a")[0]);h.addClass("ui-state-default ui-corner-top").data("destroy.tabs",true);h.find("a").attr("aria-controls",b);var j=k>=this.lis.length,m=this.element.find("#"+b);if(!m.length){m= +this._createPanel(b);if(j)k>0?m.insertAfter(this.panels.eq(-1)):m.appendTo(this.element);else m.insertBefore(this.panels[k])}m.addClass("ui-tabs-panel ui-widget-content ui-corner-bottom").hide();j?h.appendTo(this.list):h.insertBefore(this.lis[k]);l.disabled=f.map(l.disabled,function(n){return n>=k?++n:n});this.refresh();this.lis.length===1&&l.active===false&&this.option("active",0);this._trigger("add",null,this._ui(this.anchors[k],this.panels[k]));return this};i.remove=function(b){b=this._getIndex(b); +var h=this.options,k=this.lis.eq(b).remove(),l=this._getPanelForTab(k.find("a[aria-controls]")).remove();if(k.hasClass("ui-tabs-active")&&this.anchors.length>2)this._activate(b+(b+1=b?--j:j});this.refresh();this._trigger("remove",null,this._ui(k.find("a")[0],l[0]));return this}})(jQuery,jQuery.ui.tabs.prototype);(function(f,i){i.length=function(){return this.anchors.length}})(jQuery,jQuery.ui.tabs.prototype); +(function(f,i){f.extend(i.options,{idPrefix:"ui-tabs-"});i._tabId=function(b){return f(b).attr("aria-controls")||b.title&&b.title.replace(/\s/g,"_").replace(/[^\w\u00c0-\uFFFF-]/g,"")||this.options.idPrefix+ ++d}})(jQuery,jQuery.ui.tabs.prototype);(function(f,i){f.extend(i.options,{panelTemplate:"
    "});i._createPanel=function(b){return f(this.options.panelTemplate).attr("id",b).addClass("ui-tabs-panel ui-widget-content ui-corner-bottom").data("destroy.tabs",true)}})(jQuery,jQuery.ui.tabs.prototype); +(function(f,i){var b=i._create,h=i._setOption,k=i._eventHandler;i._create=function(){var l=this.options;if(l.active===null&&l.selected!==g)l.active=l.selected===-1?false:l.selected;b.call(this);l.selected=l.active;if(l.selected===false)l.selected=-1};i._setOption=function(l,j){if(l!=="selected")return h.apply(this,arguments);var m=this.options;h.call(this,"active",j===-1?false:j);m.selected=m.active;if(m.selected===false)m.selected=-1};i._eventHandler=function(){k.apply(this,arguments);this.options.selected= +this.options.active;if(this.options.selected===false)this.options.selected=-1}})(jQuery,jQuery.ui.tabs.prototype);(function(f,i){f.extend(i.options,{show:null,select:null});var b=i._create,h=i._trigger;i._create=function(){b.call(this);this.options.active!==false&&this._trigger("show",null,this._ui(this.active[0],this._getPanelForTab(this.active)[0]))};i._trigger=function(k,l,j){if(!h.apply(this,arguments))return false;if(k==="beforeActivate"&&j.newTab.length)h.call(this,"select",l,{tab:j.newTab[0], +panel:j.newPanel[0],index:j.newTab.closest("li").index()});else k==="activate"&&j.newTab.length&&h.call(this,"show",l,{tab:j.newTab[0],panel:j.newPanel[0],index:j.newTab.closest("li").index()})}})(jQuery,jQuery.ui.tabs.prototype);(function(f,i){i.select=function(b){b=this._getIndex(b);if(b===-1)if(this.options.collapsible&&this.options.selected!==-1)b=this.options.selected;else return;this.anchors.eq(b).trigger(this.options.event+".tabs")}})(jQuery,jQuery.ui.tabs.prototype);var e=0;a.widget("ui.tabs", +a.ui.tabs,{options:{cookie:null},_create:function(){var f=this.options,i;if(f.active==null&&f.cookie){i=parseInt(this._cookie(),10);if(i===-1)i=false;f.active=i}this._super("_create")},_cookie:function(f){var i=[this.cookie||(this.cookie=this.options.cookie.name||"ui-tabs-"+ ++e)];if(arguments.length){i.push(f===false?-1:f);i.push(this.options.cookie)}return a.cookie.apply(null,i)},_refresh:function(){this._super("_refresh");this.options.cookie&&this._cookie(this.options.active,this.options.cookie)}, +_eventHandler:function(){this._superApply("_eventHandler",arguments);this.options.cookie&&this._cookie(this.options.active,this.options.cookie)},_destroy:function(){this._super("_destroy");this.options.cookie&&this._cookie(null,this.options.cookie)}});a.widget("ui.tabs",a.ui.tabs,{_trigger:function(f,i,b){b=a.extend({},b);if(f==="load"){b.panel=b.panel[0];b.tab=b.tab[0]}return this._super("_trigger",f,i,b)}})}})(jQuery); +(function(a){var g=0;a.widget("ui.tooltip",{version:"1.9pre",options:{content:function(){return a(this).attr("title")},hide:true,items:"[title]",position:{my:"left+15 center",at:"right center",collision:"flipfit flipfit"},show:true,tooltipClass:null,close:null,open:null},_create:function(){this._bind({mouseover:"open",focusin:"open"});this.tooltips={}},_setOption:function(d,c){if(d==="disabled"){this[c?"_disable":"_enable"]();this.options[d]=c}else this._super("_setOption",d,c)},_disable:function(){var d= +this;a.each(this.tooltips,function(c,e){var f=a.Event("blur");f.target=f.currentTarget=e[0];d.close(f,true)});this.element.find(this.options.items).andSelf().each(function(){var c=a(this);c.is("[title]")&&c.data("tooltip-title",c.attr("title")).attr("title","")})},_enable:function(){this.element.find(this.options.items).andSelf().each(function(){var d=a(this);d.data("tooltip-title")&&d.attr("title",d.data("tooltip-title"))})},open:function(d){var c,e=this,f=a(d?d.target:this.element).closest(this.options.items); +if(!(!f.length||f.attr("aria-describedby"))){f.data("tooltip-title")||f.data("tooltip-title",f.attr("title"));(c=this.options.content.call(f[0],function(i){setTimeout(function(){e._open(d,f,i)},1)}))&&e._open(d,f,c)}},_open:function(d,c,e){if(e){c.is("[title]")&&c.attr("title","");var f=this._find(c);if(!f.length){f=this._tooltip(c);c.attr("aria-describedby",f.attr("id"))}f.find(".ui-tooltip-content").html(e);f.stop(true).position(a.extend({of:c},this.options.position)).hide();this._show(f,this.options.show); +this._trigger("open",d,{tooltip:f});this._bind(c,{mouseleave:"close",blur:"close",keyup:function(i){if(i.keyCode==a.ui.keyCode.ESCAPE){i=a.Event(i);i.currentTarget=c[0];this.close(i,true)}}})}},close:function(d,c){var e=this,f=a(d?d.currentTarget:this.element),i=this._find(f);if(!(!c&&document.activeElement===f[0])){f.data("tooltip-title")&&f.attr("title",f.data("tooltip-title"));f.removeAttr("aria-describedby");i.stop(true);this._hide(i,this.options.hide,function(){a(this).remove();delete e.tooltips[this.id]}); +f.unbind("mouseleave.tooltip blur.tooltip keyup.tooltip");this._trigger("close",d,{tooltip:i})}},_tooltip:function(d){var c="ui-tooltip-"+g++,e=a("
    ").attr({id:c,role:"tooltip"}).addClass("ui-tooltip ui-widget ui-corner-all ui-widget-content "+(this.options.tooltipClass||""));a("
    ").addClass("ui-tooltip-content").appendTo(e);e.appendTo(document.body);a.fn.bgiframe&&e.bgiframe();this.tooltips[c]=d;return e},_find:function(d){return(d=d.attr("aria-describedby"))?a("#"+d):a()},_destroy:function(){a.each(this.tooltips, +function(d){a("#"+d).remove()})}})})(jQuery); diff --git a/libreplan-webapp/src/main/webapp/jqplot/examples/jquery-ui/js/jquery.effects.blind.js b/libreplan-webapp/src/main/webapp/jqplot/examples/jquery-ui/js/jquery.effects.blind.js new file mode 100644 index 000000000..d75b4f3cd --- /dev/null +++ b/libreplan-webapp/src/main/webapp/jqplot/examples/jquery-ui/js/jquery.effects.blind.js @@ -0,0 +1,80 @@ +/* + * jQuery UI Effects Blind 1.9pre + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Effects/Blind + * + * Depends: + * jquery.effects.core.js + */ +(function( $, undefined ) { + +var rvertical = /up|down|vertical/, + rpositivemotion = /up|left|vertical|horizontal/; + +$.effects.effect.blind = function( o, done ) { + // Create element + var el = $( this ), + props = [ "position", "top", "bottom", "left", "right", "height", "width" ], + mode = $.effects.setMode( el, o.mode || "hide" ), + direction = o.direction || "up", + vertical = rvertical.test( direction ), + ref = vertical ? "height" : "width", + ref2 = vertical ? "top" : "left", + motion = rpositivemotion.test( direction ), + animation = {}, + show = mode === "show", + wrapper, distance, top; + + // if already wrapped, the wrapper's properties are my property. #6245 + if ( el.parent().is( ".ui-effects-wrapper" ) ) { + $.effects.save( el.parent(), props ); + } else { + $.effects.save( el, props ); + } + el.show(); + top = parseInt(el.css('top'), 10); + wrapper = $.effects.createWrapper( el ).css({ + overflow: "hidden" + }); + + distance = vertical ? wrapper[ ref ]() + top : wrapper[ ref ](); + + animation[ ref ] = show ? distance : 0; + if ( !motion ) { + el + .css( vertical ? "bottom" : "right", 0 ) + .css( vertical ? "top" : "left", "" ) + .css({ position: "absolute" }); + animation[ ref2 ] = show ? 0 : distance; + } + + // start at 0 if we are showing + if ( show ) { + wrapper.css( ref, 0 ); + if ( ! motion ) { + wrapper.css( ref2, distance ); + } + } + + // Animate + wrapper.animate( animation, { + duration: o.duration, + easing: o.easing, + queue: false, + complete: function() { + if ( mode === "hide" ) { + el.hide(); + } + $.effects.restore( el, props ); + $.effects.removeWrapper( el ); + done(); + } + }); + +}; + +})(jQuery); diff --git a/libreplan-webapp/src/main/webapp/jqplot/examples/jquery-ui/js/jquery.effects.blind.min.js b/libreplan-webapp/src/main/webapp/jqplot/examples/jquery-ui/js/jquery.effects.blind.min.js new file mode 100644 index 000000000..101c15d4e --- /dev/null +++ b/libreplan-webapp/src/main/webapp/jqplot/examples/jquery-ui/js/jquery.effects.blind.min.js @@ -0,0 +1,14 @@ +/* + * jQuery UI Effects Blind 1.9pre + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Effects/Blind + * + * Depends: + * jquery.effects.core.js + */ +(function(b){var n=/up|down|vertical/,o=/up|left|vertical|horizontal/;b.effects.effect.blind=function(g,p){var a=b(this),i=["position","top","bottom","left","right","height","width"],l=b.effects.setMode(a,g.mode||"hide"),e=g.direction||"up",f=n.test(e),h=f?"height":"width",m=f?"top":"left";e=o.test(e);var j={},k=l==="show",c,d;a.parent().is(".ui-effects-wrapper")?b.effects.save(a.parent(),i):b.effects.save(a,i);a.show();d=parseInt(a.css("top"),10);c=b.effects.createWrapper(a).css({overflow:"hidden"}); +d=f?c[h]()+d:c[h]();j[h]=k?d:0;if(!e){a.css(f?"bottom":"right",0).css(f?"top":"left","").css({position:"absolute"});j[m]=k?0:d}if(k){c.css(h,0);e||c.css(m,d)}c.animate(j,{duration:g.duration,easing:g.easing,queue:false,complete:function(){l==="hide"&&a.hide();b.effects.restore(a,i);b.effects.removeWrapper(a);p()}})}})(jQuery); diff --git a/libreplan-webapp/src/main/webapp/jqplot/examples/jquery-ui/js/jquery.effects.core.js b/libreplan-webapp/src/main/webapp/jqplot/examples/jquery-ui/js/jquery.effects.core.js new file mode 100644 index 000000000..ab9349a8d --- /dev/null +++ b/libreplan-webapp/src/main/webapp/jqplot/examples/jquery-ui/js/jquery.effects.core.js @@ -0,0 +1,890 @@ +/* + * jQuery UI Effects 1.9pre + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Effects/ + */ +;jQuery.effects || (function($, undefined) { + +var backCompat = $.uiBackCompat !== false; + +$.effects = { + effect: {} +}; + +/******************************************************************************/ +/****************************** COLOR ANIMATIONS ******************************/ +/******************************************************************************/ + +// override the animation for color styles +$.each(["backgroundColor", "borderBottomColor", "borderLeftColor", + "borderRightColor", "borderTopColor", "borderColor", "color", "outlineColor"], +function(i, attr) { + $.fx.step[attr] = function(fx) { + if (!fx.colorInit) { + fx.start = getColor(fx.elem, attr); + fx.end = getRGB(fx.end); + fx.colorInit = true; + } + + fx.elem.style[attr] = "rgb(" + + Math.max(Math.min(parseInt((fx.pos * (fx.end[0] - fx.start[0])) + fx.start[0], 10), 255), 0) + "," + + Math.max(Math.min(parseInt((fx.pos * (fx.end[1] - fx.start[1])) + fx.start[1], 10), 255), 0) + "," + + Math.max(Math.min(parseInt((fx.pos * (fx.end[2] - fx.start[2])) + fx.start[2], 10), 255), 0) + ")"; + }; +}); + +// Color Conversion functions from highlightFade +// By Blair Mitchelmore +// http://jquery.offput.ca/highlightFade/ + +// Parse strings looking for color tuples [255,255,255] +function getRGB(color) { + var result; + + // Check if we're already dealing with an array of colors + if ( color && color.constructor === Array && color.length === 3 ) + return color; + + // Look for rgb(num,num,num) + if (result = /rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/.exec(color)) + return [parseInt(result[1],10), parseInt(result[2],10), parseInt(result[3],10)]; + + // Look for rgb(num%,num%,num%) + if (result = /rgb\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*\)/.exec(color)) + return [parseFloat(result[1])*2.55, parseFloat(result[2])*2.55, parseFloat(result[3])*2.55]; + + // Look for #a0b1c2 + if (result = /#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec(color)) + return [parseInt(result[1],16), parseInt(result[2],16), parseInt(result[3],16)]; + + // Look for #fff + if (result = /#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/.exec(color)) + return [parseInt(result[1]+result[1],16), parseInt(result[2]+result[2],16), parseInt(result[3]+result[3],16)]; + + // Look for rgba(0, 0, 0, 0) == transparent in Safari 3 + if (result = /rgba\(0, 0, 0, 0\)/.exec(color)) + return colors["transparent"]; + + // Otherwise, we're most likely dealing with a named color + return colors[$.trim(color).toLowerCase()]; +} + +function getColor(elem, attr) { + var color; + + do { + color = $.curCSS(elem, attr); + + // Keep going until we find an element that has color, or we hit the body + if ( color != "" && color !== "transparent" || $.nodeName(elem, "body") ) + break; + + attr = "backgroundColor"; + } while ( elem = elem.parentNode ); + + return getRGB(color); +}; + +// Some named colors to work with +// From Interface by Stefan Petre +// http://interface.eyecon.ro/ + +var colors = { + aqua:[0,255,255], + azure:[240,255,255], + beige:[245,245,220], + black:[0,0,0], + blue:[0,0,255], + brown:[165,42,42], + cyan:[0,255,255], + darkblue:[0,0,139], + darkcyan:[0,139,139], + darkgrey:[169,169,169], + darkgreen:[0,100,0], + darkkhaki:[189,183,107], + darkmagenta:[139,0,139], + darkolivegreen:[85,107,47], + darkorange:[255,140,0], + darkorchid:[153,50,204], + darkred:[139,0,0], + darksalmon:[233,150,122], + darkviolet:[148,0,211], + fuchsia:[255,0,255], + gold:[255,215,0], + green:[0,128,0], + indigo:[75,0,130], + khaki:[240,230,140], + lightblue:[173,216,230], + lightcyan:[224,255,255], + lightgreen:[144,238,144], + lightgrey:[211,211,211], + lightpink:[255,182,193], + lightyellow:[255,255,224], + lime:[0,255,0], + magenta:[255,0,255], + maroon:[128,0,0], + navy:[0,0,128], + olive:[128,128,0], + orange:[255,165,0], + pink:[255,192,203], + purple:[128,0,128], + violet:[128,0,128], + red:[255,0,0], + silver:[192,192,192], + white:[255,255,255], + yellow:[255,255,0], + transparent: [255,255,255] +}; + + + +/******************************************************************************/ +/****************************** CLASS ANIMATIONS ******************************/ +/******************************************************************************/ + +var classAnimationActions = [ "add", "remove", "toggle" ], + shorthandStyles = { + border: 1, + borderBottom: 1, + borderColor: 1, + borderLeft: 1, + borderRight: 1, + borderTop: 1, + borderWidth: 1, + margin: 1, + padding: 1 + }, + // prefix used for storing data on .data() + dataSpace = "ec.storage."; + +$.each([ "borderLeftStyle", "borderRightStyle", "borderBottomStyle", "borderTopStyle" ], function( _, prop ) { + $.fx.step[ prop ] = function( fx ) { + if ( fx.end !== "none" && !fx.setAttr || fx.pos === 1 && !fx.setAttr ) { + jQuery.style( fx.elem, prop, fx.end ); + fx.setAttr = true; + } + }; +}); + +function getElementStyles() { + var style = this.ownerDocument.defaultView + ? this.ownerDocument.defaultView.getComputedStyle( this, null ) + : this.currentStyle, + newStyle = {}, + key, + camelCase, + len; + + // webkit enumerates style porperties + if ( style && style.length && style[ 0 ] && style[ style[ 0 ] ] ) { + len = style.length; + while ( len-- ) { + key = style[ len ]; + if ( typeof style[ key ] === "string" ) { + newStyle[ $.camelCase( key ) ] = style[ key ]; + } + } + } else { + for ( key in style ) { + if ( typeof style[ key ] === "string" ) { + newStyle[ key ] = style[ key ]; + } + } + } + + return newStyle; +} + + +function styleDifference( oldStyle, newStyle ) { + var diff = {}, + name, value; + + for ( name in newStyle ) { + value = newStyle[ name ]; + if ( oldStyle[ name ] != value ) { + if ( !shorthandStyles[ name ] ) { + if ( $.fx.step[ name ] || !isNaN( parseFloat( value ) ) ) { + diff[ name ] = value; + } + } + } + } + + return diff; +} + +$.effects.animateClass = function( value, duration, easing, callback ) { + var o = $.speed( duration, easing, callback ); + + return this.queue( function() { + var animated = $( this ), + baseClass = animated.attr( "class" ) || "", + finalClass, + allAnimations = o.children ? animated.find( "*" ).andSelf() : animated; + + // map the animated objects to store the original styles. + allAnimations = allAnimations.map(function() { + var el = $( this ); + return { + el: el, + originalStyleAttr: el.attr( "style" ) || " ", + start: getElementStyles.call( this ) + }; + }); + + // apply class change + $.each( classAnimationActions, function(i, action) { + if ( value[ action ] ) { + animated[ action + "Class" ]( value[ action ] ); + } + }); + finalClass = animated.attr( "class" ); + + // map all animated objects again - calculate new styles and diff + allAnimations = allAnimations.map(function() { + this.end = getElementStyles.call( this.el[ 0 ] ); + this.diff = styleDifference( this.start, this.end ); + return this; + }); + + // apply original class + animated.attr( "class", baseClass ); + + // map all animated objects again - this time collecting a promise + allAnimations = allAnimations.map(function() { + var styleInfo = this, + dfd = $.Deferred(); + + this.el.animate( this.diff, { + duration: o.duration, + easing: o.easing, + queue: false, + complete: function() { + dfd.resolve( styleInfo ); + } + }); + return dfd.promise(); + }); + + // once all animations have completed: + $.when.apply( $, allAnimations.get() ).done(function() { + + // set the final class + animated.attr( "class", finalClass ); + + // for each animated element + $.each( arguments, function() { + if ( typeof this.el.attr( "style" ) === "object" ) { + this.el.attr( "style" ).cssText = ""; + this.el.attr( "style" ).cssText = this.originalStyleAttr; + } else { + this.el.attr( "style", this.originalStyleAttr ); + } + }); + + // this is guarnteed to be there if you use jQuery.speed() + // it also handles dequeuing the next anim... + o.complete.call( animated[ 0 ] ); + }); + }); +}; + +$.fn.extend({ + _addClass: $.fn.addClass, + addClass: function( classNames, speed, easing, callback ) { + return speed ? + $.effects.animateClass.apply( this, [{ add: classNames }, speed, easing, callback ]) : + this._addClass(classNames); + }, + + _removeClass: $.fn.removeClass, + removeClass: function( classNames, speed, easing, callback ) { + return speed ? + $.effects.animateClass.apply( this, [{ remove: classNames }, speed, easing, callback ]) : + this._removeClass(classNames); + }, + + _toggleClass: $.fn.toggleClass, + toggleClass: function( classNames, force, speed, easing, callback ) { + if ( typeof force === "boolean" || force === undefined ) { + if ( !speed ) { + // without speed parameter; + return this._toggleClass( classNames, force ); + } else { + return $.effects.animateClass.apply( this, [( force ? { add:classNames } : { remove:classNames }), speed, easing, callback ]); + } + } else { + // without force parameter; + return $.effects.animateClass.apply( this, [{ toggle: classNames }, force, speed, easing ]); + } + }, + + switchClass: function( remove, add, speed, easing, callback) { + return $.effects.animateClass.apply( this, [{ + add: add, + remove: remove + }, speed, easing, callback ]); + } +}); + + + +/******************************************************************************/ +/*********************************** EFFECTS **********************************/ +/******************************************************************************/ + +$.extend( $.effects, { + version: "1.9pre", + + // Saves a set of properties in a data storage + save: function( element, set ) { + for( var i=0; i < set.length; i++ ) { + if ( set[ i ] !== null ) { + element.data( dataSpace + set[ i ], element[ 0 ].style[ set[ i ] ] ); + } + } + }, + + // Restores a set of previously saved properties from a data storage + restore: function( element, set ) { + for( var i=0; i < set.length; i++ ) { + if ( set[ i ] !== null ) { + element.css( set[ i ], element.data( dataSpace + set[ i ] ) ); + } + } + }, + + setMode: function( el, mode ) { + if (mode === "toggle") { + mode = el.is( ":hidden" ) ? "show" : "hide"; + } + return mode; + }, + + // Translates a [top,left] array into a baseline value + // this should be a little more flexible in the future to handle a string & hash + getBaseline: function( origin, original ) { + var y, x; + switch ( origin[ 0 ] ) { + case "top": y = 0; break; + case "middle": y = 0.5; break; + case "bottom": y = 1; break; + default: y = origin[ 0 ] / original.height; + }; + switch ( origin[ 1 ] ) { + case "left": x = 0; break; + case "center": x = 0.5; break; + case "right": x = 1; break; + default: x = origin[ 1 ] / original.width; + }; + return { + x: x, + y: y + }; + }, + + // Wraps the element around a wrapper that copies position properties + createWrapper: function( element ) { + + // if the element is already wrapped, return it + if ( element.parent().is( ".ui-effects-wrapper" )) { + return element.parent(); + } + + // wrap the element + var props = { + width: element.outerWidth(true), + height: element.outerHeight(true), + "float": element.css( "float" ) + }, + wrapper = $( "
    " ) + .addClass( "ui-effects-wrapper" ) + .css({ + fontSize: "100%", + background: "transparent", + border: "none", + margin: 0, + padding: 0 + }), + // Store the size in case width/height are defined in % - Fixes #5245 + size = { + width: element.width(), + height: element.height() + }, + active = document.activeElement; + + element.wrap( wrapper ); + + // Fixes #7595 - Elements lose focus when wrapped. + if ( element[ 0 ] === active || $.contains( element[ 0 ], active ) ) { + $( active ).focus(); + } + + wrapper = element.parent(); //Hotfix for jQuery 1.4 since some change in wrap() seems to actually loose the reference to the wrapped element + + // transfer positioning properties to the wrapper + if ( element.css( "position" ) === "static" ) { + wrapper.css({ position: "relative" }); + element.css({ position: "relative" }); + } else { + $.extend( props, { + position: element.css( "position" ), + zIndex: element.css( "z-index" ) + }); + $.each([ "top", "left", "bottom", "right" ], function(i, pos) { + props[ pos ] = element.css( pos ); + if ( isNaN( parseInt( props[ pos ], 10 ) ) ) { + props[ pos ] = "auto"; + } + }); + element.css({ + position: "relative", + top: 0, + left: 0, + right: "auto", + bottom: "auto" + }); + } + element.css(size); + + return wrapper.css( props ).show(); + }, + + removeWrapper: function( element ) { + var active = document.activeElement; + + if ( element.parent().is( ".ui-effects-wrapper" ) ) { + element.parent().replaceWith( element ); + + // Fixes #7595 - Elements lose focus when wrapped. + if ( element[ 0 ] === active || $.contains( element[ 0 ], active ) ) { + $( active ).focus(); + } + } + + + return element; + }, + + setTransition: function( element, list, factor, value ) { + value = value || {}; + $.each( list, function(i, x){ + var unit = element.cssUnit( x ); + if ( unit[ 0 ] > 0 ) value[ x ] = unit[ 0 ] * factor + unit[ 1 ]; + }); + return value; + } +}); + +// return an effect options object for the given parameters: +function _normalizeArguments( effect, options, speed, callback ) { + + // short path for passing an effect options object: + if ( $.isPlainObject( effect ) ) { + return effect; + } + + // convert to an object + effect = { effect: effect }; + + // catch (effect) + if ( options === undefined ) { + options = {}; + } + + // catch (effect, callback) + if ( $.isFunction( options ) ) { + callback = options; + speed = null; + options = {}; + } + + // catch (effect, speed, ?) + if ( $.type( options ) === "number" || $.fx.speeds[ options ]) { + callback = speed; + speed = options; + options = {}; + } + + // catch (effect, options, callback) + if ( $.isFunction( speed ) ) { + callback = speed; + speed = null; + } + + // add options to effect + if ( options ) { + $.extend( effect, options ); + } + + speed = speed || options.duration; + effect.duration = $.fx.off ? 0 : typeof speed === "number" + ? speed : speed in $.fx.speeds ? $.fx.speeds[ speed ] : $.fx.speeds._default; + + effect.complete = callback || options.complete; + + return effect; +} + +function standardSpeed( speed ) { + // valid standard speeds + if ( !speed || typeof speed === "number" || $.fx.speeds[ speed ] ) { + return true; + } + + // invalid strings - treat as "normal" speed + if ( typeof speed === "string" && !$.effects.effect[ speed ] ) { + // TODO: remove in 2.0 (#7115) + if ( backCompat && $.effects[ speed ] ) { + return false; + } + return true; + } + + return false; +} + +$.fn.extend({ + effect: function( effect, options, speed, callback ) { + var args = _normalizeArguments.apply( this, arguments ), + mode = args.mode, + queue = args.queue, + effectMethod = $.effects.effect[ args.effect ], + + // DEPRECATED: remove in 2.0 (#7115) + oldEffectMethod = !effectMethod && backCompat && $.effects[ args.effect ]; + + if ( $.fx.off || !( effectMethod || oldEffectMethod ) ) { + // delegate to the original method (e.g., .show()) if possible + if ( mode ) { + return this[ mode ]( args.duration, args.complete ); + } else { + return this.each( function() { + if ( args.complete ) { + args.complete.call( this ); + } + }); + } + } + + function run( next ) { + var elem = $( this ), + complete = args.complete, + mode = args.mode; + + function done() { + if ( $.isFunction( complete ) ) { + complete.call( elem[0] ); + } + if ( $.isFunction( next ) ) { + next(); + } + } + + // if the element is hiddden and mode is hide, + // or element is visible and mode is show + if ( elem.is( ":hidden" ) ? mode === "hide" : mode === "show" ) { + done(); + } else { + effectMethod.call( elem[0], args, done ); + } + } + + // TODO: remove this check in 2.0, effectMethod will always be true + if ( effectMethod ) { + return queue === false ? this.each( run ) : this.queue( queue || "fx", run ); + } else { + // DEPRECATED: remove in 2.0 (#7115) + return oldEffectMethod.call(this, { + options: args, + duration: args.duration, + callback: args.complete, + mode: args.mode + }); + } + }, + + _show: $.fn.show, + show: function( speed ) { + if ( standardSpeed( speed ) ) { + return this._show.apply( this, arguments ); + } else { + var args = _normalizeArguments.apply( this, arguments ); + args.mode = "show"; + return this.effect.call( this, args ); + } + }, + + _hide: $.fn.hide, + hide: function( speed ) { + if ( standardSpeed( speed ) ) { + return this._hide.apply( this, arguments ); + } else { + var args = _normalizeArguments.apply( this, arguments ); + args.mode = "hide"; + return this.effect.call( this, args ); + } + }, + + // jQuery core overloads toggle and creates _toggle + __toggle: $.fn.toggle, + toggle: function( speed ) { + if ( standardSpeed( speed ) || typeof speed === "boolean" || $.isFunction( speed ) ) { + return this.__toggle.apply( this, arguments ); + } else { + var args = _normalizeArguments.apply( this, arguments ); + args.mode = "toggle"; + return this.effect.call( this, args ); + } + }, + + // helper functions + cssUnit: function(key) { + var style = this.css( key ), + val = []; + + $.each( [ "em", "px", "%", "pt" ], function( i, unit ) { + if ( style.indexOf( unit ) > 0 ) + val = [ parseFloat( style ), unit ]; + }); + return val; + } +}); + + + +/******************************************************************************/ +/*********************************** EASING ***********************************/ +/******************************************************************************/ + +/* + * jQuery Easing v1.3 - http://gsgd.co.uk/sandbox/jquery/easing/ + * + * Uses the built in easing capabilities added In jQuery 1.1 + * to offer multiple easing options + * + * TERMS OF USE - jQuery Easing + * + * Open source under the BSD License. + * + * Copyright 2008 George McGinley Smith + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * Neither the name of the author nor the names of contributors may be used to endorse + * or promote products derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * +*/ + +// t: current time, b: begInnIng value, c: change In value, d: duration +$.easing.jswing = $.easing.swing; + +$.extend( $.easing, { + def: "easeOutQuad", + swing: function ( x, t, b, c, d ) { + return $.easing[ $.easing.def ]( x, t, b, c, d ); + }, + easeInQuad: function ( x, t, b, c, d ) { + return c * ( t /= d ) * t + b; + }, + easeOutQuad: function ( x, t, b, c, d ) { + return -c * ( t /= d ) * ( t - 2 ) + b; + }, + easeInOutQuad: function ( x, t, b, c, d ) { + if ( ( t /= d / 2 ) < 1 ) return c / 2 * t * t + b; + return -c / 2 * ( ( --t ) * ( t-2 ) - 1) + b; + }, + easeInCubic: function ( x, t, b, c, d ) { + return c * ( t /= d ) * t * t + b; + }, + easeOutCubic: function ( x, t, b, c, d ) { + return c * ( ( t = t / d - 1 ) * t * t + 1 ) + b; + }, + easeInOutCubic: function ( x, t, b, c, d ) { + if ( ( t /= d / 2 ) < 1 ) return c / 2 * t * t * t + b; + return c / 2 * ( ( t -= 2 ) * t * t + 2) + b; + }, + easeInQuart: function ( x, t, b, c, d ) { + return c * ( t /= d ) * t * t * t + b; + }, + easeOutQuart: function ( x, t, b, c, d ) { + return -c * ( ( t = t / d - 1 ) * t * t * t - 1) + b; + }, + easeInOutQuart: function ( x, t, b, c, d ) { + if ( (t /= d / 2 ) < 1 ) return c / 2 * t * t * t * t + b; + return -c / 2 * ( ( t -= 2 ) * t * t * t - 2) + b; + }, + easeInQuint: function ( x, t, b, c, d ) { + return c * ( t /= d ) * t * t * t * t + b; + }, + easeOutQuint: function ( x, t, b, c, d ) { + return c * ( ( t = t / d - 1 ) * t * t * t * t + 1) + b; + }, + easeInOutQuint: function ( x, t, b, c, d ) { + if ( ( t /= d / 2 ) < 1 ) return c / 2 * t * t * t * t * t + b; + return c / 2 * ( ( t -= 2 ) * t * t * t * t + 2) + b; + }, + easeInSine: function ( x, t, b, c, d ) { + return -c * Math.cos( t / d * ( Math.PI / 2 ) ) + c + b; + }, + easeOutSine: function ( x, t, b, c, d ) { + return c * Math.sin( t / d * ( Math.PI /2 ) ) + b; + }, + easeInOutSine: function ( x, t, b, c, d ) { + return -c / 2 * ( Math.cos( Math.PI * t / d ) - 1 ) + b; + }, + easeInExpo: function ( x, t, b, c, d ) { + return ( t==0 ) ? b : c * Math.pow( 2, 10 * ( t / d - 1) ) + b; + }, + easeOutExpo: function ( x, t, b, c, d ) { + return ( t==d ) ? b + c : c * ( -Math.pow( 2, -10 * t / d) + 1) + b; + }, + easeInOutExpo: function ( x, t, b, c, d ) { + if ( t==0 ) return b; + if ( t==d ) return b + c; + if ( ( t /= d / 2) < 1) return c / 2 * Math.pow( 2, 10 * (t - 1) ) + b; + return c / 2 * ( -Math.pow( 2, -10 * --t ) + 2 ) + b; + }, + easeInCirc: function ( x, t, b, c, d ) { + return -c * ( Math.sqrt( 1 - ( t /= d ) * t ) - 1 ) + b; + }, + easeOutCirc: function ( x, t, b, c, d ) { + return c * Math.sqrt( 1 - ( t = t / d - 1 ) * t ) + b; + }, + easeInOutCirc: function ( x, t, b, c, d ) { + if ( ( t /= d / 2) < 1 ) return -c / 2 * ( Math.sqrt( 1 - t * t ) - 1 ) + b; + return c / 2 * ( Math.sqrt( 1 - ( t -= 2 ) * t ) + 1 ) + b; + }, + easeInElastic: function ( x, t, b, c, d ) { + var s = 1.70158, + p = d * 0.3, + a = c; + if ( t == 0 ) return b; + if ( ( t /= d ) == 1 ) return b+c; + if ( a < Math.abs( c ) ) { + a = c; + s = p / 4; + } else { + s = p / ( 2 * Math.PI ) * Math.asin( c / a ); + } + return - ( a * Math.pow( 2, 10 * ( t -= 1 ) ) * Math.sin( ( t * d - s) * ( 2 * Math.PI ) / p ) ) + b; + }, + easeOutElastic: function ( x, t, b, c, d ) { + var s = 1.70158, + p = d * 0.3, + a = c; + if ( t == 0 ) return b; + if ( ( t /= d ) == 1 ) return b+c; + if ( a < Math.abs( c ) ) { + a = c; + s = p / 4; + } else { + s = p / ( 2 * Math.PI ) * Math.asin( c / a ); + } + return a * Math.pow( 2, -10 * t ) * Math.sin( ( t * d - s ) * ( 2 * Math.PI ) / p ) + c + b; + }, + easeInOutElastic: function ( x, t, b, c, d ) { + var s = 1.70158, + p = d * ( 0.3 * 1.5 ), + a = c; + if ( t == 0 ) return b; + if ( ( t /= d / 2 ) == 2 ) return b+c; + if ( a < Math.abs( c ) ) { + a = c; + s = p / 4; + } else { + s = p / ( 2 * Math.PI ) * Math.asin( c / a ); + } + if ( t < 1 ) return -.5 * ( a * Math.pow( 2, 10 * ( t -= 1 ) ) * Math.sin( ( t * d - s ) * ( 2 * Math.PI ) / p ) ) + b; + return a * Math.pow( 2, -10 * ( t -= 1 ) ) * Math.sin( ( t * d - s ) * ( 2 * Math.PI ) / p ) *.5 + c + b; + }, + easeInBack: function ( x, t, b, c, d, s ) { + if ( s == undefined ) s = 1.70158; + return c * ( t /= d ) * t * ( ( s+1 ) * t - s ) + b; + }, + easeOutBack: function ( x, t, b, c, d, s ) { + if ( s == undefined ) s = 1.70158; + return c * ( ( t = t / d - 1 ) * t * ( ( s + 1 ) * t + s) + 1) + b; + }, + easeInOutBack: function ( x, t, b, c, d, s ) { + if ( s == undefined ) s = 1.70158; + if ( ( t /= d / 2 ) < 1 ) return c / 2 * ( t * t * ( ( ( s *= 1.525 ) + 1 ) * t - s ) ) + b; + return c / 2 * ( ( t -= 2 ) * t * ( ( ( s *= 1.525 ) + 1 ) * t + s) + 2) + b; + }, + easeInBounce: function ( x, t, b, c, d ) { + return c - $.easing.easeOutBounce( x, d - t, 0, c, d ) + b; + }, + easeOutBounce: function ( x, t, b, c, d ) { + if ( ( t /= d ) < ( 1 / 2.75 ) ) { + return c * ( 7.5625 * t * t ) + b; + } else if ( t < ( 2 / 2.75 ) ) { + return c * ( 7.5625 * ( t -= ( 1.5 / 2.75 ) ) * t + .75 ) + b; + } else if ( t < ( 2.5 / 2.75 ) ) { + return c * ( 7.5625 * ( t -= ( 2.25/ 2.75 ) ) * t + .9375 ) + b; + } else { + return c * ( 7.5625 * ( t -= ( 2.625 / 2.75 ) ) * t + .984375 ) + b; + } + }, + easeInOutBounce: function ( x, t, b, c, d ) { + if ( t < d / 2 ) return $.easing.easeInBounce( x, t * 2, 0, c, d ) * .5 + b; + return $.easing.easeOutBounce( x, t * 2 - d, 0, c, d ) * .5 + c * .5 + b; + } +}); + +/* + * + * TERMS OF USE - EASING EQUATIONS + * + * Open source under the BSD License. + * + * Copyright 2001 Robert Penner + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * Neither the name of the author nor the names of contributors may be used to endorse + * or promote products derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +})(jQuery); diff --git a/libreplan-webapp/src/main/webapp/jqplot/examples/jquery-ui/js/jquery.effects.core.min.js b/libreplan-webapp/src/main/webapp/jqplot/examples/jquery-ui/js/jquery.effects.core.min.js new file mode 100644 index 000000000..9e92123a7 --- /dev/null +++ b/libreplan-webapp/src/main/webapp/jqplot/examples/jquery-ui/js/jquery.effects.core.min.js @@ -0,0 +1,32 @@ +/* + * jQuery UI Effects 1.9pre + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Effects/ + */ +jQuery.effects||function(f,m){function r(c){var a;if(c&&c.constructor===Array&&c.length===3)return c;if(a=/rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/.exec(c))return[parseInt(a[1],10),parseInt(a[2],10),parseInt(a[3],10)];if(a=/rgb\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*\)/.exec(c))return[parseFloat(a[1])*2.55,parseFloat(a[2])*2.55,parseFloat(a[3])*2.55];if(a=/#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec(c))return[parseInt(a[1], +16),parseInt(a[2],16),parseInt(a[3],16)];if(a=/#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/.exec(c))return[parseInt(a[1]+a[1],16),parseInt(a[2]+a[2],16),parseInt(a[3]+a[3],16)];if(/rgba\(0, 0, 0, 0\)/.exec(c))return s.transparent;return s[f.trim(c).toLowerCase()]}function t(){var c=this.ownerDocument.defaultView?this.ownerDocument.defaultView.getComputedStyle(this,null):this.currentStyle,a={},b,d;if(c&&c.length&&c[0]&&c[c[0]])for(d=c.length;d--;){b=c[d];if(typeof c[b]==="string")a[f.camelCase(b)]=c[b]}else for(b in c)if(typeof c[b]=== +"string")a[b]=c[b];return a}function o(c,a,b,d){if(f.isPlainObject(c))return c;c={effect:c};if(a===m)a={};if(f.isFunction(a)){d=a;b=null;a={}}if(f.type(a)==="number"||f.fx.speeds[a]){d=b;b=a;a={}}if(f.isFunction(b)){d=b;b=null}a&&f.extend(c,a);b=b||a.duration;c.duration=f.fx.off?0:typeof b==="number"?b:b in f.fx.speeds?f.fx.speeds[b]:f.fx.speeds._default;c.complete=d||a.complete;return c}function q(c){if(!c||typeof c==="number"||f.fx.speeds[c])return true;if(typeof c==="string"&&!f.effects.effect[c]){if(u&& +f.effects[c])return false;return true}return false}var u=f.uiBackCompat!==false;f.effects={effect:{}};f.each(["backgroundColor","borderBottomColor","borderLeftColor","borderRightColor","borderTopColor","borderColor","color","outlineColor"],function(c,a){f.fx.step[a]=function(b){if(!b.colorInit){var d;d=b.elem;var e=a,g;do{g=f.curCSS(d,e);if(g!=""&&g!=="transparent"||f.nodeName(d,"body"))break;e="backgroundColor"}while(d=d.parentNode);d=r(g);b.start=d;b.end=r(b.end);b.colorInit=true}b.elem.style[a]= +"rgb("+Math.max(Math.min(parseInt(b.pos*(b.end[0]-b.start[0])+b.start[0],10),255),0)+","+Math.max(Math.min(parseInt(b.pos*(b.end[1]-b.start[1])+b.start[1],10),255),0)+","+Math.max(Math.min(parseInt(b.pos*(b.end[2]-b.start[2])+b.start[2],10),255),0)+")"}});var s={aqua:[0,255,255],azure:[240,255,255],beige:[245,245,220],black:[0,0,0],blue:[0,0,255],brown:[165,42,42],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgrey:[169,169,169],darkgreen:[0,100,0],darkkhaki:[189,183,107],darkmagenta:[139, +0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkviolet:[148,0,211],fuchsia:[255,0,255],gold:[255,215,0],green:[0,128,0],indigo:[75,0,130],khaki:[240,230,140],lightblue:[173,216,230],lightcyan:[224,255,255],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightyellow:[255,255,224],lime:[0,255,0],magenta:[255,0,255],maroon:[128,0,0],navy:[0,0,128],olive:[128,128,0],orange:[255,165,0],pink:[255,192, +203],purple:[128,0,128],violet:[128,0,128],red:[255,0,0],silver:[192,192,192],white:[255,255,255],yellow:[255,255,0],transparent:[255,255,255]},w=["add","remove","toggle"],x={border:1,borderBottom:1,borderColor:1,borderLeft:1,borderRight:1,borderTop:1,borderWidth:1,margin:1,padding:1};f.each(["borderLeftStyle","borderRightStyle","borderBottomStyle","borderTopStyle"],function(c,a){f.fx.step[a]=function(b){if(b.end!=="none"&&!b.setAttr||b.pos===1&&!b.setAttr){jQuery.style(b.elem,a,b.end);b.setAttr= +true}}});f.effects.animateClass=function(c,a,b,d){var e=f.speed(a,b,d);return this.queue(function(){var g=f(this),h=g.attr("class")||"",n,j=e.children?g.find("*").andSelf():g;j=j.map(function(){var k=f(this);return{el:k,originalStyleAttr:k.attr("style")||" ",start:t.call(this)}});f.each(w,function(k,i){if(c[i])g[i+"Class"](c[i])});n=g.attr("class");j=j.map(function(){this.end=t.call(this.el[0]);var k=this.start,i=this.end,v={},l,p;for(l in i){p=i[l];if(k[l]!=p)if(!x[l])if(f.fx.step[l]||!isNaN(parseFloat(p)))v[l]= +p}this.diff=v;return this});g.attr("class",h);j=j.map(function(){var k=this,i=f.Deferred();this.el.animate(this.diff,{duration:e.duration,easing:e.easing,queue:false,complete:function(){i.resolve(k)}});return i.promise()});f.when.apply(f,j.get()).done(function(){g.attr("class",n);f.each(arguments,function(){if(typeof this.el.attr("style")==="object"){this.el.attr("style").cssText="";this.el.attr("style").cssText=this.originalStyleAttr}else this.el.attr("style",this.originalStyleAttr)});e.complete.call(g[0])})})}; +f.fn.extend({_addClass:f.fn.addClass,addClass:function(c,a,b,d){return a?f.effects.animateClass.apply(this,[{add:c},a,b,d]):this._addClass(c)},_removeClass:f.fn.removeClass,removeClass:function(c,a,b,d){return a?f.effects.animateClass.apply(this,[{remove:c},a,b,d]):this._removeClass(c)},_toggleClass:f.fn.toggleClass,toggleClass:function(c,a,b,d,e){return typeof a==="boolean"||a===m?b?f.effects.animateClass.apply(this,[a?{add:c}:{remove:c},b,d,e]):this._toggleClass(c,a):f.effects.animateClass.apply(this, +[{toggle:c},a,b,d])},switchClass:function(c,a,b,d,e){return f.effects.animateClass.apply(this,[{add:a,remove:c},b,d,e])}});f.extend(f.effects,{version:"1.9pre",save:function(c,a){for(var b=0;b
    ").addClass("ui-effects-wrapper").css({fontSize:"100%",background:"transparent",border:"none",margin:0,padding:0}), +d={width:c.width(),height:c.height()},e=document.activeElement;c.wrap(b);if(c[0]===e||f.contains(c[0],e))f(e).focus();b=c.parent();if(c.css("position")==="static"){b.css({position:"relative"});c.css({position:"relative"})}else{f.extend(a,{position:c.css("position"),zIndex:c.css("z-index")});f.each(["top","left","bottom","right"],function(g,h){a[h]=c.css(h);if(isNaN(parseInt(a[h],10)))a[h]="auto"});c.css({position:"relative",top:0,left:0,right:"auto",bottom:"auto"})}c.css(d);return b.css(a).show()}, +removeWrapper:function(c){var a=document.activeElement;if(c.parent().is(".ui-effects-wrapper")){c.parent().replaceWith(c);if(c[0]===a||f.contains(c[0],a))f(a).focus()}return c},setTransition:function(c,a,b,d){d=d||{};f.each(a,function(e,g){var h=c.cssUnit(g);if(h[0]>0)d[g]=h[0]*b+h[1]});return d}});f.fn.extend({effect:function(){function c(h){function n(){f.isFunction(k)&&k.call(j[0]);f.isFunction(h)&&h()}var j=f(this),k=a.complete,i=a.mode;(j.is(":hidden")?i==="hide":i==="show")?n():e.call(j[0], +a,n)}var a=o.apply(this,arguments),b=a.mode,d=a.queue,e=f.effects.effect[a.effect],g=!e&&u&&f.effects[a.effect];if(f.fx.off||!(e||g))return b?this[b](a.duration,a.complete):this.each(function(){a.complete&&a.complete.call(this)});return e?d===false?this.each(c):this.queue(d||"fx",c):g.call(this,{options:a,duration:a.duration,callback:a.complete,mode:a.mode})},_show:f.fn.show,show:function(c){if(q(c))return this._show.apply(this,arguments);else{var a=o.apply(this,arguments);a.mode="show";return this.effect.call(this, +a)}},_hide:f.fn.hide,hide:function(c){if(q(c))return this._hide.apply(this,arguments);else{var a=o.apply(this,arguments);a.mode="hide";return this.effect.call(this,a)}},__toggle:f.fn.toggle,toggle:function(c){if(q(c)||typeof c==="boolean"||f.isFunction(c))return this.__toggle.apply(this,arguments);else{var a=o.apply(this,arguments);a.mode="toggle";return this.effect.call(this,a)}},cssUnit:function(c){var a=this.css(c),b=[];f.each(["em","px","%","pt"],function(d,e){if(a.indexOf(e)>0)b=[parseFloat(a), +e]});return b}});f.easing.jswing=f.easing.swing;f.extend(f.easing,{def:"easeOutQuad",swing:function(c,a,b,d,e){return f.easing[f.easing.def](c,a,b,d,e)},easeInQuad:function(c,a,b,d,e){return d*(a/=e)*a+b},easeOutQuad:function(c,a,b,d,e){return-d*(a/=e)*(a-2)+b},easeInOutQuad:function(c,a,b,d,e){if((a/=e/2)<1)return d/2*a*a+b;return-d/2*(--a*(a-2)-1)+b},easeInCubic:function(c,a,b,d,e){return d*(a/=e)*a*a+b},easeOutCubic:function(c,a,b,d,e){return d*((a=a/e-1)*a*a+1)+b},easeInOutCubic:function(c,a, +b,d,e){if((a/=e/2)<1)return d/2*a*a*a+b;return d/2*((a-=2)*a*a+2)+b},easeInQuart:function(c,a,b,d,e){return d*(a/=e)*a*a*a+b},easeOutQuart:function(c,a,b,d,e){return-d*((a=a/e-1)*a*a*a-1)+b},easeInOutQuart:function(c,a,b,d,e){if((a/=e/2)<1)return d/2*a*a*a*a+b;return-d/2*((a-=2)*a*a*a-2)+b},easeInQuint:function(c,a,b,d,e){return d*(a/=e)*a*a*a*a+b},easeOutQuint:function(c,a,b,d,e){return d*((a=a/e-1)*a*a*a*a+1)+b},easeInOutQuint:function(c,a,b,d,e){if((a/=e/2)<1)return d/2*a*a*a*a*a+b;return d/2* +((a-=2)*a*a*a*a+2)+b},easeInSine:function(c,a,b,d,e){return-d*Math.cos(a/e*(Math.PI/2))+d+b},easeOutSine:function(c,a,b,d,e){return d*Math.sin(a/e*(Math.PI/2))+b},easeInOutSine:function(c,a,b,d,e){return-d/2*(Math.cos(Math.PI*a/e)-1)+b},easeInExpo:function(c,a,b,d,e){return a==0?b:d*Math.pow(2,10*(a/e-1))+b},easeOutExpo:function(c,a,b,d,e){return a==e?b+d:d*(-Math.pow(2,-10*a/e)+1)+b},easeInOutExpo:function(c,a,b,d,e){if(a==0)return b;if(a==e)return b+d;if((a/=e/2)<1)return d/2*Math.pow(2,10*(a-1))+ +b;return d/2*(-Math.pow(2,-10*--a)+2)+b},easeInCirc:function(c,a,b,d,e){return-d*(Math.sqrt(1-(a/=e)*a)-1)+b},easeOutCirc:function(c,a,b,d,e){return d*Math.sqrt(1-(a=a/e-1)*a)+b},easeInOutCirc:function(c,a,b,d,e){if((a/=e/2)<1)return-d/2*(Math.sqrt(1-a*a)-1)+b;return d/2*(Math.sqrt(1-(a-=2)*a)+1)+b},easeInElastic:function(c,a,b,d,e){c=1.70158;var g=e*0.3,h=d;if(a==0)return b;if((a/=e)==1)return b+d;if(h + + + + + Area Chart + + + + + + + + + + + + + +
    + + + + + + + + + + + +
    +
    +
    +
    + +
    
    +  
    +  
    +
    +
    +
    +
    +
    +
    +
    +    
    +    
    +    
    +    
    +
    +
    +
    +
    +  
    +
    +
    +
    +
    +	
    + + + + + + \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/examples/kcp_cdf.html b/libreplan-webapp/src/main/webapp/jqplot/examples/kcp_cdf.html new file mode 100644 index 000000000..0d5c2698e --- /dev/null +++ b/libreplan-webapp/src/main/webapp/jqplot/examples/kcp_cdf.html @@ -0,0 +1,351 @@ + + + + + + Cumulative Density Function Chart + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + +
    + +
    + Data Series: +
      +
    • National
    • +
    • Urban
    • +
    • Rural
    • +
    +
    + +
    + Background Color: +
      +
    • Default
    • +
    • Gray
    • +
    +
    + +
    + Line Width: +
      +
    • Thin
    • +
    • Thick
    • +
    +
    + +
    + Grids: +
      +
    • Vertical
    • +
    • Horizontal
    • +
    +
    + +
    + Set lines at: +
      +
    • and
    • +
    • +
    +
    +
    +
    +
    +
    +
    +
    + +
    
    +  
    +  
    +
    +
    +
    +
    +
    +
    +
    +    
    +    
    +    
    +    
    +
    +
    +
    +  
    +  
    +  
    +  
    +  
    +  
    +  
    +
    +
    +
    +
    +	
    + + + + + + \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/examples/kcp_engel.html b/libreplan-webapp/src/main/webapp/jqplot/examples/kcp_engel.html new file mode 100644 index 000000000..6181ba0a5 --- /dev/null +++ b/libreplan-webapp/src/main/webapp/jqplot/examples/kcp_engel.html @@ -0,0 +1,244 @@ + + + + + + Engel Curves + + + + + + + + + + + + + +
    + + + + + + + + + + + +
    +
    +
    +
    + +
    
    +  
    +  
    +
    +
    +
    +
    +
    +
    +
    +    
    +    
    +    
    +    
    +
    +
    +>
    +  
    +  
    +  
    +  
    +
    +
    +
    +
    +	
    + + + + + + \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/examples/kcp_lorenz.html b/libreplan-webapp/src/main/webapp/jqplot/examples/kcp_lorenz.html new file mode 100644 index 000000000..179da5d73 --- /dev/null +++ b/libreplan-webapp/src/main/webapp/jqplot/examples/kcp_lorenz.html @@ -0,0 +1,510 @@ + + + + + + Lorenz Curves + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + +
    + +
    + Data Series: +
      +
    • National
    • +
    • Urban
    • +
    • Rural
    • +
    +
    + +
    + Background Color: +
      +
    • Default
    • +
    • Gray
    • +
    +
    + +
    + Line Width: +
      +
    • Thin
    • +
    • Thick
    • +
    +
    + +
    + Grids: +
      +
    • Vertical
    • +
    • Horizontal
    • +
    +
    + +
    + Set lines at: +
      +
    • and
    • +
    • +
    +
    +
    +
    +
    +
    +
    +
    + +
    
    +  
    +
    +  
    +  
    +
    +
    +
    +
    +
    +
    +
    +    
    +    
    +    
    +    
    +
    +
    +>
    +  
    +  
    +  
    +  
    +  
    +  
    +  
    +
    +
    +
    +
    +	
    + + + + + + \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/examples/kcp_pdf.html b/libreplan-webapp/src/main/webapp/jqplot/examples/kcp_pdf.html new file mode 100644 index 000000000..ca44dac42 --- /dev/null +++ b/libreplan-webapp/src/main/webapp/jqplot/examples/kcp_pdf.html @@ -0,0 +1,387 @@ + + + + + + Probability Density Function Chart + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + +
    + +
    + Data Series: +
      +
    • National
    • +
    • Urban
    • +
    • Rural
    • +
    +
    + +
    + Background Color: +
      +
    • Default
    • +
    • Gray
    • +
    +
    + +
    + Line Width: +
      +
    • Thin
    • +
    • Thick
    • +
    +
    + +
    + Grids: +
      +
    • Vertical
    • +
    • Horizontal
    • +
    +
    + +
    + Set lines at: +
      +
    • and
    • +
    • +
    +
    +
    +
    +
    +
    +
    +
    + +
    
    +  
    +
    + 
    +  
    +
    +
    +
    +
    +
    +
    +
    +    
    +    
    +    
    +    
    +
    +
    +>
    +  
    +  
    +  
    +  
    +  
    +  
    +  
    +
    +
    +
    +
    +	
    + + + + + + \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/examples/kcp_pyramid.html b/libreplan-webapp/src/main/webapp/jqplot/examples/kcp_pyramid.html new file mode 100644 index 000000000..630ed2d85 --- /dev/null +++ b/libreplan-webapp/src/main/webapp/jqplot/examples/kcp_pyramid.html @@ -0,0 +1,580 @@ + + + + + + Pyramid Charts + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + +
    + +
    + Axes: + +
    + +
    + Background Color: +
      +
    • Default
    • +
    • Gray
    • +
    +
    + +
    + Pyramid Color: +
      +
    • Green
    • +
    • Blue
    • +
    +
    + +
    + Grids: +
      +
    • Vertical
    • +
    • Horizontal
    • +
    • Only major
    • +
    • Plot Bands
    • +
    +
    + +
    +
      +
    • Gap between bars
    • + +
    • Comparison Line
    • +
    +
    + +
    + + + + + + + + + + + + + +
    Age:
     
    Male:
     
    Female:
     
    Ratio:
     
    +
    +
    +
    +
    +
    +
    +
    + +
    
    +  
    +
    +
    +    
    +
    +
    +
    +
    +
    +
    +
    +    
    +    
    +    
    +    
    +
    +
    +
    +
    +    
    +
    +    
    +    
    +     
    +
    +    
    +    
    +    
    +    
    +
    +
    +
    +
    +	
    + + + + + + \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/examples/kcp_pyramid2.html b/libreplan-webapp/src/main/webapp/jqplot/examples/kcp_pyramid2.html new file mode 100644 index 000000000..ddf6a8d83 --- /dev/null +++ b/libreplan-webapp/src/main/webapp/jqplot/examples/kcp_pyramid2.html @@ -0,0 +1,568 @@ + + + + + + Pyramid Charts 2 + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + +
    + +
    + Axes: + +
    + +
    + Background Color: +
      +
    • Default
    • +
    • Gray
    • +
    +
    + +
    + Pyramid Color: +
      +
    • Green
    • +
    • Blue
    • +
    +
    + +
    + Grids: +
      +
    • Vertical
    • +
    • Horizontal
    • +
    • Only major
    • +
    • Plot Bands
    • +
    +
    + +
    +
      +
    • Gap between bars
    • + +
    • Comparison Line
    • +
    +
    + +
    + + + + + + + + + + + + + +
    Age:
     
    Male:
     
    Female:
     
    Ratio:
     
    +
    +
    +
    +
    +
    +
    +
    + +
    
    +  
    +
    +
    +    
    +
    +
    +
    +
    +
    +
    +    
    +    
    +    
    +    
    +
    +
    +
    +
    +    
    +
    +    
    +    
    +     
    +
    +    
    +    
    +    
    +    
    +
    +
    +
    +
    +	
    + + + + + + \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/examples/line-charts.html b/libreplan-webapp/src/main/webapp/jqplot/examples/line-charts.html new file mode 100644 index 000000000..b74a91477 --- /dev/null +++ b/libreplan-webapp/src/main/webapp/jqplot/examples/line-charts.html @@ -0,0 +1,193 @@ + + + + + + Line Charts and Options + + + + + + + + + + + + + +
    + + + + + + +

    The most basic jqPlot chart takes a series of data and plots a line. No options need to be supplied. Data is passed in as an array of series. A series can be either an array of y values or an array of [x,y] data pairs. If y values only, x values are assigned like 1, 2, 3, ... Note, for this plot you don't need any plugins.

    + +
    + +
    
    +
    +
    +

    The following plot uses a number of options to set the title, add axis labels, and shows how to use the canvasAxisLabelRenderer plugin to provide rotated axis labels.

    + +
    + +
    
    +
    +
    +

    There are numerous line style options to control how the lines and markers are displayed.

    + +
    + +
    
    +
    +  
    +
    +  
    +
    +  
    +
    +
    +
    +
    +
    +
    +
    +
    +    
    +    
    +    
    +    
    +
    +
    +
    +
    +  
    +  
    +
    +
    +
    +
    +	
    + + + + + + \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/examples/mekkoCharts.html b/libreplan-webapp/src/main/webapp/jqplot/examples/mekkoCharts.html new file mode 100644 index 000000000..c80496495 --- /dev/null +++ b/libreplan-webapp/src/main/webapp/jqplot/examples/mekkoCharts.html @@ -0,0 +1,269 @@ + + + + + + jqPlot Charts and Graphs + + + + + + + + + + + + + +
    + + + + + + +

    Data is specified per bar in the chart. You can specify data as an array of y values, or as an array of [label, value] pairs. Note that labels are used only on the first series. Labels on subsequent series are ignored:

    +
    +bar1 = [['shirts', 8],['hats', 14],['shoes', 6],['gloves', 16],['dolls', 12]];
    +bar2 = [15,6,9,13,6];
    +bar3 = [['grumpy',4],['sneezy',2],['happy',7],['sleepy',9],['doc',7]];
    +
    + +

    If you want to place labels for each bar under the axis, you use the barLabels option on the axes. The bar labels can be styled with the ".jqplot-mekko-barLabel" css class.

    +
    +barLabels = ['Mickey Mouse', 'Donald Duck', 'Goofy'];
    +axes:{xaxis:{barLabels:barLabels}}
    +
    + +
    + +

    You can add a secondary x axes, and the tick spacing of the axes can be separately controlled with the "tickMode" option. "bar" will produce tics at bar boundaries, "even" will produce evenly spaced ticks. If you set the axes max greater than the sum of the data range (the maximum x value), the plot will be padded. Note that you should set the max on both axes to the same value.

    + +
    +axes:{
    +    xaxis:{
    +        barLabels:barLabels,
    +        max: 175
    +    }, 
    +    x2axis:{
    +        show:true, 
    +        tickMode:'even', 
    +        max: 175
    +    }
    +}
    +
    + +

    Here the borders between chart areas have been given a custom color using the "borderColor" option on the series renderer.

    + +
    +    seriesDefaults:{renderer:$.jqplot.MekkoRenderer, rendererOptions: {borderColor: '#dddddd'}}
    +
    + +

    Additionally, the legend can be placed "outside" (the default for a mekko chart) or "inside" of the grid area with the "placement" option on the legend renderer.

    + +
    +legend:{
    +    show:true, 
    +    rendererOptions:{placement: "insideGrid"}, 
    +    location:'e'
    +},
    +
    + +
    + +

    Legend labels can be specified independently of the series with the "labels" option on the legend. These will override any labels specified with the series. There are also options to control the number of rows and number of columns in the legend as well as placement.

    + +

    Here the legend is positioned to the "north" and set to render 1 row tall (number of columns determined automatically). Note that an extra css specification was added to pad the bottom of the title of this chart to give room for the legend above the plot.

    + +
    +legendLabels = ['hotels', 'rides', 'buses', 'instruments', 'totes'];
    +
    +legend:{
    +    show:true, 
    +    location: 'n',
    +    labels: legendLabels,
    +    rendererOptions:{numberRows: 1, placement: "outside"}
    +},    
    +
    + +

    Also, the borders between the chart areas have been turned off with the "showBorders: false" option.

    + +
    +    seriesDefaults:{renderer:$.jqplot.MekkoRenderer, rendererOptions: {showBorders: false}}
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/examples/meterGauge.html b/libreplan-webapp/src/main/webapp/jqplot/examples/meterGauge.html new file mode 100644 index 000000000..21b3510db --- /dev/null +++ b/libreplan-webapp/src/main/webapp/jqplot/examples/meterGauge.html @@ -0,0 +1,179 @@ + + + + + + jqPlot Meter Gauge + + + + + + + + + + + + + +
    + + + + + + + + + + +

    A meter gauge plot shows a data value in a speedometer style gauge. The "series" in consists of a single data value that positions the needle on the gauge. The span of the gauge will be automatically determined, or can be set with the "min" and "max" values in the "rendererOptions" of the series. The plot below also specifies a chart title and a "label" for the gauge.

    + +
    + +

    For small gauges, it can be desirable to turn off the tick labels by setting the "showTickLabels" option in the rendererOptions to false. Also, colored interval bands can be specified. The interval ranges are specified as an array of values the "intervals" option and custom colors for each interval can be specified with the "intervalColors" option.

    + +
    + +

    The inner and outer radii of the interval band will automatically adjust when tick Labels are turned on. Also, the gauge minimum and maximum can be specified with the "min" and "max" options in the rendererOptions.

    + +
    + +

    The inner and outer radii of the interval band can also be specified with the "intervalInnerRadius" and "intervalOuterRadius" options. In the plot below, the "labelPosition" option was set to "bottom" to put the gauge label below the plot. The "labelHeightAdjust" option was set to -5 to raise the label slightly (5 pixels) to place it closer to the gauge.

    +

    The gauge automatically resizes to best fit the container. The font size of the tick labels and gauge labels do not size to the container, however. The font size of the tick labels can be controlled by styling the css ".jqplot-meterGauge-ticks" class and the gauge label by the "jqplot-meterGauge-label" class.

    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/examples/nav.inc b/libreplan-webapp/src/main/webapp/jqplot/examples/nav.inc new file mode 100644 index 000000000..d54a4bf90 --- /dev/null +++ b/libreplan-webapp/src/main/webapp/jqplot/examples/nav.inc @@ -0,0 +1,40 @@ +
    + Previous Examples Next'; + + ?> +
    diff --git a/libreplan-webapp/src/main/webapp/jqplot/examples/pie-donut-charts.html b/libreplan-webapp/src/main/webapp/jqplot/examples/pie-donut-charts.html new file mode 100644 index 000000000..b615a2d8e --- /dev/null +++ b/libreplan-webapp/src/main/webapp/jqplot/examples/pie-donut-charts.html @@ -0,0 +1,160 @@ + + + + + + Pie and Donut Charts + + + + + + + + + + + + + +
    + + + + + + + +

    jqPlot bakes up the best pie and donut charts you've ever tasted! Like bar and filled line plots, pie and donut slices highlight when you mouse over.

    + +
    + +
    
    +
    +

    Too many calories in that pie? Get all the taste without the filling! Highlighting and data labels are still supported. You can even cut out the slices!

    + +
    + +
    
    +
    +

    Coming straight from the same bakery, donut plots have nearly identical options as pie charts.

    + +
    + +
    
    +  
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +    
    +    
    +    
    +    
    +
    +
    +
    +
    +    
    +    
    +
    +
    +
    +
    +	
    + + + + + + \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/examples/pieTest.html b/libreplan-webapp/src/main/webapp/jqplot/examples/pieTest.html new file mode 100644 index 000000000..f215dc847 --- /dev/null +++ b/libreplan-webapp/src/main/webapp/jqplot/examples/pieTest.html @@ -0,0 +1,187 @@ + + + + + + Pie Charts and Options + + + + + + + + + + + + + +
    + + + + + + + +
    + +
    + +
    + +
    + +
    + +
    + +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/examples/pieTest2.js b/libreplan-webapp/src/main/webapp/jqplot/examples/pieTest2.js new file mode 100644 index 000000000..91073fe63 --- /dev/null +++ b/libreplan-webapp/src/main/webapp/jqplot/examples/pieTest2.js @@ -0,0 +1,80 @@ +$(document).ready(function(){ + + $.jqplot.config.enablePlugins = true; + + s1 = [['a',2], ['b',6], ['c',7], ['d',10]]; + s2 = [['a', 4], ['b', 7], ['c', 6], ['d', 3]]; + s3 = [['a', 2], ['b', 1], ['c', 3], ['d', 3]]; + s4 = [['a', 4], ['b', 3], ['c', 2], ['d', 1]]; + + s5 = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]; + + plot1 = $.jqplot('chart1', [s1], { + seriesDefaults:{ + renderer:$.jqplot.PieRenderer + }, + legend: {show:true} + }); + + plot2 = $.jqplot('chart2', [s2], { + seriesDefaults: { + renderer:$.jqplot.PieRenderer, + rendererOptions:{ + sliceMargin: 4, + startAngle: -90 + } + } + }); + + plot3 = $.jqplot('chart3', [s3], { + captureRightClick: true, + seriesDefaults:{ + renderer:$.jqplot.PieRenderer, + shadow: false, + rendererOptions:{ + startAngle: 90, + sliceMargin: 4, + highlightMouseDown: true + } + }, + legend: { + show: true, + location: 'e', + placement: 'outside' + } + }); + + plot5 = $.jqplot('chart5', [s5], { + seriesDefaults:{ + renderer:$.jqplot.PieRenderer + } + }); + + plot6 = $.jqplot('chart6', [[1,2,3,4]]); + + $('#chart1').bind('jqplotDataClick', + function (ev, seriesIndex, pointIndex, data) { + $('#info1').html('series: '+seriesIndex+', point: '+pointIndex+', data: '+data); + } + ); + + $('#chart2').bind('jqplotDataHighlight', + function (ev, seriesIndex, pointIndex, data) { + $('#info2').html('series: '+seriesIndex+', point: '+pointIndex+', data: '+data); + } + ); + + $('#chart2').bind('jqplotDataUnhighlight', + function (ev) { + $('#info2').html('Nothing'); + } + ); + + $('#chart3').bind('jqplotDataRightClick', + function (ev, seriesIndex, pointIndex, data) { + $('#info3').html('series: '+seriesIndex+', point: '+pointIndex+', data: '+data); + } + ); + + $(document).unload(function() {$('*').unbind(); }); +}); \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/examples/pieTest4.html b/libreplan-webapp/src/main/webapp/jqplot/examples/pieTest4.html new file mode 100644 index 000000000..30ecf4686 --- /dev/null +++ b/libreplan-webapp/src/main/webapp/jqplot/examples/pieTest4.html @@ -0,0 +1,258 @@ + + + + + + Pie Charts and Options 2 + + + + + + + + + + + + + +
    + + + + + + +
    + +
    
    + 
    +    
    + +
    
    +
    +    
    +
    
    +  
    +    
    +
    
    +
    +    
    +
    
    +
    +    
    +
    
    +
    +    
    +
    
    +
    +    
    +
    
    +
    +    
    +
    
    +
    +    
    +
    
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +    
    +    
    +    
    +    
    +
    +
    +
    +
    +  
    +
    +
    +
    +
    +	
    + + + + + + \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/examples/point-labels.html b/libreplan-webapp/src/main/webapp/jqplot/examples/point-labels.html new file mode 100644 index 000000000..31003123a --- /dev/null +++ b/libreplan-webapp/src/main/webapp/jqplot/examples/point-labels.html @@ -0,0 +1,193 @@ + + + + + + Data Point labels + + + + + + + + + + + + + +
    + + + + + + + +

    The pointLabels plugin places labels on the plot at the data point locations. Labeles can use the series data array or a separate labels array. If using the series data, the last value in the data point array is used as the label by default.

    + +
    + +
    
    +
    +

    Additional data can be added to the series and it will be used for labels. If additional data is provided, each data point must have a value for the label, even if it is "null".

    + +
    + +
    
    + 
    +

    Labels work with Bar charts as well. Here, the Labels have been supplied through the "labels" array on the "pointLabels" option to the series. Also, additional css styling has been provided to the labels.

    + +
    + +
    +
    +
    +
    
    +
    +

    Point labels can be used on stacked bar charts. If no labels array is specified, they will use data from the chart. Values can be displayed individually for each series (stackedValue option is false, the default), or cumulative values for all series can be displayed (stackedValue option is true).

    + +
    + +
    
    +
    +

    Data point labels have an "edgeTolerance" option. This options controls how close the data point label can be to an axis edge and still be drawn. The default of 0 allows labels to touch the axis. Positive values will increase the required distance between the axis and label, negative values will allow labels to overlap axes.

    + +
    + +
    
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +    
    +    
    +    
    +    
    +
    +
    +
    +    
    +    
    +    
    +
    +
    +
    +
    +	
    + + + + + + \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/examples/resizablePlot.html b/libreplan-webapp/src/main/webapp/jqplot/examples/resizablePlot.html new file mode 100644 index 000000000..1c46db1ea --- /dev/null +++ b/libreplan-webapp/src/main/webapp/jqplot/examples/resizablePlot.html @@ -0,0 +1,196 @@ + + + + + + Resizable Plots + + + + + + + + + + + + + +
    + + + + + + + + +

    Plot targets can be placed inside of resizable containers for dynamic plot sizing. The examples here use the jQuery UI package for resizing functionality.

    + + + + +
    +
    +
    +
    +
    + +

    The first plot has good resize performance in Firefox, Safari and other canvas enabled browsers. The plot will resize dynamically with the container. IE performance will be slow since IE doesn't natively support the canvas element.

    + +

    Resizing is handled by binding a handler to the 'resize' event. The handler function replots the plot during resize. Here, the plot targets's height and width must be specified as a percentage of the container and the container must be visible.

    + +

    The event handler looks like:

    +
    +    $('#resizable1').bind('resize', function(event, ui) {
    +        plot1.replot( { resetAxes: true } );
    +    });
    +
    +
    + + +
    + +
    +
    +
    +
    +

    The second plot uses an alternative sizing method that is more responsive in all browsers, especially IE. The differnece? First, the plot target is given a static height and width that will fit inside the resizable container. Then, instead of resizing dynamically with the container, the plots replot() method is called at the end of the resize. When resizing is done, the plot targets hieght and width are set to a percentage of the container's and then the replot method is called.

    + +

    Also, an options object is passed into the replot method. It contains a single option, resetAxes, which, if true, resets all axes so the min, max, numberTicks and tickInterval are recalculated.

    +
    +    $('#resizable2').bind('resizestop', function(event, ui) {
    +        $('#chart2').height($('#resizable2').height()*0.96);
    +        $('#chart2').width($('#resizable2').width()*0.96);
    +        plot2.replot({resetAxes:true});
    +    });
    +
    + +

    You can also pass in option objects to reset specific axes like:

    + +
    +    {resetAxes:['yaxis', 'y2axis']};
    +    
    +    or
    +    
    +    {resetAxes:{yaxis:true, y2axis:true}};
    +
    + +
    + +
    
    +
    +
    +  
    +
    +
    +
    +
    +
    +
    +    
    +    
    +    
    +    
    +
    +
    +
    +
    +  
    +  
    +  
    +  
    +   
    +  
    +
    +
    +
    +	
    + + + + + + \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/examples/rotated-tick-labels.html b/libreplan-webapp/src/main/webapp/jqplot/examples/rotated-tick-labels.html new file mode 100644 index 000000000..ebf8f76d2 --- /dev/null +++ b/libreplan-webapp/src/main/webapp/jqplot/examples/rotated-tick-labels.html @@ -0,0 +1,216 @@ + + + + + + Rotated Labels and Font Styling + + + + + + + + + + + + + +
    + + + + + + +

    Rotated axis tick labels are possible through the "jqplot.canvasTextRenderer.min.js" and "jqplot.canvasAxisTickRenderer.min.js" plugins. Native canvas font rendering capabilities are used in supported browsers. This includes most recent browsers (including IE 9). In browsers which don't support native canvas font text, text is rendered in the Hershey font.

    + +
    + +
    
    +
    +
    +
    +

    For comparison, here is the same graph with the "fontFamily" and "fontSize" set. If you have a supported browser, you should see a difference in label fonts.

    + +
    + +
    
    +
    + 
    +

    The default positioning applies to either primary or secondary axes and accounts for label rotation to ensure that the labels point to the appropriate bar or tick position.

    + +

    Also note here the use of the "autoscale" option on the y axes. Turning this option on will force the y axes to line up tick marks for consistend grid lines across the grid.

    + +
    + +
    
    +
    +
    +

    You can override the default position by specifying a labelPosition of 'start', 'middle' or 'end'. The results probably are not as pleasing as the default 'auto' setting.

    + +
    + +
    
    +
    +  
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +    
    +    
    +    
    +    
    +
    +
    +
    +
    +  
    +  
    +  
    +  
    +  
    +
    +
    +
    +
    +	
    + + + + + + \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/examples/rotatedTickLabelsZoom.html b/libreplan-webapp/src/main/webapp/jqplot/examples/rotatedTickLabelsZoom.html new file mode 100644 index 000000000..db4a5a364 --- /dev/null +++ b/libreplan-webapp/src/main/webapp/jqplot/examples/rotatedTickLabelsZoom.html @@ -0,0 +1,118 @@ + + + + + + Date Axes, Rotated Labels and Zooming + + + + + + + + + + + + + +
    + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/examples/smoothedLine.html b/libreplan-webapp/src/main/webapp/jqplot/examples/smoothedLine.html new file mode 100644 index 000000000..b92231d7d --- /dev/null +++ b/libreplan-webapp/src/main/webapp/jqplot/examples/smoothedLine.html @@ -0,0 +1,137 @@ + + + + + + Smoothed Lines + + + + + + + + + + + + + +
    + + + + + + + + + +
    + +
    
    +  
    +    
    +
    +
    +
    +
    +
    +
    +    
    +    
    +    
    +    
    +
    +
    +
    +    
    +
    +
    +
    +
    +	
    + + + + + + \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/examples/syntaxhighlighter/LGPL-LICENSE b/libreplan-webapp/src/main/webapp/jqplot/examples/syntaxhighlighter/LGPL-LICENSE new file mode 100644 index 000000000..3f9959fc5 --- /dev/null +++ b/libreplan-webapp/src/main/webapp/jqplot/examples/syntaxhighlighter/LGPL-LICENSE @@ -0,0 +1,165 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + + This version of the GNU Lesser General Public License incorporates +the terms and conditions of version 3 of the GNU General Public +License, supplemented by the additional permissions listed below. + + 0. Additional Definitions. + + As used herein, "this License" refers to version 3 of the GNU Lesser +General Public License, and the "GNU GPL" refers to version 3 of the GNU +General Public License. + + "The Library" refers to a covered work governed by this License, +other than an Application or a Combined Work as defined below. + + An "Application" is any work that makes use of an interface provided +by the Library, but which is not otherwise based on the Library. +Defining a subclass of a class defined by the Library is deemed a mode +of using an interface provided by the Library. + + A "Combined Work" is a work produced by combining or linking an +Application with the Library. The particular version of the Library +with which the Combined Work was made is also called the "Linked +Version". + + The "Minimal Corresponding Source" for a Combined Work means the +Corresponding Source for the Combined Work, excluding any source code +for portions of the Combined Work that, considered in isolation, are +based on the Application, and not on the Linked Version. + + The "Corresponding Application Code" for a Combined Work means the +object code and/or source code for the Application, including any data +and utility programs needed for reproducing the Combined Work from the +Application, but excluding the System Libraries of the Combined Work. + + 1. Exception to Section 3 of the GNU GPL. + + You may convey a covered work under sections 3 and 4 of this License +without being bound by section 3 of the GNU GPL. + + 2. Conveying Modified Versions. + + If you modify a copy of the Library, and, in your modifications, a +facility refers to a function or data to be supplied by an Application +that uses the facility (other than as an argument passed when the +facility is invoked), then you may convey a copy of the modified +version: + + a) under this License, provided that you make a good faith effort to + ensure that, in the event an Application does not supply the + function or data, the facility still operates, and performs + whatever part of its purpose remains meaningful, or + + b) under the GNU GPL, with none of the additional permissions of + this License applicable to that copy. + + 3. Object Code Incorporating Material from Library Header Files. + + The object code form of an Application may incorporate material from +a header file that is part of the Library. You may convey such object +code under terms of your choice, provided that, if the incorporated +material is not limited to numerical parameters, data structure +layouts and accessors, or small macros, inline functions and templates +(ten or fewer lines in length), you do both of the following: + + a) Give prominent notice with each copy of the object code that the + Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the object code with a copy of the GNU GPL and this license + document. + + 4. Combined Works. + + You may convey a Combined Work under terms of your choice that, +taken together, effectively do not restrict modification of the +portions of the Library contained in the Combined Work and reverse +engineering for debugging such modifications, if you also do each of +the following: + + a) Give prominent notice with each copy of the Combined Work that + the Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the Combined Work with a copy of the GNU GPL and this license + document. + + c) For a Combined Work that displays copyright notices during + execution, include the copyright notice for the Library among + these notices, as well as a reference directing the user to the + copies of the GNU GPL and this license document. + + d) Do one of the following: + + 0) Convey the Minimal Corresponding Source under the terms of this + License, and the Corresponding Application Code in a form + suitable for, and under terms that permit, the user to + recombine or relink the Application with a modified version of + the Linked Version to produce a modified Combined Work, in the + manner specified by section 6 of the GNU GPL for conveying + Corresponding Source. + + 1) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (a) uses at run time + a copy of the Library already present on the user's computer + system, and (b) will operate properly with a modified version + of the Library that is interface-compatible with the Linked + Version. + + e) Provide Installation Information, but only if you would otherwise + be required to provide such information under section 6 of the + GNU GPL, and only to the extent that such information is + necessary to install and execute a modified version of the + Combined Work produced by recombining or relinking the + Application with a modified version of the Linked Version. (If + you use option 4d0, the Installation Information must accompany + the Minimal Corresponding Source and Corresponding Application + Code. If you use option 4d1, you must provide the Installation + Information in the manner specified by section 6 of the GNU GPL + for conveying Corresponding Source.) + + 5. Combined Libraries. + + You may place library facilities that are a work based on the +Library side by side in a single library together with other library +facilities that are not Applications and are not covered by this +License, and convey such a combined library under terms of your +choice, if you do both of the following: + + a) Accompany the combined library with a copy of the same work based + on the Library, uncombined with any other library facilities, + conveyed under the terms of this License. + + b) Give prominent notice with the combined library that part of it + is a work based on the Library, and explaining where to find the + accompanying uncombined form of the same work. + + 6. Revised Versions of the GNU Lesser General Public License. + + The Free Software Foundation may publish revised and/or new versions +of the GNU Lesser General Public License from time to time. Such new +versions will be similar in spirit to the present version, but may +differ in detail to address new problems or concerns. + + Each version is given a distinguishing version number. If the +Library as you received it specifies that a certain numbered version +of the GNU Lesser General Public License "or any later version" +applies to it, you have the option of following the terms and +conditions either of that published version or of any later version +published by the Free Software Foundation. If the Library as you +received it does not specify a version number of the GNU Lesser +General Public License, you may choose any version of the GNU Lesser +General Public License ever published by the Free Software Foundation. + + If the Library as you received it specifies that a proxy can decide +whether future versions of the GNU Lesser General Public License shall +apply, that proxy's public statement of acceptance of any version is +permanent authorization for you to choose that version for the +Library. \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/examples/syntaxhighlighter/MIT-LICENSE b/libreplan-webapp/src/main/webapp/jqplot/examples/syntaxhighlighter/MIT-LICENSE new file mode 100644 index 000000000..e7c70ba14 --- /dev/null +++ b/libreplan-webapp/src/main/webapp/jqplot/examples/syntaxhighlighter/MIT-LICENSE @@ -0,0 +1,20 @@ +Copyright (c) 2003, 2004 Jim Weirich + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/libreplan-webapp/src/main/webapp/jqplot/examples/syntaxhighlighter/scripts/shAutoloader.js b/libreplan-webapp/src/main/webapp/jqplot/examples/syntaxhighlighter/scripts/shAutoloader.js new file mode 100644 index 000000000..4e29bddec --- /dev/null +++ b/libreplan-webapp/src/main/webapp/jqplot/examples/syntaxhighlighter/scripts/shAutoloader.js @@ -0,0 +1,17 @@ +/** + * SyntaxHighlighter + * http://alexgorbatchev.com/SyntaxHighlighter + * + * SyntaxHighlighter is donationware. If you are using it, please donate. + * http://alexgorbatchev.com/SyntaxHighlighter/donate.html + * + * @version + * 3.0.83 (July 02 2010) + * + * @copyright + * Copyright (C) 2004-2010 Alex Gorbatchev. + * + * @license + * Dual licensed under the MIT and GPL licenses. + */ +eval(function(p,a,c,k,e,d){e=function(c){return(c35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--){d[e(c)]=k[c]||e(c)}k=[function(e){return d[e]}];e=function(){return'\\w+'};c=1};while(c--){if(k[c]){p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c])}}return p}('(2(){1 h=5;h.I=2(){2 n(c,a){4(1 d=0;d35?String.fromCharCode(a+29):a.toString(36))};if(!"".replace(/^/,String)){while(j--){i[g(j)]=f[j]||g(j)}f=[function(a){return i[a]}];g=function(){return"\\w+"};j=1}while(j--){if(f[j]){h=h.replace(new RegExp("\\b"+g(j)+"\\b","g"),f[j])}}return h}('(2(){1 h=5;h.I=2(){2 n(c,a){4(1 d=0;d[:\\w-\\.]+)', 'xg').exec(code), + result = [] + ; + + if (match.attributes != null) + { + var attributes, + regex = new XRegExp('(? [\\w:\\-\\.]+)' + + '\\s*=\\s*' + + '(? ".*?"|\'.*?\'|\\w+)', + 'xg'); + + while ((attributes = regex.exec(code)) != null) + { + result.push(new constructor(attributes.name, match.index + attributes.index, 'color1')); + result.push(new constructor(attributes.value, match.index + attributes.index + attributes[0].indexOf(attributes.value), 'string')); + } + } + + if (tag != null) + result.push( + new constructor(tag.name, match.index + tag[0].indexOf(tag.name), 'keyword') + ); + + return result; + } + + this.regexList = [ + { regex: new XRegExp('(\\<|<)\\!\\[[\\w\\s]*?\\[(.|\\s)*?\\]\\](\\>|>)', 'gm'), css: 'color2' }, // + { regex: SyntaxHighlighter.regexLib.xmlComments, css: 'comments' }, // + { regex: new XRegExp('(<|<)[\\s\\/\\?]*(\\w+)(?.*?)[\\s\\/\\?]*(>|>)', 'sg'), func: process } + ]; + }; + + Brush.prototype = new SyntaxHighlighter.Highlighter(); + Brush.aliases = ['xml', 'xhtml', 'xslt', 'html']; + + SyntaxHighlighter.brushes.Xml = Brush; + + // CommonJS + typeof(exports) != 'undefined' ? exports.Brush = Brush : null; +})(); diff --git a/libreplan-webapp/src/main/webapp/jqplot/examples/syntaxhighlighter/scripts/shBrushXml.min.js b/libreplan-webapp/src/main/webapp/jqplot/examples/syntaxhighlighter/scripts/shBrushXml.min.js new file mode 100644 index 000000000..a1c959c79 --- /dev/null +++ b/libreplan-webapp/src/main/webapp/jqplot/examples/syntaxhighlighter/scripts/shBrushXml.min.js @@ -0,0 +1 @@ +(function(){typeof(require)!="undefined"?SyntaxHighlighter=require("shCore").SyntaxHighlighter:null;function a(){function b(f,j){var g=SyntaxHighlighter.Match,i=f[0],d=new XRegExp("(<|<)[\\s\\/\\?]*(?[:\\w-\\.]+)","xg").exec(i),c=[];if(f.attributes!=null){var e,h=new XRegExp("(? [\\w:\\-\\.]+)\\s*=\\s*(? \".*?\"|'.*?'|\\w+)","xg");while((e=h.exec(i))!=null){c.push(new g(e.name,f.index+e.index,"color1"));c.push(new g(e.value,f.index+e.index+e[0].indexOf(e.value),"string"))}}if(d!=null){c.push(new g(d.name,f.index+d[0].indexOf(d.name),"keyword"))}return c}this.regexList=[{regex:new XRegExp("(\\<|<)\\!\\[[\\w\\s]*?\\[(.|\\s)*?\\]\\](\\>|>)","gm"),css:"color2"},{regex:SyntaxHighlighter.regexLib.xmlComments,css:"comments"},{regex:new XRegExp("(<|<)[\\s\\/\\?]*(\\w+)(?.*?)[\\s\\/\\?]*(>|>)","sg"),func:b}]}a.prototype=new SyntaxHighlighter.Highlighter();a.aliases=["xml","xhtml","xslt","html"];SyntaxHighlighter.brushes.Xml=a;typeof(exports)!="undefined"?exports.Brush=a:null})(); \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/examples/syntaxhighlighter/scripts/shCore.js b/libreplan-webapp/src/main/webapp/jqplot/examples/syntaxhighlighter/scripts/shCore.js new file mode 100644 index 000000000..b47b64547 --- /dev/null +++ b/libreplan-webapp/src/main/webapp/jqplot/examples/syntaxhighlighter/scripts/shCore.js @@ -0,0 +1,17 @@ +/** + * SyntaxHighlighter + * http://alexgorbatchev.com/SyntaxHighlighter + * + * SyntaxHighlighter is donationware. If you are using it, please donate. + * http://alexgorbatchev.com/SyntaxHighlighter/donate.html + * + * @version + * 3.0.83 (July 02 2010) + * + * @copyright + * Copyright (C) 2004-2010 Alex Gorbatchev. + * + * @license + * Dual licensed under the MIT and GPL licenses. + */ +eval(function(p,a,c,k,e,d){e=function(c){return(c35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--){d[e(c)]=k[c]||e(c)}k=[function(e){return d[e]}];e=function(){return'\\w+'};c=1};while(c--){if(k[c]){p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c])}}return p}('K M;I(M)1S 2U("2a\'t 4k M 4K 2g 3l 4G 4H");(6(){6 r(f,e){I(!M.1R(f))1S 3m("3s 15 4R");K a=f.1w;f=M(f.1m,t(f)+(e||""));I(a)f.1w={1m:a.1m,19:a.19?a.19.1a(0):N};H f}6 t(f){H(f.1J?"g":"")+(f.4s?"i":"")+(f.4p?"m":"")+(f.4v?"x":"")+(f.3n?"y":"")}6 B(f,e,a,b){K c=u.L,d,h,g;v=R;5K{O(;c--;){g=u[c];I(a&g.3r&&(!g.2p||g.2p.W(b))){g.2q.12=e;I((h=g.2q.X(f))&&h.P===e){d={3k:g.2b.W(b,h,a),1C:h};1N}}}}5v(i){1S i}5q{v=11}H d}6 p(f,e,a){I(3b.Z.1i)H f.1i(e,a);O(a=a||0;a-1},3d:6(g){e+=g}};c1&&p(e,"")>-1){a=15(J.1m,n.Q.W(t(J),"g",""));n.Q.W(f.1a(e.P),a,6(){O(K c=1;c<14.L-2;c++)I(14[c]===1d)e[c]=1d})}I(J.1w&&J.1w.19)O(K b=1;be.P&&J.12--}H e};I(!D)15.Z.1A=6(f){(f=n.X.W(J,f))&&J.1J&&!f[0].L&&J.12>f.P&&J.12--;H!!f};1r.Z.1C=6(f){M.1R(f)||(f=15(f));I(f.1J){K e=n.1C.1p(J,14);f.12=0;H e}H f.X(J)};1r.Z.Q=6(f,e){K a=M.1R(f),b,c;I(a&&1j e.58()==="3f"&&e.1i("${")===-1&&y)H n.Q.1p(J,14);I(a){I(f.1w)b=f.1w.19}Y f+="";I(1j e==="6")c=n.Q.W(J,f,6(){I(b){14[0]=1f 1r(14[0]);O(K d=0;dd.L-3;){i=1r.Z.1a.W(g,-1)+i;g=1Q.3i(g/10)}H(g?d[g]||"":"$")+i}Y{g=+i;I(g<=d.L-3)H d[g];g=b?p(b,i):-1;H g>-1?d[g+1]:h}})})}I(a&&f.1J)f.12=0;H c};1r.Z.1e=6(f,e){I(!M.1R(f))H n.1e.1p(J,14);K a=J+"",b=[],c=0,d,h;I(e===1d||+e<0)e=5D;Y{e=1Q.3i(+e);I(!e)H[]}O(f=M.3c(f);d=f.X(a);){I(f.12>c){b.U(a.1a(c,d.P));d.L>1&&d.P=e)1N}f.12===d.P&&f.12++}I(c===a.L){I(!n.1A.W(f,"")||h)b.U("")}Y b.U(a.1a(c));H b.L>e?b.1a(0,e):b};M.1h(/\\(\\?#[^)]*\\)/,6(f){H n.1A.W(A,f.2S.1a(f.P+f[0].L))?"":"(?:)"});M.1h(/\\((?!\\?)/,6(){J.19.U(N);H"("});M.1h(/\\(\\?<([$\\w]+)>/,6(f){J.19.U(f[1]);J.2N=R;H"("});M.1h(/\\\\k<([\\w$]+)>/,6(f){K e=p(J.19,f[1]);H e>-1?"\\\\"+(e+1)+(3R(f.2S.3a(f.P+f[0].L))?"":"(?:)"):f[0]});M.1h(/\\[\\^?]/,6(f){H f[0]==="[]"?"\\\\b\\\\B":"[\\\\s\\\\S]"});M.1h(/^\\(\\?([5A]+)\\)/,6(f){J.3d(f[1]);H""});M.1h(/(?:\\s+|#.*)+/,6(f){H n.1A.W(A,f.2S.1a(f.P+f[0].L))?"":"(?:)"},M.1B,6(){H J.2K("x")});M.1h(/\\./,6(){H"[\\\\s\\\\S]"},M.1B,6(){H J.2K("s")})})();1j 2e!="1d"&&(2e.M=M);K 1v=6(){6 r(a,b){a.1l.1i(b)!=-1||(a.1l+=" "+b)}6 t(a){H a.1i("3e")==0?a:"3e"+a}6 B(a){H e.1Y.2A[t(a)]}6 p(a,b,c){I(a==N)H N;K d=c!=R?a.3G:[a.2G],h={"#":"1c",".":"1l"}[b.1o(0,1)]||"3h",g,i;g=h!="3h"?b.1o(1):b.5u();I((a[h]||"").1i(g)!=-1)H a;O(a=0;d&&a\'+c+""});H a}6 n(a,b){a.1e("\\n");O(K c="",d=0;d<50;d++)c+=" ";H a=v(a,6(h){I(h.1i("\\t")==-1)H h;O(K g=0;(g=h.1i("\\t"))!=-1;)h=h.1o(0,g)+c.1o(0,b-g%b)+h.1o(g+1,h.L);H h})}6 x(a){H a.Q(/^\\s+|\\s+$/g,"")}6 D(a,b){I(a.Pb.P)H 1;Y I(a.Lb.L)H 1;H 0}6 y(a,b){6 c(k){H k[0]}O(K d=N,h=[],g=b.2D?b.2D:c;(d=b.1I.X(a))!=N;){K i=g(d,b);I(1j i=="3f")i=[1f e.2L(i,d.P,b.23)];h=h.1O(i)}H h}6 E(a){K b=/(.*)((&1G;|&1y;).*)/;H a.Q(e.3A.3M,6(c){K d="",h=N;I(h=b.X(c)){c=h[1];d=h[2]}H\'\'+c+""+d})}6 z(){O(K a=1E.36("1k"),b=[],c=0;c<1z 4I="1Z://2y.3L.3K/4L/5L"><3J><4N 1Z-4M="5G-5M" 6K="2O/1z; 6J=6I-8" /><1t>6L 1v<3B 1L="25-6M:6Q,6P,6O,6N-6F;6y-2f:#6x;2f:#6w;25-22:6v;2O-3D:3C;">1v3v 3.0.76 (72 73 3x)1Z://3u.2w/1v70 17 6U 71.6T 6X-3x 6Y 6D.6t 61 60 J 1k, 5Z 5R 5V <2R/>5U 5T 5S!\'}},1Y:{2j:N,2A:{}},1U:{},3A:{6n:/\\/\\*[\\s\\S]*?\\*\\//2c,6m:/\\/\\/.*$/2c,6l:/#.*$/2c,6k:/"([^\\\\"\\n]|\\\\.)*"/g,6o:/\'([^\\\\\'\\n]|\\\\.)*\'/g,6p:1f M(\'"([^\\\\\\\\"]|\\\\\\\\.)*"\',"3z"),6s:1f M("\'([^\\\\\\\\\']|\\\\\\\\.)*\'","3z"),6q:/(&1y;|<)!--[\\s\\S]*?--(&1G;|>)/2c,3M:/\\w+:\\/\\/[\\w-.\\/?%&=:@;]*/g,6a:{18:/(&1y;|<)\\?=?/g,1b:/\\?(&1G;|>)/g},69:{18:/(&1y;|<)%=?/g,1b:/%(&1G;|>)/g},6d:{18:/(&1y;|<)\\s*1k.*?(&1G;|>)/2T,1b:/(&1y;|<)\\/\\s*1k\\s*(&1G;|>)/2T}},16:{1H:6(a){6 b(i,k){H e.16.2o(i,k,e.13.1x[k])}O(K c=\'\',d=e.16.2x,h=d.2X,g=0;g";H c},2o:6(a,b,c){H\'<2W>\'+c+""},2b:6(a){K b=a.1F,c=b.1l||"";b=B(p(b,".20",R).1c);K d=6(h){H(h=15(h+"6f(\\\\w+)").X(c))?h[1]:N}("6g");b&&d&&e.16.2x[d].2B(b);a.3N()},2x:{2X:["21","2P"],21:{1H:6(a){I(a.V("2l")!=R)H"";K b=a.V("1t");H e.16.2o(a,"21",b?b:e.13.1x.21)},2B:6(a){a=1E.6j(t(a.1c));a.1l=a.1l.Q("47","")}},2P:{2B:6(){K a="68=0";a+=", 18="+(31.30-33)/2+", 32="+(31.2Z-2Y)/2+", 30=33, 2Z=2Y";a=a.Q(/^,/,"");a=1P.6Z("","38",a);a.2C();K b=a.1E;b.6W(e.13.1x.37);b.6V();a.2C()}}}},35:6(a,b){K c;I(b)c=[b];Y{c=1E.36(e.13.34);O(K d=[],h=0;h(.*?))\\\\]$"),s=1f M("(?<27>[\\\\w-]+)\\\\s*:\\\\s*(?<1T>[\\\\w-%#]+|\\\\[.*?\\\\]|\\".*?\\"|\'.*?\')\\\\s*;?","g");(j=s.X(k))!=N;){K o=j.1T.Q(/^[\'"]|[\'"]$/g,"");I(o!=N&&m.1A(o)){o=m.X(o);o=o.2V.L>0?o.2V.1e(/\\s*,\\s*/):[]}l[j.27]=o}g={1F:g,1n:C(i,l)};g.1n.1D!=N&&d.U(g)}H d},1M:6(a,b){K c=J.35(a,b),d=N,h=e.13;I(c.L!==0)O(K g=0;g")==o-3){m=m.4h(0,o-3);s=R}l=s?m:l}I((i.1t||"")!="")k.1t=i.1t;k.1D=j;d.2Q(k);b=d.2F(l);I((i.1c||"")!="")b.1c=i.1c;i.2G.74(b,i)}}},2E:6(a){w(1P,"4k",6(){e.1M(a)})}};e.2E=e.2E;e.1M=e.1M;e.2L=6(a,b,c){J.1T=a;J.P=b;J.L=a.L;J.23=c;J.1V=N};e.2L.Z.1q=6(){H J.1T};e.4l=6(a){6 b(j,l){O(K m=0;md)1N;Y I(g.P==c.P&&g.L>c.L)a[b]=N;Y I(g.P>=c.P&&g.P\'+c+""},3Q:6(a,b){K c="",d=a.1e("\\n").L,h=2u(J.V("2i-1s")),g=J.V("2z-1s-2t");I(g==R)g=(h+d-1).1q().L;Y I(3R(g)==R)g=0;O(K i=0;i\'+j+"":"")+i)}H a},4f:6(a){H a?"<4a>"+a+"":""},4b:6(a,b){6 c(l){H(l=l?l.1V||g:g)?l+" ":""}O(K d=0,h="",g=J.V("1D",""),i=0;i|&1y;2R\\s*\\/?&1G;/2T;I(e.13.46==R)b=b.Q(h,"\\n");I(e.13.44==R)b=b.Q(h,"");b=b.1e("\\n");h=/^\\s*/;g=4Q;O(K i=0;i0;i++){K k=b[i];I(x(k).L!=0){k=h.X(k);I(k==N){a=a;1N a}g=1Q.4q(k[0].L,g)}}I(g>0)O(i=0;i\'+(J.V("16")?e.16.1H(J):"")+\'<3Z 5z="0" 5H="0" 5J="0">\'+J.4f(J.V("1t"))+"<3T><3P>"+(1u?\'<2d 1g="1u">\'+J.3Q(a)+"":"")+\'<2d 1g="17">\'+b+""},2F:6(a){I(a===N)a="";J.17=a;K b=J.3Y("T");b.3X=J.1H(a);J.V("16")&&w(p(b,".16"),"5c",e.16.2b);J.V("3V-17")&&w(p(b,".17"),"56",f);H b},2Q:6(a){J.1c=""+1Q.5d(1Q.5n()*5k).1q();e.1Y.2A[t(J.1c)]=J;J.1n=C(e.2v,a||{});I(J.V("2k")==R)J.1n.16=J.1n.1u=11},5j:6(a){a=a.Q(/^\\s+|\\s+$/g,"").Q(/\\s+/g,"|");H"\\\\b(?:"+a+")\\\\b"},5f:6(a){J.28={18:{1I:a.18,23:"1k"},1b:{1I:a.1b,23:"1k"},17:1f M("(?<18>"+a.18.1m+")(?<17>.*?)(?<1b>"+a.1b.1m+")","5o")}}};H e}();1j 2e!="1d"&&(2e.1v=1v);',62,441,'||||||function|||||||||||||||||||||||||||||||||||||return|if|this|var|length|XRegExp|null|for|index|replace|true||div|push|getParam|call|exec|else|prototype||false|lastIndex|config|arguments|RegExp|toolbar|code|left|captureNames|slice|right|id|undefined|split|new|class|addToken|indexOf|typeof|script|className|source|params|substr|apply|toString|String|line|title|gutter|SyntaxHighlighter|_xregexp|strings|lt|html|test|OUTSIDE_CLASS|match|brush|document|target|gt|getHtml|regex|global|join|style|highlight|break|concat|window|Math|isRegExp|throw|value|brushes|brushName|space|alert|vars|http|syntaxhighlighter|expandSource|size|css|case|font|Fa|name|htmlScript|dA|can|handler|gm|td|exports|color|in|href|first|discoveredBrushes|light|collapse|object|cache|getButtonHtml|trigger|pattern|getLineHtml|nbsp|numbers|parseInt|defaults|com|items|www|pad|highlighters|execute|focus|func|all|getDiv|parentNode|navigator|INSIDE_CLASS|regexList|hasFlag|Match|useScriptTags|hasNamedCapture|text|help|init|br|input|gi|Error|values|span|list|250|height|width|screen|top|500|tagName|findElements|getElementsByTagName|aboutDialog|_blank|appendChild|charAt|Array|copyAsGlobal|setFlag|highlighter_|string|attachEvent|nodeName|floor|backref|output|the|TypeError|sticky|Za|iterate|freezeTokens|scope|type|textarea|alexgorbatchev|version|margin|2010|005896|gs|regexLib|body|center|align|noBrush|require|childNodes|DTD|xhtml1|head|org|w3|url|preventDefault|container|tr|getLineNumbersHtml|isNaN|userAgent|tbody|isLineHighlighted|quick|void|innerHTML|create|table|links|auto|smart|tab|stripBrs|tabs|bloggerMode|collapsed|plain|getCodeLinesHtml|caption|getMatchesHtml|findMatches|figureOutLineNumbers|removeNestedMatches|getTitleHtml|brushNotHtmlScript|substring|createElement|Highlighter|load|HtmlScript|Brush|pre|expand|multiline|min|Can|ignoreCase|find|blur|extended|toLowerCase|aliases|addEventListener|innerText|textContent|wasn|select|createTextNode|removeChild|option|same|frame|xmlns|dtd|twice|1999|equiv|meta|htmlscript|transitional|1E3|expected|PUBLIC|DOCTYPE|on|W3C|XHTML|TR|EN|Transitional||configured|srcElement|Object|after|run|dblclick|matchChain|valueOf|constructor|default|switch|click|round|execAt|forHtmlScript|token|gimy|functions|getKeywords|1E6|escape|within|random|sgi|another|finally|supply|MSIE|ie|toUpperCase|catch|returnValue|definition|event|border|imsx|constructing|one|Infinity|from|when|Content|cellpadding|flags|cellspacing|try|xhtml|Type|spaces|2930402|hosted_button_id|lastIndexOf|donate|active|development|keep|to|xclick|_s|Xml|please|like|you|paypal|cgi|cmd|webscr|bin|highlighted|scrollbars|aspScriptTags|phpScriptTags|sort|max|scriptScriptTags|toolbar_item|_|command|command_|number|getElementById|doubleQuotedString|singleLinePerlComments|singleLineCComments|multiLineCComments|singleQuotedString|multiLineDoubleQuotedString|xmlComments|alt|multiLineSingleQuotedString|If|https|1em|000|fff|background|5em|xx|bottom|75em|Gorbatchev|large|serif|CDATA|continue|utf|charset|content|About|family|sans|Helvetica|Arial|Geneva|3em|nogutter|Copyright|syntax|close|write|2004|Alex|open|JavaScript|highlighter|July|02|replaceChild|offset|83'.split('|'),0,{})) diff --git a/libreplan-webapp/src/main/webapp/jqplot/examples/syntaxhighlighter/scripts/shCore.min.js b/libreplan-webapp/src/main/webapp/jqplot/examples/syntaxhighlighter/scripts/shCore.min.js new file mode 100644 index 000000000..0ec483448 --- /dev/null +++ b/libreplan-webapp/src/main/webapp/jqplot/examples/syntaxhighlighter/scripts/shCore.min.js @@ -0,0 +1 @@ +eval(function(h,b,j,f,g,i){g=function(a){return(a35?String.fromCharCode(a+29):a.toString(36))};if(!"".replace(/^/,String)){while(j--){i[g(j)]=f[j]||g(j)}f=[function(a){return i[a]}];g=function(){return"\\w+"};j=1}while(j--){if(f[j]){h=h.replace(new RegExp("\\b"+g(j)+"\\b","g"),f[j])}}return h}('K M;I(M)1S 2U("2a\'t 4k M 4K 2g 3l 4G 4H");(6(){6 r(f,e){I(!M.1R(f))1S 3m("3s 15 4R");K a=f.1w;f=M(f.1m,t(f)+(e||""));I(a)f.1w={1m:a.1m,19:a.19?a.19.1a(0):N};H f}6 t(f){H(f.1J?"g":"")+(f.4s?"i":"")+(f.4p?"m":"")+(f.4v?"x":"")+(f.3n?"y":"")}6 B(f,e,a,b){K c=u.L,d,h,g;v=R;5K{O(;c--;){g=u[c];I(a&g.3r&&(!g.2p||g.2p.W(b))){g.2q.12=e;I((h=g.2q.X(f))&&h.P===e){d={3k:g.2b.W(b,h,a),1C:h};1N}}}}5v(i){1S i}5q{v=11}H d}6 p(f,e,a){I(3b.Z.1i)H f.1i(e,a);O(a=a||0;a-1},3d:6(g){e+=g}};c1&&p(e,"")>-1){a=15(J.1m,n.Q.W(t(J),"g",""));n.Q.W(f.1a(e.P),a,6(){O(K c=1;c<14.L-2;c++)I(14[c]===1d)e[c]=1d})}I(J.1w&&J.1w.19)O(K b=1;be.P&&J.12--}H e};I(!D)15.Z.1A=6(f){(f=n.X.W(J,f))&&J.1J&&!f[0].L&&J.12>f.P&&J.12--;H!!f};1r.Z.1C=6(f){M.1R(f)||(f=15(f));I(f.1J){K e=n.1C.1p(J,14);f.12=0;H e}H f.X(J)};1r.Z.Q=6(f,e){K a=M.1R(f),b,c;I(a&&1j e.58()==="3f"&&e.1i("${")===-1&&y)H n.Q.1p(J,14);I(a){I(f.1w)b=f.1w.19}Y f+="";I(1j e==="6")c=n.Q.W(J,f,6(){I(b){14[0]=1f 1r(14[0]);O(K d=0;dd.L-3;){i=1r.Z.1a.W(g,-1)+i;g=1Q.3i(g/10)}H(g?d[g]||"":"$")+i}Y{g=+i;I(g<=d.L-3)H d[g];g=b?p(b,i):-1;H g>-1?d[g+1]:h}})})}I(a&&f.1J)f.12=0;H c};1r.Z.1e=6(f,e){I(!M.1R(f))H n.1e.1p(J,14);K a=J+"",b=[],c=0,d,h;I(e===1d||+e<0)e=5D;Y{e=1Q.3i(+e);I(!e)H[]}O(f=M.3c(f);d=f.X(a);){I(f.12>c){b.U(a.1a(c,d.P));d.L>1&&d.P=e)1N}f.12===d.P&&f.12++}I(c===a.L){I(!n.1A.W(f,"")||h)b.U("")}Y b.U(a.1a(c));H b.L>e?b.1a(0,e):b};M.1h(/\\(\\?#[^)]*\\)/,6(f){H n.1A.W(A,f.2S.1a(f.P+f[0].L))?"":"(?:)"});M.1h(/\\((?!\\?)/,6(){J.19.U(N);H"("});M.1h(/\\(\\?<([$\\w]+)>/,6(f){J.19.U(f[1]);J.2N=R;H"("});M.1h(/\\\\k<([\\w$]+)>/,6(f){K e=p(J.19,f[1]);H e>-1?"\\\\"+(e+1)+(3R(f.2S.3a(f.P+f[0].L))?"":"(?:)"):f[0]});M.1h(/\\[\\^?]/,6(f){H f[0]==="[]"?"\\\\b\\\\B":"[\\\\s\\\\S]"});M.1h(/^\\(\\?([5A]+)\\)/,6(f){J.3d(f[1]);H""});M.1h(/(?:\\s+|#.*)+/,6(f){H n.1A.W(A,f.2S.1a(f.P+f[0].L))?"":"(?:)"},M.1B,6(){H J.2K("x")});M.1h(/\\./,6(){H"[\\\\s\\\\S]"},M.1B,6(){H J.2K("s")})})();1j 2e!="1d"&&(2e.M=M);K 1v=6(){6 r(a,b){a.1l.1i(b)!=-1||(a.1l+=" "+b)}6 t(a){H a.1i("3e")==0?a:"3e"+a}6 B(a){H e.1Y.2A[t(a)]}6 p(a,b,c){I(a==N)H N;K d=c!=R?a.3G:[a.2G],h={"#":"1c",".":"1l"}[b.1o(0,1)]||"3h",g,i;g=h!="3h"?b.1o(1):b.5u();I((a[h]||"").1i(g)!=-1)H a;O(a=0;d&&a\'+c+""});H a}6 n(a,b){a.1e("\\n");O(K c="",d=0;d<50;d++)c+=" ";H a=v(a,6(h){I(h.1i("\\t")==-1)H h;O(K g=0;(g=h.1i("\\t"))!=-1;)h=h.1o(0,g)+c.1o(0,b-g%b)+h.1o(g+1,h.L);H h})}6 x(a){H a.Q(/^\\s+|\\s+$/g,"")}6 D(a,b){I(a.Pb.P)H 1;Y I(a.Lb.L)H 1;H 0}6 y(a,b){6 c(k){H k[0]}O(K d=N,h=[],g=b.2D?b.2D:c;(d=b.1I.X(a))!=N;){K i=g(d,b);I(1j i=="3f")i=[1f e.2L(i,d.P,b.23)];h=h.1O(i)}H h}6 E(a){K b=/(.*)((&1G;|&1y;).*)/;H a.Q(e.3A.3M,6(c){K d="",h=N;I(h=b.X(c)){c=h[1];d=h[2]}H\'\'+c+""+d})}6 z(){O(K a=1E.36("1k"),b=[],c=0;c<1z 4I="1Z://2y.3L.3K/4L/5L"><3J><4N 1Z-4M="5G-5M" 6K="2O/1z; 6J=6I-8" /><1t>6L 1v<3B 1L="25-6M:6Q,6P,6O,6N-6F;6y-2f:#6x;2f:#6w;25-22:6v;2O-3D:3C;">1v3v 3.0.76 (72 73 3x)1Z://3u.2w/1v70 17 6U 71.6T 6X-3x 6Y 6D.6t 61 60 J 1k, 5Z 5R 5V <2R/>5U 5T 5S!\'}},1Y:{2j:N,2A:{}},1U:{},3A:{6n:/\\/\\*[\\s\\S]*?\\*\\//2c,6m:/\\/\\/.*$/2c,6l:/#.*$/2c,6k:/"([^\\\\"\\n]|\\\\.)*"/g,6o:/\'([^\\\\\'\\n]|\\\\.)*\'/g,6p:1f M(\'"([^\\\\\\\\"]|\\\\\\\\.)*"\',"3z"),6s:1f M("\'([^\\\\\\\\\']|\\\\\\\\.)*\'","3z"),6q:/(&1y;|<)!--[\\s\\S]*?--(&1G;|>)/2c,3M:/\\w+:\\/\\/[\\w-.\\/?%&=:@;]*/g,6a:{18:/(&1y;|<)\\?=?/g,1b:/\\?(&1G;|>)/g},69:{18:/(&1y;|<)%=?/g,1b:/%(&1G;|>)/g},6d:{18:/(&1y;|<)\\s*1k.*?(&1G;|>)/2T,1b:/(&1y;|<)\\/\\s*1k\\s*(&1G;|>)/2T}},16:{1H:6(a){6 b(i,k){H e.16.2o(i,k,e.13.1x[k])}O(K c=\'\',d=e.16.2x,h=d.2X,g=0;g";H c},2o:6(a,b,c){H\'<2W>\'+c+""},2b:6(a){K b=a.1F,c=b.1l||"";b=B(p(b,".20",R).1c);K d=6(h){H(h=15(h+"6f(\\\\w+)").X(c))?h[1]:N}("6g");b&&d&&e.16.2x[d].2B(b);a.3N()},2x:{2X:["21","2P"],21:{1H:6(a){I(a.V("2l")!=R)H"";K b=a.V("1t");H e.16.2o(a,"21",b?b:e.13.1x.21)},2B:6(a){a=1E.6j(t(a.1c));a.1l=a.1l.Q("47","")}},2P:{2B:6(){K a="68=0";a+=", 18="+(31.30-33)/2+", 32="+(31.2Z-2Y)/2+", 30=33, 2Z=2Y";a=a.Q(/^,/,"");a=1P.6Z("","38",a);a.2C();K b=a.1E;b.6W(e.13.1x.37);b.6V();a.2C()}}}},35:6(a,b){K c;I(b)c=[b];Y{c=1E.36(e.13.34);O(K d=[],h=0;h(.*?))\\\\]$"),s=1f M("(?<27>[\\\\w-]+)\\\\s*:\\\\s*(?<1T>[\\\\w-%#]+|\\\\[.*?\\\\]|\\".*?\\"|\'.*?\')\\\\s*;?","g");(j=s.X(k))!=N;){K o=j.1T.Q(/^[\'"]|[\'"]$/g,"");I(o!=N&&m.1A(o)){o=m.X(o);o=o.2V.L>0?o.2V.1e(/\\s*,\\s*/):[]}l[j.27]=o}g={1F:g,1n:C(i,l)};g.1n.1D!=N&&d.U(g)}H d},1M:6(a,b){K c=J.35(a,b),d=N,h=e.13;I(c.L!==0)O(K g=0;g")==o-3){m=m.4h(0,o-3);s=R}l=s?m:l}I((i.1t||"")!="")k.1t=i.1t;k.1D=j;d.2Q(k);b=d.2F(l);I((i.1c||"")!="")b.1c=i.1c;i.2G.74(b,i)}}},2E:6(a){w(1P,"4k",6(){e.1M(a)})}};e.2E=e.2E;e.1M=e.1M;e.2L=6(a,b,c){J.1T=a;J.P=b;J.L=a.L;J.23=c;J.1V=N};e.2L.Z.1q=6(){H J.1T};e.4l=6(a){6 b(j,l){O(K m=0;md)1N;Y I(g.P==c.P&&g.L>c.L)a[b]=N;Y I(g.P>=c.P&&g.P\'+c+""},3Q:6(a,b){K c="",d=a.1e("\\n").L,h=2u(J.V("2i-1s")),g=J.V("2z-1s-2t");I(g==R)g=(h+d-1).1q().L;Y I(3R(g)==R)g=0;O(K i=0;i\'+j+"":"")+i)}H a},4f:6(a){H a?"<4a>"+a+"":""},4b:6(a,b){6 c(l){H(l=l?l.1V||g:g)?l+" ":""}O(K d=0,h="",g=J.V("1D",""),i=0;i|&1y;2R\\s*\\/?&1G;/2T;I(e.13.46==R)b=b.Q(h,"\\n");I(e.13.44==R)b=b.Q(h,"");b=b.1e("\\n");h=/^\\s*/;g=4Q;O(K i=0;i0;i++){K k=b[i];I(x(k).L!=0){k=h.X(k);I(k==N){a=a;1N a}g=1Q.4q(k[0].L,g)}}I(g>0)O(i=0;i\'+(J.V("16")?e.16.1H(J):"")+\'<3Z 5z="0" 5H="0" 5J="0">\'+J.4f(J.V("1t"))+"<3T><3P>"+(1u?\'<2d 1g="1u">\'+J.3Q(a)+"":"")+\'<2d 1g="17">\'+b+""},2F:6(a){I(a===N)a="";J.17=a;K b=J.3Y("T");b.3X=J.1H(a);J.V("16")&&w(p(b,".16"),"5c",e.16.2b);J.V("3V-17")&&w(p(b,".17"),"56",f);H b},2Q:6(a){J.1c=""+1Q.5d(1Q.5n()*5k).1q();e.1Y.2A[t(J.1c)]=J;J.1n=C(e.2v,a||{});I(J.V("2k")==R)J.1n.16=J.1n.1u=11},5j:6(a){a=a.Q(/^\\s+|\\s+$/g,"").Q(/\\s+/g,"|");H"\\\\b(?:"+a+")\\\\b"},5f:6(a){J.28={18:{1I:a.18,23:"1k"},1b:{1I:a.1b,23:"1k"},17:1f M("(?<18>"+a.18.1m+")(?<17>.*?)(?<1b>"+a.1b.1m+")","5o")}}};H e}();1j 2e!="1d"&&(2e.1v=1v);',62,441,"||||||function|||||||||||||||||||||||||||||||||||||return|if|this|var|length|XRegExp|null|for|index|replace|true||div|push|getParam|call|exec|else|prototype||false|lastIndex|config|arguments|RegExp|toolbar|code|left|captureNames|slice|right|id|undefined|split|new|class|addToken|indexOf|typeof|script|className|source|params|substr|apply|toString|String|line|title|gutter|SyntaxHighlighter|_xregexp|strings|lt|html|test|OUTSIDE_CLASS|match|brush|document|target|gt|getHtml|regex|global|join|style|highlight|break|concat|window|Math|isRegExp|throw|value|brushes|brushName|space|alert|vars|http|syntaxhighlighter|expandSource|size|css|case|font|Fa|name|htmlScript|dA|can|handler|gm|td|exports|color|in|href|first|discoveredBrushes|light|collapse|object|cache|getButtonHtml|trigger|pattern|getLineHtml|nbsp|numbers|parseInt|defaults|com|items|www|pad|highlighters|execute|focus|func|all|getDiv|parentNode|navigator|INSIDE_CLASS|regexList|hasFlag|Match|useScriptTags|hasNamedCapture|text|help|init|br|input|gi|Error|values|span|list|250|height|width|screen|top|500|tagName|findElements|getElementsByTagName|aboutDialog|_blank|appendChild|charAt|Array|copyAsGlobal|setFlag|highlighter_|string|attachEvent|nodeName|floor|backref|output|the|TypeError|sticky|Za|iterate|freezeTokens|scope|type|textarea|alexgorbatchev|version|margin|2010|005896|gs|regexLib|body|center|align|noBrush|require|childNodes|DTD|xhtml1|head|org|w3|url|preventDefault|container|tr|getLineNumbersHtml|isNaN|userAgent|tbody|isLineHighlighted|quick|void|innerHTML|create|table|links|auto|smart|tab|stripBrs|tabs|bloggerMode|collapsed|plain|getCodeLinesHtml|caption|getMatchesHtml|findMatches|figureOutLineNumbers|removeNestedMatches|getTitleHtml|brushNotHtmlScript|substring|createElement|Highlighter|load|HtmlScript|Brush|pre|expand|multiline|min|Can|ignoreCase|find|blur|extended|toLowerCase|aliases|addEventListener|innerText|textContent|wasn|select|createTextNode|removeChild|option|same|frame|xmlns|dtd|twice|1999|equiv|meta|htmlscript|transitional|1E3|expected|PUBLIC|DOCTYPE|on|W3C|XHTML|TR|EN|Transitional||configured|srcElement|Object|after|run|dblclick|matchChain|valueOf|constructor|default|switch|click|round|execAt|forHtmlScript|token|gimy|functions|getKeywords|1E6|escape|within|random|sgi|another|finally|supply|MSIE|ie|toUpperCase|catch|returnValue|definition|event|border|imsx|constructing|one|Infinity|from|when|Content|cellpadding|flags|cellspacing|try|xhtml|Type|spaces|2930402|hosted_button_id|lastIndexOf|donate|active|development|keep|to|xclick|_s|Xml|please|like|you|paypal|cgi|cmd|webscr|bin|highlighted|scrollbars|aspScriptTags|phpScriptTags|sort|max|scriptScriptTags|toolbar_item|_|command|command_|number|getElementById|doubleQuotedString|singleLinePerlComments|singleLineCComments|multiLineCComments|singleQuotedString|multiLineDoubleQuotedString|xmlComments|alt|multiLineSingleQuotedString|If|https|1em|000|fff|background|5em|xx|bottom|75em|Gorbatchev|large|serif|CDATA|continue|utf|charset|content|About|family|sans|Helvetica|Arial|Geneva|3em|nogutter|Copyright|syntax|close|write|2004|Alex|open|JavaScript|highlighter|July|02|replaceChild|offset|83".split("|"),0,{})); \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/examples/syntaxhighlighter/styles/shCore.css b/libreplan-webapp/src/main/webapp/jqplot/examples/syntaxhighlighter/styles/shCore.css new file mode 100644 index 000000000..34f6864a1 --- /dev/null +++ b/libreplan-webapp/src/main/webapp/jqplot/examples/syntaxhighlighter/styles/shCore.css @@ -0,0 +1,226 @@ +/** + * SyntaxHighlighter + * http://alexgorbatchev.com/SyntaxHighlighter + * + * SyntaxHighlighter is donationware. If you are using it, please donate. + * http://alexgorbatchev.com/SyntaxHighlighter/donate.html + * + * @version + * 3.0.83 (July 02 2010) + * + * @copyright + * Copyright (C) 2004-2010 Alex Gorbatchev. + * + * @license + * Dual licensed under the MIT and GPL licenses. + */ +.syntaxhighlighter a, +.syntaxhighlighter div, +.syntaxhighlighter code, +.syntaxhighlighter table, +.syntaxhighlighter table td, +.syntaxhighlighter table tr, +.syntaxhighlighter table tbody, +.syntaxhighlighter table thead, +.syntaxhighlighter table caption, +.syntaxhighlighter textarea { + -moz-border-radius: 0 0 0 0 !important; + -webkit-border-radius: 0 0 0 0 !important; + background: none !important; + border: 0 !important; + bottom: auto !important; + float: none !important; + height: auto !important; + left: auto !important; + line-height: 1.1em !important; + margin: 0 !important; + outline: 0 !important; + overflow: visible !important; + padding: 0 !important; + position: static !important; + right: auto !important; + text-align: left !important; + top: auto !important; + vertical-align: baseline !important; + width: auto !important; + box-sizing: content-box !important; + font-family: "Consolas", "Bitstream Vera Sans Mono", "Courier New", Courier, monospace !important; + font-weight: normal !important; + font-style: normal !important; + font-size: 1em !important; + min-height: inherit !important; + min-height: auto !important; +} + +.syntaxhighlighter { + width: 100% !important; + margin: 1em 0 1em 0 !important; + position: relative !important; + overflow: auto !important; + font-size: 1em !important; +} +.syntaxhighlighter.source { + overflow: hidden !important; +} +.syntaxhighlighter .bold { + font-weight: bold !important; +} +.syntaxhighlighter .italic { + font-style: italic !important; +} +.syntaxhighlighter .line { + white-space: pre !important; +} +.syntaxhighlighter table { + width: 100% !important; +} +.syntaxhighlighter table caption { + text-align: left !important; + padding: .5em 0 0.5em 1em !important; +} +.syntaxhighlighter table td.code { + width: 100% !important; +} +.syntaxhighlighter table td.code .container { + position: relative !important; +} +.syntaxhighlighter table td.code .container textarea { + box-sizing: border-box !important; + position: absolute !important; + left: 0 !important; + top: 0 !important; + width: 100% !important; + height: 100% !important; + border: none !important; + background: white !important; + padding-left: 1em !important; + overflow: hidden !important; + white-space: pre !important; +} +.syntaxhighlighter table td.gutter .line { + text-align: right !important; + padding: 0 0.5em 0 1em !important; +} +.syntaxhighlighter table td.code .line { + padding: 0 1em !important; +} +.syntaxhighlighter.nogutter td.code .container textarea, .syntaxhighlighter.nogutter td.code .line { + padding-left: 0em !important; +} +.syntaxhighlighter.show { + display: block !important; +} +.syntaxhighlighter.collapsed table { + display: none !important; +} +.syntaxhighlighter.collapsed .toolbar { + padding: 0.1em 0.8em 0em 0.8em !important; + font-size: 1em !important; + position: static !important; + width: auto !important; + height: auto !important; +} +.syntaxhighlighter.collapsed .toolbar span { + display: inline !important; + margin-right: 1em !important; +} +.syntaxhighlighter.collapsed .toolbar span a { + padding: 0 !important; + display: none !important; +} +.syntaxhighlighter.collapsed .toolbar span a.expandSource { + display: inline !important; +} +.syntaxhighlighter .toolbar { + position: absolute !important; + right: 1px !important; + top: 1px !important; + width: 11px !important; + height: 11px !important; + font-size: 10px !important; + z-index: 10 !important; +} +.syntaxhighlighter .toolbar span.title { + display: inline !important; +} +.syntaxhighlighter .toolbar a { + display: block !important; + text-align: center !important; + text-decoration: none !important; + padding-top: 1px !important; +} +.syntaxhighlighter .toolbar a.expandSource { + display: none !important; +} +.syntaxhighlighter.ie { + font-size: .9em !important; + padding: 1px 0 1px 0 !important; +} +.syntaxhighlighter.ie .toolbar { + line-height: 8px !important; +} +.syntaxhighlighter.ie .toolbar a { + padding-top: 0px !important; +} +.syntaxhighlighter.printing .line.alt1 .content, +.syntaxhighlighter.printing .line.alt2 .content, +.syntaxhighlighter.printing .line.highlighted .number, +.syntaxhighlighter.printing .line.highlighted.alt1 .content, +.syntaxhighlighter.printing .line.highlighted.alt2 .content { + background: none !important; +} +.syntaxhighlighter.printing .line .number { + color: #bbbbbb !important; +} +.syntaxhighlighter.printing .line .content { + color: black !important; +} +.syntaxhighlighter.printing .toolbar { + display: none !important; +} +.syntaxhighlighter.printing a { + text-decoration: none !important; +} +.syntaxhighlighter.printing .plain, .syntaxhighlighter.printing .plain a { + color: black !important; +} +.syntaxhighlighter.printing .comments, .syntaxhighlighter.printing .comments a { + color: #008200 !important; +} +.syntaxhighlighter.printing .string, .syntaxhighlighter.printing .string a { + color: blue !important; +} +.syntaxhighlighter.printing .keyword { + color: #006699 !important; + font-weight: bold !important; +} +.syntaxhighlighter.printing .preprocessor { + color: gray !important; +} +.syntaxhighlighter.printing .variable { + color: #aa7700 !important; +} +.syntaxhighlighter.printing .value { + color: #009900 !important; +} +.syntaxhighlighter.printing .functions { + color: #ff1493 !important; +} +.syntaxhighlighter.printing .constants { + color: #0066cc !important; +} +.syntaxhighlighter.printing .script { + font-weight: bold !important; +} +.syntaxhighlighter.printing .color1, .syntaxhighlighter.printing .color1 a { + color: gray !important; +} +.syntaxhighlighter.printing .color2, .syntaxhighlighter.printing .color2 a { + color: #ff1493 !important; +} +.syntaxhighlighter.printing .color3, .syntaxhighlighter.printing .color3 a { + color: red !important; +} +.syntaxhighlighter.printing .break, .syntaxhighlighter.printing .break a { + color: black !important; +} diff --git a/libreplan-webapp/src/main/webapp/jqplot/examples/syntaxhighlighter/styles/shCore.min.css b/libreplan-webapp/src/main/webapp/jqplot/examples/syntaxhighlighter/styles/shCore.min.css new file mode 100644 index 000000000..a2d3a61f3 --- /dev/null +++ b/libreplan-webapp/src/main/webapp/jqplot/examples/syntaxhighlighter/styles/shCore.min.css @@ -0,0 +1 @@ +.syntaxhighlighter a,.syntaxhighlighter div,.syntaxhighlighter code,.syntaxhighlighter table,.syntaxhighlighter table td,.syntaxhighlighter table tr,.syntaxhighlighter table tbody,.syntaxhighlighter table thead,.syntaxhighlighter table caption,.syntaxhighlighter textarea{-moz-border-radius:0 0 0 0!important;-webkit-border-radius:0 0 0 0!important;background:none!important;border:0!important;bottom:auto!important;float:none!important;height:auto!important;left:auto!important;line-height:1.1em!important;margin:0!important;outline:0!important;overflow:visible!important;padding:0!important;position:static!important;right:auto!important;text-align:left!important;top:auto!important;vertical-align:baseline!important;width:auto!important;box-sizing:content-box!important;font-family:"Consolas","Bitstream Vera Sans Mono","Courier New",Courier,monospace!important;font-weight:normal!important;font-style:normal!important;font-size:1em!important;min-height:inherit!important;min-height:auto!important;}.syntaxhighlighter{width:100%!important;margin:1em 0 1em 0!important;position:relative!important;overflow:auto!important;font-size:1em!important;}.syntaxhighlighter.source{overflow:hidden!important;}.syntaxhighlighter .bold{font-weight:bold!important;}.syntaxhighlighter .italic{font-style:italic!important;}.syntaxhighlighter .line{white-space:pre!important;}.syntaxhighlighter table{width:100%!important;}.syntaxhighlighter table caption{text-align:left!important;padding:.5em 0 .5em 1em!important;}.syntaxhighlighter table td.code{width:100%!important;}.syntaxhighlighter table td.code .container{position:relative!important;}.syntaxhighlighter table td.code .container textarea{box-sizing:border-box!important;position:absolute!important;left:0!important;top:0!important;width:100%!important;height:100%!important;border:none!important;background:white!important;padding-left:1em!important;overflow:hidden!important;white-space:pre!important;}.syntaxhighlighter table td.gutter .line{text-align:right!important;padding:0 .5em 0 1em!important;}.syntaxhighlighter table td.code .line{padding:0 1em!important;}.syntaxhighlighter.nogutter td.code .container textarea,.syntaxhighlighter.nogutter td.code .line{padding-left:0!important;}.syntaxhighlighter.show{display:block!important;}.syntaxhighlighter.collapsed table{display:none!important;}.syntaxhighlighter.collapsed .toolbar{padding:.1em .8em 0 .8em!important;font-size:1em!important;position:static!important;width:auto!important;height:auto!important;}.syntaxhighlighter.collapsed .toolbar span{display:inline!important;margin-right:1em!important;}.syntaxhighlighter.collapsed .toolbar span a{padding:0!important;display:none!important;}.syntaxhighlighter.collapsed .toolbar span a.expandSource{display:inline!important;}.syntaxhighlighter .toolbar{position:absolute!important;right:1px!important;top:1px!important;width:11px!important;height:11px!important;font-size:10px!important;z-index:10!important;}.syntaxhighlighter .toolbar span.title{display:inline!important;}.syntaxhighlighter .toolbar a{display:block!important;text-align:center!important;text-decoration:none!important;padding-top:1px!important;}.syntaxhighlighter .toolbar a.expandSource{display:none!important;}.syntaxhighlighter.ie{font-size:.9em!important;padding:1px 0 1px 0!important;}.syntaxhighlighter.ie .toolbar{line-height:8px!important;}.syntaxhighlighter.ie .toolbar a{padding-top:0!important;}.syntaxhighlighter.printing .line.alt1 .content,.syntaxhighlighter.printing .line.alt2 .content,.syntaxhighlighter.printing .line.highlighted .number,.syntaxhighlighter.printing .line.highlighted.alt1 .content,.syntaxhighlighter.printing .line.highlighted.alt2 .content{background:none!important;}.syntaxhighlighter.printing .line .number{color:#bbb!important;}.syntaxhighlighter.printing .line .content{color:black!important;}.syntaxhighlighter.printing .toolbar{display:none!important;}.syntaxhighlighter.printing a{text-decoration:none!important;}.syntaxhighlighter.printing .plain,.syntaxhighlighter.printing .plain a{color:black!important;}.syntaxhighlighter.printing .comments,.syntaxhighlighter.printing .comments a{color:#008200!important;}.syntaxhighlighter.printing .string,.syntaxhighlighter.printing .string a{color:blue!important;}.syntaxhighlighter.printing .keyword{color:#069!important;font-weight:bold!important;}.syntaxhighlighter.printing .preprocessor{color:gray!important;}.syntaxhighlighter.printing .variable{color:#a70!important;}.syntaxhighlighter.printing .value{color:#090!important;}.syntaxhighlighter.printing .functions{color:#ff1493!important;}.syntaxhighlighter.printing .constants{color:#06c!important;}.syntaxhighlighter.printing .script{font-weight:bold!important;}.syntaxhighlighter.printing .color1,.syntaxhighlighter.printing .color1 a{color:gray!important;}.syntaxhighlighter.printing .color2,.syntaxhighlighter.printing .color2 a{color:#ff1493!important;}.syntaxhighlighter.printing .color3,.syntaxhighlighter.printing .color3 a{color:red!important;}.syntaxhighlighter.printing .break,.syntaxhighlighter.printing .break a{color:black!important;} \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/examples/syntaxhighlighter/styles/shCoreDefault.css b/libreplan-webapp/src/main/webapp/jqplot/examples/syntaxhighlighter/styles/shCoreDefault.css new file mode 100644 index 000000000..08f9e10e4 --- /dev/null +++ b/libreplan-webapp/src/main/webapp/jqplot/examples/syntaxhighlighter/styles/shCoreDefault.css @@ -0,0 +1,328 @@ +/** + * SyntaxHighlighter + * http://alexgorbatchev.com/SyntaxHighlighter + * + * SyntaxHighlighter is donationware. If you are using it, please donate. + * http://alexgorbatchev.com/SyntaxHighlighter/donate.html + * + * @version + * 3.0.83 (July 02 2010) + * + * @copyright + * Copyright (C) 2004-2010 Alex Gorbatchev. + * + * @license + * Dual licensed under the MIT and GPL licenses. + */ +.syntaxhighlighter a, +.syntaxhighlighter div, +.syntaxhighlighter code, +.syntaxhighlighter table, +.syntaxhighlighter table td, +.syntaxhighlighter table tr, +.syntaxhighlighter table tbody, +.syntaxhighlighter table thead, +.syntaxhighlighter table caption, +.syntaxhighlighter textarea { + -moz-border-radius: 0 0 0 0 !important; + -webkit-border-radius: 0 0 0 0 !important; + background: none !important; + border: 0 !important; + bottom: auto !important; + float: none !important; + height: auto !important; + left: auto !important; + line-height: 1.1em !important; + margin: 0 !important; + outline: 0 !important; + overflow: visible !important; + padding: 0 !important; + position: static !important; + right: auto !important; + text-align: left !important; + top: auto !important; + vertical-align: baseline !important; + width: auto !important; + box-sizing: content-box !important; + font-family: "Consolas", "Bitstream Vera Sans Mono", "Courier New", Courier, monospace !important; + font-weight: normal !important; + font-style: normal !important; + font-size: 1em !important; + min-height: inherit !important; + min-height: auto !important; +} + +.syntaxhighlighter { + width: 100% !important; + margin: 1em 0 1em 0 !important; + position: relative !important; + overflow: auto !important; + font-size: 1em !important; +} +.syntaxhighlighter.source { + overflow: hidden !important; +} +.syntaxhighlighter .bold { + font-weight: bold !important; +} +.syntaxhighlighter .italic { + font-style: italic !important; +} +.syntaxhighlighter .line { + white-space: pre !important; +} +.syntaxhighlighter table { + width: 100% !important; +} +.syntaxhighlighter table caption { + text-align: left !important; + padding: .5em 0 0.5em 1em !important; +} +.syntaxhighlighter table td.code { + width: 100% !important; +} +.syntaxhighlighter table td.code .container { + position: relative !important; +} +.syntaxhighlighter table td.code .container textarea { + box-sizing: border-box !important; + position: absolute !important; + left: 0 !important; + top: 0 !important; + width: 100% !important; + height: 100% !important; + border: none !important; + background: white !important; + padding-left: 1em !important; + overflow: hidden !important; + white-space: pre !important; +} +.syntaxhighlighter table td.gutter .line { + text-align: right !important; + padding: 0 0.5em 0 1em !important; +} +.syntaxhighlighter table td.code .line { + padding: 0 1em !important; +} +.syntaxhighlighter.nogutter td.code .container textarea, .syntaxhighlighter.nogutter td.code .line { + padding-left: 0em !important; +} +.syntaxhighlighter.show { + display: block !important; +} +.syntaxhighlighter.collapsed table { + display: none !important; +} +.syntaxhighlighter.collapsed .toolbar { + padding: 0.1em 0.8em 0em 0.8em !important; + font-size: 1em !important; + position: static !important; + width: auto !important; + height: auto !important; +} +.syntaxhighlighter.collapsed .toolbar span { + display: inline !important; + margin-right: 1em !important; +} +.syntaxhighlighter.collapsed .toolbar span a { + padding: 0 !important; + display: none !important; +} +.syntaxhighlighter.collapsed .toolbar span a.expandSource { + display: inline !important; +} +.syntaxhighlighter .toolbar { + position: absolute !important; + right: 1px !important; + top: 1px !important; + width: 11px !important; + height: 11px !important; + font-size: 10px !important; + z-index: 10 !important; +} +.syntaxhighlighter .toolbar span.title { + display: inline !important; +} +.syntaxhighlighter .toolbar a { + display: block !important; + text-align: center !important; + text-decoration: none !important; + padding-top: 1px !important; +} +.syntaxhighlighter .toolbar a.expandSource { + display: none !important; +} +.syntaxhighlighter.ie { + font-size: .9em !important; + padding: 1px 0 1px 0 !important; +} +.syntaxhighlighter.ie .toolbar { + line-height: 8px !important; +} +.syntaxhighlighter.ie .toolbar a { + padding-top: 0px !important; +} +.syntaxhighlighter.printing .line.alt1 .content, +.syntaxhighlighter.printing .line.alt2 .content, +.syntaxhighlighter.printing .line.highlighted .number, +.syntaxhighlighter.printing .line.highlighted.alt1 .content, +.syntaxhighlighter.printing .line.highlighted.alt2 .content { + background: none !important; +} +.syntaxhighlighter.printing .line .number { + color: #bbbbbb !important; +} +.syntaxhighlighter.printing .line .content { + color: black !important; +} +.syntaxhighlighter.printing .toolbar { + display: none !important; +} +.syntaxhighlighter.printing a { + text-decoration: none !important; +} +.syntaxhighlighter.printing .plain, .syntaxhighlighter.printing .plain a { + color: black !important; +} +.syntaxhighlighter.printing .comments, .syntaxhighlighter.printing .comments a { + color: #008200 !important; +} +.syntaxhighlighter.printing .string, .syntaxhighlighter.printing .string a { + color: blue !important; +} +.syntaxhighlighter.printing .keyword { + color: #006699 !important; + font-weight: bold !important; +} +.syntaxhighlighter.printing .preprocessor { + color: gray !important; +} +.syntaxhighlighter.printing .variable { + color: #aa7700 !important; +} +.syntaxhighlighter.printing .value { + color: #009900 !important; +} +.syntaxhighlighter.printing .functions { + color: #ff1493 !important; +} +.syntaxhighlighter.printing .constants { + color: #0066cc !important; +} +.syntaxhighlighter.printing .script { + font-weight: bold !important; +} +.syntaxhighlighter.printing .color1, .syntaxhighlighter.printing .color1 a { + color: gray !important; +} +.syntaxhighlighter.printing .color2, .syntaxhighlighter.printing .color2 a { + color: #ff1493 !important; +} +.syntaxhighlighter.printing .color3, .syntaxhighlighter.printing .color3 a { + color: red !important; +} +.syntaxhighlighter.printing .break, .syntaxhighlighter.printing .break a { + color: black !important; +} + +.syntaxhighlighter { + background-color: white !important; +} +.syntaxhighlighter .line.alt1 { + background-color: white !important; +} +.syntaxhighlighter .line.alt2 { + background-color: white !important; +} +.syntaxhighlighter .line.highlighted.alt1, .syntaxhighlighter .line.highlighted.alt2 { + background-color: #e0e0e0 !important; +} +.syntaxhighlighter .line.highlighted.number { + color: black !important; +} +.syntaxhighlighter table caption { + color: black !important; +} +.syntaxhighlighter .gutter { + color: #afafaf !important; +} +.syntaxhighlighter .gutter .line { + border-right: 3px solid #6ce26c !important; +} +.syntaxhighlighter .gutter .line.highlighted { + background-color: #6ce26c !important; + color: white !important; +} +.syntaxhighlighter.printing .line .content { + border: none !important; +} +.syntaxhighlighter.collapsed { + overflow: visible !important; +} +.syntaxhighlighter.collapsed .toolbar { + color: blue !important; + background: white !important; + border: 1px solid #6ce26c !important; +} +.syntaxhighlighter.collapsed .toolbar a { + color: blue !important; +} +.syntaxhighlighter.collapsed .toolbar a:hover { + color: red !important; +} +.syntaxhighlighter .toolbar { + color: white !important; + background: #6ce26c !important; + border: none !important; +} +.syntaxhighlighter .toolbar a { + color: white !important; +} +.syntaxhighlighter .toolbar a:hover { + color: black !important; +} +.syntaxhighlighter .plain, .syntaxhighlighter .plain a { + color: black !important; +} +.syntaxhighlighter .comments, .syntaxhighlighter .comments a { + color: #008200 !important; +} +.syntaxhighlighter .string, .syntaxhighlighter .string a { + color: blue !important; +} +.syntaxhighlighter .keyword { + color: #006699 !important; +} +.syntaxhighlighter .preprocessor { + color: gray !important; +} +.syntaxhighlighter .variable { + color: #aa7700 !important; +} +.syntaxhighlighter .value { + color: #009900 !important; +} +.syntaxhighlighter .functions { + color: #ff1493 !important; +} +.syntaxhighlighter .constants { + color: #0066cc !important; +} +.syntaxhighlighter .script { + font-weight: bold !important; + color: #006699 !important; + background-color: none !important; +} +.syntaxhighlighter .color1, .syntaxhighlighter .color1 a { + color: gray !important; +} +.syntaxhighlighter .color2, .syntaxhighlighter .color2 a { + color: #ff1493 !important; +} +.syntaxhighlighter .color3, .syntaxhighlighter .color3 a { + color: red !important; +} + +.syntaxhighlighter .keyword { + font-weight: bold !important; +} diff --git a/libreplan-webapp/src/main/webapp/jqplot/examples/syntaxhighlighter/styles/shCoreDefault.min.css b/libreplan-webapp/src/main/webapp/jqplot/examples/syntaxhighlighter/styles/shCoreDefault.min.css new file mode 100644 index 000000000..0b99c2994 --- /dev/null +++ b/libreplan-webapp/src/main/webapp/jqplot/examples/syntaxhighlighter/styles/shCoreDefault.min.css @@ -0,0 +1 @@ +.syntaxhighlighter a,.syntaxhighlighter div,.syntaxhighlighter code,.syntaxhighlighter table,.syntaxhighlighter table td,.syntaxhighlighter table tr,.syntaxhighlighter table tbody,.syntaxhighlighter table thead,.syntaxhighlighter table caption,.syntaxhighlighter textarea{-moz-border-radius:0 0 0 0!important;-webkit-border-radius:0 0 0 0!important;background:none!important;border:0!important;bottom:auto!important;float:none!important;height:auto!important;left:auto!important;line-height:1.1em!important;margin:0!important;outline:0!important;overflow:visible!important;padding:0!important;position:static!important;right:auto!important;text-align:left!important;top:auto!important;vertical-align:baseline!important;width:auto!important;box-sizing:content-box!important;font-family:"Consolas","Bitstream Vera Sans Mono","Courier New",Courier,monospace!important;font-weight:normal!important;font-style:normal!important;font-size:1em!important;min-height:inherit!important;min-height:auto!important;}.syntaxhighlighter{width:100%!important;margin:1em 0 1em 0!important;position:relative!important;overflow:auto!important;font-size:1em!important;}.syntaxhighlighter.source{overflow:hidden!important;}.syntaxhighlighter .bold{font-weight:bold!important;}.syntaxhighlighter .italic{font-style:italic!important;}.syntaxhighlighter .line{white-space:pre!important;}.syntaxhighlighter table{width:100%!important;}.syntaxhighlighter table caption{text-align:left!important;padding:.5em 0 .5em 1em!important;}.syntaxhighlighter table td.code{width:100%!important;}.syntaxhighlighter table td.code .container{position:relative!important;}.syntaxhighlighter table td.code .container textarea{box-sizing:border-box!important;position:absolute!important;left:0!important;top:0!important;width:100%!important;height:100%!important;border:none!important;background:white!important;padding-left:1em!important;overflow:hidden!important;white-space:pre!important;}.syntaxhighlighter table td.gutter .line{text-align:right!important;padding:0 .5em 0 1em!important;}.syntaxhighlighter table td.code .line{padding:0 1em!important;}.syntaxhighlighter.nogutter td.code .container textarea,.syntaxhighlighter.nogutter td.code .line{padding-left:0!important;}.syntaxhighlighter.show{display:block!important;}.syntaxhighlighter.collapsed table{display:none!important;}.syntaxhighlighter.collapsed .toolbar{padding:.1em .8em 0 .8em!important;font-size:1em!important;position:static!important;width:auto!important;height:auto!important;}.syntaxhighlighter.collapsed .toolbar span{display:inline!important;margin-right:1em!important;}.syntaxhighlighter.collapsed .toolbar span a{padding:0!important;display:none!important;}.syntaxhighlighter.collapsed .toolbar span a.expandSource{display:inline!important;}.syntaxhighlighter .toolbar{position:absolute!important;right:1px!important;top:1px!important;width:11px!important;height:11px!important;font-size:10px!important;z-index:10!important;}.syntaxhighlighter .toolbar span.title{display:inline!important;}.syntaxhighlighter .toolbar a{display:block!important;text-align:center!important;text-decoration:none!important;padding-top:1px!important;}.syntaxhighlighter .toolbar a.expandSource{display:none!important;}.syntaxhighlighter.ie{font-size:.9em!important;padding:1px 0 1px 0!important;}.syntaxhighlighter.ie .toolbar{line-height:8px!important;}.syntaxhighlighter.ie .toolbar a{padding-top:0!important;}.syntaxhighlighter.printing .line.alt1 .content,.syntaxhighlighter.printing .line.alt2 .content,.syntaxhighlighter.printing .line.highlighted .number,.syntaxhighlighter.printing .line.highlighted.alt1 .content,.syntaxhighlighter.printing .line.highlighted.alt2 .content{background:none!important;}.syntaxhighlighter.printing .line .number{color:#bbb!important;}.syntaxhighlighter.printing .line .content{color:black!important;}.syntaxhighlighter.printing .toolbar{display:none!important;}.syntaxhighlighter.printing a{text-decoration:none!important;}.syntaxhighlighter.printing .plain,.syntaxhighlighter.printing .plain a{color:black!important;}.syntaxhighlighter.printing .comments,.syntaxhighlighter.printing .comments a{color:#008200!important;}.syntaxhighlighter.printing .string,.syntaxhighlighter.printing .string a{color:blue!important;}.syntaxhighlighter.printing .keyword{color:#069!important;font-weight:bold!important;}.syntaxhighlighter.printing .preprocessor{color:gray!important;}.syntaxhighlighter.printing .variable{color:#a70!important;}.syntaxhighlighter.printing .value{color:#090!important;}.syntaxhighlighter.printing .functions{color:#ff1493!important;}.syntaxhighlighter.printing .constants{color:#06c!important;}.syntaxhighlighter.printing .script{font-weight:bold!important;}.syntaxhighlighter.printing .color1,.syntaxhighlighter.printing .color1 a{color:gray!important;}.syntaxhighlighter.printing .color2,.syntaxhighlighter.printing .color2 a{color:#ff1493!important;}.syntaxhighlighter.printing .color3,.syntaxhighlighter.printing .color3 a{color:red!important;}.syntaxhighlighter.printing .break,.syntaxhighlighter.printing .break a{color:black!important;}.syntaxhighlighter{background-color:white!important;}.syntaxhighlighter .line.alt1{background-color:white!important;}.syntaxhighlighter .line.alt2{background-color:white!important;}.syntaxhighlighter .line.highlighted.alt1,.syntaxhighlighter .line.highlighted.alt2{background-color:#e0e0e0!important;}.syntaxhighlighter .line.highlighted.number{color:black!important;}.syntaxhighlighter table caption{color:black!important;}.syntaxhighlighter .gutter{color:#afafaf!important;}.syntaxhighlighter .gutter .line{border-right:3px solid #6ce26c!important;}.syntaxhighlighter .gutter .line.highlighted{background-color:#6ce26c!important;color:white!important;}.syntaxhighlighter.printing .line .content{border:none!important;}.syntaxhighlighter.collapsed{overflow:visible!important;}.syntaxhighlighter.collapsed .toolbar{color:blue!important;background:white!important;border:1px solid #6ce26c!important;}.syntaxhighlighter.collapsed .toolbar a{color:blue!important;}.syntaxhighlighter.collapsed .toolbar a:hover{color:red!important;}.syntaxhighlighter .toolbar{color:white!important;background:#6ce26c!important;border:none!important;}.syntaxhighlighter .toolbar a{color:white!important;}.syntaxhighlighter .toolbar a:hover{color:black!important;}.syntaxhighlighter .plain,.syntaxhighlighter .plain a{color:black!important;}.syntaxhighlighter .comments,.syntaxhighlighter .comments a{color:#008200!important;}.syntaxhighlighter .string,.syntaxhighlighter .string a{color:blue!important;}.syntaxhighlighter .keyword{color:#069!important;}.syntaxhighlighter .preprocessor{color:gray!important;}.syntaxhighlighter .variable{color:#a70!important;}.syntaxhighlighter .value{color:#090!important;}.syntaxhighlighter .functions{color:#ff1493!important;}.syntaxhighlighter .constants{color:#06c!important;}.syntaxhighlighter .script{font-weight:bold!important;color:#069!important;background-color:none!important;}.syntaxhighlighter .color1,.syntaxhighlighter .color1 a{color:gray!important;}.syntaxhighlighter .color2,.syntaxhighlighter .color2 a{color:#ff1493!important;}.syntaxhighlighter .color3,.syntaxhighlighter .color3 a{color:red!important;}.syntaxhighlighter .keyword{font-weight:bold!important;} \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/examples/syntaxhighlighter/styles/shThemeDefault.css b/libreplan-webapp/src/main/webapp/jqplot/examples/syntaxhighlighter/styles/shThemeDefault.css new file mode 100644 index 000000000..136541172 --- /dev/null +++ b/libreplan-webapp/src/main/webapp/jqplot/examples/syntaxhighlighter/styles/shThemeDefault.css @@ -0,0 +1,117 @@ +/** + * SyntaxHighlighter + * http://alexgorbatchev.com/SyntaxHighlighter + * + * SyntaxHighlighter is donationware. If you are using it, please donate. + * http://alexgorbatchev.com/SyntaxHighlighter/donate.html + * + * @version + * 3.0.83 (July 02 2010) + * + * @copyright + * Copyright (C) 2004-2010 Alex Gorbatchev. + * + * @license + * Dual licensed under the MIT and GPL licenses. + */ +.syntaxhighlighter { + background-color: white !important; +} +.syntaxhighlighter .line.alt1 { + background-color: white !important; +} +.syntaxhighlighter .line.alt2 { + background-color: white !important; +} +.syntaxhighlighter .line.highlighted.alt1, .syntaxhighlighter .line.highlighted.alt2 { + background-color: #e0e0e0 !important; +} +.syntaxhighlighter .line.highlighted.number { + color: black !important; +} +.syntaxhighlighter table caption { + color: black !important; +} +.syntaxhighlighter .gutter { + color: #afafaf !important; +} +.syntaxhighlighter .gutter .line { + border-right: 3px solid #6ce26c !important; +} +.syntaxhighlighter .gutter .line.highlighted { + background-color: #6ce26c !important; + color: white !important; +} +.syntaxhighlighter.printing .line .content { + border: none !important; +} +.syntaxhighlighter.collapsed { + overflow: visible !important; +} +.syntaxhighlighter.collapsed .toolbar { + color: blue !important; + background: white !important; + border: 1px solid #6ce26c !important; +} +.syntaxhighlighter.collapsed .toolbar a { + color: blue !important; +} +.syntaxhighlighter.collapsed .toolbar a:hover { + color: red !important; +} +.syntaxhighlighter .toolbar { + color: white !important; + background: #6ce26c !important; + border: none !important; +} +.syntaxhighlighter .toolbar a { + color: white !important; +} +.syntaxhighlighter .toolbar a:hover { + color: black !important; +} +.syntaxhighlighter .plain, .syntaxhighlighter .plain a { + color: black !important; +} +.syntaxhighlighter .comments, .syntaxhighlighter .comments a { + color: #008200 !important; +} +.syntaxhighlighter .string, .syntaxhighlighter .string a { + color: blue !important; +} +.syntaxhighlighter .keyword { + color: #006699 !important; +} +.syntaxhighlighter .preprocessor { + color: gray !important; +} +.syntaxhighlighter .variable { + color: #aa7700 !important; +} +.syntaxhighlighter .value { + color: #009900 !important; +} +.syntaxhighlighter .functions { + color: #ff1493 !important; +} +.syntaxhighlighter .constants { + color: #0066cc !important; +} +.syntaxhighlighter .script { + font-weight: bold !important; + color: #006699 !important; + background-color: none !important; +} +.syntaxhighlighter .color1, .syntaxhighlighter .color1 a { + color: gray !important; +} +.syntaxhighlighter .color2, .syntaxhighlighter .color2 a { + color: #ff1493 !important; +} +.syntaxhighlighter .color3, .syntaxhighlighter .color3 a { + color: red !important; +} + +.syntaxhighlighter .keyword { + font-weight: bold !important; +} diff --git a/libreplan-webapp/src/main/webapp/jqplot/examples/syntaxhighlighter/styles/shThemeDefault.min.css b/libreplan-webapp/src/main/webapp/jqplot/examples/syntaxhighlighter/styles/shThemeDefault.min.css new file mode 100644 index 000000000..57326f47f --- /dev/null +++ b/libreplan-webapp/src/main/webapp/jqplot/examples/syntaxhighlighter/styles/shThemeDefault.min.css @@ -0,0 +1 @@ +.syntaxhighlighter{background-color:white!important;}.syntaxhighlighter .line.alt1{background-color:white!important;}.syntaxhighlighter .line.alt2{background-color:white!important;}.syntaxhighlighter .line.highlighted.alt1,.syntaxhighlighter .line.highlighted.alt2{background-color:#e0e0e0!important;}.syntaxhighlighter .line.highlighted.number{color:black!important;}.syntaxhighlighter table caption{color:black!important;}.syntaxhighlighter .gutter{color:#afafaf!important;}.syntaxhighlighter .gutter .line{border-right:3px solid #6ce26c!important;}.syntaxhighlighter .gutter .line.highlighted{background-color:#6ce26c!important;color:white!important;}.syntaxhighlighter.printing .line .content{border:none!important;}.syntaxhighlighter.collapsed{overflow:visible!important;}.syntaxhighlighter.collapsed .toolbar{color:blue!important;background:white!important;border:1px solid #6ce26c!important;}.syntaxhighlighter.collapsed .toolbar a{color:blue!important;}.syntaxhighlighter.collapsed .toolbar a:hover{color:red!important;}.syntaxhighlighter .toolbar{color:white!important;background:#6ce26c!important;border:none!important;}.syntaxhighlighter .toolbar a{color:white!important;}.syntaxhighlighter .toolbar a:hover{color:black!important;}.syntaxhighlighter .plain,.syntaxhighlighter .plain a{color:black!important;}.syntaxhighlighter .comments,.syntaxhighlighter .comments a{color:#008200!important;}.syntaxhighlighter .string,.syntaxhighlighter .string a{color:blue!important;}.syntaxhighlighter .keyword{color:#069!important;}.syntaxhighlighter .preprocessor{color:gray!important;}.syntaxhighlighter .variable{color:#a70!important;}.syntaxhighlighter .value{color:#090!important;}.syntaxhighlighter .functions{color:#ff1493!important;}.syntaxhighlighter .constants{color:#06c!important;}.syntaxhighlighter .script{font-weight:bold!important;color:#069!important;background-color:none!important;}.syntaxhighlighter .color1,.syntaxhighlighter .color1 a{color:gray!important;}.syntaxhighlighter .color2,.syntaxhighlighter .color2 a{color:#ff1493!important;}.syntaxhighlighter .color3,.syntaxhighlighter .color3 a{color:red!important;}.syntaxhighlighter .keyword{font-weight:bold!important;} \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/examples/syntaxhighlighter/styles/shThemejqPlot.css b/libreplan-webapp/src/main/webapp/jqplot/examples/syntaxhighlighter/styles/shThemejqPlot.css new file mode 100644 index 000000000..9ccf10745 --- /dev/null +++ b/libreplan-webapp/src/main/webapp/jqplot/examples/syntaxhighlighter/styles/shThemejqPlot.css @@ -0,0 +1,138 @@ +/** + * SyntaxHighlighter + * http://alexgorbatchev.com/SyntaxHighlighter + * + * SyntaxHighlighter is donationware. If you are using it, please donate. + * http://alexgorbatchev.com/SyntaxHighlighter/donate.html + * + * @version + * 3.0.83 (July 02 2010) + * + * @copyright + * Copyright (C) 2004-2010 Alex Gorbatchev. + * + * @license + * Dual licensed under the MIT and GPL licenses. + */ +.syntaxhighlighter { + background-color: transparent !important; +} +.syntaxhighlighter .line.alt1 { + background-color: transparent !important; +} +.syntaxhighlighter .line.alt2 { + background-color: transparent !important; +} +.syntaxhighlighter .line.highlighted.alt1, .syntaxhighlighter .line.highlighted.alt2 { + background-color: #e0e0e0 !important; +} +.syntaxhighlighter .line.highlighted.number { + color: black !important; +} +.syntaxhighlighter table caption { + color: black !important; +} +.syntaxhighlighter .gutter { + color: #afafaf !important; +} +.syntaxhighlighter .gutter .line { + border-right: 3px solid #6ce26c !important; +} +.syntaxhighlighter .gutter .line.highlighted { + background-color: #6ce26c !important; + color: white !important; +} +.syntaxhighlighter.printing .line .content { + border: none !important; +} +.syntaxhighlighter.collapsed { + overflow: visible !important; +} +.syntaxhighlighter.collapsed .toolbar { + color: blue !important; + background: white !important; + border: 1px solid #6ce26c !important; +} +.syntaxhighlighter.collapsed .toolbar a { + color: blue !important; +} +.syntaxhighlighter.collapsed .toolbar a:hover { + color: red !important; +} +.syntaxhighlighter .toolbar { + color: white !important; + background: #6ce26c !important; + border: none !important; +} +.syntaxhighlighter .toolbar a { + color: white !important; +} +.syntaxhighlighter .toolbar a:hover { + color: black !important; +} +.syntaxhighlighter .plain, .syntaxhighlighter .plain a { + color: black !important; +} +.syntaxhighlighter .comments, .syntaxhighlighter .comments a { + color: #008200 !important; +} +.syntaxhighlighter .string, .syntaxhighlighter .string a { + color: blue !important; +} +.syntaxhighlighter .keyword { + color: #006699 !important; +} +.syntaxhighlighter .preprocessor { + color: gray !important; +} +.syntaxhighlighter .variable { + color: #aa7700 !important; +} +.syntaxhighlighter .value { + color: #009900 !important; +} +.syntaxhighlighter .functions { + color: #ff1493 !important; +} +.syntaxhighlighter .constants { + color: #0066cc !important; +} +.syntaxhighlighter .script { + font-weight: bold !important; + color: #006699 !important; + background-color: none !important; +} +.syntaxhighlighter .color1, .syntaxhighlighter .color1 a { + color: gray !important; +} +.syntaxhighlighter .color2, .syntaxhighlighter .color2 a { + color: #ff1493 !important; +} +.syntaxhighlighter .color3, .syntaxhighlighter .color3 a { + color: red !important; +} + +.syntaxhighlighter .keyword { + font-weight: bold !important; +} + +.syntaxhighlighter a, +.syntaxhighlighter div, +.syntaxhighlighter code, +.syntaxhighlighter table, +.syntaxhighlighter table td, +.syntaxhighlighter table tr, +.syntaxhighlighter table tbody, +.syntaxhighlighter table thead, +.syntaxhighlighter table caption, +.syntaxhighlighter textarea { + line-height: 1.3em !important; +} + +div.syntaxhighlighter { + font-size: 0.85em !important; +} + +div.include div.syntaxhighlighter table td.code .line { + margin-top: 0.1em !important; +} diff --git a/libreplan-webapp/src/main/webapp/jqplot/examples/syntaxhighlighter/styles/shThemejqPlot.min.css b/libreplan-webapp/src/main/webapp/jqplot/examples/syntaxhighlighter/styles/shThemejqPlot.min.css new file mode 100644 index 000000000..20210ff72 --- /dev/null +++ b/libreplan-webapp/src/main/webapp/jqplot/examples/syntaxhighlighter/styles/shThemejqPlot.min.css @@ -0,0 +1 @@ +.syntaxhighlighter{background-color:transparent!important;}.syntaxhighlighter .line.alt1{background-color:transparent!important;}.syntaxhighlighter .line.alt2{background-color:transparent!important;}.syntaxhighlighter .line.highlighted.alt1,.syntaxhighlighter .line.highlighted.alt2{background-color:#e0e0e0!important;}.syntaxhighlighter .line.highlighted.number{color:black!important;}.syntaxhighlighter table caption{color:black!important;}.syntaxhighlighter .gutter{color:#afafaf!important;}.syntaxhighlighter .gutter .line{border-right:3px solid #6ce26c!important;}.syntaxhighlighter .gutter .line.highlighted{background-color:#6ce26c!important;color:white!important;}.syntaxhighlighter.printing .line .content{border:none!important;}.syntaxhighlighter.collapsed{overflow:visible!important;}.syntaxhighlighter.collapsed .toolbar{color:blue!important;background:white!important;border:1px solid #6ce26c!important;}.syntaxhighlighter.collapsed .toolbar a{color:blue!important;}.syntaxhighlighter.collapsed .toolbar a:hover{color:red!important;}.syntaxhighlighter .toolbar{color:white!important;background:#6ce26c!important;border:none!important;}.syntaxhighlighter .toolbar a{color:white!important;}.syntaxhighlighter .toolbar a:hover{color:black!important;}.syntaxhighlighter .plain,.syntaxhighlighter .plain a{color:black!important;}.syntaxhighlighter .comments,.syntaxhighlighter .comments a{color:#008200!important;}.syntaxhighlighter .string,.syntaxhighlighter .string a{color:blue!important;}.syntaxhighlighter .keyword{color:#069!important;}.syntaxhighlighter .preprocessor{color:gray!important;}.syntaxhighlighter .variable{color:#a70!important;}.syntaxhighlighter .value{color:#090!important;}.syntaxhighlighter .functions{color:#ff1493!important;}.syntaxhighlighter .constants{color:#06c!important;}.syntaxhighlighter .script{font-weight:bold!important;color:#069!important;background-color:none!important;}.syntaxhighlighter .color1,.syntaxhighlighter .color1 a{color:gray!important;}.syntaxhighlighter .color2,.syntaxhighlighter .color2 a{color:#ff1493!important;}.syntaxhighlighter .color3,.syntaxhighlighter .color3 a{color:red!important;}.syntaxhighlighter .keyword{font-weight:bold!important;}.syntaxhighlighter a,.syntaxhighlighter div,.syntaxhighlighter code,.syntaxhighlighter table,.syntaxhighlighter table td,.syntaxhighlighter table tr,.syntaxhighlighter table tbody,.syntaxhighlighter table thead,.syntaxhighlighter table caption,.syntaxhighlighter textarea{line-height:1.3em!important;}div.syntaxhighlighter{font-size:.85em!important;}div.include div.syntaxhighlighter table td.code .line{margin-top:.1em!important;} \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/examples/theming.html b/libreplan-webapp/src/main/webapp/jqplot/examples/theming.html new file mode 100644 index 000000000..6140feb9c --- /dev/null +++ b/libreplan-webapp/src/main/webapp/jqplot/examples/theming.html @@ -0,0 +1,519 @@ + + + + + + Chart Theming + + + + + + + + + + + + + +
    + + + + + + + + +

    jqPlot has basic theming support for commonly styled atributes of plot elements. Upon creation, each plot will have a "themeEngine" that controls modificaition, adding, removing and activating of plot themes. In addition, each plot will have a "Default" theme which corresponds to the styling of the plot at plot creation.

    + +

    Creation of new themes is easy. A "style" object is created with properties for the various plot elements to be styles. Attached to each of those is an ojbect with the actual styling properties. A simple style object might look like:

    + +
    +    gabe = {
    +        series: [
    +            {color: 'rgba(216, 159, 60, 0.4)'},
    +            {color: 'rgba(159, 216, 60, 0.4)'},
    +            {color: 'rgba(60, 159, 216, 0.4)'},
    +        ],
    +        grid: {
    +            backgroundColor: '#DEA493'
    +        }
    +    }
    +
    + +

    This new style would then be added to the plot's themeEngine as a new theme. it can then be activated by calling the plot's activateTheme method.

    +
    +    plot1b.themeEngine.newTheme('gabe', gabe);
    +    plot1b.activateTheme('gabe');
    +
    + +
    +

    Select Theme for area plot: + +

    + +

    Themes can be reused between plots. Here a style object is created and assigned to two different plots. For convenience, the theme is given the same name when added to each plot's themeEngine. Since each plot keeps it's own copy of the theme, the names do not need to be the same. Also note that themes are added as deep copies by value and not by reference. This avoids strange behavior due to the cascading nature of css related styles.

    + +
    +    temp = {
    +        seriesStyles: {
    +            seriesColors: ['red', 'orange', 'yellow', 'green', 'blue', 'indigo'],
    +            highlightColors: ['lightpink', 'lightsalmon', 'lightyellow', 'lightgreen', 'lightblue', 'mediumslateblue']
    +        },
    +        legend: {
    +            fontSize: '8pt'
    +        },
    +        title: {
    +            fontSize: '18pt'
    +        },
    +        grid: {
    +            backgroundColor: 'rgb(211, 233, 195)'
    +        }
    +    };
    +    
    +    plot3.themeEngine.newTheme('uma', temp);
    +    plot5.themeEngine.newTheme('uma', temp);
    +
    + +

    Select Theme for funnel and pie charts at same time: + +

    + +
    + +

    Select Theme for funnel plot: + +

    + +
    + +

    Select Theme for pie chart: + +

    + +

    There are various was to create and edit themes for a plot. Below are two different methods for creating additional themes for a line plot and adding them to the plots themeEngine. Here the axesStyles property is used to supply styling to all axes at one time. A similar property, seriesStyles, exists for styling all series of a plot at one time. Note, neither of these methods is as straightforward as using the newTheme() method of the plots themeEngine, but are included for illustrative purposes.

    + +
     
    +    e1 = plot1.themeEngine;
    +    brass = e1.copy('Default', 'brass');
    +    brass.title.fontFamily = 'Copperplate, Impact';
    +    brass.grid.backgroundColor = "rgb(216, 198, 114)";
    +    brass.grid.drawGridlines = false;
    +    brass.series[0].lineWidth = 6.5;
    +    brass.series[0].markerOptions.show = false;
    +    brass.axesStyles.label.fontFamily = "Copperplate, 'Copperplate Gothic Light', Impact";
    +    brass.axesStyles.ticks.fontFamily = "Copperplate, 'Copperplate Gothic Light', Impact";
    +    brass.axesStyles.label.fontSize = '14pt';
    +    
    +    temp = {
    +        grid: {
    +            backgroundColor: "#593D2B",
    +            gridLineColor: '#E8E8E8',
    +            gridLineWidth: 3
    +        },
    +        title: {
    +            fontFamily: '"Comic Sans MS", cursive',
    +            fontSize: '18pt',
    +            textColor: '#C7CC4E'
    +        },
    +        seriesStyles: {
    +            color: "#DBBCAF",
    +            lineWidth: 8,
    +            markerOptions: {
    +                show: false
    +            }
    +        },
    +        axes: {
    +            xaxis: {
    +                label: {
    +                    fontFamily: '"Comic Sans MS", cursive',
    +                    textColor: '#C7CC4E'
    +                }
    +            }
    +        }
    +    };
    +    
    +    chocolate = plot1.themeEngine.copy('Default', 'chocolate', temp);
    +
    + +
    + +

    Select theme for line chart: + +

    + +

    The example below shows more extensive use of the various styling options to give the chart a rather ugly and dated appearence. Note that, for bar (and funnel, pie and donut charts), highlightColors can be specified as an array of colors which will be applied to each bar individually, as a single string giving a color to apply to all bars, or as an empty array which will force jqPlot to auto calculate highlight colors based on the current bar color.

    + +

    +    oldstyle = {
    +        title: {
    +            fontFamily: 'Times New Roman',
    +            textColor: 'black'
    +        },
    +        axesStyles: {
    +           borderWidth: 0,
    +           ticks: {
    +               fontSize: '12pt',
    +               fontFamily: 'Times New Roman',
    +               textColor: 'black'
    +           },
    +           label: {
    +               fontFamily: 'Times New Roman',
    +               textColor: 'black'
    +           }
    +        },
    +        grid: {
    +            backgroundColor: 'white',
    +            borderWidth: 0,
    +            gridLineColor: 'black',
    +            gridLineWidth: 2,
    +            borderColor: 'black'
    +        },
    +        series: [
    +            {color: 'red', highlightColors: ['aqua', 'black', 'blue', 'fuchsia', 'gray', 'green', 'lime', 'maroon', 'navy', 'olive', 'purple', 'red', 'silver', 'teal', 'white', 'yellow']},
    +            {color: 'green', highlightColors: []},
    +            {color: 'blue', highlightColors: []},
    +            {color: 'yellow', highlightColors: 'rgb(255, 245, 185)'}
    +        ],
    +        legend: {
    +            background: 'white',
    +            textColor: 'black',
    +            fontFamily: 'Times New Roman',
    +            border: '1px solid black'
    +        }
    +    };
    +    
    +    plot2.themeEngine.newTheme('oldstyle', oldstyle);
    +
    + +
    + +

    Select theme for bar chart: + +

    + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/examples/topbanner.inc b/libreplan-webapp/src/main/webapp/jqplot/examples/topbanner.inc new file mode 100644 index 000000000..6977d1f99 --- /dev/null +++ b/libreplan-webapp/src/main/webapp/jqplot/examples/topbanner.inc @@ -0,0 +1,9 @@ + \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/examples/waterfall.html b/libreplan-webapp/src/main/webapp/jqplot/examples/waterfall.html new file mode 100644 index 000000000..2dfb07c0e --- /dev/null +++ b/libreplan-webapp/src/main/webapp/jqplot/examples/waterfall.html @@ -0,0 +1,162 @@ + + + + + + Waterfall Charts + + + + + + + + + + + + + +
    + + + + + + + + +

    Waterfall chart using default bar colors.

    +
    + +

    Waterfall chart using custom colors and "useNegativeColors" set to "false".

    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/examples/waterfall2.html b/libreplan-webapp/src/main/webapp/jqplot/examples/waterfall2.html new file mode 100644 index 000000000..ef3db3036 --- /dev/null +++ b/libreplan-webapp/src/main/webapp/jqplot/examples/waterfall2.html @@ -0,0 +1,231 @@ + + + + + + Waterfall charts 2 + + + + + + + + + + + + + +
    + + + + + + + + + +
    + +
    + +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/examples/yahooData.js b/libreplan-webapp/src/main/webapp/jqplot/examples/yahooData.js new file mode 100644 index 000000000..66dcb7490 --- /dev/null +++ b/libreplan-webapp/src/main/webapp/jqplot/examples/yahooData.js @@ -0,0 +1,1807 @@ +var yahoo=[["2011-10-18",580.19,592.56,577.40,590.51,3800800,590.51], +["2011-10-17",583.72,591.83,578.00,582.41,4008200,582.41], +["2011-10-14",599.47,599.60,587.57,591.68,8529900,591.68], +["2011-10-13",550.03,559.00,548.02,558.99,5639600,558.99], +["2011-10-12",548.13,555.23,544.63,548.50,3177800,548.50], +["2011-10-11",533.46,546.80,533.46,543.18,2853400,543.18], +["2011-10-10",525.18,537.47,523.20,537.17,2322200,537.17], +["2011-10-07",516.83,520.50,510.30,515.12,2855900,515.12], +["2011-10-06",507.50,515.23,502.60,514.71,3424300,514.71], +["2011-10-05",496.35,507.80,480.77,504.70,4534100,504.70], +["2011-10-04",490.03,503.44,480.60,501.90,4158800,501.90], +["2011-10-03",509.85,512.00,495.00,495.52,4474400,495.52], +["2011-09-30",520.21,524.00,514.38,515.04,2723600,515.04], +["2011-09-29",536.04,537.30,519.41,527.50,2906600,527.50], +["2011-09-28",541.50,544.02,527.70,528.84,2263300,528.84], +["2011-09-27",538.20,547.05,536.05,539.34,3010900,539.34], +["2011-09-26",527.25,532.93,513.25,531.89,2634200,531.89], +["2011-09-23",516.56,526.42,514.50,525.51,2777300,525.51], +["2011-09-22",526.25,528.78,514.00,520.66,4400300,520.66], +["2011-09-21",547.69,555.00,538.86,539.20,2514300,539.20], +["2011-09-20",549.40,558.52,542.67,546.63,2779100,546.63], +["2011-09-19",540.35,549.90,535.38,546.67,2468400,546.67], +["2011-09-16",544.80,546.84,543.14,546.68,3534300,546.68], +["2011-09-15",535.50,544.98,534.56,542.56,2960800,542.56], +["2011-09-14",532.59,536.95,525.82,532.07,2694400,532.07], +["2011-09-13",532.00,533.88,523.40,529.52,2354200,529.52], +["2011-09-12",517.96,531.99,517.50,530.12,2670400,530.12], +["2011-09-09",531.40,534.65,521.19,524.85,3268800,524.85], +["2011-09-08",533.80,539.10,531.90,534.96,2380500,534.96], +["2011-09-07",530.45,535.94,527.40,534.03,2755800,534.03], +["2011-09-06",510.80,522.76,510.50,522.18,2715800,522.18], +["2011-09-02",524.47,527.92,520.73,524.84,2401200,524.84], +["2011-09-01",540.75,543.83,531.22,532.50,2415500,532.50], +["2011-08-31",544.74,546.30,536.00,540.96,2693300,540.96], +["2011-08-30",538.19,542.99,530.81,540.70,2989000,540.70], +["2011-08-29",534.56,539.45,533.56,539.08,2335800,539.08], +["2011-08-26",519.99,530.45,513.14,526.86,3596300,526.86], +["2011-08-25",530.38,537.27,518.30,520.04,3293000,520.04], +["2011-08-24",519.33,530.00,517.23,523.29,3594500,523.29], +["2011-08-23",503.50,521.41,499.06,518.82,4346800,518.82], +["2011-08-22",504.00,507.00,494.53,498.17,4905900,498.17], +["2011-08-19",499.34,514.87,490.86,490.92,5410000,490.92], +["2011-08-18",523.47,524.89,500.49,504.88,6290700,504.88], +["2011-08-17",540.03,543.69,530.77,533.15,4055000,533.15], +["2011-08-16",552.43,552.44,530.30,539.00,6939400,539.00], +["2011-08-15",553.43,564.99,546.05,557.23,7144900,557.23], +["2011-08-12",569.50,570.50,560.40,563.77,3154300,563.77], +["2011-08-11",553.82,568.50,548.41,562.13,4830600,562.13], +["2011-08-10",561.38,564.12,547.73,549.01,5369600,549.01], +["2011-08-09",561.00,574.61,541.01,573.41,6469700,573.41], +["2011-08-08",562.98,569.00,544.35,546.02,7496600,546.02], +["2011-08-05",582.54,590.00,562.00,579.04,5929100,579.04], +["2011-08-04",594.50,598.85,577.47,577.52,4914600,577.52], +["2011-08-03",594.27,603.00,583.63,601.17,3825700,601.17], +["2011-08-02",606.00,609.67,591.57,592.40,3200600,592.40], +["2011-08-01",611.22,615.50,599.18,606.77,3966100,606.77], +["2011-07-29",604.23,614.96,603.69,603.69,4137400,603.69], +["2011-07-28",605.19,615.98,603.00,610.94,3108400,610.94], +["2011-07-27",617.18,620.95,604.75,607.22,3934400,607.22], +["2011-07-26",618.05,627.50,617.22,622.52,2342900,622.52], +["2011-07-25",613.36,625.41,613.00,618.98,3131600,618.98], +["2011-07-22",605.39,619.50,604.27,618.23,3528200,618.23], +["2011-07-21",594.03,608.06,594.01,606.99,3469500,606.99], +["2011-07-20",602.18,602.83,595.35,595.35,2227800,595.35], +["2011-07-19",596.14,604.68,595.53,602.55,2967500,602.55], +["2011-07-18",592.49,602.05,592.00,594.94,4468300,594.94], +["2011-07-15",597.50,600.25,588.16,597.62,13732100,597.62], +["2011-07-14",539.12,542.00,526.73,528.94,6594400,528.94], +["2011-07-13",537.00,544.00,536.48,538.26,2790200,538.26], +["2011-07-12",528.16,539.42,526.00,534.01,2841200,534.01], +["2011-07-11",528.18,535.98,525.50,527.28,2839300,527.28], +["2011-07-08",532.95,537.65,527.27,531.99,4770200,531.99], +["2011-07-07",541.00,550.68,535.88,546.60,3935500,546.60], +["2011-07-06",533.50,538.51,533.04,535.36,2695600,535.36], +["2011-07-05",525.30,535.40,525.30,532.44,3849200,532.44], +["2011-07-01",506.74,521.18,506.38,521.03,3636700,521.03], +["2011-06-30",501.99,506.67,501.50,506.38,2428400,506.38], +["2011-06-29",496.54,500.25,492.38,497.57,2343000,497.57], +["2011-06-28",484.02,496.21,484.02,493.65,2715100,493.65], +["2011-06-27",474.00,488.40,473.60,482.80,3444700,482.80], +["2011-06-24",480.68,480.75,473.02,474.88,3805600,474.88], +["2011-06-23",482.13,482.86,473.73,480.22,4801700,480.22], +["2011-06-22",491.45,492.35,486.73,487.01,2407100,487.01], +["2011-06-21",487.19,493.94,484.73,493.00,2765400,493.00], +["2011-06-20",485.00,486.23,479.23,484.58,3028600,484.58], +["2011-06-17",506.18,506.69,484.80,485.02,5245400,485.02], +["2011-06-16",502.81,506.57,496.67,500.37,2757000,500.37], +["2011-06-15",505.03,508.35,500.61,502.95,2073300,502.95], +["2011-06-14",508.15,514.08,506.99,508.37,2341500,508.37], +["2011-06-13",510.00,510.20,502.17,504.73,2427300,504.73], +["2011-06-10",514.08,516.69,509.29,509.51,2439900,509.51], +["2011-06-09",520.00,520.00,515.64,516.73,1689100,516.73], +["2011-06-08",516.53,521.24,515.78,519.17,1653400,519.17], +["2011-06-07",522.89,524.63,518.99,519.03,1907600,519.03], +["2011-06-06",523.54,526.82,519.25,521.06,1942100,521.06], +["2011-06-03",522.00,527.60,521.50,523.08,1748500,523.08], +["2011-06-02",527.57,530.30,522.48,528.06,2204500,528.06], +["2011-06-01",528.04,533.20,525.31,525.60,2955900,525.60], +["2011-05-31",525.00,529.05,523.50,529.02,2687300,529.02], +["2011-05-27",518.48,521.79,516.30,520.90,1745800,520.90], +["2011-05-26",517.70,522.12,515.00,518.13,2118500,518.13], +["2011-05-25",517.33,522.77,517.25,519.67,1301600,519.67], +["2011-05-24",520.37,523.96,518.15,518.26,1888400,518.26], +["2011-05-23",516.60,520.00,513.40,518.39,2252700,518.39], +["2011-05-20",531.80,531.99,523.13,524.03,2317500,524.03], +["2011-05-19",532.73,536.54,529.72,531.25,2468700,531.25], +["2011-05-18",529.54,530.33,525.70,529.81,1953200,529.81], +["2011-05-17",515.43,531.22,515.03,530.46,3303600,530.46], +["2011-05-16",526.31,527.27,516.40,518.42,2958200,518.42], +["2011-05-13",534.61,535.92,529.05,529.55,2108700,529.55], +["2011-05-12",535.24,536.94,530.91,535.05,1400000,535.05], +["2011-05-11",540.14,543.55,533.69,535.45,2338800,535.45], +["2011-05-10",540.00,544.43,537.54,542.66,2042900,542.66], +["2011-05-09",535.00,538.49,531.10,537.68,1948700,537.68], +["2011-05-06",538.15,541.46,535.18,535.30,2056100,535.30], +["2011-05-05",533.86,539.42,531.50,534.27,1997800,534.27], +["2011-05-04",535.17,539.00,533.02,535.79,2117000,535.79], +["2011-05-03",537.13,542.01,529.63,533.89,2081500,533.89], +["2011-05-02",545.70,545.73,537.12,538.56,2133700,538.56], +["2011-04-29",540.00,544.10,538.51,544.10,4200000,544.10], +["2011-04-28",538.06,539.25,534.08,537.97,2037400,537.97], +["2011-04-27",538.00,538.11,534.35,537.76,2298400,537.76], +["2011-04-26",526.52,537.44,525.21,532.82,3535400,532.82], +["2011-04-25",525.25,527.00,522.01,525.05,1630800,525.05], +["2011-04-21",527.49,528.28,522.39,525.10,2470100,525.10], +["2011-04-20",525.90,526.82,521.39,525.73,3060000,525.73], +["2011-04-19",529.95,530.88,520.90,521.53,2684100,521.53], +["2011-04-18",526.42,527.66,519.00,526.84,5039800,526.84], +["2011-04-15",545.29,545.75,530.06,530.70,14043700,530.70], +["2011-04-14",575.19,579.45,572.10,578.51,5456300,578.51], +["2011-04-13",575.51,577.60,571.75,576.28,2069400,576.28], +["2011-04-12",575.00,576.91,568.05,570.61,2085600,570.61], +["2011-04-11",576.20,578.10,573.00,577.37,1858200,577.37], +["2011-04-08",584.89,584.89,578.06,578.16,1901800,578.16], +["2011-04-07",575.73,580.64,574.19,580.00,2531500,580.00], +["2011-04-06",572.18,575.16,568.00,574.18,2668300,574.18], +["2011-04-05",581.08,581.49,565.68,569.09,6047500,569.09], +["2011-04-04",593.00,594.74,583.10,587.68,2054500,587.68], +["2011-04-01",588.76,595.19,588.76,591.80,2613200,591.80], +["2011-03-31",583.00,588.16,581.74,586.76,2029400,586.76], +["2011-03-30",584.38,585.50,580.58,581.84,1422300,581.84], +["2011-03-29",576.00,581.89,573.01,581.73,1604800,581.73], +["2011-03-28",582.07,584.99,574.71,575.36,2218400,575.36], +["2011-03-25",586.88,586.91,579.24,579.74,2858400,579.74], +["2011-03-24",585.43,588.39,578.80,586.89,2098700,586.89], +["2011-03-23",575.19,582.45,572.00,582.16,1816200,582.16], +["2011-03-22",577.27,579.23,572.51,577.32,1886900,577.32], +["2011-03-21",570.22,579.80,569.02,576.50,3020900,576.50], +["2011-03-18",564.64,567.99,559.74,561.06,3298600,561.06], +["2011-03-17",564.48,569.00,560.54,561.36,2899300,561.36], +["2011-03-16",568.01,569.79,551.28,557.10,3798500,557.10], +["2011-03-15",557.50,571.00,555.50,569.56,4005600,569.56], +["2011-03-14",572.80,578.29,568.02,569.99,2816100,569.99], +["2011-03-11",578.22,580.00,573.33,576.71,3032000,576.71], +["2011-03-10",585.44,586.62,579.45,580.30,3128100,580.30], +["2011-03-09",591.00,594.51,585.75,591.77,2151000,591.77], +["2011-03-08",592.93,597.98,590.20,592.31,2284900,592.31], +["2011-03-07",600.55,603.69,587.00,591.66,3462700,591.66], +["2011-03-04",608.33,608.98,600.20,600.62,3011000,600.62], +["2011-03-03",606.38,611.49,605.00,609.56,1945300,609.56], +["2011-03-02",599.80,606.00,595.19,600.79,2026700,600.79], +["2011-03-01",617.78,619.22,599.30,600.76,3323200,600.76], +["2011-02-28",610.00,616.49,608.01,613.40,2281500,613.40], +["2011-02-25",611.86,614.72,609.50,610.04,1932400,610.04], +["2011-02-24",611.39,613.09,601.35,608.82,2711700,608.82], +["2011-02-23",610.33,614.70,604.00,611.32,2889600,611.32], +["2011-02-22",620.03,624.93,607.77,610.21,3639900,610.21], +["2011-02-18",626.00,631.18,624.18,630.08,3217900,630.08], +["2011-02-17",621.25,627.25,620.28,625.26,1478800,625.26], +["2011-02-16",625.63,626.50,622.10,624.22,1684000,624.22], +["2011-02-15",627.32,630.09,623.10,624.15,2092000,624.15], +["2011-02-14",623.34,629.64,620.04,628.15,2128000,628.15], +["2011-02-11",613.79,625.00,613.00,624.50,2589900,624.50], +["2011-02-10",613.90,617.50,611.56,616.44,2334400,616.44], +["2011-02-09",616.87,619.45,612.34,616.50,1842500,616.50], +["2011-02-08",614.93,619.63,614.51,618.38,1694900,618.38], +["2011-02-07",610.16,618.39,609.21,614.29,1799600,614.29], +["2011-02-04",610.15,611.44,606.61,610.98,1550800,610.98], +["2011-02-03",609.48,611.45,606.13,610.15,1495100,610.15], +["2011-02-02",611.00,614.34,607.53,612.00,1760700,612.00], +["2011-02-01",604.49,613.35,603.11,611.04,2745300,611.04], +["2011-01-31",603.60,604.47,595.55,600.36,2804900,600.36], +["2011-01-28",619.07,620.36,599.76,600.99,4231100,600.99], +["2011-01-27",617.89,619.70,613.25,616.79,2019200,616.79], +["2011-01-26",620.33,622.49,615.28,616.50,2038100,616.50], +["2011-01-25",608.20,620.69,606.52,619.91,3646800,619.91], +["2011-01-24",607.57,612.49,601.23,611.08,4599200,611.08], +["2011-01-21",639.58,641.73,611.36,611.83,8904400,611.83], +["2011-01-20",632.21,634.08,623.29,626.77,5485800,626.77], +["2011-01-19",642.12,642.96,629.66,631.75,3406100,631.75], +["2011-01-18",626.06,641.99,625.27,639.63,3617000,639.63], +["2011-01-14",617.40,624.27,617.08,624.18,2365600,624.18], +["2011-01-13",616.97,619.67,614.16,616.69,1334000,616.69], +["2011-01-12",619.35,619.35,614.77,616.87,1632700,616.87], +["2011-01-11",617.71,618.80,614.50,616.01,1439300,616.01], +["2011-01-10",614.80,615.39,608.56,614.21,1579200,614.21], +["2011-01-07",615.91,618.25,610.13,616.44,2101200,616.44], +["2011-01-06",610.68,618.43,610.05,613.50,2057800,613.50], +["2011-01-05",600.07,610.33,600.05,609.07,2532300,609.07], +["2011-01-04",605.62,606.18,600.12,602.12,1824500,602.12], +["2011-01-03",596.48,605.59,596.48,604.35,2365200,604.35], +["2010-12-31",596.74,598.42,592.03,593.97,1539300,593.97], +["2010-12-30",598.00,601.33,597.39,598.86,989500,598.86], +["2010-12-29",602.00,602.41,598.92,601.00,1019200,601.00], +["2010-12-28",602.05,603.87,598.01,598.92,1064800,598.92], +["2010-12-27",602.74,603.78,599.50,602.38,1208100,602.38], +["2010-12-23",605.34,606.00,602.03,604.23,1110800,604.23], +["2010-12-22",604.00,607.00,603.28,605.49,1207500,605.49], +["2010-12-21",598.57,604.72,597.61,603.07,1879500,603.07], +["2010-12-20",594.65,597.88,588.66,595.06,1973300,595.06], +["2010-12-17",591.00,592.56,587.67,590.80,3087100,590.80], +["2010-12-16",592.85,593.77,588.07,591.71,1596900,591.71], +["2010-12-15",594.20,596.45,589.15,590.30,2167700,590.30], +["2010-12-14",597.09,598.29,592.48,594.91,1643300,594.91], +["2010-12-13",597.12,603.00,594.09,594.62,2398500,594.62], +["2010-12-10",593.14,593.99,590.29,592.21,1704700,592.21], +["2010-12-09",593.88,595.58,589.00,591.50,1868900,591.50], +["2010-12-08",591.97,592.52,583.69,590.54,1756900,590.54], +["2010-12-07",591.27,593.00,586.00,587.14,3042200,587.14], +["2010-12-06",580.57,582.00,576.61,578.36,2093800,578.36], +["2010-12-03",569.45,576.48,568.00,573.00,2631200,573.00], +["2010-12-02",568.66,573.33,565.35,571.82,2547900,571.82], +["2010-12-01",563.00,571.57,562.40,564.35,3754100,564.35], +["2010-11-30",574.32,574.32,553.31,555.71,7117400,555.71], +["2010-11-29",589.17,589.80,579.95,582.11,2859700,582.11], +["2010-11-26",590.46,592.98,587.00,590.00,1311100,590.00], +["2010-11-24",587.31,596.60,587.05,594.97,2396400,594.97], +["2010-11-23",587.01,589.01,578.20,583.01,2162600,583.01], +["2010-11-22",587.47,593.44,582.75,591.22,2186600,591.22], +["2010-11-19",597.00,597.89,590.34,590.83,2297500,590.83], +["2010-11-18",589.00,599.98,588.56,596.56,2590000,596.56], +["2010-11-17",585.00,589.50,581.37,583.55,2442500,583.55], +["2010-11-16",592.76,597.89,583.45,583.72,3307400,583.72], +["2010-11-15",603.08,604.00,594.05,595.47,3478900,595.47], +["2010-11-12",613.99,616.90,601.21,603.29,3393000,603.29], +["2010-11-11",619.70,619.85,614.21,617.19,2261600,617.19], +["2010-11-10",622.08,623.00,617.51,622.88,2497000,622.88], +["2010-11-09",630.00,630.85,620.51,624.82,2237200,624.82], +["2010-11-08",624.02,629.49,623.13,626.77,2101300,626.77], +["2010-11-05",623.18,625.49,621.11,625.08,1765700,625.08], +["2010-11-04",624.64,629.92,622.10,624.27,3570800,624.27], +["2010-11-03",617.50,621.83,613.50,620.18,3380500,620.18], +["2010-11-02",618.67,620.00,614.58,615.60,1997600,615.60], +["2010-11-01",615.73,620.66,611.21,615.00,3087100,615.00], +["2010-10-29",617.07,619.00,612.99,613.70,2278300,613.70], +["2010-10-28",620.05,621.00,613.30,618.58,2184300,618.58], +["2010-10-27",615.77,620.00,612.33,616.47,2241900,616.47], +["2010-10-26",613.10,621.23,611.03,618.60,2512900,618.60], +["2010-10-25",615.59,624.74,614.97,616.50,3158400,616.50], +["2010-10-22",611.92,614.82,610.05,612.53,2256100,612.53], +["2010-10-21",611.51,616.00,606.00,611.99,2920500,611.99], +["2010-10-20",608.14,617.38,607.50,607.98,3525100,607.98], +["2010-10-19",608.85,614.82,602.86,607.83,4587900,607.83], +["2010-10-18",600.55,619.69,600.55,617.71,7098200,617.71], +["2010-10-15",599.27,601.64,591.60,601.45,14824800,601.45], +["2010-10-14",544.18,545.25,537.11,540.93,6634100,540.93], +["2010-10-13",547.00,547.49,542.33,543.30,3055600,543.30], +["2010-10-12",540.12,545.99,537.79,541.39,3753600,541.39], +["2010-10-11",538.48,544.60,537.17,538.84,2626300,538.84], +["2010-10-08",532.77,537.60,527.62,536.35,2859200,536.35], +["2010-10-07",536.21,537.20,529.14,530.01,2395800,530.01], +["2010-10-06",539.26,539.95,529.94,534.35,2762300,534.35], +["2010-10-05",528.38,540.00,526.55,538.23,3507100,538.23], +["2010-10-04",524.95,528.25,518.85,522.35,1940500,522.35], +["2010-10-01",530.00,530.62,523.00,525.62,2225000,525.62], +["2010-09-30",529.16,531.87,518.92,525.79,3244100,525.79], +["2010-09-29",527.85,532.94,524.71,527.69,2172200,527.69], +["2010-09-28",533.48,533.59,518.45,527.17,3654700,527.17], +["2010-09-27",528.85,536.85,528.85,530.41,3107400,530.41], +["2010-09-24",521.74,527.83,518.26,527.29,3356900,527.29], +["2010-09-23",514.61,519.69,511.30,513.48,2317400,513.48], +["2010-09-22",512.86,517.78,511.68,516.00,2537100,516.00], +["2010-09-21",509.68,519.98,508.91,513.46,4466300,513.46], +["2010-09-20",492.50,510.41,492.06,508.28,4403500,508.28], +["2010-09-17",483.75,491.20,481.18,490.15,5641600,490.15], +["2010-09-16",479.95,482.45,479.41,481.06,1969500,481.06], +["2010-09-15",479.95,481.89,478.50,480.64,2402800,480.64], +["2010-09-14",482.01,484.75,480.08,480.43,2216500,480.43], +["2010-09-13",480.90,484.35,479.53,482.27,2241500,482.27], +["2010-09-10",479.02,479.79,475.08,476.14,1974300,476.14], +["2010-09-09",477.83,480.40,470.58,476.18,2430600,476.18], +["2010-09-08",465.19,472.50,464.51,470.58,2401800,470.58], +["2010-09-07",464.50,467.59,463.02,464.40,1709900,464.40], +["2010-09-03",470.52,471.88,467.44,470.30,2540400,470.30], +["2010-09-02",462.84,464.43,460.31,463.18,1684200,463.18], +["2010-09-01",454.98,464.94,452.50,460.33,3228300,460.33], +["2010-08-31",450.11,454.87,448.00,450.02,1946800,450.02], +["2010-08-30",459.15,459.76,452.42,452.69,1231400,452.69], +["2010-08-27",452.56,459.99,447.65,458.83,2312400,458.83], +["2010-08-26",456.06,457.26,450.44,450.98,1777000,450.98], +["2010-08-25",450.00,457.81,450.00,454.62,2592100,454.62], +["2010-08-24",457.70,458.37,450.92,451.39,2762700,451.39], +["2010-08-23",461.50,468.25,457.73,464.07,2986200,464.07], +["2010-08-20",467.97,471.59,461.02,462.02,3917600,462.02], +["2010-08-19",481.01,482.51,467.25,467.97,3925000,467.97], +["2010-08-18",490.44,490.87,481.55,482.15,2686400,482.15], +["2010-08-17",488.53,494.70,486.03,490.52,1890700,490.52], +["2010-08-16",483.68,489.87,480.50,485.59,1305000,485.59], +["2010-08-13",489.00,491.19,486.01,486.35,1934700,486.35], +["2010-08-12",483.94,494.75,482.51,492.01,2204600,492.01], +["2010-08-11",497.73,498.00,491.50,491.74,2223000,491.74], +["2010-08-10",502.35,506.00,498.57,503.71,2074000,503.71], +["2010-08-09",502.25,505.50,501.36,505.35,1872200,505.35], +["2010-08-06",505.40,505.74,496.05,500.22,3319500,500.22], +["2010-08-05",505.89,508.60,503.56,508.10,2420400,508.10], +["2010-08-04",492.18,507.00,491.05,506.32,3812500,506.32], +["2010-08-03",490.50,492.46,486.76,489.83,1802300,489.83], +["2010-08-02",488.99,493.28,486.94,490.41,1858700,490.41], +["2010-07-30",479.65,487.36,479.14,484.85,2144100,484.85], +["2010-07-29",485.95,488.88,479.33,484.99,2675500,484.99], +["2010-07-28",494.94,495.25,482.67,484.35,2496000,484.35], +["2010-07-27",490.58,497.50,490.17,492.63,2451200,492.63], +["2010-07-26",489.09,490.75,484.88,488.97,1995200,488.97], +["2010-07-23",480.77,490.59,480.01,490.06,2264400,490.06], +["2010-07-22",483.23,488.98,482.48,484.81,2147700,484.81], +["2010-07-21",484.00,485.70,475.43,477.50,3279600,477.50], +["2010-07-20",461.03,482.99,460.60,481.59,4054500,481.59], +["2010-07-19",461.01,469.65,457.52,466.18,4550300,466.18], +["2010-07-16",469.12,470.56,459.52,459.61,7824800,459.61], +["2010-07-15",491.73,494.70,482.68,494.02,4858200,494.02], +["2010-07-14",489.88,493.83,486.46,491.34,3118000,491.34], +["2010-07-13",482.25,492.99,480.28,489.20,3976300,489.20], +["2010-07-12",472.37,479.44,471.08,475.83,3334400,475.83], +["2010-07-09",471.96,473.26,462.78,467.49,4331500,467.49], +["2010-07-08",453.55,457.33,449.66,456.56,2668900,456.56], +["2010-07-07",438.31,451.29,435.38,450.20,3129700,450.20], +["2010-07-06",444.00,447.67,433.63,436.07,2560100,436.07], +["2010-07-02",441.62,442.28,436.00,436.55,1936000,436.55], +["2010-07-01",445.29,448.40,433.63,439.49,3513600,439.49], +["2010-06-30",454.96,457.83,444.72,444.95,3603200,444.95], +["2010-06-29",463.44,464.55,451.12,454.26,3502100,454.26], +["2010-06-28",472.59,477.55,469.01,472.08,1762300,472.08], +["2010-06-25",477.06,477.65,470.56,472.68,2245200,472.68], +["2010-06-24",479.66,482.75,473.26,475.10,1893600,475.10], +["2010-06-23",486.89,486.89,478.16,482.05,2029100,482.05], +["2010-06-22",489.90,496.60,485.73,486.25,2219700,486.25], +["2010-06-21",499.90,500.97,484.89,488.56,2983500,488.56], +["2010-06-18",502.51,503.47,498.13,500.03,2872900,500.03], +["2010-06-17",503.45,505.87,496.69,500.08,1977300,500.08], +["2010-06-16",496.17,504.00,496.11,501.27,2289300,501.27], +["2010-06-15",483.08,500.40,482.18,497.99,4259600,497.99], +["2010-06-14",494.48,494.50,483.19,483.19,2040400,483.19], +["2010-06-11",482.50,488.71,481.62,488.50,1781700,488.50], +["2010-06-10",480.37,488.50,475.84,487.01,2577900,487.01], +["2010-06-09",487.22,488.88,472.00,474.02,2729000,474.02], +["2010-06-08",487.85,488.84,477.54,484.78,2685100,484.78], +["2010-06-07",499.06,500.91,483.15,485.52,3632700,485.52], +["2010-06-04",499.72,509.25,496.70,498.72,3920300,498.72], +["2010-06-03",495.11,508.00,494.70,505.60,3650700,505.60], +["2010-06-02",486.68,493.87,481.46,493.37,2540800,493.37], +["2010-06-01",480.43,491.06,480.12,482.37,2666800,482.37], +["2010-05-28",492.74,493.45,483.00,485.63,2894800,485.63], +["2010-05-27",484.95,492.31,481.05,490.46,2809100,490.46], +["2010-05-26",482.07,489.76,475.00,475.47,3475600,475.47], +["2010-05-25",468.15,477.45,464.01,477.07,3017400,477.07], +["2010-05-24",480.73,489.79,476.80,477.16,4345600,477.16], +["2010-05-21",469.06,485.00,464.40,472.05,9690800,472.05], +["2010-05-20",485.07,485.58,473.80,475.01,4913300,475.01], +["2010-05-19",496.26,499.44,487.74,494.43,3445700,494.43], +["2010-05-18",510.00,510.97,497.07,498.37,2825500,498.37], +["2010-05-17",506.78,508.36,498.35,507.97,2793800,507.97], +["2010-05-14",509.77,510.99,496.25,507.53,4116000,507.53], +["2010-05-13",516.50,522.00,510.37,510.88,3325800,510.88], +["2010-05-12",512.04,512.04,502.00,505.39,3851800,505.39], +["2010-05-11",515.67,519.88,508.22,509.05,3322600,509.05], +["2010-05-10",513.97,522.82,512.60,521.65,4128000,521.65], +["2010-05-07",499.97,505.32,481.33,493.14,5089000,493.14], +["2010-05-06",508.75,517.52,460.00,498.67,5000100,498.67], +["2010-05-05",500.98,515.72,500.47,509.76,4582200,509.76], +["2010-05-04",526.52,526.74,504.21,506.37,6076300,506.37], +["2010-05-03",526.50,532.92,525.08,530.60,1857800,530.60], +["2010-04-30",531.13,537.68,525.44,525.70,2435400,525.70], +["2010-04-29",533.37,536.50,526.67,532.00,3058900,532.00], +["2010-04-28",532.10,534.83,521.03,529.19,3406100,529.19], +["2010-04-27",528.95,538.33,527.23,529.06,3844700,529.06], +["2010-04-26",544.97,544.99,529.21,531.64,4368800,531.64], +["2010-04-23",547.25,549.32,542.27,544.99,2089400,544.99], +["2010-04-22",552.00,552.50,543.35,547.06,3280700,547.06], +["2010-04-21",556.46,560.25,552.16,554.30,2391500,554.30], +["2010-04-20",554.17,559.66,551.06,555.04,2977400,555.04], +["2010-04-19",548.75,553.99,545.00,550.10,3894000,550.10], +["2010-04-16",563.00,568.81,549.63,550.15,12235500,550.15], +["2010-04-15",592.17,597.84,588.29,595.30,6761800,595.30], +["2010-04-14",590.06,592.34,584.01,589.00,3402700,589.00], +["2010-04-13",572.53,588.88,571.13,586.77,3912300,586.77], +["2010-04-12",567.35,574.00,566.22,572.73,2352400,572.73], +["2010-04-09",567.49,568.77,564.00,566.22,2056600,566.22], +["2010-04-08",563.32,569.85,560.05,567.49,1947500,567.49], +["2010-04-07",567.30,568.75,561.86,563.54,2581000,563.54], +["2010-04-06",569.46,570.89,565.40,568.22,2060100,568.22], +["2010-04-05",570.90,574.88,569.00,571.01,1901500,571.01], +["2010-04-01",571.35,573.45,565.55,568.80,2102700,568.80], +["2010-03-31",565.05,569.74,562.81,567.12,3030800,567.12], +["2010-03-30",562.83,567.63,560.28,566.71,1977900,566.71], +["2010-03-29",563.00,564.72,560.57,562.45,3104500,562.45], +["2010-03-26",565.27,567.39,560.02,562.69,2696200,562.69], +["2010-03-25",559.02,572.00,558.66,562.88,3930900,562.88], +["2010-03-24",545.51,559.85,539.70,557.33,6565200,557.33], +["2010-03-23",557.04,558.31,542.00,549.00,5501300,549.00], +["2010-03-22",556.11,566.85,554.28,557.50,4004800,557.50], +["2010-03-19",566.23,568.00,557.28,560.00,4792400,560.00], +["2010-03-18",564.72,568.44,562.96,566.40,1777200,566.40], +["2010-03-17",568.30,571.45,564.25,565.56,3321600,565.56], +["2010-03-16",561.83,568.42,560.76,565.20,3431500,565.20], +["2010-03-15",566.68,569.45,556.00,563.18,4653900,563.18], +["2010-03-12",588.14,588.28,579.16,579.54,2753400,579.54], +["2010-03-11",574.26,586.21,574.20,581.14,4233300,581.14], +["2010-03-10",563.76,578.50,562.21,576.45,5654900,576.45], +["2010-03-09",559.85,564.66,556.50,560.19,3176600,560.19], +["2010-03-08",564.78,565.18,561.01,562.48,2386400,562.48], +["2010-03-05",561.35,567.67,559.90,564.21,3912200,564.21], +["2010-03-04",546.50,556.13,546.20,554.59,3183800,554.59], +["2010-03-03",542.36,548.12,539.25,545.32,3089400,545.32], +["2010-03-02",535.48,545.66,535.01,541.06,4356800,541.06], +["2010-03-01",529.20,533.29,527.74,532.69,2237900,532.69], +["2010-02-26",527.42,531.75,523.48,526.80,2049300,526.80], +["2010-02-25",527.12,528.49,520.00,526.43,3309200,526.43], +["2010-02-24",533.98,538.44,530.51,531.47,2326600,531.47], +["2010-02-23",543.00,543.63,532.29,535.07,2872600,535.07], +["2010-02-22",547.35,547.50,541.00,542.80,2144600,542.80], +["2010-02-19",540.53,544.03,539.70,540.76,2553100,540.76], +["2010-02-18",537.54,545.01,536.14,543.22,2336900,543.22], +["2010-02-17",542.00,543.40,537.61,538.21,2029700,538.21], +["2010-02-16",536.87,544.13,534.30,541.30,3654400,541.30], +["2010-02-12",532.97,537.15,530.50,533.12,2279700,533.12], +["2010-02-11",533.32,540.49,529.50,536.40,2410000,536.40], +["2010-02-10",534.07,537.79,527.69,534.45,2674500,534.45], +["2010-02-09",539.54,541.53,535.07,536.44,2819600,536.44], +["2010-02-08",532.50,542.00,531.53,533.47,2694300,533.47], +["2010-02-05",528.40,533.50,522.46,531.29,3156000,531.29], +["2010-02-04",537.00,538.00,525.56,526.78,3377700,526.78], +["2010-02-03",528.67,542.10,528.23,540.82,2999100,540.82], +["2010-02-02",534.96,534.96,527.61,531.12,4096200,531.12], +["2010-02-01",534.60,535.81,530.30,533.02,2250800,533.02], +["2010-01-29",538.49,540.99,525.61,529.94,4140500,529.94], +["2010-01-28",544.49,547.00,530.60,534.29,3229100,534.29], +["2010-01-27",541.27,547.65,535.31,542.10,3964400,542.10], +["2010-01-26",537.97,549.60,536.29,542.42,4355500,542.42], +["2010-01-25",546.59,549.88,535.51,540.00,4419900,540.00], +["2010-01-22",564.50,570.60,534.86,550.01,6800400,550.01], +["2010-01-21",583.44,586.82,572.25,582.98,6307700,582.98], +["2010-01-20",585.98,585.98,575.29,580.41,3250700,580.41], +["2010-01-19",581.20,590.42,576.29,587.62,4316700,587.62], +["2010-01-15",593.34,593.56,578.04,580.00,5434500,580.00], +["2010-01-14",583.90,594.20,582.81,589.85,4240100,589.85], +["2010-01-13",576.49,588.38,573.90,587.09,6496600,587.09], +["2010-01-12",597.65,598.16,588.00,590.48,4853300,590.48], +["2010-01-11",604.46,604.46,594.04,601.11,7212900,601.11], +["2010-01-08",592.00,603.25,589.11,602.02,4724300,602.02], +["2010-01-07",609.40,610.00,592.65,594.10,6414300,594.10], +["2010-01-06",625.86,625.86,606.36,608.26,3978700,608.26], +["2010-01-05",627.18,627.84,621.54,623.99,3004700,623.99], +["2010-01-04",626.95,629.51,624.24,626.75,1956200,626.75], +["2009-12-31",624.75,625.40,619.98,619.98,1219800,619.98], +["2009-12-30",618.50,622.73,618.01,622.73,1465600,622.73], +["2009-12-29",624.74,624.84,618.29,619.40,1424800,619.40], +["2009-12-28",621.66,625.99,618.48,622.87,1697900,622.87], +["2009-12-24",612.93,619.52,612.27,618.48,858700,618.48], +["2009-12-23",603.50,612.87,602.85,611.68,2072700,611.68], +["2009-12-22",601.34,601.50,598.85,601.12,1880800,601.12], +["2009-12-21",597.61,599.84,595.67,598.68,2571200,598.68], +["2009-12-18",596.03,598.93,595.00,596.42,3531500,596.42], +["2009-12-17",596.44,597.64,593.76,593.94,2638800,593.94], +["2009-12-16",598.60,600.37,596.64,597.76,2809400,597.76], +["2009-12-15",593.30,596.38,590.99,593.14,2280400,593.14], +["2009-12-14",595.35,597.31,592.61,595.73,1913400,595.73], +["2009-12-11",594.68,594.75,587.73,590.51,1720000,590.51], +["2009-12-10",590.44,594.71,590.41,591.50,1668300,591.50], +["2009-12-09",587.50,589.33,583.58,589.02,1781000,589.02], +["2009-12-08",583.50,590.66,582.00,587.05,1524000,587.05], +["2009-12-07",584.21,588.69,581.00,586.25,1636200,586.25], +["2009-12-04",593.02,594.83,579.18,585.01,2513600,585.01], +["2009-12-03",589.04,591.45,585.00,585.74,1428700,585.74], +["2009-12-02",591.00,593.01,586.22,587.51,1663200,587.51], +["2009-12-01",588.13,591.22,583.00,589.87,2320300,589.87], +["2009-11-30",580.63,583.67,577.11,583.00,1725100,583.00], +["2009-11-27",572.00,582.46,570.97,579.76,1384600,579.76], +["2009-11-25",586.41,587.06,582.69,585.74,1461200,585.74], +["2009-11-24",582.52,584.29,576.54,583.09,1605200,583.09], +["2009-11-23",576.49,586.60,575.86,582.35,2547500,582.35], +["2009-11-20",569.50,571.60,569.40,569.96,2006200,569.96], +["2009-11-19",573.77,574.00,570.00,572.99,2168000,572.99], +["2009-11-18",576.65,578.78,572.07,576.65,1549600,576.65], +["2009-11-17",574.87,577.50,573.72,577.49,1916700,577.49], +["2009-11-16",575.00,576.99,572.78,576.28,2199200,576.28], +["2009-11-13",569.29,572.51,566.61,572.05,1666800,572.05], +["2009-11-12",569.56,572.90,565.50,567.85,1886300,567.85], +["2009-11-11",570.48,573.50,565.86,570.56,2319700,570.56], +["2009-11-10",562.73,568.78,562.00,566.76,2230800,566.76], +["2009-11-09",555.45,562.58,554.23,562.51,2649900,562.51], +["2009-11-06",547.72,551.78,545.50,551.10,1826700,551.10], +["2009-11-05",543.49,549.77,542.66,548.65,1847700,548.65], +["2009-11-04",540.80,545.50,536.42,540.33,2332700,540.33], +["2009-11-03",530.01,537.50,528.30,537.29,2380200,537.29], +["2009-11-02",537.08,539.46,528.24,533.99,3202100,533.99], +["2009-10-30",550.00,550.17,534.24,536.12,3468500,536.12], +["2009-10-29",543.01,551.83,541.00,551.05,2522600,551.05], +["2009-10-28",547.87,550.00,538.25,540.30,2567800,540.30], +["2009-10-27",550.97,554.56,544.16,548.29,3216500,548.29], +["2009-10-26",555.75,561.64,550.89,554.21,2970400,554.21], +["2009-10-23",555.25,557.89,551.20,553.69,2392700,553.69], +["2009-10-22",550.00,555.00,548.00,554.09,2336500,554.09], +["2009-10-21",549.91,559.35,549.00,551.10,3670600,551.10], +["2009-10-20",551.64,552.95,540.70,551.72,4043700,551.72], +["2009-10-19",552.69,553.60,548.73,552.09,3217900,552.09], +["2009-10-16",547.33,554.75,544.53,549.85,8841900,549.85], +["2009-10-15",533.75,536.90,527.27,529.91,6100400,529.91], +["2009-10-14",532.46,535.58,530.00,535.32,3258400,535.32], +["2009-10-13",524.39,527.46,521.38,526.11,3037400,526.11], +["2009-10-12",523.42,525.76,519.32,524.04,3322200,524.04], +["2009-10-09",516.65,521.51,514.50,516.25,2738100,516.25], +["2009-10-08",519.57,523.25,513.34,514.18,4303800,514.18], +["2009-10-07",499.00,518.99,497.81,517.54,4874200,517.54], +["2009-10-06",491.70,499.37,491.70,498.74,2732300,498.74], +["2009-10-05",487.65,492.43,483.34,488.52,2144600,488.52], +["2009-10-02",483.74,491.74,482.60,484.58,2600800,484.58], +["2009-10-01",493.00,496.47,487.00,487.20,2813200,487.20], +["2009-09-30",500.00,500.14,487.24,495.85,3141700,495.85], +["2009-09-29",499.53,499.75,493.01,498.53,2099200,498.53], +["2009-09-28",494.84,501.50,493.30,498.53,1839300,498.53], +["2009-09-25",494.29,499.93,492.00,492.48,2049600,492.48], +["2009-09-24",500.47,501.41,493.00,496.77,2527600,496.77], +["2009-09-23",500.78,507.00,497.71,498.46,2704200,498.46], +["2009-09-22",500.92,501.99,497.81,499.06,3041200,499.06], +["2009-09-21",487.74,498.90,486.22,497.00,2116400,497.00], +["2009-09-18",496.77,496.98,491.23,491.46,3283500,491.46], +["2009-09-17",490.57,497.37,487.15,491.72,4483100,491.72], +["2009-09-16",479.80,489.37,478.48,488.29,2585300,488.29], +["2009-09-15",475.08,478.91,472.71,477.54,2398100,477.54], +["2009-09-14",470.51,476.80,470.05,475.12,1975700,475.12], +["2009-09-11",470.40,473.30,467.63,472.14,1902900,472.14], +["2009-09-10",466.65,470.94,462.00,470.94,2534600,470.94], +["2009-09-09",459.06,466.27,458.80,463.97,2195400,463.97], +["2009-09-08",464.29,466.99,455.84,458.62,2656700,458.62], +["2009-09-04",457.57,462.60,455.78,461.30,1499200,461.30], +["2009-09-03",455.82,458.25,455.00,457.52,1646200,457.52], +["2009-09-02",455.82,458.33,452.59,453.01,1804800,453.01], +["2009-09-01",459.68,466.82,454.42,455.76,2594900,455.76], +["2009-08-31",459.79,461.86,458.00,461.67,1957900,461.67], +["2009-08-28",469.26,472.37,463.38,464.75,1771600,464.75], +["2009-08-27",468.58,468.58,460.73,466.06,1998900,466.06], +["2009-08-26",472.76,473.00,466.70,468.00,1987800,468.00], +["2009-08-25",469.13,474.35,468.72,471.37,2341000,471.37], +["2009-08-24",467.35,470.09,464.42,468.73,2453400,468.73], +["2009-08-21",465.54,466.09,462.65,465.24,3560500,465.24], +["2009-08-20",452.00,462.18,451.23,460.41,3998900,460.41], +["2009-08-19",439.99,445.00,438.56,443.97,2255000,443.97], +["2009-08-18",445.10,447.70,442.32,445.28,2351100,445.28], +["2009-08-17",451.50,451.99,443.12,444.89,2620200,444.89], +["2009-08-14",462.78,463.18,456.89,460.00,1675100,460.00], +["2009-08-13",462.15,464.72,458.91,462.28,1995200,462.28], +["2009-08-12",455.41,461.75,454.92,458.58,2341400,458.58], +["2009-08-11",453.67,457.23,452.38,453.94,1712500,453.94], +["2009-08-10",455.14,458.41,453.79,456.61,1742000,456.61], +["2009-08-07",455.67,459.42,454.99,457.10,2543100,457.10], +["2009-08-06",454.30,454.88,448.53,450.36,2110900,450.36], +["2009-08-05",456.00,456.91,447.88,451.14,2342000,451.14], +["2009-08-04",449.37,454.00,448.43,453.73,2389800,453.73], +["2009-08-03",448.74,453.90,447.64,452.21,2590300,452.21], +["2009-07-31",449.98,452.70,442.43,443.05,2860400,443.05], +["2009-07-30",442.61,451.47,442.61,445.64,3198600,445.64], +["2009-07-29",437.23,437.80,431.89,436.24,1987000,436.24], +["2009-07-28",441.00,442.81,436.10,439.85,2532500,439.85], +["2009-07-27",446.04,446.75,437.61,444.80,2504400,444.80], +["2009-07-24",435.81,450.49,435.00,446.72,3626900,446.72], +["2009-07-23",428.68,441.21,425.50,437.34,3478200,437.34], +["2009-07-22",428.00,430.20,423.50,427.69,2586700,427.69], +["2009-07-21",430.94,431.90,425.72,427.90,2968200,427.90], +["2009-07-20",429.88,432.85,426.25,430.17,3153500,430.17], +["2009-07-17",433.00,435.48,426.70,430.25,6854100,430.25], +["2009-07-16",436.68,445.75,434.10,442.60,6554500,442.60], +["2009-07-15",429.66,438.68,428.49,438.17,3777000,438.17], +["2009-07-14",423.71,426.73,420.87,424.69,2895800,424.69], +["2009-07-13",416.17,424.52,415.18,424.30,4045700,424.30], +["2009-07-10",409.58,417.37,408.70,414.40,2926600,414.40], +["2009-07-09",406.12,414.45,405.80,410.39,3275600,410.39], +["2009-07-08",400.00,406.00,398.06,402.49,3441200,402.49], +["2009-07-07",408.24,409.19,395.98,396.63,3259300,396.63], +["2009-07-06",406.50,410.64,401.66,409.61,2262600,409.61], +["2009-07-02",415.41,415.41,406.81,408.49,2517600,408.49], +["2009-07-01",424.20,426.40,418.15,418.99,2310800,418.99], +["2009-06-30",424.00,427.21,418.22,421.59,2593900,421.59], +["2009-06-29",426.00,427.80,422.24,424.14,2169300,424.14], +["2009-06-26",413.68,428.23,413.11,425.32,3256700,425.32], +["2009-06-25",407.00,415.90,406.51,415.77,3044500,415.77], +["2009-06-24",408.74,412.23,406.56,409.29,2457800,409.29], +["2009-06-23",406.65,408.99,402.55,405.68,2899600,405.68], +["2009-06-22",416.95,417.49,401.89,407.35,4124400,407.35], +["2009-06-19",418.21,420.46,414.58,420.09,4259100,420.09], +["2009-06-18",415.68,418.69,413.00,414.06,3085200,414.06], +["2009-06-17",416.19,419.72,411.56,415.16,3490100,415.16], +["2009-06-16",419.31,421.09,415.42,416.00,3049700,416.00], +["2009-06-15",421.50,421.50,414.00,416.77,3736900,416.77], +["2009-06-12",426.86,427.70,421.21,424.84,2918400,424.84], +["2009-06-11",431.77,433.73,428.37,429.00,2865200,429.00], +["2009-06-10",436.23,437.89,426.67,432.60,3358900,432.60], +["2009-06-09",438.58,440.50,431.76,435.62,3254900,435.62], +["2009-06-08",439.50,440.92,434.12,438.77,3098700,438.77], +["2009-06-05",445.07,447.34,439.46,444.32,3680800,444.32], +["2009-06-04",435.30,441.24,434.50,440.28,3638100,440.28], +["2009-06-03",426.00,432.46,424.00,431.65,3532800,431.65], +["2009-06-02",426.25,429.96,423.40,428.40,2623600,428.40], +["2009-06-01",418.73,429.60,418.53,426.56,3322400,426.56], +["2009-05-29",412.11,417.23,410.70,417.23,2648200,417.23], +["2009-05-28",408.68,411.62,404.61,410.40,2668800,410.40], +["2009-05-27",405.64,411.86,404.81,405.56,3034300,405.56], +["2009-05-26",391.95,405.00,390.00,404.36,3104500,404.36], +["2009-05-22",396.66,398.65,392.00,393.50,1718600,393.50], +["2009-05-21",396.30,402.84,393.84,396.50,2719800,396.50], +["2009-05-20",402.09,405.67,395.00,397.18,2284000,397.18], +["2009-05-19",396.10,401.64,393.00,398.88,2837500,398.88], +["2009-05-18",394.73,397.31,385.40,396.84,3351700,396.84], +["2009-05-15",391.10,394.11,389.09,390.00,3008700,390.00], +["2009-05-14",388.80,392.21,384.69,387.50,2937000,387.50], +["2009-05-13",394.09,396.39,388.35,389.54,2842800,389.54], +["2009-05-12",410.01,410.99,395.11,399.01,3790800,399.01], +["2009-05-11",402.80,412.00,401.20,407.98,2559300,407.98], +["2009-05-08",402.85,410.13,395.00,407.33,3865100,407.33], +["2009-05-07",404.10,404.99,392.50,396.61,2999800,396.61], +["2009-05-06",406.79,408.28,401.00,403.47,2632900,403.47], +["2009-05-05",399.98,405.00,397.25,402.99,2400800,402.99], +["2009-05-04",398.17,402.40,394.79,401.98,3203000,401.98], +["2009-05-01",395.03,397.59,391.55,393.69,2427700,393.69], +["2009-04-30",395.76,403.75,394.80,395.97,4355700,395.97], +["2009-04-29",385.97,394.97,385.83,391.47,3610000,391.47], +["2009-04-28",383.75,389.05,381.54,383.71,2943600,383.71], +["2009-04-27",384.34,389.49,382.75,385.95,2290600,385.95], +["2009-04-24",386.05,393.18,380.50,389.49,3385400,389.49], +["2009-04-23",387.51,389.75,381.11,384.69,2609000,384.69], +["2009-04-22",381.75,390.00,379.01,383.86,3501800,383.86], +["2009-04-21",376.17,384.30,376.10,381.47,3695400,381.47], +["2009-04-20",386.15,390.65,375.89,379.30,4428900,379.30], +["2009-04-17",386.02,399.82,384.81,392.24,10730800,392.24], +["2009-04-16",381.50,392.90,381.02,388.74,10185100,388.74], +["2009-04-15",367.10,381.06,364.16,379.50,4930700,379.50], +["2009-04-14",376.94,376.99,365.60,368.91,3428600,368.91], +["2009-04-13",371.33,379.10,370.30,378.11,3050100,378.11], +["2009-04-09",369.50,374.35,366.25,372.50,3382600,372.50], +["2009-04-08",363.50,365.00,356.21,362.00,2765200,362.00], +["2009-04-07",362.60,363.75,355.31,358.65,3680100,358.65], +["2009-04-06",367.00,369.82,361.40,368.24,3280300,368.24], +["2009-04-03",364.50,371.72,358.00,369.78,3789800,369.78], +["2009-04-02",363.31,369.76,360.32,362.50,4488000,362.50], +["2009-04-01",343.78,355.24,340.61,354.09,3301200,354.09], +["2009-03-31",348.93,353.51,346.18,348.06,3655300,348.06], +["2009-03-30",342.55,343.81,336.05,342.69,3094100,342.69], +["2009-03-27",350.00,352.00,345.47,347.70,3322800,347.70], +["2009-03-26",353.13,359.16,348.50,353.29,6003300,353.29], +["2009-03-25",350.40,351.34,336.25,344.07,4336300,344.07], +["2009-03-24",346.50,353.84,344.00,347.17,3820000,347.17], +["2009-03-23",333.56,349.45,333.03,348.60,4271500,348.60], +["2009-03-20",330.30,332.99,326.34,330.16,4737900,330.16], +["2009-03-19",331.68,336.00,327.38,329.94,4111200,329.94], +["2009-03-18",334.81,340.00,328.05,333.10,5012200,333.10], +["2009-03-17",320.18,335.34,319.09,335.34,4712500,335.34], +["2009-03-16",325.99,329.73,318.59,319.69,4946800,319.69], +["2009-03-13",326.10,327.46,319.03,324.42,3906400,324.42], +["2009-03-12",317.54,325.00,313.65,323.53,5024100,323.53], +["2009-03-11",310.10,320.00,305.71,317.91,5923600,317.91], +["2009-03-10",298.25,310.50,294.25,308.17,6730200,308.17], +["2009-03-09",299.98,306.57,289.45,290.89,6471300,290.89], +["2009-03-06",307.22,310.19,294.25,308.57,7234200,308.57], +["2009-03-05",316.48,319.08,302.64,305.64,6529900,305.64], +["2009-03-04",323.16,329.00,315.38,318.92,7818400,318.92], +["2009-03-03",330.07,333.69,322.35,325.48,6524800,325.48], +["2009-03-02",333.33,340.70,326.00,327.16,5788500,327.16], +["2009-02-27",332.95,343.82,331.11,337.99,5420000,337.99], +["2009-02-26",345.96,352.49,337.16,337.18,5605600,337.18], +["2009-02-25",342.15,352.30,338.92,341.64,6439100,341.64], +["2009-02-24",331.02,349.62,330.89,345.45,6095900,345.45], +["2009-02-23",347.00,349.80,329.55,330.06,5221100,330.06], +["2009-02-20",338.05,348.92,335.00,346.45,6217100,346.45], +["2009-02-19",357.47,359.80,341.41,342.64,4988700,342.64], +["2009-02-18",347.24,353.38,340.52,353.11,6024500,353.11], +["2009-02-17",346.51,347.09,339.69,342.66,5680400,342.66], +["2009-02-13",362.19,362.99,355.23,357.68,4146700,357.68], +["2009-02-12",353.16,363.62,351.48,363.05,5550300,363.05], +["2009-02-11",358.95,365.00,353.00,358.04,5231600,358.04], +["2009-02-10",375.98,377.50,357.89,358.51,7103700,358.51], +["2009-02-09",371.28,381.00,367.30,378.77,4977300,378.77], +["2009-02-06",356.46,373.81,355.44,371.28,7038100,371.28], +["2009-02-05",340.91,355.38,337.00,353.72,7264400,353.72], +["2009-02-04",340.07,354.44,339.17,343.00,6817400,343.00], +["2009-02-03",342.57,343.00,333.83,340.45,6556500,340.45], +["2009-02-02",334.29,345.00,332.00,340.57,5206900,340.57], +["2009-01-30",344.69,348.80,336.00,338.53,4672000,338.53], +["2009-01-29",344.54,345.05,340.11,343.32,7283800,343.32], +["2009-01-28",337.98,352.33,336.31,348.67,7691400,348.67], +["2009-01-27",326.45,333.87,324.27,331.48,4927300,331.48], +["2009-01-26",324.85,328.00,320.56,323.87,4610700,323.87], +["2009-01-23",309.27,331.96,304.22,324.70,10732800,324.70], +["2009-01-22",298.04,309.35,295.15,306.50,8267000,306.50], +["2009-01-21",288.35,303.50,288.35,303.08,4924500,303.08], +["2009-01-20",299.14,299.50,282.75,282.75,5048200,282.75], +["2009-01-16",305.02,308.25,295.70,299.67,5224400,299.67], +["2009-01-15",297.57,303.58,286.79,298.99,5934500,298.99], +["2009-01-14",310.00,313.80,297.75,300.97,5467900,300.97], +["2009-01-13",311.77,320.60,310.39,314.32,4432500,314.32], +["2009-01-12",316.31,318.95,310.23,312.69,3304300,312.69], +["2009-01-09",327.50,327.50,313.40,315.07,4340500,315.07], +["2009-01-08",318.28,325.19,317.34,325.19,3600700,325.19], +["2009-01-07",328.32,330.91,318.75,322.01,4494500,322.01], +["2009-01-06",332.98,340.80,326.39,334.06,6425200,334.06], +["2009-01-05",321.00,331.24,315.00,328.05,4889000,328.05], +["2009-01-02",308.60,321.82,305.50,321.32,3610500,321.32], +["2008-12-31",304.20,311.00,302.61,307.65,2886800,307.65], +["2008-12-30",300.80,306.81,298.71,303.11,3843500,303.11], +["2008-12-29",300.22,301.38,291.58,297.42,3701900,297.42], +["2008-12-26",304.07,305.26,298.31,300.36,1959100,300.36], +["2008-12-24",301.48,306.34,298.38,302.95,1921500,302.95], +["2008-12-23",300.43,303.31,296.67,298.02,3777700,298.02], +["2008-12-22",308.56,309.50,290.63,297.11,3917600,297.11], +["2008-12-19",310.99,317.79,309.00,310.17,5612600,310.17], +["2008-12-18",316.70,320.35,309.11,310.28,4763500,310.28], +["2008-12-17",318.64,322.13,312.42,315.24,5789700,315.24], +["2008-12-16",314.52,329.50,311.27,325.28,7059600,325.28], +["2008-12-15",314.01,318.49,305.11,310.67,6737900,310.67], +["2008-12-12",295.71,316.47,294.00,315.76,5722100,315.76], +["2008-12-11",304.17,312.88,297.80,300.22,6179200,300.22], +["2008-12-10",309.24,314.90,304.51,308.82,5237000,308.82], +["2008-12-09",297.69,318.00,297.01,305.97,6889900,305.97], +["2008-12-08",289.99,309.44,282.00,302.11,8144300,302.11], +["2008-12-05",271.02,284.24,264.02,283.99,6521200,283.99], +["2008-12-04",276.53,283.49,268.77,274.34,4886600,274.34], +["2008-12-03",269.85,281.36,265.34,279.43,5904800,279.43], +["2008-12-02",269.73,277.78,262.58,275.11,5839700,275.11], +["2008-12-01",286.68,287.38,265.98,265.99,5711200,265.99], +["2008-11-28",290.58,296.45,288.28,292.96,2565500,292.96], +["2008-11-26",280.28,295.46,276.20,292.09,6356600,292.09], +["2008-11-25",268.68,286.66,267.32,282.05,10771200,282.05], +["2008-11-24",269.26,269.95,249.01,257.44,10054700,257.44], +["2008-11-21",262.51,269.37,247.30,262.43,10244500,262.43], +["2008-11-20",274.89,282.94,259.04,259.56,9779400,259.56], +["2008-11-19",295.39,300.19,278.58,280.18,7834600,280.18], +["2008-11-18",301.57,303.73,285.35,297.42,8346100,297.42], +["2008-11-17",303.00,310.16,297.95,300.12,7543800,300.12], +["2008-11-14",303.25,324.99,302.56,310.02,9517100,310.02], +["2008-11-13",291.77,313.00,280.00,312.08,13234700,312.08], +["2008-11-12",302.05,312.49,287.76,291.00,10051100,291.00], +["2008-11-11",308.69,316.30,300.52,311.46,10146600,311.46], +["2008-11-10",328.00,329.44,309.47,318.78,8080100,318.78], +["2008-11-07",333.12,341.15,325.33,331.14,4681300,331.14], +["2008-11-06",339.97,344.42,325.81,331.22,8574800,331.22], +["2008-11-05",362.15,368.88,341.31,342.24,6946500,342.24], +["2008-11-04",353.44,372.36,345.50,366.94,7349900,366.94], +["2008-11-03",357.58,362.99,341.43,346.49,5954500,346.49], +["2008-10-31",356.16,371.96,354.27,359.36,7423300,359.36], +["2008-10-30",368.46,372.00,358.37,359.69,7988900,359.69], +["2008-10-29",365.79,371.00,352.37,358.00,9756600,358.00], +["2008-10-28",339.05,369.31,328.51,368.75,8105400,368.75], +["2008-10-27",334.81,343.00,325.60,329.49,6200700,329.49], +["2008-10-24",326.47,350.47,324.74,339.29,7359000,339.29], +["2008-10-23",353.65,358.00,337.99,352.32,6478900,352.32], +["2008-10-22",356.99,369.69,344.00,355.67,6560000,355.67], +["2008-10-21",372.39,383.78,362.00,362.75,5782000,362.75], +["2008-10-20",379.75,380.98,359.59,379.32,6753400,379.32], +["2008-10-17",378.96,386.00,363.55,372.54,14249200,372.54], +["2008-10-16",332.76,356.50,309.44,353.02,16239700,353.02], +["2008-10-15",354.65,359.00,338.83,339.17,6721400,339.17], +["2008-10-14",393.53,394.50,357.00,362.71,7784800,362.71], +["2008-10-13",355.79,381.95,345.75,381.02,8905500,381.02], +["2008-10-10",313.16,341.89,310.30,332.00,10597800,332.00], +["2008-10-09",344.52,348.57,321.67,328.98,8075000,328.98], +["2008-10-08",330.16,358.99,326.11,338.11,11826400,338.11], +["2008-10-07",373.33,374.98,345.37,346.01,11054400,346.01], +["2008-10-06",373.98,375.99,357.16,371.21,11220600,371.21], +["2008-10-03",397.35,412.50,383.07,386.91,7992900,386.91], +["2008-10-02",409.79,409.98,386.00,390.49,5984900,390.49], +["2008-10-01",411.15,416.98,403.10,411.72,6234800,411.72], +["2008-09-30",395.98,425.08,392.32,400.52,3086300,400.52], +["2008-09-29",419.51,423.51,380.71,381.00,10762900,381.00], +["2008-09-26",428.00,437.16,421.03,431.04,5292500,431.04], +["2008-09-25",438.84,450.00,435.98,439.60,5020300,439.60], +["2008-09-24",430.34,445.00,430.11,435.11,4242000,435.11], +["2008-09-23",433.25,440.79,425.72,429.27,5204200,429.27], +["2008-09-22",454.13,454.13,429.00,430.14,4407300,430.14], +["2008-09-19",461.00,462.07,443.28,449.15,10006000,449.15], +["2008-09-18",422.64,439.18,410.50,439.08,8589400,439.08], +["2008-09-17",438.48,439.14,413.44,414.49,9126900,414.49], +["2008-09-16",425.96,449.28,425.49,442.93,6990700,442.93], +["2008-09-15",424.00,441.97,423.71,433.86,6567400,433.86], +["2008-09-12",430.21,441.99,429.00,437.66,6028000,437.66], +["2008-09-11",408.35,435.09,406.38,433.75,6471400,433.75], +["2008-09-10",424.47,424.48,409.68,414.16,6226800,414.16], +["2008-09-09",423.17,432.38,415.00,418.66,7229600,418.66], +["2008-09-08",452.02,452.94,417.55,419.95,9017900,419.95], +["2008-09-05",445.49,452.46,440.08,444.25,4534300,444.25], +["2008-09-04",460.00,463.24,449.40,450.26,4848500,450.26], +["2008-09-03",468.73,474.29,459.58,464.41,4314600,464.41], +["2008-09-02",476.77,482.18,461.42,465.25,6111500,465.25], +["2008-08-29",469.75,471.01,462.33,463.29,3848200,463.29], +["2008-08-28",472.49,476.45,470.33,473.78,3029700,473.78], +["2008-08-27",473.73,474.83,464.84,468.58,4387100,468.58], +["2008-08-26",483.46,483.46,470.59,474.16,3308200,474.16], +["2008-08-25",486.11,497.00,481.50,483.01,2014300,483.01], +["2008-08-22",491.50,494.88,489.48,490.59,2297200,490.59], +["2008-08-21",482.92,489.90,479.27,486.53,3514100,486.53], +["2008-08-20",494.72,496.69,482.57,485.00,3982100,485.00], +["2008-08-19",490.43,498.28,486.63,490.50,3046500,490.50], +["2008-08-18",509.84,510.00,495.51,498.30,3333900,498.30], +["2008-08-15",506.99,510.66,505.50,510.15,3545700,510.15], +["2008-08-14",497.70,507.61,496.29,505.49,2918600,505.49], +["2008-08-13",501.60,503.54,493.88,500.03,3625500,500.03], +["2008-08-12",502.00,506.13,498.00,502.61,2755700,502.61], +["2008-08-11",492.47,508.88,491.78,500.84,4239300,500.84], +["2008-08-08",480.15,495.75,475.69,495.01,3739300,495.01], +["2008-08-07",482.00,484.00,476.41,479.12,2773800,479.12], +["2008-08-06",478.37,489.77,472.51,486.34,3375800,486.34], +["2008-08-05",467.59,480.08,466.33,479.85,3584500,479.85], +["2008-08-04",468.12,473.01,461.90,463.00,2487000,463.00], +["2008-08-01",472.51,473.22,462.50,467.86,3007900,467.86], +["2008-07-31",474.56,480.89,471.44,473.75,2865100,473.75], +["2008-07-30",485.50,486.02,472.81,482.70,3490700,482.70], +["2008-07-29",479.30,487.26,478.00,483.11,2802800,483.11], +["2008-07-28",492.09,492.09,475.13,477.12,3160000,477.12], +["2008-07-25",486.49,493.13,481.50,491.98,3183500,491.98], +["2008-07-24",496.70,496.87,475.62,475.62,3540900,475.62], +["2008-07-23",481.61,497.23,478.10,489.22,4894100,489.22], +["2008-07-22",466.72,480.25,465.60,477.11,4691500,477.11], +["2008-07-21",480.88,484.09,465.70,468.80,5901500,468.80], +["2008-07-18",498.35,498.98,478.19,481.32,11292400,481.32], +["2008-07-17",534.16,537.05,524.50,533.44,8787400,533.44], +["2008-07-16",514.04,536.50,510.60,535.60,4742200,535.60], +["2008-07-15",516.28,527.50,501.10,516.09,6071000,516.09], +["2008-07-14",539.00,540.06,515.45,521.62,4424800,521.62], +["2008-07-11",536.50,539.50,519.43,533.80,4981400,533.80], +["2008-07-10",545.00,549.50,530.72,540.57,4331700,540.57], +["2008-07-09",550.76,555.68,540.73,541.55,4154000,541.55], +["2008-07-08",545.99,555.19,540.00,554.53,4932400,554.53], +["2008-07-07",542.30,549.00,535.60,543.91,4255200,543.91], +["2008-07-03",530.88,539.23,527.50,537.00,2400500,537.00], +["2008-07-02",536.51,540.38,526.06,527.04,4223000,527.04], +["2008-07-01",519.58,536.72,517.00,534.73,4959900,534.73], +["2008-06-30",532.47,538.00,523.06,526.42,3765300,526.42], +["2008-06-27",527.68,530.00,515.09,528.07,5447500,528.07], +["2008-06-26",544.10,544.93,528.26,528.82,5659500,528.82], +["2008-06-25",544.97,557.80,543.67,551.00,4122200,551.00], +["2008-06-24",545.14,551.19,535.10,542.30,4672600,542.30], +["2008-06-23",545.36,553.15,542.02,545.21,3635900,545.21], +["2008-06-20",556.98,556.98,544.51,546.43,5983100,546.43], +["2008-06-19",555.35,563.78,550.81,560.20,5683100,560.20], +["2008-06-18",564.51,568.99,559.16,562.38,3381200,562.38], +["2008-06-17",576.35,578.07,568.38,569.46,3462900,569.46], +["2008-06-16",566.50,579.10,566.50,572.81,3542800,572.81], +["2008-06-13",561.49,575.70,561.34,571.51,6184400,571.51], +["2008-06-12",548.76,558.00,546.88,552.95,5491600,552.95], +["2008-06-11",556.24,557.34,544.46,545.20,3812900,545.20], +["2008-06-10",549.56,558.82,546.78,554.17,3657400,554.17], +["2008-06-09",568.06,570.00,545.40,557.87,5288300,557.87], +["2008-06-06",579.75,580.72,567.00,567.00,4734500,567.00], +["2008-06-05",577.08,588.04,576.21,586.30,3916700,586.30], +["2008-06-04",565.33,578.00,564.55,572.22,3363200,572.22], +["2008-06-03",576.50,580.50,560.61,567.30,4305300,567.30], +["2008-06-02",582.50,583.89,571.27,575.00,3674200,575.00], +["2008-05-30",583.47,589.92,581.30,585.80,3225200,585.80], +["2008-05-29",574.79,585.88,573.20,583.00,4845000,583.00], +["2008-05-28",567.94,571.49,561.10,568.24,4050400,568.24], +["2008-05-27",544.96,562.60,543.85,560.90,3865500,560.90], +["2008-05-23",546.96,553.00,537.81,544.62,4431500,544.62], +["2008-05-22",551.95,554.21,540.25,549.46,5076300,549.46], +["2008-05-21",578.52,581.41,547.89,549.99,6468100,549.99], +["2008-05-20",574.63,582.48,572.91,578.60,3313600,578.60], +["2008-05-19",578.55,588.88,573.52,577.52,5604500,577.52], +["2008-05-16",581.43,584.68,578.32,580.07,4274100,580.07], +["2008-05-15",579.00,582.95,575.61,581.00,4342700,581.00], +["2008-05-14",586.49,591.19,575.25,576.30,4375800,576.30], +["2008-05-13",586.23,587.95,578.55,583.00,5163500,583.00], +["2008-05-12",574.75,586.75,568.91,584.94,4863900,584.94], +["2008-05-09",579.00,585.00,571.30,573.20,4484900,573.20], +["2008-05-08",586.20,589.30,578.91,583.01,5122900,583.01], +["2008-05-07",590.27,599.49,576.43,579.00,6613000,579.00], +["2008-05-06",591.00,592.00,583.00,586.36,4629300,586.36], +["2008-05-05",598.86,599.00,587.13,594.90,6281000,594.90], +["2008-05-02",598.49,602.45,579.30,581.29,6998800,581.29], +["2008-05-01",578.31,594.93,576.97,593.08,6602800,593.08], +["2008-04-30",562.21,584.86,558.47,574.29,7903000,574.29], +["2008-04-29",550.83,563.40,550.01,558.47,4346000,558.47], +["2008-04-28",545.88,556.81,539.00,552.12,4008600,552.12], +["2008-04-25",549.02,553.00,542.73,544.06,4164400,544.06], +["2008-04-24",551.29,554.49,540.02,543.04,4135100,543.04], +["2008-04-23",557.94,559.31,540.95,546.49,4921500,546.49], +["2008-04-22",537.57,560.83,537.56,555.00,7938500,555.00], +["2008-04-21",539.39,542.59,530.29,537.79,7439700,537.79], +["2008-04-18",535.21,547.70,524.77,539.41,18235600,539.41], +["2008-04-17",455.63,459.37,446.52,449.54,13353000,449.54], +["2008-04-16",444.40,458.28,441.00,455.03,7630700,455.03], +["2008-04-15",458.13,459.72,443.72,446.84,4577600,446.84], +["2008-04-14",457.16,457.45,450.15,451.66,3842600,451.66], +["2008-04-11",464.07,467.26,455.01,457.45,4169700,457.45], +["2008-04-10",464.96,473.86,461.85,469.08,5072400,469.08], +["2008-04-09",469.13,472.00,457.54,464.19,6048100,464.19], +["2008-04-08",473.04,474.14,462.01,467.81,4547000,467.81], +["2008-04-07",477.03,485.44,473.53,476.82,5943500,476.82], +["2008-04-04",457.01,477.83,456.20,471.09,5897200,471.09], +["2008-04-03",461.73,463.29,448.13,455.12,6778400,455.12], +["2008-04-02",469.90,475.74,460.39,465.70,5999000,465.70], +["2008-04-01",447.74,466.50,446.87,465.71,6093100,465.71], +["2008-03-31",435.64,442.69,432.01,440.47,4446400,440.47], +["2008-03-28",447.46,453.57,434.31,438.08,4376200,438.08], +["2008-03-27",446.00,448.61,440.49,444.08,5832200,444.08], +["2008-03-26",452.59,462.87,449.29,458.19,5225700,458.19], +["2008-03-25",457.46,457.47,446.00,450.78,5831600,450.78], +["2008-03-24",438.43,465.78,437.72,460.56,6763500,460.56], +["2008-03-20",427.32,435.70,417.50,433.55,9913400,433.55], +["2008-03-19",441.11,447.50,431.67,432.00,6179000,432.00], +["2008-03-18",428.98,440.84,425.53,439.16,7237200,439.16], +["2008-03-17",427.99,433.71,412.11,419.87,7888200,419.87], +["2008-03-14",442.98,449.34,430.62,437.92,6574400,437.92], +["2008-03-13",432.67,446.98,428.78,443.01,7726600,443.01], +["2008-03-12",440.01,447.88,438.07,440.18,6651900,440.18], +["2008-03-11",425.26,440.15,424.65,439.84,8826900,439.84], +["2008-03-10",428.83,431.00,413.04,413.62,7987600,413.62], +["2008-03-07",428.88,440.00,426.24,433.35,8071800,433.35], +["2008-03-06",447.69,453.30,431.18,432.70,7470100,432.70], +["2008-03-05",445.25,454.17,444.00,447.70,7436600,447.70], +["2008-03-04",450.95,453.36,435.78,444.60,13621700,444.60], +["2008-03-03",471.51,472.72,450.11,457.02,7554500,457.02], +["2008-02-29",471.87,479.74,464.65,471.18,9425400,471.18], +["2008-02-28",470.50,479.09,467.36,475.39,6586900,475.39], +["2008-02-27",460.13,475.49,459.64,472.86,10121900,472.86], +["2008-02-26",461.20,466.47,446.85,464.19,23287300,464.19], +["2008-02-25",505.95,506.50,485.74,486.44,8372800,486.44], +["2008-02-22",502.06,509.00,497.55,507.80,5515900,507.80], +["2008-02-21",512.85,513.21,499.50,502.86,5677800,502.86], +["2008-02-20",503.51,511.01,498.82,509.00,6662200,509.00], +["2008-02-19",534.94,535.06,506.50,508.95,6350400,508.95], +["2008-02-15",528.31,532.66,524.33,529.64,5240100,529.64], +["2008-02-14",538.35,541.04,531.00,532.25,6476700,532.25], +["2008-02-13",522.50,534.99,518.69,534.62,6624700,534.62], +["2008-02-12",523.39,530.60,513.03,518.09,6662300,518.09], +["2008-02-11",520.52,523.71,513.40,521.16,5826000,521.16], +["2008-02-08",509.41,517.73,508.70,516.69,6828900,516.69], +["2008-02-07",496.86,514.19,494.76,504.95,7928900,504.95], +["2008-02-06",511.14,511.17,497.93,501.71,7636400,501.71], +["2008-02-05",489.43,509.00,488.52,506.80,11203300,506.80], +["2008-02-04",509.07,512.78,492.55,495.43,13157100,495.43], +["2008-02-01",528.67,536.67,510.00,515.90,17600500,515.90], +["2008-01-31",539.01,573.00,534.29,564.30,14871300,564.30], +["2008-01-30",549.19,560.43,543.51,548.27,7939600,548.27], +["2008-01-29",560.47,561.33,540.67,550.52,6283000,550.52], +["2008-01-28",570.97,572.24,548.60,555.98,5816700,555.98], +["2008-01-25",591.81,595.00,566.18,566.40,6966000,566.40], +["2008-01-24",558.80,579.69,554.14,574.49,9400900,574.49], +["2008-01-23",560.71,568.00,519.00,548.62,16965700,548.62], +["2008-01-22",562.03,597.50,561.20,584.35,9501500,584.35], +["2008-01-18",608.36,609.99,598.45,600.25,8539600,600.25], +["2008-01-17",620.76,625.74,598.01,600.79,8216800,600.79], +["2008-01-16",628.97,639.99,601.93,615.95,10560000,615.95], +["2008-01-15",645.90,649.05,635.38,637.65,5568200,637.65], +["2008-01-14",651.14,657.40,645.25,653.82,4447500,653.82], +["2008-01-11",642.70,649.47,630.11,638.25,4977000,638.25], +["2008-01-10",645.01,657.20,640.11,646.73,6334200,646.73], +["2008-01-09",630.04,653.34,622.51,653.20,6739700,653.20], +["2008-01-08",653.00,659.96,631.00,631.68,5339100,631.68], +["2008-01-07",653.94,662.28,637.35,649.25,6403400,649.25], +["2008-01-04",679.69,680.96,655.00,657.00,5359800,657.00], +["2008-01-03",685.26,686.85,676.52,685.33,3252500,685.33], +["2008-01-02",692.87,697.37,677.73,685.19,4306900,685.19], +["2007-12-31",698.57,702.49,690.58,691.48,2376200,691.48], +["2007-12-28",704.93,707.95,696.54,702.53,2562700,702.53], +["2007-12-27",707.07,716.00,700.74,700.74,2942500,700.74], +["2007-12-26",698.99,713.22,698.21,710.84,2530000,710.84], +["2007-12-24",694.99,700.73,693.06,700.73,1628400,700.73], +["2007-12-21",697.88,699.26,693.24,696.69,5382000,696.69], +["2007-12-20",685.83,691.00,680.61,689.69,4422200,689.69], +["2007-12-19",674.21,679.50,669.00,677.37,4421100,677.37], +["2007-12-18",674.16,676.71,652.50,673.35,7166700,673.35], +["2007-12-17",688.00,695.42,663.67,669.23,5486000,669.23], +["2007-12-14",687.51,699.70,687.26,689.96,3673500,689.96], +["2007-12-13",696.31,697.62,681.21,694.05,5040800,694.05], +["2007-12-12",714.00,714.32,688.50,699.35,6159100,699.35], +["2007-12-11",719.94,720.99,698.78,699.20,6139100,699.20], +["2007-12-10",715.99,724.80,714.00,718.42,3856200,718.42], +["2007-12-07",714.99,718.00,710.50,714.87,3852100,714.87], +["2007-12-06",697.80,716.56,697.01,715.26,4909000,715.26], +["2007-12-05",692.73,698.93,687.50,698.51,4209600,698.51], +["2007-12-04",678.31,692.00,677.12,684.16,4231800,684.16], +["2007-12-03",691.01,695.00,681.14,681.53,4325100,681.53], +["2007-11-30",711.00,711.06,682.11,693.00,7895500,693.00], +["2007-11-29",690.75,702.79,687.77,697.00,6208000,697.00], +["2007-11-28",682.11,694.30,672.14,692.26,7916500,692.26], +["2007-11-27",674.80,676.43,650.26,673.57,8904500,673.57], +["2007-11-26",680.20,693.40,665.00,666.00,6790100,666.00], +["2007-11-23",670.00,678.28,668.11,676.70,2738700,676.70], +["2007-11-21",643.77,669.97,642.08,660.52,7013500,660.52], +["2007-11-20",636.48,659.10,632.87,648.54,9840600,648.54], +["2007-11-19",629.59,636.77,618.50,625.85,5527400,625.85], +["2007-11-16",633.94,635.49,616.02,633.63,9042800,633.63], +["2007-11-15",638.57,647.50,624.00,629.65,6967700,629.65], +["2007-11-14",673.28,675.49,636.27,641.68,8094700,641.68], +["2007-11-13",644.99,660.92,632.07,660.55,8426100,660.55], +["2007-11-12",657.74,669.93,626.21,632.07,10227300,632.07], +["2007-11-09",675.78,681.88,661.21,663.97,11388100,663.97], +["2007-11-08",734.60,734.89,677.18,693.84,16512200,693.84], +["2007-11-07",741.13,747.24,723.14,732.94,8252900,732.94], +["2007-11-06",737.56,741.79,725.00,741.79,8436300,741.79], +["2007-11-05",706.99,730.23,706.07,725.65,8883700,725.65], +["2007-11-02",710.51,713.58,697.34,711.25,5841500,711.25], +["2007-11-01",702.79,713.72,701.78,703.21,6527200,703.21], +["2007-10-31",700.69,707.00,696.04,707.00,6876800,707.00], +["2007-10-30",677.51,699.91,677.51,694.77,6900600,694.77], +["2007-10-29",677.77,680.00,672.09,679.23,3066300,679.23], +["2007-10-26",674.03,676.54,668.06,674.60,3353900,674.60], +["2007-10-25",678.68,678.97,663.55,668.51,5795500,668.51], +["2007-10-24",672.71,677.47,659.56,675.82,7404200,675.82], +["2007-10-23",661.25,677.60,660.00,675.77,6793700,675.77], +["2007-10-22",638.67,655.00,636.28,650.75,6664400,650.75], +["2007-10-19",654.56,658.49,643.23,644.71,15789000,644.71], +["2007-10-18",635.41,641.37,628.50,639.62,12289200,639.62], +["2007-10-17",630.45,634.00,621.59,633.48,6030500,633.48], +["2007-10-16",618.49,625.92,611.99,616.00,6025300,616.00], +["2007-10-15",638.47,639.86,615.55,620.11,6943800,620.11], +["2007-10-12",623.98,638.40,618.24,637.39,6823700,637.39], +["2007-10-11",633.64,641.41,609.00,622.00,11799000,622.00], +["2007-10-10",621.36,625.68,616.80,625.39,5385600,625.39], +["2007-10-09",615.11,623.78,608.39,615.18,8767800,615.18], +["2007-10-08",595.00,610.26,593.95,609.62,5028000,609.62], +["2007-10-05",587.11,596.00,587.01,594.05,5068700,594.05], +["2007-10-04",585.09,585.09,577.06,579.03,2986700,579.03], +["2007-10-03",586.25,588.99,580.36,584.02,3879500,584.02], +["2007-10-02",583.38,596.81,580.01,584.39,7067500,584.39], +["2007-10-01",569.97,584.35,569.61,582.55,4711300,582.55], +["2007-09-28",567.00,569.55,564.12,567.27,2639500,567.27], +["2007-09-27",571.73,571.74,565.78,567.50,2056300,567.50], +["2007-09-26",570.40,571.79,563.81,568.16,3346100,568.16], +["2007-09-25",564.00,569.56,562.86,569.00,2730600,569.00], +["2007-09-24",561.00,571.46,560.00,568.02,5297000,568.02], +["2007-09-21",556.34,560.79,552.83,560.10,8011700,560.10], +["2007-09-20",547.00,556.80,546.03,552.83,5525000,552.83], +["2007-09-19",539.27,549.45,538.86,546.85,5526900,546.85], +["2007-09-18",526.52,537.25,524.27,535.27,4215700,535.27], +["2007-09-17",526.53,529.28,524.07,525.30,2197500,525.30], +["2007-09-14",523.20,530.27,522.22,528.75,2764900,528.75], +["2007-09-13",524.06,527.21,523.22,524.78,1891100,524.78], +["2007-09-12",520.53,527.98,519.00,522.65,2986000,522.65], +["2007-09-11",516.99,521.65,515.73,521.33,2703600,521.33], +["2007-09-10",521.28,522.07,510.88,514.48,3225800,514.48], +["2007-09-07",517.86,521.24,516.80,519.35,3663600,519.35], +["2007-09-06",529.36,529.83,518.24,523.52,3625900,523.52], +["2007-09-05",523.40,529.48,522.25,527.80,3312900,527.80], +["2007-09-04",515.02,528.00,514.62,525.15,3693700,525.15], +["2007-08-31",513.10,516.50,511.47,515.25,2977600,515.25], +["2007-08-30",512.36,515.40,510.58,511.40,2651700,511.40], +["2007-08-29",507.84,513.30,507.23,512.88,2549300,512.88], +["2007-08-28",511.53,514.98,505.79,506.40,3273900,506.40], +["2007-08-27",514.43,517.45,511.40,513.26,2325100,513.26], +["2007-08-24",512.61,515.55,508.50,515.00,2472700,515.00], +["2007-08-23",516.00,516.13,507.00,512.19,3076700,512.19], +["2007-08-22",509.96,516.25,509.25,512.75,3252700,512.75], +["2007-08-21",498.94,508.16,497.77,506.61,3610600,506.61], +["2007-08-20",502.46,502.56,496.00,497.92,2697300,497.92], +["2007-08-17",497.44,501.00,491.65,500.04,5479400,500.04], +["2007-08-16",492.02,496.43,480.46,491.52,8645600,491.52], +["2007-08-15",509.00,511.69,496.71,497.55,5409500,497.55], +["2007-08-14",515.72,517.40,508.00,508.60,3633700,508.60], +["2007-08-13",519.54,519.75,513.03,515.50,3179300,515.50], +["2007-08-10",510.18,518.72,505.63,515.75,5875200,515.75], +["2007-08-09",520.80,526.82,514.63,514.73,4846500,514.73], +["2007-08-08",519.34,525.78,517.09,525.78,4068800,525.78], +["2007-08-07",509.75,519.88,509.04,516.02,4264300,516.02], +["2007-08-06",503.00,510.15,502.50,510.00,3651500,510.00], +["2007-08-03",510.05,513.20,503.00,503.00,3176200,503.00], +["2007-08-02",513.72,514.99,509.00,511.01,3154900,511.01], +["2007-08-01",510.50,516.51,508.14,512.94,4421500,512.94], +["2007-07-31",520.23,520.44,510.00,510.00,4270500,510.00], +["2007-07-30",512.92,519.34,510.50,516.11,3963300,516.11], +["2007-07-27",508.53,516.62,505.50,511.89,5509100,511.89], +["2007-07-26",508.74,512.59,498.88,508.00,6883400,508.00], +["2007-07-25",516.98,517.02,505.56,509.76,5545000,509.76], +["2007-07-24",509.30,518.69,507.11,514.00,5572100,514.00], +["2007-07-23",519.01,520.00,512.15,512.51,6356700,512.51], +["2007-07-20",511.90,523.18,509.50,520.12,17772300,520.12], +["2007-07-19",553.46,553.52,542.24,548.59,11127200,548.59], +["2007-07-18",553.89,554.50,543.81,549.50,6080000,549.50], +["2007-07-17",555.04,557.73,552.38,555.00,4328600,555.00], +["2007-07-16",550.30,558.58,549.31,552.99,6599500,552.99], +["2007-07-13",547.91,552.67,547.25,552.16,5237100,552.16], +["2007-07-12",545.86,547.32,540.22,545.33,3441600,545.33], +["2007-07-11",543.61,546.50,540.01,544.47,3309300,544.47], +["2007-07-10",543.79,547.00,541.65,543.34,3856000,543.34], +["2007-07-09",543.00,548.74,540.26,542.56,3729800,542.56], +["2007-07-06",541.25,543.87,538.73,539.40,2747000,539.40], +["2007-07-05",535.56,544.40,532.15,541.63,4942900,541.63], +["2007-07-03",531.06,534.40,527.50,534.34,1871800,534.34], +["2007-07-02",525.49,531.85,524.20,530.38,3487600,530.38], +["2007-06-29",526.02,527.40,519.46,522.70,3880600,522.70], +["2007-06-28",524.88,529.50,523.80,525.01,4168400,525.01], +["2007-06-27",525.00,527.99,519.56,526.29,6123100,526.29], +["2007-06-26",532.73,533.20,526.24,530.26,5689500,530.26], +["2007-06-25",528.98,534.99,523.38,527.42,7925000,527.42], +["2007-06-22",516.42,524.99,516.10,524.98,7203700,524.98], +["2007-06-21",510.98,515.29,506.28,514.11,4409700,514.11], +["2007-06-20",516.96,518.75,509.06,509.97,4338200,509.97], +["2007-06-19",514.01,517.25,511.54,514.31,4355300,514.31], +["2007-06-18",506.18,516.00,504.24,515.20,4835900,515.20], +["2007-06-15",508.19,509.00,501.23,505.89,6174100,505.89], +["2007-06-14",505.38,505.88,501.70,502.84,4621200,502.84], +["2007-06-13",507.09,508.54,498.69,505.24,7034000,505.24], +["2007-06-12",508.71,511.67,503.17,504.77,6419500,504.77], +["2007-06-11",514.02,518.25,510.00,511.34,4647700,511.34], +["2007-06-08",516.20,519.64,509.46,515.49,6358200,515.49], +["2007-06-07",519.75,526.50,512.51,515.06,10630500,515.06], +["2007-06-06",516.75,520.78,515.26,518.25,7886700,518.25], +["2007-06-05",509.75,519.00,506.61,518.84,10447100,518.84], +["2007-06-04",497.91,510.51,497.59,507.07,7101000,507.07], +["2007-06-01",501.00,505.02,497.93,500.40,4799000,500.40], +["2007-05-31",500.56,508.78,497.06,497.91,8924300,497.91], +["2007-05-30",484.50,498.84,483.00,498.60,7245800,498.60], +["2007-05-29",485.00,491.80,484.00,487.11,5218000,487.11], +["2007-05-25",479.70,484.95,477.27,483.52,5348500,483.52], +["2007-05-24",475.15,479.20,471.50,474.33,4173600,474.33], +["2007-05-23",480.82,483.41,473.75,473.97,5060200,473.97], +["2007-05-22",473.00,479.01,473.00,475.86,3839000,475.86], +["2007-05-21",469.53,479.20,466.72,470.60,6159300,470.60], +["2007-05-18",472.03,472.70,469.75,470.32,3695900,470.32], +["2007-05-17",472.46,475.22,470.81,470.96,4660600,470.96], +["2007-05-16",462.00,473.14,459.02,472.61,6554200,472.61], +["2007-05-15",461.96,462.54,457.41,458.00,4119000,458.00], +["2007-05-14",465.48,467.51,460.00,461.78,3872700,461.78], +["2007-05-11",461.83,467.00,461.00,466.74,2944100,466.74], +["2007-05-10",467.04,469.49,461.02,461.47,3686300,461.47], +["2007-05-09",466.15,471.73,463.88,469.25,3889900,469.25], +["2007-05-08",466.13,468.17,464.73,466.81,2905100,466.81], +["2007-05-07",472.14,472.82,466.47,467.27,3020100,467.27], +["2007-05-04",470.12,474.84,465.88,471.12,3950000,471.12], +["2007-05-03",466.22,474.07,465.29,473.23,3594200,473.23], +["2007-05-02",468.65,471.08,465.73,465.78,3062700,465.78], +["2007-05-01",472.19,472.81,464.17,469.00,3658200,469.00], +["2007-04-30",479.15,481.35,471.38,471.38,3641200,471.38], +["2007-04-27",480.07,482.40,478.33,479.01,2925700,479.01], +["2007-04-26",478.10,484.45,477.11,481.18,4124900,481.18], +["2007-04-25",480.00,481.37,476.11,477.99,3966800,477.99], +["2007-04-24",478.61,479.98,475.55,477.53,3694700,477.53], +["2007-04-23",480.10,485.00,478.26,479.08,5674600,479.08], +["2007-04-20",490.52,492.50,482.02,482.48,12161500,482.48], +["2007-04-19",474.50,481.95,469.59,471.65,11009600,471.65], +["2007-04-18",471.26,479.90,469.53,476.01,5670500,476.01], +["2007-04-17",473.80,476.39,471.60,472.80,3210100,472.80], +["2007-04-16",468.46,476.99,468.15,474.27,5077900,474.27], +["2007-04-13",468.45,468.77,463.36,466.29,2794800,466.29], +["2007-04-12",464.00,468.00,462.24,467.39,2707900,467.39], +["2007-04-11",466.06,469.40,462.61,464.53,3812000,464.53], +["2007-04-10",467.09,470.79,465.16,466.50,2979300,466.50], +["2007-04-09",472.98,473.00,465.59,468.21,3062100,468.21], +["2007-04-05",471.30,472.09,469.62,471.51,2715800,471.51], +["2007-04-04",472.14,473.00,469.58,471.02,3778800,471.02], +["2007-04-03",464.05,474.25,464.00,472.60,6501800,472.60], +["2007-04-02",457.76,458.53,452.12,458.53,3448500,458.53], +["2007-03-30",462.10,463.40,456.14,458.16,3380200,458.16], +["2007-03-29",464.55,466.00,455.00,460.92,3988500,460.92], +["2007-03-28",461.87,465.44,460.15,461.88,4591600,461.88], +["2007-03-27",463.55,465.23,460.34,463.62,3741200,463.62], +["2007-03-26",460.55,465.00,455.62,465.00,4710300,465.00], +["2007-03-23",461.45,463.39,457.08,461.83,4111300,461.83], +["2007-03-22",455.61,462.17,452.53,462.04,5680700,462.04], +["2007-03-21",445.30,456.57,445.21,456.55,5798300,456.55], +["2007-03-20",445.79,447.60,443.60,445.28,3421500,445.28], +["2007-03-19",443.25,448.50,440.63,447.23,5197700,447.23], +["2007-03-16",445.65,446.70,439.89,440.85,5659100,440.85], +["2007-03-15",447.86,449.82,443.94,446.19,3944200,446.19], +["2007-03-14",443.23,448.66,439.00,448.00,8016900,448.00], +["2007-03-13",450.11,451.93,442.83,443.03,6377300,443.03], +["2007-03-12",452.57,455.25,451.11,454.75,3465400,454.75], +["2007-03-09",458.00,458.40,450.10,452.96,4977700,452.96], +["2007-03-08",459.22,465.50,454.10,454.72,5362800,454.72], +["2007-03-07",462.69,463.14,454.29,455.64,6534100,455.64], +["2007-03-06",447.47,459.00,447.38,457.55,7533700,457.55], +["2007-03-05",437.02,445.50,437.00,440.95,6355100,440.95], +["2007-03-02",445.11,448.70,438.68,438.68,6583600,438.68], +["2007-03-01",442.67,452.42,440.00,448.23,8685200,448.23], +["2007-02-28",450.41,453.67,443.04,449.45,8032300,449.45], +["2007-02-27",455.00,459.80,447.17,448.77,9312800,448.77], +["2007-02-26",472.83,475.25,463.75,464.93,3969900,464.93], +["2007-02-23",475.75,476.95,467.80,470.62,3882600,470.62], +["2007-02-22",478.69,484.24,474.39,475.85,5743900,475.85], +["2007-02-21",469.84,478.68,467.74,475.86,5640600,475.86], +["2007-02-20",468.47,472.75,464.71,472.10,4067600,472.10], +["2007-02-16",462.80,470.15,462.06,469.94,6177000,469.94], +["2007-02-15",466.00,466.13,460.72,461.47,4042400,461.47], +["2007-02-14",460.00,469.13,459.22,465.93,5698800,465.93], +["2007-02-13",459.15,462.78,457.26,459.10,4062600,459.10], +["2007-02-12",460.68,462.39,455.02,458.29,5754500,458.29], +["2007-02-09",471.65,472.68,461.50,461.89,4858600,461.89], +["2007-02-08",468.05,473.75,465.15,471.03,4076700,471.03], +["2007-02-07",473.82,474.35,468.78,470.01,4119800,470.01], +["2007-02-06",468.10,473.30,467.26,471.48,5321900,471.48], +["2007-02-05",477.50,478.00,466.19,467.16,7206900,467.16], +["2007-02-02",482.61,485.00,477.81,481.50,6286500,481.50], +["2007-02-01",506.00,506.01,481.53,481.75,15658700,481.75], +["2007-01-31",496.49,505.00,495.51,501.50,12206100,501.50], +["2007-01-30",494.00,498.00,491.22,494.32,4180500,494.32], +["2007-01-29",498.00,498.75,490.50,492.47,4775700,492.47], +["2007-01-26",490.93,497.90,487.03,495.84,5496500,495.84], +["2007-01-25",501.00,504.50,485.66,488.09,6368500,488.09], +["2007-01-24",484.45,499.54,483.29,499.07,6059300,499.07], +["2007-01-23",480.79,484.75,477.29,479.05,4665500,479.05], +["2007-01-22",492.50,492.65,478.50,480.84,5404300,480.84], +["2007-01-19",487.98,490.76,486.74,489.75,4978300,489.75], +["2007-01-18",494.52,496.48,487.43,487.83,5932000,487.83], +["2007-01-17",503.39,507.77,494.38,497.28,6699100,497.28], +["2007-01-16",507.55,513.00,503.30,504.28,7568900,504.28], +["2007-01-12",501.99,505.00,500.00,505.00,4473700,505.00], +["2007-01-11",497.20,501.75,496.18,499.72,7208200,499.72], +["2007-01-10",484.43,493.55,482.04,489.46,5968500,489.46], +["2007-01-09",485.45,488.25,481.20,485.50,5381400,485.50], +["2007-01-08",487.69,489.87,482.20,483.58,4754400,483.58], +["2007-01-05",482.50,487.50,478.11,487.19,6872100,487.19], +["2007-01-04",469.00,483.95,468.35,483.26,7887600,483.26], +["2007-01-03",466.00,476.66,461.11,467.59,7706500,467.59], +["2006-12-29",462.10,464.47,459.86,460.48,2559200,460.48], +["2006-12-28",467.12,468.58,462.25,462.56,3116200,462.56], +["2006-12-27",460.00,468.08,459.10,468.03,4231500,468.03], +["2006-12-26",456.52,459.47,454.59,457.53,2074300,457.53], +["2006-12-22",457.50,458.64,452.73,455.58,3988300,455.58], +["2006-12-21",464.18,465.25,452.34,456.20,6953300,456.20], +["2006-12-20",470.00,471.50,462.33,462.90,4367800,462.90], +["2006-12-19",461.72,469.31,458.50,468.63,6587000,468.63], +["2006-12-18",482.51,482.74,460.72,462.80,8016600,462.80], +["2006-12-15",482.64,484.11,479.84,480.30,5190800,480.30], +["2006-12-14",480.25,483.75,477.26,482.12,4748900,482.12], +["2006-12-13",484.69,485.50,477.02,478.99,4662100,478.99], +["2006-12-12",483.85,486.36,480.28,481.78,4181000,481.78], +["2006-12-11",484.92,488.90,483.80,483.93,3263400,483.93], +["2006-12-08",481.94,488.60,480.00,484.11,3974900,484.11], +["2006-12-07",490.23,491.80,482.42,482.64,4664300,482.64], +["2006-12-06",486.96,492.40,484.52,488.71,4450300,488.71], +["2006-12-05",487.40,489.44,484.89,487.00,4103000,487.00], +["2006-12-04",483.00,487.43,479.35,484.85,4899900,484.85], +["2006-12-01",485.98,488.39,478.50,480.80,5631400,480.80], +["2006-11-30",484.19,490.40,481.55,484.81,5577500,484.81], +["2006-11-29",494.24,494.74,482.25,484.65,6315300,484.65], +["2006-11-28",481.13,489.86,477.03,489.50,7797600,489.50], +["2006-11-27",501.37,501.78,484.75,484.75,7324700,484.75], +["2006-11-24",504.50,507.50,504.00,505.00,1732700,505.00], +["2006-11-22",510.97,513.00,505.78,508.01,4500700,508.01], +["2006-11-21",496.54,510.00,495.83,509.65,8427500,509.65], +["2006-11-20",498.40,498.40,492.65,495.05,5124500,495.05], +["2006-11-17",493.25,499.66,493.00,498.79,5511000,498.79], +["2006-11-16",495.00,497.68,492.56,495.90,5092600,495.90], +["2006-11-15",493.43,499.85,491.93,491.93,8370700,491.93], +["2006-11-14",480.70,489.95,480.50,489.30,7223400,489.30], +["2006-11-13",474.90,481.17,474.14,481.03,4341900,481.03], +["2006-11-10",473.78,474.72,470.29,473.55,2796700,473.55], +["2006-11-09",476.50,479.49,471.86,472.63,4879200,472.63], +["2006-11-08",470.35,481.74,468.60,475.00,7965000,475.00], +["2006-11-07",476.95,479.02,471.77,472.57,4897100,472.57], +["2006-11-06",473.77,479.66,472.33,476.95,4991500,476.95], +["2006-11-03",472.23,473.75,465.06,471.80,4907700,471.80], +["2006-11-02",467.50,473.73,466.38,469.91,5236700,469.91], +["2006-11-01",478.76,479.13,465.26,467.50,5426300,467.50], +["2006-10-31",478.06,482.16,473.84,476.39,6285400,476.39], +["2006-10-30",474.82,480.46,470.01,476.57,6563100,476.57], +["2006-10-27",483.90,485.24,472.49,475.20,6604000,475.20], +["2006-10-26",487.68,491.96,484.20,485.10,7031700,485.10], +["2006-10-25",477.49,488.50,475.11,486.60,9187500,486.60], +["2006-10-24",476.28,477.86,471.41,473.31,8660200,473.31], +["2006-10-23",462.28,484.64,460.37,480.78,15104500,480.78], +["2006-10-20",458.99,460.10,453.59,459.67,11647900,459.67], +["2006-10-19",420.23,429.50,419.57,426.06,11503500,426.06], +["2006-10-18",422.99,424.75,417.50,419.31,6017300,419.31], +["2006-10-17",420.30,423.75,416.70,420.64,5211000,420.64], +["2006-10-16",427.70,429.20,421.34,421.75,4319400,421.75], +["2006-10-13",427.76,429.50,425.56,427.30,3622500,427.30], +["2006-10-12",428.56,429.68,424.00,427.44,4844000,427.44], +["2006-10-11",425.02,429.91,423.76,426.50,5635400,426.50], +["2006-10-10",431.56,437.85,422.39,426.65,9788600,426.65], +["2006-10-09",424.80,431.95,423.42,429.00,7583300,429.00], +["2006-10-06",410.22,421.91,409.75,420.50,7336500,420.50], +["2006-10-05",414.70,418.24,410.86,411.81,5789800,411.81], +["2006-10-04",404.97,415.77,403.05,415.70,6661800,415.70], +["2006-10-03",401.29,406.46,398.19,404.04,5464700,404.04], +["2006-10-02",401.90,406.00,400.80,401.44,3651900,401.44], +["2006-09-29",405.13,405.62,401.41,401.90,3310900,401.90], +["2006-09-28",404.08,406.98,400.54,403.58,5107400,403.58], +["2006-09-27",406.30,411.22,402.37,402.92,5876700,402.92], +["2006-09-26",405.50,407.68,401.77,406.87,5289400,406.87], +["2006-09-25",405.58,409.45,402.50,403.98,5737300,403.98], +["2006-09-22",404.98,407.45,401.36,403.78,4649600,403.78], +["2006-09-21",400.30,408.45,399.86,406.85,10692100,406.85], +["2006-09-20",407.10,407.39,394.62,397.00,9147800,397.00], +["2006-09-19",415.46,415.49,392.74,403.81,14292900,403.81], +["2006-09-18",410.00,418.69,409.47,414.69,7106700,414.69], +["2006-09-15",407.48,410.05,406.74,409.88,7838200,409.88], +["2006-09-14",404.30,406.28,401.93,403.98,5366100,403.98], +["2006-09-13",395.15,406.76,395.10,406.57,9768200,406.57], +["2006-09-12",385.00,392.73,384.88,391.90,5442200,391.90], +["2006-09-11",378.26,384.69,377.77,384.09,4529200,384.09], +["2006-09-08",376.72,380.79,376.72,377.85,3083400,377.85], +["2006-09-07",379.39,381.75,377.40,378.49,3842000,378.49], +["2006-09-06",382.10,383.19,379.66,380.14,3724100,380.14], +["2006-09-05",379.87,385.40,377.44,384.36,4074300,384.36], +["2006-09-01",380.99,381.28,377.19,378.60,2672900,378.60], +["2006-08-31",381.49,382.15,378.20,378.53,2959900,378.53], +["2006-08-30",379.21,384.65,378.51,380.75,4044400,380.75], +["2006-08-29",380.78,382.32,377.20,378.95,4460000,378.95], +["2006-08-28",375.61,380.95,375.00,380.95,4164000,380.95], +["2006-08-25",373.08,375.32,372.50,373.26,2466700,373.26], +["2006-08-24",374.44,376.40,372.26,373.73,3482500,373.73], +["2006-08-23",377.64,378.27,372.66,373.43,3642300,373.43], +["2006-08-22",377.73,379.26,374.84,378.29,4164100,378.29], +["2006-08-21",378.10,379.00,375.22,377.30,4023300,377.30], +["2006-08-18",386.31,387.09,380.75,383.36,4952200,383.36], +["2006-08-17",386.39,390.00,383.92,385.80,5080200,385.80], +["2006-08-16",383.48,388.45,382.12,387.72,5853200,387.72], +["2006-08-15",374.11,381.67,372.60,380.97,6698200,380.97], +["2006-08-14",371.50,375.13,368.67,369.43,4968300,369.43], +["2006-08-11",374.40,375.28,368.00,368.50,3766500,368.50], +["2006-08-10",373.88,377.67,372.46,374.20,4261900,374.20], +["2006-08-09",382.80,384.68,376.36,376.94,4311000,376.94], +["2006-08-08",382.82,384.50,379.09,381.00,5743200,381.00], +["2006-08-07",371.50,379.73,371.15,377.95,3946900,377.95], +["2006-08-04",379.56,380.68,371.75,373.85,5095200,373.85], +["2006-08-03",364.98,377.91,363.36,375.39,6327000,375.39], +["2006-08-02",375.60,377.17,365.20,367.23,7097800,367.23], +["2006-08-01",385.11,385.77,375.51,375.51,5463200,375.51], +["2006-07-31",388.00,389.17,383.31,386.60,4595300,386.60], +["2006-07-28",382.00,389.56,381.73,388.12,4083600,388.12], +["2006-07-27",387.37,387.49,377.95,382.40,5641100,382.40], +["2006-07-26",388.20,391.91,383.00,385.50,5531900,385.50], +["2006-07-25",385.02,391.31,383.80,389.36,5761100,389.36], +["2006-07-24",392.82,393.89,381.21,390.90,8086100,390.90], +["2006-07-21",386.14,391.75,377.69,390.11,11754600,390.11], +["2006-07-20",404.28,404.44,385.66,387.12,12538700,387.12], +["2006-07-19",395.01,401.14,394.66,399.00,8518500,399.00], +["2006-07-18",409.75,410.57,397.74,403.05,8536800,403.05], +["2006-07-17",404.63,411.00,403.72,407.89,5811900,407.89], +["2006-07-14",410.33,411.49,398.61,403.50,7552100,403.50], +["2006-07-13",414.00,418.34,406.83,408.83,6924500,408.83], +["2006-07-12",422.09,422.74,416.73,417.25,4906700,417.25], +["2006-07-11",418.51,425.05,413.03,424.56,5971300,424.56], +["2006-07-10",423.44,425.23,416.38,418.20,4436400,418.20], +["2006-07-07",426.05,427.89,415.88,420.45,6041900,420.45], +["2006-07-06",423.38,425.38,421.98,423.19,3687100,423.19], +["2006-07-05",421.52,422.80,415.64,421.46,4985600,421.46], +["2006-07-03",420.04,423.77,419.45,423.20,2156700,423.20], +["2006-06-30",415.60,419.33,412.33,419.33,6258000,419.33], +["2006-06-29",407.99,418.20,405.82,417.81,6658200,417.81], +["2006-06-28",404.01,406.48,401.13,406.11,3710500,406.11], +["2006-06-27",405.71,408.00,401.01,402.32,4107100,402.32], +["2006-06-26",406.75,408.30,403.25,404.22,3551200,404.22], +["2006-06-23",402.76,409.75,400.74,404.86,5314800,404.86], +["2006-06-22",401.58,406.00,388.00,399.95,5911900,399.95], +["2006-06-21",391.06,404.00,389.75,402.13,8744400,402.13], +["2006-06-20",388.03,391.87,386.51,387.17,4039900,387.17], +["2006-06-19",390.85,394.80,386.98,388.14,7633100,388.14], +["2006-06-16",389.10,390.93,388.00,390.70,5304600,390.70], +["2006-06-15",386.62,392.25,383.00,391.00,6785700,391.00], +["2006-06-14",389.83,391.10,378.52,384.39,7772000,384.39], +["2006-06-13",380.90,387.00,378.12,386.52,7659100,386.52], +["2006-06-12",388.34,390.49,381.00,381.54,5019100,381.54], +["2006-06-09",392.19,395.43,385.35,386.57,6157500,386.57], +["2006-06-08",387.75,394.27,378.59,393.30,10359500,393.30], +["2006-06-07",393.24,394.86,386.50,386.51,8911300,386.51], +["2006-06-06",376.58,390.00,376.30,389.99,10259800,389.99], +["2006-06-05",376.18,381.45,374.15,374.44,5558500,374.44], +["2006-06-02",386.84,387.08,377.45,379.44,6386400,379.44], +["2006-06-01",373.54,382.99,371.60,382.62,6278000,382.62], +["2006-05-31",373.80,378.25,366.78,371.82,7981300,371.82], +["2006-05-30",378.28,381.00,371.45,371.94,4316000,371.94], +["2006-05-26",384.55,385.88,380.03,381.35,3667000,381.35], +["2006-05-25",379.08,383.00,372.31,382.99,8194600,382.99], +["2006-05-24",377.35,383.44,371.61,381.25,9553800,381.25], +["2006-05-23",374.21,383.88,373.56,375.58,8983000,375.58], +["2006-05-22",367.85,373.03,365.25,370.95,8604400,370.95], +["2006-05-19",373.28,374.50,360.57,370.02,11398200,370.02], +["2006-05-18",378.78,381.81,370.71,370.99,5835000,370.99], +["2006-05-17",370.61,379.84,370.22,374.50,10643800,374.50], +["2006-05-16",375.99,376.86,369.89,371.30,6491100,371.30], +["2006-05-15",375.93,380.15,368.25,376.20,8590100,376.20], +["2006-05-12",383.54,384.87,373.55,374.13,10087600,374.13], +["2006-05-11",403.42,404.71,384.98,387.00,8892800,387.00], +["2006-05-10",408.31,411.71,401.86,402.98,6187200,402.98], +["2006-05-09",395.70,409.00,393.75,408.80,9140600,408.80], +["2006-05-08",395.11,397.12,390.05,394.78,5118600,394.78], +["2006-05-05",397.60,400.68,391.78,394.30,6065000,394.30], +["2006-05-04",395.03,398.87,392.21,394.75,4652000,394.75], +["2006-05-03",396.35,401.50,390.88,394.17,8072200,394.17], +["2006-05-02",401.08,402.49,388.40,394.80,13104300,394.80], +["2006-05-01",418.47,419.44,398.55,398.90,10361200,398.90], +["2006-04-28",418.63,425.73,416.30,417.94,7421300,417.94], +["2006-04-27",422.91,426.91,419.39,420.03,8337900,420.03], +["2006-04-26",427.74,430.04,423.53,425.97,7277800,425.97], +["2006-04-25",439.63,441.04,426.00,427.16,9569000,427.16], +["2006-04-24",439.40,444.70,436.52,440.50,8836400,440.50], +["2006-04-21",448.90,450.72,436.17,437.10,22551300,437.10], +["2006-04-20",411.01,416.00,408.20,415.00,12271500,415.00], +["2006-04-19",412.57,413.64,406.73,410.50,6781700,410.50], +["2006-04-18",407.93,409.83,401.50,404.24,8137600,404.24], +["2006-04-17",403.45,412.50,400.84,406.82,8259500,406.82], +["2006-04-13",408.63,409.76,400.50,402.16,6552900,402.16], +["2006-04-12",409.00,411.33,405.19,408.95,6017000,408.95], +["2006-04-11",416.42,419.10,406.22,409.66,11107200,409.66], +["2006-04-10",407.08,417.17,405.25,416.38,9320100,416.38], +["2006-04-07",412.41,412.85,404.02,406.16,7025900,406.16], +["2006-04-06",406.49,413.89,405.43,411.18,8598500,411.18], +["2006-04-05",408.20,414.57,402.82,407.99,13410500,407.99], +["2006-04-04",389.90,404.90,388.14,404.34,15715700,404.34], +["2006-04-03",389.53,392.47,387.93,389.70,8122700,389.70], +["2006-03-31",388.74,391.87,384.03,390.00,36521400,390.00], +["2006-03-30",389.19,393.50,383.61,388.44,14711700,388.44], +["2006-03-29",379.94,399.00,379.51,394.98,19027500,394.98], +["2006-03-28",371.71,377.86,371.17,377.20,8945800,377.20], +["2006-03-27",367.09,371.71,365.00,369.69,7023700,369.69], +["2006-03-24",368.62,370.09,362.51,365.80,15180600,365.80], +["2006-03-23",342.35,345.75,340.20,341.89,7434700,341.89], +["2006-03-22",339.75,344.10,337.50,340.22,7596000,340.22], +["2006-03-21",350.01,351.66,339.08,339.92,9831100,339.92], +["2006-03-20",342.34,350.09,341.54,348.19,10407600,348.19], +["2006-03-17",338.80,341.78,334.93,339.79,8551700,339.79], +["2006-03-16",348.61,348.75,337.90,338.77,10016700,338.77], +["2006-03-15",350.77,352.30,340.53,344.50,12768800,344.50], +["2006-03-14",337.14,352.37,332.62,351.16,18450700,351.16], +["2006-03-13",340.93,346.10,335.45,337.06,13642400,337.06], +["2006-03-10",343.50,344.50,331.55,337.50,19325600,337.50], +["2006-03-09",355.39,358.53,341.50,343.00,13910400,343.00], +["2006-03-08",353.93,360.03,350.54,353.88,11745600,353.88], +["2006-03-07",365.02,368.45,358.15,364.45,10378800,364.45], +["2006-03-06",380.91,383.40,367.14,368.10,8939700,368.10], +["2006-03-03",384.30,387.24,375.76,378.18,11962000,378.18], +["2006-03-02",364.28,381.10,362.20,376.45,18330300,376.45], +["2006-03-01",368.56,369.45,361.30,364.80,12061200,364.80], +["2006-02-28",393.20,397.54,338.51,362.62,39437600,362.62], +["2006-02-27",381.27,391.70,380.28,390.38,10212200,390.38], +["2006-02-24",377.30,380.07,373.49,377.40,6484300,377.40], +["2006-02-23",365.61,381.24,365.39,378.07,12551600,378.07], +["2006-02-22",367.15,368.95,363.86,365.49,6476200,365.49], +["2006-02-21",366.44,373.54,365.11,366.59,8686000,366.59], +["2006-02-17",369.86,372.14,363.62,368.75,14320200,368.75], +["2006-02-16",345.67,367.00,344.49,366.46,21315500,366.46], +["2006-02-15",341.27,346.00,337.83,342.38,12947000,342.38], +["2006-02-14",345.33,351.69,342.40,343.32,14654000,343.32], +["2006-02-13",346.64,350.60,341.89,345.70,19717800,345.70], +["2006-02-10",361.95,364.50,353.14,362.61,15223500,362.61], +["2006-02-09",371.20,374.40,356.11,358.77,11912400,358.77], +["2006-02-08",368.48,370.69,354.67,369.08,20804100,369.08], +["2006-02-07",382.99,383.70,363.35,367.92,16630200,367.92], +["2006-02-06",385.31,389.90,379.56,385.10,8940400,385.10], +["2006-02-03",393.62,393.90,372.57,381.55,18281800,381.55], +["2006-02-02",403.82,406.50,395.98,396.04,11807700,396.04], +["2006-02-01",389.03,402.00,387.52,401.78,27122500,401.78], +["2006-01-31",430.57,439.60,423.97,432.66,22066000,432.66], +["2006-01-30",429.23,433.28,425.00,426.82,8588900,426.82], +["2006-01-27",435.00,438.22,428.98,433.49,8452200,433.49], +["2006-01-26",439.54,439.99,423.56,434.27,12926100,434.27], +["2006-01-25",451.26,454.23,429.22,433.00,18739800,433.00], +["2006-01-24",436.03,444.95,434.48,443.03,15464600,443.03], +["2006-01-23",407.38,428.39,405.73,427.50,22741400,427.50], +["2006-01-20",438.70,440.03,394.74,399.46,41116700,399.46], +["2006-01-19",451.17,453.49,433.00,436.45,14537300,436.45], +["2006-01-18",447.30,457.36,443.25,444.91,20485700,444.91], +["2006-01-17",463.06,469.90,462.53,467.11,8270300,467.11], +["2006-01-13",464.31,466.89,461.61,466.25,7656600,466.25], +["2006-01-12",473.72,474.99,461.50,463.63,10125300,463.63], +["2006-01-11",471.27,475.11,469.18,471.63,9007400,471.63], +["2006-01-10",464.42,470.25,462.04,469.76,9097100,469.76], +["2006-01-09",466.41,473.40,460.94,466.90,12791900,466.90], +["2006-01-06",456.87,470.50,453.24,465.66,17756900,465.66], +["2006-01-05",446.00,451.55,441.50,451.24,10808300,451.24], +["2006-01-04",443.90,448.96,439.75,445.24,15286400,445.24], +["2006-01-03",422.52,435.67,418.22,435.23,13121200,435.23], +["2005-12-30",417.27,418.21,413.74,414.86,7587100,414.86], +["2005-12-29",427.98,428.73,419.17,420.15,6945800,420.15], +["2005-12-28",424.34,427.78,421.26,426.69,7117900,426.69], +["2005-12-27",431.86,431.86,422.76,424.64,6702800,424.64], +["2005-12-23",432.15,432.50,428.78,430.93,4595100,430.93], +["2005-12-22",431.77,432.86,425.93,432.04,7546600,432.04], +["2005-12-21",433.55,436.86,420.71,426.33,11221900,426.33], +["2005-12-20",427.86,432.20,424.67,429.74,10084700,429.74], +["2005-12-19",432.20,446.21,420.11,424.60,21936800,424.60], +["2005-12-16",425.34,432.50,422.75,430.15,16330500,430.15], +["2005-12-15",419.11,423.14,416.50,422.55,6045800,422.55], +["2005-12-14",417.04,419.73,415.49,418.96,6630400,418.96], +["2005-12-13",412.50,418.00,411.64,417.49,8157000,417.49], +["2005-12-12",414.63,415.21,409.95,412.61,6950100,412.61], +["2005-12-09",415.00,415.78,408.56,409.20,7643400,409.20], +["2005-12-08",405.30,410.65,402.64,410.65,8910100,410.65], +["2005-12-07",406.16,406.70,399.01,404.22,11665900,404.22], +["2005-12-06",408.70,416.41,401.70,404.54,15114700,404.54], +["2005-12-05",417.00,417.50,404.28,405.85,10289400,405.85], +["2005-12-02",416.94,419.53,413.86,417.70,7543500,417.70], +["2005-12-01",409.20,415.44,408.29,414.09,9744900,414.09], +["2005-11-30",404.26,408.45,395.56,404.91,15596600,404.91], +["2005-11-29",424.46,426.40,402.14,403.54,21495800,403.54], +["2005-11-28",429.82,431.24,422.44,423.48,11008400,423.48], +["2005-11-25",425.78,428.75,425.30,428.62,4840100,428.62], +["2005-11-23",417.04,424.72,415.78,422.86,10085000,422.86], +["2005-11-22",408.65,417.31,406.23,416.47,9596000,416.47], +["2005-11-21",399.17,409.98,393.49,409.36,10335100,409.36], +["2005-11-18",403.49,404.50,399.85,400.21,7025700,400.21], +["2005-11-17",401.80,403.81,399.53,403.45,9212200,403.45], +["2005-11-16",396.20,398.85,394.11,398.15,8695200,398.15], +["2005-11-15",394.38,397.00,390.95,392.80,8624900,392.80], +["2005-11-14",392.12,398.22,391.53,396.97,7807900,396.97], +["2005-11-11",395.12,396.90,388.85,390.40,7063900,390.40], +["2005-11-10",378.36,391.35,377.43,391.10,9128700,391.10], +["2005-11-09",386.67,388.29,378.03,379.15,10466900,379.15], +["2005-11-08",394.25,395.59,388.58,389.90,7897500,389.90], +["2005-11-07",395.10,397.47,392.15,395.03,9591500,395.03], +["2005-11-04",389.98,391.79,385.45,390.43,8824900,390.43], +["2005-11-03",382.41,386.58,381.38,385.95,7448400,385.95], +["2005-11-02",381.70,385.00,377.17,379.68,10565400,379.68], +["2005-11-01",371.86,383.90,369.01,379.38,16356100,379.38], +["2005-10-31",360.24,374.75,359.51,372.14,14342900,372.14], +["2005-10-28",355.27,358.95,355.02,358.17,5903500,358.17], +["2005-10-27",356.60,357.09,351.68,353.06,5134400,353.06], +["2005-10-26",346.28,356.00,346.19,355.44,8907500,355.44], +["2005-10-25",345.78,347.40,342.86,346.91,6878300,346.91], +["2005-10-24",343.37,349.30,342.19,348.65,9431700,348.65], +["2005-10-21",345.80,346.43,333.00,339.90,22892400,339.90], +["2005-10-20",309.99,311.13,301.21,303.20,13911700,303.20], +["2005-10-19",304.00,309.87,303.96,308.70,7010700,308.70], +["2005-10-18",304.96,307.96,302.74,303.28,7077800,303.28], +["2005-10-17",297.50,305.20,294.56,305.00,7566700,305.00], +["2005-10-14",299.90,300.23,292.54,296.14,8519100,296.14], +["2005-10-13",302.00,302.00,290.68,297.44,10567700,297.44], +["2005-10-12",305.20,307.19,299.00,300.97,9306200,300.97], +["2005-10-11",310.61,312.65,304.86,306.10,8542600,306.10], +["2005-10-10",313.31,314.82,309.15,310.65,5572200,310.65], +["2005-10-07",314.79,316.67,310.54,312.99,6770300,312.99], +["2005-10-06",314.14,314.48,310.09,312.75,7993800,312.75], +["2005-10-05",312.69,314.90,308.00,310.71,8328400,310.71], +["2005-10-04",319.95,321.28,310.74,311.00,9144300,311.00], +["2005-10-03",313.63,320.11,312.79,318.68,9160300,318.68], +["2005-09-30",314.22,317.50,312.29,316.46,9151300,316.46], +["2005-09-29",306.68,310.72,306.08,309.62,5613800,309.62], +["2005-09-28",314.22,315.10,305.60,306.00,7997400,306.00], +["2005-09-27",314.95,318.41,313.38,313.94,6873100,313.94], +["2005-09-26",319.50,320.95,312.56,314.28,9894400,314.28], +["2005-09-23",313.00,317.21,312.59,315.36,8483800,315.36], +["2005-09-22",311.50,319.22,310.17,311.37,13006400,311.37], +["2005-09-21",308.41,313.76,305.96,311.90,10119700,311.90], +["2005-09-20",306.15,311.30,305.23,307.91,9351000,307.91], +["2005-09-19",301.00,306.00,300.71,303.79,5761900,303.79], +["2005-09-16",304.02,304.50,299.87,300.20,7579800,300.20], +["2005-09-15",299.52,306.75,297.91,302.62,15466200,302.62], +["2005-09-14",308.73,313.28,300.30,303.00,11275800,303.00], +["2005-09-13",309.00,315.53,306.17,311.68,10299900,311.68], +["2005-09-12",301.75,311.42,301.00,309.74,10386500,309.74], +["2005-09-09",297.28,299.10,296.56,299.09,4390500,299.09], +["2005-09-08",294.83,299.28,293.36,295.39,6613300,295.39], +["2005-09-07",285.89,295.50,285.28,294.87,7499500,294.87], +["2005-09-06",289.00,289.39,286.80,287.11,4212300,287.11], +["2005-09-02",286.51,289.99,286.44,288.45,3434500,288.45], +["2005-09-01",285.91,287.50,285.00,286.25,2742100,286.25], +["2005-08-31",288.23,288.50,284.36,286.00,5034000,286.00], +["2005-08-30",287.39,289.51,285.88,287.27,4792000,287.27], +["2005-08-29",282.24,289.12,282.24,288.45,5903000,288.45], +["2005-08-26",283.48,285.02,282.66,283.58,3755300,283.58], +["2005-08-25",282.55,284.00,279.97,282.59,4376600,282.59], +["2005-08-24",277.57,284.75,276.45,282.57,8593100,282.57], +["2005-08-23",276.16,279.74,274.12,279.58,5821700,279.58], +["2005-08-22",281.24,281.47,273.35,274.01,6813000,274.01], +["2005-08-19",280.99,281.45,279.62,280.00,5542900,280.00], +["2005-08-18",275.91,280.50,275.00,279.99,11872800,279.99], +["2005-08-17",285.51,286.57,284.00,285.10,3883300,285.10], +["2005-08-16",284.88,287.79,283.34,285.65,7109200,285.65], +["2005-08-15",289.80,292.77,283.77,284.00,8174700,284.00], +["2005-08-12",283.36,290.20,281.64,289.72,6585900,289.72], +["2005-08-11",285.89,286.58,280.62,284.05,7514900,284.05], +["2005-08-10",291.30,292.33,284.88,285.68,6879000,285.68], +["2005-08-09",291.96,292.68,288.51,291.57,5779300,291.57], +["2005-08-08",293.60,295.65,290.49,291.25,4481800,291.25], +["2005-08-05",297.50,298.51,291.31,292.35,5939700,292.35], +["2005-08-04",295.55,299.00,295.25,297.73,5236500,297.73], +["2005-08-03",298.00,299.72,295.60,297.30,5930600,297.30], +["2005-08-02",291.60,299.52,291.12,299.19,7290200,299.19], +["2005-08-01",288.12,292.50,288.10,291.61,5662400,291.61], +["2005-07-29",292.14,292.84,286.99,287.76,8363300,287.76], +["2005-07-28",297.41,297.41,293.28,293.50,5925600,293.50], +["2005-07-27",297.74,298.23,292.40,296.93,7217900,296.93], +["2005-07-26",295.01,298.00,292.09,296.09,9816900,296.09], +["2005-07-25",302.39,303.29,294.96,295.85,9658800,295.85], +["2005-07-22",306.37,309.25,296.33,302.40,23386800,302.40], +["2005-07-21",314.05,317.80,311.21,313.94,19789400,313.94], +["2005-07-20",305.57,312.61,301.80,312.00,14310400,312.00], +["2005-07-19",302.10,310.35,301.80,309.90,12621400,309.90], +["2005-07-18",300.00,301.90,297.75,299.54,6207800,299.54], +["2005-07-15",301.24,303.40,299.78,301.19,8438400,301.19], +["2005-07-14",305.34,306.75,300.07,300.89,10667700,300.89], +["2005-07-13",292.51,299.24,292.10,298.86,11437900,298.86], +["2005-07-12",293.39,294.40,290.93,291.78,5864900,291.78], +["2005-07-11",296.40,296.60,291.02,293.35,8390300,293.35], +["2005-07-08",296.25,297.50,294.05,296.23,7457600,296.23], +["2005-07-07",289.39,295.80,288.51,295.54,10672100,295.54], +["2005-07-06",297.30,297.60,291.38,291.52,8000300,291.52], +["2005-07-05",292.10,295.98,290.23,295.71,7494000,295.71], +["2005-07-01",295.04,296.24,289.22,291.25,9227600,291.25], +["2005-06-30",294.34,298.93,291.04,294.15,15094400,294.15], +["2005-06-29",302.50,304.38,292.15,292.72,18298700,292.72], +["2005-06-28",306.28,309.25,302.00,302.00,19036500,302.00], +["2005-06-27",298.90,304.47,293.86,304.10,17802900,304.10], +["2005-06-24",290.90,298.00,289.58,297.25,17771200,297.25], +["2005-06-23",288.00,294.81,286.50,289.71,14056400,289.71], +["2005-06-22",289.67,292.32,288.67,289.30,10474000,289.30], +["2005-06-21",288.07,290.30,284.97,287.84,15132300,287.84], +["2005-06-20",276.09,287.67,271.73,286.70,21024700,286.70], +["2005-06-17",279.00,280.30,275.90,280.30,10434400,280.30], +["2005-06-16",274.26,278.30,273.07,277.44,12462400,277.44], +["2005-06-15",275.00,277.30,267.43,274.80,20883100,274.80], +["2005-06-14",278.59,281.24,277.75,278.35,10091900,278.35], +["2005-06-13",279.82,284.19,276.52,282.75,12803200,282.75], +["2005-06-10",286.99,287.28,280.02,282.50,12696600,282.50], +["2005-06-09",284.72,288.50,280.56,286.31,16441100,286.31], +["2005-06-08",292.85,293.19,278.00,279.56,25700900,279.56], +["2005-06-07",297.10,299.59,290.30,293.12,24323000,293.12], +["2005-06-06",282.39,293.75,281.83,290.94,22525900,290.94], +["2005-06-03",286.79,289.30,277.41,280.26,18782300,280.26], +["2005-06-02",288.73,289.78,284.60,287.90,17974100,287.90], +["2005-06-01",283.20,292.89,282.02,288.00,35191700,288.00], +["2005-05-31",269.43,278.40,269.37,277.27,22236800,277.27], +["2005-05-27",260.46,266.05,259.25,266.00,12184100,266.00], +["2005-05-26",260.96,263.76,258.30,259.20,13546600,259.20], +["2005-05-25",252.73,260.98,250.63,260.81,18057900,260.81], +["2005-05-24",256.96,265.44,253.50,256.00,29043100,256.00], +["2005-05-23",243.16,258.10,242.71,255.45,21388300,255.45], +["2005-05-20",241.21,241.67,239.65,241.61,8163500,241.61], +["2005-05-19",240.34,241.17,238.27,239.18,9716500,239.18], +["2005-05-18",233.61,239.97,233.52,239.16,12312000,239.16], +["2005-05-17",230.56,233.45,230.20,233.13,7808900,233.13], +["2005-05-16",229.68,231.62,228.57,231.05,5681400,231.05], +["2005-05-13",229.18,231.09,227.32,229.24,7415500,229.24], +["2005-05-12",230.81,232.23,228.20,228.72,8948200,228.72], +["2005-05-11",228.97,231.98,227.93,231.29,11478800,231.29], +["2005-05-10",225.47,227.80,224.72,227.80,6345800,227.80], +["2005-05-09",228.00,228.50,225.43,226.02,5536800,226.02], +["2005-05-06",228.40,229.25,226.47,228.02,6763900,228.02], +["2005-05-05",228.62,228.62,225.88,226.98,7509600,226.98], +["2005-05-04",227.23,229.88,227.00,228.50,12083500,228.50], +["2005-05-03",221.85,228.15,221.32,226.19,17780200,226.19], +["2005-05-02",222.05,223.70,220.21,222.29,9767400,222.29], +["2005-04-29",221.91,222.25,217.82,220.00,9170200,220.00], +["2005-04-28",219.50,222.08,217.71,219.45,8682800,219.45], +["2005-04-27",217.99,220.85,216.74,219.78,10264800,219.78], +["2005-04-26",220.22,222.00,218.29,218.75,17272000,218.75], +["2005-04-25",217.82,224.74,217.52,223.53,19840000,223.53], +["2005-04-22",222.90,224.00,214.26,215.81,33205100,215.81], +["2005-04-21",200.42,205.00,199.32,204.22,17751900,204.22], +["2005-04-20",198.58,200.50,195.91,198.10,15451500,198.10], +["2005-04-19",189.33,192.00,188.03,191.40,8430000,191.40], +["2005-04-18",184.58,187.88,183.49,186.97,6550300,186.97], +["2005-04-15",190.10,190.34,184.66,185.00,11577400,185.00], +["2005-04-14",193.27,194.36,190.10,191.45,6152700,191.45], +["2005-04-13",193.47,194.32,189.73,192.93,6555800,192.93], +["2005-04-12",193.00,194.42,189.41,193.96,7319600,193.96], +["2005-04-11",193.09,194.80,192.32,193.23,5410500,193.23], +["2005-04-08",193.69,195.10,191.45,192.05,5116600,192.05], +["2005-04-07",188.78,194.62,188.64,193.76,9692200,193.76], +["2005-04-06",189.24,189.65,187.58,189.22,5252600,189.22], +["2005-04-05",187.73,190.26,187.57,188.57,8736700,188.57], +["2005-04-04",179.95,185.32,179.84,185.29,8076400,185.29], +["2005-04-01",181.76,182.95,179.99,180.04,6182000,180.04], +["2005-03-31",177.95,181.39,177.64,180.51,6768600,180.51], +["2005-03-30",180.64,181.45,179.60,180.45,6236100,180.45], +["2005-03-29",181.05,183.28,178.07,179.57,6473000,179.57], +["2005-03-28",181.68,184.80,180.95,181.42,8738000,181.42], +["2005-03-24",180.70,180.86,179.20,179.25,3705200,179.25], +["2005-03-23",177.97,180.24,177.97,178.98,4845000,178.98], +["2005-03-22",181.18,181.94,177.85,178.60,5631700,178.60], +["2005-03-21",179.27,182.17,177.25,180.88,7483700,180.88], +["2005-03-18",178.81,180.40,178.31,180.04,7090000,180.04], +["2005-03-17",177.13,179.64,175.80,179.29,8260600,179.29], +["2005-03-16",176.70,178.61,175.01,175.60,7106300,175.60], +["2005-03-15",175.30,180.00,174.21,178.61,10422100,178.61], +["2005-03-14",178.33,178.40,172.57,174.99,11146600,174.99], +["2005-03-11",180.44,180.95,177.15,177.80,8028300,177.80], +["2005-03-10",181.01,181.20,177.40,179.98,10960500,179.98], +["2005-03-09",184.21,184.65,180.16,181.35,11360400,181.35], +["2005-03-08",189.10,189.85,184.97,185.20,8046100,185.20], +["2005-03-07",187.78,189.60,187.03,188.81,8667400,188.81], +["2005-03-04",186.70,187.25,185.07,185.90,6774100,185.90], +["2005-03-03",186.13,187.75,184.31,187.01,7608600,187.01], +["2005-03-02",185.95,187.67,184.36,185.18,7285500,185.18], +["2005-03-01",189.29,189.75,182.00,186.06,9311200,186.06], +["2005-02-28",186.00,189.87,185.85,187.99,7818400,187.99], +["2005-02-25",189.15,189.92,185.51,185.87,9973500,185.87], +["2005-02-24",183.37,189.85,182.23,188.89,25814300,188.89], +["2005-02-23",193.30,194.48,188.66,193.95,15586000,193.95], +["2005-02-22",196.50,198.90,190.39,191.37,13483700,191.37], +["2005-02-18",198.51,198.84,196.66,197.95,8485900,197.95], +["2005-02-17",197.83,199.75,196.81,197.90,10414400,197.90], +["2005-02-16",194.70,199.33,194.30,198.41,16532300,198.41], +["2005-02-15",193.60,199.84,193.08,195.23,25782800,195.23], +["2005-02-14",182.85,193.08,181.00,192.99,38562200,192.99], +["2005-02-11",186.66,192.32,186.07,187.40,13116000,187.40], +["2005-02-10",191.97,192.21,185.25,187.98,18982700,187.98], +["2005-02-09",200.76,201.60,189.46,191.58,17171500,191.58], +["2005-02-08",196.96,200.02,194.53,198.64,11480000,198.64], +["2005-02-07",205.26,206.40,195.51,196.03,12960400,196.03], +["2005-02-04",206.47,207.75,202.60,204.36,14819300,204.36], +["2005-02-03",205.99,213.37,205.81,210.86,12988100,210.86], +["2005-02-02",215.55,216.80,203.66,205.96,32799300,205.96], +["2005-02-01",194.38,196.66,190.63,191.90,18839000,191.90], +["2005-01-31",193.69,196.36,191.72,195.62,9596700,195.62], +["2005-01-28",190.02,194.70,186.34,190.34,12208200,190.34], +["2005-01-27",188.76,188.86,185.20,188.08,6627400,188.08], +["2005-01-26",179.27,189.41,179.15,189.24,12307900,189.24], +["2005-01-25",181.94,182.24,176.29,177.12,10659200,177.12], +["2005-01-24",188.69,189.33,180.32,180.72,14022700,180.72], +["2005-01-21",194.54,195.36,188.12,188.28,9258400,188.28], +["2005-01-20",192.50,196.25,192.00,193.92,9001600,193.92], +["2005-01-19",204.65,205.30,196.71,197.30,11257700,197.30], +["2005-01-18",200.97,205.02,198.66,203.90,13172600,203.90], +["2005-01-14",196.00,200.01,194.13,199.97,9640300,199.97], +["2005-01-13",195.38,197.39,194.05,195.33,6849400,195.33], +["2005-01-12",194.33,195.93,190.50,195.38,8177800,195.38], +["2005-01-11",195.62,197.71,193.18,193.54,6958700,193.54], +["2005-01-10",194.50,198.10,191.83,195.06,7539600,195.06], +["2005-01-07",190.64,194.25,188.78,193.85,9662900,193.85], +["2005-01-06",195.08,195.90,187.72,188.55,10387100,188.55], +["2005-01-05",193.45,196.90,192.23,193.51,8236600,193.51], +["2005-01-04",201.40,202.93,193.48,194.50,13755900,194.50], +["2005-01-03",197.40,203.64,195.46,202.71,15844200,202.71], +["2004-12-31",199.23,199.88,192.56,192.79,7668500,192.79], +["2004-12-30",192.97,198.23,191.85,197.60,5904300,197.60], +["2004-12-29",191.78,193.52,191.78,192.90,2678100,192.90], +["2004-12-28",192.11,193.55,191.01,192.76,4145800,192.76], +["2004-12-27",189.15,193.30,189.10,191.91,6104100,191.91], +["2004-12-23",187.45,188.60,186.00,187.90,3614600,187.90], +["2004-12-22",183.90,186.85,183.01,186.30,3907000,186.30], +["2004-12-21",186.31,187.88,183.40,183.75,5516300,183.75], +["2004-12-20",182.00,188.46,181.87,185.02,9834500,185.02], +["2004-12-17",176.76,180.50,176.55,180.08,7386200,180.08], +["2004-12-16",176.95,180.49,175.95,176.47,8572800,176.47], +["2004-12-15",177.99,180.69,176.66,179.78,11471000,179.78], +["2004-12-14",171.00,178.82,169.60,178.69,11088400,178.69], +["2004-12-13",172.17,173.18,169.45,170.45,4818600,170.45], +["2004-12-10",173.43,174.88,171.29,171.65,4317200,171.65], +["2004-12-09",170.25,173.50,168.47,173.43,7654000,173.43], +["2004-12-08",170.35,173.68,168.73,169.98,7541800,169.98], +["2004-12-07",176.00,176.20,170.55,171.43,6870900,171.43], +["2004-12-06",179.13,180.70,176.02,176.29,6254000,176.29], +["2004-12-03",179.95,181.06,177.60,180.40,5869200,180.40], +["2004-12-02",179.90,181.51,178.55,179.40,6260900,179.40], +["2004-12-01",181.95,182.50,179.55,179.96,7864100,179.96], +["2004-11-30",180.71,183.00,180.25,181.98,7700000,181.98], +["2004-11-29",180.36,182.95,177.51,181.05,10666600,181.05], +["2004-11-26",175.80,180.03,175.32,179.39,6480100,179.39], +["2004-11-24",174.82,177.21,172.51,174.76,15281000,174.76], +["2004-11-23",167.97,170.83,166.50,167.52,12413300,167.52], +["2004-11-22",164.47,169.50,161.31,165.10,12368200,165.10], +["2004-11-19",169.10,169.98,166.52,169.40,8769300,169.40], +["2004-11-18",170.29,174.42,165.73,167.54,16629600,167.54], +["2004-11-17",169.02,177.50,169.00,172.50,18132900,172.50], +["2004-11-16",177.50,179.47,170.83,172.54,20917400,172.54], +["2004-11-15",180.45,188.32,178.75,184.87,11901500,184.87], +["2004-11-12",185.23,189.80,177.40,182.00,16746100,182.00], +["2004-11-11",169.13,183.75,167.57,183.02,14985500,183.02], +["2004-11-10",170.67,172.52,166.33,167.86,10644000,167.86], +["2004-11-09",174.10,175.20,165.27,168.70,11064200,168.70], +["2004-11-08",170.93,175.44,169.40,172.55,11191800,172.55], +["2004-11-05",181.98,182.30,168.55,169.35,19833100,169.35], +["2004-11-04",188.44,190.40,183.35,184.70,14409600,184.70], +["2004-11-03",198.18,201.60,190.75,191.67,13888700,191.67], +["2004-11-02",198.78,199.25,193.34,194.87,11346300,194.87], +["2004-11-01",193.55,197.67,191.27,196.03,12224900,196.03], +["2004-10-29",198.89,199.95,190.60,190.64,21162500,190.64], +["2004-10-28",186.68,194.39,185.60,193.30,14846800,193.30], +["2004-10-27",182.72,189.52,181.77,185.97,13356500,185.97], +["2004-10-26",186.34,192.64,180.00,181.80,22307100,181.80], +["2004-10-25",176.40,194.43,172.55,187.40,32764200,187.40], +["2004-10-22",170.54,180.17,164.08,172.43,36891900,172.43], +["2004-10-21",144.40,150.13,141.62,149.38,14589500,149.38], +["2004-10-20",148.03,148.99,139.60,140.49,11372700,140.49], +["2004-10-19",150.50,152.40,147.35,147.94,9064000,147.94], +["2004-10-18",143.20,149.20,141.21,149.16,7025200,149.16], +["2004-10-15",144.93,145.50,141.95,144.11,6604000,144.11], +["2004-10-14",141.01,142.38,138.56,142.00,5226300,142.00], +["2004-10-13",143.32,143.55,140.08,140.90,9893000,140.90], +["2004-10-12",134.44,137.61,133.40,137.40,5838600,137.40], +["2004-10-11",137.00,138.86,133.85,135.26,5241300,135.26], +["2004-10-08",138.72,139.68,137.02,137.73,5540300,137.73], +["2004-10-07",136.92,139.88,136.55,138.85,7064600,138.85], +["2004-10-06",137.55,138.45,136.00,137.08,6697400,137.08], +["2004-10-05",134.66,138.53,132.24,138.37,7494100,138.37], +["2004-10-04",135.25,136.87,134.03,135.06,6517900,135.06], +["2004-10-01",130.80,134.24,128.90,132.58,7570000,132.58], +["2004-09-30",129.90,132.30,129.00,129.60,6885900,129.60], +["2004-09-29",126.70,135.02,126.23,131.08,15273500,131.08], +["2004-09-28",121.30,127.40,120.21,126.86,8473000,126.86], +["2004-09-27",119.56,120.88,117.80,118.26,3536600,118.26], +["2004-09-24",120.94,124.10,119.76,119.83,4566300,119.83], +["2004-09-23",118.84,122.63,117.02,120.82,4272100,120.82], +["2004-09-22",117.40,119.67,116.81,118.38,3794400,118.38], +["2004-09-21",119.81,120.42,117.51,117.84,3618000,117.84], +["2004-09-20",116.95,121.60,116.77,119.36,5319700,119.36], +["2004-09-17",114.42,117.49,113.55,117.49,4741000,117.49], +["2004-09-16",112.34,115.80,111.65,113.97,4637800,113.97], +["2004-09-15",110.56,114.23,110.20,112.00,5361900,112.00], +["2004-09-14",107.45,112.00,106.79,111.49,5419900,111.49], +["2004-09-13",106.63,108.41,106.46,107.50,3926000,107.50], +["2004-09-10",101.60,106.56,101.30,105.33,4353800,105.33], +["2004-09-09",102.53,102.71,101.00,102.31,2032900,102.31], +["2004-09-08",100.74,103.03,100.50,102.30,2495300,102.30], +["2004-09-07",101.01,102.00,99.61,101.58,2926700,101.58], +["2004-09-03",100.95,101.74,99.32,100.01,2578800,100.01], +["2004-09-02",99.19,102.37,98.94,101.51,7566900,101.51], +["2004-09-01",102.70,102.97,99.67,100.25,4573700,100.25], +["2004-08-31",102.30,103.71,102.16,102.37,2461400,102.37], +["2004-08-30",105.28,105.49,102.01,102.01,2601000,102.01], +["2004-08-27",108.10,108.62,105.69,106.15,3109000,106.15], +["2004-08-26",104.95,107.95,104.66,107.91,3551000,107.91], +["2004-08-25",104.96,108.00,103.88,106.00,4598900,106.00], +["2004-08-24",111.24,111.60,103.57,104.87,7631300,104.87], +["2004-08-23",110.75,113.48,109.05,109.40,9137200,109.40], +["2004-08-20",101.01,109.08,100.50,108.31,11428600,108.31], +["2004-08-19",100.00,104.06,95.96,100.34,22351900,100.34] +]; \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/examples/yahooData.min.js b/libreplan-webapp/src/main/webapp/jqplot/examples/yahooData.min.js new file mode 100644 index 000000000..11da48a80 --- /dev/null +++ b/libreplan-webapp/src/main/webapp/jqplot/examples/yahooData.min.js @@ -0,0 +1 @@ +var yahoo=[["2011-10-18",580.19,592.56,577.4,590.51,3800800,590.51],["2011-10-17",583.72,591.83,578,582.41,4008200,582.41],["2011-10-14",599.47,599.6,587.57,591.68,8529900,591.68],["2011-10-13",550.03,559,548.02,558.99,5639600,558.99],["2011-10-12",548.13,555.23,544.63,548.5,3177800,548.5],["2011-10-11",533.46,546.8,533.46,543.18,2853400,543.18],["2011-10-10",525.18,537.47,523.2,537.17,2322200,537.17],["2011-10-07",516.83,520.5,510.3,515.12,2855900,515.12],["2011-10-06",507.5,515.23,502.6,514.71,3424300,514.71],["2011-10-05",496.35,507.8,480.77,504.7,4534100,504.7],["2011-10-04",490.03,503.44,480.6,501.9,4158800,501.9],["2011-10-03",509.85,512,495,495.52,4474400,495.52],["2011-09-30",520.21,524,514.38,515.04,2723600,515.04],["2011-09-29",536.04,537.3,519.41,527.5,2906600,527.5],["2011-09-28",541.5,544.02,527.7,528.84,2263300,528.84],["2011-09-27",538.2,547.05,536.05,539.34,3010900,539.34],["2011-09-26",527.25,532.93,513.25,531.89,2634200,531.89],["2011-09-23",516.56,526.42,514.5,525.51,2777300,525.51],["2011-09-22",526.25,528.78,514,520.66,4400300,520.66],["2011-09-21",547.69,555,538.86,539.2,2514300,539.2],["2011-09-20",549.4,558.52,542.67,546.63,2779100,546.63],["2011-09-19",540.35,549.9,535.38,546.67,2468400,546.67],["2011-09-16",544.8,546.84,543.14,546.68,3534300,546.68],["2011-09-15",535.5,544.98,534.56,542.56,2960800,542.56],["2011-09-14",532.59,536.95,525.82,532.07,2694400,532.07],["2011-09-13",532,533.88,523.4,529.52,2354200,529.52],["2011-09-12",517.96,531.99,517.5,530.12,2670400,530.12],["2011-09-09",531.4,534.65,521.19,524.85,3268800,524.85],["2011-09-08",533.8,539.1,531.9,534.96,2380500,534.96],["2011-09-07",530.45,535.94,527.4,534.03,2755800,534.03],["2011-09-06",510.8,522.76,510.5,522.18,2715800,522.18],["2011-09-02",524.47,527.92,520.73,524.84,2401200,524.84],["2011-09-01",540.75,543.83,531.22,532.5,2415500,532.5],["2011-08-31",544.74,546.3,536,540.96,2693300,540.96],["2011-08-30",538.19,542.99,530.81,540.7,2989000,540.7],["2011-08-29",534.56,539.45,533.56,539.08,2335800,539.08],["2011-08-26",519.99,530.45,513.14,526.86,3596300,526.86],["2011-08-25",530.38,537.27,518.3,520.04,3293000,520.04],["2011-08-24",519.33,530,517.23,523.29,3594500,523.29],["2011-08-23",503.5,521.41,499.06,518.82,4346800,518.82],["2011-08-22",504,507,494.53,498.17,4905900,498.17],["2011-08-19",499.34,514.87,490.86,490.92,5410000,490.92],["2011-08-18",523.47,524.89,500.49,504.88,6290700,504.88],["2011-08-17",540.03,543.69,530.77,533.15,4055000,533.15],["2011-08-16",552.43,552.44,530.3,539,6939400,539],["2011-08-15",553.43,564.99,546.05,557.23,7144900,557.23],["2011-08-12",569.5,570.5,560.4,563.77,3154300,563.77],["2011-08-11",553.82,568.5,548.41,562.13,4830600,562.13],["2011-08-10",561.38,564.12,547.73,549.01,5369600,549.01],["2011-08-09",561,574.61,541.01,573.41,6469700,573.41],["2011-08-08",562.98,569,544.35,546.02,7496600,546.02],["2011-08-05",582.54,590,562,579.04,5929100,579.04],["2011-08-04",594.5,598.85,577.47,577.52,4914600,577.52],["2011-08-03",594.27,603,583.63,601.17,3825700,601.17],["2011-08-02",606,609.67,591.57,592.4,3200600,592.4],["2011-08-01",611.22,615.5,599.18,606.77,3966100,606.77],["2011-07-29",604.23,614.96,603.69,603.69,4137400,603.69],["2011-07-28",605.19,615.98,603,610.94,3108400,610.94],["2011-07-27",617.18,620.95,604.75,607.22,3934400,607.22],["2011-07-26",618.05,627.5,617.22,622.52,2342900,622.52],["2011-07-25",613.36,625.41,613,618.98,3131600,618.98],["2011-07-22",605.39,619.5,604.27,618.23,3528200,618.23],["2011-07-21",594.03,608.06,594.01,606.99,3469500,606.99],["2011-07-20",602.18,602.83,595.35,595.35,2227800,595.35],["2011-07-19",596.14,604.68,595.53,602.55,2967500,602.55],["2011-07-18",592.49,602.05,592,594.94,4468300,594.94],["2011-07-15",597.5,600.25,588.16,597.62,13732100,597.62],["2011-07-14",539.12,542,526.73,528.94,6594400,528.94],["2011-07-13",537,544,536.48,538.26,2790200,538.26],["2011-07-12",528.16,539.42,526,534.01,2841200,534.01],["2011-07-11",528.18,535.98,525.5,527.28,2839300,527.28],["2011-07-08",532.95,537.65,527.27,531.99,4770200,531.99],["2011-07-07",541,550.68,535.88,546.6,3935500,546.6],["2011-07-06",533.5,538.51,533.04,535.36,2695600,535.36],["2011-07-05",525.3,535.4,525.3,532.44,3849200,532.44],["2011-07-01",506.74,521.18,506.38,521.03,3636700,521.03],["2011-06-30",501.99,506.67,501.5,506.38,2428400,506.38],["2011-06-29",496.54,500.25,492.38,497.57,2343000,497.57],["2011-06-28",484.02,496.21,484.02,493.65,2715100,493.65],["2011-06-27",474,488.4,473.6,482.8,3444700,482.8],["2011-06-24",480.68,480.75,473.02,474.88,3805600,474.88],["2011-06-23",482.13,482.86,473.73,480.22,4801700,480.22],["2011-06-22",491.45,492.35,486.73,487.01,2407100,487.01],["2011-06-21",487.19,493.94,484.73,493,2765400,493],["2011-06-20",485,486.23,479.23,484.58,3028600,484.58],["2011-06-17",506.18,506.69,484.8,485.02,5245400,485.02],["2011-06-16",502.81,506.57,496.67,500.37,2757000,500.37],["2011-06-15",505.03,508.35,500.61,502.95,2073300,502.95],["2011-06-14",508.15,514.08,506.99,508.37,2341500,508.37],["2011-06-13",510,510.2,502.17,504.73,2427300,504.73],["2011-06-10",514.08,516.69,509.29,509.51,2439900,509.51],["2011-06-09",520,520,515.64,516.73,1689100,516.73],["2011-06-08",516.53,521.24,515.78,519.17,1653400,519.17],["2011-06-07",522.89,524.63,518.99,519.03,1907600,519.03],["2011-06-06",523.54,526.82,519.25,521.06,1942100,521.06],["2011-06-03",522,527.6,521.5,523.08,1748500,523.08],["2011-06-02",527.57,530.3,522.48,528.06,2204500,528.06],["2011-06-01",528.04,533.2,525.31,525.6,2955900,525.6],["2011-05-31",525,529.05,523.5,529.02,2687300,529.02],["2011-05-27",518.48,521.79,516.3,520.9,1745800,520.9],["2011-05-26",517.7,522.12,515,518.13,2118500,518.13],["2011-05-25",517.33,522.77,517.25,519.67,1301600,519.67],["2011-05-24",520.37,523.96,518.15,518.26,1888400,518.26],["2011-05-23",516.6,520,513.4,518.39,2252700,518.39],["2011-05-20",531.8,531.99,523.13,524.03,2317500,524.03],["2011-05-19",532.73,536.54,529.72,531.25,2468700,531.25],["2011-05-18",529.54,530.33,525.7,529.81,1953200,529.81],["2011-05-17",515.43,531.22,515.03,530.46,3303600,530.46],["2011-05-16",526.31,527.27,516.4,518.42,2958200,518.42],["2011-05-13",534.61,535.92,529.05,529.55,2108700,529.55],["2011-05-12",535.24,536.94,530.91,535.05,1400000,535.05],["2011-05-11",540.14,543.55,533.69,535.45,2338800,535.45],["2011-05-10",540,544.43,537.54,542.66,2042900,542.66],["2011-05-09",535,538.49,531.1,537.68,1948700,537.68],["2011-05-06",538.15,541.46,535.18,535.3,2056100,535.3],["2011-05-05",533.86,539.42,531.5,534.27,1997800,534.27],["2011-05-04",535.17,539,533.02,535.79,2117000,535.79],["2011-05-03",537.13,542.01,529.63,533.89,2081500,533.89],["2011-05-02",545.7,545.73,537.12,538.56,2133700,538.56],["2011-04-29",540,544.1,538.51,544.1,4200000,544.1],["2011-04-28",538.06,539.25,534.08,537.97,2037400,537.97],["2011-04-27",538,538.11,534.35,537.76,2298400,537.76],["2011-04-26",526.52,537.44,525.21,532.82,3535400,532.82],["2011-04-25",525.25,527,522.01,525.05,1630800,525.05],["2011-04-21",527.49,528.28,522.39,525.1,2470100,525.1],["2011-04-20",525.9,526.82,521.39,525.73,3060000,525.73],["2011-04-19",529.95,530.88,520.9,521.53,2684100,521.53],["2011-04-18",526.42,527.66,519,526.84,5039800,526.84],["2011-04-15",545.29,545.75,530.06,530.7,14043700,530.7],["2011-04-14",575.19,579.45,572.1,578.51,5456300,578.51],["2011-04-13",575.51,577.6,571.75,576.28,2069400,576.28],["2011-04-12",575,576.91,568.05,570.61,2085600,570.61],["2011-04-11",576.2,578.1,573,577.37,1858200,577.37],["2011-04-08",584.89,584.89,578.06,578.16,1901800,578.16],["2011-04-07",575.73,580.64,574.19,580,2531500,580],["2011-04-06",572.18,575.16,568,574.18,2668300,574.18],["2011-04-05",581.08,581.49,565.68,569.09,6047500,569.09],["2011-04-04",593,594.74,583.1,587.68,2054500,587.68],["2011-04-01",588.76,595.19,588.76,591.8,2613200,591.8],["2011-03-31",583,588.16,581.74,586.76,2029400,586.76],["2011-03-30",584.38,585.5,580.58,581.84,1422300,581.84],["2011-03-29",576,581.89,573.01,581.73,1604800,581.73],["2011-03-28",582.07,584.99,574.71,575.36,2218400,575.36],["2011-03-25",586.88,586.91,579.24,579.74,2858400,579.74],["2011-03-24",585.43,588.39,578.8,586.89,2098700,586.89],["2011-03-23",575.19,582.45,572,582.16,1816200,582.16],["2011-03-22",577.27,579.23,572.51,577.32,1886900,577.32],["2011-03-21",570.22,579.8,569.02,576.5,3020900,576.5],["2011-03-18",564.64,567.99,559.74,561.06,3298600,561.06],["2011-03-17",564.48,569,560.54,561.36,2899300,561.36],["2011-03-16",568.01,569.79,551.28,557.1,3798500,557.1],["2011-03-15",557.5,571,555.5,569.56,4005600,569.56],["2011-03-14",572.8,578.29,568.02,569.99,2816100,569.99],["2011-03-11",578.22,580,573.33,576.71,3032000,576.71],["2011-03-10",585.44,586.62,579.45,580.3,3128100,580.3],["2011-03-09",591,594.51,585.75,591.77,2151000,591.77],["2011-03-08",592.93,597.98,590.2,592.31,2284900,592.31],["2011-03-07",600.55,603.69,587,591.66,3462700,591.66],["2011-03-04",608.33,608.98,600.2,600.62,3011000,600.62],["2011-03-03",606.38,611.49,605,609.56,1945300,609.56],["2011-03-02",599.8,606,595.19,600.79,2026700,600.79],["2011-03-01",617.78,619.22,599.3,600.76,3323200,600.76],["2011-02-28",610,616.49,608.01,613.4,2281500,613.4],["2011-02-25",611.86,614.72,609.5,610.04,1932400,610.04],["2011-02-24",611.39,613.09,601.35,608.82,2711700,608.82],["2011-02-23",610.33,614.7,604,611.32,2889600,611.32],["2011-02-22",620.03,624.93,607.77,610.21,3639900,610.21],["2011-02-18",626,631.18,624.18,630.08,3217900,630.08],["2011-02-17",621.25,627.25,620.28,625.26,1478800,625.26],["2011-02-16",625.63,626.5,622.1,624.22,1684000,624.22],["2011-02-15",627.32,630.09,623.1,624.15,2092000,624.15],["2011-02-14",623.34,629.64,620.04,628.15,2128000,628.15],["2011-02-11",613.79,625,613,624.5,2589900,624.5],["2011-02-10",613.9,617.5,611.56,616.44,2334400,616.44],["2011-02-09",616.87,619.45,612.34,616.5,1842500,616.5],["2011-02-08",614.93,619.63,614.51,618.38,1694900,618.38],["2011-02-07",610.16,618.39,609.21,614.29,1799600,614.29],["2011-02-04",610.15,611.44,606.61,610.98,1550800,610.98],["2011-02-03",609.48,611.45,606.13,610.15,1495100,610.15],["2011-02-02",611,614.34,607.53,612,1760700,612],["2011-02-01",604.49,613.35,603.11,611.04,2745300,611.04],["2011-01-31",603.6,604.47,595.55,600.36,2804900,600.36],["2011-01-28",619.07,620.36,599.76,600.99,4231100,600.99],["2011-01-27",617.89,619.7,613.25,616.79,2019200,616.79],["2011-01-26",620.33,622.49,615.28,616.5,2038100,616.5],["2011-01-25",608.2,620.69,606.52,619.91,3646800,619.91],["2011-01-24",607.57,612.49,601.23,611.08,4599200,611.08],["2011-01-21",639.58,641.73,611.36,611.83,8904400,611.83],["2011-01-20",632.21,634.08,623.29,626.77,5485800,626.77],["2011-01-19",642.12,642.96,629.66,631.75,3406100,631.75],["2011-01-18",626.06,641.99,625.27,639.63,3617000,639.63],["2011-01-14",617.4,624.27,617.08,624.18,2365600,624.18],["2011-01-13",616.97,619.67,614.16,616.69,1334000,616.69],["2011-01-12",619.35,619.35,614.77,616.87,1632700,616.87],["2011-01-11",617.71,618.8,614.5,616.01,1439300,616.01],["2011-01-10",614.8,615.39,608.56,614.21,1579200,614.21],["2011-01-07",615.91,618.25,610.13,616.44,2101200,616.44],["2011-01-06",610.68,618.43,610.05,613.5,2057800,613.5],["2011-01-05",600.07,610.33,600.05,609.07,2532300,609.07],["2011-01-04",605.62,606.18,600.12,602.12,1824500,602.12],["2011-01-03",596.48,605.59,596.48,604.35,2365200,604.35],["2010-12-31",596.74,598.42,592.03,593.97,1539300,593.97],["2010-12-30",598,601.33,597.39,598.86,989500,598.86],["2010-12-29",602,602.41,598.92,601,1019200,601],["2010-12-28",602.05,603.87,598.01,598.92,1064800,598.92],["2010-12-27",602.74,603.78,599.5,602.38,1208100,602.38],["2010-12-23",605.34,606,602.03,604.23,1110800,604.23],["2010-12-22",604,607,603.28,605.49,1207500,605.49],["2010-12-21",598.57,604.72,597.61,603.07,1879500,603.07],["2010-12-20",594.65,597.88,588.66,595.06,1973300,595.06],["2010-12-17",591,592.56,587.67,590.8,3087100,590.8],["2010-12-16",592.85,593.77,588.07,591.71,1596900,591.71],["2010-12-15",594.2,596.45,589.15,590.3,2167700,590.3],["2010-12-14",597.09,598.29,592.48,594.91,1643300,594.91],["2010-12-13",597.12,603,594.09,594.62,2398500,594.62],["2010-12-10",593.14,593.99,590.29,592.21,1704700,592.21],["2010-12-09",593.88,595.58,589,591.5,1868900,591.5],["2010-12-08",591.97,592.52,583.69,590.54,1756900,590.54],["2010-12-07",591.27,593,586,587.14,3042200,587.14],["2010-12-06",580.57,582,576.61,578.36,2093800,578.36],["2010-12-03",569.45,576.48,568,573,2631200,573],["2010-12-02",568.66,573.33,565.35,571.82,2547900,571.82],["2010-12-01",563,571.57,562.4,564.35,3754100,564.35],["2010-11-30",574.32,574.32,553.31,555.71,7117400,555.71],["2010-11-29",589.17,589.8,579.95,582.11,2859700,582.11],["2010-11-26",590.46,592.98,587,590,1311100,590],["2010-11-24",587.31,596.6,587.05,594.97,2396400,594.97],["2010-11-23",587.01,589.01,578.2,583.01,2162600,583.01],["2010-11-22",587.47,593.44,582.75,591.22,2186600,591.22],["2010-11-19",597,597.89,590.34,590.83,2297500,590.83],["2010-11-18",589,599.98,588.56,596.56,2590000,596.56],["2010-11-17",585,589.5,581.37,583.55,2442500,583.55],["2010-11-16",592.76,597.89,583.45,583.72,3307400,583.72],["2010-11-15",603.08,604,594.05,595.47,3478900,595.47],["2010-11-12",613.99,616.9,601.21,603.29,3393000,603.29],["2010-11-11",619.7,619.85,614.21,617.19,2261600,617.19],["2010-11-10",622.08,623,617.51,622.88,2497000,622.88],["2010-11-09",630,630.85,620.51,624.82,2237200,624.82],["2010-11-08",624.02,629.49,623.13,626.77,2101300,626.77],["2010-11-05",623.18,625.49,621.11,625.08,1765700,625.08],["2010-11-04",624.64,629.92,622.1,624.27,3570800,624.27],["2010-11-03",617.5,621.83,613.5,620.18,3380500,620.18],["2010-11-02",618.67,620,614.58,615.6,1997600,615.6],["2010-11-01",615.73,620.66,611.21,615,3087100,615],["2010-10-29",617.07,619,612.99,613.7,2278300,613.7],["2010-10-28",620.05,621,613.3,618.58,2184300,618.58],["2010-10-27",615.77,620,612.33,616.47,2241900,616.47],["2010-10-26",613.1,621.23,611.03,618.6,2512900,618.6],["2010-10-25",615.59,624.74,614.97,616.5,3158400,616.5],["2010-10-22",611.92,614.82,610.05,612.53,2256100,612.53],["2010-10-21",611.51,616,606,611.99,2920500,611.99],["2010-10-20",608.14,617.38,607.5,607.98,3525100,607.98],["2010-10-19",608.85,614.82,602.86,607.83,4587900,607.83],["2010-10-18",600.55,619.69,600.55,617.71,7098200,617.71],["2010-10-15",599.27,601.64,591.6,601.45,14824800,601.45],["2010-10-14",544.18,545.25,537.11,540.93,6634100,540.93],["2010-10-13",547,547.49,542.33,543.3,3055600,543.3],["2010-10-12",540.12,545.99,537.79,541.39,3753600,541.39],["2010-10-11",538.48,544.6,537.17,538.84,2626300,538.84],["2010-10-08",532.77,537.6,527.62,536.35,2859200,536.35],["2010-10-07",536.21,537.2,529.14,530.01,2395800,530.01],["2010-10-06",539.26,539.95,529.94,534.35,2762300,534.35],["2010-10-05",528.38,540,526.55,538.23,3507100,538.23],["2010-10-04",524.95,528.25,518.85,522.35,1940500,522.35],["2010-10-01",530,530.62,523,525.62,2225000,525.62],["2010-09-30",529.16,531.87,518.92,525.79,3244100,525.79],["2010-09-29",527.85,532.94,524.71,527.69,2172200,527.69],["2010-09-28",533.48,533.59,518.45,527.17,3654700,527.17],["2010-09-27",528.85,536.85,528.85,530.41,3107400,530.41],["2010-09-24",521.74,527.83,518.26,527.29,3356900,527.29],["2010-09-23",514.61,519.69,511.3,513.48,2317400,513.48],["2010-09-22",512.86,517.78,511.68,516,2537100,516],["2010-09-21",509.68,519.98,508.91,513.46,4466300,513.46],["2010-09-20",492.5,510.41,492.06,508.28,4403500,508.28],["2010-09-17",483.75,491.2,481.18,490.15,5641600,490.15],["2010-09-16",479.95,482.45,479.41,481.06,1969500,481.06],["2010-09-15",479.95,481.89,478.5,480.64,2402800,480.64],["2010-09-14",482.01,484.75,480.08,480.43,2216500,480.43],["2010-09-13",480.9,484.35,479.53,482.27,2241500,482.27],["2010-09-10",479.02,479.79,475.08,476.14,1974300,476.14],["2010-09-09",477.83,480.4,470.58,476.18,2430600,476.18],["2010-09-08",465.19,472.5,464.51,470.58,2401800,470.58],["2010-09-07",464.5,467.59,463.02,464.4,1709900,464.4],["2010-09-03",470.52,471.88,467.44,470.3,2540400,470.3],["2010-09-02",462.84,464.43,460.31,463.18,1684200,463.18],["2010-09-01",454.98,464.94,452.5,460.33,3228300,460.33],["2010-08-31",450.11,454.87,448,450.02,1946800,450.02],["2010-08-30",459.15,459.76,452.42,452.69,1231400,452.69],["2010-08-27",452.56,459.99,447.65,458.83,2312400,458.83],["2010-08-26",456.06,457.26,450.44,450.98,1777000,450.98],["2010-08-25",450,457.81,450,454.62,2592100,454.62],["2010-08-24",457.7,458.37,450.92,451.39,2762700,451.39],["2010-08-23",461.5,468.25,457.73,464.07,2986200,464.07],["2010-08-20",467.97,471.59,461.02,462.02,3917600,462.02],["2010-08-19",481.01,482.51,467.25,467.97,3925000,467.97],["2010-08-18",490.44,490.87,481.55,482.15,2686400,482.15],["2010-08-17",488.53,494.7,486.03,490.52,1890700,490.52],["2010-08-16",483.68,489.87,480.5,485.59,1305000,485.59],["2010-08-13",489,491.19,486.01,486.35,1934700,486.35],["2010-08-12",483.94,494.75,482.51,492.01,2204600,492.01],["2010-08-11",497.73,498,491.5,491.74,2223000,491.74],["2010-08-10",502.35,506,498.57,503.71,2074000,503.71],["2010-08-09",502.25,505.5,501.36,505.35,1872200,505.35],["2010-08-06",505.4,505.74,496.05,500.22,3319500,500.22],["2010-08-05",505.89,508.6,503.56,508.1,2420400,508.1],["2010-08-04",492.18,507,491.05,506.32,3812500,506.32],["2010-08-03",490.5,492.46,486.76,489.83,1802300,489.83],["2010-08-02",488.99,493.28,486.94,490.41,1858700,490.41],["2010-07-30",479.65,487.36,479.14,484.85,2144100,484.85],["2010-07-29",485.95,488.88,479.33,484.99,2675500,484.99],["2010-07-28",494.94,495.25,482.67,484.35,2496000,484.35],["2010-07-27",490.58,497.5,490.17,492.63,2451200,492.63],["2010-07-26",489.09,490.75,484.88,488.97,1995200,488.97],["2010-07-23",480.77,490.59,480.01,490.06,2264400,490.06],["2010-07-22",483.23,488.98,482.48,484.81,2147700,484.81],["2010-07-21",484,485.7,475.43,477.5,3279600,477.5],["2010-07-20",461.03,482.99,460.6,481.59,4054500,481.59],["2010-07-19",461.01,469.65,457.52,466.18,4550300,466.18],["2010-07-16",469.12,470.56,459.52,459.61,7824800,459.61],["2010-07-15",491.73,494.7,482.68,494.02,4858200,494.02],["2010-07-14",489.88,493.83,486.46,491.34,3118000,491.34],["2010-07-13",482.25,492.99,480.28,489.2,3976300,489.2],["2010-07-12",472.37,479.44,471.08,475.83,3334400,475.83],["2010-07-09",471.96,473.26,462.78,467.49,4331500,467.49],["2010-07-08",453.55,457.33,449.66,456.56,2668900,456.56],["2010-07-07",438.31,451.29,435.38,450.2,3129700,450.2],["2010-07-06",444,447.67,433.63,436.07,2560100,436.07],["2010-07-02",441.62,442.28,436,436.55,1936000,436.55],["2010-07-01",445.29,448.4,433.63,439.49,3513600,439.49],["2010-06-30",454.96,457.83,444.72,444.95,3603200,444.95],["2010-06-29",463.44,464.55,451.12,454.26,3502100,454.26],["2010-06-28",472.59,477.55,469.01,472.08,1762300,472.08],["2010-06-25",477.06,477.65,470.56,472.68,2245200,472.68],["2010-06-24",479.66,482.75,473.26,475.1,1893600,475.1],["2010-06-23",486.89,486.89,478.16,482.05,2029100,482.05],["2010-06-22",489.9,496.6,485.73,486.25,2219700,486.25],["2010-06-21",499.9,500.97,484.89,488.56,2983500,488.56],["2010-06-18",502.51,503.47,498.13,500.03,2872900,500.03],["2010-06-17",503.45,505.87,496.69,500.08,1977300,500.08],["2010-06-16",496.17,504,496.11,501.27,2289300,501.27],["2010-06-15",483.08,500.4,482.18,497.99,4259600,497.99],["2010-06-14",494.48,494.5,483.19,483.19,2040400,483.19],["2010-06-11",482.5,488.71,481.62,488.5,1781700,488.5],["2010-06-10",480.37,488.5,475.84,487.01,2577900,487.01],["2010-06-09",487.22,488.88,472,474.02,2729000,474.02],["2010-06-08",487.85,488.84,477.54,484.78,2685100,484.78],["2010-06-07",499.06,500.91,483.15,485.52,3632700,485.52],["2010-06-04",499.72,509.25,496.7,498.72,3920300,498.72],["2010-06-03",495.11,508,494.7,505.6,3650700,505.6],["2010-06-02",486.68,493.87,481.46,493.37,2540800,493.37],["2010-06-01",480.43,491.06,480.12,482.37,2666800,482.37],["2010-05-28",492.74,493.45,483,485.63,2894800,485.63],["2010-05-27",484.95,492.31,481.05,490.46,2809100,490.46],["2010-05-26",482.07,489.76,475,475.47,3475600,475.47],["2010-05-25",468.15,477.45,464.01,477.07,3017400,477.07],["2010-05-24",480.73,489.79,476.8,477.16,4345600,477.16],["2010-05-21",469.06,485,464.4,472.05,9690800,472.05],["2010-05-20",485.07,485.58,473.8,475.01,4913300,475.01],["2010-05-19",496.26,499.44,487.74,494.43,3445700,494.43],["2010-05-18",510,510.97,497.07,498.37,2825500,498.37],["2010-05-17",506.78,508.36,498.35,507.97,2793800,507.97],["2010-05-14",509.77,510.99,496.25,507.53,4116000,507.53],["2010-05-13",516.5,522,510.37,510.88,3325800,510.88],["2010-05-12",512.04,512.04,502,505.39,3851800,505.39],["2010-05-11",515.67,519.88,508.22,509.05,3322600,509.05],["2010-05-10",513.97,522.82,512.6,521.65,4128000,521.65],["2010-05-07",499.97,505.32,481.33,493.14,5089000,493.14],["2010-05-06",508.75,517.52,460,498.67,5000100,498.67],["2010-05-05",500.98,515.72,500.47,509.76,4582200,509.76],["2010-05-04",526.52,526.74,504.21,506.37,6076300,506.37],["2010-05-03",526.5,532.92,525.08,530.6,1857800,530.6],["2010-04-30",531.13,537.68,525.44,525.7,2435400,525.7],["2010-04-29",533.37,536.5,526.67,532,3058900,532],["2010-04-28",532.1,534.83,521.03,529.19,3406100,529.19],["2010-04-27",528.95,538.33,527.23,529.06,3844700,529.06],["2010-04-26",544.97,544.99,529.21,531.64,4368800,531.64],["2010-04-23",547.25,549.32,542.27,544.99,2089400,544.99],["2010-04-22",552,552.5,543.35,547.06,3280700,547.06],["2010-04-21",556.46,560.25,552.16,554.3,2391500,554.3],["2010-04-20",554.17,559.66,551.06,555.04,2977400,555.04],["2010-04-19",548.75,553.99,545,550.1,3894000,550.1],["2010-04-16",563,568.81,549.63,550.15,12235500,550.15],["2010-04-15",592.17,597.84,588.29,595.3,6761800,595.3],["2010-04-14",590.06,592.34,584.01,589,3402700,589],["2010-04-13",572.53,588.88,571.13,586.77,3912300,586.77],["2010-04-12",567.35,574,566.22,572.73,2352400,572.73],["2010-04-09",567.49,568.77,564,566.22,2056600,566.22],["2010-04-08",563.32,569.85,560.05,567.49,1947500,567.49],["2010-04-07",567.3,568.75,561.86,563.54,2581000,563.54],["2010-04-06",569.46,570.89,565.4,568.22,2060100,568.22],["2010-04-05",570.9,574.88,569,571.01,1901500,571.01],["2010-04-01",571.35,573.45,565.55,568.8,2102700,568.8],["2010-03-31",565.05,569.74,562.81,567.12,3030800,567.12],["2010-03-30",562.83,567.63,560.28,566.71,1977900,566.71],["2010-03-29",563,564.72,560.57,562.45,3104500,562.45],["2010-03-26",565.27,567.39,560.02,562.69,2696200,562.69],["2010-03-25",559.02,572,558.66,562.88,3930900,562.88],["2010-03-24",545.51,559.85,539.7,557.33,6565200,557.33],["2010-03-23",557.04,558.31,542,549,5501300,549],["2010-03-22",556.11,566.85,554.28,557.5,4004800,557.5],["2010-03-19",566.23,568,557.28,560,4792400,560],["2010-03-18",564.72,568.44,562.96,566.4,1777200,566.4],["2010-03-17",568.3,571.45,564.25,565.56,3321600,565.56],["2010-03-16",561.83,568.42,560.76,565.2,3431500,565.2],["2010-03-15",566.68,569.45,556,563.18,4653900,563.18],["2010-03-12",588.14,588.28,579.16,579.54,2753400,579.54],["2010-03-11",574.26,586.21,574.2,581.14,4233300,581.14],["2010-03-10",563.76,578.5,562.21,576.45,5654900,576.45],["2010-03-09",559.85,564.66,556.5,560.19,3176600,560.19],["2010-03-08",564.78,565.18,561.01,562.48,2386400,562.48],["2010-03-05",561.35,567.67,559.9,564.21,3912200,564.21],["2010-03-04",546.5,556.13,546.2,554.59,3183800,554.59],["2010-03-03",542.36,548.12,539.25,545.32,3089400,545.32],["2010-03-02",535.48,545.66,535.01,541.06,4356800,541.06],["2010-03-01",529.2,533.29,527.74,532.69,2237900,532.69],["2010-02-26",527.42,531.75,523.48,526.8,2049300,526.8],["2010-02-25",527.12,528.49,520,526.43,3309200,526.43],["2010-02-24",533.98,538.44,530.51,531.47,2326600,531.47],["2010-02-23",543,543.63,532.29,535.07,2872600,535.07],["2010-02-22",547.35,547.5,541,542.8,2144600,542.8],["2010-02-19",540.53,544.03,539.7,540.76,2553100,540.76],["2010-02-18",537.54,545.01,536.14,543.22,2336900,543.22],["2010-02-17",542,543.4,537.61,538.21,2029700,538.21],["2010-02-16",536.87,544.13,534.3,541.3,3654400,541.3],["2010-02-12",532.97,537.15,530.5,533.12,2279700,533.12],["2010-02-11",533.32,540.49,529.5,536.4,2410000,536.4],["2010-02-10",534.07,537.79,527.69,534.45,2674500,534.45],["2010-02-09",539.54,541.53,535.07,536.44,2819600,536.44],["2010-02-08",532.5,542,531.53,533.47,2694300,533.47],["2010-02-05",528.4,533.5,522.46,531.29,3156000,531.29],["2010-02-04",537,538,525.56,526.78,3377700,526.78],["2010-02-03",528.67,542.1,528.23,540.82,2999100,540.82],["2010-02-02",534.96,534.96,527.61,531.12,4096200,531.12],["2010-02-01",534.6,535.81,530.3,533.02,2250800,533.02],["2010-01-29",538.49,540.99,525.61,529.94,4140500,529.94],["2010-01-28",544.49,547,530.6,534.29,3229100,534.29],["2010-01-27",541.27,547.65,535.31,542.1,3964400,542.1],["2010-01-26",537.97,549.6,536.29,542.42,4355500,542.42],["2010-01-25",546.59,549.88,535.51,540,4419900,540],["2010-01-22",564.5,570.6,534.86,550.01,6800400,550.01],["2010-01-21",583.44,586.82,572.25,582.98,6307700,582.98],["2010-01-20",585.98,585.98,575.29,580.41,3250700,580.41],["2010-01-19",581.2,590.42,576.29,587.62,4316700,587.62],["2010-01-15",593.34,593.56,578.04,580,5434500,580],["2010-01-14",583.9,594.2,582.81,589.85,4240100,589.85],["2010-01-13",576.49,588.38,573.9,587.09,6496600,587.09],["2010-01-12",597.65,598.16,588,590.48,4853300,590.48],["2010-01-11",604.46,604.46,594.04,601.11,7212900,601.11],["2010-01-08",592,603.25,589.11,602.02,4724300,602.02],["2010-01-07",609.4,610,592.65,594.1,6414300,594.1],["2010-01-06",625.86,625.86,606.36,608.26,3978700,608.26],["2010-01-05",627.18,627.84,621.54,623.99,3004700,623.99],["2010-01-04",626.95,629.51,624.24,626.75,1956200,626.75],["2009-12-31",624.75,625.4,619.98,619.98,1219800,619.98],["2009-12-30",618.5,622.73,618.01,622.73,1465600,622.73],["2009-12-29",624.74,624.84,618.29,619.4,1424800,619.4],["2009-12-28",621.66,625.99,618.48,622.87,1697900,622.87],["2009-12-24",612.93,619.52,612.27,618.48,858700,618.48],["2009-12-23",603.5,612.87,602.85,611.68,2072700,611.68],["2009-12-22",601.34,601.5,598.85,601.12,1880800,601.12],["2009-12-21",597.61,599.84,595.67,598.68,2571200,598.68],["2009-12-18",596.03,598.93,595,596.42,3531500,596.42],["2009-12-17",596.44,597.64,593.76,593.94,2638800,593.94],["2009-12-16",598.6,600.37,596.64,597.76,2809400,597.76],["2009-12-15",593.3,596.38,590.99,593.14,2280400,593.14],["2009-12-14",595.35,597.31,592.61,595.73,1913400,595.73],["2009-12-11",594.68,594.75,587.73,590.51,1720000,590.51],["2009-12-10",590.44,594.71,590.41,591.5,1668300,591.5],["2009-12-09",587.5,589.33,583.58,589.02,1781000,589.02],["2009-12-08",583.5,590.66,582,587.05,1524000,587.05],["2009-12-07",584.21,588.69,581,586.25,1636200,586.25],["2009-12-04",593.02,594.83,579.18,585.01,2513600,585.01],["2009-12-03",589.04,591.45,585,585.74,1428700,585.74],["2009-12-02",591,593.01,586.22,587.51,1663200,587.51],["2009-12-01",588.13,591.22,583,589.87,2320300,589.87],["2009-11-30",580.63,583.67,577.11,583,1725100,583],["2009-11-27",572,582.46,570.97,579.76,1384600,579.76],["2009-11-25",586.41,587.06,582.69,585.74,1461200,585.74],["2009-11-24",582.52,584.29,576.54,583.09,1605200,583.09],["2009-11-23",576.49,586.6,575.86,582.35,2547500,582.35],["2009-11-20",569.5,571.6,569.4,569.96,2006200,569.96],["2009-11-19",573.77,574,570,572.99,2168000,572.99],["2009-11-18",576.65,578.78,572.07,576.65,1549600,576.65],["2009-11-17",574.87,577.5,573.72,577.49,1916700,577.49],["2009-11-16",575,576.99,572.78,576.28,2199200,576.28],["2009-11-13",569.29,572.51,566.61,572.05,1666800,572.05],["2009-11-12",569.56,572.9,565.5,567.85,1886300,567.85],["2009-11-11",570.48,573.5,565.86,570.56,2319700,570.56],["2009-11-10",562.73,568.78,562,566.76,2230800,566.76],["2009-11-09",555.45,562.58,554.23,562.51,2649900,562.51],["2009-11-06",547.72,551.78,545.5,551.1,1826700,551.1],["2009-11-05",543.49,549.77,542.66,548.65,1847700,548.65],["2009-11-04",540.8,545.5,536.42,540.33,2332700,540.33],["2009-11-03",530.01,537.5,528.3,537.29,2380200,537.29],["2009-11-02",537.08,539.46,528.24,533.99,3202100,533.99],["2009-10-30",550,550.17,534.24,536.12,3468500,536.12],["2009-10-29",543.01,551.83,541,551.05,2522600,551.05],["2009-10-28",547.87,550,538.25,540.3,2567800,540.3],["2009-10-27",550.97,554.56,544.16,548.29,3216500,548.29],["2009-10-26",555.75,561.64,550.89,554.21,2970400,554.21],["2009-10-23",555.25,557.89,551.2,553.69,2392700,553.69],["2009-10-22",550,555,548,554.09,2336500,554.09],["2009-10-21",549.91,559.35,549,551.1,3670600,551.1],["2009-10-20",551.64,552.95,540.7,551.72,4043700,551.72],["2009-10-19",552.69,553.6,548.73,552.09,3217900,552.09],["2009-10-16",547.33,554.75,544.53,549.85,8841900,549.85],["2009-10-15",533.75,536.9,527.27,529.91,6100400,529.91],["2009-10-14",532.46,535.58,530,535.32,3258400,535.32],["2009-10-13",524.39,527.46,521.38,526.11,3037400,526.11],["2009-10-12",523.42,525.76,519.32,524.04,3322200,524.04],["2009-10-09",516.65,521.51,514.5,516.25,2738100,516.25],["2009-10-08",519.57,523.25,513.34,514.18,4303800,514.18],["2009-10-07",499,518.99,497.81,517.54,4874200,517.54],["2009-10-06",491.7,499.37,491.7,498.74,2732300,498.74],["2009-10-05",487.65,492.43,483.34,488.52,2144600,488.52],["2009-10-02",483.74,491.74,482.6,484.58,2600800,484.58],["2009-10-01",493,496.47,487,487.2,2813200,487.2],["2009-09-30",500,500.14,487.24,495.85,3141700,495.85],["2009-09-29",499.53,499.75,493.01,498.53,2099200,498.53],["2009-09-28",494.84,501.5,493.3,498.53,1839300,498.53],["2009-09-25",494.29,499.93,492,492.48,2049600,492.48],["2009-09-24",500.47,501.41,493,496.77,2527600,496.77],["2009-09-23",500.78,507,497.71,498.46,2704200,498.46],["2009-09-22",500.92,501.99,497.81,499.06,3041200,499.06],["2009-09-21",487.74,498.9,486.22,497,2116400,497],["2009-09-18",496.77,496.98,491.23,491.46,3283500,491.46],["2009-09-17",490.57,497.37,487.15,491.72,4483100,491.72],["2009-09-16",479.8,489.37,478.48,488.29,2585300,488.29],["2009-09-15",475.08,478.91,472.71,477.54,2398100,477.54],["2009-09-14",470.51,476.8,470.05,475.12,1975700,475.12],["2009-09-11",470.4,473.3,467.63,472.14,1902900,472.14],["2009-09-10",466.65,470.94,462,470.94,2534600,470.94],["2009-09-09",459.06,466.27,458.8,463.97,2195400,463.97],["2009-09-08",464.29,466.99,455.84,458.62,2656700,458.62],["2009-09-04",457.57,462.6,455.78,461.3,1499200,461.3],["2009-09-03",455.82,458.25,455,457.52,1646200,457.52],["2009-09-02",455.82,458.33,452.59,453.01,1804800,453.01],["2009-09-01",459.68,466.82,454.42,455.76,2594900,455.76],["2009-08-31",459.79,461.86,458,461.67,1957900,461.67],["2009-08-28",469.26,472.37,463.38,464.75,1771600,464.75],["2009-08-27",468.58,468.58,460.73,466.06,1998900,466.06],["2009-08-26",472.76,473,466.7,468,1987800,468],["2009-08-25",469.13,474.35,468.72,471.37,2341000,471.37],["2009-08-24",467.35,470.09,464.42,468.73,2453400,468.73],["2009-08-21",465.54,466.09,462.65,465.24,3560500,465.24],["2009-08-20",452,462.18,451.23,460.41,3998900,460.41],["2009-08-19",439.99,445,438.56,443.97,2255000,443.97],["2009-08-18",445.1,447.7,442.32,445.28,2351100,445.28],["2009-08-17",451.5,451.99,443.12,444.89,2620200,444.89],["2009-08-14",462.78,463.18,456.89,460,1675100,460],["2009-08-13",462.15,464.72,458.91,462.28,1995200,462.28],["2009-08-12",455.41,461.75,454.92,458.58,2341400,458.58],["2009-08-11",453.67,457.23,452.38,453.94,1712500,453.94],["2009-08-10",455.14,458.41,453.79,456.61,1742000,456.61],["2009-08-07",455.67,459.42,454.99,457.1,2543100,457.1],["2009-08-06",454.3,454.88,448.53,450.36,2110900,450.36],["2009-08-05",456,456.91,447.88,451.14,2342000,451.14],["2009-08-04",449.37,454,448.43,453.73,2389800,453.73],["2009-08-03",448.74,453.9,447.64,452.21,2590300,452.21],["2009-07-31",449.98,452.7,442.43,443.05,2860400,443.05],["2009-07-30",442.61,451.47,442.61,445.64,3198600,445.64],["2009-07-29",437.23,437.8,431.89,436.24,1987000,436.24],["2009-07-28",441,442.81,436.1,439.85,2532500,439.85],["2009-07-27",446.04,446.75,437.61,444.8,2504400,444.8],["2009-07-24",435.81,450.49,435,446.72,3626900,446.72],["2009-07-23",428.68,441.21,425.5,437.34,3478200,437.34],["2009-07-22",428,430.2,423.5,427.69,2586700,427.69],["2009-07-21",430.94,431.9,425.72,427.9,2968200,427.9],["2009-07-20",429.88,432.85,426.25,430.17,3153500,430.17],["2009-07-17",433,435.48,426.7,430.25,6854100,430.25],["2009-07-16",436.68,445.75,434.1,442.6,6554500,442.6],["2009-07-15",429.66,438.68,428.49,438.17,3777000,438.17],["2009-07-14",423.71,426.73,420.87,424.69,2895800,424.69],["2009-07-13",416.17,424.52,415.18,424.3,4045700,424.3],["2009-07-10",409.58,417.37,408.7,414.4,2926600,414.4],["2009-07-09",406.12,414.45,405.8,410.39,3275600,410.39],["2009-07-08",400,406,398.06,402.49,3441200,402.49],["2009-07-07",408.24,409.19,395.98,396.63,3259300,396.63],["2009-07-06",406.5,410.64,401.66,409.61,2262600,409.61],["2009-07-02",415.41,415.41,406.81,408.49,2517600,408.49],["2009-07-01",424.2,426.4,418.15,418.99,2310800,418.99],["2009-06-30",424,427.21,418.22,421.59,2593900,421.59],["2009-06-29",426,427.8,422.24,424.14,2169300,424.14],["2009-06-26",413.68,428.23,413.11,425.32,3256700,425.32],["2009-06-25",407,415.9,406.51,415.77,3044500,415.77],["2009-06-24",408.74,412.23,406.56,409.29,2457800,409.29],["2009-06-23",406.65,408.99,402.55,405.68,2899600,405.68],["2009-06-22",416.95,417.49,401.89,407.35,4124400,407.35],["2009-06-19",418.21,420.46,414.58,420.09,4259100,420.09],["2009-06-18",415.68,418.69,413,414.06,3085200,414.06],["2009-06-17",416.19,419.72,411.56,415.16,3490100,415.16],["2009-06-16",419.31,421.09,415.42,416,3049700,416],["2009-06-15",421.5,421.5,414,416.77,3736900,416.77],["2009-06-12",426.86,427.7,421.21,424.84,2918400,424.84],["2009-06-11",431.77,433.73,428.37,429,2865200,429],["2009-06-10",436.23,437.89,426.67,432.6,3358900,432.6],["2009-06-09",438.58,440.5,431.76,435.62,3254900,435.62],["2009-06-08",439.5,440.92,434.12,438.77,3098700,438.77],["2009-06-05",445.07,447.34,439.46,444.32,3680800,444.32],["2009-06-04",435.3,441.24,434.5,440.28,3638100,440.28],["2009-06-03",426,432.46,424,431.65,3532800,431.65],["2009-06-02",426.25,429.96,423.4,428.4,2623600,428.4],["2009-06-01",418.73,429.6,418.53,426.56,3322400,426.56],["2009-05-29",412.11,417.23,410.7,417.23,2648200,417.23],["2009-05-28",408.68,411.62,404.61,410.4,2668800,410.4],["2009-05-27",405.64,411.86,404.81,405.56,3034300,405.56],["2009-05-26",391.95,405,390,404.36,3104500,404.36],["2009-05-22",396.66,398.65,392,393.5,1718600,393.5],["2009-05-21",396.3,402.84,393.84,396.5,2719800,396.5],["2009-05-20",402.09,405.67,395,397.18,2284000,397.18],["2009-05-19",396.1,401.64,393,398.88,2837500,398.88],["2009-05-18",394.73,397.31,385.4,396.84,3351700,396.84],["2009-05-15",391.1,394.11,389.09,390,3008700,390],["2009-05-14",388.8,392.21,384.69,387.5,2937000,387.5],["2009-05-13",394.09,396.39,388.35,389.54,2842800,389.54],["2009-05-12",410.01,410.99,395.11,399.01,3790800,399.01],["2009-05-11",402.8,412,401.2,407.98,2559300,407.98],["2009-05-08",402.85,410.13,395,407.33,3865100,407.33],["2009-05-07",404.1,404.99,392.5,396.61,2999800,396.61],["2009-05-06",406.79,408.28,401,403.47,2632900,403.47],["2009-05-05",399.98,405,397.25,402.99,2400800,402.99],["2009-05-04",398.17,402.4,394.79,401.98,3203000,401.98],["2009-05-01",395.03,397.59,391.55,393.69,2427700,393.69],["2009-04-30",395.76,403.75,394.8,395.97,4355700,395.97],["2009-04-29",385.97,394.97,385.83,391.47,3610000,391.47],["2009-04-28",383.75,389.05,381.54,383.71,2943600,383.71],["2009-04-27",384.34,389.49,382.75,385.95,2290600,385.95],["2009-04-24",386.05,393.18,380.5,389.49,3385400,389.49],["2009-04-23",387.51,389.75,381.11,384.69,2609000,384.69],["2009-04-22",381.75,390,379.01,383.86,3501800,383.86],["2009-04-21",376.17,384.3,376.1,381.47,3695400,381.47],["2009-04-20",386.15,390.65,375.89,379.3,4428900,379.3],["2009-04-17",386.02,399.82,384.81,392.24,10730800,392.24],["2009-04-16",381.5,392.9,381.02,388.74,10185100,388.74],["2009-04-15",367.1,381.06,364.16,379.5,4930700,379.5],["2009-04-14",376.94,376.99,365.6,368.91,3428600,368.91],["2009-04-13",371.33,379.1,370.3,378.11,3050100,378.11],["2009-04-09",369.5,374.35,366.25,372.5,3382600,372.5],["2009-04-08",363.5,365,356.21,362,2765200,362],["2009-04-07",362.6,363.75,355.31,358.65,3680100,358.65],["2009-04-06",367,369.82,361.4,368.24,3280300,368.24],["2009-04-03",364.5,371.72,358,369.78,3789800,369.78],["2009-04-02",363.31,369.76,360.32,362.5,4488000,362.5],["2009-04-01",343.78,355.24,340.61,354.09,3301200,354.09],["2009-03-31",348.93,353.51,346.18,348.06,3655300,348.06],["2009-03-30",342.55,343.81,336.05,342.69,3094100,342.69],["2009-03-27",350,352,345.47,347.7,3322800,347.7],["2009-03-26",353.13,359.16,348.5,353.29,6003300,353.29],["2009-03-25",350.4,351.34,336.25,344.07,4336300,344.07],["2009-03-24",346.5,353.84,344,347.17,3820000,347.17],["2009-03-23",333.56,349.45,333.03,348.6,4271500,348.6],["2009-03-20",330.3,332.99,326.34,330.16,4737900,330.16],["2009-03-19",331.68,336,327.38,329.94,4111200,329.94],["2009-03-18",334.81,340,328.05,333.1,5012200,333.1],["2009-03-17",320.18,335.34,319.09,335.34,4712500,335.34],["2009-03-16",325.99,329.73,318.59,319.69,4946800,319.69],["2009-03-13",326.1,327.46,319.03,324.42,3906400,324.42],["2009-03-12",317.54,325,313.65,323.53,5024100,323.53],["2009-03-11",310.1,320,305.71,317.91,5923600,317.91],["2009-03-10",298.25,310.5,294.25,308.17,6730200,308.17],["2009-03-09",299.98,306.57,289.45,290.89,6471300,290.89],["2009-03-06",307.22,310.19,294.25,308.57,7234200,308.57],["2009-03-05",316.48,319.08,302.64,305.64,6529900,305.64],["2009-03-04",323.16,329,315.38,318.92,7818400,318.92],["2009-03-03",330.07,333.69,322.35,325.48,6524800,325.48],["2009-03-02",333.33,340.7,326,327.16,5788500,327.16],["2009-02-27",332.95,343.82,331.11,337.99,5420000,337.99],["2009-02-26",345.96,352.49,337.16,337.18,5605600,337.18],["2009-02-25",342.15,352.3,338.92,341.64,6439100,341.64],["2009-02-24",331.02,349.62,330.89,345.45,6095900,345.45],["2009-02-23",347,349.8,329.55,330.06,5221100,330.06],["2009-02-20",338.05,348.92,335,346.45,6217100,346.45],["2009-02-19",357.47,359.8,341.41,342.64,4988700,342.64],["2009-02-18",347.24,353.38,340.52,353.11,6024500,353.11],["2009-02-17",346.51,347.09,339.69,342.66,5680400,342.66],["2009-02-13",362.19,362.99,355.23,357.68,4146700,357.68],["2009-02-12",353.16,363.62,351.48,363.05,5550300,363.05],["2009-02-11",358.95,365,353,358.04,5231600,358.04],["2009-02-10",375.98,377.5,357.89,358.51,7103700,358.51],["2009-02-09",371.28,381,367.3,378.77,4977300,378.77],["2009-02-06",356.46,373.81,355.44,371.28,7038100,371.28],["2009-02-05",340.91,355.38,337,353.72,7264400,353.72],["2009-02-04",340.07,354.44,339.17,343,6817400,343],["2009-02-03",342.57,343,333.83,340.45,6556500,340.45],["2009-02-02",334.29,345,332,340.57,5206900,340.57],["2009-01-30",344.69,348.8,336,338.53,4672000,338.53],["2009-01-29",344.54,345.05,340.11,343.32,7283800,343.32],["2009-01-28",337.98,352.33,336.31,348.67,7691400,348.67],["2009-01-27",326.45,333.87,324.27,331.48,4927300,331.48],["2009-01-26",324.85,328,320.56,323.87,4610700,323.87],["2009-01-23",309.27,331.96,304.22,324.7,10732800,324.7],["2009-01-22",298.04,309.35,295.15,306.5,8267000,306.5],["2009-01-21",288.35,303.5,288.35,303.08,4924500,303.08],["2009-01-20",299.14,299.5,282.75,282.75,5048200,282.75],["2009-01-16",305.02,308.25,295.7,299.67,5224400,299.67],["2009-01-15",297.57,303.58,286.79,298.99,5934500,298.99],["2009-01-14",310,313.8,297.75,300.97,5467900,300.97],["2009-01-13",311.77,320.6,310.39,314.32,4432500,314.32],["2009-01-12",316.31,318.95,310.23,312.69,3304300,312.69],["2009-01-09",327.5,327.5,313.4,315.07,4340500,315.07],["2009-01-08",318.28,325.19,317.34,325.19,3600700,325.19],["2009-01-07",328.32,330.91,318.75,322.01,4494500,322.01],["2009-01-06",332.98,340.8,326.39,334.06,6425200,334.06],["2009-01-05",321,331.24,315,328.05,4889000,328.05],["2009-01-02",308.6,321.82,305.5,321.32,3610500,321.32],["2008-12-31",304.2,311,302.61,307.65,2886800,307.65],["2008-12-30",300.8,306.81,298.71,303.11,3843500,303.11],["2008-12-29",300.22,301.38,291.58,297.42,3701900,297.42],["2008-12-26",304.07,305.26,298.31,300.36,1959100,300.36],["2008-12-24",301.48,306.34,298.38,302.95,1921500,302.95],["2008-12-23",300.43,303.31,296.67,298.02,3777700,298.02],["2008-12-22",308.56,309.5,290.63,297.11,3917600,297.11],["2008-12-19",310.99,317.79,309,310.17,5612600,310.17],["2008-12-18",316.7,320.35,309.11,310.28,4763500,310.28],["2008-12-17",318.64,322.13,312.42,315.24,5789700,315.24],["2008-12-16",314.52,329.5,311.27,325.28,7059600,325.28],["2008-12-15",314.01,318.49,305.11,310.67,6737900,310.67],["2008-12-12",295.71,316.47,294,315.76,5722100,315.76],["2008-12-11",304.17,312.88,297.8,300.22,6179200,300.22],["2008-12-10",309.24,314.9,304.51,308.82,5237000,308.82],["2008-12-09",297.69,318,297.01,305.97,6889900,305.97],["2008-12-08",289.99,309.44,282,302.11,8144300,302.11],["2008-12-05",271.02,284.24,264.02,283.99,6521200,283.99],["2008-12-04",276.53,283.49,268.77,274.34,4886600,274.34],["2008-12-03",269.85,281.36,265.34,279.43,5904800,279.43],["2008-12-02",269.73,277.78,262.58,275.11,5839700,275.11],["2008-12-01",286.68,287.38,265.98,265.99,5711200,265.99],["2008-11-28",290.58,296.45,288.28,292.96,2565500,292.96],["2008-11-26",280.28,295.46,276.2,292.09,6356600,292.09],["2008-11-25",268.68,286.66,267.32,282.05,10771200,282.05],["2008-11-24",269.26,269.95,249.01,257.44,10054700,257.44],["2008-11-21",262.51,269.37,247.3,262.43,10244500,262.43],["2008-11-20",274.89,282.94,259.04,259.56,9779400,259.56],["2008-11-19",295.39,300.19,278.58,280.18,7834600,280.18],["2008-11-18",301.57,303.73,285.35,297.42,8346100,297.42],["2008-11-17",303,310.16,297.95,300.12,7543800,300.12],["2008-11-14",303.25,324.99,302.56,310.02,9517100,310.02],["2008-11-13",291.77,313,280,312.08,13234700,312.08],["2008-11-12",302.05,312.49,287.76,291,10051100,291],["2008-11-11",308.69,316.3,300.52,311.46,10146600,311.46],["2008-11-10",328,329.44,309.47,318.78,8080100,318.78],["2008-11-07",333.12,341.15,325.33,331.14,4681300,331.14],["2008-11-06",339.97,344.42,325.81,331.22,8574800,331.22],["2008-11-05",362.15,368.88,341.31,342.24,6946500,342.24],["2008-11-04",353.44,372.36,345.5,366.94,7349900,366.94],["2008-11-03",357.58,362.99,341.43,346.49,5954500,346.49],["2008-10-31",356.16,371.96,354.27,359.36,7423300,359.36],["2008-10-30",368.46,372,358.37,359.69,7988900,359.69],["2008-10-29",365.79,371,352.37,358,9756600,358],["2008-10-28",339.05,369.31,328.51,368.75,8105400,368.75],["2008-10-27",334.81,343,325.6,329.49,6200700,329.49],["2008-10-24",326.47,350.47,324.74,339.29,7359000,339.29],["2008-10-23",353.65,358,337.99,352.32,6478900,352.32],["2008-10-22",356.99,369.69,344,355.67,6560000,355.67],["2008-10-21",372.39,383.78,362,362.75,5782000,362.75],["2008-10-20",379.75,380.98,359.59,379.32,6753400,379.32],["2008-10-17",378.96,386,363.55,372.54,14249200,372.54],["2008-10-16",332.76,356.5,309.44,353.02,16239700,353.02],["2008-10-15",354.65,359,338.83,339.17,6721400,339.17],["2008-10-14",393.53,394.5,357,362.71,7784800,362.71],["2008-10-13",355.79,381.95,345.75,381.02,8905500,381.02],["2008-10-10",313.16,341.89,310.3,332,10597800,332],["2008-10-09",344.52,348.57,321.67,328.98,8075000,328.98],["2008-10-08",330.16,358.99,326.11,338.11,11826400,338.11],["2008-10-07",373.33,374.98,345.37,346.01,11054400,346.01],["2008-10-06",373.98,375.99,357.16,371.21,11220600,371.21],["2008-10-03",397.35,412.5,383.07,386.91,7992900,386.91],["2008-10-02",409.79,409.98,386,390.49,5984900,390.49],["2008-10-01",411.15,416.98,403.1,411.72,6234800,411.72],["2008-09-30",395.98,425.08,392.32,400.52,3086300,400.52],["2008-09-29",419.51,423.51,380.71,381,10762900,381],["2008-09-26",428,437.16,421.03,431.04,5292500,431.04],["2008-09-25",438.84,450,435.98,439.6,5020300,439.6],["2008-09-24",430.34,445,430.11,435.11,4242000,435.11],["2008-09-23",433.25,440.79,425.72,429.27,5204200,429.27],["2008-09-22",454.13,454.13,429,430.14,4407300,430.14],["2008-09-19",461,462.07,443.28,449.15,10006000,449.15],["2008-09-18",422.64,439.18,410.5,439.08,8589400,439.08],["2008-09-17",438.48,439.14,413.44,414.49,9126900,414.49],["2008-09-16",425.96,449.28,425.49,442.93,6990700,442.93],["2008-09-15",424,441.97,423.71,433.86,6567400,433.86],["2008-09-12",430.21,441.99,429,437.66,6028000,437.66],["2008-09-11",408.35,435.09,406.38,433.75,6471400,433.75],["2008-09-10",424.47,424.48,409.68,414.16,6226800,414.16],["2008-09-09",423.17,432.38,415,418.66,7229600,418.66],["2008-09-08",452.02,452.94,417.55,419.95,9017900,419.95],["2008-09-05",445.49,452.46,440.08,444.25,4534300,444.25],["2008-09-04",460,463.24,449.4,450.26,4848500,450.26],["2008-09-03",468.73,474.29,459.58,464.41,4314600,464.41],["2008-09-02",476.77,482.18,461.42,465.25,6111500,465.25],["2008-08-29",469.75,471.01,462.33,463.29,3848200,463.29],["2008-08-28",472.49,476.45,470.33,473.78,3029700,473.78],["2008-08-27",473.73,474.83,464.84,468.58,4387100,468.58],["2008-08-26",483.46,483.46,470.59,474.16,3308200,474.16],["2008-08-25",486.11,497,481.5,483.01,2014300,483.01],["2008-08-22",491.5,494.88,489.48,490.59,2297200,490.59],["2008-08-21",482.92,489.9,479.27,486.53,3514100,486.53],["2008-08-20",494.72,496.69,482.57,485,3982100,485],["2008-08-19",490.43,498.28,486.63,490.5,3046500,490.5],["2008-08-18",509.84,510,495.51,498.3,3333900,498.3],["2008-08-15",506.99,510.66,505.5,510.15,3545700,510.15],["2008-08-14",497.7,507.61,496.29,505.49,2918600,505.49],["2008-08-13",501.6,503.54,493.88,500.03,3625500,500.03],["2008-08-12",502,506.13,498,502.61,2755700,502.61],["2008-08-11",492.47,508.88,491.78,500.84,4239300,500.84],["2008-08-08",480.15,495.75,475.69,495.01,3739300,495.01],["2008-08-07",482,484,476.41,479.12,2773800,479.12],["2008-08-06",478.37,489.77,472.51,486.34,3375800,486.34],["2008-08-05",467.59,480.08,466.33,479.85,3584500,479.85],["2008-08-04",468.12,473.01,461.9,463,2487000,463],["2008-08-01",472.51,473.22,462.5,467.86,3007900,467.86],["2008-07-31",474.56,480.89,471.44,473.75,2865100,473.75],["2008-07-30",485.5,486.02,472.81,482.7,3490700,482.7],["2008-07-29",479.3,487.26,478,483.11,2802800,483.11],["2008-07-28",492.09,492.09,475.13,477.12,3160000,477.12],["2008-07-25",486.49,493.13,481.5,491.98,3183500,491.98],["2008-07-24",496.7,496.87,475.62,475.62,3540900,475.62],["2008-07-23",481.61,497.23,478.1,489.22,4894100,489.22],["2008-07-22",466.72,480.25,465.6,477.11,4691500,477.11],["2008-07-21",480.88,484.09,465.7,468.8,5901500,468.8],["2008-07-18",498.35,498.98,478.19,481.32,11292400,481.32],["2008-07-17",534.16,537.05,524.5,533.44,8787400,533.44],["2008-07-16",514.04,536.5,510.6,535.6,4742200,535.6],["2008-07-15",516.28,527.5,501.1,516.09,6071000,516.09],["2008-07-14",539,540.06,515.45,521.62,4424800,521.62],["2008-07-11",536.5,539.5,519.43,533.8,4981400,533.8],["2008-07-10",545,549.5,530.72,540.57,4331700,540.57],["2008-07-09",550.76,555.68,540.73,541.55,4154000,541.55],["2008-07-08",545.99,555.19,540,554.53,4932400,554.53],["2008-07-07",542.3,549,535.6,543.91,4255200,543.91],["2008-07-03",530.88,539.23,527.5,537,2400500,537],["2008-07-02",536.51,540.38,526.06,527.04,4223000,527.04],["2008-07-01",519.58,536.72,517,534.73,4959900,534.73],["2008-06-30",532.47,538,523.06,526.42,3765300,526.42],["2008-06-27",527.68,530,515.09,528.07,5447500,528.07],["2008-06-26",544.1,544.93,528.26,528.82,5659500,528.82],["2008-06-25",544.97,557.8,543.67,551,4122200,551],["2008-06-24",545.14,551.19,535.1,542.3,4672600,542.3],["2008-06-23",545.36,553.15,542.02,545.21,3635900,545.21],["2008-06-20",556.98,556.98,544.51,546.43,5983100,546.43],["2008-06-19",555.35,563.78,550.81,560.2,5683100,560.2],["2008-06-18",564.51,568.99,559.16,562.38,3381200,562.38],["2008-06-17",576.35,578.07,568.38,569.46,3462900,569.46],["2008-06-16",566.5,579.1,566.5,572.81,3542800,572.81],["2008-06-13",561.49,575.7,561.34,571.51,6184400,571.51],["2008-06-12",548.76,558,546.88,552.95,5491600,552.95],["2008-06-11",556.24,557.34,544.46,545.2,3812900,545.2],["2008-06-10",549.56,558.82,546.78,554.17,3657400,554.17],["2008-06-09",568.06,570,545.4,557.87,5288300,557.87],["2008-06-06",579.75,580.72,567,567,4734500,567],["2008-06-05",577.08,588.04,576.21,586.3,3916700,586.3],["2008-06-04",565.33,578,564.55,572.22,3363200,572.22],["2008-06-03",576.5,580.5,560.61,567.3,4305300,567.3],["2008-06-02",582.5,583.89,571.27,575,3674200,575],["2008-05-30",583.47,589.92,581.3,585.8,3225200,585.8],["2008-05-29",574.79,585.88,573.2,583,4845000,583],["2008-05-28",567.94,571.49,561.1,568.24,4050400,568.24],["2008-05-27",544.96,562.6,543.85,560.9,3865500,560.9],["2008-05-23",546.96,553,537.81,544.62,4431500,544.62],["2008-05-22",551.95,554.21,540.25,549.46,5076300,549.46],["2008-05-21",578.52,581.41,547.89,549.99,6468100,549.99],["2008-05-20",574.63,582.48,572.91,578.6,3313600,578.6],["2008-05-19",578.55,588.88,573.52,577.52,5604500,577.52],["2008-05-16",581.43,584.68,578.32,580.07,4274100,580.07],["2008-05-15",579,582.95,575.61,581,4342700,581],["2008-05-14",586.49,591.19,575.25,576.3,4375800,576.3],["2008-05-13",586.23,587.95,578.55,583,5163500,583],["2008-05-12",574.75,586.75,568.91,584.94,4863900,584.94],["2008-05-09",579,585,571.3,573.2,4484900,573.2],["2008-05-08",586.2,589.3,578.91,583.01,5122900,583.01],["2008-05-07",590.27,599.49,576.43,579,6613000,579],["2008-05-06",591,592,583,586.36,4629300,586.36],["2008-05-05",598.86,599,587.13,594.9,6281000,594.9],["2008-05-02",598.49,602.45,579.3,581.29,6998800,581.29],["2008-05-01",578.31,594.93,576.97,593.08,6602800,593.08],["2008-04-30",562.21,584.86,558.47,574.29,7903000,574.29],["2008-04-29",550.83,563.4,550.01,558.47,4346000,558.47],["2008-04-28",545.88,556.81,539,552.12,4008600,552.12],["2008-04-25",549.02,553,542.73,544.06,4164400,544.06],["2008-04-24",551.29,554.49,540.02,543.04,4135100,543.04],["2008-04-23",557.94,559.31,540.95,546.49,4921500,546.49],["2008-04-22",537.57,560.83,537.56,555,7938500,555],["2008-04-21",539.39,542.59,530.29,537.79,7439700,537.79],["2008-04-18",535.21,547.7,524.77,539.41,18235600,539.41],["2008-04-17",455.63,459.37,446.52,449.54,13353000,449.54],["2008-04-16",444.4,458.28,441,455.03,7630700,455.03],["2008-04-15",458.13,459.72,443.72,446.84,4577600,446.84],["2008-04-14",457.16,457.45,450.15,451.66,3842600,451.66],["2008-04-11",464.07,467.26,455.01,457.45,4169700,457.45],["2008-04-10",464.96,473.86,461.85,469.08,5072400,469.08],["2008-04-09",469.13,472,457.54,464.19,6048100,464.19],["2008-04-08",473.04,474.14,462.01,467.81,4547000,467.81],["2008-04-07",477.03,485.44,473.53,476.82,5943500,476.82],["2008-04-04",457.01,477.83,456.2,471.09,5897200,471.09],["2008-04-03",461.73,463.29,448.13,455.12,6778400,455.12],["2008-04-02",469.9,475.74,460.39,465.7,5999000,465.7],["2008-04-01",447.74,466.5,446.87,465.71,6093100,465.71],["2008-03-31",435.64,442.69,432.01,440.47,4446400,440.47],["2008-03-28",447.46,453.57,434.31,438.08,4376200,438.08],["2008-03-27",446,448.61,440.49,444.08,5832200,444.08],["2008-03-26",452.59,462.87,449.29,458.19,5225700,458.19],["2008-03-25",457.46,457.47,446,450.78,5831600,450.78],["2008-03-24",438.43,465.78,437.72,460.56,6763500,460.56],["2008-03-20",427.32,435.7,417.5,433.55,9913400,433.55],["2008-03-19",441.11,447.5,431.67,432,6179000,432],["2008-03-18",428.98,440.84,425.53,439.16,7237200,439.16],["2008-03-17",427.99,433.71,412.11,419.87,7888200,419.87],["2008-03-14",442.98,449.34,430.62,437.92,6574400,437.92],["2008-03-13",432.67,446.98,428.78,443.01,7726600,443.01],["2008-03-12",440.01,447.88,438.07,440.18,6651900,440.18],["2008-03-11",425.26,440.15,424.65,439.84,8826900,439.84],["2008-03-10",428.83,431,413.04,413.62,7987600,413.62],["2008-03-07",428.88,440,426.24,433.35,8071800,433.35],["2008-03-06",447.69,453.3,431.18,432.7,7470100,432.7],["2008-03-05",445.25,454.17,444,447.7,7436600,447.7],["2008-03-04",450.95,453.36,435.78,444.6,13621700,444.6],["2008-03-03",471.51,472.72,450.11,457.02,7554500,457.02],["2008-02-29",471.87,479.74,464.65,471.18,9425400,471.18],["2008-02-28",470.5,479.09,467.36,475.39,6586900,475.39],["2008-02-27",460.13,475.49,459.64,472.86,10121900,472.86],["2008-02-26",461.2,466.47,446.85,464.19,23287300,464.19],["2008-02-25",505.95,506.5,485.74,486.44,8372800,486.44],["2008-02-22",502.06,509,497.55,507.8,5515900,507.8],["2008-02-21",512.85,513.21,499.5,502.86,5677800,502.86],["2008-02-20",503.51,511.01,498.82,509,6662200,509],["2008-02-19",534.94,535.06,506.5,508.95,6350400,508.95],["2008-02-15",528.31,532.66,524.33,529.64,5240100,529.64],["2008-02-14",538.35,541.04,531,532.25,6476700,532.25],["2008-02-13",522.5,534.99,518.69,534.62,6624700,534.62],["2008-02-12",523.39,530.6,513.03,518.09,6662300,518.09],["2008-02-11",520.52,523.71,513.4,521.16,5826000,521.16],["2008-02-08",509.41,517.73,508.7,516.69,6828900,516.69],["2008-02-07",496.86,514.19,494.76,504.95,7928900,504.95],["2008-02-06",511.14,511.17,497.93,501.71,7636400,501.71],["2008-02-05",489.43,509,488.52,506.8,11203300,506.8],["2008-02-04",509.07,512.78,492.55,495.43,13157100,495.43],["2008-02-01",528.67,536.67,510,515.9,17600500,515.9],["2008-01-31",539.01,573,534.29,564.3,14871300,564.3],["2008-01-30",549.19,560.43,543.51,548.27,7939600,548.27],["2008-01-29",560.47,561.33,540.67,550.52,6283000,550.52],["2008-01-28",570.97,572.24,548.6,555.98,5816700,555.98],["2008-01-25",591.81,595,566.18,566.4,6966000,566.4],["2008-01-24",558.8,579.69,554.14,574.49,9400900,574.49],["2008-01-23",560.71,568,519,548.62,16965700,548.62],["2008-01-22",562.03,597.5,561.2,584.35,9501500,584.35],["2008-01-18",608.36,609.99,598.45,600.25,8539600,600.25],["2008-01-17",620.76,625.74,598.01,600.79,8216800,600.79],["2008-01-16",628.97,639.99,601.93,615.95,10560000,615.95],["2008-01-15",645.9,649.05,635.38,637.65,5568200,637.65],["2008-01-14",651.14,657.4,645.25,653.82,4447500,653.82],["2008-01-11",642.7,649.47,630.11,638.25,4977000,638.25],["2008-01-10",645.01,657.2,640.11,646.73,6334200,646.73],["2008-01-09",630.04,653.34,622.51,653.2,6739700,653.2],["2008-01-08",653,659.96,631,631.68,5339100,631.68],["2008-01-07",653.94,662.28,637.35,649.25,6403400,649.25],["2008-01-04",679.69,680.96,655,657,5359800,657],["2008-01-03",685.26,686.85,676.52,685.33,3252500,685.33],["2008-01-02",692.87,697.37,677.73,685.19,4306900,685.19],["2007-12-31",698.57,702.49,690.58,691.48,2376200,691.48],["2007-12-28",704.93,707.95,696.54,702.53,2562700,702.53],["2007-12-27",707.07,716,700.74,700.74,2942500,700.74],["2007-12-26",698.99,713.22,698.21,710.84,2530000,710.84],["2007-12-24",694.99,700.73,693.06,700.73,1628400,700.73],["2007-12-21",697.88,699.26,693.24,696.69,5382000,696.69],["2007-12-20",685.83,691,680.61,689.69,4422200,689.69],["2007-12-19",674.21,679.5,669,677.37,4421100,677.37],["2007-12-18",674.16,676.71,652.5,673.35,7166700,673.35],["2007-12-17",688,695.42,663.67,669.23,5486000,669.23],["2007-12-14",687.51,699.7,687.26,689.96,3673500,689.96],["2007-12-13",696.31,697.62,681.21,694.05,5040800,694.05],["2007-12-12",714,714.32,688.5,699.35,6159100,699.35],["2007-12-11",719.94,720.99,698.78,699.2,6139100,699.2],["2007-12-10",715.99,724.8,714,718.42,3856200,718.42],["2007-12-07",714.99,718,710.5,714.87,3852100,714.87],["2007-12-06",697.8,716.56,697.01,715.26,4909000,715.26],["2007-12-05",692.73,698.93,687.5,698.51,4209600,698.51],["2007-12-04",678.31,692,677.12,684.16,4231800,684.16],["2007-12-03",691.01,695,681.14,681.53,4325100,681.53],["2007-11-30",711,711.06,682.11,693,7895500,693],["2007-11-29",690.75,702.79,687.77,697,6208000,697],["2007-11-28",682.11,694.3,672.14,692.26,7916500,692.26],["2007-11-27",674.8,676.43,650.26,673.57,8904500,673.57],["2007-11-26",680.2,693.4,665,666,6790100,666],["2007-11-23",670,678.28,668.11,676.7,2738700,676.7],["2007-11-21",643.77,669.97,642.08,660.52,7013500,660.52],["2007-11-20",636.48,659.1,632.87,648.54,9840600,648.54],["2007-11-19",629.59,636.77,618.5,625.85,5527400,625.85],["2007-11-16",633.94,635.49,616.02,633.63,9042800,633.63],["2007-11-15",638.57,647.5,624,629.65,6967700,629.65],["2007-11-14",673.28,675.49,636.27,641.68,8094700,641.68],["2007-11-13",644.99,660.92,632.07,660.55,8426100,660.55],["2007-11-12",657.74,669.93,626.21,632.07,10227300,632.07],["2007-11-09",675.78,681.88,661.21,663.97,11388100,663.97],["2007-11-08",734.6,734.89,677.18,693.84,16512200,693.84],["2007-11-07",741.13,747.24,723.14,732.94,8252900,732.94],["2007-11-06",737.56,741.79,725,741.79,8436300,741.79],["2007-11-05",706.99,730.23,706.07,725.65,8883700,725.65],["2007-11-02",710.51,713.58,697.34,711.25,5841500,711.25],["2007-11-01",702.79,713.72,701.78,703.21,6527200,703.21],["2007-10-31",700.69,707,696.04,707,6876800,707],["2007-10-30",677.51,699.91,677.51,694.77,6900600,694.77],["2007-10-29",677.77,680,672.09,679.23,3066300,679.23],["2007-10-26",674.03,676.54,668.06,674.6,3353900,674.6],["2007-10-25",678.68,678.97,663.55,668.51,5795500,668.51],["2007-10-24",672.71,677.47,659.56,675.82,7404200,675.82],["2007-10-23",661.25,677.6,660,675.77,6793700,675.77],["2007-10-22",638.67,655,636.28,650.75,6664400,650.75],["2007-10-19",654.56,658.49,643.23,644.71,15789000,644.71],["2007-10-18",635.41,641.37,628.5,639.62,12289200,639.62],["2007-10-17",630.45,634,621.59,633.48,6030500,633.48],["2007-10-16",618.49,625.92,611.99,616,6025300,616],["2007-10-15",638.47,639.86,615.55,620.11,6943800,620.11],["2007-10-12",623.98,638.4,618.24,637.39,6823700,637.39],["2007-10-11",633.64,641.41,609,622,11799000,622],["2007-10-10",621.36,625.68,616.8,625.39,5385600,625.39],["2007-10-09",615.11,623.78,608.39,615.18,8767800,615.18],["2007-10-08",595,610.26,593.95,609.62,5028000,609.62],["2007-10-05",587.11,596,587.01,594.05,5068700,594.05],["2007-10-04",585.09,585.09,577.06,579.03,2986700,579.03],["2007-10-03",586.25,588.99,580.36,584.02,3879500,584.02],["2007-10-02",583.38,596.81,580.01,584.39,7067500,584.39],["2007-10-01",569.97,584.35,569.61,582.55,4711300,582.55],["2007-09-28",567,569.55,564.12,567.27,2639500,567.27],["2007-09-27",571.73,571.74,565.78,567.5,2056300,567.5],["2007-09-26",570.4,571.79,563.81,568.16,3346100,568.16],["2007-09-25",564,569.56,562.86,569,2730600,569],["2007-09-24",561,571.46,560,568.02,5297000,568.02],["2007-09-21",556.34,560.79,552.83,560.1,8011700,560.1],["2007-09-20",547,556.8,546.03,552.83,5525000,552.83],["2007-09-19",539.27,549.45,538.86,546.85,5526900,546.85],["2007-09-18",526.52,537.25,524.27,535.27,4215700,535.27],["2007-09-17",526.53,529.28,524.07,525.3,2197500,525.3],["2007-09-14",523.2,530.27,522.22,528.75,2764900,528.75],["2007-09-13",524.06,527.21,523.22,524.78,1891100,524.78],["2007-09-12",520.53,527.98,519,522.65,2986000,522.65],["2007-09-11",516.99,521.65,515.73,521.33,2703600,521.33],["2007-09-10",521.28,522.07,510.88,514.48,3225800,514.48],["2007-09-07",517.86,521.24,516.8,519.35,3663600,519.35],["2007-09-06",529.36,529.83,518.24,523.52,3625900,523.52],["2007-09-05",523.4,529.48,522.25,527.8,3312900,527.8],["2007-09-04",515.02,528,514.62,525.15,3693700,525.15],["2007-08-31",513.1,516.5,511.47,515.25,2977600,515.25],["2007-08-30",512.36,515.4,510.58,511.4,2651700,511.4],["2007-08-29",507.84,513.3,507.23,512.88,2549300,512.88],["2007-08-28",511.53,514.98,505.79,506.4,3273900,506.4],["2007-08-27",514.43,517.45,511.4,513.26,2325100,513.26],["2007-08-24",512.61,515.55,508.5,515,2472700,515],["2007-08-23",516,516.13,507,512.19,3076700,512.19],["2007-08-22",509.96,516.25,509.25,512.75,3252700,512.75],["2007-08-21",498.94,508.16,497.77,506.61,3610600,506.61],["2007-08-20",502.46,502.56,496,497.92,2697300,497.92],["2007-08-17",497.44,501,491.65,500.04,5479400,500.04],["2007-08-16",492.02,496.43,480.46,491.52,8645600,491.52],["2007-08-15",509,511.69,496.71,497.55,5409500,497.55],["2007-08-14",515.72,517.4,508,508.6,3633700,508.6],["2007-08-13",519.54,519.75,513.03,515.5,3179300,515.5],["2007-08-10",510.18,518.72,505.63,515.75,5875200,515.75],["2007-08-09",520.8,526.82,514.63,514.73,4846500,514.73],["2007-08-08",519.34,525.78,517.09,525.78,4068800,525.78],["2007-08-07",509.75,519.88,509.04,516.02,4264300,516.02],["2007-08-06",503,510.15,502.5,510,3651500,510],["2007-08-03",510.05,513.2,503,503,3176200,503],["2007-08-02",513.72,514.99,509,511.01,3154900,511.01],["2007-08-01",510.5,516.51,508.14,512.94,4421500,512.94],["2007-07-31",520.23,520.44,510,510,4270500,510],["2007-07-30",512.92,519.34,510.5,516.11,3963300,516.11],["2007-07-27",508.53,516.62,505.5,511.89,5509100,511.89],["2007-07-26",508.74,512.59,498.88,508,6883400,508],["2007-07-25",516.98,517.02,505.56,509.76,5545000,509.76],["2007-07-24",509.3,518.69,507.11,514,5572100,514],["2007-07-23",519.01,520,512.15,512.51,6356700,512.51],["2007-07-20",511.9,523.18,509.5,520.12,17772300,520.12],["2007-07-19",553.46,553.52,542.24,548.59,11127200,548.59],["2007-07-18",553.89,554.5,543.81,549.5,6080000,549.5],["2007-07-17",555.04,557.73,552.38,555,4328600,555],["2007-07-16",550.3,558.58,549.31,552.99,6599500,552.99],["2007-07-13",547.91,552.67,547.25,552.16,5237100,552.16],["2007-07-12",545.86,547.32,540.22,545.33,3441600,545.33],["2007-07-11",543.61,546.5,540.01,544.47,3309300,544.47],["2007-07-10",543.79,547,541.65,543.34,3856000,543.34],["2007-07-09",543,548.74,540.26,542.56,3729800,542.56],["2007-07-06",541.25,543.87,538.73,539.4,2747000,539.4],["2007-07-05",535.56,544.4,532.15,541.63,4942900,541.63],["2007-07-03",531.06,534.4,527.5,534.34,1871800,534.34],["2007-07-02",525.49,531.85,524.2,530.38,3487600,530.38],["2007-06-29",526.02,527.4,519.46,522.7,3880600,522.7],["2007-06-28",524.88,529.5,523.8,525.01,4168400,525.01],["2007-06-27",525,527.99,519.56,526.29,6123100,526.29],["2007-06-26",532.73,533.2,526.24,530.26,5689500,530.26],["2007-06-25",528.98,534.99,523.38,527.42,7925000,527.42],["2007-06-22",516.42,524.99,516.1,524.98,7203700,524.98],["2007-06-21",510.98,515.29,506.28,514.11,4409700,514.11],["2007-06-20",516.96,518.75,509.06,509.97,4338200,509.97],["2007-06-19",514.01,517.25,511.54,514.31,4355300,514.31],["2007-06-18",506.18,516,504.24,515.2,4835900,515.2],["2007-06-15",508.19,509,501.23,505.89,6174100,505.89],["2007-06-14",505.38,505.88,501.7,502.84,4621200,502.84],["2007-06-13",507.09,508.54,498.69,505.24,7034000,505.24],["2007-06-12",508.71,511.67,503.17,504.77,6419500,504.77],["2007-06-11",514.02,518.25,510,511.34,4647700,511.34],["2007-06-08",516.2,519.64,509.46,515.49,6358200,515.49],["2007-06-07",519.75,526.5,512.51,515.06,10630500,515.06],["2007-06-06",516.75,520.78,515.26,518.25,7886700,518.25],["2007-06-05",509.75,519,506.61,518.84,10447100,518.84],["2007-06-04",497.91,510.51,497.59,507.07,7101000,507.07],["2007-06-01",501,505.02,497.93,500.4,4799000,500.4],["2007-05-31",500.56,508.78,497.06,497.91,8924300,497.91],["2007-05-30",484.5,498.84,483,498.6,7245800,498.6],["2007-05-29",485,491.8,484,487.11,5218000,487.11],["2007-05-25",479.7,484.95,477.27,483.52,5348500,483.52],["2007-05-24",475.15,479.2,471.5,474.33,4173600,474.33],["2007-05-23",480.82,483.41,473.75,473.97,5060200,473.97],["2007-05-22",473,479.01,473,475.86,3839000,475.86],["2007-05-21",469.53,479.2,466.72,470.6,6159300,470.6],["2007-05-18",472.03,472.7,469.75,470.32,3695900,470.32],["2007-05-17",472.46,475.22,470.81,470.96,4660600,470.96],["2007-05-16",462,473.14,459.02,472.61,6554200,472.61],["2007-05-15",461.96,462.54,457.41,458,4119000,458],["2007-05-14",465.48,467.51,460,461.78,3872700,461.78],["2007-05-11",461.83,467,461,466.74,2944100,466.74],["2007-05-10",467.04,469.49,461.02,461.47,3686300,461.47],["2007-05-09",466.15,471.73,463.88,469.25,3889900,469.25],["2007-05-08",466.13,468.17,464.73,466.81,2905100,466.81],["2007-05-07",472.14,472.82,466.47,467.27,3020100,467.27],["2007-05-04",470.12,474.84,465.88,471.12,3950000,471.12],["2007-05-03",466.22,474.07,465.29,473.23,3594200,473.23],["2007-05-02",468.65,471.08,465.73,465.78,3062700,465.78],["2007-05-01",472.19,472.81,464.17,469,3658200,469],["2007-04-30",479.15,481.35,471.38,471.38,3641200,471.38],["2007-04-27",480.07,482.4,478.33,479.01,2925700,479.01],["2007-04-26",478.1,484.45,477.11,481.18,4124900,481.18],["2007-04-25",480,481.37,476.11,477.99,3966800,477.99],["2007-04-24",478.61,479.98,475.55,477.53,3694700,477.53],["2007-04-23",480.1,485,478.26,479.08,5674600,479.08],["2007-04-20",490.52,492.5,482.02,482.48,12161500,482.48],["2007-04-19",474.5,481.95,469.59,471.65,11009600,471.65],["2007-04-18",471.26,479.9,469.53,476.01,5670500,476.01],["2007-04-17",473.8,476.39,471.6,472.8,3210100,472.8],["2007-04-16",468.46,476.99,468.15,474.27,5077900,474.27],["2007-04-13",468.45,468.77,463.36,466.29,2794800,466.29],["2007-04-12",464,468,462.24,467.39,2707900,467.39],["2007-04-11",466.06,469.4,462.61,464.53,3812000,464.53],["2007-04-10",467.09,470.79,465.16,466.5,2979300,466.5],["2007-04-09",472.98,473,465.59,468.21,3062100,468.21],["2007-04-05",471.3,472.09,469.62,471.51,2715800,471.51],["2007-04-04",472.14,473,469.58,471.02,3778800,471.02],["2007-04-03",464.05,474.25,464,472.6,6501800,472.6],["2007-04-02",457.76,458.53,452.12,458.53,3448500,458.53],["2007-03-30",462.1,463.4,456.14,458.16,3380200,458.16],["2007-03-29",464.55,466,455,460.92,3988500,460.92],["2007-03-28",461.87,465.44,460.15,461.88,4591600,461.88],["2007-03-27",463.55,465.23,460.34,463.62,3741200,463.62],["2007-03-26",460.55,465,455.62,465,4710300,465],["2007-03-23",461.45,463.39,457.08,461.83,4111300,461.83],["2007-03-22",455.61,462.17,452.53,462.04,5680700,462.04],["2007-03-21",445.3,456.57,445.21,456.55,5798300,456.55],["2007-03-20",445.79,447.6,443.6,445.28,3421500,445.28],["2007-03-19",443.25,448.5,440.63,447.23,5197700,447.23],["2007-03-16",445.65,446.7,439.89,440.85,5659100,440.85],["2007-03-15",447.86,449.82,443.94,446.19,3944200,446.19],["2007-03-14",443.23,448.66,439,448,8016900,448],["2007-03-13",450.11,451.93,442.83,443.03,6377300,443.03],["2007-03-12",452.57,455.25,451.11,454.75,3465400,454.75],["2007-03-09",458,458.4,450.1,452.96,4977700,452.96],["2007-03-08",459.22,465.5,454.1,454.72,5362800,454.72],["2007-03-07",462.69,463.14,454.29,455.64,6534100,455.64],["2007-03-06",447.47,459,447.38,457.55,7533700,457.55],["2007-03-05",437.02,445.5,437,440.95,6355100,440.95],["2007-03-02",445.11,448.7,438.68,438.68,6583600,438.68],["2007-03-01",442.67,452.42,440,448.23,8685200,448.23],["2007-02-28",450.41,453.67,443.04,449.45,8032300,449.45],["2007-02-27",455,459.8,447.17,448.77,9312800,448.77],["2007-02-26",472.83,475.25,463.75,464.93,3969900,464.93],["2007-02-23",475.75,476.95,467.8,470.62,3882600,470.62],["2007-02-22",478.69,484.24,474.39,475.85,5743900,475.85],["2007-02-21",469.84,478.68,467.74,475.86,5640600,475.86],["2007-02-20",468.47,472.75,464.71,472.1,4067600,472.1],["2007-02-16",462.8,470.15,462.06,469.94,6177000,469.94],["2007-02-15",466,466.13,460.72,461.47,4042400,461.47],["2007-02-14",460,469.13,459.22,465.93,5698800,465.93],["2007-02-13",459.15,462.78,457.26,459.1,4062600,459.1],["2007-02-12",460.68,462.39,455.02,458.29,5754500,458.29],["2007-02-09",471.65,472.68,461.5,461.89,4858600,461.89],["2007-02-08",468.05,473.75,465.15,471.03,4076700,471.03],["2007-02-07",473.82,474.35,468.78,470.01,4119800,470.01],["2007-02-06",468.1,473.3,467.26,471.48,5321900,471.48],["2007-02-05",477.5,478,466.19,467.16,7206900,467.16],["2007-02-02",482.61,485,477.81,481.5,6286500,481.5],["2007-02-01",506,506.01,481.53,481.75,15658700,481.75],["2007-01-31",496.49,505,495.51,501.5,12206100,501.5],["2007-01-30",494,498,491.22,494.32,4180500,494.32],["2007-01-29",498,498.75,490.5,492.47,4775700,492.47],["2007-01-26",490.93,497.9,487.03,495.84,5496500,495.84],["2007-01-25",501,504.5,485.66,488.09,6368500,488.09],["2007-01-24",484.45,499.54,483.29,499.07,6059300,499.07],["2007-01-23",480.79,484.75,477.29,479.05,4665500,479.05],["2007-01-22",492.5,492.65,478.5,480.84,5404300,480.84],["2007-01-19",487.98,490.76,486.74,489.75,4978300,489.75],["2007-01-18",494.52,496.48,487.43,487.83,5932000,487.83],["2007-01-17",503.39,507.77,494.38,497.28,6699100,497.28],["2007-01-16",507.55,513,503.3,504.28,7568900,504.28],["2007-01-12",501.99,505,500,505,4473700,505],["2007-01-11",497.2,501.75,496.18,499.72,7208200,499.72],["2007-01-10",484.43,493.55,482.04,489.46,5968500,489.46],["2007-01-09",485.45,488.25,481.2,485.5,5381400,485.5],["2007-01-08",487.69,489.87,482.2,483.58,4754400,483.58],["2007-01-05",482.5,487.5,478.11,487.19,6872100,487.19],["2007-01-04",469,483.95,468.35,483.26,7887600,483.26],["2007-01-03",466,476.66,461.11,467.59,7706500,467.59],["2006-12-29",462.1,464.47,459.86,460.48,2559200,460.48],["2006-12-28",467.12,468.58,462.25,462.56,3116200,462.56],["2006-12-27",460,468.08,459.1,468.03,4231500,468.03],["2006-12-26",456.52,459.47,454.59,457.53,2074300,457.53],["2006-12-22",457.5,458.64,452.73,455.58,3988300,455.58],["2006-12-21",464.18,465.25,452.34,456.2,6953300,456.2],["2006-12-20",470,471.5,462.33,462.9,4367800,462.9],["2006-12-19",461.72,469.31,458.5,468.63,6587000,468.63],["2006-12-18",482.51,482.74,460.72,462.8,8016600,462.8],["2006-12-15",482.64,484.11,479.84,480.3,5190800,480.3],["2006-12-14",480.25,483.75,477.26,482.12,4748900,482.12],["2006-12-13",484.69,485.5,477.02,478.99,4662100,478.99],["2006-12-12",483.85,486.36,480.28,481.78,4181000,481.78],["2006-12-11",484.92,488.9,483.8,483.93,3263400,483.93],["2006-12-08",481.94,488.6,480,484.11,3974900,484.11],["2006-12-07",490.23,491.8,482.42,482.64,4664300,482.64],["2006-12-06",486.96,492.4,484.52,488.71,4450300,488.71],["2006-12-05",487.4,489.44,484.89,487,4103000,487],["2006-12-04",483,487.43,479.35,484.85,4899900,484.85],["2006-12-01",485.98,488.39,478.5,480.8,5631400,480.8],["2006-11-30",484.19,490.4,481.55,484.81,5577500,484.81],["2006-11-29",494.24,494.74,482.25,484.65,6315300,484.65],["2006-11-28",481.13,489.86,477.03,489.5,7797600,489.5],["2006-11-27",501.37,501.78,484.75,484.75,7324700,484.75],["2006-11-24",504.5,507.5,504,505,1732700,505],["2006-11-22",510.97,513,505.78,508.01,4500700,508.01],["2006-11-21",496.54,510,495.83,509.65,8427500,509.65],["2006-11-20",498.4,498.4,492.65,495.05,5124500,495.05],["2006-11-17",493.25,499.66,493,498.79,5511000,498.79],["2006-11-16",495,497.68,492.56,495.9,5092600,495.9],["2006-11-15",493.43,499.85,491.93,491.93,8370700,491.93],["2006-11-14",480.7,489.95,480.5,489.3,7223400,489.3],["2006-11-13",474.9,481.17,474.14,481.03,4341900,481.03],["2006-11-10",473.78,474.72,470.29,473.55,2796700,473.55],["2006-11-09",476.5,479.49,471.86,472.63,4879200,472.63],["2006-11-08",470.35,481.74,468.6,475,7965000,475],["2006-11-07",476.95,479.02,471.77,472.57,4897100,472.57],["2006-11-06",473.77,479.66,472.33,476.95,4991500,476.95],["2006-11-03",472.23,473.75,465.06,471.8,4907700,471.8],["2006-11-02",467.5,473.73,466.38,469.91,5236700,469.91],["2006-11-01",478.76,479.13,465.26,467.5,5426300,467.5],["2006-10-31",478.06,482.16,473.84,476.39,6285400,476.39],["2006-10-30",474.82,480.46,470.01,476.57,6563100,476.57],["2006-10-27",483.9,485.24,472.49,475.2,6604000,475.2],["2006-10-26",487.68,491.96,484.2,485.1,7031700,485.1],["2006-10-25",477.49,488.5,475.11,486.6,9187500,486.6],["2006-10-24",476.28,477.86,471.41,473.31,8660200,473.31],["2006-10-23",462.28,484.64,460.37,480.78,15104500,480.78],["2006-10-20",458.99,460.1,453.59,459.67,11647900,459.67],["2006-10-19",420.23,429.5,419.57,426.06,11503500,426.06],["2006-10-18",422.99,424.75,417.5,419.31,6017300,419.31],["2006-10-17",420.3,423.75,416.7,420.64,5211000,420.64],["2006-10-16",427.7,429.2,421.34,421.75,4319400,421.75],["2006-10-13",427.76,429.5,425.56,427.3,3622500,427.3],["2006-10-12",428.56,429.68,424,427.44,4844000,427.44],["2006-10-11",425.02,429.91,423.76,426.5,5635400,426.5],["2006-10-10",431.56,437.85,422.39,426.65,9788600,426.65],["2006-10-09",424.8,431.95,423.42,429,7583300,429],["2006-10-06",410.22,421.91,409.75,420.5,7336500,420.5],["2006-10-05",414.7,418.24,410.86,411.81,5789800,411.81],["2006-10-04",404.97,415.77,403.05,415.7,6661800,415.7],["2006-10-03",401.29,406.46,398.19,404.04,5464700,404.04],["2006-10-02",401.9,406,400.8,401.44,3651900,401.44],["2006-09-29",405.13,405.62,401.41,401.9,3310900,401.9],["2006-09-28",404.08,406.98,400.54,403.58,5107400,403.58],["2006-09-27",406.3,411.22,402.37,402.92,5876700,402.92],["2006-09-26",405.5,407.68,401.77,406.87,5289400,406.87],["2006-09-25",405.58,409.45,402.5,403.98,5737300,403.98],["2006-09-22",404.98,407.45,401.36,403.78,4649600,403.78],["2006-09-21",400.3,408.45,399.86,406.85,10692100,406.85],["2006-09-20",407.1,407.39,394.62,397,9147800,397],["2006-09-19",415.46,415.49,392.74,403.81,14292900,403.81],["2006-09-18",410,418.69,409.47,414.69,7106700,414.69],["2006-09-15",407.48,410.05,406.74,409.88,7838200,409.88],["2006-09-14",404.3,406.28,401.93,403.98,5366100,403.98],["2006-09-13",395.15,406.76,395.1,406.57,9768200,406.57],["2006-09-12",385,392.73,384.88,391.9,5442200,391.9],["2006-09-11",378.26,384.69,377.77,384.09,4529200,384.09],["2006-09-08",376.72,380.79,376.72,377.85,3083400,377.85],["2006-09-07",379.39,381.75,377.4,378.49,3842000,378.49],["2006-09-06",382.1,383.19,379.66,380.14,3724100,380.14],["2006-09-05",379.87,385.4,377.44,384.36,4074300,384.36],["2006-09-01",380.99,381.28,377.19,378.6,2672900,378.6],["2006-08-31",381.49,382.15,378.2,378.53,2959900,378.53],["2006-08-30",379.21,384.65,378.51,380.75,4044400,380.75],["2006-08-29",380.78,382.32,377.2,378.95,4460000,378.95],["2006-08-28",375.61,380.95,375,380.95,4164000,380.95],["2006-08-25",373.08,375.32,372.5,373.26,2466700,373.26],["2006-08-24",374.44,376.4,372.26,373.73,3482500,373.73],["2006-08-23",377.64,378.27,372.66,373.43,3642300,373.43],["2006-08-22",377.73,379.26,374.84,378.29,4164100,378.29],["2006-08-21",378.1,379,375.22,377.3,4023300,377.3],["2006-08-18",386.31,387.09,380.75,383.36,4952200,383.36],["2006-08-17",386.39,390,383.92,385.8,5080200,385.8],["2006-08-16",383.48,388.45,382.12,387.72,5853200,387.72],["2006-08-15",374.11,381.67,372.6,380.97,6698200,380.97],["2006-08-14",371.5,375.13,368.67,369.43,4968300,369.43],["2006-08-11",374.4,375.28,368,368.5,3766500,368.5],["2006-08-10",373.88,377.67,372.46,374.2,4261900,374.2],["2006-08-09",382.8,384.68,376.36,376.94,4311000,376.94],["2006-08-08",382.82,384.5,379.09,381,5743200,381],["2006-08-07",371.5,379.73,371.15,377.95,3946900,377.95],["2006-08-04",379.56,380.68,371.75,373.85,5095200,373.85],["2006-08-03",364.98,377.91,363.36,375.39,6327000,375.39],["2006-08-02",375.6,377.17,365.2,367.23,7097800,367.23],["2006-08-01",385.11,385.77,375.51,375.51,5463200,375.51],["2006-07-31",388,389.17,383.31,386.6,4595300,386.6],["2006-07-28",382,389.56,381.73,388.12,4083600,388.12],["2006-07-27",387.37,387.49,377.95,382.4,5641100,382.4],["2006-07-26",388.2,391.91,383,385.5,5531900,385.5],["2006-07-25",385.02,391.31,383.8,389.36,5761100,389.36],["2006-07-24",392.82,393.89,381.21,390.9,8086100,390.9],["2006-07-21",386.14,391.75,377.69,390.11,11754600,390.11],["2006-07-20",404.28,404.44,385.66,387.12,12538700,387.12],["2006-07-19",395.01,401.14,394.66,399,8518500,399],["2006-07-18",409.75,410.57,397.74,403.05,8536800,403.05],["2006-07-17",404.63,411,403.72,407.89,5811900,407.89],["2006-07-14",410.33,411.49,398.61,403.5,7552100,403.5],["2006-07-13",414,418.34,406.83,408.83,6924500,408.83],["2006-07-12",422.09,422.74,416.73,417.25,4906700,417.25],["2006-07-11",418.51,425.05,413.03,424.56,5971300,424.56],["2006-07-10",423.44,425.23,416.38,418.2,4436400,418.2],["2006-07-07",426.05,427.89,415.88,420.45,6041900,420.45],["2006-07-06",423.38,425.38,421.98,423.19,3687100,423.19],["2006-07-05",421.52,422.8,415.64,421.46,4985600,421.46],["2006-07-03",420.04,423.77,419.45,423.2,2156700,423.2],["2006-06-30",415.6,419.33,412.33,419.33,6258000,419.33],["2006-06-29",407.99,418.2,405.82,417.81,6658200,417.81],["2006-06-28",404.01,406.48,401.13,406.11,3710500,406.11],["2006-06-27",405.71,408,401.01,402.32,4107100,402.32],["2006-06-26",406.75,408.3,403.25,404.22,3551200,404.22],["2006-06-23",402.76,409.75,400.74,404.86,5314800,404.86],["2006-06-22",401.58,406,388,399.95,5911900,399.95],["2006-06-21",391.06,404,389.75,402.13,8744400,402.13],["2006-06-20",388.03,391.87,386.51,387.17,4039900,387.17],["2006-06-19",390.85,394.8,386.98,388.14,7633100,388.14],["2006-06-16",389.1,390.93,388,390.7,5304600,390.7],["2006-06-15",386.62,392.25,383,391,6785700,391],["2006-06-14",389.83,391.1,378.52,384.39,7772000,384.39],["2006-06-13",380.9,387,378.12,386.52,7659100,386.52],["2006-06-12",388.34,390.49,381,381.54,5019100,381.54],["2006-06-09",392.19,395.43,385.35,386.57,6157500,386.57],["2006-06-08",387.75,394.27,378.59,393.3,10359500,393.3],["2006-06-07",393.24,394.86,386.5,386.51,8911300,386.51],["2006-06-06",376.58,390,376.3,389.99,10259800,389.99],["2006-06-05",376.18,381.45,374.15,374.44,5558500,374.44],["2006-06-02",386.84,387.08,377.45,379.44,6386400,379.44],["2006-06-01",373.54,382.99,371.6,382.62,6278000,382.62],["2006-05-31",373.8,378.25,366.78,371.82,7981300,371.82],["2006-05-30",378.28,381,371.45,371.94,4316000,371.94],["2006-05-26",384.55,385.88,380.03,381.35,3667000,381.35],["2006-05-25",379.08,383,372.31,382.99,8194600,382.99],["2006-05-24",377.35,383.44,371.61,381.25,9553800,381.25],["2006-05-23",374.21,383.88,373.56,375.58,8983000,375.58],["2006-05-22",367.85,373.03,365.25,370.95,8604400,370.95],["2006-05-19",373.28,374.5,360.57,370.02,11398200,370.02],["2006-05-18",378.78,381.81,370.71,370.99,5835000,370.99],["2006-05-17",370.61,379.84,370.22,374.5,10643800,374.5],["2006-05-16",375.99,376.86,369.89,371.3,6491100,371.3],["2006-05-15",375.93,380.15,368.25,376.2,8590100,376.2],["2006-05-12",383.54,384.87,373.55,374.13,10087600,374.13],["2006-05-11",403.42,404.71,384.98,387,8892800,387],["2006-05-10",408.31,411.71,401.86,402.98,6187200,402.98],["2006-05-09",395.7,409,393.75,408.8,9140600,408.8],["2006-05-08",395.11,397.12,390.05,394.78,5118600,394.78],["2006-05-05",397.6,400.68,391.78,394.3,6065000,394.3],["2006-05-04",395.03,398.87,392.21,394.75,4652000,394.75],["2006-05-03",396.35,401.5,390.88,394.17,8072200,394.17],["2006-05-02",401.08,402.49,388.4,394.8,13104300,394.8],["2006-05-01",418.47,419.44,398.55,398.9,10361200,398.9],["2006-04-28",418.63,425.73,416.3,417.94,7421300,417.94],["2006-04-27",422.91,426.91,419.39,420.03,8337900,420.03],["2006-04-26",427.74,430.04,423.53,425.97,7277800,425.97],["2006-04-25",439.63,441.04,426,427.16,9569000,427.16],["2006-04-24",439.4,444.7,436.52,440.5,8836400,440.5],["2006-04-21",448.9,450.72,436.17,437.1,22551300,437.1],["2006-04-20",411.01,416,408.2,415,12271500,415],["2006-04-19",412.57,413.64,406.73,410.5,6781700,410.5],["2006-04-18",407.93,409.83,401.5,404.24,8137600,404.24],["2006-04-17",403.45,412.5,400.84,406.82,8259500,406.82],["2006-04-13",408.63,409.76,400.5,402.16,6552900,402.16],["2006-04-12",409,411.33,405.19,408.95,6017000,408.95],["2006-04-11",416.42,419.1,406.22,409.66,11107200,409.66],["2006-04-10",407.08,417.17,405.25,416.38,9320100,416.38],["2006-04-07",412.41,412.85,404.02,406.16,7025900,406.16],["2006-04-06",406.49,413.89,405.43,411.18,8598500,411.18],["2006-04-05",408.2,414.57,402.82,407.99,13410500,407.99],["2006-04-04",389.9,404.9,388.14,404.34,15715700,404.34],["2006-04-03",389.53,392.47,387.93,389.7,8122700,389.7],["2006-03-31",388.74,391.87,384.03,390,36521400,390],["2006-03-30",389.19,393.5,383.61,388.44,14711700,388.44],["2006-03-29",379.94,399,379.51,394.98,19027500,394.98],["2006-03-28",371.71,377.86,371.17,377.2,8945800,377.2],["2006-03-27",367.09,371.71,365,369.69,7023700,369.69],["2006-03-24",368.62,370.09,362.51,365.8,15180600,365.8],["2006-03-23",342.35,345.75,340.2,341.89,7434700,341.89],["2006-03-22",339.75,344.1,337.5,340.22,7596000,340.22],["2006-03-21",350.01,351.66,339.08,339.92,9831100,339.92],["2006-03-20",342.34,350.09,341.54,348.19,10407600,348.19],["2006-03-17",338.8,341.78,334.93,339.79,8551700,339.79],["2006-03-16",348.61,348.75,337.9,338.77,10016700,338.77],["2006-03-15",350.77,352.3,340.53,344.5,12768800,344.5],["2006-03-14",337.14,352.37,332.62,351.16,18450700,351.16],["2006-03-13",340.93,346.1,335.45,337.06,13642400,337.06],["2006-03-10",343.5,344.5,331.55,337.5,19325600,337.5],["2006-03-09",355.39,358.53,341.5,343,13910400,343],["2006-03-08",353.93,360.03,350.54,353.88,11745600,353.88],["2006-03-07",365.02,368.45,358.15,364.45,10378800,364.45],["2006-03-06",380.91,383.4,367.14,368.1,8939700,368.1],["2006-03-03",384.3,387.24,375.76,378.18,11962000,378.18],["2006-03-02",364.28,381.1,362.2,376.45,18330300,376.45],["2006-03-01",368.56,369.45,361.3,364.8,12061200,364.8],["2006-02-28",393.2,397.54,338.51,362.62,39437600,362.62],["2006-02-27",381.27,391.7,380.28,390.38,10212200,390.38],["2006-02-24",377.3,380.07,373.49,377.4,6484300,377.4],["2006-02-23",365.61,381.24,365.39,378.07,12551600,378.07],["2006-02-22",367.15,368.95,363.86,365.49,6476200,365.49],["2006-02-21",366.44,373.54,365.11,366.59,8686000,366.59],["2006-02-17",369.86,372.14,363.62,368.75,14320200,368.75],["2006-02-16",345.67,367,344.49,366.46,21315500,366.46],["2006-02-15",341.27,346,337.83,342.38,12947000,342.38],["2006-02-14",345.33,351.69,342.4,343.32,14654000,343.32],["2006-02-13",346.64,350.6,341.89,345.7,19717800,345.7],["2006-02-10",361.95,364.5,353.14,362.61,15223500,362.61],["2006-02-09",371.2,374.4,356.11,358.77,11912400,358.77],["2006-02-08",368.48,370.69,354.67,369.08,20804100,369.08],["2006-02-07",382.99,383.7,363.35,367.92,16630200,367.92],["2006-02-06",385.31,389.9,379.56,385.1,8940400,385.1],["2006-02-03",393.62,393.9,372.57,381.55,18281800,381.55],["2006-02-02",403.82,406.5,395.98,396.04,11807700,396.04],["2006-02-01",389.03,402,387.52,401.78,27122500,401.78],["2006-01-31",430.57,439.6,423.97,432.66,22066000,432.66],["2006-01-30",429.23,433.28,425,426.82,8588900,426.82],["2006-01-27",435,438.22,428.98,433.49,8452200,433.49],["2006-01-26",439.54,439.99,423.56,434.27,12926100,434.27],["2006-01-25",451.26,454.23,429.22,433,18739800,433],["2006-01-24",436.03,444.95,434.48,443.03,15464600,443.03],["2006-01-23",407.38,428.39,405.73,427.5,22741400,427.5],["2006-01-20",438.7,440.03,394.74,399.46,41116700,399.46],["2006-01-19",451.17,453.49,433,436.45,14537300,436.45],["2006-01-18",447.3,457.36,443.25,444.91,20485700,444.91],["2006-01-17",463.06,469.9,462.53,467.11,8270300,467.11],["2006-01-13",464.31,466.89,461.61,466.25,7656600,466.25],["2006-01-12",473.72,474.99,461.5,463.63,10125300,463.63],["2006-01-11",471.27,475.11,469.18,471.63,9007400,471.63],["2006-01-10",464.42,470.25,462.04,469.76,9097100,469.76],["2006-01-09",466.41,473.4,460.94,466.9,12791900,466.9],["2006-01-06",456.87,470.5,453.24,465.66,17756900,465.66],["2006-01-05",446,451.55,441.5,451.24,10808300,451.24],["2006-01-04",443.9,448.96,439.75,445.24,15286400,445.24],["2006-01-03",422.52,435.67,418.22,435.23,13121200,435.23],["2005-12-30",417.27,418.21,413.74,414.86,7587100,414.86],["2005-12-29",427.98,428.73,419.17,420.15,6945800,420.15],["2005-12-28",424.34,427.78,421.26,426.69,7117900,426.69],["2005-12-27",431.86,431.86,422.76,424.64,6702800,424.64],["2005-12-23",432.15,432.5,428.78,430.93,4595100,430.93],["2005-12-22",431.77,432.86,425.93,432.04,7546600,432.04],["2005-12-21",433.55,436.86,420.71,426.33,11221900,426.33],["2005-12-20",427.86,432.2,424.67,429.74,10084700,429.74],["2005-12-19",432.2,446.21,420.11,424.6,21936800,424.6],["2005-12-16",425.34,432.5,422.75,430.15,16330500,430.15],["2005-12-15",419.11,423.14,416.5,422.55,6045800,422.55],["2005-12-14",417.04,419.73,415.49,418.96,6630400,418.96],["2005-12-13",412.5,418,411.64,417.49,8157000,417.49],["2005-12-12",414.63,415.21,409.95,412.61,6950100,412.61],["2005-12-09",415,415.78,408.56,409.2,7643400,409.2],["2005-12-08",405.3,410.65,402.64,410.65,8910100,410.65],["2005-12-07",406.16,406.7,399.01,404.22,11665900,404.22],["2005-12-06",408.7,416.41,401.7,404.54,15114700,404.54],["2005-12-05",417,417.5,404.28,405.85,10289400,405.85],["2005-12-02",416.94,419.53,413.86,417.7,7543500,417.7],["2005-12-01",409.2,415.44,408.29,414.09,9744900,414.09],["2005-11-30",404.26,408.45,395.56,404.91,15596600,404.91],["2005-11-29",424.46,426.4,402.14,403.54,21495800,403.54],["2005-11-28",429.82,431.24,422.44,423.48,11008400,423.48],["2005-11-25",425.78,428.75,425.3,428.62,4840100,428.62],["2005-11-23",417.04,424.72,415.78,422.86,10085000,422.86],["2005-11-22",408.65,417.31,406.23,416.47,9596000,416.47],["2005-11-21",399.17,409.98,393.49,409.36,10335100,409.36],["2005-11-18",403.49,404.5,399.85,400.21,7025700,400.21],["2005-11-17",401.8,403.81,399.53,403.45,9212200,403.45],["2005-11-16",396.2,398.85,394.11,398.15,8695200,398.15],["2005-11-15",394.38,397,390.95,392.8,8624900,392.8],["2005-11-14",392.12,398.22,391.53,396.97,7807900,396.97],["2005-11-11",395.12,396.9,388.85,390.4,7063900,390.4],["2005-11-10",378.36,391.35,377.43,391.1,9128700,391.1],["2005-11-09",386.67,388.29,378.03,379.15,10466900,379.15],["2005-11-08",394.25,395.59,388.58,389.9,7897500,389.9],["2005-11-07",395.1,397.47,392.15,395.03,9591500,395.03],["2005-11-04",389.98,391.79,385.45,390.43,8824900,390.43],["2005-11-03",382.41,386.58,381.38,385.95,7448400,385.95],["2005-11-02",381.7,385,377.17,379.68,10565400,379.68],["2005-11-01",371.86,383.9,369.01,379.38,16356100,379.38],["2005-10-31",360.24,374.75,359.51,372.14,14342900,372.14],["2005-10-28",355.27,358.95,355.02,358.17,5903500,358.17],["2005-10-27",356.6,357.09,351.68,353.06,5134400,353.06],["2005-10-26",346.28,356,346.19,355.44,8907500,355.44],["2005-10-25",345.78,347.4,342.86,346.91,6878300,346.91],["2005-10-24",343.37,349.3,342.19,348.65,9431700,348.65],["2005-10-21",345.8,346.43,333,339.9,22892400,339.9],["2005-10-20",309.99,311.13,301.21,303.2,13911700,303.2],["2005-10-19",304,309.87,303.96,308.7,7010700,308.7],["2005-10-18",304.96,307.96,302.74,303.28,7077800,303.28],["2005-10-17",297.5,305.2,294.56,305,7566700,305],["2005-10-14",299.9,300.23,292.54,296.14,8519100,296.14],["2005-10-13",302,302,290.68,297.44,10567700,297.44],["2005-10-12",305.2,307.19,299,300.97,9306200,300.97],["2005-10-11",310.61,312.65,304.86,306.1,8542600,306.1],["2005-10-10",313.31,314.82,309.15,310.65,5572200,310.65],["2005-10-07",314.79,316.67,310.54,312.99,6770300,312.99],["2005-10-06",314.14,314.48,310.09,312.75,7993800,312.75],["2005-10-05",312.69,314.9,308,310.71,8328400,310.71],["2005-10-04",319.95,321.28,310.74,311,9144300,311],["2005-10-03",313.63,320.11,312.79,318.68,9160300,318.68],["2005-09-30",314.22,317.5,312.29,316.46,9151300,316.46],["2005-09-29",306.68,310.72,306.08,309.62,5613800,309.62],["2005-09-28",314.22,315.1,305.6,306,7997400,306],["2005-09-27",314.95,318.41,313.38,313.94,6873100,313.94],["2005-09-26",319.5,320.95,312.56,314.28,9894400,314.28],["2005-09-23",313,317.21,312.59,315.36,8483800,315.36],["2005-09-22",311.5,319.22,310.17,311.37,13006400,311.37],["2005-09-21",308.41,313.76,305.96,311.9,10119700,311.9],["2005-09-20",306.15,311.3,305.23,307.91,9351000,307.91],["2005-09-19",301,306,300.71,303.79,5761900,303.79],["2005-09-16",304.02,304.5,299.87,300.2,7579800,300.2],["2005-09-15",299.52,306.75,297.91,302.62,15466200,302.62],["2005-09-14",308.73,313.28,300.3,303,11275800,303],["2005-09-13",309,315.53,306.17,311.68,10299900,311.68],["2005-09-12",301.75,311.42,301,309.74,10386500,309.74],["2005-09-09",297.28,299.1,296.56,299.09,4390500,299.09],["2005-09-08",294.83,299.28,293.36,295.39,6613300,295.39],["2005-09-07",285.89,295.5,285.28,294.87,7499500,294.87],["2005-09-06",289,289.39,286.8,287.11,4212300,287.11],["2005-09-02",286.51,289.99,286.44,288.45,3434500,288.45],["2005-09-01",285.91,287.5,285,286.25,2742100,286.25],["2005-08-31",288.23,288.5,284.36,286,5034000,286],["2005-08-30",287.39,289.51,285.88,287.27,4792000,287.27],["2005-08-29",282.24,289.12,282.24,288.45,5903000,288.45],["2005-08-26",283.48,285.02,282.66,283.58,3755300,283.58],["2005-08-25",282.55,284,279.97,282.59,4376600,282.59],["2005-08-24",277.57,284.75,276.45,282.57,8593100,282.57],["2005-08-23",276.16,279.74,274.12,279.58,5821700,279.58],["2005-08-22",281.24,281.47,273.35,274.01,6813000,274.01],["2005-08-19",280.99,281.45,279.62,280,5542900,280],["2005-08-18",275.91,280.5,275,279.99,11872800,279.99],["2005-08-17",285.51,286.57,284,285.1,3883300,285.1],["2005-08-16",284.88,287.79,283.34,285.65,7109200,285.65],["2005-08-15",289.8,292.77,283.77,284,8174700,284],["2005-08-12",283.36,290.2,281.64,289.72,6585900,289.72],["2005-08-11",285.89,286.58,280.62,284.05,7514900,284.05],["2005-08-10",291.3,292.33,284.88,285.68,6879000,285.68],["2005-08-09",291.96,292.68,288.51,291.57,5779300,291.57],["2005-08-08",293.6,295.65,290.49,291.25,4481800,291.25],["2005-08-05",297.5,298.51,291.31,292.35,5939700,292.35],["2005-08-04",295.55,299,295.25,297.73,5236500,297.73],["2005-08-03",298,299.72,295.6,297.3,5930600,297.3],["2005-08-02",291.6,299.52,291.12,299.19,7290200,299.19],["2005-08-01",288.12,292.5,288.1,291.61,5662400,291.61],["2005-07-29",292.14,292.84,286.99,287.76,8363300,287.76],["2005-07-28",297.41,297.41,293.28,293.5,5925600,293.5],["2005-07-27",297.74,298.23,292.4,296.93,7217900,296.93],["2005-07-26",295.01,298,292.09,296.09,9816900,296.09],["2005-07-25",302.39,303.29,294.96,295.85,9658800,295.85],["2005-07-22",306.37,309.25,296.33,302.4,23386800,302.4],["2005-07-21",314.05,317.8,311.21,313.94,19789400,313.94],["2005-07-20",305.57,312.61,301.8,312,14310400,312],["2005-07-19",302.1,310.35,301.8,309.9,12621400,309.9],["2005-07-18",300,301.9,297.75,299.54,6207800,299.54],["2005-07-15",301.24,303.4,299.78,301.19,8438400,301.19],["2005-07-14",305.34,306.75,300.07,300.89,10667700,300.89],["2005-07-13",292.51,299.24,292.1,298.86,11437900,298.86],["2005-07-12",293.39,294.4,290.93,291.78,5864900,291.78],["2005-07-11",296.4,296.6,291.02,293.35,8390300,293.35],["2005-07-08",296.25,297.5,294.05,296.23,7457600,296.23],["2005-07-07",289.39,295.8,288.51,295.54,10672100,295.54],["2005-07-06",297.3,297.6,291.38,291.52,8000300,291.52],["2005-07-05",292.1,295.98,290.23,295.71,7494000,295.71],["2005-07-01",295.04,296.24,289.22,291.25,9227600,291.25],["2005-06-30",294.34,298.93,291.04,294.15,15094400,294.15],["2005-06-29",302.5,304.38,292.15,292.72,18298700,292.72],["2005-06-28",306.28,309.25,302,302,19036500,302],["2005-06-27",298.9,304.47,293.86,304.1,17802900,304.1],["2005-06-24",290.9,298,289.58,297.25,17771200,297.25],["2005-06-23",288,294.81,286.5,289.71,14056400,289.71],["2005-06-22",289.67,292.32,288.67,289.3,10474000,289.3],["2005-06-21",288.07,290.3,284.97,287.84,15132300,287.84],["2005-06-20",276.09,287.67,271.73,286.7,21024700,286.7],["2005-06-17",279,280.3,275.9,280.3,10434400,280.3],["2005-06-16",274.26,278.3,273.07,277.44,12462400,277.44],["2005-06-15",275,277.3,267.43,274.8,20883100,274.8],["2005-06-14",278.59,281.24,277.75,278.35,10091900,278.35],["2005-06-13",279.82,284.19,276.52,282.75,12803200,282.75],["2005-06-10",286.99,287.28,280.02,282.5,12696600,282.5],["2005-06-09",284.72,288.5,280.56,286.31,16441100,286.31],["2005-06-08",292.85,293.19,278,279.56,25700900,279.56],["2005-06-07",297.1,299.59,290.3,293.12,24323000,293.12],["2005-06-06",282.39,293.75,281.83,290.94,22525900,290.94],["2005-06-03",286.79,289.3,277.41,280.26,18782300,280.26],["2005-06-02",288.73,289.78,284.6,287.9,17974100,287.9],["2005-06-01",283.2,292.89,282.02,288,35191700,288],["2005-05-31",269.43,278.4,269.37,277.27,22236800,277.27],["2005-05-27",260.46,266.05,259.25,266,12184100,266],["2005-05-26",260.96,263.76,258.3,259.2,13546600,259.2],["2005-05-25",252.73,260.98,250.63,260.81,18057900,260.81],["2005-05-24",256.96,265.44,253.5,256,29043100,256],["2005-05-23",243.16,258.1,242.71,255.45,21388300,255.45],["2005-05-20",241.21,241.67,239.65,241.61,8163500,241.61],["2005-05-19",240.34,241.17,238.27,239.18,9716500,239.18],["2005-05-18",233.61,239.97,233.52,239.16,12312000,239.16],["2005-05-17",230.56,233.45,230.2,233.13,7808900,233.13],["2005-05-16",229.68,231.62,228.57,231.05,5681400,231.05],["2005-05-13",229.18,231.09,227.32,229.24,7415500,229.24],["2005-05-12",230.81,232.23,228.2,228.72,8948200,228.72],["2005-05-11",228.97,231.98,227.93,231.29,11478800,231.29],["2005-05-10",225.47,227.8,224.72,227.8,6345800,227.8],["2005-05-09",228,228.5,225.43,226.02,5536800,226.02],["2005-05-06",228.4,229.25,226.47,228.02,6763900,228.02],["2005-05-05",228.62,228.62,225.88,226.98,7509600,226.98],["2005-05-04",227.23,229.88,227,228.5,12083500,228.5],["2005-05-03",221.85,228.15,221.32,226.19,17780200,226.19],["2005-05-02",222.05,223.7,220.21,222.29,9767400,222.29],["2005-04-29",221.91,222.25,217.82,220,9170200,220],["2005-04-28",219.5,222.08,217.71,219.45,8682800,219.45],["2005-04-27",217.99,220.85,216.74,219.78,10264800,219.78],["2005-04-26",220.22,222,218.29,218.75,17272000,218.75],["2005-04-25",217.82,224.74,217.52,223.53,19840000,223.53],["2005-04-22",222.9,224,214.26,215.81,33205100,215.81],["2005-04-21",200.42,205,199.32,204.22,17751900,204.22],["2005-04-20",198.58,200.5,195.91,198.1,15451500,198.1],["2005-04-19",189.33,192,188.03,191.4,8430000,191.4],["2005-04-18",184.58,187.88,183.49,186.97,6550300,186.97],["2005-04-15",190.1,190.34,184.66,185,11577400,185],["2005-04-14",193.27,194.36,190.1,191.45,6152700,191.45],["2005-04-13",193.47,194.32,189.73,192.93,6555800,192.93],["2005-04-12",193,194.42,189.41,193.96,7319600,193.96],["2005-04-11",193.09,194.8,192.32,193.23,5410500,193.23],["2005-04-08",193.69,195.1,191.45,192.05,5116600,192.05],["2005-04-07",188.78,194.62,188.64,193.76,9692200,193.76],["2005-04-06",189.24,189.65,187.58,189.22,5252600,189.22],["2005-04-05",187.73,190.26,187.57,188.57,8736700,188.57],["2005-04-04",179.95,185.32,179.84,185.29,8076400,185.29],["2005-04-01",181.76,182.95,179.99,180.04,6182000,180.04],["2005-03-31",177.95,181.39,177.64,180.51,6768600,180.51],["2005-03-30",180.64,181.45,179.6,180.45,6236100,180.45],["2005-03-29",181.05,183.28,178.07,179.57,6473000,179.57],["2005-03-28",181.68,184.8,180.95,181.42,8738000,181.42],["2005-03-24",180.7,180.86,179.2,179.25,3705200,179.25],["2005-03-23",177.97,180.24,177.97,178.98,4845000,178.98],["2005-03-22",181.18,181.94,177.85,178.6,5631700,178.6],["2005-03-21",179.27,182.17,177.25,180.88,7483700,180.88],["2005-03-18",178.81,180.4,178.31,180.04,7090000,180.04],["2005-03-17",177.13,179.64,175.8,179.29,8260600,179.29],["2005-03-16",176.7,178.61,175.01,175.6,7106300,175.6],["2005-03-15",175.3,180,174.21,178.61,10422100,178.61],["2005-03-14",178.33,178.4,172.57,174.99,11146600,174.99],["2005-03-11",180.44,180.95,177.15,177.8,8028300,177.8],["2005-03-10",181.01,181.2,177.4,179.98,10960500,179.98],["2005-03-09",184.21,184.65,180.16,181.35,11360400,181.35],["2005-03-08",189.1,189.85,184.97,185.2,8046100,185.2],["2005-03-07",187.78,189.6,187.03,188.81,8667400,188.81],["2005-03-04",186.7,187.25,185.07,185.9,6774100,185.9],["2005-03-03",186.13,187.75,184.31,187.01,7608600,187.01],["2005-03-02",185.95,187.67,184.36,185.18,7285500,185.18],["2005-03-01",189.29,189.75,182,186.06,9311200,186.06],["2005-02-28",186,189.87,185.85,187.99,7818400,187.99],["2005-02-25",189.15,189.92,185.51,185.87,9973500,185.87],["2005-02-24",183.37,189.85,182.23,188.89,25814300,188.89],["2005-02-23",193.3,194.48,188.66,193.95,15586000,193.95],["2005-02-22",196.5,198.9,190.39,191.37,13483700,191.37],["2005-02-18",198.51,198.84,196.66,197.95,8485900,197.95],["2005-02-17",197.83,199.75,196.81,197.9,10414400,197.9],["2005-02-16",194.7,199.33,194.3,198.41,16532300,198.41],["2005-02-15",193.6,199.84,193.08,195.23,25782800,195.23],["2005-02-14",182.85,193.08,181,192.99,38562200,192.99],["2005-02-11",186.66,192.32,186.07,187.4,13116000,187.4],["2005-02-10",191.97,192.21,185.25,187.98,18982700,187.98],["2005-02-09",200.76,201.6,189.46,191.58,17171500,191.58],["2005-02-08",196.96,200.02,194.53,198.64,11480000,198.64],["2005-02-07",205.26,206.4,195.51,196.03,12960400,196.03],["2005-02-04",206.47,207.75,202.6,204.36,14819300,204.36],["2005-02-03",205.99,213.37,205.81,210.86,12988100,210.86],["2005-02-02",215.55,216.8,203.66,205.96,32799300,205.96],["2005-02-01",194.38,196.66,190.63,191.9,18839000,191.9],["2005-01-31",193.69,196.36,191.72,195.62,9596700,195.62],["2005-01-28",190.02,194.7,186.34,190.34,12208200,190.34],["2005-01-27",188.76,188.86,185.2,188.08,6627400,188.08],["2005-01-26",179.27,189.41,179.15,189.24,12307900,189.24],["2005-01-25",181.94,182.24,176.29,177.12,10659200,177.12],["2005-01-24",188.69,189.33,180.32,180.72,14022700,180.72],["2005-01-21",194.54,195.36,188.12,188.28,9258400,188.28],["2005-01-20",192.5,196.25,192,193.92,9001600,193.92],["2005-01-19",204.65,205.3,196.71,197.3,11257700,197.3],["2005-01-18",200.97,205.02,198.66,203.9,13172600,203.9],["2005-01-14",196,200.01,194.13,199.97,9640300,199.97],["2005-01-13",195.38,197.39,194.05,195.33,6849400,195.33],["2005-01-12",194.33,195.93,190.5,195.38,8177800,195.38],["2005-01-11",195.62,197.71,193.18,193.54,6958700,193.54],["2005-01-10",194.5,198.1,191.83,195.06,7539600,195.06],["2005-01-07",190.64,194.25,188.78,193.85,9662900,193.85],["2005-01-06",195.08,195.9,187.72,188.55,10387100,188.55],["2005-01-05",193.45,196.9,192.23,193.51,8236600,193.51],["2005-01-04",201.4,202.93,193.48,194.5,13755900,194.5],["2005-01-03",197.4,203.64,195.46,202.71,15844200,202.71],["2004-12-31",199.23,199.88,192.56,192.79,7668500,192.79],["2004-12-30",192.97,198.23,191.85,197.6,5904300,197.6],["2004-12-29",191.78,193.52,191.78,192.9,2678100,192.9],["2004-12-28",192.11,193.55,191.01,192.76,4145800,192.76],["2004-12-27",189.15,193.3,189.1,191.91,6104100,191.91],["2004-12-23",187.45,188.6,186,187.9,3614600,187.9],["2004-12-22",183.9,186.85,183.01,186.3,3907000,186.3],["2004-12-21",186.31,187.88,183.4,183.75,5516300,183.75],["2004-12-20",182,188.46,181.87,185.02,9834500,185.02],["2004-12-17",176.76,180.5,176.55,180.08,7386200,180.08],["2004-12-16",176.95,180.49,175.95,176.47,8572800,176.47],["2004-12-15",177.99,180.69,176.66,179.78,11471000,179.78],["2004-12-14",171,178.82,169.6,178.69,11088400,178.69],["2004-12-13",172.17,173.18,169.45,170.45,4818600,170.45],["2004-12-10",173.43,174.88,171.29,171.65,4317200,171.65],["2004-12-09",170.25,173.5,168.47,173.43,7654000,173.43],["2004-12-08",170.35,173.68,168.73,169.98,7541800,169.98],["2004-12-07",176,176.2,170.55,171.43,6870900,171.43],["2004-12-06",179.13,180.7,176.02,176.29,6254000,176.29],["2004-12-03",179.95,181.06,177.6,180.4,5869200,180.4],["2004-12-02",179.9,181.51,178.55,179.4,6260900,179.4],["2004-12-01",181.95,182.5,179.55,179.96,7864100,179.96],["2004-11-30",180.71,183,180.25,181.98,7700000,181.98],["2004-11-29",180.36,182.95,177.51,181.05,10666600,181.05],["2004-11-26",175.8,180.03,175.32,179.39,6480100,179.39],["2004-11-24",174.82,177.21,172.51,174.76,15281000,174.76],["2004-11-23",167.97,170.83,166.5,167.52,12413300,167.52],["2004-11-22",164.47,169.5,161.31,165.1,12368200,165.1],["2004-11-19",169.1,169.98,166.52,169.4,8769300,169.4],["2004-11-18",170.29,174.42,165.73,167.54,16629600,167.54],["2004-11-17",169.02,177.5,169,172.5,18132900,172.5],["2004-11-16",177.5,179.47,170.83,172.54,20917400,172.54],["2004-11-15",180.45,188.32,178.75,184.87,11901500,184.87],["2004-11-12",185.23,189.8,177.4,182,16746100,182],["2004-11-11",169.13,183.75,167.57,183.02,14985500,183.02],["2004-11-10",170.67,172.52,166.33,167.86,10644000,167.86],["2004-11-09",174.1,175.2,165.27,168.7,11064200,168.7],["2004-11-08",170.93,175.44,169.4,172.55,11191800,172.55],["2004-11-05",181.98,182.3,168.55,169.35,19833100,169.35],["2004-11-04",188.44,190.4,183.35,184.7,14409600,184.7],["2004-11-03",198.18,201.6,190.75,191.67,13888700,191.67],["2004-11-02",198.78,199.25,193.34,194.87,11346300,194.87],["2004-11-01",193.55,197.67,191.27,196.03,12224900,196.03],["2004-10-29",198.89,199.95,190.6,190.64,21162500,190.64],["2004-10-28",186.68,194.39,185.6,193.3,14846800,193.3],["2004-10-27",182.72,189.52,181.77,185.97,13356500,185.97],["2004-10-26",186.34,192.64,180,181.8,22307100,181.8],["2004-10-25",176.4,194.43,172.55,187.4,32764200,187.4],["2004-10-22",170.54,180.17,164.08,172.43,36891900,172.43],["2004-10-21",144.4,150.13,141.62,149.38,14589500,149.38],["2004-10-20",148.03,148.99,139.6,140.49,11372700,140.49],["2004-10-19",150.5,152.4,147.35,147.94,9064000,147.94],["2004-10-18",143.2,149.2,141.21,149.16,7025200,149.16],["2004-10-15",144.93,145.5,141.95,144.11,6604000,144.11],["2004-10-14",141.01,142.38,138.56,142,5226300,142],["2004-10-13",143.32,143.55,140.08,140.9,9893000,140.9],["2004-10-12",134.44,137.61,133.4,137.4,5838600,137.4],["2004-10-11",137,138.86,133.85,135.26,5241300,135.26],["2004-10-08",138.72,139.68,137.02,137.73,5540300,137.73],["2004-10-07",136.92,139.88,136.55,138.85,7064600,138.85],["2004-10-06",137.55,138.45,136,137.08,6697400,137.08],["2004-10-05",134.66,138.53,132.24,138.37,7494100,138.37],["2004-10-04",135.25,136.87,134.03,135.06,6517900,135.06],["2004-10-01",130.8,134.24,128.9,132.58,7570000,132.58],["2004-09-30",129.9,132.3,129,129.6,6885900,129.6],["2004-09-29",126.7,135.02,126.23,131.08,15273500,131.08],["2004-09-28",121.3,127.4,120.21,126.86,8473000,126.86],["2004-09-27",119.56,120.88,117.8,118.26,3536600,118.26],["2004-09-24",120.94,124.1,119.76,119.83,4566300,119.83],["2004-09-23",118.84,122.63,117.02,120.82,4272100,120.82],["2004-09-22",117.4,119.67,116.81,118.38,3794400,118.38],["2004-09-21",119.81,120.42,117.51,117.84,3618000,117.84],["2004-09-20",116.95,121.6,116.77,119.36,5319700,119.36],["2004-09-17",114.42,117.49,113.55,117.49,4741000,117.49],["2004-09-16",112.34,115.8,111.65,113.97,4637800,113.97],["2004-09-15",110.56,114.23,110.2,112,5361900,112],["2004-09-14",107.45,112,106.79,111.49,5419900,111.49],["2004-09-13",106.63,108.41,106.46,107.5,3926000,107.5],["2004-09-10",101.6,106.56,101.3,105.33,4353800,105.33],["2004-09-09",102.53,102.71,101,102.31,2032900,102.31],["2004-09-08",100.74,103.03,100.5,102.3,2495300,102.3],["2004-09-07",101.01,102,99.61,101.58,2926700,101.58],["2004-09-03",100.95,101.74,99.32,100.01,2578800,100.01],["2004-09-02",99.19,102.37,98.94,101.51,7566900,101.51],["2004-09-01",102.7,102.97,99.67,100.25,4573700,100.25],["2004-08-31",102.3,103.71,102.16,102.37,2461400,102.37],["2004-08-30",105.28,105.49,102.01,102.01,2601000,102.01],["2004-08-27",108.1,108.62,105.69,106.15,3109000,106.15],["2004-08-26",104.95,107.95,104.66,107.91,3551000,107.91],["2004-08-25",104.96,108,103.88,106,4598900,106],["2004-08-24",111.24,111.6,103.57,104.87,7631300,104.87],["2004-08-23",110.75,113.48,109.05,109.4,9137200,109.4],["2004-08-20",101.01,109.08,100.5,108.31,11428600,108.31],["2004-08-19",100,104.06,95.96,100.34,22351900,100.34]]; \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/examples/zoom1.html b/libreplan-webapp/src/main/webapp/jqplot/examples/zoom1.html new file mode 100644 index 000000000..664ee375d --- /dev/null +++ b/libreplan-webapp/src/main/webapp/jqplot/examples/zoom1.html @@ -0,0 +1,149 @@ + + + + + + Zooming + + + + + + + + + + + + + +
    + + + + + + + + + + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/examples/zoomOptions.html b/libreplan-webapp/src/main/webapp/jqplot/examples/zoomOptions.html new file mode 100644 index 000000000..a3a579ef5 --- /dev/null +++ b/libreplan-webapp/src/main/webapp/jqplot/examples/zoomOptions.html @@ -0,0 +1,176 @@ + + + + + + Zoom Options + + + + + + + + + + + + + +
    + + + + + + + +

    Zooming has been enhanced to maintain plot zoom while the mouse moves over the entire document, not just the plot. Two new options have been added to the cursor plugin to further enhance zooming:

    + +
    +
    constrainOutsideZoom
    +
    True to limit the resulting zoom area to the edges of grid, even if the cursor is outside of the grid. That is, you can't expand the axis ranges by moving the cursor outside of the plot area when this is true. If set to false, you can effectively zoom out by mousing outside of the plot region. Default false.
    +
    showTooltipOutsideZoom
    +
    True to keep showing and updating the tooltip even when the cursor is outside of the plot area. Not applicable if zoomOutsidePlot is false. Default false
    +
    + +

    The fist plot demonstrates the default functionality where you can move the mouse off of the plot while zooming but the actual area zoomed will not extend beyond the axes.

    +
    +
    + +
    
    +
    +

    The second plot sets constrainOutsideZoom to false, so zooming will not only function when the mouse is outside of the plot, but the zoom range will be extended to the mouse position outside of the grid.

    +
    +
    + +
    
    +
    +

    The third plot is like the third, but showTooltipOutsideZoom is true and the tooltip is set to follow the mouse, so you have an idea of what your range is while zooming.

    +
    +
    + +
    
    +
    +
    +  
    +  
    +  
    +
    +
    +
    +
    +
    +
    +    
    +    
    +    
    +    
    +
    +
    +
    +  
    +  
    +  
    +
    +
    +
    +	
    + + + + + + \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/examples/zoomProxy.html b/libreplan-webapp/src/main/webapp/jqplot/examples/zoomProxy.html new file mode 100644 index 000000000..ff88f6058 --- /dev/null +++ b/libreplan-webapp/src/main/webapp/jqplot/examples/zoomProxy.html @@ -0,0 +1,110 @@ + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    +
    + + + +
    + + + + \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/examples/zooming.html b/libreplan-webapp/src/main/webapp/jqplot/examples/zooming.html new file mode 100644 index 000000000..4bb360268 --- /dev/null +++ b/libreplan-webapp/src/main/webapp/jqplot/examples/zooming.html @@ -0,0 +1,209 @@ + + + + + + Plot Zooming and Cursor Control + + + + + + + + + + + + + +
    + + + + + + + + +

    The cursor plugin also enables plot zooming functionality. Click and drag on the plot to zoom. Double click to reset.

    + +

    You can disable the double click zoom reset. The cursor plugin also extends the plot object with a resetZoom() method which can be called from user code or other html element (a button for example) to reset the plot zoom.

    + +
    + + +
    
    +
    +
    +

    Plot zooming also works will multiple axes. The following plot uses 3 large datasets.

    +
    + +
    
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +    
    +    
    +    
    +    
    +
    +
    +
    +    
    +    
    +
    +
    +
    +
    +	
    + + + + + + \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/excanvas.js b/libreplan-webapp/src/main/webapp/jqplot/excanvas.js new file mode 100644 index 000000000..4ca9653fc --- /dev/null +++ b/libreplan-webapp/src/main/webapp/jqplot/excanvas.js @@ -0,0 +1,1438 @@ +// Memory Leaks patch from http://explorercanvas.googlecode.com/svn/trunk/ +// svn : r73 +// ------------------------------------------------------------------ +// Copyright 2006 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + + +// Known Issues: +// +// * Patterns only support repeat. +// * Radial gradient are not implemented. The VML version of these look very +// different from the canvas one. +// * Clipping paths are not implemented. +// * Coordsize. The width and height attribute have higher priority than the +// width and height style values which isn't correct. +// * Painting mode isn't implemented. +// * Canvas width/height should is using content-box by default. IE in +// Quirks mode will draw the canvas using border-box. Either change your +// doctype to HTML5 +// (http://www.whatwg.org/specs/web-apps/current-work/#the-doctype) +// or use Box Sizing Behavior from WebFX +// (http://webfx.eae.net/dhtml/boxsizing/boxsizing.html) +// * Non uniform scaling does not correctly scale strokes. +// * Optimize. There is always room for speed improvements. + +// Only add this code if we do not already have a canvas implementation +if (!document.createElement('canvas').getContext) { + +(function() { + + // alias some functions to make (compiled) code shorter + var m = Math; + var mr = m.round; + var ms = m.sin; + var mc = m.cos; + var abs = m.abs; + var sqrt = m.sqrt; + + // this is used for sub pixel precision + var Z = 10; + var Z2 = Z / 2; + + var IE_VERSION = +navigator.userAgent.match(/MSIE ([\d.]+)?/)[1]; + + /** + * This funtion is assigned to the elements as element.getContext(). + * @this {HTMLElement} + * @return {CanvasRenderingContext2D_} + */ + function getContext() { + return this.context_ || + (this.context_ = new CanvasRenderingContext2D_(this)); + } + + var slice = Array.prototype.slice; + + /** + * Binds a function to an object. The returned function will always use the + * passed in {@code obj} as {@code this}. + * + * Example: + * + * g = bind(f, obj, a, b) + * g(c, d) // will do f.call(obj, a, b, c, d) + * + * @param {Function} f The function to bind the object to + * @param {Object} obj The object that should act as this when the function + * is called + * @param {*} var_args Rest arguments that will be used as the initial + * arguments when the function is called + * @return {Function} A new function that has bound this + */ + function bind(f, obj, var_args) { + var a = slice.call(arguments, 2); + return function() { + return f.apply(obj, a.concat(slice.call(arguments))); + }; + } + + function encodeHtmlAttribute(s) { + return String(s).replace(/&/g, '&').replace(/"/g, '"'); + } + + function addNamespace(doc, prefix, urn) { + if (!doc.namespaces[prefix]) { + doc.namespaces.add(prefix, urn, '#default#VML'); + } + } + + function addNamespacesAndStylesheet(doc) { + addNamespace(doc, 'g_vml_', 'urn:schemas-microsoft-com:vml'); + addNamespace(doc, 'g_o_', 'urn:schemas-microsoft-com:office:office'); + + // Setup default CSS. Only add one style sheet per document + if (!doc.styleSheets['ex_canvas_']) { + var ss = doc.createStyleSheet(); + ss.owningElement.id = 'ex_canvas_'; + ss.cssText = 'canvas{display:inline-block;overflow:hidden;' + + // default size is 300x150 in Gecko and Opera + 'text-align:left;width:300px;height:150px}'; + } + } + + // Add namespaces and stylesheet at startup. + addNamespacesAndStylesheet(document); + + var G_vmlCanvasManager_ = { + init: function(opt_doc) { + var doc = opt_doc || document; + // Create a dummy element so that IE will allow canvas elements to be + // recognized. + doc.createElement('canvas'); + doc.attachEvent('onreadystatechange', bind(this.init_, this, doc)); + }, + + init_: function(doc) { + // find all canvas elements + var els = doc.getElementsByTagName('canvas'); + for (var i = 0; i < els.length; i++) { + this.initElement(els[i]); + } + }, + + /** + * Public initializes a canvas element so that it can be used as canvas + * element from now on. This is called automatically before the page is + * loaded but if you are creating elements using createElement you need to + * make sure this is called on the element. + * @param {HTMLElement} el The canvas element to initialize. + * @return {HTMLElement} the element that was created. + */ + initElement: function(el) { + if (!el.getContext) { + el.getContext = getContext; + + // Add namespaces and stylesheet to document of the element. + addNamespacesAndStylesheet(el.ownerDocument); + + // Remove fallback content. There is no way to hide text nodes so we + // just remove all childNodes. We could hide all elements and remove + // text nodes but who really cares about the fallback content. + el.innerHTML = ''; + + // do not use inline function because that will leak memory + el.attachEvent('onpropertychange', onPropertyChange); + el.attachEvent('onresize', onResize); + + var attrs = el.attributes; + if (attrs.width && attrs.width.specified) { + // TODO: use runtimeStyle and coordsize + // el.getContext().setWidth_(attrs.width.nodeValue); + el.style.width = attrs.width.nodeValue + 'px'; + } else { + el.width = el.clientWidth; + } + if (attrs.height && attrs.height.specified) { + // TODO: use runtimeStyle and coordsize + // el.getContext().setHeight_(attrs.height.nodeValue); + el.style.height = attrs.height.nodeValue + 'px'; + } else { + el.height = el.clientHeight; + } + //el.getContext().setCoordsize_() + } + return el; + }, + + // Memory Leaks patch : see http://code.google.com/p/explorercanvas/issues/detail?id=82 + uninitElement: function(el){ + if (el.getContext) { + var ctx = el.getContext(); + delete ctx.element_; + delete ctx.canvas; + el.innerHTML = ""; + //el.outerHTML = ""; + el.context_ = null; + el.getContext = null; + el.detachEvent("onpropertychange", onPropertyChange); + el.detachEvent("onresize", onResize); + } + } + }; + + function onPropertyChange(e) { + var el = e.srcElement; + + switch (e.propertyName) { + case 'width': + el.getContext().clearRect(); + el.style.width = el.attributes.width.nodeValue + 'px'; + // In IE8 this does not trigger onresize. + el.firstChild.style.width = el.clientWidth + 'px'; + break; + case 'height': + el.getContext().clearRect(); + el.style.height = el.attributes.height.nodeValue + 'px'; + el.firstChild.style.height = el.clientHeight + 'px'; + break; + } + } + + function onResize(e) { + var el = e.srcElement; + if (el.firstChild) { + el.firstChild.style.width = el.clientWidth + 'px'; + el.firstChild.style.height = el.clientHeight + 'px'; + } + } + + G_vmlCanvasManager_.init(); + + // precompute "00" to "FF" + var decToHex = []; + for (var i = 0; i < 16; i++) { + for (var j = 0; j < 16; j++) { + decToHex[i * 16 + j] = i.toString(16) + j.toString(16); + } + } + + function createMatrixIdentity() { + return [ + [1, 0, 0], + [0, 1, 0], + [0, 0, 1] + ]; + } + + function matrixMultiply(m1, m2) { + var result = createMatrixIdentity(); + + for (var x = 0; x < 3; x++) { + for (var y = 0; y < 3; y++) { + var sum = 0; + + for (var z = 0; z < 3; z++) { + sum += m1[x][z] * m2[z][y]; + } + + result[x][y] = sum; + } + } + return result; + } + + function copyState(o1, o2) { + o2.fillStyle = o1.fillStyle; + o2.lineCap = o1.lineCap; + o2.lineJoin = o1.lineJoin; + o2.lineWidth = o1.lineWidth; + o2.miterLimit = o1.miterLimit; + o2.shadowBlur = o1.shadowBlur; + o2.shadowColor = o1.shadowColor; + o2.shadowOffsetX = o1.shadowOffsetX; + o2.shadowOffsetY = o1.shadowOffsetY; + o2.strokeStyle = o1.strokeStyle; + o2.globalAlpha = o1.globalAlpha; + o2.font = o1.font; + o2.textAlign = o1.textAlign; + o2.textBaseline = o1.textBaseline; + o2.arcScaleX_ = o1.arcScaleX_; + o2.arcScaleY_ = o1.arcScaleY_; + o2.lineScale_ = o1.lineScale_; + } + + var colorData = { + aliceblue: '#F0F8FF', + antiquewhite: '#FAEBD7', + aquamarine: '#7FFFD4', + azure: '#F0FFFF', + beige: '#F5F5DC', + bisque: '#FFE4C4', + black: '#000000', + blanchedalmond: '#FFEBCD', + blueviolet: '#8A2BE2', + brown: '#A52A2A', + burlywood: '#DEB887', + cadetblue: '#5F9EA0', + chartreuse: '#7FFF00', + chocolate: '#D2691E', + coral: '#FF7F50', + cornflowerblue: '#6495ED', + cornsilk: '#FFF8DC', + crimson: '#DC143C', + cyan: '#00FFFF', + darkblue: '#00008B', + darkcyan: '#008B8B', + darkgoldenrod: '#B8860B', + darkgray: '#A9A9A9', + darkgreen: '#006400', + darkgrey: '#A9A9A9', + darkkhaki: '#BDB76B', + darkmagenta: '#8B008B', + darkolivegreen: '#556B2F', + darkorange: '#FF8C00', + darkorchid: '#9932CC', + darkred: '#8B0000', + darksalmon: '#E9967A', + darkseagreen: '#8FBC8F', + darkslateblue: '#483D8B', + darkslategray: '#2F4F4F', + darkslategrey: '#2F4F4F', + darkturquoise: '#00CED1', + darkviolet: '#9400D3', + deeppink: '#FF1493', + deepskyblue: '#00BFFF', + dimgray: '#696969', + dimgrey: '#696969', + dodgerblue: '#1E90FF', + firebrick: '#B22222', + floralwhite: '#FFFAF0', + forestgreen: '#228B22', + gainsboro: '#DCDCDC', + ghostwhite: '#F8F8FF', + gold: '#FFD700', + goldenrod: '#DAA520', + grey: '#808080', + greenyellow: '#ADFF2F', + honeydew: '#F0FFF0', + hotpink: '#FF69B4', + indianred: '#CD5C5C', + indigo: '#4B0082', + ivory: '#FFFFF0', + khaki: '#F0E68C', + lavender: '#E6E6FA', + lavenderblush: '#FFF0F5', + lawngreen: '#7CFC00', + lemonchiffon: '#FFFACD', + lightblue: '#ADD8E6', + lightcoral: '#F08080', + lightcyan: '#E0FFFF', + lightgoldenrodyellow: '#FAFAD2', + lightgreen: '#90EE90', + lightgrey: '#D3D3D3', + lightpink: '#FFB6C1', + lightsalmon: '#FFA07A', + lightseagreen: '#20B2AA', + lightskyblue: '#87CEFA', + lightslategray: '#778899', + lightslategrey: '#778899', + lightsteelblue: '#B0C4DE', + lightyellow: '#FFFFE0', + limegreen: '#32CD32', + linen: '#FAF0E6', + magenta: '#FF00FF', + mediumaquamarine: '#66CDAA', + mediumblue: '#0000CD', + mediumorchid: '#BA55D3', + mediumpurple: '#9370DB', + mediumseagreen: '#3CB371', + mediumslateblue: '#7B68EE', + mediumspringgreen: '#00FA9A', + mediumturquoise: '#48D1CC', + mediumvioletred: '#C71585', + midnightblue: '#191970', + mintcream: '#F5FFFA', + mistyrose: '#FFE4E1', + moccasin: '#FFE4B5', + navajowhite: '#FFDEAD', + oldlace: '#FDF5E6', + olivedrab: '#6B8E23', + orange: '#FFA500', + orangered: '#FF4500', + orchid: '#DA70D6', + palegoldenrod: '#EEE8AA', + palegreen: '#98FB98', + paleturquoise: '#AFEEEE', + palevioletred: '#DB7093', + papayawhip: '#FFEFD5', + peachpuff: '#FFDAB9', + peru: '#CD853F', + pink: '#FFC0CB', + plum: '#DDA0DD', + powderblue: '#B0E0E6', + rosybrown: '#BC8F8F', + royalblue: '#4169E1', + saddlebrown: '#8B4513', + salmon: '#FA8072', + sandybrown: '#F4A460', + seagreen: '#2E8B57', + seashell: '#FFF5EE', + sienna: '#A0522D', + skyblue: '#87CEEB', + slateblue: '#6A5ACD', + slategray: '#708090', + slategrey: '#708090', + snow: '#FFFAFA', + springgreen: '#00FF7F', + steelblue: '#4682B4', + tan: '#D2B48C', + thistle: '#D8BFD8', + tomato: '#FF6347', + turquoise: '#40E0D0', + violet: '#EE82EE', + wheat: '#F5DEB3', + whitesmoke: '#F5F5F5', + yellowgreen: '#9ACD32' + }; + + + function getRgbHslContent(styleString) { + var start = styleString.indexOf('(', 3); + var end = styleString.indexOf(')', start + 1); + var parts = styleString.substring(start + 1, end).split(','); + // add alpha if needed + if (parts.length != 4 || styleString.charAt(3) != 'a') { + parts[3] = 1; + } + return parts; + } + + function percent(s) { + return parseFloat(s) / 100; + } + + function clamp(v, min, max) { + return Math.min(max, Math.max(min, v)); + } + + function hslToRgb(parts){ + var r, g, b, h, s, l; + h = parseFloat(parts[0]) / 360 % 360; + if (h < 0) + h++; + s = clamp(percent(parts[1]), 0, 1); + l = clamp(percent(parts[2]), 0, 1); + if (s == 0) { + r = g = b = l; // achromatic + } else { + var q = l < 0.5 ? l * (1 + s) : l + s - l * s; + var p = 2 * l - q; + r = hueToRgb(p, q, h + 1 / 3); + g = hueToRgb(p, q, h); + b = hueToRgb(p, q, h - 1 / 3); + } + + return '#' + decToHex[Math.floor(r * 255)] + + decToHex[Math.floor(g * 255)] + + decToHex[Math.floor(b * 255)]; + } + + function hueToRgb(m1, m2, h) { + if (h < 0) + h++; + if (h > 1) + h--; + + if (6 * h < 1) + return m1 + (m2 - m1) * 6 * h; + else if (2 * h < 1) + return m2; + else if (3 * h < 2) + return m1 + (m2 - m1) * (2 / 3 - h) * 6; + else + return m1; + } + + var processStyleCache = {}; + + function processStyle(styleString) { + if (styleString in processStyleCache) { + return processStyleCache[styleString]; + } + + var str, alpha = 1; + + styleString = String(styleString); + if (styleString.charAt(0) == '#') { + str = styleString; + } else if (/^rgb/.test(styleString)) { + var parts = getRgbHslContent(styleString); + var str = '#', n; + for (var i = 0; i < 3; i++) { + if (parts[i].indexOf('%') != -1) { + n = Math.floor(percent(parts[i]) * 255); + } else { + n = +parts[i]; + } + str += decToHex[clamp(n, 0, 255)]; + } + alpha = +parts[3]; + } else if (/^hsl/.test(styleString)) { + var parts = getRgbHslContent(styleString); + str = hslToRgb(parts); + alpha = parts[3]; + } else { + str = colorData[styleString] || styleString; + } + return processStyleCache[styleString] = {color: str, alpha: alpha}; + } + + var DEFAULT_STYLE = { + style: 'normal', + variant: 'normal', + weight: 'normal', + size: 10, + family: 'sans-serif' + }; + + // Internal text style cache + var fontStyleCache = {}; + + function processFontStyle(styleString) { + if (fontStyleCache[styleString]) { + return fontStyleCache[styleString]; + } + + var el = document.createElement('div'); + var style = el.style; + try { + style.font = styleString; + } catch (ex) { + // Ignore failures to set to invalid font. + } + + return fontStyleCache[styleString] = { + style: style.fontStyle || DEFAULT_STYLE.style, + variant: style.fontVariant || DEFAULT_STYLE.variant, + weight: style.fontWeight || DEFAULT_STYLE.weight, + size: style.fontSize || DEFAULT_STYLE.size, + family: style.fontFamily || DEFAULT_STYLE.family + }; + } + + function getComputedStyle(style, element) { + var computedStyle = {}; + + for (var p in style) { + computedStyle[p] = style[p]; + } + + // Compute the size + var canvasFontSize = parseFloat(element.currentStyle.fontSize), + fontSize = parseFloat(style.size); + + if (typeof style.size == 'number') { + computedStyle.size = style.size; + } else if (style.size.indexOf('px') != -1) { + computedStyle.size = fontSize; + } else if (style.size.indexOf('em') != -1) { + computedStyle.size = canvasFontSize * fontSize; + } else if(style.size.indexOf('%') != -1) { + computedStyle.size = (canvasFontSize / 100) * fontSize; + } else if (style.size.indexOf('pt') != -1) { + computedStyle.size = fontSize / .75; + } else { + computedStyle.size = canvasFontSize; + } + + // Different scaling between normal text and VML text. This was found using + // trial and error to get the same size as non VML text. + computedStyle.size *= 0.981; + + // Fix for VML handling of bare font family names. Add a '' around font family names. + computedStyle.family = "'" + computedStyle.family.replace(/(\'|\")/g,'').replace(/\s*,\s*/g, "', '") + "'"; + + return computedStyle; + } + + function buildStyle(style) { + return style.style + ' ' + style.variant + ' ' + style.weight + ' ' + + style.size + 'px ' + style.family; + } + + var lineCapMap = { + 'butt': 'flat', + 'round': 'round' + }; + + function processLineCap(lineCap) { + return lineCapMap[lineCap] || 'square'; + } + + /** + * This class implements CanvasRenderingContext2D interface as described by + * the WHATWG. + * @param {HTMLElement} canvasElement The element that the 2D context should + * be associated with + */ + function CanvasRenderingContext2D_(canvasElement) { + this.m_ = createMatrixIdentity(); + + this.mStack_ = []; + this.aStack_ = []; + this.currentPath_ = []; + + // Canvas context properties + this.strokeStyle = '#000'; + this.fillStyle = '#000'; + + this.lineWidth = 1; + this.lineJoin = 'miter'; + this.lineCap = 'butt'; + this.miterLimit = Z * 1; + this.globalAlpha = 1; + this.font = '10px sans-serif'; + this.textAlign = 'left'; + this.textBaseline = 'alphabetic'; + this.canvas = canvasElement; + + var cssText = 'width:' + canvasElement.clientWidth + 'px;height:' + + canvasElement.clientHeight + 'px;overflow:hidden;position:absolute'; + var el = canvasElement.ownerDocument.createElement('div'); + el.style.cssText = cssText; + canvasElement.appendChild(el); + + var overlayEl = el.cloneNode(false); + // Use a non transparent background. + overlayEl.style.backgroundColor = 'red'; + overlayEl.style.filter = 'alpha(opacity=0)'; + canvasElement.appendChild(overlayEl); + + this.element_ = el; + this.arcScaleX_ = 1; + this.arcScaleY_ = 1; + this.lineScale_ = 1; + } + + var contextPrototype = CanvasRenderingContext2D_.prototype; + contextPrototype.clearRect = function() { + if (this.textMeasureEl_) { + this.textMeasureEl_.removeNode(true); + this.textMeasureEl_ = null; + } + this.element_.innerHTML = ''; + }; + + contextPrototype.beginPath = function() { + // TODO: Branch current matrix so that save/restore has no effect + // as per safari docs. + this.currentPath_ = []; + }; + + contextPrototype.moveTo = function(aX, aY) { + var p = getCoords(this, aX, aY); + this.currentPath_.push({type: 'moveTo', x: p.x, y: p.y}); + this.currentX_ = p.x; + this.currentY_ = p.y; + }; + + contextPrototype.lineTo = function(aX, aY) { + var p = getCoords(this, aX, aY); + this.currentPath_.push({type: 'lineTo', x: p.x, y: p.y}); + + this.currentX_ = p.x; + this.currentY_ = p.y; + }; + + contextPrototype.bezierCurveTo = function(aCP1x, aCP1y, + aCP2x, aCP2y, + aX, aY) { + var p = getCoords(this, aX, aY); + var cp1 = getCoords(this, aCP1x, aCP1y); + var cp2 = getCoords(this, aCP2x, aCP2y); + bezierCurveTo(this, cp1, cp2, p); + }; + + // Helper function that takes the already fixed cordinates. + function bezierCurveTo(self, cp1, cp2, p) { + self.currentPath_.push({ + type: 'bezierCurveTo', + cp1x: cp1.x, + cp1y: cp1.y, + cp2x: cp2.x, + cp2y: cp2.y, + x: p.x, + y: p.y + }); + self.currentX_ = p.x; + self.currentY_ = p.y; + } + + contextPrototype.quadraticCurveTo = function(aCPx, aCPy, aX, aY) { + // the following is lifted almost directly from + // http://developer.mozilla.org/en/docs/Canvas_tutorial:Drawing_shapes + + var cp = getCoords(this, aCPx, aCPy); + var p = getCoords(this, aX, aY); + + var cp1 = { + x: this.currentX_ + 2.0 / 3.0 * (cp.x - this.currentX_), + y: this.currentY_ + 2.0 / 3.0 * (cp.y - this.currentY_) + }; + var cp2 = { + x: cp1.x + (p.x - this.currentX_) / 3.0, + y: cp1.y + (p.y - this.currentY_) / 3.0 + }; + + bezierCurveTo(this, cp1, cp2, p); + }; + + contextPrototype.arc = function(aX, aY, aRadius, + aStartAngle, aEndAngle, aClockwise) { + aRadius *= Z; + var arcType = aClockwise ? 'at' : 'wa'; + + var xStart = aX + mc(aStartAngle) * aRadius - Z2; + var yStart = aY + ms(aStartAngle) * aRadius - Z2; + + var xEnd = aX + mc(aEndAngle) * aRadius - Z2; + var yEnd = aY + ms(aEndAngle) * aRadius - Z2; + + // IE won't render arches drawn counter clockwise if xStart == xEnd. + if (xStart == xEnd && !aClockwise) { + xStart += 0.125; // Offset xStart by 1/80 of a pixel. Use something + // that can be represented in binary + } + + var p = getCoords(this, aX, aY); + var pStart = getCoords(this, xStart, yStart); + var pEnd = getCoords(this, xEnd, yEnd); + + this.currentPath_.push({type: arcType, + x: p.x, + y: p.y, + radius: aRadius, + xStart: pStart.x, + yStart: pStart.y, + xEnd: pEnd.x, + yEnd: pEnd.y}); + + }; + + contextPrototype.rect = function(aX, aY, aWidth, aHeight) { + this.moveTo(aX, aY); + this.lineTo(aX + aWidth, aY); + this.lineTo(aX + aWidth, aY + aHeight); + this.lineTo(aX, aY + aHeight); + this.closePath(); + }; + + contextPrototype.strokeRect = function(aX, aY, aWidth, aHeight) { + var oldPath = this.currentPath_; + this.beginPath(); + + this.moveTo(aX, aY); + this.lineTo(aX + aWidth, aY); + this.lineTo(aX + aWidth, aY + aHeight); + this.lineTo(aX, aY + aHeight); + this.closePath(); + this.stroke(); + + this.currentPath_ = oldPath; + }; + + contextPrototype.fillRect = function(aX, aY, aWidth, aHeight) { + var oldPath = this.currentPath_; + this.beginPath(); + + this.moveTo(aX, aY); + this.lineTo(aX + aWidth, aY); + this.lineTo(aX + aWidth, aY + aHeight); + this.lineTo(aX, aY + aHeight); + this.closePath(); + this.fill(); + + this.currentPath_ = oldPath; + }; + + contextPrototype.createLinearGradient = function(aX0, aY0, aX1, aY1) { + var gradient = new CanvasGradient_('gradient'); + gradient.x0_ = aX0; + gradient.y0_ = aY0; + gradient.x1_ = aX1; + gradient.y1_ = aY1; + return gradient; + }; + + contextPrototype.createRadialGradient = function(aX0, aY0, aR0, + aX1, aY1, aR1) { + var gradient = new CanvasGradient_('gradientradial'); + gradient.x0_ = aX0; + gradient.y0_ = aY0; + gradient.r0_ = aR0; + gradient.x1_ = aX1; + gradient.y1_ = aY1; + gradient.r1_ = aR1; + return gradient; + }; + + contextPrototype.drawImage = function(image, var_args) { + var dx, dy, dw, dh, sx, sy, sw, sh; + + // to find the original width we overide the width and height + var oldRuntimeWidth = image.runtimeStyle.width; + var oldRuntimeHeight = image.runtimeStyle.height; + image.runtimeStyle.width = 'auto'; + image.runtimeStyle.height = 'auto'; + + // get the original size + var w = image.width; + var h = image.height; + + // and remove overides + image.runtimeStyle.width = oldRuntimeWidth; + image.runtimeStyle.height = oldRuntimeHeight; + + if (arguments.length == 3) { + dx = arguments[1]; + dy = arguments[2]; + sx = sy = 0; + sw = dw = w; + sh = dh = h; + } else if (arguments.length == 5) { + dx = arguments[1]; + dy = arguments[2]; + dw = arguments[3]; + dh = arguments[4]; + sx = sy = 0; + sw = w; + sh = h; + } else if (arguments.length == 9) { + sx = arguments[1]; + sy = arguments[2]; + sw = arguments[3]; + sh = arguments[4]; + dx = arguments[5]; + dy = arguments[6]; + dw = arguments[7]; + dh = arguments[8]; + } else { + throw Error('Invalid number of arguments'); + } + + var d = getCoords(this, dx, dy); + + var w2 = sw / 2; + var h2 = sh / 2; + + var vmlStr = []; + + var W = 10; + var H = 10; + + // For some reason that I've now forgotten, using divs didn't work + vmlStr.push(' ' , + '', + ''); + + this.element_.insertAdjacentHTML('BeforeEnd', vmlStr.join('')); + }; + + contextPrototype.stroke = function(aFill) { + var lineStr = []; + var lineOpen = false; + + var W = 10; + var H = 10; + + lineStr.push(''); + + if (!aFill) { + appendStroke(this, lineStr); + } else { + appendFill(this, lineStr, min, max); + } + + lineStr.push(''); + + this.element_.insertAdjacentHTML('beforeEnd', lineStr.join('')); + }; + + function appendStroke(ctx, lineStr) { + var a = processStyle(ctx.strokeStyle); + var color = a.color; + var opacity = a.alpha * ctx.globalAlpha; + var lineWidth = ctx.lineScale_ * ctx.lineWidth; + + // VML cannot correctly render a line if the width is less than 1px. + // In that case, we dilute the color to make the line look thinner. + if (lineWidth < 1) { + opacity *= lineWidth; + } + + lineStr.push( + '' + ); + } + + function appendFill(ctx, lineStr, min, max) { + var fillStyle = ctx.fillStyle; + var arcScaleX = ctx.arcScaleX_; + var arcScaleY = ctx.arcScaleY_; + var width = max.x - min.x; + var height = max.y - min.y; + if (fillStyle instanceof CanvasGradient_) { + // TODO: Gradients transformed with the transformation matrix. + var angle = 0; + var focus = {x: 0, y: 0}; + + // additional offset + var shift = 0; + // scale factor for offset + var expansion = 1; + + if (fillStyle.type_ == 'gradient') { + var x0 = fillStyle.x0_ / arcScaleX; + var y0 = fillStyle.y0_ / arcScaleY; + var x1 = fillStyle.x1_ / arcScaleX; + var y1 = fillStyle.y1_ / arcScaleY; + var p0 = getCoords(ctx, x0, y0); + var p1 = getCoords(ctx, x1, y1); + var dx = p1.x - p0.x; + var dy = p1.y - p0.y; + angle = Math.atan2(dx, dy) * 180 / Math.PI; + + // The angle should be a non-negative number. + if (angle < 0) { + angle += 360; + } + + // Very small angles produce an unexpected result because they are + // converted to a scientific notation string. + if (angle < 1e-6) { + angle = 0; + } + } else { + var p0 = getCoords(ctx, fillStyle.x0_, fillStyle.y0_); + focus = { + x: (p0.x - min.x) / width, + y: (p0.y - min.y) / height + }; + + width /= arcScaleX * Z; + height /= arcScaleY * Z; + var dimension = m.max(width, height); + shift = 2 * fillStyle.r0_ / dimension; + expansion = 2 * fillStyle.r1_ / dimension - shift; + } + + // We need to sort the color stops in ascending order by offset, + // otherwise IE won't interpret it correctly. + var stops = fillStyle.colors_; + stops.sort(function(cs1, cs2) { + return cs1.offset - cs2.offset; + }); + + var length = stops.length; + var color1 = stops[0].color; + var color2 = stops[length - 1].color; + var opacity1 = stops[0].alpha * ctx.globalAlpha; + var opacity2 = stops[length - 1].alpha * ctx.globalAlpha; + + var colors = []; + for (var i = 0; i < length; i++) { + var stop = stops[i]; + colors.push(stop.offset * expansion + shift + ' ' + stop.color); + } + + // When colors attribute is used, the meanings of opacity and o:opacity2 + // are reversed. + lineStr.push(''); + } else if (fillStyle instanceof CanvasPattern_) { + if (width && height) { + var deltaLeft = -min.x; + var deltaTop = -min.y; + lineStr.push(''); + } + } else { + var a = processStyle(ctx.fillStyle); + var color = a.color; + var opacity = a.alpha * ctx.globalAlpha; + lineStr.push(''); + } + } + + contextPrototype.fill = function() { + this.stroke(true); + }; + + contextPrototype.closePath = function() { + this.currentPath_.push({type: 'close'}); + }; + + function getCoords(ctx, aX, aY) { + var m = ctx.m_; + return { + x: Z * (aX * m[0][0] + aY * m[1][0] + m[2][0]) - Z2, + y: Z * (aX * m[0][1] + aY * m[1][1] + m[2][1]) - Z2 + }; + }; + + contextPrototype.save = function() { + var o = {}; + copyState(this, o); + this.aStack_.push(o); + this.mStack_.push(this.m_); + this.m_ = matrixMultiply(createMatrixIdentity(), this.m_); + }; + + contextPrototype.restore = function() { + if (this.aStack_.length) { + copyState(this.aStack_.pop(), this); + this.m_ = this.mStack_.pop(); + } + }; + + function matrixIsFinite(m) { + return isFinite(m[0][0]) && isFinite(m[0][1]) && + isFinite(m[1][0]) && isFinite(m[1][1]) && + isFinite(m[2][0]) && isFinite(m[2][1]); + } + + function setM(ctx, m, updateLineScale) { + if (!matrixIsFinite(m)) { + return; + } + ctx.m_ = m; + + if (updateLineScale) { + // Get the line scale. + // Determinant of this.m_ means how much the area is enlarged by the + // transformation. So its square root can be used as a scale factor + // for width. + var det = m[0][0] * m[1][1] - m[0][1] * m[1][0]; + ctx.lineScale_ = sqrt(abs(det)); + } + } + + contextPrototype.translate = function(aX, aY) { + var m1 = [ + [1, 0, 0], + [0, 1, 0], + [aX, aY, 1] + ]; + + setM(this, matrixMultiply(m1, this.m_), false); + }; + + contextPrototype.rotate = function(aRot) { + var c = mc(aRot); + var s = ms(aRot); + + var m1 = [ + [c, s, 0], + [-s, c, 0], + [0, 0, 1] + ]; + + setM(this, matrixMultiply(m1, this.m_), false); + }; + + contextPrototype.scale = function(aX, aY) { + this.arcScaleX_ *= aX; + this.arcScaleY_ *= aY; + var m1 = [ + [aX, 0, 0], + [0, aY, 0], + [0, 0, 1] + ]; + + setM(this, matrixMultiply(m1, this.m_), true); + }; + + contextPrototype.transform = function(m11, m12, m21, m22, dx, dy) { + var m1 = [ + [m11, m12, 0], + [m21, m22, 0], + [dx, dy, 1] + ]; + + setM(this, matrixMultiply(m1, this.m_), true); + }; + + contextPrototype.setTransform = function(m11, m12, m21, m22, dx, dy) { + var m = [ + [m11, m12, 0], + [m21, m22, 0], + [dx, dy, 1] + ]; + + setM(this, m, true); + }; + + /** + * The text drawing function. + * The maxWidth argument isn't taken in account, since no browser supports + * it yet. + */ + contextPrototype.drawText_ = function(text, x, y, maxWidth, stroke) { + var m = this.m_, + delta = 1000, + left = 0, + right = delta, + offset = {x: 0, y: 0}, + lineStr = []; + + var fontStyle = getComputedStyle(processFontStyle(this.font), this.element_); + + var fontStyleString = buildStyle(fontStyle); + + var elementStyle = this.element_.currentStyle; + var textAlign = this.textAlign.toLowerCase(); + switch (textAlign) { + case 'left': + case 'center': + case 'right': + break; + case 'end': + textAlign = elementStyle.direction == 'ltr' ? 'right' : 'left'; + break; + case 'start': + textAlign = elementStyle.direction == 'rtl' ? 'right' : 'left'; + break; + default: + textAlign = 'left'; + } + + // 1.75 is an arbitrary number, as there is no info about the text baseline + switch (this.textBaseline) { + case 'hanging': + case 'top': + offset.y = fontStyle.size / 1.75; + break; + case 'middle': + break; + default: + case null: + case 'alphabetic': + case 'ideographic': + case 'bottom': + offset.y = -fontStyle.size / 2.25; + break; + } + + switch(textAlign) { + case 'right': + left = delta; + right = 0.05; + break; + case 'center': + left = right = delta / 2; + break; + } + + var d = getCoords(this, x + offset.x, y + offset.y); + + lineStr.push(''); + + if (stroke) { + appendStroke(this, lineStr); + } else { + // TODO: Fix the min and max params. + appendFill(this, lineStr, {x: -left, y: 0}, + {x: right, y: fontStyle.size}); + } + + var skewM = m[0][0].toFixed(3) + ',' + m[1][0].toFixed(3) + ',' + + m[0][1].toFixed(3) + ',' + m[1][1].toFixed(3) + ',0,0'; + + var skewOffset = mr(d.x / Z + 1 - m[0][0]) + ',' + mr(d.y / Z - 2 * m[1][0]); + + + lineStr.push('', + '', + ''); + + this.element_.insertAdjacentHTML('beforeEnd', lineStr.join('')); + }; + + contextPrototype.fillText = function(text, x, y, maxWidth) { + this.drawText_(text, x, y, maxWidth, false); + }; + + contextPrototype.strokeText = function(text, x, y, maxWidth) { + this.drawText_(text, x, y, maxWidth, true); + }; + + contextPrototype.measureText = function(text) { + if (!this.textMeasureEl_) { + var s = ''; + this.element_.insertAdjacentHTML('beforeEnd', s); + this.textMeasureEl_ = this.element_.lastChild; + } + var doc = this.element_.ownerDocument; + this.textMeasureEl_.innerHTML = ''; + this.textMeasureEl_.style.font = this.font; + // Don't use innerHTML or innerText because they allow markup/whitespace. + this.textMeasureEl_.appendChild(doc.createTextNode(text)); + return {width: this.textMeasureEl_.offsetWidth}; + }; + + /******** STUBS ********/ + contextPrototype.clip = function() { + // TODO: Implement + }; + + contextPrototype.arcTo = function() { + // TODO: Implement + }; + + contextPrototype.createPattern = function(image, repetition) { + return new CanvasPattern_(image, repetition); + }; + + // Gradient / Pattern Stubs + function CanvasGradient_(aType) { + this.type_ = aType; + this.x0_ = 0; + this.y0_ = 0; + this.r0_ = 0; + this.x1_ = 0; + this.y1_ = 0; + this.r1_ = 0; + this.colors_ = []; + } + + CanvasGradient_.prototype.addColorStop = function(aOffset, aColor) { + aColor = processStyle(aColor); + this.colors_.push({offset: aOffset, + color: aColor.color, + alpha: aColor.alpha}); + }; + + function CanvasPattern_(image, repetition) { + assertImageIsValid(image); + switch (repetition) { + case 'repeat': + case null: + case '': + this.repetition_ = 'repeat'; + break; + case 'repeat-x': + case 'repeat-y': + case 'no-repeat': + this.repetition_ = repetition; + break; + default: + throwException('SYNTAX_ERR'); + } + + this.src_ = image.src; + this.width_ = image.width; + this.height_ = image.height; + } + + function throwException(s) { + throw new DOMException_(s); + } + + function assertImageIsValid(img) { + if (!img || img.nodeType != 1 || img.tagName != 'IMG') { + throwException('TYPE_MISMATCH_ERR'); + } + if (img.readyState != 'complete') { + throwException('INVALID_STATE_ERR'); + } + } + + function DOMException_(s) { + this.code = this[s]; + this.message = s +': DOM Exception ' + this.code; + } + var p = DOMException_.prototype = new Error; + p.INDEX_SIZE_ERR = 1; + p.DOMSTRING_SIZE_ERR = 2; + p.HIERARCHY_REQUEST_ERR = 3; + p.WRONG_DOCUMENT_ERR = 4; + p.INVALID_CHARACTER_ERR = 5; + p.NO_DATA_ALLOWED_ERR = 6; + p.NO_MODIFICATION_ALLOWED_ERR = 7; + p.NOT_FOUND_ERR = 8; + p.NOT_SUPPORTED_ERR = 9; + p.INUSE_ATTRIBUTE_ERR = 10; + p.INVALID_STATE_ERR = 11; + p.SYNTAX_ERR = 12; + p.INVALID_MODIFICATION_ERR = 13; + p.NAMESPACE_ERR = 14; + p.INVALID_ACCESS_ERR = 15; + p.VALIDATION_ERR = 16; + p.TYPE_MISMATCH_ERR = 17; + + // set up externs + G_vmlCanvasManager = G_vmlCanvasManager_; + CanvasRenderingContext2D = CanvasRenderingContext2D_; + CanvasGradient = CanvasGradient_; + CanvasPattern = CanvasPattern_; + DOMException = DOMException_; + G_vmlCanvasManager._version = 888; +})(); + +} // if diff --git a/libreplan-webapp/src/main/webapp/jqplot/excanvas.min.js b/libreplan-webapp/src/main/webapp/jqplot/excanvas.min.js new file mode 100644 index 000000000..6452abf4c --- /dev/null +++ b/libreplan-webapp/src/main/webapp/jqplot/excanvas.min.js @@ -0,0 +1,57 @@ +/** + * jqPlot + * Pure JavaScript plotting plugin using jQuery + * + * Version: @VERSION + * + * Copyright (c) 2009-2011 Chris Leonello + * jqPlot is currently available for use in all personal or commercial projects + * under both the MIT (http://www.opensource.org/licenses/mit-license.php) and GPL + * version 2.0 (http://www.gnu.org/licenses/gpl-2.0.html) licenses. This means that you can + * choose the license that best suits your project and use it accordingly. + * + * Although not required, the author would appreciate an email letting him + * know of any substantial use of jqPlot. You can reach the author at: + * chris at jqplot dot com or see http://www.jqplot.com/info.php . + * + * If you are feeling kind and generous, consider supporting the project by + * making a donation at: http://www.jqplot.com/donate.php . + * + * sprintf functions contained in jqplot.sprintf.js by Ash Searle: + * + * version 2007.04.27 + * author Ash Searle + * http://hexmen.com/blog/2007/03/printf-sprintf/ + * http://hexmen.com/js/sprintf.js + * The author (Ash Searle) has placed this code in the public domain: + * "This code is unrestricted: you are free to use it however you like." + * + * included jsDate library by Chris Leonello: + * + * Copyright (c) 2010-2011 Chris Leonello + * + * jsDate is currently available for use in all personal or commercial projects + * under both the MIT and GPL version 2.0 licenses. This means that you can + * choose the license that best suits your project and use it accordingly. + * + * jsDate borrows many concepts and ideas from the Date Instance + * Methods by Ken Snyder along with some parts of Ken's actual code. + * + * Ken's origianl Date Instance Methods and copyright notice: + * + * Ken Snyder (ken d snyder at gmail dot com) + * 2008-09-10 + * version 2.0.2 (http://kendsnyder.com/sandbox/date/) + * Creative Commons Attribution License 3.0 (http://creativecommons.org/licenses/by/3.0/) + * + * jqplotToImage function based on Larry Siden's export-jqplot-to-png.js. + * Larry has generously given permission to adapt his code for inclusion + * into jqPlot. + * + * Larry's original code can be found here: + * + * https://github.com/lsiden/export-jqplot-to-png + * + * + */ +if(!document.createElement("canvas").getContext){(function(){var ab=Math;var n=ab.round;var l=ab.sin;var A=ab.cos;var H=ab.abs;var N=ab.sqrt;var d=10;var f=d/2;var z=+navigator.userAgent.match(/MSIE ([\d.]+)?/)[1];function y(){return this.context_||(this.context_=new D(this))}var t=Array.prototype.slice;function g(j,m,p){var i=t.call(arguments,2);return function(){return j.apply(m,i.concat(t.call(arguments)))}}function af(i){return String(i).replace(/&/g,"&").replace(/"/g,""")}function Y(m,j,i){if(!m.namespaces[j]){m.namespaces.add(j,i,"#default#VML")}}function R(j){Y(j,"g_vml_","urn:schemas-microsoft-com:vml");Y(j,"g_o_","urn:schemas-microsoft-com:office:office");if(!j.styleSheets.ex_canvas_){var i=j.createStyleSheet();i.owningElement.id="ex_canvas_";i.cssText="canvas{display:inline-block;overflow:hidden;text-align:left;width:300px;height:150px}"}}R(document);var e={init:function(i){var j=i||document;j.createElement("canvas");j.attachEvent("onreadystatechange",g(this.init_,this,j))},init_:function(p){var m=p.getElementsByTagName("canvas");for(var j=0;j1){m--}if(6*m<1){return j+(i-j)*6*m}else{if(2*m<1){return i}else{if(3*m<2){return j+(i-j)*(2/3-m)*6}else{return j}}}}var C={};function F(j){if(j in C){return C[j]}var ag,Z=1;j=String(j);if(j.charAt(0)=="#"){ag=j}else{if(/^rgb/.test(j)){var p=M(j);var ag="#",ah;for(var m=0;m<3;m++){if(p[m].indexOf("%")!=-1){ah=Math.floor(c(p[m])*255)}else{ah=+p[m]}ag+=k[r(ah,0,255)]}Z=+p[3]}else{if(/^hsl/.test(j)){var p=M(j);ag=I(p);Z=p[3]}else{ag=b[j]||j}}}return C[j]={color:ag,alpha:Z}}var o={style:"normal",variant:"normal",weight:"normal",size:10,family:"sans-serif"};var L={};function E(i){if(L[i]){return L[i]}var p=document.createElement("div");var m=p.style;try{m.font=i}catch(j){}return L[i]={style:m.fontStyle||o.style,variant:m.fontVariant||o.variant,weight:m.fontWeight||o.weight,size:m.fontSize||o.size,family:m.fontFamily||o.family}}function u(m,j){var i={};for(var ah in m){i[ah]=m[ah]}var ag=parseFloat(j.currentStyle.fontSize),Z=parseFloat(m.size);if(typeof m.size=="number"){i.size=m.size}else{if(m.size.indexOf("px")!=-1){i.size=Z}else{if(m.size.indexOf("em")!=-1){i.size=ag*Z}else{if(m.size.indexOf("%")!=-1){i.size=(ag/100)*Z}else{if(m.size.indexOf("pt")!=-1){i.size=Z/0.75}else{i.size=ag}}}}}i.size*=0.981;i.family="'"+i.family.replace(/(\'|\")/g,"").replace(/\s*,\s*/g,"', '")+"'";return i}function ac(i){return i.style+" "+i.variant+" "+i.weight+" "+i.size+"px "+i.family}var s={butt:"flat",round:"round"};function S(i){return s[i]||"square"}function D(i){this.m_=B();this.mStack_=[];this.aStack_=[];this.currentPath_=[];this.strokeStyle="#000";this.fillStyle="#000";this.lineWidth=1;this.lineJoin="miter";this.lineCap="butt";this.miterLimit=d*1;this.globalAlpha=1;this.font="10px sans-serif";this.textAlign="left";this.textBaseline="alphabetic";this.canvas=i;var m="width:"+i.clientWidth+"px;height:"+i.clientHeight+"px;overflow:hidden;position:absolute";var j=i.ownerDocument.createElement("div");j.style.cssText=m;i.appendChild(j);var p=j.cloneNode(false);p.style.backgroundColor="red";p.style.filter="alpha(opacity=0)";i.appendChild(p);this.element_=j;this.arcScaleX_=1;this.arcScaleY_=1;this.lineScale_=1}var q=D.prototype;q.clearRect=function(){if(this.textMeasureEl_){this.textMeasureEl_.removeNode(true);this.textMeasureEl_=null}this.element_.innerHTML=""};q.beginPath=function(){this.currentPath_=[]};q.moveTo=function(j,i){var m=V(this,j,i);this.currentPath_.push({type:"moveTo",x:m.x,y:m.y});this.currentX_=m.x;this.currentY_=m.y};q.lineTo=function(j,i){var m=V(this,j,i);this.currentPath_.push({type:"lineTo",x:m.x,y:m.y});this.currentX_=m.x;this.currentY_=m.y};q.bezierCurveTo=function(m,j,ak,aj,ai,ag){var i=V(this,ai,ag);var ah=V(this,m,j);var Z=V(this,ak,aj);K(this,ah,Z,i)};function K(i,Z,m,j){i.currentPath_.push({type:"bezierCurveTo",cp1x:Z.x,cp1y:Z.y,cp2x:m.x,cp2y:m.y,x:j.x,y:j.y});i.currentX_=j.x;i.currentY_=j.y}q.quadraticCurveTo=function(ai,m,j,i){var ah=V(this,ai,m);var ag=V(this,j,i);var aj={x:this.currentX_+2/3*(ah.x-this.currentX_),y:this.currentY_+2/3*(ah.y-this.currentY_)};var Z={x:aj.x+(ag.x-this.currentX_)/3,y:aj.y+(ag.y-this.currentY_)/3};K(this,aj,Z,ag)};q.arc=function(al,aj,ak,ag,j,m){ak*=d;var ap=m?"at":"wa";var am=al+A(ag)*ak-f;var ao=aj+l(ag)*ak-f;var i=al+A(j)*ak-f;var an=aj+l(j)*ak-f;if(am==i&&!m){am+=0.125}var Z=V(this,al,aj);var ai=V(this,am,ao);var ah=V(this,i,an);this.currentPath_.push({type:ap,x:Z.x,y:Z.y,radius:ak,xStart:ai.x,yStart:ai.y,xEnd:ah.x,yEnd:ah.y})};q.rect=function(m,j,i,p){this.moveTo(m,j);this.lineTo(m+i,j);this.lineTo(m+i,j+p);this.lineTo(m,j+p);this.closePath()};q.strokeRect=function(m,j,i,p){var Z=this.currentPath_;this.beginPath();this.moveTo(m,j);this.lineTo(m+i,j);this.lineTo(m+i,j+p);this.lineTo(m,j+p);this.closePath();this.stroke();this.currentPath_=Z};q.fillRect=function(m,j,i,p){var Z=this.currentPath_;this.beginPath();this.moveTo(m,j);this.lineTo(m+i,j);this.lineTo(m+i,j+p);this.lineTo(m,j+p);this.closePath();this.fill();this.currentPath_=Z};q.createLinearGradient=function(j,p,i,m){var Z=new U("gradient");Z.x0_=j;Z.y0_=p;Z.x1_=i;Z.y1_=m;return Z};q.createRadialGradient=function(p,ag,m,j,Z,i){var ah=new U("gradientradial");ah.x0_=p;ah.y0_=ag;ah.r0_=m;ah.x1_=j;ah.y1_=Z;ah.r1_=i;return ah};q.drawImage=function(aq,m){var aj,ah,al,ay,ao,am,at,aA;var ak=aq.runtimeStyle.width;var ap=aq.runtimeStyle.height;aq.runtimeStyle.width="auto";aq.runtimeStyle.height="auto";var ai=aq.width;var aw=aq.height;aq.runtimeStyle.width=ak;aq.runtimeStyle.height=ap;if(arguments.length==3){aj=arguments[1];ah=arguments[2];ao=am=0;at=al=ai;aA=ay=aw}else{if(arguments.length==5){aj=arguments[1];ah=arguments[2];al=arguments[3];ay=arguments[4];ao=am=0;at=ai;aA=aw}else{if(arguments.length==9){ao=arguments[1];am=arguments[2];at=arguments[3];aA=arguments[4];aj=arguments[5];ah=arguments[6];al=arguments[7];ay=arguments[8]}else{throw Error("Invalid number of arguments")}}}var az=V(this,aj,ah);var p=at/2;var j=aA/2;var ax=[];var i=10;var ag=10;ax.push(" ','","");this.element_.insertAdjacentHTML("BeforeEnd",ax.join(""))};q.stroke=function(al){var aj=[];var Z=false;var m=10;var am=10;aj.push("ak.x){ak.x=j.x}if(ag.y==null||j.yak.y){ak.y=j.y}}}aj.push(' ">');if(!al){w(this,aj)}else{G(this,aj,ag,ak)}aj.push("");this.element_.insertAdjacentHTML("beforeEnd",aj.join(""))};function w(m,ag){var j=F(m.strokeStyle);var p=j.color;var Z=j.alpha*m.globalAlpha;var i=m.lineScale_*m.lineWidth;if(i<1){Z*=i}ag.push("')}function G(aq,ai,aK,ar){var aj=aq.fillStyle;var aB=aq.arcScaleX_;var aA=aq.arcScaleY_;var j=ar.x-aK.x;var p=ar.y-aK.y;if(aj instanceof U){var an=0;var aF={x:0,y:0};var ax=0;var am=1;if(aj.type_=="gradient"){var al=aj.x0_/aB;var m=aj.y0_/aA;var ak=aj.x1_/aB;var aM=aj.y1_/aA;var aJ=V(aq,al,m);var aI=V(aq,ak,aM);var ag=aI.x-aJ.x;var Z=aI.y-aJ.y;an=Math.atan2(ag,Z)*180/Math.PI;if(an<0){an+=360}if(an<0.000001){an=0}}else{var aJ=V(aq,aj.x0_,aj.y0_);aF={x:(aJ.x-aK.x)/j,y:(aJ.y-aK.y)/p};j/=aB*d;p/=aA*d;var aD=ab.max(j,p);ax=2*aj.r0_/aD;am=2*aj.r1_/aD-ax}var av=aj.colors_;av.sort(function(aN,i){return aN.offset-i.offset});var ap=av.length;var au=av[0].color;var at=av[ap-1].color;var az=av[0].alpha*aq.globalAlpha;var ay=av[ap-1].alpha*aq.globalAlpha;var aE=[];for(var aH=0;aH')}else{if(aj instanceof T){if(j&&p){var ah=-aK.x;var aC=-aK.y;ai.push("')}}else{var aL=F(aq.fillStyle);var aw=aL.color;var aG=aL.alpha*aq.globalAlpha;ai.push('')}}}q.fill=function(){this.stroke(true)};q.closePath=function(){this.currentPath_.push({type:"close"})};function V(j,Z,p){var i=j.m_;return{x:d*(Z*i[0][0]+p*i[1][0]+i[2][0])-f,y:d*(Z*i[0][1]+p*i[1][1]+i[2][1])-f}}q.save=function(){var i={};v(this,i);this.aStack_.push(i);this.mStack_.push(this.m_);this.m_=J(B(),this.m_)};q.restore=function(){if(this.aStack_.length){v(this.aStack_.pop(),this);this.m_=this.mStack_.pop()}};function h(i){return isFinite(i[0][0])&&isFinite(i[0][1])&&isFinite(i[1][0])&&isFinite(i[1][1])&&isFinite(i[2][0])&&isFinite(i[2][1])}function aa(j,i,p){if(!h(i)){return}j.m_=i;if(p){var Z=i[0][0]*i[1][1]-i[0][1]*i[1][0];j.lineScale_=N(H(Z))}}q.translate=function(m,j){var i=[[1,0,0],[0,1,0],[m,j,1]];aa(this,J(i,this.m_),false)};q.rotate=function(j){var p=A(j);var m=l(j);var i=[[p,m,0],[-m,p,0],[0,0,1]];aa(this,J(i,this.m_),false)};q.scale=function(m,j){this.arcScaleX_*=m;this.arcScaleY_*=j;var i=[[m,0,0],[0,j,0],[0,0,1]];aa(this,J(i,this.m_),true)};q.transform=function(Z,p,ah,ag,j,i){var m=[[Z,p,0],[ah,ag,0],[j,i,1]];aa(this,J(m,this.m_),true)};q.setTransform=function(ag,Z,ai,ah,p,j){var i=[[ag,Z,0],[ai,ah,0],[p,j,1]];aa(this,i,true)};q.drawText_=function(am,ak,aj,ap,ai){var ao=this.m_,at=1000,j=0,ar=at,ah={x:0,y:0},ag=[];var i=u(E(this.font),this.element_);var p=ac(i);var au=this.element_.currentStyle;var Z=this.textAlign.toLowerCase();switch(Z){case"left":case"center":case"right":break;case"end":Z=au.direction=="ltr"?"right":"left";break;case"start":Z=au.direction=="rtl"?"right":"left";break;default:Z="left"}switch(this.textBaseline){case"hanging":case"top":ah.y=i.size/1.75;break;case"middle":break;default:case null:case"alphabetic":case"ideographic":case"bottom":ah.y=-i.size/2.25;break}switch(Z){case"right":j=at;ar=0.05;break;case"center":j=ar=at/2;break}var aq=V(this,ak+ah.x,aj+ah.y);ag.push('');if(ai){w(this,ag)}else{G(this,ag,{x:-j,y:0},{x:ar,y:i.size})}var an=ao[0][0].toFixed(3)+","+ao[1][0].toFixed(3)+","+ao[0][1].toFixed(3)+","+ao[1][1].toFixed(3)+",0,0";var al=n(aq.x/d+1-ao[0][0])+","+n(aq.y/d-2*ao[1][0]);ag.push('','','');this.element_.insertAdjacentHTML("beforeEnd",ag.join(""))};q.fillText=function(m,i,p,j){this.drawText_(m,i,p,j,false)};q.strokeText=function(m,i,p,j){this.drawText_(m,i,p,j,true)};q.measureText=function(m){if(!this.textMeasureEl_){var i='';this.element_.insertAdjacentHTML("beforeEnd",i);this.textMeasureEl_=this.element_.lastChild}var j=this.element_.ownerDocument;this.textMeasureEl_.innerHTML="";this.textMeasureEl_.style.font=this.font;this.textMeasureEl_.appendChild(j.createTextNode(m));return{width:this.textMeasureEl_.offsetWidth}};q.clip=function(){};q.arcTo=function(){};q.createPattern=function(j,i){return new T(j,i)};function U(i){this.type_=i;this.x0_=0;this.y0_=0;this.r0_=0;this.x1_=0;this.y1_=0;this.r1_=0;this.colors_=[]}U.prototype.addColorStop=function(j,i){i=F(i);this.colors_.push({offset:j,color:i.color,alpha:i.alpha})};function T(j,i){Q(j);switch(i){case"repeat":case null:case"":this.repetition_="repeat";break;case"repeat-x":case"repeat-y":case"no-repeat":this.repetition_=i;break;default:O("SYNTAX_ERR")}this.src_=j.src;this.width_=j.width;this.height_=j.height}function O(i){throw new P(i)}function Q(i){if(!i||i.nodeType!=1||i.tagName!="IMG"){O("TYPE_MISMATCH_ERR")}if(i.readyState!="complete"){O("INVALID_STATE_ERR")}}function P(i){this.code=this[i];this.message=i+": DOM Exception "+this.code}var X=P.prototype=new Error;X.INDEX_SIZE_ERR=1;X.DOMSTRING_SIZE_ERR=2;X.HIERARCHY_REQUEST_ERR=3;X.WRONG_DOCUMENT_ERR=4;X.INVALID_CHARACTER_ERR=5;X.NO_DATA_ALLOWED_ERR=6;X.NO_MODIFICATION_ALLOWED_ERR=7;X.NOT_FOUND_ERR=8;X.NOT_SUPPORTED_ERR=9;X.INUSE_ATTRIBUTE_ERR=10;X.INVALID_STATE_ERR=11;X.SYNTAX_ERR=12;X.INVALID_MODIFICATION_ERR=13;X.NAMESPACE_ERR=14;X.INVALID_ACCESS_ERR=15;X.VALIDATION_ERR=16;X.TYPE_MISMATCH_ERR=17;G_vmlCanvasManager=e;CanvasRenderingContext2D=D;CanvasGradient=U;CanvasPattern=T;DOMException=P;G_vmlCanvasManager._version=888})()}; \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/gpl-2.0.txt b/libreplan-webapp/src/main/webapp/jqplot/gpl-2.0.txt new file mode 100644 index 000000000..864c6b8b7 --- /dev/null +++ b/libreplan-webapp/src/main/webapp/jqplot/gpl-2.0.txt @@ -0,0 +1,280 @@ +Title: GPL Version 2 + + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Lesser General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/jqPlotCssStyling.txt b/libreplan-webapp/src/main/webapp/jqplot/jqPlotCssStyling.txt new file mode 100644 index 000000000..041035d2e --- /dev/null +++ b/libreplan-webapp/src/main/webapp/jqplot/jqPlotCssStyling.txt @@ -0,0 +1,53 @@ +Title: jqPlot CSS Customization + +Much of the styling of jqPlot is done by css. The jqPlot css file is, unremarkably, +jquery.jqplot.css and resides in the same directory as jqPlot itself. + +There exist some styling related javascript properties on the plot objects themselves +(like fontStyle, fontSize, etc.). These can be set with the options object at plot creation. +Generally, setting these options is *NOT* the preferred way to customize the look of the +plot. Use the css file instead. *These options are deprecated and may disappear*. The +exceptions are certain background and color options which control attributes of something +renderered on a canvas. This would be line color, grid background, etc. These must +be set by the options object. For a list of available options, see . + +Objects in the plot that can be customized by css are given a css class like ".jqplot-*". +For example, the plot title will have a ".jqplot-title" class, the axes ".jqplot-axis", etc. + +Currently assigned classes in jqPlot +are as follows: + +.jqplot-target - Styles for the plot target div. These will be cascaded down +to all plot elements according to css rules. + +.jqplot-axis - Styles for all axes + +.jqplot-xaxis - Styles applied to the primary x axis only. + +.jqplot-yaxis - Styles applied to the primary y axis only. + +.jqplot-x2axis, .jqplot-x3axis, ... - Styles applied to the 2nd, 3rd, etc. x axis only. + +.jqplot-y2axis, .jqplot-y3axis, ... - Styles applied to the 2nd, 3rd, etc.y axis only. + +.jqplot-axis-tick - Styles applied to all axis ticks + +.jqplot-xaxis-tick - Styles applied to primary x axis ticks only. + +.jqplot-x2axis-tick - Styles applied to secondary x axis ticks only. + +.jqplot-yaxis-tick - Styles applied to primary y axis ticks only. + +.jqplot-y2axis-tick - Styles applied to secondary y axis ticks only. + +table.jqplot-table-legend - Styles applied to the legend box table. + +.jqplot-title - Styles applied to the title. + +.jqplot-cursor-tooltip - Styles applied to the cursor tooltip + +.jqplot-highlighter-tooltip - Styles applied to the highlighter tooltip. + +div.jqplot-table-legend-swatch - the div element used for the colored swatch on the legend. + +Note that axes will be assigned 2 classes like: class=".jqplot-axis .jqplot-xaxis". \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/jqPlotOptions.txt b/libreplan-webapp/src/main/webapp/jqplot/jqPlotOptions.txt new file mode 100644 index 000000000..d2d1e68cc --- /dev/null +++ b/libreplan-webapp/src/main/webapp/jqplot/jqPlotOptions.txt @@ -0,0 +1,276 @@ +Title: jqPlot Options + +**This document is out of date. While the options described here should still be +relavent and valid, it has not been updated for many new options. Sorry for +this inconvenience.** + +This document describes the options available to jqPlot. These are set with the +third argument to the $.jqplot('target', data, options) function. Options are +using the following convention: + +{{{ +property: default, // notes +}}} + +This document is not complete! Not all options are shown! Also, Options marked +with ** in the notes are post 0.7.1 additions. They will be available in the next +release. Further information about the options can be found in the online API +documentation. For details on how the options relate to the API documentation, +see the in the optionsTutorial.txt file. + +{{{ +options = +{ + seriesColors: [ "#4bb2c5", "#c5b47f", "#EAA228", "#579575", "#839557", "#958c12", + "#953579", "#4b5de4", "#d8b83f", "#ff5800", "#0085cc"], // colors that will + // be assigned to the series. If there are more series than colors, colors + // will wrap around and start at the beginning again. + + stackSeries: false, // if true, will create a stack plot. + // Currently supported by line and bar graphs. + + title: '', // Title for the plot. Can also be specified as an object like: + + title: { + text: '', // title for the plot, + show: true, + }, + + axesDefaults: { + show: false, // wether or not to renderer the axis. Determined automatically. + min: null, // minimum numerical value of the axis. Determined automatically. + max: null, // maximum numverical value of the axis. Determined automatically. + pad: 1.2, // a factor multiplied by the data range on the axis to give the + // axis range so that data points don't fall on the edges of the axis. + ticks: [], // a 1D [val1, val2, ...], or 2D [[val, label], [val, label], ...] + // array of ticks to use. Computed automatically. + numberTicks: undefined, + renderer: $.jqplot.LinearAxisRenderer, // renderer to use to draw the axis, + rendererOptions: {}, // options to pass to the renderer. LinearAxisRenderer + // has no options, + tickOptions: { + mark: 'outside', // Where to put the tick mark on the axis + // 'outside', 'inside' or 'cross', + showMark: true, + showGridline: true, // wether to draw a gridline (across the whole grid) at this tick, + markSize: 4, // length the tick will extend beyond the grid in pixels. For + // 'cross', length will be added above and below the grid boundary, + show: true, // wether to show the tick (mark and label), + showLabel: true, // wether to show the text label at the tick, + formatString: '', // format string to use with the axis tick formatter + } + showTicks: true, // wether or not to show the tick labels, + showTickMarks: true, // wether or not to show the tick marks + }, + + axes: { + xaxis: { + // same options as axesDefaults + }, + yaxis: { + // same options as axesDefaults + }, + x2axis: { + // same options as axesDefaults + }, + y2axis: { + // same options as axesDefaults + } + }, + + seriesDefaults: { + show: true, // wether to render the series. + xaxis: 'xaxis', // either 'xaxis' or 'x2axis'. + yaxis: 'yaxis', // either 'yaxis' or 'y2axis'. + label: '', // label to use in the legend for this line. + color: '', // CSS color spec to use for the line. Determined automatically. + lineWidth: 2.5, // Width of the line in pixels. + shadow: true, // show shadow or not. + shadowAngle: 45, // angle (degrees) of the shadow, clockwise from x axis. + shadowOffset: 1.25, // offset from the line of the shadow. + shadowDepth: 3, // Number of strokes to make when drawing shadow. Each + // stroke offset by shadowOffset from the last. + shadowAlpha: 0.1, // Opacity of the shadow. + showLine: true, // whether to render the line segments or not. + showMarker: true, // render the data point markers or not. + fill: false, // fill under the line, + fillAndStroke: false, // **stroke a line at top of fill area. + fillColor: undefined, // **custom fill color for filled lines (default is line color). + fillAlpha: undefined, // **custom alpha to apply to fillColor. + renderer: $.jqplot.LineRenderer], // renderer used to draw the series. + rendererOptions: {}, // options passed to the renderer. LineRenderer has no options. + markerRenderer: $.jqplot.MarkerRenderer, // renderer to use to draw the data + // point markers. + markerOptions: { + show: true, // wether to show data point markers. + style: 'filledCircle', // circle, diamond, square, filledCircle. + // filledDiamond or filledSquare. + lineWidth: 2, // width of the stroke drawing the marker. + size: 9, // size (diameter, edge length, etc.) of the marker. + color: '#666666' // color of marker, set to color of line by default. + shadow: true, // wether to draw shadow on marker or not. + shadowAngle: 45, // angle of the shadow. Clockwise from x axis. + shadowOffset: 1, // offset from the line of the shadow, + shadowDepth: 3, // Number of strokes to make when drawing shadow. Each stroke + // offset by shadowOffset from the last. + shadowAlpha: 0.07 // Opacity of the shadow + } + }, + + series:[ + {Each series has same options as seriesDefaults}, + {You can override each series individually here} + ], + + legend: { + show: false, + location: 'ne', // compass direction, nw, n, ne, e, se, s, sw, w. + xoffset: 12, // pixel offset of the legend box from the x (or x2) axis. + yoffset: 12, // pixel offset of the legend box from the y (or y2) axis. + }, + + grid: { + drawGridLines: true, // wether to draw lines across the grid or not. + gridLineColor: '#cccccc' // **Color of the grid lines. + background: '#fffdf6', // CSS color spec for background color of grid. + borderColor: '#999999', // CSS color spec for border around grid. + borderWidth: 2.0, // pixel width of border around grid. + shadow: true, // draw a shadow for grid. + shadowAngle: 45, // angle of the shadow. Clockwise from x axis. + shadowOffset: 1.5, // offset from the line of the shadow. + shadowWidth: 3, // width of the stroke for the shadow. + shadowDepth: 3, // Number of strokes to make when drawing shadow. + // Each stroke offset by shadowOffset from the last. + shadowAlpha: 0.07 // Opacity of the shadow + renderer: $.jqplot.CanvasGridRenderer, // renderer to use to draw the grid. + rendererOptions: {} // options to pass to the renderer. Note, the default + // CanvasGridRenderer takes no additional options. + }, + + // Plugin and renderer options. + + // BarRenderer. + // With BarRenderer, you can specify additional options in the rendererOptions object + // on the series or on the seriesDefaults object. Note, some options are respecified + // (like shadowDepth) to override lineRenderer defaults from which BarRenderer inherits. + + seriesDefaults: { + rendererOptions: { + barPadding: 8, // number of pixels between adjacent bars in the same + // group (same category or bin). + barMargin: 10, // number of pixels between adjacent groups of bars. + barDirection: 'vertical', // vertical or horizontal. + barWidth: null, // width of the bars. null to calculate automatically. + shadowOffset: 2, // offset from the bar edge to stroke the shadow. + shadowDepth: 5, // nuber of strokes to make for the shadow. + shadowAlpha: 0.8, // transparency of the shadow. + } + }, + + // Cursor + // Options are passed to the cursor plugin through the "cursor" object at the top + // level of the options object. + + cursor: { + style: 'crosshair', // A CSS spec for the cursor type to change the + // cursor to when over plot. + show: true, + showTooltip: true, // show a tooltip showing cursor position. + followMouse: false, // wether tooltip should follow the mouse or be stationary. + tooltipLocation: 'se', // location of the tooltip either relative to the mouse + // (followMouse=true) or relative to the plot. One of + // the compass directions, n, ne, e, se, etc. + tooltipOffset: 6, // pixel offset of the tooltip from the mouse or the axes. + showTooltipGridPosition: false, // show the grid pixel coordinates of the mouse + // in the tooltip. + showTooltipUnitPosition: true, // show the coordinates in data units of the mouse + // in the tooltip. + tooltipFormatString: '%.4P', // sprintf style format string for tooltip values. + useAxesFormatters: true, // wether to use the same formatter and formatStrings + // as used by the axes, or to use the formatString + // specified on the cursor with sprintf. + tooltipAxesGroups: [], // show only specified axes groups in tooltip. Would specify like: + // [['xaxis', 'yaxis'], ['xaxis', 'y2axis']]. By default, all axes + // combinations with for the series in the plot are shown. + + }, + + // Dragable + // Dragable options are specified with the "dragable" object at the top level + // of the options object. + + dragable: { + color: undefined, // custom color to use for the dragged point and dragged line + // section. default will use a transparent variant of the line color. + constrainTo: 'none', // Constrain dragging motion to an axis: 'x', 'y', or 'none'. + }, + + // Highlighter + // Highlighter options are specified with the "highlighter" object at the top level + // of the options object. + + highlighter: { + lineWidthAdjust: 2.5, // pixels to add to the size line stroking the data point marker + // when showing highlight. Only affects non filled data point markers. + sizeAdjust: 5, // pixels to add to the size of filled markers when drawing highlight. + showTooltip: true, // show a tooltip with data point values. + tooltipLocation: 'nw', // location of tooltip: n, ne, e, se, s, sw, w, nw. + fadeTooltip: true, // use fade effect to show/hide tooltip. + tooltipFadeSpeed: "fast"// slow, def, fast, or a number of milliseconds. + tooltipOffset: 2, // pixel offset of tooltip from the highlight. + tooltipAxes: 'both', // which axis values to display in the tooltip, x, y or both. + tooltipSeparator: ', ' // separator between values in the tooltip. + useAxesFormatters: true // use the same format string and formatters as used in the axes to + // display values in the tooltip. + tooltipFormatString: '%.5P' // sprintf format string for the tooltip. only used if + // useAxesFormatters is false. Will use sprintf formatter with + // this string, not the axes formatters. + }, + + // LogAxisRenderer + // LogAxisRenderer add 2 options to the axes object. These options are specified directly on + // the axes or axesDefaults object. + + axesDefaults: { + base: 10, // the logarithmic base. + tickDistribution: 'even', // 'even' or 'power'. 'even' will produce with even visiual (pixel) + // spacing on the axis. 'power' will produce ticks spaced by + // increasing powers of the log base. + }, + + // PieRenderer + // PieRenderer accepts options from the rendererOptions object of the series or seriesDefaults object. + + seriesDefaults: { + rendererOptions: { + diameter: undefined, // diameter of pie, auto computed by default. + padding: 20, // padding between pie and neighboring legend or plot margin. + sliceMargin: 0, // gap between slices. + fill: true, // render solid (filled) slices. + shadowOffset: 2, // offset of the shadow from the chart. + shadowDepth: 5, // Number of strokes to make when drawing shadow. Each stroke + // offset by shadowOffset from the last. + shadowAlpha: 0.07 // Opacity of the shadow + } + }, + + // Trendline + // Trendline takes options on the trendline object of the series or seriesDefaults object. + + seriesDefaults: { + trendline: { + show: true, // show the trend line + color: '#666666', // CSS color spec for the trend line. + label: '', // label for the trend line. + type: 'linear', // 'linear', 'exponential' or 'exp' + shadow: true, // show the trend line shadow. + lineWidth: 1.5, // width of the trend line. + shadowAngle: 45, // angle of the shadow. Clockwise from x axis. + shadowOffset: 1.5, // offset from the line of the shadow. + shadowDepth: 3, // Number of strokes to make when drawing shadow. + // Each stroke offset by shadowOffset from the last. + shadowAlpha: 0.07 // Opacity of the shadow + } + } +} +}}} \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/jquery.jqplot.css b/libreplan-webapp/src/main/webapp/jqplot/jquery.jqplot.css new file mode 100644 index 000000000..d30bafb1f --- /dev/null +++ b/libreplan-webapp/src/main/webapp/jqplot/jquery.jqplot.css @@ -0,0 +1,259 @@ +/*rules for the plot target div. These will be cascaded down to all plot elements according to css rules*/ +.jqplot-target { + position: relative; + color: #666666; + font-family: "Trebuchet MS", Arial, Helvetica, sans-serif; + font-size: 1em; +/* height: 300px; + width: 400px;*/ +} + +/*rules applied to all axes*/ +.jqplot-axis { + font-size: 0.75em; +} + +.jqplot-xaxis { + margin-top: 10px; +} + +.jqplot-x2axis { + margin-bottom: 10px; +} + +.jqplot-yaxis { + margin-right: 10px; +} + +.jqplot-y2axis, .jqplot-y3axis, .jqplot-y4axis, .jqplot-y5axis, .jqplot-y6axis, .jqplot-y7axis, .jqplot-y8axis, .jqplot-y9axis, .jqplot-yMidAxis { + margin-left: 10px; + margin-right: 10px; +} + +/*rules applied to all axis tick divs*/ +.jqplot-axis-tick, .jqplot-xaxis-tick, .jqplot-yaxis-tick, .jqplot-x2axis-tick, .jqplot-y2axis-tick, .jqplot-y3axis-tick, .jqplot-y4axis-tick, .jqplot-y5axis-tick, .jqplot-y6axis-tick, .jqplot-y7axis-tick, .jqplot-y8axis-tick, .jqplot-y9axis-tick, .jqplot-yMidAxis-tick { + position: absolute; + white-space: pre; +} + + +.jqplot-xaxis-tick { + top: 0px; + /* initial position untill tick is drawn in proper place */ + left: 15px; +/* padding-top: 10px;*/ + vertical-align: top; +} + +.jqplot-x2axis-tick { + bottom: 0px; + /* initial position untill tick is drawn in proper place */ + left: 15px; +/* padding-bottom: 10px;*/ + vertical-align: bottom; +} + +.jqplot-yaxis-tick { + right: 0px; + /* initial position untill tick is drawn in proper place */ + top: 15px; +/* padding-right: 10px;*/ + text-align: right; +} + +.jqplot-yaxis-tick.jqplot-breakTick { + right: -20px; + margin-right: 0px; + padding:1px 5px 1px 5px; +/* background-color: white;*/ + z-index: 2; + font-size: 1.5em; +} + +.jqplot-y2axis-tick, .jqplot-y3axis-tick, .jqplot-y4axis-tick, .jqplot-y5axis-tick, .jqplot-y6axis-tick, .jqplot-y7axis-tick, .jqplot-y8axis-tick, .jqplot-y9axis-tick { + left: 0px; + /* initial position untill tick is drawn in proper place */ + top: 15px; +/* padding-left: 10px;*/ +/* padding-right: 15px;*/ + text-align: left; +} + +.jqplot-yMidAxis-tick { + text-align: center; + white-space: nowrap; +} + +.jqplot-xaxis-label { + margin-top: 10px; + font-size: 11pt; + position: absolute; +} + +.jqplot-x2axis-label { + margin-bottom: 10px; + font-size: 11pt; + position: absolute; +} + +.jqplot-yaxis-label { + margin-right: 10px; +/* text-align: center;*/ + font-size: 11pt; + position: absolute; +} + +.jqplot-yMidAxis-label { + font-size: 11pt; + position: absolute; +} + +.jqplot-y2axis-label, .jqplot-y3axis-label, .jqplot-y4axis-label, .jqplot-y5axis-label, .jqplot-y6axis-label, .jqplot-y7axis-label, .jqplot-y8axis-label, .jqplot-y9axis-label { +/* text-align: center;*/ + font-size: 11pt; + margin-left: 10px; + position: absolute; +} + +.jqplot-meterGauge-tick { + font-size: 0.75em; + color: #999999; +} + +.jqplot-meterGauge-label { + font-size: 1em; + color: #999999; +} + +table.jqplot-table-legend { + margin-top: 12px; + margin-bottom: 12px; + margin-left: 12px; + margin-right: 12px; +} + +table.jqplot-table-legend, table.jqplot-cursor-legend { + background-color: rgba(255,255,255,0.6); + border: 1px solid #cccccc; + position: absolute; + font-size: 0.75em; +} + +td.jqplot-table-legend { + vertical-align:middle; +} + +/* +These rules could be used instead of assigning +element styles and relying on js object properties. +*/ + +/* +td.jqplot-table-legend-swatch { + padding-top: 0.5em; + text-align: center; +} + +tr.jqplot-table-legend:first td.jqplot-table-legend-swatch { + padding-top: 0px; +} +*/ + +td.jqplot-seriesToggle:hover, td.jqplot-seriesToggle:active { + cursor: pointer; +} + +.jqplot-table-legend .jqplot-series-hidden { + text-decoration: line-through; +} + +div.jqplot-table-legend-swatch-outline { + border: 1px solid #cccccc; + padding:1px; +} + +div.jqplot-table-legend-swatch { + width:0px; + height:0px; + border-top-width: 5px; + border-bottom-width: 5px; + border-left-width: 6px; + border-right-width: 6px; + border-top-style: solid; + border-bottom-style: solid; + border-left-style: solid; + border-right-style: solid; +} + +.jqplot-title { + top: 0px; + left: 0px; + padding-bottom: 0.5em; + font-size: 1.2em; +} + +table.jqplot-cursor-tooltip { + border: 1px solid #cccccc; + font-size: 0.75em; +} + + +.jqplot-cursor-tooltip { + border: 1px solid #cccccc; + font-size: 0.75em; + white-space: nowrap; + background: rgba(208,208,208,0.5); + padding: 1px; +} + +.jqplot-highlighter-tooltip, .jqplot-canvasOverlay-tooltip { + border: 1px solid #cccccc; + font-size: 0.75em; + white-space: nowrap; + background: rgba(208,208,208,0.5); + padding: 1px; +} + +.jqplot-point-label { + font-size: 0.75em; + z-index: 2; +} + +td.jqplot-cursor-legend-swatch { + vertical-align: middle; + text-align: center; +} + +div.jqplot-cursor-legend-swatch { + width: 1.2em; + height: 0.7em; +} + +.jqplot-error { +/* Styles added to the plot target container when there is an error go here.*/ + text-align: center; +} + +.jqplot-error-message { +/* Styling of the custom error message div goes here.*/ + position: relative; + top: 46%; + display: inline-block; +} + +div.jqplot-bubble-label { + font-size: 0.8em; +/* background: rgba(90%, 90%, 90%, 0.15);*/ + padding-left: 2px; + padding-right: 2px; + color: rgb(20%, 20%, 20%); +} + +div.jqplot-bubble-label.jqplot-bubble-label-highlight { + background: rgba(90%, 90%, 90%, 0.7); +} + +div.jqplot-noData-container { + text-align: center; + background-color: rgba(96%, 96%, 96%, 0.3); +} diff --git a/libreplan-webapp/src/main/webapp/jqplot/jquery.jqplot.js b/libreplan-webapp/src/main/webapp/jqplot/jquery.jqplot.js new file mode 100644 index 000000000..4c8347e2b --- /dev/null +++ b/libreplan-webapp/src/main/webapp/jqplot/jquery.jqplot.js @@ -0,0 +1,10900 @@ +/** + * Title: jqPlot Charts + * + * Pure JavaScript plotting plugin for jQuery. + * + * About: Version + * + * 1.0.0b2_r1012 + * + * About: Copyright & License + * + * Copyright (c) 2009-2011 Chris Leonello + * jqPlot is currently available for use in all personal or commercial projects + * under both the MIT and GPL version 2.0 licenses. This means that you can + * choose the license that best suits your project and use it accordingly. + * + * See and contained within this distribution for further information. + * + * The author would appreciate an email letting him know of any substantial + * use of jqPlot. You can reach the author at: chris at jqplot dot com + * or see http://www.jqplot.com/info.php. This is, of course, not required. + * + * If you are feeling kind and generous, consider supporting the project by + * making a donation at: http://www.jqplot.com/donate.php. + * + * sprintf functions contained in jqplot.sprintf.js by Ash Searle: + * + * version 2007.04.27 + * author Ash Searle + * http://hexmen.com/blog/2007/03/printf-sprintf/ + * http://hexmen.com/js/sprintf.js + * The author (Ash Searle) has placed this code in the public domain: + * "This code is unrestricted: you are free to use it however you like." + * + * + * About: Introduction + * + * jqPlot requires jQuery (1.4+ required for certain features). jQuery 1.4.2 is included in the distribution. + * To use jqPlot include jQuery, the jqPlot jQuery plugin, the jqPlot css file and optionally + * the excanvas script for IE support in your web page: + * + * > + * > + * > + * > + * + * jqPlot can be customized by overriding the defaults of any of the objects which make + * up the plot. The general usage of jqplot is: + * + * > chart = $.jqplot('targetElemId', [dataArray,...], {optionsObject}); + * + * The options available to jqplot are detailed in in the jqPlotOptions.txt file. + * + * An actual call to $.jqplot() may look like the + * examples below: + * + * > chart = $.jqplot('chartdiv', [[[1, 2],[3,5.12],[5,13.1],[7,33.6],[9,85.9],[11,219.9]]]); + * + * or + * + * > dataArray = [34,12,43,55,77]; + * > chart = $.jqplot('targetElemId', [dataArray, ...], {title:'My Plot', axes:{yaxis:{min:20, max:100}}}); + * + * For more inforrmation, see . + * + * About: Usage + * + * See + * + * About: Available Options + * + * See for a list of options available thorugh the options object (not complete yet!) + * + * About: Options Usage + * + * See + * + * About: Changes + * + * See + * + */ + +(function($) { + // make sure undefined is undefined + var undefined; + + $.fn.emptyForce = function() { + for ( var i = 0, elem; (elem = $(this)[i]) != null; i++ ) { + // Remove element nodes and prevent memory leaks + if ( elem.nodeType === 1 ) { + jQuery.cleanData( elem.getElementsByTagName("*") ); + } + + // Remove any remaining nodes + if ($.jqplot_use_excanvas) { + elem.outerHTML = ""; + } + else { + while ( elem.firstChild ) { + elem.removeChild( elem.firstChild ); + } + } + + elem = null; + } + + return $(this); + }; + + $.fn.removeChildForce = function(parent) { + while ( parent.firstChild ) { + this.removeChildForce( parent.firstChild ); + parent.removeChild( parent.firstChild ); + } + }; + + + /** + * Namespace: $.jqplot + * jQuery function called by the user to create a plot. + * + * Parameters: + * target - ID of target element to render the plot into. + * data - an array of data series. + * options - user defined options object. See the individual classes for available options. + * + * Properties: + * config - object to hold configuration information for jqPlot plot object. + * + * attributes: + * enablePlugins - False to disable plugins by default. Plugins must then be explicitly + * enabled in the individual plot options. Default: false. + * This property sets the "show" property of certain plugins to true or false. + * Only plugins that can be immediately active upon loading are affected. This includes + * non-renderer plugins like cursor, dragable, highlighter, and trendline. + * defaultHeight - Default height for plots where no css height specification exists. This + * is a jqplot wide default. + * defaultWidth - Default height for plots where no css height specification exists. This + * is a jqplot wide default. + */ + + $.jqplot = function(target, data, options) { + var _data, _options; + + if (options == null) { + if (jQuery.isArray(data)) { + _data = data; + _options = null; + } + + else if (typeof(data) === 'object') { + _data = null; + _options = data; + } + } + else { + _data = data; + _options = options; + } + var plot = new jqPlot(); + // remove any error class that may be stuck on target. + $('#'+target).removeClass('jqplot-error'); + + if ($.jqplot.config.catchErrors) { + try { + plot.init(target, _data, _options); + plot.draw(); + plot.themeEngine.init.call(plot); + return plot; + } + catch(e) { + var msg = $.jqplot.config.errorMessage || e.message; + $('#'+target).append('
    '+msg+'
    '); + $('#'+target).addClass('jqplot-error'); + document.getElementById(target).style.background = $.jqplot.config.errorBackground; + document.getElementById(target).style.border = $.jqplot.config.errorBorder; + document.getElementById(target).style.fontFamily = $.jqplot.config.errorFontFamily; + document.getElementById(target).style.fontSize = $.jqplot.config.errorFontSize; + document.getElementById(target).style.fontStyle = $.jqplot.config.errorFontStyle; + document.getElementById(target).style.fontWeight = $.jqplot.config.errorFontWeight; + } + } + else { + plot.init(target, _data, _options); + plot.draw(); + plot.themeEngine.init.call(plot); + return plot; + } + }; + + $.jqplot.version = "1.0.0b2_r1012"; + + // canvas manager to reuse canvases on the plot. + // Should help solve problem of canvases not being freed and + // problem of waiting forever for firefox to decide to free memory. + $.jqplot.CanvasManager = function() { + // canvases are managed globally so that they can be reused + // across plots after they have been freed + if (typeof $.jqplot.CanvasManager.canvases == 'undefined') { + $.jqplot.CanvasManager.canvases = []; + $.jqplot.CanvasManager.free = []; + } + + var myCanvases = []; + + this.getCanvas = function() { + var canvas; + var makeNew = true; + + if (!$.jqplot.use_excanvas) { + for (var i = 0, l = $.jqplot.CanvasManager.canvases.length; i < l; i++) { + if ($.jqplot.CanvasManager.free[i] === true) { + makeNew = false; + canvas = $.jqplot.CanvasManager.canvases[i]; + // $(canvas).removeClass('jqplot-canvasManager-free').addClass('jqplot-canvasManager-inuse'); + $.jqplot.CanvasManager.free[i] = false; + myCanvases.push(i); + break; + } + } + } + + if (makeNew) { + canvas = document.createElement('canvas'); + myCanvases.push($.jqplot.CanvasManager.canvases.length); + $.jqplot.CanvasManager.canvases.push(canvas); + $.jqplot.CanvasManager.free.push(false); + } + + return canvas; + }; + + // this method has to be used after settings the dimesions + // on the element returned by getCanvas() + this.initCanvas = function(canvas) { + if ($.jqplot.use_excanvas) { + return window.G_vmlCanvasManager.initElement(canvas); + } + return canvas; + }; + + this.freeAllCanvases = function() { + for (var i = 0, l=myCanvases.length; i < l; i++) { + this.freeCanvas(myCanvases[i]); + } + myCanvases = []; + }; + + this.freeCanvas = function(idx) { + if ($.jqplot.use_excanvas && window.G_vmlCanvasManager.uninitElement !== undefined) { + // excanvas can't be reused, but properly unset + window.G_vmlCanvasManager.uninitElement($.jqplot.CanvasManager.canvases[idx]); + $.jqplot.CanvasManager.canvases[idx] = null; + } + else { + var canvas = $.jqplot.CanvasManager.canvases[idx]; + canvas.getContext('2d').clearRect(0, 0, canvas.width, canvas.height); + $(canvas).unbind().removeAttr('class').removeAttr('style'); + // Style attributes seemed to be still hanging around. wierd. Some ticks + // still retained a left: 0px attribute after reusing a canvas. + $(canvas).css({left: '', top: '', position: ''}); + // setting size to 0 may save memory of unused canvases? + canvas.width = 0; + canvas.height = 0; + $.jqplot.CanvasManager.free[idx] = true; + } + }; + + }; + + + // Convienence function that won't hang IE or FF without FireBug. + $.jqplot.log = function() { + if (window.console) { + window.console.log.apply(window.console, arguments); + } + }; + + $.jqplot.config = { + addDomReference: false, + enablePlugins:false, + defaultHeight:300, + defaultWidth:400, + UTCAdjust:false, + timezoneOffset: new Date(new Date().getTimezoneOffset() * 60000), + errorMessage: '', + errorBackground: '', + errorBorder: '', + errorFontFamily: '', + errorFontSize: '', + errorFontStyle: '', + errorFontWeight: '', + catchErrors: false, + defaultTickFormatString: "%.1f", + defaultColors: [ "#4bb2c5", "#EAA228", "#c5b47f", "#579575", "#839557", "#958c12", "#953579", "#4b5de4", "#d8b83f", "#ff5800", "#0085cc", "#c747a3", "#cddf54", "#FBD178", "#26B4E3", "#bd70c7"], + defaultNegativeColors: [ "#498991", "#C08840", "#9F9274", "#546D61", "#646C4A", "#6F6621", "#6E3F5F", "#4F64B0", "#A89050", "#C45923", "#187399", "#945381", "#959E5C", "#C7AF7B", "#478396", "#907294"], + dashLength: 4, + gapLength: 4, + dotGapLength: 2.5, + srcLocation: 'jqplot/src/', + pluginLocation: 'jqplot/src/plugins/' + }; + + + $.jqplot.arrayMax = function( array ){ + return Math.max.apply( Math, array ); + }; + + $.jqplot.arrayMin = function( array ){ + return Math.min.apply( Math, array ); + }; + + $.jqplot.enablePlugins = $.jqplot.config.enablePlugins; + + // canvas related tests taken from modernizer: + // Copyright (c) 2009 - 2010 Faruk Ates. + // http://www.modernizr.com + + $.jqplot.support_canvas = function() { + if (typeof $.jqplot.support_canvas.result == 'undefined') { + $.jqplot.support_canvas.result = !!document.createElement('canvas').getContext; + } + return $.jqplot.support_canvas.result; + }; + + $.jqplot.support_canvas_text = function() { + if (typeof $.jqplot.support_canvas_text.result == 'undefined') { + if (window.G_vmlCanvasManager !== undefined && window.G_vmlCanvasManager._version > 887) { + $.jqplot.support_canvas_text.result = true; + } + else { + $.jqplot.support_canvas_text.result = !!(document.createElement('canvas').getContext && typeof document.createElement('canvas').getContext('2d').fillText == 'function'); + } + + } + return $.jqplot.support_canvas_text.result; + }; + + $.jqplot.use_excanvas = ($.browser.msie && !$.jqplot.support_canvas()) ? true : false; + + /** + * + * Hooks: jqPlot Pugin Hooks + * + * $.jqplot.preInitHooks - called before initialization. + * $.jqplot.postInitHooks - called after initialization. + * $.jqplot.preParseOptionsHooks - called before user options are parsed. + * $.jqplot.postParseOptionsHooks - called after user options are parsed. + * $.jqplot.preDrawHooks - called before plot draw. + * $.jqplot.postDrawHooks - called after plot draw. + * $.jqplot.preDrawSeriesHooks - called before each series is drawn. + * $.jqplot.postDrawSeriesHooks - called after each series is drawn. + * $.jqplot.preDrawLegendHooks - called before the legend is drawn. + * $.jqplot.addLegendRowHooks - called at the end of legend draw, so plugins + * can add rows to the legend table. + * $.jqplot.preSeriesInitHooks - called before series is initialized. + * $.jqplot.postSeriesInitHooks - called after series is initialized. + * $.jqplot.preParseSeriesOptionsHooks - called before series related options + * are parsed. + * $.jqplot.postParseSeriesOptionsHooks - called after series related options + * are parsed. + * $.jqplot.eventListenerHooks - called at the end of plot drawing, binds + * listeners to the event canvas which lays on top of the grid area. + * $.jqplot.preDrawSeriesShadowHooks - called before series shadows are drawn. + * $.jqplot.postDrawSeriesShadowHooks - called after series shadows are drawn. + * + */ + + $.jqplot.preInitHooks = []; + $.jqplot.postInitHooks = []; + $.jqplot.preParseOptionsHooks = []; + $.jqplot.postParseOptionsHooks = []; + $.jqplot.preDrawHooks = []; + $.jqplot.postDrawHooks = []; + $.jqplot.preDrawSeriesHooks = []; + $.jqplot.postDrawSeriesHooks = []; + $.jqplot.preDrawLegendHooks = []; + $.jqplot.addLegendRowHooks = []; + $.jqplot.preSeriesInitHooks = []; + $.jqplot.postSeriesInitHooks = []; + $.jqplot.preParseSeriesOptionsHooks = []; + $.jqplot.postParseSeriesOptionsHooks = []; + $.jqplot.eventListenerHooks = []; + $.jqplot.preDrawSeriesShadowHooks = []; + $.jqplot.postDrawSeriesShadowHooks = []; + + // A superclass holding some common properties and methods. + $.jqplot.ElemContainer = function() { + this._elem; + this._plotWidth; + this._plotHeight; + this._plotDimensions = {height:null, width:null}; + }; + + $.jqplot.ElemContainer.prototype.createElement = function(el, offsets, clss, cssopts, attrib) { + this._offsets = offsets; + var klass = clss || 'jqplot'; + var elem = document.createElement(el); + this._elem = $(elem); + this._elem.addClass(klass); + this._elem.css(cssopts); + this._elem.attr(attrib); + // avoid memory leak; + elem = null; + return this._elem; + }; + + $.jqplot.ElemContainer.prototype.getWidth = function() { + if (this._elem) { + return this._elem.outerWidth(true); + } + else { + return null; + } + }; + + $.jqplot.ElemContainer.prototype.getHeight = function() { + if (this._elem) { + return this._elem.outerHeight(true); + } + else { + return null; + } + }; + + $.jqplot.ElemContainer.prototype.getPosition = function() { + if (this._elem) { + return this._elem.position(); + } + else { + return {top:null, left:null, bottom:null, right:null}; + } + }; + + $.jqplot.ElemContainer.prototype.getTop = function() { + return this.getPosition().top; + }; + + $.jqplot.ElemContainer.prototype.getLeft = function() { + return this.getPosition().left; + }; + + $.jqplot.ElemContainer.prototype.getBottom = function() { + return this._elem.css('bottom'); + }; + + $.jqplot.ElemContainer.prototype.getRight = function() { + return this._elem.css('right'); + }; + + + /** + * Class: Axis + * An individual axis object. Cannot be instantiated directly, but created + * by the Plot oject. Axis properties can be set or overriden by the + * options passed in from the user. + * + */ + function Axis(name) { + $.jqplot.ElemContainer.call(this); + // Group: Properties + // + // Axes options are specified within an axes object at the top level of the + // plot options like so: + // > { + // > axes: { + // > xaxis: {min: 5}, + // > yaxis: {min: 2, max: 8, numberTicks:4}, + // > x2axis: {pad: 1.5}, + // > y2axis: {ticks:[22, 44, 66, 88]} + // > } + // > } + // There are 2 x axes, 'xaxis' and 'x2axis', and + // 9 yaxes, 'yaxis', 'y2axis'. 'y3axis', ... Any or all of which may be specified. + this.name = name; + this._series = []; + // prop: show + // Wether to display the axis on the graph. + this.show = false; + // prop: tickRenderer + // A class of a rendering engine for creating the ticks labels displayed on the plot, + // See <$.jqplot.AxisTickRenderer>. + this.tickRenderer = $.jqplot.AxisTickRenderer; + // prop: tickOptions + // Options that will be passed to the tickRenderer, see <$.jqplot.AxisTickRenderer> options. + this.tickOptions = {}; + // prop: labelRenderer + // A class of a rendering engine for creating an axis label. + this.labelRenderer = $.jqplot.AxisLabelRenderer; + // prop: labelOptions + // Options passed to the label renderer. + this.labelOptions = {}; + // prop: label + // Label for the axis + this.label = null; + // prop: showLabel + // true to show the axis label. + this.showLabel = true; + // prop: min + // minimum value of the axis (in data units, not pixels). + this.min = null; + // prop: max + // maximum value of the axis (in data units, not pixels). + this.max = null; + // prop: autoscale + // DEPRECATED + // the default scaling algorithm produces superior results. + this.autoscale = false; + // prop: pad + // 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. + this.pad = 1.2; + // prop: padMax + // 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. + this.padMax = null; + // prop: padMin + // 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. + this.padMin = null; + // prop: ticks + // 1D [val, val, ...] or 2D [[val, label], [val, label], ...] array of ticks for the axis. + // If no label is specified, the value is formatted into an appropriate label. + this.ticks = []; + // prop: numberTicks + // Desired number of ticks. Default is to compute automatically. + this.numberTicks; + // prop: tickInterval + // number of units between ticks. Mutually exclusive with numberTicks. + this.tickInterval; + // prop: renderer + // A class of a rendering engine that handles tick generation, + // scaling input data to pixel grid units and drawing the axis element. + this.renderer = $.jqplot.LinearAxisRenderer; + // prop: rendererOptions + // renderer specific options. See <$.jqplot.LinearAxisRenderer> for options. + this.rendererOptions = {}; + // prop: showTicks + // Wether to show the ticks (both marks and labels) or not. + // Will not override showMark and showLabel options if specified on the ticks themselves. + this.showTicks = true; + // prop: showTickMarks + // Wether to show the tick marks (line crossing grid) or not. + // Overridden by showTicks and showMark option of tick itself. + this.showTickMarks = true; + // prop: showMinorTicks + // Wether or not to show minor ticks. This is renderer dependent. + this.showMinorTicks = true; + // prop: drawMajorGridlines + // True to draw gridlines for major axis ticks. + this.drawMajorGridlines = true; + // prop: drawMinorGridlines + // True to draw gridlines for minor ticks. + this.drawMinorGridlines = false; + // prop: drawMajorTickMarks + // True to draw tick marks for major axis ticks. + this.drawMajorTickMarks = true; + // prop: drawMinorTickMarks + // True to draw tick marks for minor ticks. This is renderer dependent. + this.drawMinorTickMarks = true; + // prop: useSeriesColor + // Use the color of the first series associated with this axis for the + // tick marks and line bordering this axis. + this.useSeriesColor = false; + // prop: borderWidth + // width of line stroked at the border of the axis. Defaults + // to the width of the grid boarder. + this.borderWidth = null; + // prop: borderColor + // color of the border adjacent to the axis. Defaults to grid border color. + this.borderColor = null; + // minimum and maximum values on the axis. + this._dataBounds = {min:null, max:null}; + // statistics (min, max, mean) as well as actual data intervals for each series attached to axis. + // holds collection of {intervals:[], min:, max:, mean: } objects for each series on axis. + this._intervalStats = []; + // pixel position from the top left of the min value and max value on the axis. + this._offsets = {min:null, max:null}; + this._ticks=[]; + this._label = null; + // prop: syncTicks + // true to try and synchronize tick spacing across multiple axes so that ticks and + // grid lines line up. This has an impact on autoscaling algorithm, however. + // In general, autoscaling an individual axis will work better if it does not + // have to sync ticks. + this.syncTicks = null; + // prop: tickSpacing + // Approximate pixel spacing between ticks on graph. Used during autoscaling. + // This number will be an upper bound, actual spacing will be less. + this.tickSpacing = 75; + // Properties to hold the original values for min, max, ticks, tickInterval and numberTicks + // so they can be restored if altered by plugins. + this._min = null; + this._max = null; + this._tickInterval = null; + this._numberTicks = null; + this.__ticks = null; + // hold original user options. + this._options = {}; + } + + Axis.prototype = new $.jqplot.ElemContainer(); + Axis.prototype.constructor = Axis; + + Axis.prototype.init = function() { + this.renderer = new this.renderer(); + // set the axis name + this.tickOptions.axis = this.name; + // if showMark or showLabel tick options not specified, use value of axis option. + // showTicks overrides showTickMarks. + if (this.tickOptions.showMark == null) { + this.tickOptions.showMark = this.showTicks; + } + if (this.tickOptions.showMark == null) { + this.tickOptions.showMark = this.showTickMarks; + } + if (this.tickOptions.showLabel == null) { + this.tickOptions.showLabel = this.showTicks; + } + + if (this.label == null || this.label == '') { + this.showLabel = false; + } + else { + this.labelOptions.label = this.label; + } + if (this.showLabel == false) { + this.labelOptions.show = false; + } + // set the default padMax, padMin if not specified + // special check, if no padding desired, padding + // should be set to 1.0 + if (this.pad == 0) { + this.pad = 1.0; + } + if (this.padMax == 0) { + this.padMax = 1.0; + } + if (this.padMin == 0) { + this.padMin = 1.0; + } + if (this.padMax == null) { + this.padMax = (this.pad-1)/2 + 1; + } + if (this.padMin == null) { + this.padMin = (this.pad-1)/2 + 1; + } + // now that padMin and padMax are correctly set, reset pad in case user has supplied + // padMin and/or padMax + this.pad = this.padMax + this.padMin - 1; + if (this.min != null || this.max != null) { + this.autoscale = false; + } + // if not set, sync ticks for y axes but not x by default. + if (this.syncTicks == null && this.name.indexOf('y') > -1) { + this.syncTicks = true; + } + else if (this.syncTicks == null){ + this.syncTicks = false; + } + this.renderer.init.call(this, this.rendererOptions); + + }; + + Axis.prototype.draw = function(ctx, plot) { + // Memory Leaks patch + if (this.__ticks) { + this.__ticks = null; + } + + return this.renderer.draw.call(this, ctx, plot); + + }; + + Axis.prototype.set = function() { + this.renderer.set.call(this); + }; + + Axis.prototype.pack = function(pos, offsets) { + if (this.show) { + this.renderer.pack.call(this, pos, offsets); + } + // these properties should all be available now. + if (this._min == null) { + this._min = this.min; + this._max = this.max; + this._tickInterval = this.tickInterval; + this._numberTicks = this.numberTicks; + this.__ticks = this._ticks; + } + }; + + // reset the axis back to original values if it has been scaled, zoomed, etc. + Axis.prototype.reset = function() { + this.renderer.reset.call(this); + }; + + Axis.prototype.resetScale = function(opts) { + $.extend(true, this, {min: null, max: null, numberTicks: null, tickInterval: null, _ticks: [], ticks: []}, opts); + this.resetDataBounds(); + }; + + Axis.prototype.resetDataBounds = function() { + // Go through all the series attached to this axis and find + // the min/max bounds for this axis. + var db = this._dataBounds; + db.min = null; + db.max = null; + var l, s, d; + // check for when to force min 0 on bar series plots. + var doforce = (this.show) ? true : false; + for (var i=0; i db.max) || db.max == null) { + db.max = d[j][0]; + } + } + else { + if ((d[j][minyidx] != null && d[j][minyidx] < db.min) || db.min == null) { + db.min = d[j][minyidx]; + } + if ((d[j][maxyidx] != null && d[j][maxyidx] > db.max) || db.max == null) { + db.max = d[j][maxyidx]; + } + } + } + + // Hack to not pad out bottom of bar plots unless user has specified a padding. + // every series will have a chance to set doforce to false. once it is set to + // false, it cannot be reset to true. + // If any series attached to axis is not a bar, wont force 0. + if (doforce && s.renderer.constructor !== $.jqplot.BarRenderer) { + doforce = false; + } + + else if (doforce && this._options.hasOwnProperty('forceTickAt0') && this._options.forceTickAt0 == false) { + doforce = false; + } + + else if (doforce && s.renderer.constructor === $.jqplot.BarRenderer) { + if (s.barDirection == 'vertical' && this.name != 'xaxis' && this.name != 'x2axis') { + if (this._options.pad != null || this._options.padMin != null) { + doforce = false; + } + } + + else if (s.barDirection == 'horizontal' && (this.name == 'xaxis' || this.name == 'x2axis')) { + if (this._options.pad != null || this._options.padMin != null) { + doforce = false; + } + } + + } + } + } + + if (doforce && this.renderer.constructor === $.jqplot.LinearAxisRenderer && db.min >= 0) { + this.padMin = 1.0; + this.forceTickAt0 = true; + } + }; + + /** + * Class: Legend + * Legend object. Cannot be instantiated directly, but created + * by the Plot oject. Legend properties can be set or overriden by the + * options passed in from the user. + */ + function Legend(options) { + $.jqplot.ElemContainer.call(this); + // Group: Properties + + // prop: show + // Wether to display the legend on the graph. + this.show = false; + // prop: location + // Placement of the legend. one of the compass directions: nw, n, ne, e, se, s, sw, w + this.location = 'ne'; + // prop: labels + // 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. + this.labels = []; + // prop: showLabels + // true to show the label text on the legend. + this.showLabels = true; + // prop: showSwatch + // true to show the color swatches on the legend. + this.showSwatches = true; + // prop: placement + // "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. + // "inside" synonym for "insideGrid", + // "outside" places the legend ouside the grid area, but does not shrink the grid which + // can cause the legend to overflow the plot container. + this.placement = "insideGrid"; + // prop: xoffset + // DEPRECATED. Set the margins on the legend using the marginTop, marginLeft, etc. + // properties or via CSS margin styling of the .jqplot-table-legend class. + this.xoffset = 0; + // prop: yoffset + // DEPRECATED. Set the margins on the legend using the marginTop, marginLeft, etc. + // properties or via CSS margin styling of the .jqplot-table-legend class. + this.yoffset = 0; + // prop: border + // css spec for the border around the legend box. + this.border; + // prop: background + // css spec for the background of the legend box. + this.background; + // prop: textColor + // css color spec for the legend text. + this.textColor; + // prop: fontFamily + // css font-family spec for the legend text. + this.fontFamily; + // prop: fontSize + // css font-size spec for the legend text. + this.fontSize ; + // prop: rowSpacing + // css padding-top spec for the rows in the legend. + this.rowSpacing = '0.5em'; + // renderer + // A class that will create a DOM object for the legend, + // see <$.jqplot.TableLegendRenderer>. + this.renderer = $.jqplot.TableLegendRenderer; + // prop: rendererOptions + // renderer specific options passed to the renderer. + this.rendererOptions = {}; + // prop: predraw + // Wether to draw the legend before the series or not. + // Used with series specific legend renderers for pie, donut, mekko charts, etc. + this.preDraw = false; + // prop: marginTop + // CSS margin for the legend DOM element. This will set an element + // CSS style for the margin which will override any style sheet setting. + // The default will be taken from the stylesheet. + this.marginTop = null; + // prop: marginRight + // CSS margin for the legend DOM element. This will set an element + // CSS style for the margin which will override any style sheet setting. + // The default will be taken from the stylesheet. + this.marginRight = null; + // prop: marginBottom + // CSS margin for the legend DOM element. This will set an element + // CSS style for the margin which will override any style sheet setting. + // The default will be taken from the stylesheet. + this.marginBottom = null; + // prop: marginLeft + // CSS margin for the legend DOM element. This will set an element + // CSS style for the margin which will override any style sheet setting. + // The default will be taken from the stylesheet. + this.marginLeft = null; + // prop: escapeHtml + // True to escape special characters with their html entity equivalents + // in legend text. "<" becomes < and so on, so html tags are not rendered. + this.escapeHtml = false; + this._series = []; + + $.extend(true, this, options); + } + + Legend.prototype = new $.jqplot.ElemContainer(); + Legend.prototype.constructor = Legend; + + Legend.prototype.setOptions = function(options) { + $.extend(true, this, options); + + // Try to emulate deprecated behaviour + // if user has specified xoffset or yoffset, copy these to + // the margin properties. + + if (this.placement == 'inside') { + this.placement = 'insideGrid'; + } + + if (this.xoffset >0) { + if (this.placement == 'insideGrid') { + switch (this.location) { + case 'nw': + case 'w': + case 'sw': + if (this.marginLeft == null) { + this.marginLeft = this.xoffset + 'px'; + } + this.marginRight = '0px'; + break; + case 'ne': + case 'e': + case 'se': + default: + if (this.marginRight == null) { + this.marginRight = this.xoffset + 'px'; + } + this.marginLeft = '0px'; + break; + } + } + else if (this.placement == 'outside') { + switch (this.location) { + case 'nw': + case 'w': + case 'sw': + if (this.marginRight == null) { + this.marginRight = this.xoffset + 'px'; + } + this.marginLeft = '0px'; + break; + case 'ne': + case 'e': + case 'se': + default: + if (this.marginLeft == null) { + this.marginLeft = this.xoffset + 'px'; + } + this.marginRight = '0px'; + break; + } + } + this.xoffset = 0; + } + + if (this.yoffset >0) { + if (this.placement == 'outside') { + switch (this.location) { + case 'sw': + case 's': + case 'se': + if (this.marginTop == null) { + this.marginTop = this.yoffset + 'px'; + } + this.marginBottom = '0px'; + break; + case 'ne': + case 'n': + case 'nw': + default: + if (this.marginBottom == null) { + this.marginBottom = this.yoffset + 'px'; + } + this.marginTop = '0px'; + break; + } + } + else if (this.placement == 'insideGrid') { + switch (this.location) { + case 'sw': + case 's': + case 'se': + if (this.marginBottom == null) { + this.marginBottom = this.yoffset + 'px'; + } + this.marginTop = '0px'; + break; + case 'ne': + case 'n': + case 'nw': + default: + if (this.marginTop == null) { + this.marginTop = this.yoffset + 'px'; + } + this.marginBottom = '0px'; + break; + } + } + this.yoffset = 0; + } + + // TO-DO: + // Handle case where offsets are < 0. + // + }; + + Legend.prototype.init = function() { + this.renderer = new this.renderer(); + this.renderer.init.call(this, this.rendererOptions); + }; + + Legend.prototype.draw = function(offsets) { + for (var i=0; i<$.jqplot.preDrawLegendHooks.length; i++){ + $.jqplot.preDrawLegendHooks[i].call(this, offsets); + } + return this.renderer.draw.call(this, offsets); + }; + + Legend.prototype.pack = function(offsets) { + this.renderer.pack.call(this, offsets); + }; + + /** + * Class: Title + * Plot Title object. Cannot be instantiated directly, but created + * by the Plot oject. Title properties can be set or overriden by the + * options passed in from the user. + * + * Parameters: + * text - text of the title. + */ + function Title(text) { + $.jqplot.ElemContainer.call(this); + // Group: Properties + + // prop: text + // text of the title; + this.text = text; + // prop: show + // wether or not to show the title + this.show = true; + // prop: fontFamily + // css font-family spec for the text. + this.fontFamily; + // prop: fontSize + // css font-size spec for the text. + this.fontSize ; + // prop: textAlign + // css text-align spec for the text. + this.textAlign; + // prop: textColor + // css color spec for the text. + this.textColor; + // prop: renderer + // A class for creating a DOM element for the title, + // see <$.jqplot.DivTitleRenderer>. + this.renderer = $.jqplot.DivTitleRenderer; + // prop: rendererOptions + // renderer specific options passed to the renderer. + this.rendererOptions = {}; + // prop: escapeHtml + // True to escape special characters with their html entity equivalents + // in title text. "<" becomes < and so on, so html tags are not rendered. + this.escapeHtml = false; + } + + Title.prototype = new $.jqplot.ElemContainer(); + Title.prototype.constructor = Title; + + Title.prototype.init = function() { + this.renderer = new this.renderer(); + this.renderer.init.call(this, this.rendererOptions); + }; + + Title.prototype.draw = function(width) { + return this.renderer.draw.call(this, width); + }; + + Title.prototype.pack = function() { + this.renderer.pack.call(this); + }; + + + /** + * Class: Series + * An individual data series object. Cannot be instantiated directly, but created + * by the Plot oject. Series properties can be set or overriden by the + * options passed in from the user. + */ + function Series() { + $.jqplot.ElemContainer.call(this); + // Group: Properties + // Properties will be assigned from a series array at the top level of the + // options. If you had two series and wanted to change the color and line + // width of the first and set the second to use the secondary y axis with + // no shadow and supply custom labels for each: + // > { + // > series:[ + // > {color: '#ff4466', lineWidth: 5, label:'good line'}, + // > {yaxis: 'y2axis', shadow: false, label:'bad line'} + // > ] + // > } + + // prop: show + // wether or not to draw the series. + this.show = true; + // prop: xaxis + // which x axis to use with this series, either 'xaxis' or 'x2axis'. + this.xaxis = 'xaxis'; + this._xaxis; + // prop: yaxis + // which y axis to use with this series, either 'yaxis' or 'y2axis'. + this.yaxis = 'yaxis'; + this._yaxis; + this.gridBorderWidth = 2.0; + // prop: renderer + // A class of a renderer which will draw the series, + // see <$.jqplot.LineRenderer>. + this.renderer = $.jqplot.LineRenderer; + // prop: rendererOptions + // Options to pass on to the renderer. + this.rendererOptions = {}; + this.data = []; + this.gridData = []; + // prop: label + // Line label to use in the legend. + this.label = ''; + // prop: showLabel + // true to show label for this series in the legend. + this.showLabel = true; + // prop: color + // css color spec for the series + this.color; + // prop: negativeColor + // css color spec used for filled (area) plots that are filled to zero and + // the "useNegativeColors" option is true. + this.negativeColor; + // prop: lineWidth + // width of the line in pixels. May have different meanings depending on renderer. + this.lineWidth = 2.5; + // prop: lineJoin + // Canvas lineJoin style between segments of series. + this.lineJoin = 'round'; + // prop: lineCap + // Canvas lineCap style at ends of line. + this.lineCap = 'round'; + // prop: linePattern + // line pattern 'dashed', 'dotted', 'solid', some combination + // of '-' and '.' characters such as '.-.' or a numerical array like + // [draw, skip, draw, skip, ...] such as [1, 10] to draw a dotted line, + // [1, 10, 20, 10] to draw a dot-dash line, and so on. + this.linePattern = 'solid'; + this.shadow = true; + // prop: shadowAngle + // Shadow angle in degrees + this.shadowAngle = 45; + // prop: shadowOffset + // Shadow offset from line in pixels + this.shadowOffset = 1.25; + // prop: shadowDepth + // Number of times shadow is stroked, each stroke offset shadowOffset from the last. + this.shadowDepth = 3; + // prop: shadowAlpha + // Alpha channel transparency of shadow. 0 = transparent. + this.shadowAlpha = '0.1'; + // prop: breakOnNull + // Wether line segments should be be broken at null value. + // False will join point on either side of line. + this.breakOnNull = false; + // prop: markerRenderer + // A class of a renderer which will draw marker (e.g. circle, square, ...) at the data points, + // see <$.jqplot.MarkerRenderer>. + this.markerRenderer = $.jqplot.MarkerRenderer; + // prop: markerOptions + // renderer specific options to pass to the markerRenderer, + // see <$.jqplot.MarkerRenderer>. + this.markerOptions = {}; + // prop: showLine + // wether to actually draw the line or not. Series will still be renderered, even if no line is drawn. + this.showLine = true; + // prop: showMarker + // wether or not to show the markers at the data points. + this.showMarker = true; + // prop: index + // 0 based index of this series in the plot series array. + this.index; + // prop: fill + // true or false, wether to fill under lines or in bars. + // May not be implemented in all renderers. + this.fill = false; + // prop: fillColor + // CSS color spec to use for fill under line. Defaults to line color. + this.fillColor; + // prop: fillAlpha + // Alpha transparency to apply to the fill under the line. + // Use this to adjust alpha separate from fill color. + this.fillAlpha; + // prop: fillAndStroke + // If true will stroke the line (with color this.color) as well as fill under it. + // Applies only when fill is true. + this.fillAndStroke = false; + // prop: disableStack + // true to not stack this series with other series in the plot. + // To render properly, non-stacked series must come after any stacked series + // in the plot's data series array. So, the plot's data series array would look like: + // > [stackedSeries1, stackedSeries2, ..., nonStackedSeries1, nonStackedSeries2, ...] + // disableStack will put a gap in the stacking order of series, and subsequent + // stacked series will not fill down through the non-stacked series and will + // most likely not stack properly on top of the non-stacked series. + this.disableStack = false; + // _stack is set by the Plot if the plot is a stacked chart. + // will stack lines or bars on top of one another to build a "mountain" style chart. + // May not be implemented in all renderers. + this._stack = false; + // prop: neighborThreshold + // how close or far (in pixels) the cursor must be from a point marker to detect the point. + this.neighborThreshold = 4; + // prop: fillToZero + // true will force bar and filled series to fill toward zero on the fill Axis. + this.fillToZero = false; + // prop: fillToValue + // fill a filled series to this value on the fill axis. + // Works in conjunction with fillToZero, so that must be true. + this.fillToValue = 0; + // prop: fillAxis + // Either 'x' or 'y'. Which axis to fill the line toward if fillToZero is true. + // 'y' means fill up/down to 0 on the y axis for this series. + this.fillAxis = 'y'; + // prop: useNegativeColors + // true to color negative values differently in filled and bar charts. + this.useNegativeColors = true; + this._stackData = []; + // _plotData accounts for stacking. If plots not stacked, _plotData and data are same. If + // stacked, _plotData is accumulation of stacking data. + this._plotData = []; + // _plotValues hold the individual x and y values that will be plotted for this series. + this._plotValues = {x:[], y:[]}; + // statistics about the intervals between data points. Used for auto scaling. + this._intervals = {x:{}, y:{}}; + // data from the previous series, for stacked charts. + this._prevPlotData = []; + this._prevGridData = []; + this._stackAxis = 'y'; + this._primaryAxis = '_xaxis'; + // give each series a canvas to draw on. This should allow for redrawing speedups. + this.canvas = new $.jqplot.GenericCanvas(); + this.shadowCanvas = new $.jqplot.GenericCanvas(); + this.plugins = {}; + // sum of y values in this series. + this._sumy = 0; + this._sumx = 0; + this._type = ''; + } + + Series.prototype = new $.jqplot.ElemContainer(); + Series.prototype.constructor = Series; + + Series.prototype.init = function(index, gridbw, plot) { + // weed out any null values in the data. + this.index = index; + this.gridBorderWidth = gridbw; + var d = this.data; + var temp = [], i; + for (i=0; i. + this.renderer = $.jqplot.CanvasGridRenderer; + // prop: rendererOptions + // Options to pass on to the renderer, + // see <$.jqplot.CanvasGridRenderer>. + this.rendererOptions = {}; + this._offsets = {top:null, bottom:null, left:null, right:null}; + } + + Grid.prototype = new $.jqplot.ElemContainer(); + Grid.prototype.constructor = Grid; + + Grid.prototype.init = function() { + this.renderer = new this.renderer(); + this.renderer.init.call(this, this.rendererOptions); + }; + + Grid.prototype.createElement = function(offsets,plot) { + this._offsets = offsets; + return this.renderer.createElement.call(this, plot); + }; + + Grid.prototype.draw = function() { + this.renderer.draw.call(this); + }; + + $.jqplot.GenericCanvas = function() { + $.jqplot.ElemContainer.call(this); + this._ctx; + }; + + $.jqplot.GenericCanvas.prototype = new $.jqplot.ElemContainer(); + $.jqplot.GenericCanvas.prototype.constructor = $.jqplot.GenericCanvas; + + $.jqplot.GenericCanvas.prototype.createElement = function(offsets, clss, plotDimensions, plot) { + this._offsets = offsets; + var klass = 'jqplot'; + if (clss != undefined) { + klass = clss; + } + var elem; + + elem = plot.canvasManager.getCanvas(); + + // if new plotDimensions supplied, use them. + if (plotDimensions != null) { + this._plotDimensions = plotDimensions; + } + + elem.width = this._plotDimensions.width - this._offsets.left - this._offsets.right; + elem.height = this._plotDimensions.height - this._offsets.top - this._offsets.bottom; + this._elem = $(elem); + this._elem.css({ position: 'absolute', left: this._offsets.left, top: this._offsets.top }); + + this._elem.addClass(klass); + + elem = plot.canvasManager.initCanvas(elem); + + elem = null; + return this._elem; + }; + + $.jqplot.GenericCanvas.prototype.setContext = function() { + this._ctx = this._elem.get(0).getContext("2d"); + return this._ctx; + }; + + // Memory Leaks patch + $.jqplot.GenericCanvas.prototype.resetCanvas = function() { + if (this._elem) { + if ($.jqplot.use_excanvas && window.G_vmlCanvasManager.uninitElement !== undefined) { + window.G_vmlCanvasManager.uninitElement(this._elem.get(0)); + } + + //this._elem.remove(); + this._elem.emptyForce(); + } + + this._ctx = null; + }; + + $.jqplot.HooksManager = function () { + this.hooks =[]; + this.args = []; + }; + + $.jqplot.HooksManager.prototype.addOnce = function(fn, args) { + args = args || []; + var havehook = false; + for (var i=0, l=this.hooks.length; i { + // > axesDefaults:{min:0}, + // > series:[{color:'#6633dd'}], + // > title: 'A Plot' + // > } + // + + // prop: animate + // True to animate the series on initial plot draw (renderer dependent). + // Actual animation functionality must be supported in the renderer. + this.animate = false; + // prop: animateReplot + // True to animate series after a call to the replot() method. + // Use with caution! Replots can happen very frequently under + // certain circumstances (e.g. resizing, dragging points) and + // animation in these situations can cause problems. + this.animateReplot = false; + // prop: axes + // up to 4 axes are supported, each with it's own options, + // See for axis specific options. + this.axes = {xaxis: new Axis('xaxis'), yaxis: new Axis('yaxis'), x2axis: new Axis('x2axis'), y2axis: new Axis('y2axis'), y3axis: new Axis('y3axis'), y4axis: new Axis('y4axis'), y5axis: new Axis('y5axis'), y6axis: new Axis('y6axis'), y7axis: new Axis('y7axis'), y8axis: new Axis('y8axis'), y9axis: new Axis('y9axis'), yMidAxis: new Axis('yMidAxis')}; + this.baseCanvas = new $.jqplot.GenericCanvas(); + // true to intercept right click events and fire a 'jqplotRightClick' event. + // this will also block the context menu. + this.captureRightClick = false; + // prop: data + // user's data. Data should *NOT* be specified in the options object, + // but be passed in as the second argument to the $.jqplot() function. + // The data property is described here soley for reference. + // The data should be in the form of an array of 2D or 1D arrays like + // > [ [[x1, y1], [x2, y2],...], [y1, y2, ...] ]. + this.data = []; + // prop: dataRenderer + // A callable which can be used to preprocess data passed into the plot. + // Will be called with 2 arguments, the plot data and a reference to the plot. + this.dataRenderer; + // prop: dataRendererOptions + // Options that will be passed to the dataRenderer. + // Can be of any type. + this.dataRendererOptions; + this.defaults = { + // prop: axesDefaults + // default options that will be applied to all axes. + // see for axes options. + axesDefaults: {}, + axes: {xaxis:{}, yaxis:{}, x2axis:{}, y2axis:{}, y3axis:{}, y4axis:{}, y5axis:{}, y6axis:{}, y7axis:{}, y8axis:{}, y9axis:{}, yMidAxis:{}}, + // prop: seriesDefaults + // default options that will be applied to all series. + // see for series options. + seriesDefaults: {}, + series:[] + }; + // prop: defaultAxisStart + // 1-D data series are internally converted into 2-D [x,y] data point arrays + // by jqPlot. This is the default starting value for the missing x or y value. + // The added data will be a monotonically increasing series (e.g. [1, 2, 3, ...]) + // starting at this value. + this.defaultAxisStart = 1; + // this.doCustomEventBinding = true; + // prop: drawIfHidden + // True to execute the draw method even if the plot target is hidden. + // Generally, this should be false. Most plot elements will not be sized/ + // positioned correclty if renderered into a hidden container. To render into + // a hidden container, call the replot method when the container is shown. + this.drawIfHidden = false; + this.eventCanvas = new $.jqplot.GenericCanvas(); + // prop: fillBetween + // Fill between 2 line series in a plot. + // Options object: + // { + // series1: first index (0 based) of series in fill + // series2: second index (0 based) of series in fill + // color: color of fill [default fillColor of series1] + // baseSeries: fill will be drawn below this series (0 based index) + // fill: false to turn off fill [default true]. + // } + this.fillBetween = { + series1: null, + series2: null, + color: null, + baseSeries: 0, + fill: true + }; + // prop; fontFamily + // css spec for the font-family attribute. Default for the entire plot. + this.fontFamily; + // prop: fontSize + // css spec for the font-size attribute. Default for the entire plot. + this.fontSize; + // prop: grid + // See for grid specific options. + this.grid = new Grid(); + // prop: legend + // see <$.jqplot.TableLegendRenderer> + this.legend = new Legend(); + // prop: noDataIndicator + // Options to set up a mock plot with a data loading indicator if no data is specified. + this.negativeSeriesColors = $.jqplot.config.defaultNegativeColors; + this.noDataIndicator = { + show: false, + indicator: 'Loading Data...', + axes: { + xaxis: { + min: 0, + max: 10, + tickInterval: 2, + show: true + }, + yaxis: { + min: 0, + max: 12, + tickInterval: 3, + show: true + } + } + }; + // container to hold all of the merged options. Convienence for plugins. + this.options = {}; + this.previousSeriesStack = []; + // Namespece to hold plugins. Generally non-renderer plugins add themselves to here. + this.plugins = {}; + // prop: series + // Array of series object options. + // see for series specific options. + this.series = []; + // array of series indicies. Keep track of order + // which series canvases are displayed, lowest + // to highest, back to front. + this.seriesStack = []; + // prop: seriesColors + // Ann array of CSS color specifications that will be applied, in order, + // to the series in the plot. Colors will wrap around so, if their + // are more series than colors, colors will be reused starting at the + // beginning. For pie charts, this specifies the colors of the slices. + this.seriesColors = $.jqplot.config.defaultColors; + // prop: sortData + // false to not sort the data passed in by the user. + // Many bar, stakced and other graphs as well as many plugins depend on + // having sorted data. + this.sortData = true; + // prop: stackSeries + // true or false, creates a stack or "mountain" plot. + // Not all series renderers may implement this option. + this.stackSeries = false; + // a shortcut for axis syncTicks options. Not implemented yet. + this.syncXTicks = true; + // a shortcut for axis syncTicks options. Not implemented yet. + this.syncYTicks = true; + // the jquery object for the dom target. + this.target = null; + // The id of the dom element to render the plot into + this.targetId = null; + // prop textColor + // css spec for the css color attribute. Default for the entire plot. + this.textColor; + // prop: title + // Title object. See for specific options. As a shortcut, you + // can specify the title option as just a string like: title: 'My Plot' + // and this will create a new title object with the specified text. + this.title = new Title(); + // Count how many times the draw method has been called while the plot is visible. + // Mostly used to test if plot has never been dran (=0), has been successfully drawn + // into a visible container once (=1) or draw more than once into a visible container. + // Can use this in tests to see if plot has been visibly drawn at least one time. + // After plot has been visibly drawn once, it generally doesn't need redrawn if its + // container is hidden and shown. + this._drawCount = 0; + // sum of y values for all series in plot. + // used in mekko chart. + this._sumy = 0; + this._sumx = 0; + // array to hold the cumulative stacked series data. + // used to ajust the individual series data, which won't have access to other + // series data. + this._stackData = []; + // array that holds the data to be plotted. This will be the series data + // merged with the the appropriate data from _stackData according to the stackAxis. + this._plotData = []; + this._width = null; + this._height = null; + this._plotDimensions = {height:null, width:null}; + this._gridPadding = {top:null, right:null, bottom:null, left:null}; + this._defaultGridPadding = {top:10, right:10, bottom:23, left:10}; + + this._addDomReference = $.jqplot.config.addDomReference; + + this.preInitHooks = new $.jqplot.HooksManager(); + this.postInitHooks = new $.jqplot.HooksManager(); + this.preParseOptionsHooks = new $.jqplot.HooksManager(); + this.postParseOptionsHooks = new $.jqplot.HooksManager(); + this.preDrawHooks = new $.jqplot.HooksManager(); + this.postDrawHooks = new $.jqplot.HooksManager(); + this.preDrawSeriesHooks = new $.jqplot.HooksManager(); + this.postDrawSeriesHooks = new $.jqplot.HooksManager(); + this.preDrawLegendHooks = new $.jqplot.HooksManager(); + this.addLegendRowHooks = new $.jqplot.HooksManager(); + this.preSeriesInitHooks = new $.jqplot.HooksManager(); + this.postSeriesInitHooks = new $.jqplot.HooksManager(); + this.preParseSeriesOptionsHooks = new $.jqplot.HooksManager(); + this.postParseSeriesOptionsHooks = new $.jqplot.HooksManager(); + this.eventListenerHooks = new $.jqplot.EventListenerManager(); + this.preDrawSeriesShadowHooks = new $.jqplot.HooksManager(); + this.postDrawSeriesShadowHooks = new $.jqplot.HooksManager(); + + this.colorGenerator = new $.jqplot.ColorGenerator(); + this.negativeColorGenerator = new $.jqplot.ColorGenerator(); + + this.canvasManager = new $.jqplot.CanvasManager(); + + this.themeEngine = new $.jqplot.ThemeEngine(); + + var seriesColorsIndex = 0; + + // Group: methods + // + // method: init + // sets the plot target, checks data and applies user + // options to plot. + this.init = function(target, data, options) { + options = options || {}; + for (var i=0; i<$.jqplot.preInitHooks.length; i++) { + $.jqplot.preInitHooks[i].call(this, target, data, options); + } + + for (var i=0; i<this.preInitHooks.hooks.length; i++) { + this.preInitHooks.hooks[i].call(this, target, data, options); + } + + this.targetId = '#'+target; + this.target = $('#'+target); + + ////// + // Add a reference to plot + ////// + if (this._addDomReference) { + this.target.data('jqplot_plot', this); + } + // remove any error class that may be stuck on target. + this.target.removeClass('jqplot-error'); + if (!this.target.get(0)) { + throw "No plot target specified"; + } + + // make sure the target is positioned by some means and set css + if (this.target.css('position') == 'static') { + this.target.css('position', 'relative'); + } + if (!this.target.hasClass('jqplot-target')) { + this.target.addClass('jqplot-target'); + } + + // if no height or width specified, use a default. + if (!this.target.height()) { + var h; + if (options && options.height) { + h = parseInt(options.height, 10); + } + else if (this.target.attr('data-height')) { + h = parseInt(this.target.attr('data-height'), 10); + } + else { + h = parseInt($.jqplot.config.defaultHeight, 10); + } + this._height = h; + this.target.css('height', h+'px'); + } + else { + this._height = h = this.target.height(); + } + if (!this.target.width()) { + var w; + if (options && options.width) { + w = parseInt(options.width, 10); + } + else if (this.target.attr('data-width')) { + w = parseInt(this.target.attr('data-width'), 10); + } + else { + w = parseInt($.jqplot.config.defaultWidth, 10); + } + this._width = w; + this.target.css('width', w+'px'); + } + else { + this._width = w = this.target.width(); + } + + this._plotDimensions.height = this._height; + this._plotDimensions.width = this._width; + this.grid._plotDimensions = this._plotDimensions; + this.title._plotDimensions = this._plotDimensions; + this.baseCanvas._plotDimensions = this._plotDimensions; + this.eventCanvas._plotDimensions = this._plotDimensions; + this.legend._plotDimensions = this._plotDimensions; + if (this._height <=0 || this._width <=0 || !this._height || !this._width) { + throw "Canvas dimension not set"; + } + + if (options.dataRenderer && jQuery.isFunction(options.dataRenderer)) { + if (options.dataRendererOptions) { + this.dataRendererOptions = options.dataRendererOptions; + } + this.dataRenderer = options.dataRenderer; + data = this.dataRenderer(data, this, this.dataRendererOptions); + } + + if (options.noDataIndicator && jQuery.isPlainObject(options.noDataIndicator)) { + $.extend(true, this.noDataIndicator, options.noDataIndicator); + } + + if (data == null || jQuery.isArray(data) == false || data.length == 0 || jQuery.isArray(data[0]) == false || data[0].length == 0) { + + if (this.noDataIndicator.show == false) { + throw{ + name: "DataError", + message: "No data to plot." + }; + } + + else { + // have to be descructive here in order for plot to not try and render series. + // This means that $.jqplot() will have to be called again when there is data. + //delete options.series; + + for (var ax in this.noDataIndicator.axes) { + for (var prop in this.noDataIndicator.axes[ax]) { + this.axes[ax][prop] = this.noDataIndicator.axes[ax][prop]; + } + } + + this.postDrawHooks.add(function() { + var eh = this.eventCanvas.getHeight(); + var ew = this.eventCanvas.getWidth(); + var temp = $('<div class="jqplot-noData-container" style="position:absolute;"></div>'); + this.target.append(temp); + temp.height(eh); + temp.width(ew); + temp.css('top', this.eventCanvas._offsets.top); + temp.css('left', this.eventCanvas._offsets.left); + + var temp2 = $('<div class="jqplot-noData-contents" style="text-align:center; position:relative; margin-left:auto; margin-right:auto;"></div>'); + temp.append(temp2); + temp2.html(this.noDataIndicator.indicator); + var th = temp2.height(); + var tw = temp2.width(); + temp2.height(th); + temp2.width(tw); + temp2.css('top', (eh - th)/2 + 'px'); + }); + + } + } + + this.data = data; + + this.parseOptions(options); + + if (this.textColor) { + this.target.css('color', this.textColor); + } + if (this.fontFamily) { + this.target.css('font-family', this.fontFamily); + } + if (this.fontSize) { + this.target.css('font-size', this.fontSize); + } + + this.title.init(); + this.legend.init(); + this._sumy = 0; + this._sumx = 0; + for (var i=0; i<this.series.length; i++) { + // set default stacking order for series canvases + this.seriesStack.push(i); + this.previousSeriesStack.push(i); + this.series[i].shadowCanvas._plotDimensions = this._plotDimensions; + this.series[i].canvas._plotDimensions = this._plotDimensions; + for (var j=0; j<$.jqplot.preSeriesInitHooks.length; j++) { + $.jqplot.preSeriesInitHooks[j].call(this.series[i], target, data, this.options.seriesDefaults, this.options.series[i], this); + } + for (var j=0; j<this.preSeriesInitHooks.hooks.length; j++) { + this.preSeriesInitHooks.hooks[j].call(this.series[i], target, data, this.options.seriesDefaults, this.options.series[i], this); + } + this.populatePlotData(this.series[i], i); + this.series[i]._plotDimensions = this._plotDimensions; + this.series[i].init(i, this.grid.borderWidth, this); + for (var j=0; j<$.jqplot.postSeriesInitHooks.length; j++) { + $.jqplot.postSeriesInitHooks[j].call(this.series[i], target, data, this.options.seriesDefaults, this.options.series[i], this); + } + for (var j=0; j<this.postSeriesInitHooks.hooks.length; j++) { + this.postSeriesInitHooks.hooks[j].call(this.series[i], target, data, this.options.seriesDefaults, this.options.series[i], this); + } + this._sumy += this.series[i]._sumy; + this._sumx += this.series[i]._sumx; + } + + var name; + for (var i=0; i<12; i++) { + name = _axisNames[i]; + this.axes[name]._plotDimensions = this._plotDimensions; + this.axes[name].init(); + if (this.axes[name].borderColor == null) { + if (name.charAt(0) !== 'x' && this.axes[name].useSeriesColor === true && this.axes[name].show) { + this.axes[name].borderColor = this.axes[name]._series[0].color; + } + else { + this.axes[name].borderColor = this.grid.borderColor; + } + } + } + + if (this.sortData) { + sortData(this.series); + } + this.grid.init(); + this.grid._axes = this.axes; + + this.legend._series = this.series; + + for (var i=0; i<$.jqplot.postInitHooks.length; i++) { + $.jqplot.postInitHooks[i].call(this, target, data, options); + } + + for (var i=0; i<this.postInitHooks.hooks.length; i++) { + this.postInitHooks.hooks[i].call(this, target, data, options); + } + }; + + // method: resetAxesScale + // Reset the specified axes min, max, numberTicks and tickInterval properties to null + // or reset these properties on all axes if no list of axes is provided. + // + // Parameters: + // axes - Boolean to reset or not reset all axes or an array or object of axis names to reset. + this.resetAxesScale = function(axes, options) { + var opts = options || {}; + var ax = axes || this.axes; + if (ax === true) { + ax = this.axes; + } + if (jQuery.isArray(ax)) { + for (var i = 0; i < ax.length; i++) { + this.axes[ax[i]].resetScale(opts[ax[i]]); + } + } + else if (typeof(ax) === 'object') { + for (var name in ax) { + this.axes[name].resetScale(opts[name]); + } + } + }; + // method: reInitialize + // reinitialize plot for replotting. + // not called directly. + this.reInitialize = function () { + // Plot should be visible and have a height and width. + // If plot doesn't have height and width for some + // reason, set it by other means. Plot must not have + // a display:none attribute, however. + + this._height = this.target.height(); + this._width = this.target.width(); + + if (this._height <=0 || this._width <=0 || !this._height || !this._width) { + throw "Target dimension not set"; + } + + this._plotDimensions.height = this._height; + this._plotDimensions.width = this._width; + this.grid._plotDimensions = this._plotDimensions; + this.title._plotDimensions = this._plotDimensions; + this.baseCanvas._plotDimensions = this._plotDimensions; + this.eventCanvas._plotDimensions = this._plotDimensions; + this.legend._plotDimensions = this._plotDimensions; + + for (var n in this.axes) { + this.axes[n]._plotWidth = this._width; + this.axes[n]._plotHeight = this._height; + } + + this.title._plotWidth = this._width; + + if (this.textColor) { + this.target.css('color', this.textColor); + } + if (this.fontFamily) { + this.target.css('font-family', this.fontFamily); + } + if (this.fontSize) { + this.target.css('font-size', this.fontSize); + } + + this._sumy = 0; + this._sumx = 0; + for (var i=0; i<this.series.length; i++) { + this.populatePlotData(this.series[i], i); + if (this.series[i]._type === 'line' && this.series[i].renderer.bands.show) { + this.series[i].renderer.initBands.call(this.series[i], this.series[i].renderer.options, this); + } + this.series[i]._plotDimensions = this._plotDimensions; + this.series[i].canvas._plotDimensions = this._plotDimensions; + //this.series[i].init(i, this.grid.borderWidth); + this._sumy += this.series[i]._sumy; + this._sumx += this.series[i]._sumx; + } + + var name; + + for (var j=0; j<12; j++) { + name = _axisNames[j]; + // Memory Leaks patch : clear ticks elements + var t = this.axes[name]._ticks; + for (var i = 0; i < t.length; i++) { + var el = t[i]._elem; + if (el) { + // if canvas renderer + if ($.jqplot.use_excanvas && window.G_vmlCanvasManager.uninitElement !== undefined) { + window.G_vmlCanvasManager.uninitElement(el.get(0)); + } + el.emptyForce(); + el = null; + t._elem = null; + } + } + t = null; + + this.axes[name]._plotDimensions = this._plotDimensions; + this.axes[name]._ticks = []; + // this.axes[name].renderer.init.call(this.axes[name], {}); + } + + if (this.sortData) { + sortData(this.series); + } + + this.grid._axes = this.axes; + + this.legend._series = this.series; + }; + + // sort the series data in increasing order. + function sortData(series) { + var d, sd, pd, ppd, ret; + for (var i=0; i<series.length; i++) { + var check; + var bat = [series[i].data, series[i]._stackData, series[i]._plotData, series[i]._prevPlotData]; + for (var n=0; n<4; n++) { + check = true; + d = bat[n]; + if (series[i]._stackAxis == 'x') { + for (var j = 0; j < d.length; j++) { + if (typeof(d[j][1]) != "number") { + check = false; + break; + } + } + if (check) { + d.sort(function(a,b) { return a[1] - b[1]; }); + } + } + else { + for (var j = 0; j < d.length; j++) { + if (typeof(d[j][0]) != "number") { + check = false; + break; + } + } + if (check) { + d.sort(function(a,b) { return a[0] - b[0]; }); + } + } + } + + } + } + + // populate the _stackData and _plotData arrays for the plot and the series. + this.populatePlotData = function(series, index) { + // if a stacked chart, compute the stacked data + this._plotData = []; + this._stackData = []; + series._stackData = []; + series._plotData = []; + var plotValues = {x:[], y:[]}; + if (this.stackSeries && !series.disableStack) { + series._stack = true; + var sidx = series._stackAxis == 'x' ? 0 : 1; + var idx = sidx ? 0 : 1; + // push the current data into stackData + //this._stackData.push(this.series[i].data); + var temp = $.extend(true, [], series.data); + // create the data that will be plotted for this series + var plotdata = $.extend(true, [], series.data); + // for first series, nothing to add to stackData. + for (var j=0; j<index; j++) { + var cd = this.series[j].data; + for (var k=0; k<cd.length; k++) { + temp[k][0] += cd[k][0]; + temp[k][1] += cd[k][1]; + // only need to sum up the stack axis column of data + plotdata[k][sidx] += cd[k][sidx]; + } + } + for (var i=0; i<plotdata.length; i++) { + plotValues.x.push(plotdata[i][0]); + plotValues.y.push(plotdata[i][1]); + } + this._plotData.push(plotdata); + this._stackData.push(temp); + series._stackData = temp; + series._plotData = plotdata; + series._plotValues = plotValues; + } + else { + for (var i=0; i<series.data.length; i++) { + plotValues.x.push(series.data[i][0]); + plotValues.y.push(series.data[i][1]); + } + this._stackData.push(series.data); + this.series[index]._stackData = series.data; + this._plotData.push(series.data); + series._plotData = series.data; + series._plotValues = plotValues; + } + if (index>0) { + series._prevPlotData = this.series[index-1]._plotData; + } + series._sumy = 0; + series._sumx = 0; + for (i=series.data.length-1; i>-1; i--) { + series._sumy += series.data[i][1]; + series._sumx += series.data[i][0]; + } + }; + + // function to safely return colors from the color array and wrap around at the end. + this.getNextSeriesColor = (function(t) { + var idx = 0; + var sc = t.seriesColors; + + return function () { + if (idx < sc.length) { + return sc[idx++]; + } + else { + idx = 0; + return sc[idx++]; + } + }; + })(this); + + this.parseOptions = function(options){ + for (var i=0; i<this.preParseOptionsHooks.hooks.length; i++) { + this.preParseOptionsHooks.hooks[i].call(this, options); + } + for (var i=0; i<$.jqplot.preParseOptionsHooks.length; i++) { + $.jqplot.preParseOptionsHooks[i].call(this, options); + } + this.options = $.extend(true, {}, this.defaults, options); + var opts = this.options; + this.animate = opts.animate; + this.animateReplot = opts.animateReplot; + this.stackSeries = opts.stackSeries; + if ($.isPlainObject(opts.fillBetween)) { + + var temp = ['series1', 'series2', 'color', 'baseSeries', 'fill'], + tempi; + + for (var i=0, l=temp.length; i<l; i++) { + tempi = temp[i]; + if (opts.fillBetween[tempi] != null) { + this.fillBetween[tempi] = opts.fillBetween[tempi]; + } + } + } + + if (opts.seriesColors) { + this.seriesColors = opts.seriesColors; + } + if (opts.negativeSeriesColors) { + this.negativeSeriesColors = opts.negativeSeriesColors; + } + if (opts.captureRightClick) { + this.captureRightClick = opts.captureRightClick; + } + this.defaultAxisStart = (options && options.defaultAxisStart != null) ? options.defaultAxisStart : this.defaultAxisStart; + this.colorGenerator.setColors(this.seriesColors); + this.negativeColorGenerator.setColors(this.negativeSeriesColors); + // var cg = new this.colorGenerator(this.seriesColors); + // var ncg = new this.colorGenerator(this.negativeSeriesColors); + // this._gridPadding = this.options.gridPadding; + $.extend(true, this._gridPadding, opts.gridPadding); + this.sortData = (opts.sortData != null) ? opts.sortData : this.sortData; + for (var i=0; i<12; i++) { + var n = _axisNames[i]; + var axis = this.axes[n]; + axis._options = $.extend(true, {}, opts.axesDefaults, opts.axes[n]); + $.extend(true, axis, opts.axesDefaults, opts.axes[n]); + axis._plotWidth = this._width; + axis._plotHeight = this._height; + } + // if (this.data.length == 0) { + // this.data = []; + // for (var i=0; i<this.options.series.length; i++) { + // this.data.push(this.options.series.data); + // } + // } + + var normalizeData = function(data, dir, start) { + // return data as an array of point arrays, + // in form [[x1,y1...], [x2,y2...], ...] + var temp = []; + var i; + dir = dir || 'vertical'; + if (!jQuery.isArray(data[0])) { + // we have a series of scalars. One line with just y values. + // turn the scalar list of data into a data array of form: + // [[1, data[0]], [2, data[1]], ...] + for (i=0; i<data.length; i++) { + if (dir == 'vertical') { + temp.push([start + i, data[i]]); + } + else { + temp.push([data[i], start+i]); + } + } + } + else { + // we have a properly formatted data series, copy it. + $.extend(true, temp, data); + } + return temp; + }; + + var colorIndex = 0; + for (var i=0; i<this.data.length; i++) { + var temp = new Series(); + for (var j=0; j<$.jqplot.preParseSeriesOptionsHooks.length; j++) { + $.jqplot.preParseSeriesOptionsHooks[j].call(temp, this.options.seriesDefaults, this.options.series[i]); + } + for (var j=0; j<this.preParseSeriesOptionsHooks.hooks.length; j++) { + this.preParseSeriesOptionsHooks.hooks[j].call(temp, this.options.seriesDefaults, this.options.series[i]); + } + $.extend(true, temp, {seriesColors:this.seriesColors, negativeSeriesColors:this.negativeSeriesColors}, this.options.seriesDefaults, this.options.series[i], {rendererOptions:{animation:{show: this.animate}}}); + var dir = 'vertical'; + if (temp.renderer === $.jqplot.BarRenderer && temp.rendererOptions && temp.rendererOptions.barDirection == 'horizontal' && temp.transposeData === true) { + dir = 'horizontal'; + } + temp.data = normalizeData(this.data[i], dir, this.defaultAxisStart); + switch (temp.xaxis) { + case 'xaxis': + temp._xaxis = this.axes.xaxis; + break; + case 'x2axis': + temp._xaxis = this.axes.x2axis; + break; + default: + break; + } + temp._yaxis = this.axes[temp.yaxis]; + temp._xaxis._series.push(temp); + temp._yaxis._series.push(temp); + if (temp.show) { + temp._xaxis.show = true; + temp._yaxis.show = true; + } + + // // parse the renderer options and apply default colors if not provided + // if (!temp.color && temp.show != false) { + // temp.color = cg.next(); + // colorIndex = cg.getIndex() - 1;; + // } + // if (!temp.negativeColor && temp.show != false) { + // temp.negativeColor = ncg.get(colorIndex); + // ncg.setIndex(colorIndex); + // } + if (!temp.label) { + temp.label = 'Series '+ (i+1).toString(); + } + // temp.rendererOptions.show = temp.show; + // $.extend(true, temp.renderer, {color:this.seriesColors[i]}, this.rendererOptions); + this.series.push(temp); + for (var j=0; j<$.jqplot.postParseSeriesOptionsHooks.length; j++) { + $.jqplot.postParseSeriesOptionsHooks[j].call(this.series[i], this.options.seriesDefaults, this.options.series[i]); + } + for (var j=0; j<this.postParseSeriesOptionsHooks.hooks.length; j++) { + this.postParseSeriesOptionsHooks.hooks[j].call(this.series[i], this.options.seriesDefaults, this.options.series[i]); + } + } + + // copy the grid and title options into this object. + $.extend(true, this.grid, this.options.grid); + // if axis border properties aren't set, set default. + for (var i=0; i<12; i++) { + var n = _axisNames[i]; + var axis = this.axes[n]; + if (axis.borderWidth == null) { + axis.borderWidth =this.grid.borderWidth; + } + } + + if (typeof this.options.title == 'string') { + this.title.text = this.options.title; + } + else if (typeof this.options.title == 'object') { + $.extend(true, this.title, this.options.title); + } + this.title._plotWidth = this._width; + this.legend.setOptions(this.options.legend); + + for (var i=0; i<$.jqplot.postParseOptionsHooks.length; i++) { + $.jqplot.postParseOptionsHooks[i].call(this, options); + } + for (var i=0; i<this.postParseOptionsHooks.hooks.length; i++) { + this.postParseOptionsHooks.hooks[i].call(this, options); + } + }; + + // method: destroy + // Releases all resources occupied by the plot + this.destroy = function() { + this.canvasManager.freeAllCanvases(); + if (this.eventCanvas && this.eventCanvas._elem) { + this.eventCanvas._elem.unbind(); + } + // Couple of posts on Stack Overflow indicate that empty() doesn't + // always cear up the dom and release memory. Sometimes setting + // innerHTML property to null is needed. Particularly on IE, may + // have to directly set it to null, bypassing jQuery. + this.target.empty(); + + this.target[0].innerHTML = ''; + }; + + // method: replot + // Does a reinitialization of the plot followed by + // a redraw. Method could be used to interactively + // change plot characteristics and then replot. + // + // Parameters: + // options - Options used for replotting. + // + // Properties: + // clear - false to not clear (empty) the plot container before replotting (default: true). + // resetAxes - true to reset all axes min, max, numberTicks and tickInterval setting so axes will rescale themselves. + // optionally pass in list of axes to reset (e.g. ['xaxis', 'y2axis']) (default: false). + this.replot = function(options) { + var opts = options || {}; + var clear = (opts.clear === false) ? false : true; + var resetAxes = opts.resetAxes || false; + this.target.trigger('jqplotPreReplot'); + + if (clear) { + this.destroy(); + } + this.reInitialize(); + if (resetAxes) { + this.resetAxesScale(resetAxes, opts.axes); + } + this.draw(); + this.target.trigger('jqplotPostReplot'); + }; + + // method: redraw + // Empties the plot target div and redraws the plot. + // This enables plot data and properties to be changed + // and then to comletely clear the plot and redraw. + // redraw *will not* reinitialize any plot elements. + // That is, axes will not be autoscaled and defaults + // will not be reapplied to any plot elements. redraw + // is used primarily with zooming. + // + // Parameters: + // clear - false to not clear (empty) the plot container before redrawing (default: true). + this.redraw = function(clear) { + clear = (clear != null) ? clear : true; + this.target.trigger('jqplotPreRedraw'); + if (clear) { + this.canvasManager.freeAllCanvases(); + this.eventCanvas._elem.unbind(); + // Dont think I bind any events to the target, this shouldn't be necessary. + // It will remove user's events. + // this.target.unbind(); + this.target.empty(); + } + for (var ax in this.axes) { + this.axes[ax]._ticks = []; + } + for (var i=0; i<this.series.length; i++) { + this.populatePlotData(this.series[i], i); + } + this._sumy = 0; + this._sumx = 0; + for (i=0; i<this.series.length; i++) { + this._sumy += this.series[i]._sumy; + this._sumx += this.series[i]._sumx; + } + this.draw(); + this.target.trigger('jqplotPostRedraw'); + }; + + // method: draw + // Draws all elements of the plot into the container. + // Does not clear the container before drawing. + this.draw = function(){ + if (this.drawIfHidden || this.target.is(':visible')) { + this.target.trigger('jqplotPreDraw'); + var i, + j, + l, + tempseries; + for (i=0, l=$.jqplot.preDrawHooks.length; i<l; i++) { + $.jqplot.preDrawHooks[i].call(this); + } + for (i=0, l=this.preDrawHooks.length; i<l; i++) { + this.preDrawHooks.hooks[i].apply(this, this.preDrawSeriesHooks.args[i]); + } + // create an underlying canvas to be used for special features. + this.target.append(this.baseCanvas.createElement({left:0, right:0, top:0, bottom:0}, 'jqplot-base-canvas', null, this)); + this.baseCanvas.setContext(); + this.target.append(this.title.draw()); + this.title.pack({top:0, left:0}); + + // make room for the legend between the grid and the edge. + var legendElem = this.legend.draw(); + + var gridPadding = {top:0, left:0, bottom:0, right:0}; + + if (this.legend.placement == "outsideGrid") { + // temporarily append the legend to get dimensions + this.target.append(legendElem); + switch (this.legend.location) { + case 'n': + gridPadding.top += this.legend.getHeight(); + break; + case 's': + gridPadding.bottom += this.legend.getHeight(); + break; + case 'ne': + case 'e': + case 'se': + gridPadding.right += this.legend.getWidth(); + break; + case 'nw': + case 'w': + case 'sw': + gridPadding.left += this.legend.getWidth(); + break; + default: // same as 'ne' + gridPadding.right += this.legend.getWidth(); + break; + } + legendElem = legendElem.detach(); + } + + var ax = this.axes; + var name; + // draw the yMidAxis first, so xaxis of pyramid chart can adjust itself if needed. + for (i=0; i<12; i++) { + name = _axisNames[i]; + this.target.append(ax[name].draw(this.baseCanvas._ctx, this)); + ax[name].set(); + } + if (ax.yaxis.show) { + gridPadding.left += ax.yaxis.getWidth(); + } + var ra = ['y2axis', 'y3axis', 'y4axis', 'y5axis', 'y6axis', 'y7axis', 'y8axis', 'y9axis']; + var rapad = [0, 0, 0, 0, 0, 0, 0, 0]; + var gpr = 0; + var n; + for (n=0; n<8; n++) { + if (ax[ra[n]].show) { + gpr += ax[ra[n]].getWidth(); + rapad[n] = gpr; + } + } + gridPadding.right += gpr; + if (ax.x2axis.show) { + gridPadding.top += ax.x2axis.getHeight(); + } + if (this.title.show) { + gridPadding.top += this.title.getHeight(); + } + if (ax.xaxis.show) { + gridPadding.bottom += ax.xaxis.getHeight(); + } + + // end of gridPadding adjustments. + + // if user passed in gridDimensions option, check against calculated gridPadding + if (this.options.gridDimensions && $.isPlainObject(this.options.gridDimensions)) { + var gdw = parseInt(this.options.gridDimensions.width, 10) || 0; + var gdh = parseInt(this.options.gridDimensions.height, 10) || 0; + var widthAdj = (this._width - gridPadding.left - gridPadding.right - gdw)/2; + var heightAdj = (this._height - gridPadding.top - gridPadding.bottom - gdh)/2; + + if (heightAdj >= 0 && widthAdj >= 0) { + gridPadding.top += heightAdj; + gridPadding.bottom += heightAdj; + gridPadding.left += widthAdj; + gridPadding.right += widthAdj; + } + } + var arr = ['top', 'bottom', 'left', 'right']; + for (var n in arr) { + if (this._gridPadding[arr[n]] == null && gridPadding[arr[n]] > 0) { + this._gridPadding[arr[n]] = gridPadding[arr[n]]; + } + else if (this._gridPadding[arr[n]] == null) { + this._gridPadding[arr[n]] = this._defaultGridPadding[arr[n]]; + } + } + + var legendPadding = (this.legend.placement == 'outsideGrid') ? {top:this.title.getHeight(), left: 0, right: 0, bottom: 0} : this._gridPadding; + + ax.xaxis.pack({position:'absolute', bottom:this._gridPadding.bottom - ax.xaxis.getHeight(), left:0, width:this._width}, {min:this._gridPadding.left, max:this._width - this._gridPadding.right}); + ax.yaxis.pack({position:'absolute', top:0, left:this._gridPadding.left - ax.yaxis.getWidth(), height:this._height}, {min:this._height - this._gridPadding.bottom, max: this._gridPadding.top}); + ax.x2axis.pack({position:'absolute', top:this._gridPadding.top - ax.x2axis.getHeight(), left:0, width:this._width}, {min:this._gridPadding.left, max:this._width - this._gridPadding.right}); + for (i=8; i>0; i--) { + ax[ra[i-1]].pack({position:'absolute', top:0, right:this._gridPadding.right - rapad[i-1]}, {min:this._height - this._gridPadding.bottom, max: this._gridPadding.top}); + } + var ltemp = (this._width - this._gridPadding.left - this._gridPadding.right)/2.0 + this._gridPadding.left - ax.yMidAxis.getWidth()/2.0; + ax.yMidAxis.pack({position:'absolute', top:0, left:ltemp, zIndex:9, textAlign: 'center'}, {min:this._height - this._gridPadding.bottom, max: this._gridPadding.top}); + + this.target.append(this.grid.createElement(this._gridPadding, this)); + this.grid.draw(); + + var series = this.series; + var seriesLength = series.length; + // put the shadow canvases behind the series canvases so shadows don't overlap on stacked bars. + for (i=0, l=seriesLength; i<l; i++) { + // draw series in order of stacking. This affects only + // order in which canvases are added to dom. + j = this.seriesStack[i]; + this.target.append(series[j].shadowCanvas.createElement(this._gridPadding, 'jqplot-series-shadowCanvas', null, this)); + series[j].shadowCanvas.setContext(); + series[j].shadowCanvas._elem.data('seriesIndex', j); + } + + for (i=0, l=seriesLength; i<l; i++) { + // draw series in order of stacking. This affects only + // order in which canvases are added to dom. + j = this.seriesStack[i]; + this.target.append(series[j].canvas.createElement(this._gridPadding, 'jqplot-series-canvas', null, this)); + series[j].canvas.setContext(); + series[j].canvas._elem.data('seriesIndex', j); + } + // Need to use filled canvas to capture events in IE. + // Also, canvas seems to block selection of other elements in document on FF. + this.target.append(this.eventCanvas.createElement(this._gridPadding, 'jqplot-event-canvas', null, this)); + this.eventCanvas.setContext(); + this.eventCanvas._ctx.fillStyle = 'rgba(0,0,0,0)'; + this.eventCanvas._ctx.fillRect(0,0,this.eventCanvas._ctx.canvas.width, this.eventCanvas._ctx.canvas.height); + + // bind custom event handlers to regular events. + this.bindCustomEvents(); + + // draw legend before series if the series needs to know the legend dimensions. + if (this.legend.preDraw) { + this.eventCanvas._elem.before(legendElem); + this.legend.pack(legendPadding); + if (this.legend._elem) { + this.drawSeries({legendInfo:{location:this.legend.location, placement:this.legend.placement, width:this.legend.getWidth(), height:this.legend.getHeight(), xoffset:this.legend.xoffset, yoffset:this.legend.yoffset}}); + } + else { + this.drawSeries(); + } + } + else { // draw series before legend + this.drawSeries(); + if (seriesLength) { + $(series[seriesLength-1].canvas._elem).after(legendElem); + } + this.legend.pack(legendPadding); + } + + // register event listeners on the overlay canvas + for (var i=0, l=$.jqplot.eventListenerHooks.length; i<l; i++) { + // in the handler, this will refer to the eventCanvas dom element. + // make sure there are references back into plot objects. + this.eventCanvas._elem.bind($.jqplot.eventListenerHooks[i][0], {plot:this}, $.jqplot.eventListenerHooks[i][1]); + } + + // register event listeners on the overlay canvas + for (var i=0, l=this.eventListenerHooks.hooks.length; i<l; i++) { + // in the handler, this will refer to the eventCanvas dom element. + // make sure there are references back into plot objects. + this.eventCanvas._elem.bind(this.eventListenerHooks.hooks[i][0], {plot:this}, this.eventListenerHooks.hooks[i][1]); + } + + var fb = this.fillBetween; + if (fb.fill && fb.series1 !== fb.series2 && fb.series1 < seriesLength && fb.series2 < seriesLength && series[fb.series1]._type === 'line' && series[fb.series2]._type === 'line') { + this.doFillBetweenLines(); + } + + for (var i=0, l=$.jqplot.postDrawHooks.length; i<l; i++) { + $.jqplot.postDrawHooks[i].call(this); + } + + for (var i=0, l=this.postDrawHooks.hooks.length; i<l; i++) { + this.postDrawHooks.hooks[i].apply(this, this.postDrawHooks.args[i]); + } + + if (this.target.is(':visible')) { + this._drawCount += 1; + } + + var temps, + tempr, + sel, + _els; + // ughh. ideally would hide all series then show them. + for (i=0, l=seriesLength; i<l; i++) { + temps = series[i]; + tempr = temps.renderer; + sel = '.jqplot-point-label.jqplot-series-'+i; + if (tempr.animation && tempr.animation._supported && tempr.animation.show && (this._drawCount < 2 || this.animateReplot)) { + _els = this.target.find(sel); + _els.stop(true, true).hide(); + temps.canvas._elem.stop(true, true).hide(); + temps.shadowCanvas._elem.stop(true, true).hide(); + temps.canvas._elem.jqplotEffect('blind', {mode: 'show', direction: tempr.animation.direction}, tempr.animation.speed); + temps.shadowCanvas._elem.jqplotEffect('blind', {mode: 'show', direction: tempr.animation.direction}, tempr.animation.speed); + _els.fadeIn(tempr.animation.speed*0.8); + } + } + _els = null; + + this.target.trigger('jqplotPostDraw', [this]); + } + }; + + jqPlot.prototype.doFillBetweenLines = function () { + var fb = this.fillBetween; + var sid1 = fb.series1; + var sid2 = fb.series2; + // first series should always be lowest index + var id1 = (sid1 < sid2) ? sid1 : sid2; + var id2 = (sid2 > sid1) ? sid2 : sid1; + + var series1 = this.series[id1]; + var series2 = this.series[id2]; + + if (series2.renderer.smooth) { + var tempgd = series2.renderer._smoothedData.slice(0).reverse(); + } + else { + var tempgd = series2.gridData.slice(0).reverse(); + } + + if (series1.renderer.smooth) { + var gd = series1.renderer._smoothedData.concat(tempgd); + } + else { + var gd = series1.gridData.concat(tempgd); + } + + var color = (fb.color !== null) ? fb.color : this.series[sid1].fillColor; + var baseSeries = (fb.baseSeries !== null) ? fb.baseSeries : id1; + + // now apply a fill to the shape on the lower series shadow canvas, + // so it is behind both series. + var sr = this.series[baseSeries].renderer.shapeRenderer; + var opts = {fillStyle: color, fill: true, closePath: true}; + sr.draw(series1.shadowCanvas._ctx, gd, opts); + }; + + this.bindCustomEvents = function() { + this.eventCanvas._elem.bind('click', {plot:this}, this.onClick); + this.eventCanvas._elem.bind('dblclick', {plot:this}, this.onDblClick); + this.eventCanvas._elem.bind('mousedown', {plot:this}, this.onMouseDown); + this.eventCanvas._elem.bind('mousemove', {plot:this}, this.onMouseMove); + this.eventCanvas._elem.bind('mouseenter', {plot:this}, this.onMouseEnter); + this.eventCanvas._elem.bind('mouseleave', {plot:this}, this.onMouseLeave); + if (this.captureRightClick) { + this.eventCanvas._elem.bind('mouseup', {plot:this}, this.onRightClick); + this.eventCanvas._elem.get(0).oncontextmenu = function() { + return false; + }; + } + else { + this.eventCanvas._elem.bind('mouseup', {plot:this}, this.onMouseUp); + } + }; + + function getEventPosition(ev) { + var plot = ev.data.plot; + var go = plot.eventCanvas._elem.offset(); + var gridPos = {x:ev.pageX - go.left, y:ev.pageY - go.top}; + var dataPos = {xaxis:null, yaxis:null, x2axis:null, y2axis:null, y3axis:null, y4axis:null, y5axis:null, y6axis:null, y7axis:null, y8axis:null, y9axis:null, yMidAxis:null}; + var an = ['xaxis', 'yaxis', 'x2axis', 'y2axis', 'y3axis', 'y4axis', 'y5axis', 'y6axis', 'y7axis', 'y8axis', 'y9axis', 'yMidAxis']; + var ax = plot.axes; + var n, axis; + for (n=11; n>0; n--) { + axis = an[n-1]; + if (ax[axis].show) { + dataPos[axis] = ax[axis].series_p2u(gridPos[axis.charAt(0)]); + } + } + + return {offsets:go, gridPos:gridPos, dataPos:dataPos}; + } + + + // function to check if event location is over a area area + function checkIntersection(gridpos, plot) { + var series = plot.series; + var i, j, k, s, r, x, y, theta, sm, sa, minang, maxang; + var d0, d, p, pp, points, bw; + var threshold, t; + for (k=plot.seriesStack.length-1; k>=0; k--) { + i = plot.seriesStack[k]; + s = series[i]; + switch (s.renderer.constructor) { + case $.jqplot.BarRenderer: + case $.jqplot.PyramidRenderer: + x = gridpos.x; + y = gridpos.y; + for (j=0; j<s._barPoints.length; j++) { + points = s._barPoints[j]; + p = s.gridData[j]; + if (x>points[0][0] && x<points[2][0] && y>points[2][1] && y<points[0][1]) { + return {seriesIndex:s.index, pointIndex:j, gridData:p, data:s.data[j], points:s._barPoints[j]}; + } + } + break; + + case $.jqplot.DonutRenderer: + sa = s.startAngle/180*Math.PI; + x = gridpos.x - s._center[0]; + y = gridpos.y - s._center[1]; + r = Math.sqrt(Math.pow(x, 2) + Math.pow(y, 2)); + if (x > 0 && -y >= 0) { + theta = 2*Math.PI - Math.atan(-y/x); + } + else if (x > 0 && -y < 0) { + theta = -Math.atan(-y/x); + } + else if (x < 0) { + theta = Math.PI - Math.atan(-y/x); + } + else if (x == 0 && -y > 0) { + theta = 3*Math.PI/2; + } + else if (x == 0 && -y < 0) { + theta = Math.PI/2; + } + else if (x == 0 && y == 0) { + theta = 0; + } + if (sa) { + theta -= sa; + if (theta < 0) { + theta += 2*Math.PI; + } + else if (theta > 2*Math.PI) { + theta -= 2*Math.PI; + } + } + + sm = s.sliceMargin/180*Math.PI; + if (r < s._radius && r > s._innerRadius) { + for (j=0; j<s.gridData.length; j++) { + minang = (j>0) ? s.gridData[j-1][1]+sm : sm; + maxang = s.gridData[j][1]; + if (theta > minang && theta < maxang) { + return {seriesIndex:s.index, pointIndex:j, gridData:s.gridData[j], data:s.data[j]}; + } + } + } + break; + + case $.jqplot.PieRenderer: + sa = s.startAngle/180*Math.PI; + x = gridpos.x - s._center[0]; + y = gridpos.y - s._center[1]; + r = Math.sqrt(Math.pow(x, 2) + Math.pow(y, 2)); + if (x > 0 && -y >= 0) { + theta = 2*Math.PI - Math.atan(-y/x); + } + else if (x > 0 && -y < 0) { + theta = -Math.atan(-y/x); + } + else if (x < 0) { + theta = Math.PI - Math.atan(-y/x); + } + else if (x == 0 && -y > 0) { + theta = 3*Math.PI/2; + } + else if (x == 0 && -y < 0) { + theta = Math.PI/2; + } + else if (x == 0 && y == 0) { + theta = 0; + } + if (sa) { + theta -= sa; + if (theta < 0) { + theta += 2*Math.PI; + } + else if (theta > 2*Math.PI) { + theta -= 2*Math.PI; + } + } + + sm = s.sliceMargin/180*Math.PI; + if (r < s._radius) { + for (j=0; j<s.gridData.length; j++) { + minang = (j>0) ? s.gridData[j-1][1]+sm : sm; + maxang = s.gridData[j][1]; + if (theta > minang && theta < maxang) { + return {seriesIndex:s.index, pointIndex:j, gridData:s.gridData[j], data:s.data[j]}; + } + } + } + break; + + case $.jqplot.BubbleRenderer: + x = gridpos.x; + y = gridpos.y; + var ret = null; + + if (s.show) { + for (var j=0; j<s.gridData.length; j++) { + p = s.gridData[j]; + d = Math.sqrt( (x-p[0]) * (x-p[0]) + (y-p[1]) * (y-p[1]) ); + if (d <= p[2] && (d <= d0 || d0 == null)) { + d0 = d; + ret = {seriesIndex: i, pointIndex:j, gridData:p, data:s.data[j]}; + } + } + if (ret != null) { + return ret; + } + } + break; + + case $.jqplot.FunnelRenderer: + x = gridpos.x; + y = gridpos.y; + var v = s._vertices, + vfirst = v[0], + vlast = v[v.length-1], + lex, + rex, + cv; + + // equations of right and left sides, returns x, y values given height of section (y value and 2 points) + + function findedge (l, p1 , p2) { + var m = (p1[1] - p2[1])/(p1[0] - p2[0]); + var b = p1[1] - m*p1[0]; + var y = l + p1[1]; + + return [(y - b)/m, y]; + } + + // check each section + lex = findedge(y, vfirst[0], vlast[3]); + rex = findedge(y, vfirst[1], vlast[2]); + for (j=0; j<v.length; j++) { + cv = v[j]; + if (y >= cv[0][1] && y <= cv[3][1] && x >= lex[0] && x <= rex[0]) { + return {seriesIndex:s.index, pointIndex:j, gridData:null, data:s.data[j]}; + } + } + break; + + case $.jqplot.LineRenderer: + x = gridpos.x; + y = gridpos.y; + r = s.renderer; + if (s.show) { + if ((s.fill || (s.renderer.bands.show && s.renderer.bands.fill)) && (!plot.plugins.highlighter || !plot.plugins.highlighter.show)) { + // first check if it is in bounding box + var inside = false; + if (x>s._boundingBox[0][0] && x<s._boundingBox[1][0] && y>s._boundingBox[1][1] && y<s._boundingBox[0][1]) { + // now check the crossing number + + var numPoints = s._areaPoints.length; + var ii; + var j = numPoints-1; + + for(var ii=0; ii < numPoints; ii++) { + var vertex1 = [s._areaPoints[ii][0], s._areaPoints[ii][1]]; + var vertex2 = [s._areaPoints[j][0], s._areaPoints[j][1]]; + + if (vertex1[1] < y && vertex2[1] >= y || vertex2[1] < y && vertex1[1] >= y) { + if (vertex1[0] + (y - vertex1[1]) / (vertex2[1] - vertex1[1]) * (vertex2[0] - vertex1[0]) < x) { + inside = !inside; + } + } + + j = ii; + } + } + if (inside) { + return {seriesIndex:i, pointIndex:null, gridData:s.gridData, data:s.data, points:s._areaPoints}; + } + break; + + } + + else { + t = s.markerRenderer.size/2+s.neighborThreshold; + threshold = (t > 0) ? t : 0; + for (var j=0; j<s.gridData.length; j++) { + p = s.gridData[j]; + // neighbor looks different to OHLC chart. + if (r.constructor == $.jqplot.OHLCRenderer) { + if (r.candleStick) { + var yp = s._yaxis.series_u2p; + if (x >= p[0]-r._bodyWidth/2 && x <= p[0]+r._bodyWidth/2 && y >= yp(s.data[j][2]) && y <= yp(s.data[j][3])) { + return {seriesIndex: i, pointIndex:j, gridData:p, data:s.data[j]}; + } + } + // if an open hi low close chart + else if (!r.hlc){ + var yp = s._yaxis.series_u2p; + if (x >= p[0]-r._tickLength && x <= p[0]+r._tickLength && y >= yp(s.data[j][2]) && y <= yp(s.data[j][3])) { + return {seriesIndex: i, pointIndex:j, gridData:p, data:s.data[j]}; + } + } + // a hi low close chart + else { + var yp = s._yaxis.series_u2p; + if (x >= p[0]-r._tickLength && x <= p[0]+r._tickLength && y >= yp(s.data[j][1]) && y <= yp(s.data[j][2])) { + return {seriesIndex: i, pointIndex:j, gridData:p, data:s.data[j]}; + } + } + + } + else if (p[0] != null && p[1] != null){ + d = Math.sqrt( (x-p[0]) * (x-p[0]) + (y-p[1]) * (y-p[1]) ); + if (d <= threshold && (d <= d0 || d0 == null)) { + d0 = d; + return {seriesIndex: i, pointIndex:j, gridData:p, data:s.data[j]}; + } + } + } + } + } + break; + + default: + x = gridpos.x; + y = gridpos.y; + r = s.renderer; + if (s.show) { + t = s.markerRenderer.size/2+s.neighborThreshold; + threshold = (t > 0) ? t : 0; + for (var j=0; j<s.gridData.length; j++) { + p = s.gridData[j]; + // neighbor looks different to OHLC chart. + if (r.constructor == $.jqplot.OHLCRenderer) { + if (r.candleStick) { + var yp = s._yaxis.series_u2p; + if (x >= p[0]-r._bodyWidth/2 && x <= p[0]+r._bodyWidth/2 && y >= yp(s.data[j][2]) && y <= yp(s.data[j][3])) { + return {seriesIndex: i, pointIndex:j, gridData:p, data:s.data[j]}; + } + } + // if an open hi low close chart + else if (!r.hlc){ + var yp = s._yaxis.series_u2p; + if (x >= p[0]-r._tickLength && x <= p[0]+r._tickLength && y >= yp(s.data[j][2]) && y <= yp(s.data[j][3])) { + return {seriesIndex: i, pointIndex:j, gridData:p, data:s.data[j]}; + } + } + // a hi low close chart + else { + var yp = s._yaxis.series_u2p; + if (x >= p[0]-r._tickLength && x <= p[0]+r._tickLength && y >= yp(s.data[j][1]) && y <= yp(s.data[j][2])) { + return {seriesIndex: i, pointIndex:j, gridData:p, data:s.data[j]}; + } + } + + } + else { + d = Math.sqrt( (x-p[0]) * (x-p[0]) + (y-p[1]) * (y-p[1]) ); + if (d <= threshold && (d <= d0 || d0 == null)) { + d0 = d; + return {seriesIndex: i, pointIndex:j, gridData:p, data:s.data[j]}; + } + } + } + } + break; + } + } + + return null; + } + + + + this.onClick = function(ev) { + // Event passed in is normalized and will have data attribute. + // Event passed out is unnormalized. + var positions = getEventPosition(ev); + var p = ev.data.plot; + var neighbor = checkIntersection(positions.gridPos, p); + var evt = jQuery.Event('jqplotClick'); + evt.pageX = ev.pageX; + evt.pageY = ev.pageY; + $(this).trigger(evt, [positions.gridPos, positions.dataPos, neighbor, p]); + }; + + this.onDblClick = function(ev) { + // Event passed in is normalized and will have data attribute. + // Event passed out is unnormalized. + var positions = getEventPosition(ev); + var p = ev.data.plot; + var neighbor = checkIntersection(positions.gridPos, p); + var evt = jQuery.Event('jqplotDblClick'); + evt.pageX = ev.pageX; + evt.pageY = ev.pageY; + $(this).trigger(evt, [positions.gridPos, positions.dataPos, neighbor, p]); + }; + + this.onMouseDown = function(ev) { + var positions = getEventPosition(ev); + var p = ev.data.plot; + var neighbor = checkIntersection(positions.gridPos, p); + var evt = jQuery.Event('jqplotMouseDown'); + evt.pageX = ev.pageX; + evt.pageY = ev.pageY; + $(this).trigger(evt, [positions.gridPos, positions.dataPos, neighbor, p]); + }; + + this.onMouseUp = function(ev) { + var positions = getEventPosition(ev); + var evt = jQuery.Event('jqplotMouseUp'); + evt.pageX = ev.pageX; + evt.pageY = ev.pageY; + $(this).trigger(evt, [positions.gridPos, positions.dataPos, null, ev.data.plot]); + }; + + this.onRightClick = function(ev) { + var positions = getEventPosition(ev); + var p = ev.data.plot; + var neighbor = checkIntersection(positions.gridPos, p); + if (p.captureRightClick) { + if (ev.which == 3) { + var evt = jQuery.Event('jqplotRightClick'); + evt.pageX = ev.pageX; + evt.pageY = ev.pageY; + $(this).trigger(evt, [positions.gridPos, positions.dataPos, neighbor, p]); + } + else { + var evt = jQuery.Event('jqplotMouseUp'); + evt.pageX = ev.pageX; + evt.pageY = ev.pageY; + $(this).trigger(evt, [positions.gridPos, positions.dataPos, neighbor, p]); + } + } + }; + + this.onMouseMove = function(ev) { + var positions = getEventPosition(ev); + var p = ev.data.plot; + var neighbor = checkIntersection(positions.gridPos, p); + var evt = jQuery.Event('jqplotMouseMove'); + evt.pageX = ev.pageX; + evt.pageY = ev.pageY; + $(this).trigger(evt, [positions.gridPos, positions.dataPos, neighbor, p]); + }; + + this.onMouseEnter = function(ev) { + var positions = getEventPosition(ev); + var p = ev.data.plot; + var evt = jQuery.Event('jqplotMouseEnter'); + evt.pageX = ev.pageX; + evt.pageY = ev.pageY; + evt.relatedTarget = ev.relatedTarget; + $(this).trigger(evt, [positions.gridPos, positions.dataPos, null, p]); + }; + + this.onMouseLeave = function(ev) { + var positions = getEventPosition(ev); + var p = ev.data.plot; + var evt = jQuery.Event('jqplotMouseLeave'); + evt.pageX = ev.pageX; + evt.pageY = ev.pageY; + evt.relatedTarget = ev.relatedTarget; + $(this).trigger(evt, [positions.gridPos, positions.dataPos, null, p]); + }; + + // method: drawSeries + // Redraws all or just one series on the plot. No axis scaling + // is performed and no other elements on the plot are redrawn. + // options is an options object to pass on to the series renderers. + // It can be an empty object {}. idx is the series index + // to redraw if only one series is to be redrawn. + this.drawSeries = function(options, idx){ + var i, series, ctx; + // if only one argument passed in and it is a number, use it ad idx. + idx = (typeof(options) === "number" && idx == null) ? options : idx; + options = (typeof(options) === "object") ? options : {}; + // draw specified series + if (idx != undefined) { + series = this.series[idx]; + ctx = series.shadowCanvas._ctx; + ctx.clearRect(0, 0, ctx.canvas.width, ctx.canvas.height); + series.drawShadow(ctx, options, this); + ctx = series.canvas._ctx; + ctx.clearRect(0, 0, ctx.canvas.width, ctx.canvas.height); + series.draw(ctx, options, this); + if (series.renderer.constructor == $.jqplot.BezierCurveRenderer) { + if (idx < this.series.length - 1) { + this.drawSeries(idx+1); + } + } + } + + else { + // if call series drawShadow method first, in case all series shadows + // should be drawn before any series. This will ensure, like for + // stacked bar plots, that shadows don't overlap series. + for (i=0; i<this.series.length; i++) { + // first clear the canvas + series = this.series[i]; + ctx = series.shadowCanvas._ctx; + ctx.clearRect(0, 0, ctx.canvas.width, ctx.canvas.height); + series.drawShadow(ctx, options, this); + ctx = series.canvas._ctx; + ctx.clearRect(0, 0, ctx.canvas.width, ctx.canvas.height); + series.draw(ctx, options, this); + } + } + options = idx = i = series = ctx = null; + }; + + // method: moveSeriesToFront + // This method requires jQuery 1.4+ + // Moves the specified series canvas in front of all other series canvases. + // This effectively "draws" the specified series on top of all other series, + // although it is performed through DOM manipulation, no redrawing is performed. + // + // Parameters: + // idx - 0 based index of the series to move. This will be the index of the series + // as it was first passed into the jqplot function. + this.moveSeriesToFront = function (idx) { + idx = parseInt(idx, 10); + var stackIndex = $.inArray(idx, this.seriesStack); + // if already in front, return + if (stackIndex == -1) { + return; + } + if (stackIndex == this.seriesStack.length -1) { + this.previousSeriesStack = this.seriesStack.slice(0); + return; + } + var opidx = this.seriesStack[this.seriesStack.length -1]; + var serelem = this.series[idx].canvas._elem.detach(); + var shadelem = this.series[idx].shadowCanvas._elem.detach(); + this.series[opidx].shadowCanvas._elem.after(shadelem); + this.series[opidx].canvas._elem.after(serelem); + this.previousSeriesStack = this.seriesStack.slice(0); + this.seriesStack.splice(stackIndex, 1); + this.seriesStack.push(idx); + }; + + // method: moveSeriesToBack + // This method requires jQuery 1.4+ + // Moves the specified series canvas behind all other series canvases. + // + // Parameters: + // idx - 0 based index of the series to move. This will be the index of the series + // as it was first passed into the jqplot function. + this.moveSeriesToBack = function (idx) { + idx = parseInt(idx, 10); + var stackIndex = $.inArray(idx, this.seriesStack); + // if already in back, return + if (stackIndex == 0 || stackIndex == -1) { + return; + } + var opidx = this.seriesStack[0]; + var serelem = this.series[idx].canvas._elem.detach(); + var shadelem = this.series[idx].shadowCanvas._elem.detach(); + this.series[opidx].shadowCanvas._elem.before(shadelem); + this.series[opidx].canvas._elem.before(serelem); + this.previousSeriesStack = this.seriesStack.slice(0); + this.seriesStack.splice(stackIndex, 1); + this.seriesStack.unshift(idx); + }; + + // method: restorePreviousSeriesOrder + // This method requires jQuery 1.4+ + // Restore the series canvas order to its previous state. + // Useful to put a series back where it belongs after moving + // it to the front. + this.restorePreviousSeriesOrder = function () { + var i, j, serelem, shadelem, temp, move, keep; + // if no change, return. + if (this.seriesStack == this.previousSeriesStack) { + return; + } + for (i=1; i<this.previousSeriesStack.length; i++) { + move = this.previousSeriesStack[i]; + keep = this.previousSeriesStack[i-1]; + serelem = this.series[move].canvas._elem.detach(); + shadelem = this.series[move].shadowCanvas._elem.detach(); + this.series[keep].shadowCanvas._elem.after(shadelem); + this.series[keep].canvas._elem.after(serelem); + } + temp = this.seriesStack.slice(0); + this.seriesStack = this.previousSeriesStack.slice(0); + this.previousSeriesStack = temp; + }; + + // method: restoreOriginalSeriesOrder + // This method requires jQuery 1.4+ + // Restore the series canvas order to its original order + // when the plot was created. + this.restoreOriginalSeriesOrder = function () { + var i, j, arr=[], serelem, shadelem; + for (i=0; i<this.series.length; i++) { + arr.push(i); + } + if (this.seriesStack == arr) { + return; + } + this.previousSeriesStack = this.seriesStack.slice(0); + this.seriesStack = arr; + for (i=1; i<this.seriesStack.length; i++) { + serelem = this.series[i].canvas._elem.detach(); + shadelem = this.series[i].shadowCanvas._elem.detach(); + this.series[i-1].shadowCanvas._elem.after(shadelem); + this.series[i-1].canvas._elem.after(serelem); + } + }; + + this.activateTheme = function (name) { + this.themeEngine.activate(this, name); + }; + } + + + // conpute a highlight color or array of highlight colors from given colors. + $.jqplot.computeHighlightColors = function(colors) { + var ret; + if (jQuery.isArray(colors)) { + ret = []; + for (var i=0; i<colors.length; i++){ + var rgba = $.jqplot.getColorComponents(colors[i]); + var newrgb = [rgba[0], rgba[1], rgba[2]]; + var sum = newrgb[0] + newrgb[1] + newrgb[2]; + for (var j=0; j<3; j++) { + // when darkening, lowest color component can be is 60. + newrgb[j] = (sum > 660) ? newrgb[j] * 0.85 : 0.73 * newrgb[j] + 90; + newrgb[j] = parseInt(newrgb[j], 10); + (newrgb[j] > 255) ? 255 : newrgb[j]; + } + // newrgb[3] = (rgba[3] > 0.4) ? rgba[3] * 0.4 : rgba[3] * 1.5; + // newrgb[3] = (rgba[3] > 0.5) ? 0.8 * rgba[3] - .1 : rgba[3] + 0.2; + newrgb[3] = 0.3 + 0.35 * rgba[3]; + ret.push('rgba('+newrgb[0]+','+newrgb[1]+','+newrgb[2]+','+newrgb[3]+')'); + } + } + else { + var rgba = $.jqplot.getColorComponents(colors); + var newrgb = [rgba[0], rgba[1], rgba[2]]; + var sum = newrgb[0] + newrgb[1] + newrgb[2]; + for (var j=0; j<3; j++) { + // when darkening, lowest color component can be is 60. + // newrgb[j] = (sum > 570) ? newrgb[j] * 0.8 : newrgb[j] + 0.3 * (255 - newrgb[j]); + // newrgb[j] = parseInt(newrgb[j], 10); + newrgb[j] = (sum > 660) ? newrgb[j] * 0.85 : 0.73 * newrgb[j] + 90; + newrgb[j] = parseInt(newrgb[j], 10); + (newrgb[j] > 255) ? 255 : newrgb[j]; + } + // newrgb[3] = (rgba[3] > 0.4) ? rgba[3] * 0.4 : rgba[3] * 1.5; + // newrgb[3] = (rgba[3] > 0.5) ? 0.8 * rgba[3] - .1 : rgba[3] + 0.2; + newrgb[3] = 0.3 + 0.35 * rgba[3]; + ret = 'rgba('+newrgb[0]+','+newrgb[1]+','+newrgb[2]+','+newrgb[3]+')'; + } + return ret; + }; + + $.jqplot.ColorGenerator = function(colors) { + colors = colors || $.jqplot.config.defaultColors; + var idx = 0; + + this.next = function () { + if (idx < colors.length) { + return colors[idx++]; + } + else { + idx = 0; + return colors[idx++]; + } + }; + + this.previous = function () { + if (idx > 0) { + return colors[idx--]; + } + else { + idx = colors.length-1; + return colors[idx]; + } + }; + + // get a color by index without advancing pointer. + this.get = function(i) { + var idx = i - colors.length * Math.floor(i/colors.length); + return colors[idx]; + }; + + this.setColors = function(c) { + colors = c; + }; + + this.reset = function() { + idx = 0; + }; + + this.getIndex = function() { + return idx; + }; + + this.setIndex = function(index) { + idx = index; + }; + }; + + // convert a hex color string to rgb string. + // h - 3 or 6 character hex string, with or without leading # + // a - optional alpha + $.jqplot.hex2rgb = function(h, a) { + h = h.replace('#', ''); + if (h.length == 3) { + h = h.charAt(0)+h.charAt(0)+h.charAt(1)+h.charAt(1)+h.charAt(2)+h.charAt(2); + } + var rgb; + rgb = 'rgba('+parseInt(h.slice(0,2), 16)+', '+parseInt(h.slice(2,4), 16)+', '+parseInt(h.slice(4,6), 16); + if (a) { + rgb += ', '+a; + } + rgb += ')'; + return rgb; + }; + + // convert an rgb color spec to a hex spec. ignore any alpha specification. + $.jqplot.rgb2hex = function(s) { + var pat = /rgba?\( *([0-9]{1,3}\.?[0-9]*%?) *, *([0-9]{1,3}\.?[0-9]*%?) *, *([0-9]{1,3}\.?[0-9]*%?) *(?:, *[0-9.]*)?\)/; + var m = s.match(pat); + var h = '#'; + for (var i=1; i<4; i++) { + var temp; + if (m[i].search(/%/) != -1) { + temp = parseInt(255*m[i]/100, 10).toString(16); + if (temp.length == 1) { + temp = '0'+temp; + } + } + else { + temp = parseInt(m[i], 10).toString(16); + if (temp.length == 1) { + temp = '0'+temp; + } + } + h += temp; + } + return h; + }; + + // given a css color spec, return an rgb css color spec + $.jqplot.normalize2rgb = function(s, a) { + if (s.search(/^ *rgba?\(/) != -1) { + return s; + } + else if (s.search(/^ *#?[0-9a-fA-F]?[0-9a-fA-F]/) != -1) { + return $.jqplot.hex2rgb(s, a); + } + else { + throw 'invalid color spec'; + } + }; + + // extract the r, g, b, a color components out of a css color spec. + $.jqplot.getColorComponents = function(s) { + // check to see if a color keyword. + s = $.jqplot.colorKeywordMap[s] || s; + var rgb = $.jqplot.normalize2rgb(s); + var pat = /rgba?\( *([0-9]{1,3}\.?[0-9]*%?) *, *([0-9]{1,3}\.?[0-9]*%?) *, *([0-9]{1,3}\.?[0-9]*%?) *,? *([0-9.]* *)?\)/; + var m = rgb.match(pat); + var ret = []; + for (var i=1; i<4; i++) { + if (m[i].search(/%/) != -1) { + ret[i-1] = parseInt(255*m[i]/100, 10); + } + else { + ret[i-1] = parseInt(m[i], 10); + } + } + ret[3] = parseFloat(m[4]) ? parseFloat(m[4]) : 1.0; + return ret; + }; + + $.jqplot.colorKeywordMap = { + aliceblue: 'rgb(240, 248, 255)', + antiquewhite: 'rgb(250, 235, 215)', + aqua: 'rgb( 0, 255, 255)', + aquamarine: 'rgb(127, 255, 212)', + azure: 'rgb(240, 255, 255)', + beige: 'rgb(245, 245, 220)', + bisque: 'rgb(255, 228, 196)', + black: 'rgb( 0, 0, 0)', + blanchedalmond: 'rgb(255, 235, 205)', + blue: 'rgb( 0, 0, 255)', + blueviolet: 'rgb(138, 43, 226)', + brown: 'rgb(165, 42, 42)', + burlywood: 'rgb(222, 184, 135)', + cadetblue: 'rgb( 95, 158, 160)', + chartreuse: 'rgb(127, 255, 0)', + chocolate: 'rgb(210, 105, 30)', + coral: 'rgb(255, 127, 80)', + cornflowerblue: 'rgb(100, 149, 237)', + cornsilk: 'rgb(255, 248, 220)', + crimson: 'rgb(220, 20, 60)', + cyan: 'rgb( 0, 255, 255)', + darkblue: 'rgb( 0, 0, 139)', + darkcyan: 'rgb( 0, 139, 139)', + darkgoldenrod: 'rgb(184, 134, 11)', + darkgray: 'rgb(169, 169, 169)', + darkgreen: 'rgb( 0, 100, 0)', + darkgrey: 'rgb(169, 169, 169)', + darkkhaki: 'rgb(189, 183, 107)', + darkmagenta: 'rgb(139, 0, 139)', + darkolivegreen: 'rgb( 85, 107, 47)', + darkorange: 'rgb(255, 140, 0)', + darkorchid: 'rgb(153, 50, 204)', + darkred: 'rgb(139, 0, 0)', + darksalmon: 'rgb(233, 150, 122)', + darkseagreen: 'rgb(143, 188, 143)', + darkslateblue: 'rgb( 72, 61, 139)', + darkslategray: 'rgb( 47, 79, 79)', + darkslategrey: 'rgb( 47, 79, 79)', + darkturquoise: 'rgb( 0, 206, 209)', + darkviolet: 'rgb(148, 0, 211)', + deeppink: 'rgb(255, 20, 147)', + deepskyblue: 'rgb( 0, 191, 255)', + dimgray: 'rgb(105, 105, 105)', + dimgrey: 'rgb(105, 105, 105)', + dodgerblue: 'rgb( 30, 144, 255)', + firebrick: 'rgb(178, 34, 34)', + floralwhite: 'rgb(255, 250, 240)', + forestgreen: 'rgb( 34, 139, 34)', + fuchsia: 'rgb(255, 0, 255)', + gainsboro: 'rgb(220, 220, 220)', + ghostwhite: 'rgb(248, 248, 255)', + gold: 'rgb(255, 215, 0)', + goldenrod: 'rgb(218, 165, 32)', + gray: 'rgb(128, 128, 128)', + grey: 'rgb(128, 128, 128)', + green: 'rgb( 0, 128, 0)', + greenyellow: 'rgb(173, 255, 47)', + honeydew: 'rgb(240, 255, 240)', + hotpink: 'rgb(255, 105, 180)', + indianred: 'rgb(205, 92, 92)', + indigo: 'rgb( 75, 0, 130)', + ivory: 'rgb(255, 255, 240)', + khaki: 'rgb(240, 230, 140)', + lavender: 'rgb(230, 230, 250)', + lavenderblush: 'rgb(255, 240, 245)', + lawngreen: 'rgb(124, 252, 0)', + lemonchiffon: 'rgb(255, 250, 205)', + lightblue: 'rgb(173, 216, 230)', + lightcoral: 'rgb(240, 128, 128)', + lightcyan: 'rgb(224, 255, 255)', + lightgoldenrodyellow: 'rgb(250, 250, 210)', + lightgray: 'rgb(211, 211, 211)', + lightgreen: 'rgb(144, 238, 144)', + lightgrey: 'rgb(211, 211, 211)', + lightpink: 'rgb(255, 182, 193)', + lightsalmon: 'rgb(255, 160, 122)', + lightseagreen: 'rgb( 32, 178, 170)', + lightskyblue: 'rgb(135, 206, 250)', + lightslategray: 'rgb(119, 136, 153)', + lightslategrey: 'rgb(119, 136, 153)', + lightsteelblue: 'rgb(176, 196, 222)', + lightyellow: 'rgb(255, 255, 224)', + lime: 'rgb( 0, 255, 0)', + limegreen: 'rgb( 50, 205, 50)', + linen: 'rgb(250, 240, 230)', + magenta: 'rgb(255, 0, 255)', + maroon: 'rgb(128, 0, 0)', + mediumaquamarine: 'rgb(102, 205, 170)', + mediumblue: 'rgb( 0, 0, 205)', + mediumorchid: 'rgb(186, 85, 211)', + mediumpurple: 'rgb(147, 112, 219)', + mediumseagreen: 'rgb( 60, 179, 113)', + mediumslateblue: 'rgb(123, 104, 238)', + mediumspringgreen: 'rgb( 0, 250, 154)', + mediumturquoise: 'rgb( 72, 209, 204)', + mediumvioletred: 'rgb(199, 21, 133)', + midnightblue: 'rgb( 25, 25, 112)', + mintcream: 'rgb(245, 255, 250)', + mistyrose: 'rgb(255, 228, 225)', + moccasin: 'rgb(255, 228, 181)', + navajowhite: 'rgb(255, 222, 173)', + navy: 'rgb( 0, 0, 128)', + oldlace: 'rgb(253, 245, 230)', + olive: 'rgb(128, 128, 0)', + olivedrab: 'rgb(107, 142, 35)', + orange: 'rgb(255, 165, 0)', + orangered: 'rgb(255, 69, 0)', + orchid: 'rgb(218, 112, 214)', + palegoldenrod: 'rgb(238, 232, 170)', + palegreen: 'rgb(152, 251, 152)', + paleturquoise: 'rgb(175, 238, 238)', + palevioletred: 'rgb(219, 112, 147)', + papayawhip: 'rgb(255, 239, 213)', + peachpuff: 'rgb(255, 218, 185)', + peru: 'rgb(205, 133, 63)', + pink: 'rgb(255, 192, 203)', + plum: 'rgb(221, 160, 221)', + powderblue: 'rgb(176, 224, 230)', + purple: 'rgb(128, 0, 128)', + red: 'rgb(255, 0, 0)', + rosybrown: 'rgb(188, 143, 143)', + royalblue: 'rgb( 65, 105, 225)', + saddlebrown: 'rgb(139, 69, 19)', + salmon: 'rgb(250, 128, 114)', + sandybrown: 'rgb(244, 164, 96)', + seagreen: 'rgb( 46, 139, 87)', + seashell: 'rgb(255, 245, 238)', + sienna: 'rgb(160, 82, 45)', + silver: 'rgb(192, 192, 192)', + skyblue: 'rgb(135, 206, 235)', + slateblue: 'rgb(106, 90, 205)', + slategray: 'rgb(112, 128, 144)', + slategrey: 'rgb(112, 128, 144)', + snow: 'rgb(255, 250, 250)', + springgreen: 'rgb( 0, 255, 127)', + steelblue: 'rgb( 70, 130, 180)', + tan: 'rgb(210, 180, 140)', + teal: 'rgb( 0, 128, 128)', + thistle: 'rgb(216, 191, 216)', + tomato: 'rgb(255, 99, 71)', + turquoise: 'rgb( 64, 224, 208)', + violet: 'rgb(238, 130, 238)', + wheat: 'rgb(245, 222, 179)', + white: 'rgb(255, 255, 255)', + whitesmoke: 'rgb(245, 245, 245)', + yellow: 'rgb(255, 255, 0)', + yellowgreen: 'rgb(154, 205, 50)' + }; + + + + // class: $.jqplot.AxisLabelRenderer + // Renderer to place labels on the axes. + $.jqplot.AxisLabelRenderer = function(options) { + // Group: Properties + $.jqplot.ElemContainer.call(this); + // name of the axis associated with this tick + this.axis; + // prop: show + // wether or not to show the tick (mark and label). + this.show = true; + // prop: label + // The text or html for the label. + this.label = ''; + this.fontFamily = null; + this.fontSize = null; + this.textColor = null; + this._elem; + // prop: escapeHTML + // true to escape HTML entities in the label. + this.escapeHTML = false; + + $.extend(true, this, options); + }; + + $.jqplot.AxisLabelRenderer.prototype = new $.jqplot.ElemContainer(); + $.jqplot.AxisLabelRenderer.prototype.constructor = $.jqplot.AxisLabelRenderer; + + $.jqplot.AxisLabelRenderer.prototype.init = function(options) { + $.extend(true, this, options); + }; + + $.jqplot.AxisLabelRenderer.prototype.draw = function(ctx, plot) { + // Memory Leaks patch + if (this._elem) { + this._elem.emptyForce(); + this._elem = null; + } + + this._elem = $('<div style="position:absolute;" class="jqplot-'+this.axis+'-label"></div>'); + + if (Number(this.label)) { + this._elem.css('white-space', 'nowrap'); + } + + if (!this.escapeHTML) { + this._elem.html(this.label); + } + else { + this._elem.text(this.label); + } + if (this.fontFamily) { + this._elem.css('font-family', this.fontFamily); + } + if (this.fontSize) { + this._elem.css('font-size', this.fontSize); + } + if (this.textColor) { + this._elem.css('color', this.textColor); + } + + return this._elem; + }; + + $.jqplot.AxisLabelRenderer.prototype.pack = function() { + }; + + // class: $.jqplot.AxisTickRenderer + // A "tick" object showing the value of a tick/gridline on the plot. + $.jqplot.AxisTickRenderer = function(options) { + // Group: Properties + $.jqplot.ElemContainer.call(this); + // prop: mark + // tick mark on the axis. One of 'inside', 'outside', 'cross', '' or null. + this.mark = 'outside'; + // name of the axis associated with this tick + this.axis; + // prop: showMark + // wether or not to show the mark on the axis. + this.showMark = true; + // prop: showGridline + // wether or not to draw the gridline on the grid at this tick. + this.showGridline = true; + // prop: isMinorTick + // if this is a minor tick. + this.isMinorTick = false; + // prop: size + // Length of the tick beyond the grid in pixels. + // DEPRECATED: This has been superceeded by markSize + this.size = 4; + // prop: markSize + // 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. + this.markSize = 6; + // prop: show + // wether or not to show the tick (mark and label). + // Setting this to false requires more testing. It is recommended + // to set showLabel and showMark to false instead. + this.show = true; + // prop: showLabel + // wether or not to show the label. + this.showLabel = true; + this.label = null; + this.value = null; + this._styles = {}; + // prop: formatter + // A class of a formatter for the tick text. sprintf by default. + this.formatter = $.jqplot.DefaultTickFormatter; + // prop: prefix + // String to prepend to the tick label. + // Prefix is prepended to the formatted tick label. + this.prefix = ''; + // prop: formatString + // string passed to the formatter. + this.formatString = ''; + // prop: fontFamily + // css spec for the font-family css attribute. + this.fontFamily; + // prop: fontSize + // css spec for the font-size css attribute. + this.fontSize; + // prop: textColor + // css spec for the color attribute. + this.textColor; + // prop: escapeHTML + // true to escape HTML entities in the label. + this.escapeHTML = false; + this._elem; + this._breakTick = false; + + $.extend(true, this, options); + }; + + $.jqplot.AxisTickRenderer.prototype.init = function(options) { + $.extend(true, this, options); + }; + + $.jqplot.AxisTickRenderer.prototype = new $.jqplot.ElemContainer(); + $.jqplot.AxisTickRenderer.prototype.constructor = $.jqplot.AxisTickRenderer; + + $.jqplot.AxisTickRenderer.prototype.setTick = function(value, axisName, isMinor) { + this.value = value; + this.axis = axisName; + if (isMinor) { + this.isMinorTick = true; + } + return this; + }; + + $.jqplot.AxisTickRenderer.prototype.draw = function() { + if (this.label === null) { + this.label = this.prefix + this.formatter(this.formatString, this.value); + } + var style = {position: 'absolute'}; + if (Number(this.label)) { + style['whitSpace'] = 'nowrap'; + } + + // Memory Leaks patch + if (this._elem) { + this._elem.emptyForce(); + this._elem = null; + } + + this._elem = $(document.createElement('div')); + this._elem.addClass("jqplot-"+this.axis+"-tick"); + + if (!this.escapeHTML) { + this._elem.html(this.label); + } + else { + this._elem.text(this.label); + } + + this._elem.css(style); + + for (var s in this._styles) { + this._elem.css(s, this._styles[s]); + } + if (this.fontFamily) { + this._elem.css('font-family', this.fontFamily); + } + if (this.fontSize) { + this._elem.css('font-size', this.fontSize); + } + if (this.textColor) { + this._elem.css('color', this.textColor); + } + if (this._breakTick) { + this._elem.addClass('jqplot-breakTick'); + } + + return this._elem; + }; + + $.jqplot.DefaultTickFormatter = function (format, val) { + if (typeof val == 'number') { + if (!format) { + format = $.jqplot.config.defaultTickFormatString; + } + return $.jqplot.sprintf(format, val); + } + else { + return String(val); + } + }; + + $.jqplot.AxisTickRenderer.prototype.pack = function() { + }; + + // Class: $.jqplot.CanvasGridRenderer + // The default jqPlot grid renderer, creating a grid on a canvas element. + // The renderer has no additional options beyond the <Grid> class. + $.jqplot.CanvasGridRenderer = function(){ + this.shadowRenderer = new $.jqplot.ShadowRenderer(); + }; + + // called with context of Grid object + $.jqplot.CanvasGridRenderer.prototype.init = function(options) { + this._ctx; + $.extend(true, this, options); + // set the shadow renderer options + var sopts = {lineJoin:'miter', lineCap:'round', fill:false, isarc:false, angle:this.shadowAngle, offset:this.shadowOffset, alpha:this.shadowAlpha, depth:this.shadowDepth, lineWidth:this.shadowWidth, closePath:false, strokeStyle:this.shadowColor}; + this.renderer.shadowRenderer.init(sopts); + }; + + // called with context of Grid. + $.jqplot.CanvasGridRenderer.prototype.createElement = function(plot) { + var elem; + // Memory Leaks patch + if (this._elem) { + if ($.jqplot.use_excanvas && window.G_vmlCanvasManager.uninitElement !== undefined) { + elem = this._elem.get(0); + window.G_vmlCanvasManager.uninitElement(elem); + elem = null; + } + + this._elem.emptyForce(); + this._elem = null; + } + + elem = plot.canvasManager.getCanvas(); + + var w = this._plotDimensions.width; + var h = this._plotDimensions.height; + elem.width = w; + elem.height = h; + this._elem = $(elem); + this._elem.addClass('jqplot-grid-canvas'); + this._elem.css({ position: 'absolute', left: 0, top: 0 }); + + elem = plot.canvasManager.initCanvas(elem); + + this._top = this._offsets.top; + this._bottom = h - this._offsets.bottom; + this._left = this._offsets.left; + this._right = w - this._offsets.right; + this._width = this._right - this._left; + this._height = this._bottom - this._top; + // avoid memory leak + elem = null; + return this._elem; + }; + + $.jqplot.CanvasGridRenderer.prototype.draw = function() { + this._ctx = this._elem.get(0).getContext("2d"); + var ctx = this._ctx; + var axes = this._axes; + // Add the grid onto the grid canvas. This is the bottom most layer. + ctx.save(); + ctx.clearRect(0, 0, this._plotDimensions.width, this._plotDimensions.height); + ctx.fillStyle = this.backgroundColor || this.background; + ctx.fillRect(this._left, this._top, this._width, this._height); + + ctx.save(); + ctx.lineJoin = 'miter'; + ctx.lineCap = 'butt'; + ctx.lineWidth = this.gridLineWidth; + ctx.strokeStyle = this.gridLineColor; + var b, e, s, m; + var ax = ['xaxis', 'yaxis', 'x2axis', 'y2axis']; + for (var i=4; i>0; i--) { + var name = ax[i-1]; + var axis = axes[name]; + var ticks = axis._ticks; + var numticks = ticks.length; + if (axis.show) { + if (axis.drawBaseline) { + var bopts = {}; + if (axis.baselineWidth !== null) { + bopts.lineWidth = axis.baselineWidth; + } + if (axis.baselineColor !== null) { + bopts.strokeStyle = axis.baselineColor; + } + switch (name) { + case 'xaxis': + drawLine (this._left, this._bottom, this._right, this._bottom, bopts); + break; + case 'yaxis': + drawLine (this._left, this._bottom, this._left, this._top, bopts); + break; + case 'x2axis': + drawLine (this._left, this._bottom, this._right, this._bottom, bopts); + break; + case 'y2axis': + drawLine (this._right, this._bottom, this._right, this._top, bopts); + break; + } + } + for (var j=numticks; j>0; j--) { + var t = ticks[j-1]; + if (t.show) { + var pos = Math.round(axis.u2p(t.value)) + 0.5; + switch (name) { + case 'xaxis': + // draw the grid line if we should + if (t.showGridline && this.drawGridlines && ((!t.isMinorTick && axis.drawMajorGridlines) || (t.isMinorTick && axis.drawMinorGridlines)) ) { + drawLine(pos, this._top, pos, this._bottom); + } + // draw the mark + if (t.showMark && t.mark && ((!t.isMinorTick && axis.drawMajorTickMarks) || (t.isMinorTick && axis.drawMinorTickMarks)) ) { + s = t.markSize; + m = t.mark; + var pos = Math.round(axis.u2p(t.value)) + 0.5; + switch (m) { + case 'outside': + b = this._bottom; + e = this._bottom+s; + break; + case 'inside': + b = this._bottom-s; + e = this._bottom; + break; + case 'cross': + b = this._bottom-s; + e = this._bottom+s; + break; + default: + b = this._bottom; + e = this._bottom+s; + break; + } + // draw the shadow + if (this.shadow) { + this.renderer.shadowRenderer.draw(ctx, [[pos,b],[pos,e]], {lineCap:'butt', lineWidth:this.gridLineWidth, offset:this.gridLineWidth*0.75, depth:2, fill:false, closePath:false}); + } + // draw the line + drawLine(pos, b, pos, e); + } + break; + case 'yaxis': + // draw the grid line + if (t.showGridline && this.drawGridlines && ((!t.isMinorTick && axis.drawMajorGridlines) || (t.isMinorTick && axis.drawMinorGridlines)) ) { + drawLine(this._right, pos, this._left, pos); + } + // draw the mark + if (t.showMark && t.mark && ((!t.isMinorTick && axis.drawMajorTickMarks) || (t.isMinorTick && axis.drawMinorTickMarks)) ) { + s = t.markSize; + m = t.mark; + var pos = Math.round(axis.u2p(t.value)) + 0.5; + switch (m) { + case 'outside': + b = this._left-s; + e = this._left; + break; + case 'inside': + b = this._left; + e = this._left+s; + break; + case 'cross': + b = this._left-s; + e = this._left+s; + break; + default: + b = this._left-s; + e = this._left; + break; + } + // draw the shadow + if (this.shadow) { + this.renderer.shadowRenderer.draw(ctx, [[b, pos], [e, pos]], {lineCap:'butt', lineWidth:this.gridLineWidth*1.5, offset:this.gridLineWidth*0.75, fill:false, closePath:false}); + } + drawLine(b, pos, e, pos, {strokeStyle:axis.borderColor}); + } + break; + case 'x2axis': + // draw the grid line + if (t.showGridline && this.drawGridlines && ((!t.isMinorTick && axis.drawMajorGridlines) || (t.isMinorTick && axis.drawMinorGridlines)) ) { + drawLine(pos, this._bottom, pos, this._top); + } + // draw the mark + if (t.showMark && t.mark && ((!t.isMinorTick && axis.drawMajorTickMarks) || (t.isMinorTick && axis.drawMinorTickMarks)) ) { + s = t.markSize; + m = t.mark; + var pos = Math.round(axis.u2p(t.value)) + 0.5; + switch (m) { + case 'outside': + b = this._top-s; + e = this._top; + break; + case 'inside': + b = this._top; + e = this._top+s; + break; + case 'cross': + b = this._top-s; + e = this._top+s; + break; + default: + b = this._top-s; + e = this._top; + break; + } + // draw the shadow + if (this.shadow) { + this.renderer.shadowRenderer.draw(ctx, [[pos,b],[pos,e]], {lineCap:'butt', lineWidth:this.gridLineWidth, offset:this.gridLineWidth*0.75, depth:2, fill:false, closePath:false}); + } + drawLine(pos, b, pos, e); + } + break; + case 'y2axis': + // draw the grid line + if (t.showGridline && this.drawGridlines && ((!t.isMinorTick && axis.drawMajorGridlines) || (t.isMinorTick && axis.drawMinorGridlines)) ) { + drawLine(this._left, pos, this._right, pos); + } + // draw the mark + if (t.showMark && t.mark && ((!t.isMinorTick && axis.drawMajorTickMarks) || (t.isMinorTick && axis.drawMinorTickMarks)) ) { + s = t.markSize; + m = t.mark; + var pos = Math.round(axis.u2p(t.value)) + 0.5; + switch (m) { + case 'outside': + b = this._right; + e = this._right+s; + break; + case 'inside': + b = this._right-s; + e = this._right; + break; + case 'cross': + b = this._right-s; + e = this._right+s; + break; + default: + b = this._right; + e = this._right+s; + break; + } + // draw the shadow + if (this.shadow) { + this.renderer.shadowRenderer.draw(ctx, [[b, pos], [e, pos]], {lineCap:'butt', lineWidth:this.gridLineWidth*1.5, offset:this.gridLineWidth*0.75, fill:false, closePath:false}); + } + drawLine(b, pos, e, pos, {strokeStyle:axis.borderColor}); + } + break; + default: + break; + } + } + } + t = null; + } + axis = null; + ticks = null; + } + // Now draw grid lines for additional y axes + ////// + // TO DO: handle yMidAxis + ////// + ax = ['y3axis', 'y4axis', 'y5axis', 'y6axis', 'y7axis', 'y8axis', 'y9axis', 'yMidAxis']; + for (var i=7; i>0; i--) { + var axis = axes[ax[i-1]]; + var ticks = axis._ticks; + if (axis.show) { + var tn = ticks[axis.numberTicks-1]; + var t0 = ticks[0]; + var left = axis.getLeft(); + var points = [[left, tn.getTop() + tn.getHeight()/2], [left, t0.getTop() + t0.getHeight()/2 + 1.0]]; + // draw the shadow + if (this.shadow) { + this.renderer.shadowRenderer.draw(ctx, points, {lineCap:'butt', fill:false, closePath:false}); + } + // draw the line + drawLine(points[0][0], points[0][1], points[1][0], points[1][1], {lineCap:'butt', strokeStyle:axis.borderColor, lineWidth:axis.borderWidth}); + // draw the tick marks + for (var j=ticks.length; j>0; j--) { + var t = ticks[j-1]; + s = t.markSize; + m = t.mark; + var pos = Math.round(axis.u2p(t.value)) + 0.5; + if (t.showMark && t.mark) { + switch (m) { + case 'outside': + b = left; + e = left+s; + break; + case 'inside': + b = left-s; + e = left; + break; + case 'cross': + b = left-s; + e = left+s; + break; + default: + b = left; + e = left+s; + break; + } + points = [[b,pos], [e,pos]]; + // draw the shadow + if (this.shadow) { + this.renderer.shadowRenderer.draw(ctx, points, {lineCap:'butt', lineWidth:this.gridLineWidth*1.5, offset:this.gridLineWidth*0.75, fill:false, closePath:false}); + } + // draw the line + drawLine(b, pos, e, pos, {strokeStyle:axis.borderColor}); + } + t = null; + } + t0 = null; + } + axis = null; + ticks = null; + } + + ctx.restore(); + + function drawLine(bx, by, ex, ey, opts) { + ctx.save(); + opts = opts || {}; + if (opts.lineWidth == null || opts.lineWidth != 0){ + $.extend(true, ctx, opts); + ctx.beginPath(); + ctx.moveTo(bx, by); + ctx.lineTo(ex, ey); + ctx.stroke(); + ctx.restore(); + } + } + + if (this.shadow) { + var points = [[this._left, this._bottom], [this._right, this._bottom], [this._right, this._top]]; + this.renderer.shadowRenderer.draw(ctx, points); + } + // Now draw border around grid. Use axis border definitions. start at + // upper left and go clockwise. + if (this.borderWidth != 0 && this.drawBorder) { + drawLine (this._left, this._top, this._right, this._top, {lineCap:'round', strokeStyle:axes.x2axis.borderColor, lineWidth:axes.x2axis.borderWidth}); + drawLine (this._right, this._top, this._right, this._bottom, {lineCap:'round', strokeStyle:axes.y2axis.borderColor, lineWidth:axes.y2axis.borderWidth}); + drawLine (this._right, this._bottom, this._left, this._bottom, {lineCap:'round', strokeStyle:axes.xaxis.borderColor, lineWidth:axes.xaxis.borderWidth}); + drawLine (this._left, this._bottom, this._left, this._top, {lineCap:'round', strokeStyle:axes.yaxis.borderColor, lineWidth:axes.yaxis.borderWidth}); + } + // ctx.lineWidth = this.borderWidth; + // ctx.strokeStyle = this.borderColor; + // ctx.strokeRect(this._left, this._top, this._width, this._height); + + ctx.restore(); + ctx = null; + axes = null; + }; + + // Class: $.jqplot.DivTitleRenderer + // The default title renderer for jqPlot. This class has no options beyond the <Title> class. + $.jqplot.DivTitleRenderer = function() { + }; + + $.jqplot.DivTitleRenderer.prototype.init = function(options) { + $.extend(true, this, options); + }; + + $.jqplot.DivTitleRenderer.prototype.draw = function() { + // Memory Leaks patch + if (this._elem) { + this._elem.emptyForce(); + this._elem = null; + } + + var r = this.renderer; + var elem = document.createElement('div'); + this._elem = $(elem); + this._elem.addClass('jqplot-title'); + + if (!this.text) { + this.show = false; + this._elem.height(0); + this._elem.width(0); + } + else if (this.text) { + var color; + if (this.color) { + color = this.color; + } + else if (this.textColor) { + color = this.textColor; + } + + // don't trust that a stylesheet is present, set the position. + var styles = {position:'absolute', top:'0px', left:'0px'}; + + if (this._plotWidth) { + styles['width'] = this._plotWidth+'px'; + } + if (this.fontSize) { + styles['fontSize'] = this.fontSize; + } + if (typeof this.textAlign === 'string') { + styles['textAlign'] = this.textAlign; + } + else { + styles['textAlign'] = 'center'; + } + if (color) { + styles['color'] = color; + } + if (this.paddingBottom) { + styles['paddingBottom'] = this.paddingBottom; + } + if (this.fontFamily) { + styles['fontFamily'] = this.fontFamily; + } + + this._elem.css(styles); + if (this.escapeHtml) { + this._elem.text(this.text); + } + else { + this._elem.html(this.text); + } + + + // styletext += (this._plotWidth) ? 'width:'+this._plotWidth+'px;' : ''; + // styletext += (this.fontSize) ? 'font-size:'+this.fontSize+';' : ''; + // styletext += (this.textAlign) ? 'text-align:'+this.textAlign+';' : 'text-align:center;'; + // styletext += (color) ? 'color:'+color+';' : ''; + // styletext += (this.paddingBottom) ? 'padding-bottom:'+this.paddingBottom+';' : ''; + // this._elem = $('<div class="jqplot-title" style="'+styletext+'">'+this.text+'</div>'); + // if (this.fontFamily) { + // this._elem.css('font-family', this.fontFamily); + // } + } + + elem = null; + + return this._elem; + }; + + $.jqplot.DivTitleRenderer.prototype.pack = function() { + // nothing to do here + }; + + + var dotlen = 0.1; + + $.jqplot.LinePattern = function (ctx, pattern) { + + var defaultLinePatterns = { + dotted: [ dotlen, $.jqplot.config.dotGapLength ], + dashed: [ $.jqplot.config.dashLength, $.jqplot.config.gapLength ], + solid: null + }; + + if (typeof pattern === 'string') { + if (pattern[0] === '.' || pattern[0] === '-') { + var s = pattern; + pattern = []; + for (var i=0, imax=s.length; i<imax; i++) { + if (s[i] === '.') { + pattern.push( dotlen ); + } + else if (s[i] === '-') { + pattern.push( $.jqplot.config.dashLength ); + } + else { + continue; + } + pattern.push( $.jqplot.config.gapLength ); + } + } + else { + pattern = defaultLinePatterns[pattern]; + } + } + + if (!(pattern && pattern.length)) { + return ctx; + } + + var patternIndex = 0; + var patternDistance = pattern[0]; + var px = 0; + var py = 0; + var pathx0 = 0; + var pathy0 = 0; + + var moveTo = function (x, y) { + ctx.moveTo( x, y ); + px = x; + py = y; + pathx0 = x; + pathy0 = y; + }; + + var lineTo = function (x, y) { + var scale = ctx.lineWidth; + var dx = x - px; + var dy = y - py; + var dist = Math.sqrt(dx*dx+dy*dy); + if ((dist > 0) && (scale > 0)) { + dx /= dist; + dy /= dist; + while (true) { + var dp = scale * patternDistance; + if (dp < dist) { + px += dp * dx; + py += dp * dy; + if ((patternIndex & 1) == 0) { + ctx.lineTo( px, py ); + } + else { + ctx.moveTo( px, py ); + } + dist -= dp; + patternIndex++; + if (patternIndex >= pattern.length) { + patternIndex = 0; + } + patternDistance = pattern[patternIndex]; + } + else { + px = x; + py = y; + if ((patternIndex & 1) == 0) { + ctx.lineTo( px, py ); + } + else { + ctx.moveTo( px, py ); + } + patternDistance -= dist / scale; + break; + } + } + } + }; + + var beginPath = function () { + ctx.beginPath(); + }; + + var closePath = function () { + lineTo( pathx0, pathy0 ); + }; + + return { + moveTo: moveTo, + lineTo: lineTo, + beginPath: beginPath, + closePath: closePath + }; + }; + + // Class: $.jqplot.LineRenderer + // The default line renderer for jqPlot, this class has no options beyond the <Series> class. + // Draws series as a line. + $.jqplot.LineRenderer = function(){ + this.shapeRenderer = new $.jqplot.ShapeRenderer(); + this.shadowRenderer = new $.jqplot.ShadowRenderer(); + }; + + // called with scope of series. + $.jqplot.LineRenderer.prototype.init = function(options, plot) { + // Group: Properties + // + options = options || {}; + this._type='line'; + this.renderer.animation = { + show: false, + direction: 'left', + speed: 2500, + _supported: true + }; + // prop: smooth + // True to draw a smoothed (interpolated) line through the data points + // with automatically computed number of smoothing points. + // Set to an integer number > 2 to specify number of smoothing points + // to use between each data point. + this.renderer.smooth = false; // true or a number > 2 for smoothing. + this.renderer.tension = null; // null to auto compute or a number typically > 6. Fewer points requires higher tension. + // prop: constrainSmoothing + // True to use a more accurate smoothing algorithm that will + // not overshoot any data points. False to allow overshoot but + // produce a smoother looking line. + this.renderer.constrainSmoothing = true; + // this is smoothed data in grid coordinates, like gridData + this.renderer._smoothedData = []; + // this is smoothed data in plot units (plot coordinates), like plotData. + this.renderer._smoothedPlotData = []; + this.renderer._hiBandGridData = []; + this.renderer._lowBandGridData = []; + this.renderer._hiBandSmoothedData = []; + this.renderer._lowBandSmoothedData = []; + + // prop: bandData + // Data used to draw error bands or confidence intervals above/below a line. + // + // bandData can be input in 3 forms. jqPlot will figure out which is the + // low band line and which is the high band line for all forms: + // + // A 2 dimensional array like [[yl1, yl2, ...], [yu1, yu2, ...]] where + // [yl1, yl2, ...] are y values of the lower line and + // [yu1, yu2, ...] are y values of the upper line. + // In this case there must be the same number of y data points as data points + // in the series and the bands will inherit the x values of the series. + // + // A 2 dimensional array like [[[xl1, yl1], [xl2, yl2], ...], [[xh1, yh1], [xh2, yh2], ...]] + // where [xl1, yl1] are x,y data points for the lower line and + // [xh1, yh1] are x,y data points for the high line. + // x values do not have to correspond to the x values of the series and can + // be of any arbitrary length. + // + // Can be of form [[yl1, yu1], [yl2, yu2], [yl3, yu3], ...] where + // there must be 3 or more arrays and there must be the same number of arrays + // as there are data points in the series. In this case, + // [yl1, yu1] specifies the lower and upper y values for the 1st + // data point and so on. The bands will inherit the x + // values from the series. + this.renderer.bandData = []; + + // Group: bands + // Banding around line, e.g error bands or confidence intervals. + this.renderer.bands = { + // prop: show + // true to show the bands. If bandData or interval is + // supplied, show will be set to true by default. + show: false, + hiData: [], + lowData: [], + // prop: color + // color of lines at top and bottom of bands [default: series color]. + color: this.color, + // prop: showLines + // True to show lines at top and bottom of bands [default: false]. + showLines: false, + // prop: fill + // True to fill area between bands [default: true]. + fill: true, + // prop: fillColor + // css color spec for filled area. [default: series color]. + fillColor: null, + _min: null, + _max: null, + // prop: interval + // User specified interval above and below line for bands [default: '3%'']. + // Can be a value like 3 or a string like '3%' + // or an upper/lower array like [1, -2] or ['2%', '-1.5%'] + interval: '3%' + }; + + + var lopts = {highlightMouseOver: options.highlightMouseOver, highlightMouseDown: options.highlightMouseDown, highlightColor: options.highlightColor}; + + delete (options.highlightMouseOver); + delete (options.highlightMouseDown); + delete (options.highlightColor); + + $.extend(true, this.renderer, options); + + this.renderer.options = options; + + // if we are given some band data, and bands aren't explicity set to false in options, turn them on. + if (this.renderer.bandData.length > 1 && (!options.bands || options.bands.show == null)) { + this.renderer.bands.show = true; + } + + // if we are given an interval, and bands aren't explicity set to false in options, turn them on. + else if (options.bands && options.bands.show == null && options.bands.interval != null) { + this.renderer.bands.show = true; + } + + // if plot is filled, turn off bands. + if (this.fill) { + this.renderer.bands.show = false; + } + + if (this.renderer.bands.show) { + this.renderer.initBands.call(this, this.renderer.options, plot); + } + + + // smoothing is not compatible with stacked lines, disable + if (this._stack) { + this.renderer.smooth = false; + } + + // set the shape renderer options + var opts = {lineJoin:this.lineJoin, lineCap:this.lineCap, fill:this.fill, isarc:false, strokeStyle:this.color, fillStyle:this.fillColor, lineWidth:this.lineWidth, linePattern:this.linePattern, closePath:this.fill}; + this.renderer.shapeRenderer.init(opts); + + var shadow_offset = options.shadowOffset; + // set the shadow renderer options + if (shadow_offset == null) { + // scale the shadowOffset to the width of the line. + if (this.lineWidth > 2.5) { + shadow_offset = 1.25 * (1 + (Math.atan((this.lineWidth/2.5))/0.785398163 - 1)*0.6); + // var shadow_offset = this.shadowOffset; + } + // for skinny lines, don't make such a big shadow. + else { + shadow_offset = 1.25 * Math.atan((this.lineWidth/2.5))/0.785398163; + } + } + + var sopts = {lineJoin:this.lineJoin, lineCap:this.lineCap, fill:this.fill, isarc:false, angle:this.shadowAngle, offset:shadow_offset, alpha:this.shadowAlpha, depth:this.shadowDepth, lineWidth:this.lineWidth, linePattern:this.linePattern, closePath:this.fill}; + this.renderer.shadowRenderer.init(sopts); + this._areaPoints = []; + this._boundingBox = [[],[]]; + + if (!this.isTrendline && this.fill || this.renderer.bands.show) { + // Group: Properties + // + // prop: highlightMouseOver + // True to highlight area on a filled plot when moused over. + // This must be false to enable highlightMouseDown to highlight when clicking on an area on a filled plot. + this.highlightMouseOver = true; + // prop: highlightMouseDown + // True to highlight when a mouse button is pressed over an area on a filled plot. + // This will be disabled if highlightMouseOver is true. + this.highlightMouseDown = false; + // prop: highlightColor + // color to use when highlighting an area on a filled plot. + this.highlightColor = null; + // if user has passed in highlightMouseDown option and not set highlightMouseOver, disable highlightMouseOver + if (lopts.highlightMouseDown && lopts.highlightMouseOver == null) { + lopts.highlightMouseOver = false; + } + + $.extend(true, this, {highlightMouseOver: lopts.highlightMouseOver, highlightMouseDown: lopts.highlightMouseDown, highlightColor: lopts.highlightColor}); + + if (!this.highlightColor) { + var fc = (this.renderer.bands.show) ? this.renderer.bands.fillColor : this.fillColor; + this.highlightColor = $.jqplot.computeHighlightColors(fc); + } + // turn off (disable) the highlighter plugin + if (this.highlighter) { + this.highlighter.show = false; + } + } + + if (!this.isTrendline && plot) { + plot.plugins.lineRenderer = {}; + plot.postInitHooks.addOnce(postInit); + plot.postDrawHooks.addOnce(postPlotDraw); + plot.eventListenerHooks.addOnce('jqplotMouseMove', handleMove); + plot.eventListenerHooks.addOnce('jqplotMouseDown', handleMouseDown); + plot.eventListenerHooks.addOnce('jqplotMouseUp', handleMouseUp); + plot.eventListenerHooks.addOnce('jqplotClick', handleClick); + plot.eventListenerHooks.addOnce('jqplotRightClick', handleRightClick); + } + + }; + + $.jqplot.LineRenderer.prototype.initBands = function(options, plot) { + // use bandData if no data specified in bands option + //var bd = this.renderer.bandData; + var bd = options.bandData || []; + var bands = this.renderer.bands; + bands.hiData = []; + bands.lowData = []; + var data = this.data; + bands._max = null; + bands._min = null; + // If 2 arrays, and each array greater than 2 elements, assume it is hi and low data bands of y values. + if (bd.length == 2) { + // Do we have an array of x,y values? + // like [[[1,1], [2,4], [3,3]], [[1,3], [2,6], [3,5]]] + if ($.isArray(bd[0][0])) { + // since an arbitrary array of points, spin through all of them to determine max and min lines. + + var p; + var bdminidx = 0, bdmaxidx = 0; + for (var i = 0, l = bd[0].length; i<l; i++) { + p = bd[0][i]; + if ((p[1] != null && p[1] > bands._max) || bands._max == null) { + bands._max = p[1]; + } + if ((p[1] != null && p[1] < bands._min) || bands._min == null) { + bands._min = p[1]; + } + } + for (var i = 0, l = bd[1].length; i<l; i++) { + p = bd[1][i]; + if ((p[1] != null && p[1] > bands._max) || bands._max == null) { + bands._max = p[1]; + bdmaxidx = 1; + } + if ((p[1] != null && p[1] < bands._min) || bands._min == null) { + bands._min = p[1]; + bdminidx = 1; + } + } + + if (bdmaxidx === bdminidx) { + bands.show = false; + } + + bands.hiData = bd[bdmaxidx]; + bands.lowData = bd[bdminidx]; + } + // else data is arrays of y values + // like [[1,4,3], [3,6,5]] + // must have same number of band data points as points in series + else if (bd[0].length === data.length && bd[1].length === data.length) { + var hi = (bd[0][0] > bd[1][0]) ? 0 : 1; + var low = (hi) ? 0 : 1; + for (var i=0, l=data.length; i < l; i++) { + bands.hiData.push([data[i][0], bd[hi][i]]); + bands.lowData.push([data[i][0], bd[low][i]]); + } + } + + // we don't have proper data array, don't show bands. + else { + bands.show = false; + } + } + + // if more than 2 arrays, have arrays of [ylow, yhi] values. + // note, can't distinguish case of [[ylow, yhi], [ylow, yhi]] from [[ylow, ylow], [yhi, yhi]] + // this is assumed to be of the latter form. + else if (bd.length > 2 && !$.isArray(bd[0][0])) { + var hi = (bd[0][0] > bd[0][1]) ? 0 : 1; + var low = (hi) ? 0 : 1; + for (var i=0, l=bd.length; i<l; i++) { + bands.hiData.push([data[i][0], bd[i][hi]]); + bands.lowData.push([data[i][0], bd[i][low]]); + } + } + + // don't have proper data, auto calculate + else { + var intrv = bands.interval; + var a = null; + var b = null; + var afunc = null; + var bfunc = null; + + if ($.isArray(intrv)) { + a = intrv[0]; + b = intrv[1]; + } + else { + a = intrv; + } + + if (isNaN(a)) { + // we have a string + if (a.charAt(a.length - 1) === '%') { + afunc = 'multiply'; + a = parseFloat(a)/100 + 1; + } + } + + else { + a = parseFloat(a); + afunc = 'add'; + } + + if (b !== null && isNaN(b)) { + // we have a string + if (b.charAt(b.length - 1) === '%') { + bfunc = 'multiply'; + b = parseFloat(b)/100 + 1; + } + } + + else if (b !== null) { + b = parseFloat(b); + bfunc = 'add'; + } + + if (a !== null) { + if (b === null) { + b = -a; + bfunc = afunc; + if (bfunc === 'multiply') { + b += 2; + } + } + + // make sure a always applies to hi band. + if (a < b) { + var temp = a; + a = b; + b = temp; + temp = afunc; + afunc = bfunc; + bfunc = temp; + } + + for (var i=0, l = data.length; i < l; i++) { + switch (afunc) { + case 'add': + bands.hiData.push([data[i][0], data[i][1] + a]); + break; + case 'multiply': + bands.hiData.push([data[i][0], data[i][1] * a]); + break; + } + switch (bfunc) { + case 'add': + bands.lowData.push([data[i][0], data[i][1] + b]); + break; + case 'multiply': + bands.lowData.push([data[i][0], data[i][1] * b]); + break; + } + } + } + + else { + bands.show = false; + } + } + + var hd = bands.hiData; + var ld = bands.lowData; + for (var i = 0, l = hd.length; i<l; i++) { + if ((hd[i][1] != null && hd[i][1] > bands._max) || bands._max == null) { + bands._max = hd[i][1]; + } + } + for (var i = 0, l = ld.length; i<l; i++) { + if ((ld[i][1] != null && ld[i][1] < bands._min) || bands._min == null) { + bands._min = ld[i][1]; + } + } + + // one last check for proper data + // these don't apply any more since allowing arbitrary x,y values + // if (bands.hiData.length != bands.lowData.length) { + // bands.show = false; + // } + + // if (bands.hiData.length != this.data.length) { + // bands.show = false; + // } + + if (bands.fillColor === null) { + var c = $.jqplot.getColorComponents(bands.color); + // now adjust alpha to differentiate fill + c[3] = c[3] * 0.5; + bands.fillColor = 'rgba(' + c[0] +', '+ c[1] +', '+ c[2] +', '+ c[3] + ')'; + } + }; + + function getSteps (d, f) { + return (3.4182054+f) * Math.pow(d, -0.3534992); + } + + function computeSteps (d1, d2) { + var s = Math.sqrt(Math.pow((d2[0]- d1[0]), 2) + Math.pow ((d2[1] - d1[1]), 2)); + return 5.7648 * Math.log(s) + 7.4456; + } + + function tanh (x) { + var a = (Math.exp(2*x) - 1) / (Math.exp(2*x) + 1); + return a; + } + + ////////// + // computeConstrainedSmoothedData + // An implementation of the constrained cubic spline interpolation + // method as presented in: + // + // Kruger, CJC, Constrained Cubic Spine Interpolation for Chemical Engineering Applications + // http://www.korf.co.uk/spline.pdf + // + // The implementation below borrows heavily from the sample Visual Basic + // implementation by CJC Kruger found in http://www.korf.co.uk/spline.xls + // + ///////// + + // called with scope of series + function computeConstrainedSmoothedData (gd) { + var smooth = this.renderer.smooth; + var dim = this.canvas.getWidth(); + var xp = this._xaxis.series_p2u; + var yp = this._yaxis.series_p2u; + var steps =null; + var _steps = null; + var dist = gd.length/dim; + var _smoothedData = []; + var _smoothedPlotData = []; + + if (!isNaN(parseFloat(smooth))) { + steps = parseFloat(smooth); + } + else { + steps = getSteps(dist, 0.5); + } + + var yy = []; + var xx = []; + + for (var i=0, l = gd.length; i<l; i++) { + yy.push(gd[i][1]); + xx.push(gd[i][0]); + } + + function dxx(x1, x0) { + if (x1 - x0 == 0) { + return Math.pow(10,10); + } + else { + return x1 - x0; + } + } + + var A, B, C, D; + // loop through each line segment. Have # points - 1 line segments. Nmber segments starting at 1. + var nmax = gd.length - 1; + for (var num = 1, gdl = gd.length; num<gdl; num++) { + var gxx = []; + var ggxx = []; + // point at each end of segment. + for (var j = 0; j < 2; j++) { + var i = num - 1 + j; // point number, 0 to # points. + + if (i == 0 || i == nmax) { + gxx[j] = Math.pow(10, 10); + } + else if (yy[i+1] - yy[i] == 0 || yy[i] - yy[i-1] == 0) { + gxx[j] = 0; + } + else if (((xx[i+1] - xx[i]) / (yy[i+1] - yy[i]) + (xx[i] - xx[i-1]) / (yy[i] - yy[i-1])) == 0 ) { + gxx[j] = 0; + } + else if ( (yy[i+1] - yy[i]) * (yy[i] - yy[i-1]) < 0 ) { + gxx[j] = 0; + } + + else { + gxx[j] = 2 / (dxx(xx[i + 1], xx[i]) / (yy[i + 1] - yy[i]) + dxx(xx[i], xx[i - 1]) / (yy[i] - yy[i - 1])); + } + } + + // Reset first derivative (slope) at first and last point + if (num == 1) { + // First point has 0 2nd derivative + gxx[0] = 3 / 2 * (yy[1] - yy[0]) / dxx(xx[1], xx[0]) - gxx[1] / 2; + } + else if (num == nmax) { + // Last point has 0 2nd derivative + gxx[1] = 3 / 2 * (yy[nmax] - yy[nmax - 1]) / dxx(xx[nmax], xx[nmax - 1]) - gxx[0] / 2; + } + + // Calc second derivative at points + ggxx[0] = -2 * (gxx[1] + 2 * gxx[0]) / dxx(xx[num], xx[num - 1]) + 6 * (yy[num] - yy[num - 1]) / Math.pow(dxx(xx[num], xx[num - 1]), 2); + ggxx[1] = 2 * (2 * gxx[1] + gxx[0]) / dxx(xx[num], xx[num - 1]) - 6 * (yy[num] - yy[num - 1]) / Math.pow(dxx(xx[num], xx[num - 1]), 2); + + // Calc constants for cubic interpolation + D = 1 / 6 * (ggxx[1] - ggxx[0]) / dxx(xx[num], xx[num - 1]); + C = 1 / 2 * (xx[num] * ggxx[0] - xx[num - 1] * ggxx[1]) / dxx(xx[num], xx[num - 1]); + B = (yy[num] - yy[num - 1] - C * (Math.pow(xx[num], 2) - Math.pow(xx[num - 1], 2)) - D * (Math.pow(xx[num], 3) - Math.pow(xx[num - 1], 3))) / dxx(xx[num], xx[num - 1]); + A = yy[num - 1] - B * xx[num - 1] - C * Math.pow(xx[num - 1], 2) - D * Math.pow(xx[num - 1], 3); + + var increment = (xx[num] - xx[num - 1]) / steps; + var temp, tempx; + + for (var j = 0, l = steps; j < l; j++) { + temp = []; + tempx = xx[num - 1] + j * increment; + temp.push(tempx); + temp.push(A + B * tempx + C * Math.pow(tempx, 2) + D * Math.pow(tempx, 3)); + _smoothedData.push(temp); + _smoothedPlotData.push([xp(temp[0]), yp(temp[1])]); + } + } + + _smoothedData.push(gd[i]); + _smoothedPlotData.push([xp(gd[i][0]), yp(gd[i][1])]); + + return [_smoothedData, _smoothedPlotData]; + } + + /////// + // computeHermiteSmoothedData + // A hermite spline smoothing of the plot data. + // This implementation is derived from the one posted + // by krypin on the jqplot-users mailing list: + // + // http://groups.google.com/group/jqplot-users/browse_thread/thread/748be6a445723cea?pli=1 + // + // with a blog post: + // + // http://blog.statscollector.com/a-plugin-renderer-for-jqplot-to-draw-a-hermite-spline/ + // + // and download of the original plugin: + // + // http://blog.statscollector.com/wp-content/uploads/2010/02/jqplot.hermiteSplineRenderer.js + ////////// + + // called with scope of series + function computeHermiteSmoothedData (gd) { + var smooth = this.renderer.smooth; + var tension = this.renderer.tension; + var dim = this.canvas.getWidth(); + var xp = this._xaxis.series_p2u; + var yp = this._yaxis.series_p2u; + var steps =null; + var _steps = null; + var a = null; + var a1 = null; + var a2 = null; + var slope = null; + var slope2 = null; + var temp = null; + var t, s, h1, h2, h3, h4; + var TiX, TiY, Ti1X, Ti1Y; + var pX, pY, p; + var sd = []; + var spd = []; + var dist = gd.length/dim; + var min, max, stretch, scale, shift; + var _smoothedData = []; + var _smoothedPlotData = []; + if (!isNaN(parseFloat(smooth))) { + steps = parseFloat(smooth); + } + else { + steps = getSteps(dist, 0.5); + } + if (!isNaN(parseFloat(tension))) { + tension = parseFloat(tension); + } + + for (var i=0, l = gd.length-1; i < l; i++) { + + if (tension === null) { + slope = Math.abs((gd[i+1][1] - gd[i][1]) / (gd[i+1][0] - gd[i][0])); + + min = 0.3; + max = 0.6; + stretch = (max - min)/2.0; + scale = 2.5; + shift = -1.4; + + temp = slope/scale + shift; + + a1 = stretch * tanh(temp) - stretch * tanh(shift) + min; + + // if have both left and right line segments, will use minimum tension. + if (i > 0) { + slope2 = Math.abs((gd[i][1] - gd[i-1][1]) / (gd[i][0] - gd[i-1][0])); + } + temp = slope2/scale + shift; + + a2 = stretch * tanh(temp) - stretch * tanh(shift) + min; + + a = (a1 + a2)/2.0; + + } + else { + a = tension; + } + for (t=0; t < steps; t++) { + s = t / steps; + h1 = (1 + 2*s)*Math.pow((1-s),2); + h2 = s*Math.pow((1-s),2); + h3 = Math.pow(s,2)*(3-2*s); + h4 = Math.pow(s,2)*(s-1); + + if (gd[i-1]) { + TiX = a * (gd[i+1][0] - gd[i-1][0]); + TiY = a * (gd[i+1][1] - gd[i-1][1]); + } else { + TiX = a * (gd[i+1][0] - gd[i][0]); + TiY = a * (gd[i+1][1] - gd[i][1]); + } + if (gd[i+2]) { + Ti1X = a * (gd[i+2][0] - gd[i][0]); + Ti1Y = a * (gd[i+2][1] - gd[i][1]); + } else { + Ti1X = a * (gd[i+1][0] - gd[i][0]); + Ti1Y = a * (gd[i+1][1] - gd[i][1]); + } + + pX = h1*gd[i][0] + h3*gd[i+1][0] + h2*TiX + h4*Ti1X; + pY = h1*gd[i][1] + h3*gd[i+1][1] + h2*TiY + h4*Ti1Y; + p = [pX, pY]; + + _smoothedData.push(p); + _smoothedPlotData.push([xp(pX), yp(pY)]); + } + } + _smoothedData.push(gd[l]); + _smoothedPlotData.push([xp(gd[l][0]), yp(gd[l][1])]); + + return [_smoothedData, _smoothedPlotData]; + } + + // setGridData + // converts the user data values to grid coordinates and stores them + // in the gridData array. + // Called with scope of a series. + $.jqplot.LineRenderer.prototype.setGridData = function(plot) { + // recalculate the grid data + var xp = this._xaxis.series_u2p; + var yp = this._yaxis.series_u2p; + var data = this._plotData; + var pdata = this._prevPlotData; + this.gridData = []; + this._prevGridData = []; + this.renderer._smoothedData = []; + this.renderer._smoothedPlotData = []; + this.renderer._hiBandGridData = []; + this.renderer._lowBandGridData = []; + this.renderer._hiBandSmoothedData = []; + this.renderer._lowBandSmoothedData = []; + var bands = this.renderer.bands; + var hasNull = false; + for (var i=0, l=this.data.length; i < l; i++) { + // if not a line series or if no nulls in data, push the converted point onto the array. + if (data[i][0] != null && data[i][1] != null) { + this.gridData.push([xp.call(this._xaxis, data[i][0]), yp.call(this._yaxis, data[i][1])]); + } + // else if there is a null, preserve it. + else if (data[i][0] == null) { + hasNull = true; + this.gridData.push([null, yp.call(this._yaxis, data[i][1])]); + } + else if (data[i][1] == null) { + hasNull = true; + this.gridData.push([xp.call(this._xaxis, data[i][0]), null]); + } + // if not a line series or if no nulls in data, push the converted point onto the array. + if (pdata[i] != null && pdata[i][0] != null && pdata[i][1] != null) { + this._prevGridData.push([xp.call(this._xaxis, pdata[i][0]), yp.call(this._yaxis, pdata[i][1])]); + } + // else if there is a null, preserve it. + else if (pdata[i] != null && pdata[i][0] == null) { + this._prevGridData.push([null, yp.call(this._yaxis, pdata[i][1])]); + } + else if (pdata[i] != null && pdata[i][0] != null && pdata[i][1] == null) { + this._prevGridData.push([xp.call(this._xaxis, pdata[i][0]), null]); + } + } + + // don't do smoothing or bands on broken lines. + if (hasNull) { + this.renderer.smooth = false; + if (this._type === 'line') { + bands.show = false; + } + } + + if (this._type === 'line' && bands.show) { + for (var i=0, l=bands.hiData.length; i<l; i++) { + this.renderer._hiBandGridData.push([xp.call(this._xaxis, bands.hiData[i][0]), yp.call(this._yaxis, bands.hiData[i][1])]); + } + for (var i=0, l=bands.lowData.length; i<l; i++) { + this.renderer._lowBandGridData.push([xp.call(this._xaxis, bands.lowData[i][0]), yp.call(this._yaxis, bands.lowData[i][1])]); + } + } + + // calculate smoothed data if enough points and no nulls + if (this._type === 'line' && this.renderer.smooth && this.gridData.length > 2) { + var ret; + if (this.renderer.constrainSmoothing) { + ret = computeConstrainedSmoothedData.call(this, this.gridData); + this.renderer._smoothedData = ret[0]; + this.renderer._smoothedPlotData = ret[1]; + + if (bands.show) { + ret = computeConstrainedSmoothedData.call(this, this.renderer._hiBandGridData); + this.renderer._hiBandSmoothedData = ret[0]; + ret = computeConstrainedSmoothedData.call(this, this.renderer._lowBandGridData); + this.renderer._lowBandSmoothedData = ret[0]; + } + + ret = null; + } + else { + ret = computeHermiteSmoothedData.call(this, this.gridData); + this.renderer._smoothedData = ret[0]; + this.renderer._smoothedPlotData = ret[1]; + + if (bands.show) { + ret = computeHermiteSmoothedData.call(this, this.renderer._hiBandGridData); + this.renderer._hiBandSmoothedData = ret[0]; + ret = computeHermiteSmoothedData.call(this, this.renderer._lowBandGridData); + this.renderer._lowBandSmoothedData = ret[0]; + } + + ret = null; + } + } + }; + + // makeGridData + // converts any arbitrary data values to grid coordinates and + // returns them. This method exists so that plugins can use a series' + // linerenderer to generate grid data points without overwriting the + // grid data associated with that series. + // Called with scope of a series. + $.jqplot.LineRenderer.prototype.makeGridData = function(data, plot) { + // recalculate the grid data + var xp = this._xaxis.series_u2p; + var yp = this._yaxis.series_u2p; + var gd = []; + var pgd = []; + this.renderer._smoothedData = []; + this.renderer._smoothedPlotData = []; + this.renderer._hiBandGridData = []; + this.renderer._lowBandGridData = []; + this.renderer._hiBandSmoothedData = []; + this.renderer._lowBandSmoothedData = []; + var bands = this.renderer.bands; + var hasNull = false; + for (var i=0; i<data.length; i++) { + // if not a line series or if no nulls in data, push the converted point onto the array. + if (data[i][0] != null && data[i][1] != null) { + gd.push([xp.call(this._xaxis, data[i][0]), yp.call(this._yaxis, data[i][1])]); + } + // else if there is a null, preserve it. + else if (data[i][0] == null) { + hasNull = true; + gd.push([null, yp.call(this._yaxis, data[i][1])]); + } + else if (data[i][1] == null) { + hasNull = true; + gd.push([xp.call(this._xaxis, data[i][0]), null]); + } + } + + // don't do smoothing or bands on broken lines. + if (hasNull) { + this.renderer.smooth = false; + if (this._type === 'line') { + bands.show = false; + } + } + + if (this._type === 'line' && bands.show) { + for (var i=0, l=bands.hiData.length; i<l; i++) { + this.renderer._hiBandGridData.push([xp.call(this._xaxis, bands.hiData[i][0]), yp.call(this._yaxis, bands.hiData[i][1])]); + } + for (var i=0, l=bands.lowData.length; i<l; i++) { + this.renderer._lowBandGridData.push([xp.call(this._xaxis, bands.lowData[i][0]), yp.call(this._yaxis, bands.lowData[i][1])]); + } + } + + if (this._type === 'line' && this.renderer.smooth && gd.length > 2) { + var ret; + if (this.renderer.constrainSmoothing) { + ret = computeConstrainedSmoothedData.call(this, gd); + this.renderer._smoothedData = ret[0]; + this.renderer._smoothedPlotData = ret[1]; + + if (bands.show) { + ret = computeConstrainedSmoothedData.call(this, this.renderer._hiBandGridData); + this.renderer._hiBandSmoothedData = ret[0]; + ret = computeConstrainedSmoothedData.call(this, this.renderer._lowBandGridData); + this.renderer._lowBandSmoothedData = ret[0]; + } + + ret = null; + } + else { + ret = computeHermiteSmoothedData.call(this, gd); + this.renderer._smoothedData = ret[0]; + this.renderer._smoothedPlotData = ret[1]; + + if (bands.show) { + ret = computeHermiteSmoothedData.call(this, this.renderer._hiBandGridData); + this.renderer._hiBandSmoothedData = ret[0]; + ret = computeHermiteSmoothedData.call(this, this.renderer._lowBandGridData); + this.renderer._lowBandSmoothedData = ret[0]; + } + + ret = null; + } + } + return gd; + }; + + + // called within scope of series. + $.jqplot.LineRenderer.prototype.draw = function(ctx, gd, options, plot) { + var i; + // get a copy of the options, so we don't modify the original object. + var opts = $.extend(true, {}, options); + var shadow = (opts.shadow != undefined) ? opts.shadow : this.shadow; + var showLine = (opts.showLine != undefined) ? opts.showLine : this.showLine; + var fill = (opts.fill != undefined) ? opts.fill : this.fill; + var fillAndStroke = (opts.fillAndStroke != undefined) ? opts.fillAndStroke : this.fillAndStroke; + var xmin, ymin, xmax, ymax; + ctx.save(); + if (gd.length) { + if (showLine) { + // if we fill, we'll have to add points to close the curve. + if (fill) { + if (this.fillToZero) { + // have to break line up into shapes at axis crossings + var negativeColor = this.negativeColor; + if (! this.useNegativeColors) { + negativeColor = opts.fillStyle; + } + var isnegative = false; + var posfs = opts.fillStyle; + + // if stoking line as well as filling, get a copy of line data. + if (fillAndStroke) { + var fasgd = gd.slice(0); + } + // if not stacked, fill down to axis + if (this.index == 0 || !this._stack) { + + var tempgd = []; + var pd = (this.renderer.smooth) ? this.renderer._smoothedPlotData : this._plotData; + this._areaPoints = []; + var pyzero = this._yaxis.series_u2p(this.fillToValue); + var pxzero = this._xaxis.series_u2p(this.fillToValue); + + opts.closePath = true; + + if (this.fillAxis == 'y') { + tempgd.push([gd[0][0], pyzero]); + this._areaPoints.push([gd[0][0], pyzero]); + + for (var i=0; i<gd.length-1; i++) { + tempgd.push(gd[i]); + this._areaPoints.push(gd[i]); + // do we have an axis crossing? + if (pd[i][1] * pd[i+1][1] < 0) { + if (pd[i][1] < 0) { + isnegative = true; + opts.fillStyle = negativeColor; + } + else { + isnegative = false; + opts.fillStyle = posfs; + } + + var xintercept = gd[i][0] + (gd[i+1][0] - gd[i][0]) * (pyzero-gd[i][1])/(gd[i+1][1] - gd[i][1]); + tempgd.push([xintercept, pyzero]); + this._areaPoints.push([xintercept, pyzero]); + // now draw this shape and shadow. + if (shadow) { + this.renderer.shadowRenderer.draw(ctx, tempgd, opts); + } + this.renderer.shapeRenderer.draw(ctx, tempgd, opts); + // now empty temp array and continue + tempgd = [[xintercept, pyzero]]; + // this._areaPoints = [[xintercept, pyzero]]; + } + } + if (pd[gd.length-1][1] < 0) { + isnegative = true; + opts.fillStyle = negativeColor; + } + else { + isnegative = false; + opts.fillStyle = posfs; + } + tempgd.push(gd[gd.length-1]); + this._areaPoints.push(gd[gd.length-1]); + tempgd.push([gd[gd.length-1][0], pyzero]); + this._areaPoints.push([gd[gd.length-1][0], pyzero]); + } + // now draw the last area. + if (shadow) { + this.renderer.shadowRenderer.draw(ctx, tempgd, opts); + } + this.renderer.shapeRenderer.draw(ctx, tempgd, opts); + + + // var gridymin = this._yaxis.series_u2p(0); + // // IE doesn't return new length on unshift + // gd.unshift([gd[0][0], gridymin]); + // len = gd.length; + // gd.push([gd[len - 1][0], gridymin]); + } + // if stacked, fill to line below + else { + var prev = this._prevGridData; + for (var i=prev.length; i>0; i--) { + gd.push(prev[i-1]); + // this._areaPoints.push(prev[i-1]); + } + if (shadow) { + this.renderer.shadowRenderer.draw(ctx, gd, opts); + } + this._areaPoints = gd; + this.renderer.shapeRenderer.draw(ctx, gd, opts); + } + } + ///////////////////////// + // Not filled to zero + //////////////////////// + else { + // if stoking line as well as filling, get a copy of line data. + if (fillAndStroke) { + var fasgd = gd.slice(0); + } + // if not stacked, fill down to axis + if (this.index == 0 || !this._stack) { + // var gridymin = this._yaxis.series_u2p(this._yaxis.min) - this.gridBorderWidth / 2; + var gridymin = ctx.canvas.height; + // IE doesn't return new length on unshift + gd.unshift([gd[0][0], gridymin]); + var len = gd.length; + gd.push([gd[len - 1][0], gridymin]); + } + // if stacked, fill to line below + else { + var prev = this._prevGridData; + for (var i=prev.length; i>0; i--) { + gd.push(prev[i-1]); + } + } + this._areaPoints = gd; + + if (shadow) { + this.renderer.shadowRenderer.draw(ctx, gd, opts); + } + + this.renderer.shapeRenderer.draw(ctx, gd, opts); + } + if (fillAndStroke) { + var fasopts = $.extend(true, {}, opts, {fill:false, closePath:false}); + this.renderer.shapeRenderer.draw(ctx, fasgd, fasopts); + ////////// + // TODO: figure out some way to do shadows nicely + // if (shadow) { + // this.renderer.shadowRenderer.draw(ctx, fasgd, fasopts); + // } + // now draw the markers + if (this.markerRenderer.show) { + if (this.renderer.smooth) { + fasgd = this.gridData; + } + for (i=0; i<fasgd.length; i++) { + this.markerRenderer.draw(fasgd[i][0], fasgd[i][1], ctx, opts.markerOptions); + } + } + } + } + else { + + if (this.renderer.bands.show) { + var bdat; + var bopts = $.extend(true, {}, opts); + if (this.renderer.bands.showLines) { + bdat = (this.renderer.smooth) ? this.renderer._hiBandSmoothedData : this.renderer._hiBandGridData; + this.renderer.shapeRenderer.draw(ctx, bdat, opts); + bdat = (this.renderer.smooth) ? this.renderer._lowBandSmoothedData : this.renderer._lowBandGridData; + this.renderer.shapeRenderer.draw(ctx, bdat, bopts); + } + + if (this.renderer.bands.fill) { + if (this.renderer.smooth) { + bdat = this.renderer._hiBandSmoothedData.concat(this.renderer._lowBandSmoothedData.reverse()); + } + else { + bdat = this.renderer._hiBandGridData.concat(this.renderer._lowBandGridData.reverse()); + } + this._areaPoints = bdat; + bopts.closePath = true; + bopts.fill = true; + bopts.fillStyle = this.renderer.bands.fillColor; + this.renderer.shapeRenderer.draw(ctx, bdat, bopts); + } + } + + if (shadow) { + this.renderer.shadowRenderer.draw(ctx, gd, opts); + } + + this.renderer.shapeRenderer.draw(ctx, gd, opts); + } + } + // calculate the bounding box + var xmin = xmax = ymin = ymax = null; + for (i=0; i<this._areaPoints.length; i++) { + var p = this._areaPoints[i]; + if (xmin > p[0] || xmin == null) { + xmin = p[0]; + } + if (ymax < p[1] || ymax == null) { + ymax = p[1]; + } + if (xmax < p[0] || xmax == null) { + xmax = p[0]; + } + if (ymin > p[1] || ymin == null) { + ymin = p[1]; + } + } + + if (this.type === 'line' && this.renderer.bands.show) { + ymax = this._yaxis.series_u2p(this.renderer.bands._min); + ymin = this._yaxis.series_u2p(this.renderer.bands._max); + } + + this._boundingBox = [[xmin, ymax], [xmax, ymin]]; + + // now draw the markers + if (this.markerRenderer.show && !fill) { + if (this.renderer.smooth) { + gd = this.gridData; + } + for (i=0; i<gd.length; i++) { + if (gd[i][0] != null && gd[i][1] != null) { + this.markerRenderer.draw(gd[i][0], gd[i][1], ctx, opts.markerOptions); + } + } + } + } + + ctx.restore(); + }; + + $.jqplot.LineRenderer.prototype.drawShadow = function(ctx, gd, options) { + // This is a no-op, shadows drawn with lines. + }; + + // called with scope of plot. + // make sure to not leave anything highlighted. + function postInit(target, data, options) { + for (var i=0; i<this.series.length; i++) { + if (this.series[i].renderer.constructor == $.jqplot.LineRenderer) { + // don't allow mouseover and mousedown at same time. + if (this.series[i].highlightMouseOver) { + this.series[i].highlightMouseDown = false; + } + } + } + } + + // called within context of plot + // create a canvas which we can draw on. + // insert it before the eventCanvas, so eventCanvas will still capture events. + function postPlotDraw() { + // Memory Leaks patch + if (this.plugins.lineRenderer && this.plugins.lineRenderer.highlightCanvas) { + this.plugins.lineRenderer.highlightCanvas.resetCanvas(); + this.plugins.lineRenderer.highlightCanvas = null; + } + + this.plugins.lineRenderer.highlightedSeriesIndex = null; + this.plugins.lineRenderer.highlightCanvas = new $.jqplot.GenericCanvas(); + + this.eventCanvas._elem.before(this.plugins.lineRenderer.highlightCanvas.createElement(this._gridPadding, 'jqplot-lineRenderer-highlight-canvas', this._plotDimensions, this)); + this.plugins.lineRenderer.highlightCanvas.setContext(); + this.eventCanvas._elem.bind('mouseleave', {plot:this}, function (ev) { unhighlight(ev.data.plot); }); + } + + function highlight (plot, sidx, pidx, points) { + var s = plot.series[sidx]; + var canvas = plot.plugins.lineRenderer.highlightCanvas; + canvas._ctx.clearRect(0,0,canvas._ctx.canvas.width, canvas._ctx.canvas.height); + s._highlightedPoint = pidx; + plot.plugins.lineRenderer.highlightedSeriesIndex = sidx; + var opts = {fillStyle: s.highlightColor}; + if (s.type === 'line' && s.renderer.bands.show) { + opts.fill = true; + opts.closePath = true; + } + s.renderer.shapeRenderer.draw(canvas._ctx, points, opts); + canvas = null; + } + + function unhighlight (plot) { + var canvas = plot.plugins.lineRenderer.highlightCanvas; + canvas._ctx.clearRect(0,0, canvas._ctx.canvas.width, canvas._ctx.canvas.height); + for (var i=0; i<plot.series.length; i++) { + plot.series[i]._highlightedPoint = null; + } + plot.plugins.lineRenderer.highlightedSeriesIndex = null; + plot.target.trigger('jqplotDataUnhighlight'); + canvas = null; + } + + + function handleMove(ev, gridpos, datapos, neighbor, plot) { + if (neighbor) { + var ins = [neighbor.seriesIndex, neighbor.pointIndex, neighbor.data]; + var evt1 = jQuery.Event('jqplotDataMouseOver'); + evt1.pageX = ev.pageX; + evt1.pageY = ev.pageY; + plot.target.trigger(evt1, ins); + if (plot.series[ins[0]].highlightMouseOver && !(ins[0] == plot.plugins.lineRenderer.highlightedSeriesIndex)) { + var evt = jQuery.Event('jqplotDataHighlight'); + evt.pageX = ev.pageX; + evt.pageY = ev.pageY; + plot.target.trigger(evt, ins); + highlight (plot, neighbor.seriesIndex, neighbor.pointIndex, neighbor.points); + } + } + else if (neighbor == null) { + unhighlight (plot); + } + } + + function handleMouseDown(ev, gridpos, datapos, neighbor, plot) { + if (neighbor) { + var ins = [neighbor.seriesIndex, neighbor.pointIndex, neighbor.data]; + if (plot.series[ins[0]].highlightMouseDown && !(ins[0] == plot.plugins.lineRenderer.highlightedSeriesIndex)) { + var evt = jQuery.Event('jqplotDataHighlight'); + evt.pageX = ev.pageX; + evt.pageY = ev.pageY; + plot.target.trigger(evt, ins); + highlight (plot, neighbor.seriesIndex, neighbor.pointIndex, neighbor.points); + } + } + else if (neighbor == null) { + unhighlight (plot); + } + } + + function handleMouseUp(ev, gridpos, datapos, neighbor, plot) { + var idx = plot.plugins.lineRenderer.highlightedSeriesIndex; + if (idx != null && plot.series[idx].highlightMouseDown) { + unhighlight(plot); + } + } + + function handleClick(ev, gridpos, datapos, neighbor, plot) { + if (neighbor) { + var ins = [neighbor.seriesIndex, neighbor.pointIndex, neighbor.data]; + var evt = jQuery.Event('jqplotDataClick'); + evt.pageX = ev.pageX; + evt.pageY = ev.pageY; + plot.target.trigger(evt, ins); + } + } + + function handleRightClick(ev, gridpos, datapos, neighbor, plot) { + if (neighbor) { + var ins = [neighbor.seriesIndex, neighbor.pointIndex, neighbor.data]; + var idx = plot.plugins.lineRenderer.highlightedSeriesIndex; + if (idx != null && plot.series[idx].highlightMouseDown) { + unhighlight(plot); + } + var evt = jQuery.Event('jqplotDataRightClick'); + evt.pageX = ev.pageX; + evt.pageY = ev.pageY; + plot.target.trigger(evt, ins); + } + } + + + // class: $.jqplot.LinearAxisRenderer + // The default jqPlot axis renderer, creating a numeric axis. + $.jqplot.LinearAxisRenderer = function() { + }; + + // called with scope of axis object. + $.jqplot.LinearAxisRenderer.prototype.init = function(options){ + // prop: breakPoints + // EXPERIMENTAL!! Use at your own risk! + // Works only with linear axes and the default tick renderer. + // Array of [start, stop] points to create a broken axis. + // Broken axes have a "jump" in them, which is an immediate + // transition from a smaller value to a larger value. + // Currently, axis ticks MUST be manually assigned if using breakPoints + // by using the axis ticks array option. + this.breakPoints = null; + // prop: breakTickLabel + // Label to use at the axis break if breakPoints are specified. + this.breakTickLabel = "≈"; + // prop: drawBaseline + // True to draw the axis baseline. + this.drawBaseline = true; + // prop: baselineWidth + // width of the baseline in pixels. + this.baselineWidth = null; + // prop: baselineColor + // CSS color spec for the baseline. + this.baselineColor = null; + // prop: forceTickAt0 + // This will ensure that there is always a tick mark at 0. + // If data range is strictly positive or negative, + // this will force 0 to be inside the axis bounds unless + // the appropriate axis pad (pad, padMin or padMax) is set + // to 0, then this will force an axis min or max value at 0. + // This has know effect when any of the following options + // are set: autoscale, min, max, numberTicks or tickInterval. + this.forceTickAt0 = false; + // prop: forceTickAt100 + // This will ensure that there is always a tick mark at 100. + // If data range is strictly above or below 100, + // this will force 100 to be inside the axis bounds unless + // the appropriate axis pad (pad, padMin or padMax) is set + // to 0, then this will force an axis min or max value at 100. + // This has know effect when any of the following options + // are set: autoscale, min, max, numberTicks or tickInterval. + this.forceTickAt100 = false; + // prop: tickInset + // Controls the amount to inset the first and last ticks from + // the edges of the grid, in multiples of the tick interval. + // 0 is no inset, 0.5 is one half a tick interval, 1 is a full + // tick interval, etc. + this.tickInset = 0; + // prop: minorTicks + // Number of ticks to add between "major" ticks. + // Major ticks are ticks supplied by user or auto computed. + // Minor ticks cannot be created by user. + this.minorTicks = 0; + // prop: alignTicks + // true to align tick marks across opposed axes + // such as from the y2axis to yaxis. + this.alignTicks = false; + this._autoFormatString = ''; + this._overrideFormatString = false; + this._scalefact = 1.0; + $.extend(true, this, options); + if (this.breakPoints) { + if (!$.isArray(this.breakPoints)) { + this.breakPoints = null; + } + else if (this.breakPoints.length < 2 || this.breakPoints[1] <= this.breakPoints[0]) { + this.breakPoints = null; + } + } + if (this.numberTicks != null && this.numberTicks < 2) { + this.numberTicks = 2; + } + this.resetDataBounds(); + }; + + // called with scope of axis + $.jqplot.LinearAxisRenderer.prototype.draw = function(ctx, plot) { + if (this.show) { + // populate the axis label and value properties. + // createTicks is a method on the renderer, but + // call it within the scope of the axis. + this.renderer.createTicks.call(this, plot); + // fill a div with axes labels in the right direction. + // Need to pregenerate each axis to get it's bounds and + // position it and the labels correctly on the plot. + var dim=0; + var temp; + // Added for theming. + if (this._elem) { + // Memory Leaks patch + //this._elem.empty(); + this._elem.emptyForce(); + this._elem = null; + } + + this._elem = $(document.createElement('div')); + this._elem.addClass('jqplot-axis jqplot-'+this.name); + this._elem.css('position', 'absolute'); + + + if (this.name == 'xaxis' || this.name == 'x2axis') { + this._elem.width(this._plotDimensions.width); + } + else { + this._elem.height(this._plotDimensions.height); + } + + // create a _label object. + this.labelOptions.axis = this.name; + this._label = new this.labelRenderer(this.labelOptions); + if (this._label.show) { + var elem = this._label.draw(ctx, plot); + elem.appendTo(this._elem); + elem = null; + } + + var t = this._ticks; + var tick; + for (var i=0; i<t.length; i++) { + tick = t[i]; + if (tick.show && tick.showLabel && (!tick.isMinorTick || this.showMinorTicks)) { + this._elem.append(tick.draw(ctx, plot)); + } + } + tick = null; + t = null; + } + return this._elem; + }; + + // called with scope of an axis + $.jqplot.LinearAxisRenderer.prototype.reset = function() { + this.min = this._options.min; + this.max = this._options.max; + this.tickInterval = this._options.tickInterval; + this.numberTicks = this._options.numberTicks; + this._autoFormatString = ''; + if (this._overrideFormatString && this.tickOptions && this.tickOptions.formatString) { + this.tickOptions.formatString = ''; + } + + // this._ticks = this.__ticks; + }; + + // called with scope of axis + $.jqplot.LinearAxisRenderer.prototype.set = function() { + var dim = 0; + var temp; + var w = 0; + var h = 0; + var lshow = (this._label == null) ? false : this._label.show; + if (this.show) { + var t = this._ticks; + var tick; + for (var i=0; i<t.length; i++) { + tick = t[i]; + if (!tick._breakTick && tick.show && tick.showLabel && (!tick.isMinorTick || this.showMinorTicks)) { + if (this.name == 'xaxis' || this.name == 'x2axis') { + temp = tick._elem.outerHeight(true); + } + else { + temp = tick._elem.outerWidth(true); + } + if (temp > dim) { + dim = temp; + } + } + } + tick = null; + t = null; + + if (lshow) { + w = this._label._elem.outerWidth(true); + h = this._label._elem.outerHeight(true); + } + if (this.name == 'xaxis') { + dim = dim + h; + this._elem.css({'height':dim+'px', left:'0px', bottom:'0px'}); + } + else if (this.name == 'x2axis') { + dim = dim + h; + this._elem.css({'height':dim+'px', left:'0px', top:'0px'}); + } + else if (this.name == 'yaxis') { + dim = dim + w; + this._elem.css({'width':dim+'px', left:'0px', top:'0px'}); + if (lshow && this._label.constructor == $.jqplot.AxisLabelRenderer) { + this._label._elem.css('width', w+'px'); + } + } + else { + dim = dim + w; + this._elem.css({'width':dim+'px', right:'0px', top:'0px'}); + if (lshow && this._label.constructor == $.jqplot.AxisLabelRenderer) { + this._label._elem.css('width', w+'px'); + } + } + } + }; + + // called with scope of axis + $.jqplot.LinearAxisRenderer.prototype.createTicks = function(plot) { + // we're are operating on an axis here + var ticks = this._ticks; + var userTicks = this.ticks; + var name = this.name; + // databounds were set on axis initialization. + var db = this._dataBounds; + var dim = (this.name.charAt(0) === 'x') ? this._plotDimensions.width : this._plotDimensions.height; + var interval; + var min, max; + var pos1, pos2; + var tt, i; + // get a copy of user's settings for min/max. + var userMin = this.min; + var userMax = this.max; + var userNT = this.numberTicks; + var userTI = this.tickInterval; + + var threshold = 30; + this._scalefact = (Math.max(dim, threshold+1) - threshold)/300.0; + + // if we already have ticks, use them. + // ticks must be in order of increasing value. + + if (userTicks.length) { + // ticks could be 1D or 2D array of [val, val, ,,,] or [[val, label], [val, label], ...] or mixed + for (i=0; i<userTicks.length; i++){ + var ut = userTicks[i]; + var t = new this.tickRenderer(this.tickOptions); + if ($.isArray(ut)) { + t.value = ut[0]; + if (this.breakPoints) { + if (ut[0] == this.breakPoints[0]) { + t.label = this.breakTickLabel; + t._breakTick = true; + t.showGridline = false; + t.showMark = false; + } + else if (ut[0] > this.breakPoints[0] && ut[0] <= this.breakPoints[1]) { + t.show = false; + t.showGridline = false; + t.label = ut[1]; + } + else { + t.label = ut[1]; + } + } + else { + t.label = ut[1]; + } + t.setTick(ut[0], this.name); + this._ticks.push(t); + } + + else if ($.isPlainObject(ut)) { + $.extend(true, t, ut); + t.axis = this.name; + this._ticks.push(t); + } + + else { + t.value = ut; + if (this.breakPoints) { + if (ut == this.breakPoints[0]) { + t.label = this.breakTickLabel; + t._breakTick = true; + t.showGridline = false; + t.showMark = false; + } + else if (ut > this.breakPoints[0] && ut <= this.breakPoints[1]) { + t.show = false; + t.showGridline = false; + } + } + t.setTick(ut, this.name); + this._ticks.push(t); + } + } + this.numberTicks = userTicks.length; + this.min = this._ticks[0].value; + this.max = this._ticks[this.numberTicks-1].value; + this.tickInterval = (this.max - this.min) / (this.numberTicks - 1); + } + + // we don't have any ticks yet, let's make some! + else { + if (name == 'xaxis' || name == 'x2axis') { + dim = this._plotDimensions.width; + } + else { + dim = this._plotDimensions.height; + } + + var _numberTicks = this.numberTicks; + + // if aligning this axis, use number of ticks from previous axis. + // Do I need to reset somehow if alignTicks is changed and then graph is replotted?? + if (this.alignTicks) { + if (this.name === 'x2axis' && plot.axes.xaxis.show) { + _numberTicks = plot.axes.xaxis.numberTicks; + } + else if (this.name.charAt(0) === 'y' && this.name !== 'yaxis' && this.name !== 'yMidAxis' && plot.axes.yaxis.show) { + _numberTicks = plot.axes.yaxis.numberTicks; + } + } + + min = ((this.min != null) ? this.min : db.min); + max = ((this.max != null) ? this.max : db.max); + + var range = max - min; + var rmin, rmax; + var temp; + + if (this.tickOptions == null || !this.tickOptions.formatString) { + this._overrideFormatString = true; + } + + // Doing complete autoscaling + if (this.min == null && this.max == null && this.tickInterval == null && !this.autoscale) { + // Check if user must have tick at 0 or 100 and ensure they are in range. + // The autoscaling algorithm will always place ticks at 0 and 100 if they are in range. + if (this.forceTickAt0) { + if (min > 0) { + min = 0; + } + if (max < 0) { + max = 0; + } + } + + if (this.forceTickAt100) { + if (min > 100) { + min = 100; + } + if (max < 100) { + max = 100; + } + } + + // var threshold = 30; + // var tdim = Math.max(dim, threshold+1); + // this._scalefact = (tdim-threshold)/300.0; + var ret = $.jqplot.LinearTickGenerator(min, max, this._scalefact, _numberTicks); + // calculate a padded max and min, points should be less than these + // so that they aren't too close to the edges of the plot. + // User can adjust how much padding is allowed with pad, padMin and PadMax options. + var tumin = min + range*(this.padMin - 1); + var tumax = max - range*(this.padMax - 1); + + // if they're equal, we shouldn't have to do anything, right? + // if (min <=tumin || max >= tumax) { + if (min <tumin || max > tumax) { + tumin = min - range*(this.padMin - 1); + tumax = max + range*(this.padMax - 1); + ret = $.jqplot.LinearTickGenerator(tumin, tumax, this._scalefact, _numberTicks); + } + + this.min = ret[0]; + this.max = ret[1]; + // if numberTicks specified, it should return the same. + this.numberTicks = ret[2]; + this._autoFormatString = ret[3]; + this.tickInterval = ret[4]; + } + + // User has specified some axis scale related option, can use auto algorithm + else { + + // if min and max are same, space them out a bit + if (min == max) { + var adj = 0.05; + if (min > 0) { + adj = Math.max(Math.log(min)/Math.LN10, 0.05); + } + min -= adj; + max += adj; + } + + // autoscale. Can't autoscale if min or max is supplied. + // Will use numberTicks and tickInterval if supplied. Ticks + // across multiple axes may not line up depending on how + // bars are to be plotted. + if (this.autoscale && this.min == null && this.max == null) { + var rrange, ti, margin; + var forceMinZero = false; + var forceZeroLine = false; + var intervals = {min:null, max:null, average:null, stddev:null}; + // if any series are bars, or if any are fill to zero, and if this + // is the axis to fill toward, check to see if we can start axis at zero. + for (var i=0; i<this._series.length; i++) { + var s = this._series[i]; + var faname = (s.fillAxis == 'x') ? s._xaxis.name : s._yaxis.name; + // check to see if this is the fill axis + if (this.name == faname) { + var vals = s._plotValues[s.fillAxis]; + var vmin = vals[0]; + var vmax = vals[0]; + for (var j=1; j<vals.length; j++) { + if (vals[j] < vmin) { + vmin = vals[j]; + } + else if (vals[j] > vmax) { + vmax = vals[j]; + } + } + var dp = (vmax - vmin) / vmax; + // is this sries a bar? + if (s.renderer.constructor == $.jqplot.BarRenderer) { + // if no negative values and could also check range. + if (vmin >= 0 && (s.fillToZero || dp > 0.1)) { + forceMinZero = true; + } + else { + forceMinZero = false; + if (s.fill && s.fillToZero && vmin < 0 && vmax > 0) { + forceZeroLine = true; + } + else { + forceZeroLine = false; + } + } + } + + // if not a bar and filling, use appropriate method. + else if (s.fill) { + if (vmin >= 0 && (s.fillToZero || dp > 0.1)) { + forceMinZero = true; + } + else if (vmin < 0 && vmax > 0 && s.fillToZero) { + forceMinZero = false; + forceZeroLine = true; + } + else { + forceMinZero = false; + forceZeroLine = false; + } + } + + // if not a bar and not filling, only change existing state + // if it doesn't make sense + else if (vmin < 0) { + forceMinZero = false; + } + } + } + + // check if we need make axis min at 0. + if (forceMinZero) { + // compute number of ticks + this.numberTicks = 2 + Math.ceil((dim-(this.tickSpacing-1))/this.tickSpacing); + this.min = 0; + userMin = 0; + // what order is this range? + // what tick interval does that give us? + ti = max/(this.numberTicks-1); + temp = Math.pow(10, Math.abs(Math.floor(Math.log(ti)/Math.LN10))); + if (ti/temp == parseInt(ti/temp, 10)) { + ti += temp; + } + this.tickInterval = Math.ceil(ti/temp) * temp; + this.max = this.tickInterval * (this.numberTicks - 1); + } + + // check if we need to make sure there is a tick at 0. + else if (forceZeroLine) { + // compute number of ticks + this.numberTicks = 2 + Math.ceil((dim-(this.tickSpacing-1))/this.tickSpacing); + var ntmin = Math.ceil(Math.abs(min)/range*(this.numberTicks-1)); + var ntmax = this.numberTicks - 1 - ntmin; + ti = Math.max(Math.abs(min/ntmin), Math.abs(max/ntmax)); + temp = Math.pow(10, Math.abs(Math.floor(Math.log(ti)/Math.LN10))); + this.tickInterval = Math.ceil(ti/temp) * temp; + this.max = this.tickInterval * ntmax; + this.min = -this.tickInterval * ntmin; + } + + // if nothing else, do autoscaling which will try to line up ticks across axes. + else { + if (this.numberTicks == null){ + if (this.tickInterval) { + this.numberTicks = 3 + Math.ceil(range / this.tickInterval); + } + else { + this.numberTicks = 2 + Math.ceil((dim-(this.tickSpacing-1))/this.tickSpacing); + } + } + + if (this.tickInterval == null) { + // get a tick interval + ti = range/(this.numberTicks - 1); + + if (ti < 1) { + temp = Math.pow(10, Math.abs(Math.floor(Math.log(ti)/Math.LN10))); + } + else { + temp = 1; + } + this.tickInterval = Math.ceil(ti*temp*this.pad)/temp; + } + else { + temp = 1 / this.tickInterval; + } + + // try to compute a nicer, more even tick interval + // temp = Math.pow(10, Math.floor(Math.log(ti)/Math.LN10)); + // this.tickInterval = Math.ceil(ti/temp) * temp; + rrange = this.tickInterval * (this.numberTicks - 1); + margin = (rrange - range)/2; + + if (this.min == null) { + this.min = Math.floor(temp*(min-margin))/temp; + } + if (this.max == null) { + this.max = this.min + rrange; + } + } + + // Compute a somewhat decent format string if it is needed. + // get precision of interval and determine a format string. + var sf = $.jqplot.getSignificantFigures(this.tickInterval); + + var fstr; + + // if we have only a whole number, use integer formatting + if (sf.digitsLeft >= sf.significantDigits) { + fstr = '%d'; + } + + else { + var temp = Math.max(0, 5 - sf.digitsLeft); + temp = Math.min(temp, sf.digitsRight); + fstr = '%.'+ temp + 'f'; + } + + this._autoFormatString = fstr; + } + + // Use the default algorithm which pads each axis to make the chart + // centered nicely on the grid. + else { + + rmin = (this.min != null) ? this.min : min - range*(this.padMin - 1); + rmax = (this.max != null) ? this.max : max + range*(this.padMax - 1); + range = rmax - rmin; + + if (this.numberTicks == null){ + // if tickInterval is specified by user, we will ignore computed maximum. + // max will be equal or greater to fit even # of ticks. + if (this.tickInterval != null) { + this.numberTicks = Math.ceil((rmax - rmin)/this.tickInterval)+1; + } + else if (dim > 100) { + this.numberTicks = parseInt(3+(dim-100)/75, 10); + } + else { + this.numberTicks = 2; + } + } + + if (this.tickInterval == null) { + this.tickInterval = range / (this.numberTicks-1); + } + + if (this.max == null) { + rmax = rmin + this.tickInterval*(this.numberTicks - 1); + } + if (this.min == null) { + rmin = rmax - this.tickInterval*(this.numberTicks - 1); + } + + // get precision of interval and determine a format string. + var sf = $.jqplot.getSignificantFigures(this.tickInterval); + + var fstr; + + // if we have only a whole number, use integer formatting + if (sf.digitsLeft >= sf.significantDigits) { + fstr = '%d'; + } + + else { + var temp = Math.max(0, 5 - sf.digitsLeft); + temp = Math.min(temp, sf.digitsRight); + fstr = '%.'+ temp + 'f'; + } + + + this._autoFormatString = fstr; + + this.min = rmin; + this.max = rmax; + } + + if (this.renderer.constructor == $.jqplot.LinearAxisRenderer && this._autoFormatString == '') { + // fix for misleading tick display with small range and low precision. + range = this.max - this.min; + // figure out precision + var temptick = new this.tickRenderer(this.tickOptions); + // use the tick formatString or, the default. + var fs = temptick.formatString || $.jqplot.config.defaultTickFormatString; + var fs = fs.match($.jqplot.sprintf.regex)[0]; + var precision = 0; + if (fs) { + if (fs.search(/[fFeEgGpP]/) > -1) { + var m = fs.match(/\%\.(\d{0,})?[eEfFgGpP]/); + if (m) { + precision = parseInt(m[1], 10); + } + else { + precision = 6; + } + } + else if (fs.search(/[di]/) > -1) { + precision = 0; + } + // fact will be <= 1; + var fact = Math.pow(10, -precision); + if (this.tickInterval < fact) { + // need to correct underrange + if (userNT == null && userTI == null) { + this.tickInterval = fact; + if (userMax == null && userMin == null) { + // this.min = Math.floor((this._dataBounds.min - this.tickInterval)/fact) * fact; + this.min = Math.floor(this._dataBounds.min/fact) * fact; + if (this.min == this._dataBounds.min) { + this.min = this._dataBounds.min - this.tickInterval; + } + // this.max = Math.ceil((this._dataBounds.max + this.tickInterval)/fact) * fact; + this.max = Math.ceil(this._dataBounds.max/fact) * fact; + if (this.max == this._dataBounds.max) { + this.max = this._dataBounds.max + this.tickInterval; + } + var n = (this.max - this.min)/this.tickInterval; + n = n.toFixed(11); + n = Math.ceil(n); + this.numberTicks = n + 1; + } + else if (userMax == null) { + // add one tick for top of range. + var n = (this._dataBounds.max - this.min) / this.tickInterval; + n = n.toFixed(11); + this.numberTicks = Math.ceil(n) + 2; + this.max = this.min + this.tickInterval * (this.numberTicks-1); + } + else if (userMin == null) { + // add one tick for bottom of range. + var n = (this.max - this._dataBounds.min) / this.tickInterval; + n = n.toFixed(11); + this.numberTicks = Math.ceil(n) + 2; + this.min = this.max - this.tickInterval * (this.numberTicks-1); + } + else { + // calculate a number of ticks so max is within axis scale + this.numberTicks = Math.ceil((userMax - userMin)/this.tickInterval) + 1; + // if user's min and max don't fit evenly in ticks, adjust. + // This takes care of cases such as user min set to 0, max set to 3.5 but tick + // format string set to %d (integer ticks) + this.min = Math.floor(userMin*Math.pow(10, precision))/Math.pow(10, precision); + this.max = Math.ceil(userMax*Math.pow(10, precision))/Math.pow(10, precision); + // this.max = this.min + this.tickInterval*(this.numberTicks-1); + this.numberTicks = Math.ceil((this.max - this.min)/this.tickInterval) + 1; + } + } + } + } + } + + } + + if (this._overrideFormatString && this._autoFormatString != '') { + this.tickOptions = this.tickOptions || {}; + this.tickOptions.formatString = this._autoFormatString; + } + + var t, to; + for (var i=0; i<this.numberTicks; i++){ + tt = this.min + i * this.tickInterval; + t = new this.tickRenderer(this.tickOptions); + // var t = new $.jqplot.AxisTickRenderer(this.tickOptions); + + t.setTick(tt, this.name); + this._ticks.push(t); + + if (i < this.numberTicks - 1) { + for (var j=0; j<this.minorTicks; j++) { + tt += this.tickInterval/(this.minorTicks+1); + to = $.extend(true, {}, this.tickOptions, {name:this.name, value:tt, label:'', isMinorTick:true}); + t = new this.tickRenderer(to); + this._ticks.push(t); + } + } + t = null; + } + } + + if (this.tickInset) { + this.min = this.min - this.tickInset * this.tickInterval; + this.max = this.max + this.tickInset * this.tickInterval; + } + + ticks = null; + }; + + // Used to reset just the values of the ticks and then repack, which will + // recalculate the positioning functions. It is assuemd that the + // number of ticks is the same and the values of the new array are at the + // proper interval. + // This method needs to be called with the scope of an axis object, like: + // + // > plot.axes.yaxis.renderer.resetTickValues.call(plot.axes.yaxis, yarr); + // + $.jqplot.LinearAxisRenderer.prototype.resetTickValues = function(opts) { + if ($.isArray(opts) && opts.length == this._ticks.length) { + var t; + for (var i=0; i<opts.length; i++) { + t = this._ticks[i]; + t.value = opts[i]; + t.label = t.formatter(t.formatString, opts[i]); + t.label = t.prefix + t.label; + t._elem.html(t.label); + } + t = null; + this.min = $.jqplot.arrayMin(opts); + this.max = $.jqplot.arrayMax(opts); + this.pack(); + } + // Not implemented yet. + // else if ($.isPlainObject(opts)) { + // + // } + }; + + // called with scope of axis + $.jqplot.LinearAxisRenderer.prototype.pack = function(pos, offsets) { + // Add defaults for repacking from resetTickValues function. + pos = pos || {}; + offsets = offsets || this._offsets; + + var ticks = this._ticks; + var max = this.max; + var min = this.min; + var offmax = offsets.max; + var offmin = offsets.min; + var lshow = (this._label == null) ? false : this._label.show; + + for (var p in pos) { + this._elem.css(p, pos[p]); + } + + this._offsets = offsets; + // pixellength will be + for x axes and - for y axes becasue pixels always measured from top left. + var pixellength = offmax - offmin; + var unitlength = max - min; + + // point to unit and unit to point conversions references to Plot DOM element top left corner. + if (this.breakPoints) { + unitlength = unitlength - this.breakPoints[1] + this.breakPoints[0]; + + this.p2u = function(p){ + return (p - offmin) * unitlength / pixellength + min; + }; + + this.u2p = function(u){ + if (u > this.breakPoints[0] && u < this.breakPoints[1]){ + u = this.breakPoints[0]; + } + if (u <= this.breakPoints[0]) { + return (u - min) * pixellength / unitlength + offmin; + } + else { + return (u - this.breakPoints[1] + this.breakPoints[0] - min) * pixellength / unitlength + offmin; + } + }; + + if (this.name.charAt(0) == 'x'){ + this.series_u2p = function(u){ + if (u > this.breakPoints[0] && u < this.breakPoints[1]){ + u = this.breakPoints[0]; + } + if (u <= this.breakPoints[0]) { + return (u - min) * pixellength / unitlength; + } + else { + return (u - this.breakPoints[1] + this.breakPoints[0] - min) * pixellength / unitlength; + } + }; + this.series_p2u = function(p){ + return p * unitlength / pixellength + min; + }; + } + + else { + this.series_u2p = function(u){ + if (u > this.breakPoints[0] && u < this.breakPoints[1]){ + u = this.breakPoints[0]; + } + if (u >= this.breakPoints[1]) { + return (u - max) * pixellength / unitlength; + } + else { + return (u + this.breakPoints[1] - this.breakPoints[0] - max) * pixellength / unitlength; + } + }; + this.series_p2u = function(p){ + return p * unitlength / pixellength + max; + }; + } + } + else { + this.p2u = function(p){ + return (p - offmin) * unitlength / pixellength + min; + }; + + this.u2p = function(u){ + return (u - min) * pixellength / unitlength + offmin; + }; + + if (this.name == 'xaxis' || this.name == 'x2axis'){ + this.series_u2p = function(u){ + return (u - min) * pixellength / unitlength; + }; + this.series_p2u = function(p){ + return p * unitlength / pixellength + min; + }; + } + + else { + this.series_u2p = function(u){ + return (u - max) * pixellength / unitlength; + }; + this.series_p2u = function(p){ + return p * unitlength / pixellength + max; + }; + } + } + + if (this.show) { + if (this.name == 'xaxis' || this.name == 'x2axis') { + for (var i=0; i<ticks.length; i++) { + var t = ticks[i]; + if (t.show && t.showLabel) { + var shim; + + if (t.constructor == $.jqplot.CanvasAxisTickRenderer && t.angle) { + // will need to adjust auto positioning based on which axis this is. + var temp = (this.name == 'xaxis') ? 1 : -1; + switch (t.labelPosition) { + case 'auto': + // position at end + if (temp * t.angle < 0) { + shim = -t.getWidth() + t._textRenderer.height * Math.sin(-t._textRenderer.angle) / 2; + } + // position at start + else { + shim = -t._textRenderer.height * Math.sin(t._textRenderer.angle) / 2; + } + break; + case 'end': + shim = -t.getWidth() + t._textRenderer.height * Math.sin(-t._textRenderer.angle) / 2; + break; + case 'start': + shim = -t._textRenderer.height * Math.sin(t._textRenderer.angle) / 2; + break; + case 'middle': + shim = -t.getWidth()/2 + t._textRenderer.height * Math.sin(-t._textRenderer.angle) / 2; + break; + default: + shim = -t.getWidth()/2 + t._textRenderer.height * Math.sin(-t._textRenderer.angle) / 2; + break; + } + } + else { + shim = -t.getWidth()/2; + } + var val = this.u2p(t.value) + shim + 'px'; + t._elem.css('left', val); + t.pack(); + } + } + if (lshow) { + var w = this._label._elem.outerWidth(true); + this._label._elem.css('left', offmin + pixellength/2 - w/2 + 'px'); + if (this.name == 'xaxis') { + this._label._elem.css('bottom', '0px'); + } + else { + this._label._elem.css('top', '0px'); + } + this._label.pack(); + } + } + else { + for (var i=0; i<ticks.length; i++) { + var t = ticks[i]; + if (t.show && t.showLabel) { + var shim; + if (t.constructor == $.jqplot.CanvasAxisTickRenderer && t.angle) { + // will need to adjust auto positioning based on which axis this is. + var temp = (this.name == 'yaxis') ? 1 : -1; + switch (t.labelPosition) { + case 'auto': + // position at end + case 'end': + if (temp * t.angle < 0) { + shim = -t._textRenderer.height * Math.cos(-t._textRenderer.angle) / 2; + } + else { + shim = -t.getHeight() + t._textRenderer.height * Math.cos(t._textRenderer.angle) / 2; + } + break; + case 'start': + if (t.angle > 0) { + shim = -t._textRenderer.height * Math.cos(-t._textRenderer.angle) / 2; + } + else { + shim = -t.getHeight() + t._textRenderer.height * Math.cos(t._textRenderer.angle) / 2; + } + break; + case 'middle': + // if (t.angle > 0) { + // shim = -t.getHeight()/2 + t._textRenderer.height * Math.sin(-t._textRenderer.angle) / 2; + // } + // else { + // shim = -t.getHeight()/2 - t._textRenderer.height * Math.sin(t._textRenderer.angle) / 2; + // } + shim = -t.getHeight()/2; + break; + default: + shim = -t.getHeight()/2; + break; + } + } + else { + shim = -t.getHeight()/2; + } + + var val = this.u2p(t.value) + shim + 'px'; + t._elem.css('top', val); + t.pack(); + } + } + if (lshow) { + var h = this._label._elem.outerHeight(true); + this._label._elem.css('top', offmax - pixellength/2 - h/2 + 'px'); + if (this.name == 'yaxis') { + this._label._elem.css('left', '0px'); + } + else { + this._label._elem.css('right', '0px'); + } + this._label.pack(); + } + } + } + + ticks = null; + }; + + + /** + * The following code was generaously given to me a while back by Scott Prahl. + * He did a good job at computing axes min, max and number of ticks for the + * case where the user has not set any scale related parameters (tickInterval, + * numberTicks, min or max). I had ignored this use case for a long time, + * focusing on the more difficult case where user has set some option controlling + * tick generation. Anyway, about time I got this into jqPlot. + * Thanks Scott!! + */ + + /** + * Copyright (c) 2010 Scott Prahl + * The next three routines are currently available for use in all personal + * or commercial projects under both the MIT and GPL version 2.0 licenses. + * This means that you can choose the license that best suits your project + * and use it accordingly. + */ + + // A good format string depends on the interval. If the interval is greater + // than 1 then there is no need to show any decimal digits. If it is < 1.0, then + // use the magnitude of the interval to determine the number of digits to show. + function bestFormatString (interval) + { + var fstr; + interval = Math.abs(interval); + if (interval >= 10) { + fstr = '%d'; + } + + else if (interval > 1) { + if (interval === parseInt(interval, 10)) { + fstr = '%d'; + } + else { + fstr = '%.1f'; + } + } + + else { + var expv = -Math.floor(Math.log(interval)/Math.LN10); + fstr = '%.' + expv + 'f'; + } + + return fstr; + } + + var _factors = [0.1, 0.2, 0.3, 0.4, 0.5, 0.8, 1, 2, 3, 4, 5]; + + var _getLowerFactor = function(f) { + var i = _factors.indexOf(f); + if (i > 0) { + return _factors[i-1]; + } + else { + return _factors[_factors.length - 1] / 100; + } + }; + + var _getHigherFactor = function(f) { + var i = _factors.indexOf(f); + if (i < _factors.length-1) { + return _factors[i+1]; + } + else { + return _factors[0] * 100; + } + }; + + // Given a fixed minimum and maximum and a target number ot ticks + // figure out the best interval and + // return min, max, number ticks, format string and tick interval + function bestConstrainedInterval(min, max, nttarget) { + // run through possible number to ticks and see which interval is best + var low = Math.floor(nttarget/2); + var hi = Math.ceil(nttarget*1.5); + var badness = Number.MAX_VALUE; + var r = (max - min); + var temp; + var sd; + var bestNT; + var fsd; + var fs; + var gsf = $.jqplot.getSignificantFigures; + var currentNT; + var bestPrec; + + for (var i=0, l=hi-low+1; i<l; i++) { + currentNT = low + i; + temp = r/(currentNT-1); + sd = gsf(temp); + + temp = Math.abs(nttarget - currentNT) + sd.digitsRight; + if (temp < badness) { + badness = temp; + bestNT = currentNT; + bestPrec = sd.digitsRight; + } + else if (temp === badness) { + // let nicer ticks trump number ot ticks + if (sd.digitsRight < bestPrec) { + bestNT = currentNT; + bestPrec = sd.digitsRight; + } + } + + } + + fsd = Math.max(bestPrec, Math.max(gsf(min).digitsRight, gsf(max).digitsRight)); + if (fsd === 0) { + fs = '%d'; + } + else { + fs = '%.' + fsd + 'f'; + } + temp = r / (bestNT - 1); + // min, max, number ticks, format string, tick interval + return [min, max, bestNT, fs, temp]; + } + + // This will return an interval of form 2 * 10^n, 5 * 10^n or 10 * 10^n + // it is based soley on the range and number of ticks. So if user specifies + // number of ticks, use this. + function bestInterval(range, numberTicks) { + numberTicks = numberTicks || 7; + var minimum = range / (numberTicks - 1); + var magnitude = Math.pow(10, Math.floor(Math.log(minimum) / Math.LN10)); + var residual = minimum / magnitude; + var interval; + // "nicest" ranges are 1, 2, 5 or powers of these. + // for magnitudes below 1, only allow these. + if (magnitude < 1) { + if (residual > 5) { + interval = 10 * magnitude; + } + else if (residual > 2) { + interval = 5 * magnitude; + } + else if (residual > 1) { + interval = 2 * magnitude; + } + else { + interval = magnitude; + } + } + // for large ranges (whole integers), allow intervals like 3, 4 or powers of these. + // this helps a lot with poor choices for number of ticks. + else { + if (residual > 5) { + interval = 10 * magnitude; + } + else if (residual > 4) { + interval = 5 * magnitude; + } + else if (residual > 3) { + interval = 4 * magnitude; + } + else if (residual > 2) { + interval = 3 * magnitude; + } + else if (residual > 1) { + interval = 2 * magnitude; + } + else { + interval = magnitude; + } + } + + return interval; + } + + // This will return an interval of form 2 * 10^n, 5 * 10^n or 10 * 10^n + // it is based soley on the range of data, number of ticks must be computed later. + function bestLinearInterval(range, scalefact) { + scalefact = scalefact || 1; + var expv = Math.floor(Math.log(range)/Math.LN10); + var magnitude = Math.pow(10, expv); + // 0 < f < 10 + var f = range / magnitude; + var fact; + // for large plots, scalefact will decrease f and increase number of ticks. + // for small plots, scalefact will increase f and decrease number of ticks. + f = f/scalefact; + + // for large plots, smaller interval, more ticks. + if (f<=0.38) { + fact = 0.1; + } + else if (f<=1.6) { + fact = 0.2; + } + else if (f<=4.0) { + fact = 0.5; + } + else if (f<=8.0) { + fact = 1.0; + } + // for very small plots, larger interval, less ticks in number ticks + else if (f<=16.0) { + fact = 2; + } + else { + fact = 5; + } + + return fact*magnitude; + } + + function bestLinearComponents(range, scalefact) { + var expv = Math.floor(Math.log(range)/Math.LN10); + var magnitude = Math.pow(10, expv); + // 0 < f < 10 + var f = range / magnitude; + var interval; + var fact; + // for large plots, scalefact will decrease f and increase number of ticks. + // for small plots, scalefact will increase f and decrease number of ticks. + f = f/scalefact; + + // for large plots, smaller interval, more ticks. + if (f<=0.38) { + fact = 0.1; + } + else if (f<=1.6) { + fact = 0.2; + } + else if (f<=4.0) { + fact = 0.5; + } + else if (f<=8.0) { + fact = 1.0; + } + // for very small plots, larger interval, less ticks in number ticks + else if (f<=16.0) { + fact = 2; + } + // else if (f<=20.0) { + // fact = 3; + // } + // else if (f<=24.0) { + // fact = 4; + // } + else { + fact = 5; + } + + interval = fact * magnitude; + + return [interval, fact, magnitude]; + } + + // Given the min and max for a dataset, return suitable endpoints + // for the graphing, a good number for the number of ticks, and a + // format string so that extraneous digits are not displayed. + // returned is an array containing [min, max, nTicks, format] + $.jqplot.LinearTickGenerator = function(axis_min, axis_max, scalefact, numberTicks) { + // if endpoints are equal try to include zero otherwise include one + if (axis_min === axis_max) { + axis_max = (axis_max) ? 0 : 1; + } + + scalefact = scalefact || 1.0; + + // make sure range is positive + if (axis_max < axis_min) { + var a = axis_max; + axis_max = axis_min; + axis_min = a; + } + + var r = []; + var ss = bestLinearInterval(axis_max - axis_min, scalefact); + + if (numberTicks == null) { + + // Figure out the axis min, max and number of ticks + // the min and max will be some multiple of the tick interval, + // 1*10^n, 2*10^n or 5*10^n. This gaurantees that, if the + // axis min is negative, 0 will be a tick. + r[0] = Math.floor(axis_min / ss) * ss; // min + r[1] = Math.ceil(axis_max / ss) * ss; // max + r[2] = Math.round((r[1]-r[0])/ss+1.0); // number of ticks + r[3] = bestFormatString(ss); // format string + r[4] = ss; // tick Interval + } + + else { + var tempr = []; + + // Figure out the axis min, max and number of ticks + // the min and max will be some multiple of the tick interval, + // 1*10^n, 2*10^n or 5*10^n. This gaurantees that, if the + // axis min is negative, 0 will be a tick. + tempr[0] = Math.floor(axis_min / ss) * ss; // min + tempr[1] = Math.ceil(axis_max / ss) * ss; // max + tempr[2] = Math.round((tempr[1]-tempr[0])/ss+1.0); // number of ticks + tempr[3] = bestFormatString(ss); // format string + tempr[4] = ss; // tick Interval + + // first, see if we happen to get the right number of ticks + if (tempr[2] === numberTicks) { + r = tempr; + } + + else { + + var newti = bestInterval(tempr[1] - tempr[0], numberTicks); + + r[0] = tempr[0]; + r[2] = numberTicks; + r[4] = newti; + r[3] = bestFormatString(newti); + r[1] = r[0] + (r[2] - 1) * r[4]; // max + } + } + + return r; + }; + + $.jqplot.LinearTickGenerator.bestLinearInterval = bestLinearInterval; + $.jqplot.LinearTickGenerator.bestInterval = bestInterval; + $.jqplot.LinearTickGenerator.bestLinearComponents = bestLinearComponents; + $.jqplot.LinearTickGenerator.bestConstrainedInterval = bestConstrainedInterval; + + + // class: $.jqplot.MarkerRenderer + // The default jqPlot marker renderer, rendering the points on the line. + $.jqplot.MarkerRenderer = function(options){ + // Group: Properties + + // prop: show + // wether or not to show the marker. + this.show = true; + // prop: style + // One of diamond, circle, square, x, plus, dash, filledDiamond, filledCircle, filledSquare + this.style = 'filledCircle'; + // prop: lineWidth + // size of the line for non-filled markers. + this.lineWidth = 2; + // prop: size + // Size of the marker (diameter or circle, length of edge of square, etc.) + this.size = 9.0; + // prop: color + // color of marker. Will be set to color of series by default on init. + this.color = '#666666'; + // prop: shadow + // wether or not to draw a shadow on the line + this.shadow = true; + // prop: shadowAngle + // Shadow angle in degrees + this.shadowAngle = 45; + // prop: shadowOffset + // Shadow offset from line in pixels + this.shadowOffset = 1; + // prop: shadowDepth + // Number of times shadow is stroked, each stroke offset shadowOffset from the last. + this.shadowDepth = 3; + // prop: shadowAlpha + // Alpha channel transparency of shadow. 0 = transparent. + this.shadowAlpha = '0.07'; + // prop: shadowRenderer + // Renderer that will draws the shadows on the marker. + this.shadowRenderer = new $.jqplot.ShadowRenderer(); + // prop: shapeRenderer + // Renderer that will draw the marker. + this.shapeRenderer = new $.jqplot.ShapeRenderer(); + + $.extend(true, this, options); + }; + + $.jqplot.MarkerRenderer.prototype.init = function(options) { + $.extend(true, this, options); + var sdopt = {angle:this.shadowAngle, offset:this.shadowOffset, alpha:this.shadowAlpha, lineWidth:this.lineWidth, depth:this.shadowDepth, closePath:true}; + if (this.style.indexOf('filled') != -1) { + sdopt.fill = true; + } + if (this.style.indexOf('ircle') != -1) { + sdopt.isarc = true; + sdopt.closePath = false; + } + this.shadowRenderer.init(sdopt); + + var shopt = {fill:false, isarc:false, strokeStyle:this.color, fillStyle:this.color, lineWidth:this.lineWidth, closePath:true}; + if (this.style.indexOf('filled') != -1) { + shopt.fill = true; + } + if (this.style.indexOf('ircle') != -1) { + shopt.isarc = true; + shopt.closePath = false; + } + this.shapeRenderer.init(shopt); + }; + + $.jqplot.MarkerRenderer.prototype.drawDiamond = function(x, y, ctx, fill, options) { + var stretch = 1.2; + var dx = this.size/2/stretch; + var dy = this.size/2*stretch; + var points = [[x-dx, y], [x, y+dy], [x+dx, y], [x, y-dy]]; + if (this.shadow) { + this.shadowRenderer.draw(ctx, points); + } + this.shapeRenderer.draw(ctx, points, options); + }; + + $.jqplot.MarkerRenderer.prototype.drawPlus = function(x, y, ctx, fill, options) { + var stretch = 1.0; + var dx = this.size/2*stretch; + var dy = this.size/2*stretch; + var points1 = [[x, y-dy], [x, y+dy]]; + var points2 = [[x+dx, y], [x-dx, y]]; + var opts = $.extend(true, {}, this.options, {closePath:false}); + if (this.shadow) { + this.shadowRenderer.draw(ctx, points1, {closePath:false}); + this.shadowRenderer.draw(ctx, points2, {closePath:false}); + } + this.shapeRenderer.draw(ctx, points1, opts); + this.shapeRenderer.draw(ctx, points2, opts); + }; + + $.jqplot.MarkerRenderer.prototype.drawX = function(x, y, ctx, fill, options) { + var stretch = 1.0; + var dx = this.size/2*stretch; + var dy = this.size/2*stretch; + var opts = $.extend(true, {}, this.options, {closePath:false}); + var points1 = [[x-dx, y-dy], [x+dx, y+dy]]; + var points2 = [[x-dx, y+dy], [x+dx, y-dy]]; + if (this.shadow) { + this.shadowRenderer.draw(ctx, points1, {closePath:false}); + this.shadowRenderer.draw(ctx, points2, {closePath:false}); + } + this.shapeRenderer.draw(ctx, points1, opts); + this.shapeRenderer.draw(ctx, points2, opts); + }; + + $.jqplot.MarkerRenderer.prototype.drawDash = function(x, y, ctx, fill, options) { + var stretch = 1.0; + var dx = this.size/2*stretch; + var dy = this.size/2*stretch; + var points = [[x-dx, y], [x+dx, y]]; + if (this.shadow) { + this.shadowRenderer.draw(ctx, points); + } + this.shapeRenderer.draw(ctx, points, options); + }; + + $.jqplot.MarkerRenderer.prototype.drawLine = function(p1, p2, ctx, fill, options) { + var points = [p1, p2]; + if (this.shadow) { + this.shadowRenderer.draw(ctx, points); + } + this.shapeRenderer.draw(ctx, points, options); + }; + + $.jqplot.MarkerRenderer.prototype.drawSquare = function(x, y, ctx, fill, options) { + var stretch = 1.0; + var dx = this.size/2/stretch; + var dy = this.size/2*stretch; + var points = [[x-dx, y-dy], [x-dx, y+dy], [x+dx, y+dy], [x+dx, y-dy]]; + if (this.shadow) { + this.shadowRenderer.draw(ctx, points); + } + this.shapeRenderer.draw(ctx, points, options); + }; + + $.jqplot.MarkerRenderer.prototype.drawCircle = function(x, y, ctx, fill, options) { + var radius = this.size/2; + var end = 2*Math.PI; + var points = [x, y, radius, 0, end, true]; + if (this.shadow) { + this.shadowRenderer.draw(ctx, points); + } + this.shapeRenderer.draw(ctx, points, options); + }; + + $.jqplot.MarkerRenderer.prototype.draw = function(x, y, ctx, options) { + options = options || {}; + // hack here b/c shape renderer uses canvas based color style options + // and marker uses css style names. + if (options.show == null || options.show != false) { + if (options.color && !options.fillStyle) { + options.fillStyle = options.color; + } + if (options.color && !options.strokeStyle) { + options.strokeStyle = options.color; + } + switch (this.style) { + case 'diamond': + this.drawDiamond(x,y,ctx, false, options); + break; + case 'filledDiamond': + this.drawDiamond(x,y,ctx, true, options); + break; + case 'circle': + this.drawCircle(x,y,ctx, false, options); + break; + case 'filledCircle': + this.drawCircle(x,y,ctx, true, options); + break; + case 'square': + this.drawSquare(x,y,ctx, false, options); + break; + case 'filledSquare': + this.drawSquare(x,y,ctx, true, options); + break; + case 'x': + this.drawX(x,y,ctx, true, options); + break; + case 'plus': + this.drawPlus(x,y,ctx, true, options); + break; + case 'dash': + this.drawDash(x,y,ctx, true, options); + break; + case 'line': + this.drawLine(x, y, ctx, false, options); + break; + default: + this.drawDiamond(x,y,ctx, false, options); + break; + } + } + }; + + // class: $.jqplot.shadowRenderer + // The default jqPlot shadow renderer, rendering shadows behind shapes. + $.jqplot.ShadowRenderer = function(options){ + // Group: Properties + + // prop: angle + // Angle of the shadow in degrees. Measured counter-clockwise from the x axis. + this.angle = 45; + // prop: offset + // Pixel offset at the given shadow angle of each shadow stroke from the last stroke. + this.offset = 1; + // prop: alpha + // alpha transparency of shadow stroke. + this.alpha = 0.07; + // prop: lineWidth + // width of the shadow line stroke. + this.lineWidth = 1.5; + // prop: lineJoin + // How line segments of the shadow are joined. + this.lineJoin = 'miter'; + // prop: lineCap + // how ends of the shadow line are rendered. + this.lineCap = 'round'; + // prop; closePath + // whether line path segment is closed upon itself. + this.closePath = false; + // prop: fill + // whether to fill the shape. + this.fill = false; + // prop: depth + // how many times the shadow is stroked. Each stroke will be offset by offset at angle degrees. + this.depth = 3; + this.strokeStyle = 'rgba(0,0,0,0.1)'; + // prop: isarc + // wether the shadow is an arc or not. + this.isarc = false; + + $.extend(true, this, options); + }; + + $.jqplot.ShadowRenderer.prototype.init = function(options) { + $.extend(true, this, options); + }; + + // function: draw + // draws an transparent black (i.e. gray) shadow. + // + // ctx - canvas drawing context + // points - array of points or [x, y, radius, start angle (rad), end angle (rad)] + $.jqplot.ShadowRenderer.prototype.draw = function(ctx, points, options) { + ctx.save(); + var opts = (options != null) ? options : {}; + var fill = (opts.fill != null) ? opts.fill : this.fill; + var fillRect = (opts.fillRect != null) ? opts.fillRect : this.fillRect; + var closePath = (opts.closePath != null) ? opts.closePath : this.closePath; + var offset = (opts.offset != null) ? opts.offset : this.offset; + var alpha = (opts.alpha != null) ? opts.alpha : this.alpha; + var depth = (opts.depth != null) ? opts.depth : this.depth; + var isarc = (opts.isarc != null) ? opts.isarc : this.isarc; + var linePattern = (opts.linePattern != null) ? opts.linePattern : this.linePattern; + ctx.lineWidth = (opts.lineWidth != null) ? opts.lineWidth : this.lineWidth; + ctx.lineJoin = (opts.lineJoin != null) ? opts.lineJoin : this.lineJoin; + ctx.lineCap = (opts.lineCap != null) ? opts.lineCap : this.lineCap; + ctx.strokeStyle = opts.strokeStyle || this.strokeStyle || 'rgba(0,0,0,'+alpha+')'; + ctx.fillStyle = opts.fillStyle || this.fillStyle || 'rgba(0,0,0,'+alpha+')'; + for (var j=0; j<depth; j++) { + var ctxPattern = $.jqplot.LinePattern(ctx, linePattern); + ctx.translate(Math.cos(this.angle*Math.PI/180)*offset, Math.sin(this.angle*Math.PI/180)*offset); + ctxPattern.beginPath(); + if (isarc) { + ctx.arc(points[0], points[1], points[2], points[3], points[4], true); + } + else if (fillRect) { + if (fillRect) { + ctx.fillRect(points[0], points[1], points[2], points[3]); + } + } + else if (points && points.length){ + var move = true; + for (var i=0; i<points.length; i++) { + // skip to the first non-null point and move to it. + if (points[i][0] != null && points[i][1] != null) { + if (move) { + ctxPattern.moveTo(points[i][0], points[i][1]); + move = false; + } + else { + ctxPattern.lineTo(points[i][0], points[i][1]); + } + } + else { + move = true; + } + } + + } + if (closePath) { + ctxPattern.closePath(); + } + if (fill) { + ctx.fill(); + } + else { + ctx.stroke(); + } + } + ctx.restore(); + }; + + // class: $.jqplot.shapeRenderer + // The default jqPlot shape renderer. Given a set of points will + // plot them and either stroke a line (fill = false) or fill them (fill = true). + // If a filled shape is desired, closePath = true must also be set to close + // the shape. + $.jqplot.ShapeRenderer = function(options){ + + this.lineWidth = 1.5; + // prop: linePattern + // line pattern 'dashed', 'dotted', 'solid', some combination + // of '-' and '.' characters such as '.-.' or a numerical array like + // [draw, skip, draw, skip, ...] such as [1, 10] to draw a dotted line, + // [1, 10, 20, 10] to draw a dot-dash line, and so on. + this.linePattern = 'solid'; + // prop: lineJoin + // How line segments of the shadow are joined. + this.lineJoin = 'miter'; + // prop: lineCap + // how ends of the shadow line are rendered. + this.lineCap = 'round'; + // prop; closePath + // whether line path segment is closed upon itself. + this.closePath = false; + // prop: fill + // whether to fill the shape. + this.fill = false; + // prop: isarc + // wether the shadow is an arc or not. + this.isarc = false; + // prop: fillRect + // true to draw shape as a filled rectangle. + this.fillRect = false; + // prop: strokeRect + // true to draw shape as a stroked rectangle. + this.strokeRect = false; + // prop: clearRect + // true to cear a rectangle. + this.clearRect = false; + // prop: strokeStyle + // css color spec for the stoke style + this.strokeStyle = '#999999'; + // prop: fillStyle + // css color spec for the fill style. + this.fillStyle = '#999999'; + + $.extend(true, this, options); + }; + + $.jqplot.ShapeRenderer.prototype.init = function(options) { + $.extend(true, this, options); + }; + + // function: draw + // draws the shape. + // + // ctx - canvas drawing context + // points - array of points for shapes or + // [x, y, width, height] for rectangles or + // [x, y, radius, start angle (rad), end angle (rad)] for circles and arcs. + $.jqplot.ShapeRenderer.prototype.draw = function(ctx, points, options) { + ctx.save(); + var opts = (options != null) ? options : {}; + var fill = (opts.fill != null) ? opts.fill : this.fill; + var closePath = (opts.closePath != null) ? opts.closePath : this.closePath; + var fillRect = (opts.fillRect != null) ? opts.fillRect : this.fillRect; + var strokeRect = (opts.strokeRect != null) ? opts.strokeRect : this.strokeRect; + var clearRect = (opts.clearRect != null) ? opts.clearRect : this.clearRect; + var isarc = (opts.isarc != null) ? opts.isarc : this.isarc; + var linePattern = (opts.linePattern != null) ? opts.linePattern : this.linePattern; + var ctxPattern = $.jqplot.LinePattern(ctx, linePattern); + ctx.lineWidth = opts.lineWidth || this.lineWidth; + ctx.lineJoin = opts.lineJoin || this.lineJoin; + ctx.lineCap = opts.lineCap || this.lineCap; + ctx.strokeStyle = (opts.strokeStyle || opts.color) || this.strokeStyle; + ctx.fillStyle = opts.fillStyle || this.fillStyle; + ctx.beginPath(); + if (isarc) { + ctx.arc(points[0], points[1], points[2], points[3], points[4], true); + if (closePath) { + ctx.closePath(); + } + if (fill) { + ctx.fill(); + } + else { + ctx.stroke(); + } + ctx.restore(); + return; + } + else if (clearRect) { + ctx.clearRect(points[0], points[1], points[2], points[3]); + ctx.restore(); + return; + } + else if (fillRect || strokeRect) { + if (fillRect) { + ctx.fillRect(points[0], points[1], points[2], points[3]); + } + if (strokeRect) { + ctx.strokeRect(points[0], points[1], points[2], points[3]); + ctx.restore(); + return; + } + } + else if (points && points.length){ + var move = true; + for (var i=0; i<points.length; i++) { + // skip to the first non-null point and move to it. + if (points[i][0] != null && points[i][1] != null) { + if (move) { + ctxPattern.moveTo(points[i][0], points[i][1]); + move = false; + } + else { + ctxPattern.lineTo(points[i][0], points[i][1]); + } + } + else { + move = true; + } + } + if (closePath) { + ctxPattern.closePath(); + } + if (fill) { + ctx.fill(); + } + else { + ctx.stroke(); + } + } + ctx.restore(); + }; + + // class $.jqplot.TableLegendRenderer + // The default legend renderer for jqPlot. + $.jqplot.TableLegendRenderer = function(){ + // + }; + + $.jqplot.TableLegendRenderer.prototype.init = function(options) { + $.extend(true, this, options); + }; + + $.jqplot.TableLegendRenderer.prototype.addrow = function (label, color, pad, reverse) { + var rs = (pad) ? this.rowSpacing+'px' : '0px'; + var tr; + var td; + var elem; + var div0; + var div1; + elem = document.createElement('tr'); + tr = $(elem); + tr.addClass('jqplot-table-legend'); + elem = null; + + if (reverse){ + tr.prependTo(this._elem); + } + + else{ + tr.appendTo(this._elem); + } + + if (this.showSwatches) { + td = $(document.createElement('td')); + td.addClass('jqplot-table-legend jqplot-table-legend-swatch'); + td.css({textAlign: 'center', paddingTop: rs}); + + div0 = $(document.createElement('div')); + div0.addClass('jqplot-table-legend-swatch-outline'); + div1 = $(document.createElement('div')); + div1.addClass('jqplot-table-legend-swatch'); + div1.css({backgroundColor: color, borderColor: color}); + + tr.append(td.append(div0.append(div1))); + + // $('<td class="jqplot-table-legend" style="text-align:center;padding-top:'+rs+';">'+ + // '<div><div class="jqplot-table-legend-swatch" style="background-color:'+color+';border-color:'+color+';"></div>'+ + // '</div></td>').appendTo(tr); + } + if (this.showLabels) { + td = $(document.createElement('td')); + td.addClass('jqplot-table-legend jqplot-table-legend-label'); + td.css('paddingTop', rs); + tr.append(td); + + // elem = $('<td class="jqplot-table-legend" style="padding-top:'+rs+';"></td>'); + // elem.appendTo(tr); + if (this.escapeHtml) { + td.text(label); + } + else { + td.html(label); + } + } + td = null; + div0 = null; + div1 = null; + tr = null; + elem = null; + }; + + // called with scope of legend + $.jqplot.TableLegendRenderer.prototype.draw = function() { + if (this._elem) { + this._elem.emptyForce(); + this._elem = null; + } + + if (this.show) { + var series = this._series; + // make a table. one line label per row. + var elem = document.createElement('table'); + this._elem = $(elem); + this._elem.addClass('jqplot-table-legend'); + + var ss = {position:'absolute'}; + if (this.background) { + ss['background'] = this.background; + } + if (this.border) { + ss['border'] = this.border; + } + if (this.fontSize) { + ss['fontSize'] = this.fontSize; + } + if (this.fontFamily) { + ss['fontFamily'] = this.fontFamily; + } + if (this.textColor) { + ss['textColor'] = this.textColor; + } + if (this.marginTop != null) { + ss['marginTop'] = this.marginTop; + } + if (this.marginBottom != null) { + ss['marginBottom'] = this.marginBottom; + } + if (this.marginLeft != null) { + ss['marginLeft'] = this.marginLeft; + } + if (this.marginRight != null) { + ss['marginRight'] = this.marginRight; + } + + + var pad = false, + reverse = false, + s; + for (var i = 0; i< series.length; i++) { + s = series[i]; + if (s._stack || s.renderer.constructor == $.jqplot.BezierCurveRenderer){ + reverse = true; + } + if (s.show && s.showLabel) { + var lt = this.labels[i] || s.label.toString(); + if (lt) { + var color = s.color; + if (reverse && i < series.length - 1){ + pad = true; + } + else if (reverse && i == series.length - 1){ + pad = false; + } + this.renderer.addrow.call(this, lt, color, pad, reverse); + pad = true; + } + // let plugins add more rows to legend. Used by trend line plugin. + for (var j=0; j<$.jqplot.addLegendRowHooks.length; j++) { + var item = $.jqplot.addLegendRowHooks[j].call(this, s); + if (item) { + this.renderer.addrow.call(this, item.label, item.color, pad); + pad = true; + } + } + lt = null; + } + } + } + return this._elem; + }; + + $.jqplot.TableLegendRenderer.prototype.pack = function(offsets) { + if (this.show) { + if (this.placement == 'insideGrid') { + switch (this.location) { + case 'nw': + var a = offsets.left; + var b = offsets.top; + this._elem.css('left', a); + this._elem.css('top', b); + break; + case 'n': + var a = (offsets.left + (this._plotDimensions.width - offsets.right))/2 - this.getWidth()/2; + var b = offsets.top; + this._elem.css('left', a); + this._elem.css('top', b); + break; + case 'ne': + var a = offsets.right; + var b = offsets.top; + this._elem.css({right:a, top:b}); + break; + case 'e': + var a = offsets.right; + var b = (offsets.top + (this._plotDimensions.height - offsets.bottom))/2 - this.getHeight()/2; + this._elem.css({right:a, top:b}); + break; + case 'se': + var a = offsets.right; + var b = offsets.bottom; + this._elem.css({right:a, bottom:b}); + break; + case 's': + var a = (offsets.left + (this._plotDimensions.width - offsets.right))/2 - this.getWidth()/2; + var b = offsets.bottom; + this._elem.css({left:a, bottom:b}); + break; + case 'sw': + var a = offsets.left; + var b = offsets.bottom; + this._elem.css({left:a, bottom:b}); + break; + case 'w': + var a = offsets.left; + var b = (offsets.top + (this._plotDimensions.height - offsets.bottom))/2 - this.getHeight()/2; + this._elem.css({left:a, top:b}); + break; + default: // same as 'se' + var a = offsets.right; + var b = offsets.bottom; + this._elem.css({right:a, bottom:b}); + break; + } + + } + else if (this.placement == 'outside'){ + switch (this.location) { + case 'nw': + var a = this._plotDimensions.width - offsets.left; + var b = offsets.top; + this._elem.css('right', a); + this._elem.css('top', b); + break; + case 'n': + var a = (offsets.left + (this._plotDimensions.width - offsets.right))/2 - this.getWidth()/2; + var b = this._plotDimensions.height - offsets.top; + this._elem.css('left', a); + this._elem.css('bottom', b); + break; + case 'ne': + var a = this._plotDimensions.width - offsets.right; + var b = offsets.top; + this._elem.css({left:a, top:b}); + break; + case 'e': + var a = this._plotDimensions.width - offsets.right; + var b = (offsets.top + (this._plotDimensions.height - offsets.bottom))/2 - this.getHeight()/2; + this._elem.css({left:a, top:b}); + break; + case 'se': + var a = this._plotDimensions.width - offsets.right; + var b = offsets.bottom; + this._elem.css({left:a, bottom:b}); + break; + case 's': + var a = (offsets.left + (this._plotDimensions.width - offsets.right))/2 - this.getWidth()/2; + var b = this._plotDimensions.height - offsets.bottom; + this._elem.css({left:a, top:b}); + break; + case 'sw': + var a = this._plotDimensions.width - offsets.left; + var b = offsets.bottom; + this._elem.css({right:a, bottom:b}); + break; + case 'w': + var a = this._plotDimensions.width - offsets.left; + var b = (offsets.top + (this._plotDimensions.height - offsets.bottom))/2 - this.getHeight()/2; + this._elem.css({right:a, top:b}); + break; + default: // same as 'se' + var a = offsets.right; + var b = offsets.bottom; + this._elem.css({right:a, bottom:b}); + break; + } + } + else { + switch (this.location) { + case 'nw': + this._elem.css({left:0, top:offsets.top}); + break; + case 'n': + var a = (offsets.left + (this._plotDimensions.width - offsets.right))/2 - this.getWidth()/2; + this._elem.css({left: a, top:offsets.top}); + break; + case 'ne': + this._elem.css({right:0, top:offsets.top}); + break; + case 'e': + var b = (offsets.top + (this._plotDimensions.height - offsets.bottom))/2 - this.getHeight()/2; + this._elem.css({right:offsets.right, top:b}); + break; + case 'se': + this._elem.css({right:offsets.right, bottom:offsets.bottom}); + break; + case 's': + var a = (offsets.left + (this._plotDimensions.width - offsets.right))/2 - this.getWidth()/2; + this._elem.css({left: a, bottom:offsets.bottom}); + break; + case 'sw': + this._elem.css({left:offsets.left, bottom:offsets.bottom}); + break; + case 'w': + var b = (offsets.top + (this._plotDimensions.height - offsets.bottom))/2 - this.getHeight()/2; + this._elem.css({left:offsets.left, top:b}); + break; + default: // same as 'se' + this._elem.css({right:offsets.right, bottom:offsets.bottom}); + break; + } + } + } + }; + + /** + * Class: $.jqplot.ThemeEngine + * Theme Engine provides a programatic way to change some of the more + * common jqplot styling options such as fonts, colors and grid options. + * A theme engine instance is created with each plot. The theme engine + * manages a collection of themes which can be modified, added to, or + * applied to the plot. + * + * The themeEngine class is not instantiated directly. + * When a plot is initialized, the current plot options are scanned + * an a default theme named "Default" is created. This theme is + * used as the basis for other themes added to the theme engine and + * is always available. + * + * A theme is a simple javascript object with styling parameters for + * various entities of the plot. A theme has the form: + * + * + * > { + * > _name:f "Default", + * > target: { + * > backgroundColor: "transparent" + * > }, + * > legend: { + * > textColor: null, + * > fontFamily: null, + * > fontSize: null, + * > border: null, + * > background: null + * > }, + * > title: { + * > textColor: "rgb(102, 102, 102)", + * > fontFamily: "'Trebuchet MS',Arial,Helvetica,sans-serif", + * > fontSize: "19.2px", + * > textAlign: "center" + * > }, + * > seriesStyles: {}, + * > series: [{ + * > color: "#4bb2c5", + * > lineWidth: 2.5, + * > linePattern: "solid", + * > shadow: true, + * > fillColor: "#4bb2c5", + * > showMarker: true, + * > markerOptions: { + * > color: "#4bb2c5", + * > show: true, + * > style: 'filledCircle', + * > lineWidth: 1.5, + * > size: 4, + * > shadow: true + * > } + * > }], + * > grid: { + * > drawGridlines: true, + * > gridLineColor: "#cccccc", + * > gridLineWidth: 1, + * > backgroundColor: "#fffdf6", + * > borderColor: "#999999", + * > borderWidth: 2, + * > shadow: true + * > }, + * > axesStyles: { + * > label: {}, + * > ticks: {} + * > }, + * > axes: { + * > xaxis: { + * > borderColor: "#999999", + * > borderWidth: 2, + * > ticks: { + * > show: true, + * > showGridline: true, + * > showLabel: true, + * > showMark: true, + * > size: 4, + * > textColor: "", + * > whiteSpace: "nowrap", + * > fontSize: "12px", + * > fontFamily: "'Trebuchet MS',Arial,Helvetica,sans-serif" + * > }, + * > label: { + * > textColor: "rgb(102, 102, 102)", + * > whiteSpace: "normal", + * > fontSize: "14.6667px", + * > fontFamily: "'Trebuchet MS',Arial,Helvetica,sans-serif", + * > fontWeight: "400" + * > } + * > }, + * > yaxis: { + * > borderColor: "#999999", + * > borderWidth: 2, + * > ticks: { + * > show: true, + * > showGridline: true, + * > showLabel: true, + * > showMark: true, + * > size: 4, + * > textColor: "", + * > whiteSpace: "nowrap", + * > fontSize: "12px", + * > fontFamily: "'Trebuchet MS',Arial,Helvetica,sans-serif" + * > }, + * > label: { + * > textColor: null, + * > whiteSpace: null, + * > fontSize: null, + * > fontFamily: null, + * > fontWeight: null + * > } + * > }, + * > x2axis: {... + * > }, + * > ... + * > y9axis: {... + * > } + * > } + * > } + * + * "seriesStyles" is a style object that will be applied to all series in the plot. + * It will forcibly override any styles applied on the individual series. "axesStyles" is + * a style object that will be applied to all axes in the plot. It will also forcibly + * override any styles on the individual axes. + * + * The example shown above has series options for a line series. Options for other + * series types are shown below: + * + * Bar Series: + * + * > { + * > color: "#4bb2c5", + * > seriesColors: ["#4bb2c5", "#EAA228", "#c5b47f", "#579575", "#839557", "#958c12", "#953579", "#4b5de4", "#d8b83f", "#ff5800", "#0085cc", "#c747a3", "#cddf54", "#FBD178", "#26B4E3", "#bd70c7"], + * > lineWidth: 2.5, + * > shadow: true, + * > barPadding: 2, + * > barMargin: 10, + * > barWidth: 15.09375, + * > highlightColors: ["rgb(129,201,214)", "rgb(129,201,214)", "rgb(129,201,214)", "rgb(129,201,214)", "rgb(129,201,214)", "rgb(129,201,214)", "rgb(129,201,214)", "rgb(129,201,214)"] + * > } + * + * Pie Series: + * + * > { + * > seriesColors: ["#4bb2c5", "#EAA228", "#c5b47f", "#579575", "#839557", "#958c12", "#953579", "#4b5de4", "#d8b83f", "#ff5800", "#0085cc", "#c747a3", "#cddf54", "#FBD178", "#26B4E3", "#bd70c7"], + * > padding: 20, + * > sliceMargin: 0, + * > fill: true, + * > shadow: true, + * > startAngle: 0, + * > lineWidth: 2.5, + * > highlightColors: ["rgb(129,201,214)", "rgb(240,189,104)", "rgb(214,202,165)", "rgb(137,180,158)", "rgb(168,180,137)", "rgb(180,174,89)", "rgb(180,113,161)", "rgb(129,141,236)", "rgb(227,205,120)", "rgb(255,138,76)", "rgb(76,169,219)", "rgb(215,126,190)", "rgb(220,232,135)", "rgb(200,167,96)", "rgb(103,202,235)", "rgb(208,154,215)"] + * > } + * + * Funnel Series: + * + * > { + * > color: "#4bb2c5", + * > lineWidth: 2, + * > shadow: true, + * > padding: { + * > top: 20, + * > right: 20, + * > bottom: 20, + * > left: 20 + * > }, + * > sectionMargin: 6, + * > seriesColors: ["#4bb2c5", "#EAA228", "#c5b47f", "#579575", "#839557", "#958c12", "#953579", "#4b5de4", "#d8b83f", "#ff5800", "#0085cc", "#c747a3", "#cddf54", "#FBD178", "#26B4E3", "#bd70c7"], + * > highlightColors: ["rgb(147,208,220)", "rgb(242,199,126)", "rgb(220,210,178)", "rgb(154,191,172)", "rgb(180,191,154)", "rgb(191,186,112)", "rgb(191,133,174)", "rgb(147,157,238)", "rgb(231,212,139)", "rgb(255,154,102)", "rgb(102,181,224)", "rgb(221,144,199)", "rgb(225,235,152)", "rgb(200,167,96)", "rgb(124,210,238)", "rgb(215,169,221)"] + * > } + * + */ + $.jqplot.ThemeEngine = function(){ + // Group: Properties + // + // prop: themes + // hash of themes managed by the theme engine. + // Indexed by theme name. + this.themes = {}; + // prop: activeTheme + // Pointer to currently active theme + this.activeTheme=null; + + }; + + // called with scope of plot + $.jqplot.ThemeEngine.prototype.init = function() { + // get the Default theme from the current plot settings. + var th = new $.jqplot.Theme({_name:'Default'}); + var n, i, nn; + + for (n in th.target) { + if (n == "textColor") { + th.target[n] = this.target.css('color'); + } + else { + th.target[n] = this.target.css(n); + } + } + + if (this.title.show && this.title._elem) { + for (n in th.title) { + if (n == "textColor") { + th.title[n] = this.title._elem.css('color'); + } + else { + th.title[n] = this.title._elem.css(n); + } + } + } + + for (n in th.grid) { + th.grid[n] = this.grid[n]; + } + if (th.grid.backgroundColor == null && this.grid.background != null) { + th.grid.backgroundColor = this.grid.background; + } + if (this.legend.show && this.legend._elem) { + for (n in th.legend) { + if (n == 'textColor') { + th.legend[n] = this.legend._elem.css('color'); + } + else { + th.legend[n] = this.legend._elem.css(n); + } + } + } + var s; + + for (i=0; i<this.series.length; i++) { + s = this.series[i]; + if (s.renderer.constructor == $.jqplot.LineRenderer) { + th.series.push(new LineSeriesProperties()); + } + else if (s.renderer.constructor == $.jqplot.BarRenderer) { + th.series.push(new BarSeriesProperties()); + } + else if (s.renderer.constructor == $.jqplot.PieRenderer) { + th.series.push(new PieSeriesProperties()); + } + else if (s.renderer.constructor == $.jqplot.DonutRenderer) { + th.series.push(new DonutSeriesProperties()); + } + else if (s.renderer.constructor == $.jqplot.FunnelRenderer) { + th.series.push(new FunnelSeriesProperties()); + } + else if (s.renderer.constructor == $.jqplot.MeterGaugeRenderer) { + th.series.push(new MeterSeriesProperties()); + } + else { + th.series.push({}); + } + for (n in th.series[i]) { + th.series[i][n] = s[n]; + } + } + var a, ax; + for (n in this.axes) { + ax = this.axes[n]; + a = th.axes[n] = new AxisProperties(); + a.borderColor = ax.borderColor; + a.borderWidth = ax.borderWidth; + if (ax._ticks && ax._ticks[0]) { + for (nn in a.ticks) { + if (ax._ticks[0].hasOwnProperty(nn)) { + a.ticks[nn] = ax._ticks[0][nn]; + } + else if (ax._ticks[0]._elem){ + a.ticks[nn] = ax._ticks[0]._elem.css(nn); + } + } + } + if (ax._label && ax._label.show) { + for (nn in a.label) { + // a.label[nn] = ax._label._elem.css(nn); + if (ax._label[nn]) { + a.label[nn] = ax._label[nn]; + } + else if (ax._label._elem){ + if (nn == 'textColor') { + a.label[nn] = ax._label._elem.css('color'); + } + else { + a.label[nn] = ax._label._elem.css(nn); + } + } + } + } + } + this.themeEngine._add(th); + this.themeEngine.activeTheme = this.themeEngine.themes[th._name]; + }; + /** + * Group: methods + * + * method: get + * + * Get and return the named theme or the active theme if no name given. + * + * parameter: + * + * name - name of theme to get. + * + * returns: + * + * Theme instance of given name. + */ + $.jqplot.ThemeEngine.prototype.get = function(name) { + if (!name) { + // return the active theme + return this.activeTheme; + } + else { + return this.themes[name]; + } + }; + + function numericalOrder(a,b) { return a-b; } + + /** + * method: getThemeNames + * + * Return the list of theme names in this manager in alpha-numerical order. + * + * parameter: + * + * None + * + * returns: + * + * A the list of theme names in this manager in alpha-numerical order. + */ + $.jqplot.ThemeEngine.prototype.getThemeNames = function() { + var tn = []; + for (var n in this.themes) { + tn.push(n); + } + return tn.sort(numericalOrder); + }; + + /** + * method: getThemes + * + * Return a list of themes in alpha-numerical order by name. + * + * parameter: + * + * None + * + * returns: + * + * A list of themes in alpha-numerical order by name. + */ + $.jqplot.ThemeEngine.prototype.getThemes = function() { + var tn = []; + var themes = []; + for (var n in this.themes) { + tn.push(n); + } + tn.sort(numericalOrder); + for (var i=0; i<tn.length; i++) { + themes.push(this.themes[tn[i]]); + } + return themes; + }; + + $.jqplot.ThemeEngine.prototype.activate = function(plot, name) { + // sometimes need to redraw whole plot. + var redrawPlot = false; + if (!name && this.activeTheme && this.activeTheme._name) { + name = this.activeTheme._name; + } + if (!this.themes.hasOwnProperty(name)) { + throw new Error("No theme of that name"); + } + else { + var th = this.themes[name]; + this.activeTheme = th; + var val, checkBorderColor = false, checkBorderWidth = false; + var arr = ['xaxis', 'x2axis', 'yaxis', 'y2axis']; + + for (i=0; i<arr.length; i++) { + var ax = arr[i]; + if (th.axesStyles.borderColor != null) { + plot.axes[ax].borderColor = th.axesStyles.borderColor; + } + if (th.axesStyles.borderWidth != null) { + plot.axes[ax].borderWidth = th.axesStyles.borderWidth; + } + } + + for (var axname in plot.axes) { + var axis = plot.axes[axname]; + if (axis.show) { + var thaxis = th.axes[axname] || {}; + var thaxstyle = th.axesStyles; + var thax = $.jqplot.extend(true, {}, thaxis, thaxstyle); + val = (th.axesStyles.borderColor != null) ? th.axesStyles.borderColor : thax.borderColor; + if (thax.borderColor != null) { + axis.borderColor = thax.borderColor; + redrawPlot = true; + } + val = (th.axesStyles.borderWidth != null) ? th.axesStyles.borderWidth : thax.borderWidth; + if (thax.borderWidth != null) { + axis.borderWidth = thax.borderWidth; + redrawPlot = true; + } + if (axis._ticks && axis._ticks[0]) { + for (var nn in thax.ticks) { + // val = null; + // if (th.axesStyles.ticks && th.axesStyles.ticks[nn] != null) { + // val = th.axesStyles.ticks[nn]; + // } + // else if (thax.ticks[nn] != null){ + // val = thax.ticks[nn] + // } + val = thax.ticks[nn]; + if (val != null) { + axis.tickOptions[nn] = val; + axis._ticks = []; + redrawPlot = true; + } + } + } + if (axis._label && axis._label.show) { + for (var nn in thax.label) { + // val = null; + // if (th.axesStyles.label && th.axesStyles.label[nn] != null) { + // val = th.axesStyles.label[nn]; + // } + // else if (thax.label && thax.label[nn] != null){ + // val = thax.label[nn] + // } + val = thax.label[nn]; + if (val != null) { + axis.labelOptions[nn] = val; + redrawPlot = true; + } + } + } + + } + } + + for (var n in th.grid) { + if (th.grid[n] != null) { + plot.grid[n] = th.grid[n]; + } + } + if (!redrawPlot) { + plot.grid.draw(); + } + + if (plot.legend.show) { + for (n in th.legend) { + if (th.legend[n] != null) { + plot.legend[n] = th.legend[n]; + } + } + } + if (plot.title.show) { + for (n in th.title) { + if (th.title[n] != null) { + plot.title[n] = th.title[n]; + } + } + } + + var i; + for (i=0; i<th.series.length; i++) { + var opts = {}; + var redrawSeries = false; + for (n in th.series[i]) { + val = (th.seriesStyles[n] != null) ? th.seriesStyles[n] : th.series[i][n]; + if (val != null) { + opts[n] = val; + if (n == 'color') { + plot.series[i].renderer.shapeRenderer.fillStyle = val; + plot.series[i].renderer.shapeRenderer.strokeStyle = val; + plot.series[i][n] = val; + } + else if ((n == 'lineWidth') || (n == 'linePattern')) { + plot.series[i].renderer.shapeRenderer[n] = val; + plot.series[i][n] = val; + } + else if (n == 'markerOptions') { + merge (plot.series[i].markerOptions, val); + merge (plot.series[i].markerRenderer, val); + } + else { + plot.series[i][n] = val; + } + redrawPlot = true; + } + } + } + + if (redrawPlot) { + plot.target.empty(); + plot.draw(); + } + + for (n in th.target) { + if (th.target[n] != null) { + plot.target.css(n, th.target[n]); + } + } + } + + }; + + $.jqplot.ThemeEngine.prototype._add = function(theme, name) { + if (name) { + theme._name = name; + } + if (!theme._name) { + theme._name = Date.parse(new Date()); + } + if (!this.themes.hasOwnProperty(theme._name)) { + this.themes[theme._name] = theme; + } + else { + throw new Error("jqplot.ThemeEngine Error: Theme already in use"); + } + }; + + // method remove + // Delete the named theme, return true on success, false on failure. + + + /** + * method: remove + * + * Remove the given theme from the themeEngine. + * + * parameters: + * + * name - name of the theme to remove. + * + * returns: + * + * true on success, false on failure. + */ + $.jqplot.ThemeEngine.prototype.remove = function(name) { + if (name == 'Default') { + return false; + } + return delete this.themes[name]; + }; + + /** + * method: newTheme + * + * Create a new theme based on the default theme, adding it the themeEngine. + * + * parameters: + * + * name - name of the new theme. + * obj - optional object of styles to be applied to this new theme. + * + * returns: + * + * new Theme object. + */ + $.jqplot.ThemeEngine.prototype.newTheme = function(name, obj) { + if (typeof(name) == 'object') { + obj = obj || name; + name = null; + } + if (obj && obj._name) { + name = obj._name; + } + else { + name = name || Date.parse(new Date()); + } + // var th = new $.jqplot.Theme(name); + var th = this.copy(this.themes['Default']._name, name); + $.jqplot.extend(th, obj); + return th; + }; + + // function clone(obj) { + // return eval(obj.toSource()); + // } + + function clone(obj){ + if(obj == null || typeof(obj) != 'object'){ + return obj; + } + + var temp = new obj.constructor(); + for(var key in obj){ + temp[key] = clone(obj[key]); + } + return temp; + } + + $.jqplot.clone = clone; + + function merge(obj1, obj2) { + if (obj2 == null || typeof(obj2) != 'object') { + return; + } + for (var key in obj2) { + if (key == 'highlightColors') { + obj1[key] = clone(obj2[key]); + } + if (obj2[key] != null && typeof(obj2[key]) == 'object') { + if (!obj1.hasOwnProperty(key)) { + obj1[key] = {}; + } + merge(obj1[key], obj2[key]); + } + else { + obj1[key] = obj2[key]; + } + } + } + + $.jqplot.merge = merge; + + // Use the jQuery 1.3.2 extend function since behaviour in jQuery 1.4 seems problematic + $.jqplot.extend = function() { + // copy reference to target object + var target = arguments[0] || {}, i = 1, length = arguments.length, deep = false, options; + + // Handle a deep copy situation + if ( typeof target === "boolean" ) { + deep = target; + target = arguments[1] || {}; + // skip the boolean and the target + i = 2; + } + + // Handle case when target is a string or something (possible in deep copy) + if ( typeof target !== "object" && !toString.call(target) === "[object Function]" ) { + target = {}; + } + + for ( ; i < length; i++ ){ + // Only deal with non-null/undefined values + if ( (options = arguments[ i ]) != null ) { + // Extend the base object + for ( var name in options ) { + var src = target[ name ], copy = options[ name ]; + + // Prevent never-ending loop + if ( target === copy ) { + continue; + } + + // Recurse if we're merging object values + if ( deep && copy && typeof copy === "object" && !copy.nodeType ) { + target[ name ] = $.jqplot.extend( deep, + // Never move original objects, clone them + src || ( copy.length != null ? [ ] : { } ) + , copy ); + } + // Don't bring in undefined values + else if ( copy !== undefined ) { + target[ name ] = copy; + } + } + } + } + // Return the modified object + return target; + }; + + /** + * method: rename + * + * Rename a theme. + * + * parameters: + * + * oldName - current name of the theme. + * newName - desired name of the theme. + * + * returns: + * + * new Theme object. + */ + $.jqplot.ThemeEngine.prototype.rename = function (oldName, newName) { + if (oldName == 'Default' || newName == 'Default') { + throw new Error ("jqplot.ThemeEngine Error: Cannot rename from/to Default"); + } + if (this.themes.hasOwnProperty(newName)) { + throw new Error ("jqplot.ThemeEngine Error: New name already in use."); + } + else if (this.themes.hasOwnProperty(oldName)) { + var th = this.copy (oldName, newName); + this.remove(oldName); + return th; + } + throw new Error("jqplot.ThemeEngine Error: Old name or new name invalid"); + }; + + /** + * method: copy + * + * Create a copy of an existing theme in the themeEngine, adding it the themeEngine. + * + * parameters: + * + * sourceName - name of the existing theme. + * targetName - name of the copy. + * obj - optional object of style parameter to apply to the new theme. + * + * returns: + * + * new Theme object. + */ + $.jqplot.ThemeEngine.prototype.copy = function (sourceName, targetName, obj) { + if (targetName == 'Default') { + throw new Error ("jqplot.ThemeEngine Error: Cannot copy over Default theme"); + } + if (!this.themes.hasOwnProperty(sourceName)) { + var s = "jqplot.ThemeEngine Error: Source name invalid"; + throw new Error(s); + } + if (this.themes.hasOwnProperty(targetName)) { + var s = "jqplot.ThemeEngine Error: Target name invalid"; + throw new Error(s); + } + else { + var th = clone(this.themes[sourceName]); + th._name = targetName; + $.jqplot.extend(true, th, obj); + this._add(th); + return th; + } + }; + + + $.jqplot.Theme = function(name, obj) { + if (typeof(name) == 'object') { + obj = obj || name; + name = null; + } + name = name || Date.parse(new Date()); + this._name = name; + this.target = { + backgroundColor: null + }; + this.legend = { + textColor: null, + fontFamily: null, + fontSize: null, + border: null, + background: null + }; + this.title = { + textColor: null, + fontFamily: null, + fontSize: null, + textAlign: null + }; + this.seriesStyles = {}; + this.series = []; + this.grid = { + drawGridlines: null, + gridLineColor: null, + gridLineWidth: null, + backgroundColor: null, + borderColor: null, + borderWidth: null, + shadow: null + }; + this.axesStyles = {label:{}, ticks:{}}; + this.axes = {}; + if (typeof(obj) == 'string') { + this._name = obj; + } + else if(typeof(obj) == 'object') { + $.jqplot.extend(true, this, obj); + } + }; + + var AxisProperties = function() { + this.borderColor = null; + this.borderWidth = null; + this.ticks = new AxisTicks(); + this.label = new AxisLabel(); + }; + + var AxisTicks = function() { + this.show = null; + this.showGridline = null; + this.showLabel = null; + this.showMark = null; + this.size = null; + this.textColor = null; + this.whiteSpace = null; + this.fontSize = null; + this.fontFamily = null; + }; + + var AxisLabel = function() { + this.textColor = null; + this.whiteSpace = null; + this.fontSize = null; + this.fontFamily = null; + this.fontWeight = null; + }; + + var LineSeriesProperties = function() { + this.color=null; + this.lineWidth=null; + this.linePattern=null; + this.shadow=null; + this.fillColor=null; + this.showMarker=null; + this.markerOptions = new MarkerOptions(); + }; + + var MarkerOptions = function() { + this.show = null; + this.style = null; + this.lineWidth = null; + this.size = null; + this.color = null; + this.shadow = null; + }; + + var BarSeriesProperties = function() { + this.color=null; + this.seriesColors=null; + this.lineWidth=null; + this.shadow=null; + this.barPadding=null; + this.barMargin=null; + this.barWidth=null; + this.highlightColors=null; + }; + + var PieSeriesProperties = function() { + this.seriesColors=null; + this.padding=null; + this.sliceMargin=null; + this.fill=null; + this.shadow=null; + this.startAngle=null; + this.lineWidth=null; + this.highlightColors=null; + }; + + var DonutSeriesProperties = function() { + this.seriesColors=null; + this.padding=null; + this.sliceMargin=null; + this.fill=null; + this.shadow=null; + this.startAngle=null; + this.lineWidth=null; + this.innerDiameter=null; + this.thickness=null; + this.ringMargin=null; + this.highlightColors=null; + }; + + var FunnelSeriesProperties = function() { + this.color=null; + this.lineWidth=null; + this.shadow=null; + this.padding=null; + this.sectionMargin=null; + this.seriesColors=null; + this.highlightColors=null; + }; + + var MeterSeriesProperties = function() { + this.padding=null; + this.backgroundColor=null; + this.ringColor=null; + this.tickColor=null; + this.ringWidth=null; + this.intervalColors=null; + this.intervalInnerRadius=null; + this.intervalOuterRadius=null; + this.hubRadius=null; + this.needleThickness=null; + this.needlePad=null; + }; + + + + + $.fn.jqplotChildText = function() { + return $(this).contents().filter(function() { + return this.nodeType == 3; // Node.TEXT_NODE not defined in I7 + }).text(); + }; + + // Returns font style as abbreviation for "font" property. + $.fn.jqplotGetComputedFontStyle = function() { + var css = window.getComputedStyle ? window.getComputedStyle(this[0]) : this[0].currentStyle; + var attrs = css['font-style'] ? ['font-style', 'font-weight', 'font-size', 'font-family'] : ['fontStyle', 'fontWeight', 'fontSize', 'fontFamily']; + var style = []; + + for (var i=0 ; i < attrs.length; ++i) { + var attr = String(css[attrs[i]]); + + if (attr && attr != 'normal') { + style.push(attr); + } + } + return style.join(' '); + }; + + /** + * Namespace: $.fn + * jQuery namespace to attach functions to jQuery elements. + * + */ + + $.fn.jqplotToImageCanvas = function(options) { + + options = options || {}; + var x_offset = (options.x_offset == null) ? 0 : options.x_offset; + var y_offset = (options.y_offset == null) ? 0 : options.y_offset; + var backgroundColor = (options.backgroundColor == null) ? 'rgb(255,255,255)' : options.backgroundColor; + + if ($(this).width() == 0 || $(this).height() == 0) { + return null; + } + + // excanvas and hence IE < 9 do not support toDataURL and cannot export images. + if (!$.jqplot.support_canvas) { + return null; + } + + var newCanvas = document.createElement("canvas"); + var h = $(this).outerHeight(true); + var w = $(this).outerWidth(true); + var offs = $(this).offset(); + var plotleft = offs.left; + var plottop = offs.top; + var transx = 0, transy = 0; + + // have to check if any elements are hanging outside of plot area before rendering, + // since changing width of canvas will erase canvas. + + var clses = ['jqplot-table-legend', 'jqplot-xaxis-tick', 'jqplot-x2axis-tick', 'jqplot-yaxis-tick', 'jqplot-y2axis-tick', 'jqplot-y3axis-tick', + 'jqplot-y4axis-tick', 'jqplot-y5axis-tick', 'jqplot-y6axis-tick', 'jqplot-y7axis-tick', 'jqplot-y8axis-tick', 'jqplot-y9axis-tick', + 'jqplot-xaxis-label', 'jqplot-x2axis-label', 'jqplot-yaxis-label', 'jqplot-y2axis-label', 'jqplot-y3axis-label', 'jqplot-y4axis-label', + 'jqplot-y5axis-label', 'jqplot-y6axis-label', 'jqplot-y7axis-label', 'jqplot-y8axis-label', 'jqplot-y9axis-label' ]; + + var temptop, templeft, tempbottom, tempright; + + for (var i in clses) { + $(this).find('.'+clses[i]).each(function() { + temptop = $(this).offset().top - plottop; + templeft = $(this).offset().left - plotleft; + tempright = templeft + $(this).outerWidth(true) + transx; + tempbottom = temptop + $(this).outerHeight(true) + transy; + if (templeft < -transx) { + w = w - transx - templeft; + transx = -templeft; + } + if (temptop < -transy) { + h = h - transy - temptop; + transy = - temptop; + } + if (tempright > w) { + w = tempright; + } + if (tempbottom > h) { + h = tempbottom; + } + }); + } + + newCanvas.width = w + Number(x_offset); + newCanvas.height = h + Number(y_offset); + + var newContext = newCanvas.getContext("2d"); + + newContext.save(); + newContext.fillStyle = backgroundColor; + newContext.fillRect(0,0, newCanvas.width, newCanvas.height); + newContext.restore(); + + newContext.translate(transx, transy); + newContext.textAlign = 'left'; + newContext.textBaseline = 'top'; + + function getLineheight(el) { + var lineheight = parseInt($(el).css('line-height'), 10); + + if (isNaN(lineheight)) { + lineheight = parseInt($(el).css('font-size'), 10) * 1.2; + } + return lineheight; + } + + function writeWrappedText (el, context, text, left, top, canvasWidth) { + var lineheight = getLineheight(el); + var tagwidth = $(el).innerWidth(); + var tagheight = $(el).innerHeight(); + var words = text.split(/\s+/); + var wl = words.length; + var w = ''; + var breaks = []; + var temptop = top; + var templeft = left; + + for (var i=0; i<wl; i++) { + w += words[i]; + if (context.measureText(w).width > tagwidth) { + breaks.push(i); + w = ''; + } + } + if (breaks.length === 0) { + // center text if necessary + if ($(el).css('textAlign') === 'center') { + templeft = left + (canvasWidth - context.measureText(w).width)/2 - transx; + } + context.fillText(text, templeft, top); + } + else { + w = words.slice(0, breaks[0]).join(' '); + // center text if necessary + if ($(el).css('textAlign') === 'center') { + templeft = left + (canvasWidth - context.measureText(w).width)/2 - transx; + } + context.fillText(w, templeft, temptop); + temptop += lineheight; + for (var i=1, l=breaks.length; i<l; i++) { + w = words.slice(breaks[i-1], breaks[i]).join(' '); + // center text if necessary + if ($(el).css('textAlign') === 'center') { + templeft = left + (canvasWidth - context.measureText(w).width)/2 - transx; + } + context.fillText(w, templeft, temptop); + temptop += lineheight; + } + w = words.slice(breaks[i-1], words.length).join(' '); + // center text if necessary + if ($(el).css('textAlign') === 'center') { + templeft = left + (canvasWidth - context.measureText(w).width)/2 - transx; + } + context.fillText(w, templeft, temptop); + } + + } + + function _jqpToImage(el, x_offset, y_offset) { + var tagname = el.tagName.toLowerCase(); + var p = $(el).position(); + var css = window.getComputedStyle ? window.getComputedStyle(el) : el.currentStyle; // for IE < 9 + var left = x_offset + p.left + parseInt(css.marginLeft, 10) + parseInt(css.borderLeftWidth, 10) + parseInt(css.paddingLeft, 10); + var top = y_offset + p.top + parseInt(css.marginTop, 10) + parseInt(css.borderTopWidth, 10)+ parseInt(css.paddingTop, 10); + var w = newCanvas.width; + // var left = x_offset + p.left + $(el).css('marginLeft') + $(el).css('borderLeftWidth') + + if ((tagname == 'div' || tagname == 'span') && !$(el).hasClass('jqplot-highlighter-tooltip')) { + $(el).children().each(function() { + _jqpToImage(this, left, top); + }); + var text = $(el).jqplotChildText(); + + if (text) { + newContext.font = $(el).jqplotGetComputedFontStyle(); + newContext.fillStyle = $(el).css('color'); + + writeWrappedText(el, newContext, text, left, top, w); + } + } + + // handle the standard table legend + + else if (tagname === 'table' && $(el).hasClass('jqplot-table-legend')) { + newContext.strokeStyle = $(el).css('border-top-color'); + newContext.fillStyle = $(el).css('background-color'); + newContext.fillRect(left, top, $(el).innerWidth(), $(el).innerHeight()); + if (parseInt($(el).css('border-top-width'), 10) > 0) { + newContext.strokeRect(left, top, $(el).innerWidth(), $(el).innerHeight()); + } + + // find all the swatches + $(el).find('div.jqplot-table-legend-swatch-outline').each(function() { + // get the first div and stroke it + var elem = $(this); + newContext.strokeStyle = elem.css('border-top-color'); + var l = left + elem.position().left; + var t = top + elem.position().top; + newContext.strokeRect(l, t, elem.innerWidth(), elem.innerHeight()); + + // now fill the swatch + + l += parseInt(elem.css('padding-left'), 10); + t += parseInt(elem.css('padding-top'), 10); + var h = elem.innerHeight() - 2 * parseInt(elem.css('padding-top'), 10); + var w = elem.innerWidth() - 2 * parseInt(elem.css('padding-left'), 10); + + var swatch = elem.children('div.jqplot-table-legend-swatch'); + newContext.fillStyle = swatch.css('background-color'); + newContext.fillRect(l, t, w, h); + }); + + // now add text + + $(el).find('td.jqplot-table-legend-label').each(function(){ + var elem = $(this); + var l = left + elem.position().left; + var t = top + elem.position().top + parseInt(elem.css('padding-top'), 10); + newContext.font = elem.jqplotGetComputedFontStyle(); + newContext.fillStyle = elem.css('color'); + newContext.fillText(elem.text(), l, t); + }); + + var elem = null; + } + + else if (tagname == 'canvas') { + newContext.drawImage(el, left, top); + } + } + $(this).children().each(function() { + _jqpToImage(this, x_offset, y_offset); + }); + return newCanvas; + }; + + $.fn.jqplotToImageStr = function(options) { + var imgCanvas = $(this).jqplotToImageCanvas(options); + if (imgCanvas) { + return imgCanvas.toDataURL("image/png"); + } + else { + return null; + } + }; + + // create an <img> element and return it. + // Should work on canvas supporting browsers. + $.fn.jqplotToImageElem = function(options) { + var elem = document.createElement("img"); + var str = $(this).jqplotToImageStr(options); + elem.src = str; + return elem; + }; + + // create an <img> element and return it. + // Should work on canvas supporting browsers. + $.fn.jqplotToImageElemStr = function(options) { + var str = '<img src='+$(this).jqplotToImageStr(options)+' />'; + return str; + }; + + // Not gauranteed to work, even on canvas supporting browsers due to + // limitations with location.href and browser support. + $.fn.jqplotSaveImage = function() { + var imgData = $(this).jqplotToImageStr({}); + if (imgData) { + window.location.href = imgData.replace("image/png", "image/octet-stream"); + } + + }; + + // Not gauranteed to work, even on canvas supporting browsers due to + // limitations with window.open and arbitrary data. + $.fn.jqplotViewImage = function() { + var imgStr = $(this).jqplotToImageElemStr({}); + var imgData = $(this).jqplotToImageStr({}); + if (imgStr) { + var w = window.open(''); + w.document.open("image/png"); + w.document.write(imgStr); + w.document.close(); + w = null; + } + }; + + + + /** + * @description + * <p>Object with extended date parsing and formatting capabilities. + * This library borrows many concepts and ideas from the Date Instance + * Methods by Ken Snyder along with some parts of Ken's actual code.</p> + * + * <p>jsDate takes a different approach by not extending the built-in + * Date Object, improving date parsing, allowing for multiple formatting + * syntaxes and multiple and more easily expandable localization.</p> + * + * @author Chris Leonello + * @date #date# + * @version #VERSION# + * @copyright (c) 2010 Chris Leonello + * jsDate is currently available for use in all personal or commercial projects + * under both the MIT and GPL version 2.0 licenses. This means that you can + * choose the license that best suits your project and use it accordingly. + * + * <p>Ken's origianl Date Instance Methods and copyright notice:</p> + * <pre> + * Ken Snyder (ken d snyder at gmail dot com) + * 2008-09-10 + * version 2.0.2 (http://kendsnyder.com/sandbox/date/) + * Creative Commons Attribution License 3.0 (http://creativecommons.org/licenses/by/3.0/) + * </pre> + * + * @class + * @name jsDate + * @param {String | Number | Array | Date Object | Options Object} arguments Optional arguments, either a parsable date/time string, + * a JavaScript timestamp, an array of numbers of form [year, month, day, hours, minutes, seconds, milliseconds], + * a Date object, or an options object of form {syntax: "perl", date:some Date} where all options are optional. + */ + + var jsDate = function () { + + this.syntax = jsDate.config.syntax; + this._type = "jsDate"; + this.proxy = new Date(); + this.options = {}; + this.locale = jsDate.regional.getLocale(); + this.formatString = ''; + this.defaultCentury = jsDate.config.defaultCentury; + + switch ( arguments.length ) { + case 0: + break; + case 1: + // other objects either won't have a _type property or, + // if they do, it shouldn't be set to "jsDate", so + // assume it is an options argument. + if (get_type(arguments[0]) == "[object Object]" && arguments[0]._type != "jsDate") { + var opts = this.options = arguments[0]; + this.syntax = opts.syntax || this.syntax; + this.defaultCentury = opts.defaultCentury || this.defaultCentury; + this.proxy = jsDate.createDate(opts.date); + } + else { + this.proxy = jsDate.createDate(arguments[0]); + } + break; + default: + var a = []; + for ( var i=0; i<arguments.length; i++ ) { + a.push(arguments[i]); + } + // this should be the current date/time? + this.proxy = new Date(); + this.proxy.setFullYear.apply( this.proxy, a.slice(0,3) ); + if ( a.slice(3).length ) { + this.proxy.setHours.apply( this.proxy, a.slice(3) ); + } + break; + } + }; + + /** + * @namespace Configuration options that will be used as defaults for all instances on the page. + * @property {String} defaultLocale The default locale to use [en]. + * @property {String} syntax The default syntax to use [perl]. + * @property {Number} defaultCentury The default centry for 2 digit dates. + */ + jsDate.config = { + defaultLocale: 'en', + syntax: 'perl', + defaultCentury: 1900 + }; + + /** + * Add an arbitrary amount to the currently stored date + * + * @param {Number} number + * @param {String} unit + * @returns {jsDate} + */ + + jsDate.prototype.add = function(number, unit) { + var factor = multipliers[unit] || multipliers.day; + if (typeof factor == 'number') { + this.proxy.setTime(this.proxy.getTime() + (factor * number)); + } else { + factor.add(this, number); + } + return this; + }; + + /** + * Create a new jqplot.date object with the same date + * + * @returns {jsDate} + */ + + jsDate.prototype.clone = function() { + return new jsDate(this.proxy.getTime()); + }; + + /** + * Get the UTC TimeZone Offset of this date in milliseconds. + * + * @returns {Number} + */ + + jsDate.prototype.getUtcOffset = function() { + return this.proxy.getTimezoneOffset() * 60000; + }; + + /** + * Find the difference between this jsDate and another date. + * + * @param {String| Number| Array| jsDate Object| Date Object} dateObj + * @param {String} unit + * @param {Boolean} allowDecimal + * @returns {Number} Number of units difference between dates. + */ + + jsDate.prototype.diff = function(dateObj, unit, allowDecimal) { + // ensure we have a Date object + dateObj = new jsDate(dateObj); + if (dateObj === null) { + return null; + } + // get the multiplying factor integer or factor function + var factor = multipliers[unit] || multipliers.day; + if (typeof factor == 'number') { + // multiply + var unitDiff = (this.proxy.getTime() - dateObj.proxy.getTime()) / factor; + } else { + // run function + var unitDiff = factor.diff(this.proxy, dateObj.proxy); + } + // if decimals are not allowed, round toward zero + return (allowDecimal ? unitDiff : Math[unitDiff > 0 ? 'floor' : 'ceil'](unitDiff)); + }; + + /** + * Get the abbreviated name of the current week day + * + * @returns {String} + */ + + jsDate.prototype.getAbbrDayName = function() { + return jsDate.regional[this.locale]["dayNamesShort"][this.proxy.getDay()]; + }; + + /** + * Get the abbreviated name of the current month + * + * @returns {String} + */ + + jsDate.prototype.getAbbrMonthName = function() { + return jsDate.regional[this.locale]["monthNamesShort"][this.proxy.getMonth()]; + }; + + /** + * Get UPPER CASE AM or PM for the current time + * + * @returns {String} + */ + + jsDate.prototype.getAMPM = function() { + return this.proxy.getHours() >= 12 ? 'PM' : 'AM'; + }; + + /** + * Get lower case am or pm for the current time + * + * @returns {String} + */ + + jsDate.prototype.getAmPm = function() { + return this.proxy.getHours() >= 12 ? 'pm' : 'am'; + }; + + /** + * Get the century (19 for 20th Century) + * + * @returns {Integer} Century (19 for 20th century). + */ + jsDate.prototype.getCentury = function() { + return parseInt(this.proxy.getFullYear()/100, 10); + }; + + /** + * Implements Date functionality + */ + jsDate.prototype.getDate = function() { + return this.proxy.getDate(); + }; + + /** + * Implements Date functionality + */ + jsDate.prototype.getDay = function() { + return this.proxy.getDay(); + }; + + /** + * Get the Day of week 1 (Monday) thru 7 (Sunday) + * + * @returns {Integer} Day of week 1 (Monday) thru 7 (Sunday) + */ + jsDate.prototype.getDayOfWeek = function() { + var dow = this.proxy.getDay(); + return dow===0?7:dow; + }; + + /** + * Get the day of the year + * + * @returns {Integer} 1 - 366, day of the year + */ + jsDate.prototype.getDayOfYear = function() { + var d = this.proxy; + var ms = d - new Date('' + d.getFullYear() + '/1/1 GMT'); + ms += d.getTimezoneOffset()*60000; + d = null; + return parseInt(ms/60000/60/24, 10)+1; + }; + + /** + * Get the name of the current week day + * + * @returns {String} + */ + + jsDate.prototype.getDayName = function() { + return jsDate.regional[this.locale]["dayNames"][this.proxy.getDay()]; + }; + + /** + * Get the week number of the given year, starting with the first Sunday as the first week + * @returns {Integer} Week number (13 for the 13th full week of the year). + */ + jsDate.prototype.getFullWeekOfYear = function() { + var d = this.proxy; + var doy = this.getDayOfYear(); + var rdow = 6-d.getDay(); + var woy = parseInt((doy+rdow)/7, 10); + return woy; + }; + + /** + * Implements Date functionality + */ + jsDate.prototype.getFullYear = function() { + return this.proxy.getFullYear(); + }; + + /** + * Get the GMT offset in hours and minutes (e.g. +06:30) + * + * @returns {String} + */ + + jsDate.prototype.getGmtOffset = function() { + // divide the minutes offset by 60 + var hours = this.proxy.getTimezoneOffset() / 60; + // decide if we are ahead of or behind GMT + var prefix = hours < 0 ? '+' : '-'; + // remove the negative sign if any + hours = Math.abs(hours); + // add the +/- to the padded number of hours to : to the padded minutes + return prefix + addZeros(Math.floor(hours), 2) + ':' + addZeros((hours % 1) * 60, 2); + }; + + /** + * Implements Date functionality + */ + jsDate.prototype.getHours = function() { + return this.proxy.getHours(); + }; + + /** + * Get the current hour on a 12-hour scheme + * + * @returns {Integer} + */ + + jsDate.prototype.getHours12 = function() { + var hours = this.proxy.getHours(); + return hours > 12 ? hours - 12 : (hours == 0 ? 12 : hours); + }; + + + jsDate.prototype.getIsoWeek = function() { + var d = this.proxy; + var woy = d.getWeekOfYear(); + var dow1_1 = (new Date('' + d.getFullYear() + '/1/1')).getDay(); + // First week is 01 and not 00 as in the case of %U and %W, + // so we add 1 to the final result except if day 1 of the year + // is a Monday (then %W returns 01). + // We also need to subtract 1 if the day 1 of the year is + // Friday-Sunday, so the resulting equation becomes: + var idow = woy + (dow1_1 > 4 || dow1_1 <= 1 ? 0 : 1); + if(idow == 53 && (new Date('' + d.getFullYear() + '/12/31')).getDay() < 4) + { + idow = 1; + } + else if(idow === 0) + { + d = new jsDate(new Date('' + (d.getFullYear()-1) + '/12/31')); + idow = d.getIsoWeek(); + } + d = null; + return idow; + }; + + /** + * Implements Date functionality + */ + jsDate.prototype.getMilliseconds = function() { + return this.proxy.getMilliseconds(); + }; + + /** + * Implements Date functionality + */ + jsDate.prototype.getMinutes = function() { + return this.proxy.getMinutes(); + }; + + /** + * Implements Date functionality + */ + jsDate.prototype.getMonth = function() { + return this.proxy.getMonth(); + }; + + /** + * Get the name of the current month + * + * @returns {String} + */ + + jsDate.prototype.getMonthName = function() { + return jsDate.regional[this.locale]["monthNames"][this.proxy.getMonth()]; + }; + + /** + * Get the number of the current month, 1-12 + * + * @returns {Integer} + */ + + jsDate.prototype.getMonthNumber = function() { + return this.proxy.getMonth() + 1; + }; + + /** + * Implements Date functionality + */ + jsDate.prototype.getSeconds = function() { + return this.proxy.getSeconds(); + }; + + /** + * Return a proper two-digit year integer + * + * @returns {Integer} + */ + + jsDate.prototype.getShortYear = function() { + return this.proxy.getYear() % 100; + }; + + /** + * Implements Date functionality + */ + jsDate.prototype.getTime = function() { + return this.proxy.getTime(); + }; + + /** + * Get the timezone abbreviation + * + * @returns {String} Abbreviation for the timezone + */ + jsDate.prototype.getTimezoneAbbr = function() { + return this.proxy.toString().replace(/^.*\(([^)]+)\)$/, '$1'); + }; + + /** + * Get the browser-reported name for the current timezone (e.g. MDT, Mountain Daylight Time) + * + * @returns {String} + */ + jsDate.prototype.getTimezoneName = function() { + var match = /(?:\((.+)\)$| ([A-Z]{3}) )/.exec(this.toString()); + return match[1] || match[2] || 'GMT' + this.getGmtOffset(); + }; + + /** + * Implements Date functionality + */ + jsDate.prototype.getTimezoneOffset = function() { + return this.proxy.getTimezoneOffset(); + }; + + + /** + * Get the week number of the given year, starting with the first Monday as the first week + * @returns {Integer} Week number (13 for the 13th week of the year). + */ + jsDate.prototype.getWeekOfYear = function() { + var doy = this.getDayOfYear(); + var rdow = 7 - this.getDayOfWeek(); + var woy = parseInt((doy+rdow)/7, 10); + return woy; + }; + + /** + * Get the current date as a Unix timestamp + * + * @returns {Integer} + */ + + jsDate.prototype.getUnix = function() { + return Math.round(this.proxy.getTime() / 1000, 0); + }; + + /** + * Implements Date functionality + */ + jsDate.prototype.getYear = function() { + return this.proxy.getYear(); + }; + + /** + * Return a date one day ahead (or any other unit) + * + * @param {String} unit Optional, year | month | day | week | hour | minute | second | millisecond + * @returns {jsDate} + */ + + jsDate.prototype.next = function(unit) { + unit = unit || 'day'; + return this.clone().add(1, unit); + }; + + /** + * Set the jsDate instance to a new date. + * + * @param {String | Number | Array | Date Object | jsDate Object | Options Object} arguments Optional arguments, + * either a parsable date/time string, + * a JavaScript timestamp, an array of numbers of form [year, month, day, hours, minutes, seconds, milliseconds], + * a Date object, jsDate Object or an options object of form {syntax: "perl", date:some Date} where all options are optional. + */ + jsDate.prototype.set = function() { + switch ( arguments.length ) { + case 0: + this.proxy = new Date(); + break; + case 1: + // other objects either won't have a _type property or, + // if they do, it shouldn't be set to "jsDate", so + // assume it is an options argument. + if (get_type(arguments[0]) == "[object Object]" && arguments[0]._type != "jsDate") { + var opts = this.options = arguments[0]; + this.syntax = opts.syntax || this.syntax; + this.defaultCentury = opts.defaultCentury || this.defaultCentury; + this.proxy = jsDate.createDate(opts.date); + } + else { + this.proxy = jsDate.createDate(arguments[0]); + } + break; + default: + var a = []; + for ( var i=0; i<arguments.length; i++ ) { + a.push(arguments[i]); + } + // this should be the current date/time + this.proxy = new Date(); + this.proxy.setFullYear.apply( this.proxy, a.slice(0,3) ); + if ( a.slice(3).length ) { + this.proxy.setHours.apply( this.proxy, a.slice(3) ); + } + break; + } + return this; + }; + + /** + * Sets the day of the month for a specified date according to local time. + * @param {Integer} dayValue An integer from 1 to 31, representing the day of the month. + */ + jsDate.prototype.setDate = function(n) { + this.proxy.setDate(n); + return this; + }; + + /** + * Sets the full year for a specified date according to local time. + * @param {Integer} yearValue The numeric value of the year, for example, 1995. + * @param {Integer} monthValue Optional, between 0 and 11 representing the months January through December. + * @param {Integer} dayValue Optional, between 1 and 31 representing the day of the month. If you specify the dayValue parameter, you must also specify the monthValue. + */ + jsDate.prototype.setFullYear = function() { + this.proxy.setFullYear.apply(this.proxy, arguments); + return this; + }; + + /** + * Sets the hours for a specified date according to local time. + * + * @param {Integer} hoursValue An integer between 0 and 23, representing the hour. + * @param {Integer} minutesValue Optional, An integer between 0 and 59, representing the minutes. + * @param {Integer} secondsValue Optional, An integer between 0 and 59, representing the seconds. + * If you specify the secondsValue parameter, you must also specify the minutesValue. + * @param {Integer} msValue Optional, A number between 0 and 999, representing the milliseconds. + * If you specify the msValue parameter, you must also specify the minutesValue and secondsValue. + */ + jsDate.prototype.setHours = function() { + this.proxy.setHours.apply(this.proxy, arguments); + return this; + }; + + /** + * Implements Date functionality + */ + jsDate.prototype.setMilliseconds = function(n) { + this.proxy.setMilliseconds(n); + return this; + }; + + /** + * Implements Date functionality + */ + jsDate.prototype.setMinutes = function() { + this.proxy.setMinutes.apply(this.proxy, arguments); + return this; + }; + + /** + * Implements Date functionality + */ + jsDate.prototype.setMonth = function() { + this.proxy.setMonth.apply(this.proxy, arguments); + return this; + }; + + /** + * Implements Date functionality + */ + jsDate.prototype.setSeconds = function() { + this.proxy.setSeconds.apply(this.proxy, arguments); + return this; + }; + + /** + * Implements Date functionality + */ + jsDate.prototype.setTime = function(n) { + this.proxy.setTime(n); + return this; + }; + + /** + * Implements Date functionality + */ + jsDate.prototype.setYear = function() { + this.proxy.setYear.apply(this.proxy, arguments); + return this; + }; + + /** + * Provide a formatted string representation of this date. + * + * @param {String} formatString A format string. + * See: {@link jsDate.formats}. + * @returns {String} Date String. + */ + + jsDate.prototype.strftime = function(formatString) { + formatString = formatString || this.formatString || jsDate.regional[this.locale]['formatString']; + return jsDate.strftime(this, formatString, this.syntax); + }; + + /** + * Return a String representation of this jsDate object. + * @returns {String} Date string. + */ + + jsDate.prototype.toString = function() { + return this.proxy.toString(); + }; + + /** + * Convert the current date to an 8-digit integer (%Y%m%d) + * + * @returns {Integer} + */ + + jsDate.prototype.toYmdInt = function() { + return (this.proxy.getFullYear() * 10000) + (this.getMonthNumber() * 100) + this.proxy.getDate(); + }; + + /** + * @namespace Holds localizations for month/day names. + * <p>jsDate attempts to detect locale when loaded and defaults to 'en'. + * If a localization is detected which is not available, jsDate defaults to 'en'. + * Additional localizations can be added after jsDate loads. After adding a localization, + * call the jsDate.regional.getLocale() method. Currently, en, fr and de are defined.</p> + * + * <p>Localizations must be an object and have the following properties defined: monthNames, monthNamesShort, dayNames, dayNamesShort and Localizations are added like:</p> + * <pre class="code"> + * jsDate.regional['en'] = { + * monthNames : 'January February March April May June July August September October November December'.split(' '), + * monthNamesShort : 'Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec'.split(' '), + * dayNames : 'Sunday Monday Tuesday Wednesday Thursday Friday Saturday'.split(' '), + * dayNamesShort : 'Sun Mon Tue Wed Thu Fri Sat'.split(' ') + * }; + * </pre> + * <p>After adding localizations, call <code>jsDate.regional.getLocale();</code> to update the locale setting with the + * new localizations.</p> + */ + + jsDate.regional = { + 'en': { + monthNames: ['January','February','March','April','May','June','July','August','September','October','November','December'], + monthNamesShort: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun','Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'], + dayNames: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'], + dayNamesShort: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'], + formatString: '%Y-%m-%d %H:%M:%S' + }, + + 'fr': { + monthNames: ['Janvier','Février','Mars','Avril','Mai','Juin','Juillet','Août','Septembre','Octobre','Novembre','Décembre'], + monthNamesShort: ['Jan','Fév','Mar','Avr','Mai','Jun','Jul','Aoû','Sep','Oct','Nov','Déc'], + dayNames: ['Dimanche','Lundi','Mardi','Mercredi','Jeudi','Vendredi','Samedi'], + dayNamesShort: ['Dim','Lun','Mar','Mer','Jeu','Ven','Sam'], + formatString: '%Y-%m-%d %H:%M:%S' + }, + + 'de': { + monthNames: ['Januar','Februar','März','April','Mai','Juni','Juli','August','September','Oktober','November','Dezember'], + monthNamesShort: ['Jan','Feb','Mär','Apr','Mai','Jun','Jul','Aug','Sep','Okt','Nov','Dez'], + dayNames: ['Sonntag','Montag','Dienstag','Mittwoch','Donnerstag','Freitag','Samstag'], + dayNamesShort: ['So','Mo','Di','Mi','Do','Fr','Sa'], + formatString: '%Y-%m-%d %H:%M:%S' + }, + + 'es': { + monthNames: ['Enero','Febrero','Marzo','Abril','Mayo','Junio', 'Julio','Agosto','Septiembre','Octubre','Noviembre','Diciembre'], + monthNamesShort: ['Ene','Feb','Mar','Abr','May','Jun', 'Jul','Ago','Sep','Oct','Nov','Dic'], + dayNames: ['Domingo','Lunes','Martes','Miércoles','Jueves','Viernes','Sábado'], + dayNamesShort: ['Dom','Lun','Mar','Mié','Juv','Vie','Sáb'], + formatString: '%Y-%m-%d %H:%M:%S' + }, + + 'ru': { + monthNames: ['Январь','Февраль','Март','Апрель','Май','Июнь','Июль','Август','Сентябрь','Октябрь','Ноябрь','Декабрь'], + monthNamesShort: ['Янв','Фев','Мар','Апр','Май','Июн','Июл','Авг','Сен','Окт','Ноя','Дек'], + dayNames: ['воскресенье','понедельник','вторник','среда','четверг','пятница','суббота'], + dayNamesShort: ['вск','пнд','втр','срд','чтв','птн','сбт'], + formatString: '%Y-%m-%d %H:%M:%S' + }, + + 'ar': { + monthNames: ['كانون الثاني', 'شباط', 'آذار', 'نيسان', 'آذار', 'حزيران','تموز', 'آب', 'أيلول', 'تشرين الأول', 'تشرين الثاني', 'كانون الأول'], + monthNamesShort: ['1','2','3','4','5','6','7','8','9','10','11','12'], + dayNames: ['السبت', 'الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة'], + dayNamesShort: ['سبت', 'أحد', 'اثنين', 'ثلاثاء', 'أربعاء', 'خميس', 'جمعة'], + formatString: '%Y-%m-%d %H:%M:%S' + }, + + 'pt': { + monthNames: ['Janeiro','Fevereiro','Março','Abril','Maio','Junho','Julho','Agosto','Setembro','Outubro','Novembro','Dezembro'], + monthNamesShort: ['Jan','Fev','Mar','Abr','Mai','Jun','Jul','Ago','Set','Out','Nov','Dez'], + dayNames: ['Domingo','Segunda-feira','Terça-feira','Quarta-feira','Quinta-feira','Sexta-feira','Sábado'], + dayNamesShort: ['Dom','Seg','Ter','Qua','Qui','Sex','Sáb'], + formatString: '%Y-%m-%d %H:%M:%S' + }, + + 'pt-BR': { + monthNames: ['Janeiro','Fevereiro','Março','Abril','Maio','Junho', 'Julho','Agosto','Setembro','Outubro','Novembro','Dezembro'], + monthNamesShort: ['Jan','Fev','Mar','Abr','Mai','Jun','Jul','Ago','Set','Out','Nov','Dez'], + dayNames: ['Domingo','Segunda-feira','Terça-feira','Quarta-feira','Quinta-feira','Sexta-feira','Sábado'], + dayNamesShort: ['Dom','Seg','Ter','Qua','Qui','Sex','Sáb'], + formatString: '%Y-%m-%d %H:%M:%S' + } + + + }; + + // Set english variants to 'en' + jsDate.regional['en-US'] = jsDate.regional['en-GB'] = jsDate.regional['en']; + + /** + * Try to determine the users locale based on the lang attribute of the html page. Defaults to 'en' + * if it cannot figure out a locale of if the locale does not have a localization defined. + * @returns {String} locale + */ + + jsDate.regional.getLocale = function () { + var l = jsDate.config.defaultLocale; + + if ( document && document.getElementsByTagName('html') && document.getElementsByTagName('html')[0].lang ) { + l = document.getElementsByTagName('html')[0].lang; + if (!jsDate.regional.hasOwnProperty(l)) { + l = jsDate.config.defaultLocale; + } + } + + return l; + }; + + // ms in day + var day = 24 * 60 * 60 * 1000; + + // padd a number with zeros + var addZeros = function(num, digits) { + num = String(num); + var i = digits - num.length; + var s = String(Math.pow(10, i)).slice(1); + return s.concat(num); + }; + + // representations used for calculating differences between dates. + // This borrows heavily from Ken Snyder's work. + var multipliers = { + millisecond: 1, + second: 1000, + minute: 60 * 1000, + hour: 60 * 60 * 1000, + day: day, + week: 7 * day, + month: { + // add a number of months + add: function(d, number) { + // add any years needed (increments of 12) + multipliers.year.add(d, Math[number > 0 ? 'floor' : 'ceil'](number / 12)); + // ensure that we properly wrap betwen December and January + // 11 % 12 = 11 + // 12 % 12 = 0 + var prevMonth = d.getMonth() + (number % 12); + if (prevMonth == 12) { + prevMonth = 0; + d.setYear(d.getFullYear() + 1); + } else if (prevMonth == -1) { + prevMonth = 11; + d.setYear(d.getFullYear() - 1); + } + d.setMonth(prevMonth); + }, + // get the number of months between two Date objects (decimal to the nearest day) + diff: function(d1, d2) { + // get the number of years + var diffYears = d1.getFullYear() - d2.getFullYear(); + // get the number of remaining months + var diffMonths = d1.getMonth() - d2.getMonth() + (diffYears * 12); + // get the number of remaining days + var diffDays = d1.getDate() - d2.getDate(); + // return the month difference with the days difference as a decimal + return diffMonths + (diffDays / 30); + } + }, + year: { + // add a number of years + add: function(d, number) { + d.setYear(d.getFullYear() + Math[number > 0 ? 'floor' : 'ceil'](number)); + }, + // get the number of years between two Date objects (decimal to the nearest day) + diff: function(d1, d2) { + return multipliers.month.diff(d1, d2) / 12; + } + } + }; + // + // Alias each multiplier with an 's' to allow 'year' and 'years' for example. + // This comes from Ken Snyders work. + // + for (var unit in multipliers) { + if (unit.substring(unit.length - 1) != 's') { // IE will iterate newly added properties :| + multipliers[unit + 's'] = multipliers[unit]; + } + } + + // + // take a jsDate instance and a format code and return the formatted value. + // This is a somewhat modified version of Ken Snyder's method. + // + var format = function(d, code, syntax) { + // if shorcut codes are used, recursively expand those. + if (jsDate.formats[syntax]["shortcuts"][code]) { + return jsDate.strftime(d, jsDate.formats[syntax]["shortcuts"][code], syntax); + } else { + // get the format code function and addZeros() argument + var getter = (jsDate.formats[syntax]["codes"][code] || '').split('.'); + var nbr = d['get' + getter[0]] ? d['get' + getter[0]]() : ''; + if (getter[1]) { + nbr = addZeros(nbr, getter[1]); + } + return nbr; + } + }; + + /** + * @static + * Static function for convert a date to a string according to a given format. Also acts as namespace for strftime format codes. + * <p>strftime formatting can be accomplished without creating a jsDate object by calling jsDate.strftime():</p> + * <pre class="code"> + * var formattedDate = jsDate.strftime('Feb 8, 2006 8:48:32', '%Y-%m-%d %H:%M:%S'); + * </pre> + * @param {String | Number | Array | jsDate Object | Date Object} date A parsable date string, JavaScript time stamp, Array of form [year, month, day, hours, minutes, seconds, milliseconds], jsDate Object or Date object. + * @param {String} formatString String with embedded date formatting codes. + * See: {@link jsDate.formats}. + * @param {String} syntax Optional syntax to use [default perl]. + * @param {String} locale Optional locale to use. + * @returns {String} Formatted representation of the date. + */ + // + // Logic as implemented here is very similar to Ken Snyder's Date Instance Methods. + // + jsDate.strftime = function(d, formatString, syntax, locale) { + var syn = 'perl'; + var loc = jsDate.regional.getLocale(); + + // check if syntax and locale are available or reversed + if (syntax && jsDate.formats.hasOwnProperty(syntax)) { + syn = syntax; + } + else if (syntax && jsDate.regional.hasOwnProperty(syntax)) { + loc = syntax; + } + + if (locale && jsDate.formats.hasOwnProperty(locale)) { + syn = locale; + } + else if (locale && jsDate.regional.hasOwnProperty(locale)) { + loc = locale; + } + + if (get_type(d) != "[object Object]" || d._type != "jsDate") { + d = new jsDate(d); + d.locale = loc; + } + if (!formatString) { + formatString = d.formatString || jsDate.regional[loc]['formatString']; + } + // default the format string to year-month-day + var source = formatString || '%Y-%m-%d', + result = '', + match; + // replace each format code + while (source.length > 0) { + if (match = source.match(jsDate.formats[syn].codes.matcher)) { + result += source.slice(0, match.index); + result += (match[1] || '') + format(d, match[2], syn); + source = source.slice(match.index + match[0].length); + } else { + result += source; + source = ''; + } + } + return result; + }; + + /** + * @namespace + * Namespace to hold format codes and format shortcuts. "perl" and "php" format codes + * and shortcuts are defined by default. Additional codes and shortcuts can be + * added like: + * + * <pre class="code"> + * jsDate.formats["perl"] = { + * "codes": { + * matcher: /someregex/, + * Y: "fullYear", // name of "get" method without the "get", + * ..., // more codes + * }, + * "shortcuts": { + * F: '%Y-%m-%d', + * ..., // more shortcuts + * } + * }; + * </pre> + * + * <p>Additionally, ISO and SQL shortcuts are defined and can be accesses via: + * <code>jsDate.formats.ISO</code> and <code>jsDate.formats.SQL</code> + */ + + jsDate.formats = { + ISO:'%Y-%m-%dT%H:%M:%S.%N%G', + SQL:'%Y-%m-%d %H:%M:%S' + }; + + /** + * Perl format codes and shortcuts for strftime. + * + * A hash (object) of codes where each code must be an array where the first member is + * the name of a Date.prototype or jsDate.prototype function to call + * and optionally a second member indicating the number to pass to addZeros() + * + * <p>The following format codes are defined:</p> + * + * <pre class="code"> + * Code Result Description + * == Years == + * %Y 2008 Four-digit year + * %y 08 Two-digit year + * + * == Months == + * %m 09 Two-digit month + * %#m 9 One or two-digit month + * %B September Full month name + * %b Sep Abbreviated month name + * + * == Days == + * %d 05 Two-digit day of month + * %#d 5 One or two-digit day of month + * %e 5 One or two-digit day of month + * %A Sunday Full name of the day of the week + * %a Sun Abbreviated name of the day of the week + * %w 0 Number of the day of the week (0 = Sunday, 6 = Saturday) + * + * == Hours == + * %H 23 Hours in 24-hour format (two digits) + * %#H 3 Hours in 24-hour integer format (one or two digits) + * %I 11 Hours in 12-hour format (two digits) + * %#I 3 Hours in 12-hour integer format (one or two digits) + * %p PM AM or PM + * + * == Minutes == + * %M 09 Minutes (two digits) + * %#M 9 Minutes (one or two digits) + * + * == Seconds == + * %S 02 Seconds (two digits) + * %#S 2 Seconds (one or two digits) + * %s 1206567625723 Unix timestamp (Seconds past 1970-01-01 00:00:00) + * + * == Milliseconds == + * %N 008 Milliseconds (three digits) + * %#N 8 Milliseconds (one to three digits) + * + * == Timezone == + * %O 360 difference in minutes between local time and GMT + * %Z Mountain Standard Time Name of timezone as reported by browser + * %G 06:00 Hours and minutes between GMT + * + * == Shortcuts == + * %F 2008-03-26 %Y-%m-%d + * %T 05:06:30 %H:%M:%S + * %X 05:06:30 %H:%M:%S + * %x 03/26/08 %m/%d/%y + * %D 03/26/08 %m/%d/%y + * %#c Wed Mar 26 15:31:00 2008 %a %b %e %H:%M:%S %Y + * %v 3-Sep-2008 %e-%b-%Y + * %R 15:31 %H:%M + * %r 03:31:00 PM %I:%M:%S %p + * + * == Characters == + * %n \n Newline + * %t \t Tab + * %% % Percent Symbol + * </pre> + * + * <p>Formatting shortcuts that will be translated into their longer version. + * Be sure that format shortcuts do not refer to themselves: this will cause an infinite loop.</p> + * + * <p>Format codes and format shortcuts can be redefined after the jsDate + * module is imported.</p> + * + * <p>Note that if you redefine the whole hash (object), you must supply a "matcher" + * regex for the parser. The default matcher is:</p> + * + * <code>/()%(#?(%|[a-z]))/i</code> + * + * <p>which corresponds to the Perl syntax used by default.</p> + * + * <p>By customizing the matcher and format codes, nearly any strftime functionality is possible.</p> + */ + + jsDate.formats.perl = { + codes: { + // + // 2-part regex matcher for format codes + // + // first match must be the character before the code (to account for escaping) + // second match must be the format code character(s) + // + matcher: /()%(#?(%|[a-z]))/i, + // year + Y: 'FullYear', + y: 'ShortYear.2', + // month + m: 'MonthNumber.2', + '#m': 'MonthNumber', + B: 'MonthName', + b: 'AbbrMonthName', + // day + d: 'Date.2', + '#d': 'Date', + e: 'Date', + A: 'DayName', + a: 'AbbrDayName', + w: 'Day', + // hours + H: 'Hours.2', + '#H': 'Hours', + I: 'Hours12.2', + '#I': 'Hours12', + p: 'AMPM', + // minutes + M: 'Minutes.2', + '#M': 'Minutes', + // seconds + S: 'Seconds.2', + '#S': 'Seconds', + s: 'Unix', + // milliseconds + N: 'Milliseconds.3', + '#N': 'Milliseconds', + // timezone + O: 'TimezoneOffset', + Z: 'TimezoneName', + G: 'GmtOffset' + }, + + shortcuts: { + // date + F: '%Y-%m-%d', + // time + T: '%H:%M:%S', + X: '%H:%M:%S', + // local format date + x: '%m/%d/%y', + D: '%m/%d/%y', + // local format extended + '#c': '%a %b %e %H:%M:%S %Y', + // local format short + v: '%e-%b-%Y', + R: '%H:%M', + r: '%I:%M:%S %p', + // tab and newline + t: '\t', + n: '\n', + '%': '%' + } + }; + + /** + * PHP format codes and shortcuts for strftime. + * + * A hash (object) of codes where each code must be an array where the first member is + * the name of a Date.prototype or jsDate.prototype function to call + * and optionally a second member indicating the number to pass to addZeros() + * + * <p>The following format codes are defined:</p> + * + * <pre class="code"> + * Code Result Description + * === Days === + * %a Sun through Sat An abbreviated textual representation of the day + * %A Sunday - Saturday A full textual representation of the day + * %d 01 to 31 Two-digit day of the month (with leading zeros) + * %e 1 to 31 Day of the month, with a space preceding single digits. + * %j 001 to 366 Day of the year, 3 digits with leading zeros + * %u 1 - 7 (Mon - Sun) ISO-8601 numeric representation of the day of the week + * %w 0 - 6 (Sun - Sat) Numeric representation of the day of the week + * + * === Week === + * %U 13 Full Week number, starting with the first Sunday as the first week + * %V 01 through 53 ISO-8601:1988 week number, starting with the first week of the year + * with at least 4 weekdays, with Monday being the start of the week + * %W 46 A numeric representation of the week of the year, + * starting with the first Monday as the first week + * === Month === + * %b Jan through Dec Abbreviated month name, based on the locale + * %B January - December Full month name, based on the locale + * %h Jan through Dec Abbreviated month name, based on the locale (an alias of %b) + * %m 01 - 12 (Jan - Dec) Two digit representation of the month + * + * === Year === + * %C 19 Two digit century (year/100, truncated to an integer) + * %y 09 for 2009 Two digit year + * %Y 2038 Four digit year + * + * === Time === + * %H 00 through 23 Two digit representation of the hour in 24-hour format + * %I 01 through 12 Two digit representation of the hour in 12-hour format + * %l 1 through 12 Hour in 12-hour format, with a space preceeding single digits + * %M 00 through 59 Two digit representation of the minute + * %p AM/PM UPPER-CASE 'AM' or 'PM' based on the given time + * %P am/pm lower-case 'am' or 'pm' based on the given time + * %r 09:34:17 PM Same as %I:%M:%S %p + * %R 00:35 Same as %H:%M + * %S 00 through 59 Two digit representation of the second + * %T 21:34:17 Same as %H:%M:%S + * %X 03:59:16 Preferred time representation based on locale, without the date + * %z -0500 or EST Either the time zone offset from UTC or the abbreviation + * %Z -0500 or EST The time zone offset/abbreviation option NOT given by %z + * + * === Time and Date === + * %D 02/05/09 Same as %m/%d/%y + * %F 2009-02-05 Same as %Y-%m-%d (commonly used in database datestamps) + * %s 305815200 Unix Epoch Time timestamp (same as the time() function) + * %x 02/05/09 Preferred date representation, without the time + * + * === Miscellaneous === + * %n --- A newline character (\n) + * %t --- A Tab character (\t) + * %% --- A literal percentage character (%) + * </pre> + */ + + jsDate.formats.php = { + codes: { + // + // 2-part regex matcher for format codes + // + // first match must be the character before the code (to account for escaping) + // second match must be the format code character(s) + // + matcher: /()%((%|[a-z]))/i, + // day + a: 'AbbrDayName', + A: 'DayName', + d: 'Date.2', + e: 'Date', + j: 'DayOfYear.3', + u: 'DayOfWeek', + w: 'Day', + // week + U: 'FullWeekOfYear.2', + V: 'IsoWeek.2', + W: 'WeekOfYear.2', + // month + b: 'AbbrMonthName', + B: 'MonthName', + m: 'MonthNumber.2', + h: 'AbbrMonthName', + // year + C: 'Century.2', + y: 'ShortYear.2', + Y: 'FullYear', + // time + H: 'Hours.2', + I: 'Hours12.2', + l: 'Hours12', + p: 'AMPM', + P: 'AmPm', + M: 'Minutes.2', + S: 'Seconds.2', + s: 'Unix', + O: 'TimezoneOffset', + z: 'GmtOffset', + Z: 'TimezoneAbbr' + }, + + shortcuts: { + D: '%m/%d/%y', + F: '%Y-%m-%d', + T: '%H:%M:%S', + X: '%H:%M:%S', + x: '%m/%d/%y', + R: '%H:%M', + r: '%I:%M:%S %p', + t: '\t', + n: '\n', + '%': '%' + } + }; + // + // Conceptually, the logic implemented here is similar to Ken Snyder's Date Instance Methods. + // I use his idea of a set of parsers which can be regular expressions or functions, + // iterating through those, and then seeing if Date.parse() will create a date. + // The parser expressions and functions are a little different and some bugs have been + // worked out. Also, a lot of "pre-parsing" is done to fix implementation + // variations of Date.parse() between browsers. + // + jsDate.createDate = function(date) { + // if passing in multiple arguments, try Date constructor + if (date == null) { + return new Date(); + } + // If the passed value is already a date object, return it + if (date instanceof Date) { + return date; + } + // if (typeof date == 'number') return new Date(date * 1000); + // If the passed value is an integer, interpret it as a javascript timestamp + if (typeof date == 'number') { + return new Date(date); + } + + // Before passing strings into Date.parse(), have to normalize them for certain conditions. + // If strings are not formatted staccording to the EcmaScript spec, results from Date parse will be implementation dependent. + // + // For example: + // * FF and Opera assume 2 digit dates are pre y2k, Chome assumes <50 is pre y2k, 50+ is 21st century. + // * Chrome will correctly parse '1984-1-25' into localtime, FF and Opera will not parse. + // * Both FF, Chrome and Opera will parse '1984/1/25' into localtime. + + // remove leading and trailing spaces + var parsable = String(date).replace(/^\s*(.+)\s*$/g, '$1'); + + // replace dahses (-) with slashes (/) in dates like n[nnn]/n[n]/n[nnn] + parsable = parsable.replace(/^([0-9]{1,4})-([0-9]{1,2})-([0-9]{1,4})/, "$1/$2/$3"); + + ///////// + // Need to check for '15-Dec-09' also. + // FF will not parse, but Chrome will. + // Chrome will set date to 2009 as well. + ///////// + + // first check for 'dd-mmm-yyyy' or 'dd/mmm/yyyy' like '15-Dec-2010' + parsable = parsable.replace(/^(3[01]|[0-2]?\d)[-\/]([a-z]{3,})[-\/](\d{4})/i, "$1 $2 $3"); + + // Now check for 'dd-mmm-yy' or 'dd/mmm/yy' and normalize years to default century. + var match = parsable.match(/^(3[01]|[0-2]?\d)[-\/]([a-z]{3,})[-\/](\d{2})\D*/i); + if (match && match.length > 3) { + var m3 = parseFloat(match[3]); + var ny = jsDate.config.defaultCentury + m3; + ny = String(ny); + + // now replace 2 digit year with 4 digit year + parsable = parsable.replace(/^(3[01]|[0-2]?\d)[-\/]([a-z]{3,})[-\/](\d{2})\D*/i, match[1] +' '+ match[2] +' '+ ny); + + } + + // Check for '1/19/70 8:14PM' + // where starts with mm/dd/yy or yy/mm/dd and have something after + // Check if 1st postiion is greater than 31, assume it is year. + // Assme all 2 digit years are 1900's. + // Finally, change them into US style mm/dd/yyyy representations. + match = parsable.match(/^([0-9]{1,2})[-\/]([0-9]{1,2})[-\/]([0-9]{1,2})[^0-9]/); + + function h1(parsable, match) { + var m1 = parseFloat(match[1]); + var m2 = parseFloat(match[2]); + var m3 = parseFloat(match[3]); + var cent = jsDate.config.defaultCentury; + var ny, nd, nm, str; + + if (m1 > 31) { // first number is a year + nd = m3; + nm = m2; + ny = cent + m1; + } + + else { // last number is the year + nd = m2; + nm = m1; + ny = cent + m3; + } + + str = nm+'/'+nd+'/'+ny; + + // now replace 2 digit year with 4 digit year + return parsable.replace(/^([0-9]{1,2})[-\/]([0-9]{1,2})[-\/]([0-9]{1,2})/, str); + + } + + if (match && match.length > 3) { + parsable = h1(parsable, match); + } + + // Now check for '1/19/70' with nothing after and do as above + var match = parsable.match(/^([0-9]{1,2})[-\/]([0-9]{1,2})[-\/]([0-9]{1,2})$/); + + if (match && match.length > 3) { + parsable = h1(parsable, match); + } + + + var i = 0; + var length = jsDate.matchers.length; + var pattern, + ms, + current = parsable, + obj; + while (i < length) { + ms = Date.parse(current); + if (!isNaN(ms)) { + return new Date(ms); + } + pattern = jsDate.matchers[i]; + if (typeof pattern == 'function') { + obj = pattern.call(jsDate, current); + if (obj instanceof Date) { + return obj; + } + } else { + current = parsable.replace(pattern[0], pattern[1]); + } + i++; + } + return NaN; + }; + + + /** + * @static + * Handy static utility function to return the number of days in a given month. + * @param {Integer} year Year + * @param {Integer} month Month (1-12) + * @returns {Integer} Number of days in the month. + */ + // + // handy utility method Borrowed right from Ken Snyder's Date Instance Mehtods. + // + jsDate.daysInMonth = function(year, month) { + if (month == 2) { + return new Date(year, 1, 29).getDate() == 29 ? 29 : 28; + } + return [undefined,31,undefined,31,30,31,30,31,31,30,31,30,31][month]; + }; + + + // + // An Array of regular expressions or functions that will attempt to match the date string. + // Functions are called with scope of a jsDate instance. + // + jsDate.matchers = [ + // convert dd.mmm.yyyy to mm/dd/yyyy (world date to US date). + [/(3[01]|[0-2]\d)\s*\.\s*(1[0-2]|0\d)\s*\.\s*([1-9]\d{3})/, '$2/$1/$3'], + // convert yyyy-mm-dd to mm/dd/yyyy (ISO date to US date). + [/([1-9]\d{3})\s*-\s*(1[0-2]|0\d)\s*-\s*(3[01]|[0-2]\d)/, '$2/$3/$1'], + // Handle 12 hour or 24 hour time with milliseconds am/pm and optional date part. + function(str) { + var match = str.match(/^(?:(.+)\s+)?([012]?\d)(?:\s*\:\s*(\d\d))?(?:\s*\:\s*(\d\d(\.\d*)?))?\s*(am|pm)?\s*$/i); + // opt. date hour opt. minute opt. second opt. msec opt. am or pm + if (match) { + if (match[1]) { + var d = this.createDate(match[1]); + if (isNaN(d)) { + return; + } + } else { + var d = new Date(); + d.setMilliseconds(0); + } + var hour = parseFloat(match[2]); + if (match[6]) { + hour = match[6].toLowerCase() == 'am' ? (hour == 12 ? 0 : hour) : (hour == 12 ? 12 : hour + 12); + } + d.setHours(hour, parseInt(match[3] || 0, 10), parseInt(match[4] || 0, 10), ((parseFloat(match[5] || 0)) || 0)*1000); + return d; + } + else { + return str; + } + }, + // Handle ISO timestamp with time zone. + function(str) { + var match = str.match(/^(?:(.+))[T|\s+]([012]\d)(?:\:(\d\d))(?:\:(\d\d))(?:\.\d+)([\+\-]\d\d\:\d\d)$/i); + if (match) { + if (match[1]) { + var d = this.createDate(match[1]); + if (isNaN(d)) { + return; + } + } else { + var d = new Date(); + d.setMilliseconds(0); + } + var hour = parseFloat(match[2]); + d.setHours(hour, parseInt(match[3], 10), parseInt(match[4], 10), parseFloat(match[5])*1000); + return d; + } + else { + return str; + } + }, + // Try to match ambiguous strings like 12/8/22. + // Use FF date assumption that 2 digit years are 20th century (i.e. 1900's). + // This may be redundant with pre processing of date already performed. + function(str) { + var match = str.match(/^([0-3]?\d)\s*[-\/.\s]{1}\s*([a-zA-Z]{3,9})\s*[-\/.\s]{1}\s*([0-3]?\d)$/); + if (match) { + var d = new Date(); + var cent = jsDate.config.defaultCentury; + var m1 = parseFloat(match[1]); + var m3 = parseFloat(match[3]); + var ny, nd, nm; + if (m1 > 31) { // first number is a year + nd = m3; + ny = cent + m1; + } + + else { // last number is the year + nd = m1; + ny = cent + m3; + } + + var nm = inArray(match[2], jsDate.regional[jsDate.regional.getLocale()]["monthNamesShort"]); + + if (nm == -1) { + nm = inArray(match[2], jsDate.regional[jsDate.regional.getLocale()]["monthNames"]); + } + + d.setFullYear(ny, nm, nd); + d.setHours(0,0,0,0); + return d; + } + + else { + return str; + } + } + ]; + + // + // I think John Reisig published this method on his blog, ejohn. + // + function inArray( elem, array ) { + if ( array.indexOf ) { + return array.indexOf( elem ); + } + + for ( var i = 0, length = array.length; i < length; i++ ) { + if ( array[ i ] === elem ) { + return i; + } + } + + return -1; + } + + // + // Thanks to Kangax, Christian Sciberras and Stack Overflow for this method. + // + function get_type(thing){ + if(thing===null) return "[object Null]"; // special case + return Object.prototype.toString.call(thing); + } + + $.jsDate = jsDate; + + + /** + * JavaScript printf/sprintf functions. + * + * This code has been adapted from the publicly available sprintf methods + * by Ash Searle. His original header follows: + * + * This code is unrestricted: you are free to use it however you like. + * + * The functions should work as expected, performing left or right alignment, + * truncating strings, outputting numbers with a required precision etc. + * + * For complex cases, these functions follow the Perl implementations of + * (s)printf, allowing arguments to be passed out-of-order, and to set the + * precision or length of the output based on arguments instead of fixed + * numbers. + * + * See http://perldoc.perl.org/functions/sprintf.html for more information. + * + * Implemented: + * - zero and space-padding + * - right and left-alignment, + * - base X prefix (binary, octal and hex) + * - positive number prefix + * - (minimum) width + * - precision / truncation / maximum width + * - out of order arguments + * + * Not implemented (yet): + * - vector flag + * - size (bytes, words, long-words etc.) + * + * Will not implement: + * - %n or %p (no pass-by-reference in JavaScript) + * + * @version 2007.04.27 + * @author Ash Searle + * + * You can see the original work and comments on his blog: + * http://hexmen.com/blog/2007/03/printf-sprintf/ + * http://hexmen.com/js/sprintf.js + */ + + /** + * @Modifications 2009.05.26 + * @author Chris Leonello + * + * Added %p %P specifier + * Acts like %g or %G but will not add more significant digits to the output than present in the input. + * Example: + * Format: '%.3p', Input: 0.012, Output: 0.012 + * Format: '%.3g', Input: 0.012, Output: 0.0120 + * Format: '%.4p', Input: 12.0, Output: 12.0 + * Format: '%.4g', Input: 12.0, Output: 12.00 + * Format: '%.4p', Input: 4.321e-5, Output: 4.321e-5 + * Format: '%.4g', Input: 4.321e-5, Output: 4.3210e-5 + * + * Example: + * >>> $.jqplot.sprintf('%.2f, %d', 23.3452, 43.23) + * "23.35, 43" + * >>> $.jqplot.sprintf("no value: %n, decimal with thousands separator: %'d", 23.3452, 433524) + * "no value: , decimal with thousands separator: 433,524" + */ + $.jqplot.sprintf = function() { + function pad(str, len, chr, leftJustify) { + var padding = (str.length >= len) ? '' : Array(1 + len - str.length >>> 0).join(chr); + return leftJustify ? str + padding : padding + str; + + } + + function thousand_separate(value) { + var value_str = new String(value); + for (var i=10; i>0; i--) { + if (value_str == (value_str = value_str.replace(/^(\d+)(\d{3})/, "$1"+$.jqplot.sprintf.thousandsSeparator+"$2"))) break; + } + return value_str; + } + + function justify(value, prefix, leftJustify, minWidth, zeroPad, htmlSpace) { + var diff = minWidth - value.length; + if (diff > 0) { + var spchar = ' '; + if (htmlSpace) { spchar = ' '; } + if (leftJustify || !zeroPad) { + value = pad(value, minWidth, spchar, leftJustify); + } else { + value = value.slice(0, prefix.length) + pad('', diff, '0', true) + value.slice(prefix.length); + } + } + return value; + } + + function formatBaseX(value, base, prefix, leftJustify, minWidth, precision, zeroPad, htmlSpace) { + // Note: casts negative numbers to positive ones + var number = value >>> 0; + prefix = prefix && number && {'2': '0b', '8': '0', '16': '0x'}[base] || ''; + value = prefix + pad(number.toString(base), precision || 0, '0', false); + return justify(value, prefix, leftJustify, minWidth, zeroPad, htmlSpace); + } + + function formatString(value, leftJustify, minWidth, precision, zeroPad, htmlSpace) { + if (precision != null) { + value = value.slice(0, precision); + } + return justify(value, '', leftJustify, minWidth, zeroPad, htmlSpace); + } + + var a = arguments, i = 0, format = a[i++]; + + return format.replace($.jqplot.sprintf.regex, function(substring, valueIndex, flags, minWidth, _, precision, type) { + if (substring == '%%') { return '%'; } + + // parse flags + var leftJustify = false, positivePrefix = '', zeroPad = false, prefixBaseX = false, htmlSpace = false, thousandSeparation = false; + for (var j = 0; flags && j < flags.length; j++) switch (flags.charAt(j)) { + case ' ': positivePrefix = ' '; break; + case '+': positivePrefix = '+'; break; + case '-': leftJustify = true; break; + case '0': zeroPad = true; break; + case '#': prefixBaseX = true; break; + case '&': htmlSpace = true; break; + case '\'': thousandSeparation = true; break; + } + + // parameters may be null, undefined, empty-string or real valued + // we want to ignore null, undefined and empty-string values + + if (!minWidth) { + minWidth = 0; + } + else if (minWidth == '*') { + minWidth = +a[i++]; + } + else if (minWidth.charAt(0) == '*') { + minWidth = +a[minWidth.slice(1, -1)]; + } + else { + minWidth = +minWidth; + } + + // Note: undocumented perl feature: + if (minWidth < 0) { + minWidth = -minWidth; + leftJustify = true; + } + + if (!isFinite(minWidth)) { + throw new Error('$.jqplot.sprintf: (minimum-)width must be finite'); + } + + if (!precision) { + precision = 'fFeE'.indexOf(type) > -1 ? 6 : (type == 'd') ? 0 : void(0); + } + else if (precision == '*') { + precision = +a[i++]; + } + else if (precision.charAt(0) == '*') { + precision = +a[precision.slice(1, -1)]; + } + else { + precision = +precision; + } + + // grab value using valueIndex if required? + var value = valueIndex ? a[valueIndex.slice(0, -1)] : a[i++]; + + switch (type) { + case 's': { + if (value == null) { + return ''; + } + return formatString(String(value), leftJustify, minWidth, precision, zeroPad, htmlSpace); + } + case 'c': return formatString(String.fromCharCode(+value), leftJustify, minWidth, precision, zeroPad, htmlSpace); + case 'b': return formatBaseX(value, 2, prefixBaseX, leftJustify, minWidth, precision, zeroPad,htmlSpace); + case 'o': return formatBaseX(value, 8, prefixBaseX, leftJustify, minWidth, precision, zeroPad, htmlSpace); + case 'x': return formatBaseX(value, 16, prefixBaseX, leftJustify, minWidth, precision, zeroPad, htmlSpace); + case 'X': return formatBaseX(value, 16, prefixBaseX, leftJustify, minWidth, precision, zeroPad, htmlSpace).toUpperCase(); + case 'u': return formatBaseX(value, 10, prefixBaseX, leftJustify, minWidth, precision, zeroPad, htmlSpace); + case 'i': { + var number = parseInt(+value, 10); + if (isNaN(number)) { + return ''; + } + var prefix = number < 0 ? '-' : positivePrefix; + var number_str = thousandSeparation ? thousand_separate(String(Math.abs(number))): String(Math.abs(number)); + value = prefix + pad(number_str, precision, '0', false); + //value = prefix + pad(String(Math.abs(number)), precision, '0', false); + return justify(value, prefix, leftJustify, minWidth, zeroPad, htmlSpace); + } + case 'd': { + var number = Math.round(+value); + if (isNaN(number)) { + return ''; + } + var prefix = number < 0 ? '-' : positivePrefix; + var number_str = thousandSeparation ? thousand_separate(String(Math.abs(number))): String(Math.abs(number)); + value = prefix + pad(number_str, precision, '0', false); + return justify(value, prefix, leftJustify, minWidth, zeroPad, htmlSpace); + } + case 'e': + case 'E': + case 'f': + case 'F': + case 'g': + case 'G': + { + var number = +value; + if (isNaN(number)) { + return ''; + } + var prefix = number < 0 ? '-' : positivePrefix; + var method = ['toExponential', 'toFixed', 'toPrecision']['efg'.indexOf(type.toLowerCase())]; + var textTransform = ['toString', 'toUpperCase']['eEfFgG'.indexOf(type) % 2]; + var number_str = Math.abs(number)[method](precision); + number_str = thousandSeparation ? thousand_separate(number_str): number_str; + value = prefix + number_str; + return justify(value, prefix, leftJustify, minWidth, zeroPad, htmlSpace)[textTransform](); + } + case 'p': + case 'P': + { + // make sure number is a number + var number = +value; + if (isNaN(number)) { + return ''; + } + var prefix = number < 0 ? '-' : positivePrefix; + + var parts = String(Number(Math.abs(number)).toExponential()).split(/e|E/); + var sd = (parts[0].indexOf('.') != -1) ? parts[0].length - 1 : parts[0].length; + var zeros = (parts[1] < 0) ? -parts[1] - 1 : 0; + + if (Math.abs(number) < 1) { + if (sd + zeros <= precision) { + value = prefix + Math.abs(number).toPrecision(sd); + } + else { + if (sd <= precision - 1) { + value = prefix + Math.abs(number).toExponential(sd-1); + } + else { + value = prefix + Math.abs(number).toExponential(precision-1); + } + } + } + else { + var prec = (sd <= precision) ? sd : precision; + value = prefix + Math.abs(number).toPrecision(prec); + } + var textTransform = ['toString', 'toUpperCase']['pP'.indexOf(type) % 2]; + return justify(value, prefix, leftJustify, minWidth, zeroPad, htmlSpace)[textTransform](); + } + case 'n': return ''; + default: return substring; + } + }); + }; + + $.jqplot.sprintf.thousandsSeparator = ','; + + $.jqplot.sprintf.regex = /%%|%(\d+\$)?([-+#0&\' ]*)(\*\d+\$|\*|\d+)?(\.(\*\d+\$|\*|\d+))?([nAscboxXuidfegpEGP])/g; + + $.jqplot.getSignificantFigures = function(number) { + var parts = String(Number(Math.abs(number)).toExponential()).split(/e|E/); + // total significant digits + var sd = (parts[0].indexOf('.') != -1) ? parts[0].length - 1 : parts[0].length; + var zeros = (parts[1] < 0) ? -parts[1] - 1 : 0; + // exponent + var expn = parseInt(parts[1], 10); + // digits to the left of the decimal place + var dleft = (expn + 1 > 0) ? expn + 1 : 0; + // digits to the right of the decimal place + var dright = (sd <= dleft) ? 0 : sd - expn - 1; + return {significantDigits: sd, digitsLeft: dleft, digitsRight: dright, zeros: zeros, exponent: expn} ; + }; + + $.jqplot.getPrecision = function(number) { + return $.jqplot.getSignificantFigures(number).digitsRight; + }; + +})(jQuery); + + + var backCompat = $.uiBackCompat !== false; + + $.jqplot.effects = { + effect: {} + }; + + // prefix used for storing data on .data() + var dataSpace = "jqplot.storage."; + + /******************************************************************************/ + /*********************************** EFFECTS **********************************/ + /******************************************************************************/ + + $.extend( $.jqplot.effects, { + version: "1.9pre", + + // Saves a set of properties in a data storage + save: function( element, set ) { + for( var i=0; i < set.length; i++ ) { + if ( set[ i ] !== null ) { + element.data( dataSpace + set[ i ], element[ 0 ].style[ set[ i ] ] ); + } + } + }, + + // Restores a set of previously saved properties from a data storage + restore: function( element, set ) { + for( var i=0; i < set.length; i++ ) { + if ( set[ i ] !== null ) { + element.css( set[ i ], element.data( dataSpace + set[ i ] ) ); + } + } + }, + + setMode: function( el, mode ) { + if (mode === "toggle") { + mode = el.is( ":hidden" ) ? "show" : "hide"; + } + return mode; + }, + + // Wraps the element around a wrapper that copies position properties + createWrapper: function( element ) { + + // if the element is already wrapped, return it + if ( element.parent().is( ".ui-effects-wrapper" )) { + return element.parent(); + } + + // wrap the element + var props = { + width: element.outerWidth(true), + height: element.outerHeight(true), + "float": element.css( "float" ) + }, + wrapper = $( "<div></div>" ) + .addClass( "ui-effects-wrapper" ) + .css({ + fontSize: "100%", + background: "transparent", + border: "none", + margin: 0, + padding: 0 + }), + // Store the size in case width/height are defined in % - Fixes #5245 + size = { + width: element.width(), + height: element.height() + }, + active = document.activeElement; + + element.wrap( wrapper ); + + // Fixes #7595 - Elements lose focus when wrapped. + if ( element[ 0 ] === active || $.contains( element[ 0 ], active ) ) { + $( active ).focus(); + } + + wrapper = element.parent(); //Hotfix for jQuery 1.4 since some change in wrap() seems to actually loose the reference to the wrapped element + + // transfer positioning properties to the wrapper + if ( element.css( "position" ) === "static" ) { + wrapper.css({ position: "relative" }); + element.css({ position: "relative" }); + } else { + $.extend( props, { + position: element.css( "position" ), + zIndex: element.css( "z-index" ) + }); + $.each([ "top", "left", "bottom", "right" ], function(i, pos) { + props[ pos ] = element.css( pos ); + if ( isNaN( parseInt( props[ pos ], 10 ) ) ) { + props[ pos ] = "auto"; + } + }); + element.css({ + position: "relative", + top: 0, + left: 0, + right: "auto", + bottom: "auto" + }); + } + element.css(size); + + return wrapper.css( props ).show(); + }, + + removeWrapper: function( element ) { + var active = document.activeElement; + + if ( element.parent().is( ".ui-effects-wrapper" ) ) { + element.parent().replaceWith( element ); + + // Fixes #7595 - Elements lose focus when wrapped. + if ( element[ 0 ] === active || $.contains( element[ 0 ], active ) ) { + $( active ).focus(); + } + } + + + return element; + } + }); + + // return an effect options object for the given parameters: + function _normalizeArguments( effect, options, speed, callback ) { + + // short path for passing an effect options object: + if ( $.isPlainObject( effect ) ) { + return effect; + } + + // convert to an object + effect = { effect: effect }; + + // catch (effect) + if ( options === undefined ) { + options = {}; + } + + // catch (effect, callback) + if ( $.isFunction( options ) ) { + callback = options; + speed = null; + options = {}; + } + + // catch (effect, speed, ?) + if ( $.type( options ) === "number" || $.fx.speeds[ options ]) { + callback = speed; + speed = options; + options = {}; + } + + // catch (effect, options, callback) + if ( $.isFunction( speed ) ) { + callback = speed; + speed = null; + } + + // add options to effect + if ( options ) { + $.extend( effect, options ); + } + + speed = speed || options.duration; + effect.duration = $.fx.off ? 0 : typeof speed === "number" + ? speed : speed in $.fx.speeds ? $.fx.speeds[ speed ] : $.fx.speeds._default; + + effect.complete = callback || options.complete; + + return effect; + } + + function standardSpeed( speed ) { + // valid standard speeds + if ( !speed || typeof speed === "number" || $.fx.speeds[ speed ] ) { + return true; + } + + // invalid strings - treat as "normal" speed + if ( typeof speed === "string" && !$.jqplot.effects.effect[ speed ] ) { + // TODO: remove in 2.0 (#7115) + if ( backCompat && $.jqplot.effects[ speed ] ) { + return false; + } + return true; + } + + return false; + } + + $.fn.extend({ + jqplotEffect: function( effect, options, speed, callback ) { + var args = _normalizeArguments.apply( this, arguments ), + mode = args.mode, + queue = args.queue, + effectMethod = $.jqplot.effects.effect[ args.effect ], + + // DEPRECATED: remove in 2.0 (#7115) + oldEffectMethod = !effectMethod && backCompat && $.jqplot.effects[ args.effect ]; + + if ( $.fx.off || !( effectMethod || oldEffectMethod ) ) { + // delegate to the original method (e.g., .show()) if possible + if ( mode ) { + return this[ mode ]( args.duration, args.complete ); + } else { + return this.each( function() { + if ( args.complete ) { + args.complete.call( this ); + } + }); + } + } + + function run( next ) { + var elem = $( this ), + complete = args.complete, + mode = args.mode; + + function done() { + if ( $.isFunction( complete ) ) { + complete.call( elem[0] ); + } + if ( $.isFunction( next ) ) { + next(); + } + } + + // if the element is hiddden and mode is hide, + // or element is visible and mode is show + if ( elem.is( ":hidden" ) ? mode === "hide" : mode === "show" ) { + done(); + } else { + effectMethod.call( elem[0], args, done ); + } + } + + // TODO: remove this check in 2.0, effectMethod will always be true + if ( effectMethod ) { + return queue === false ? this.each( run ) : this.queue( queue || "fx", run ); + } else { + // DEPRECATED: remove in 2.0 (#7115) + return oldEffectMethod.call(this, { + options: args, + duration: args.duration, + callback: args.complete, + mode: args.mode + }); + } + } + }); + + + + var rvertical = /up|down|vertical/, + rpositivemotion = /up|left|vertical|horizontal/; + + $.jqplot.effects.effect.blind = function( o, done ) { + // Create element + var el = $( this ), + props = [ "position", "top", "bottom", "left", "right", "height", "width" ], + mode = $.jqplot.effects.setMode( el, o.mode || "hide" ), + direction = o.direction || "up", + vertical = rvertical.test( direction ), + ref = vertical ? "height" : "width", + ref2 = vertical ? "top" : "left", + motion = rpositivemotion.test( direction ), + animation = {}, + show = mode === "show", + wrapper, distance, top; + + // // if already wrapped, the wrapper's properties are my property. #6245 + if ( el.parent().is( ".ui-effects-wrapper" ) ) { + $.jqplot.effects.save( el.parent(), props ); + } else { + $.jqplot.effects.save( el, props ); + } + el.show(); + top = parseInt(el.css('top'), 10); + wrapper = $.jqplot.effects.createWrapper( el ).css({ + overflow: "hidden" + }); + + distance = vertical ? wrapper[ ref ]() + top : wrapper[ ref ](); + + animation[ ref ] = show ? String(distance) : '0'; + if ( !motion ) { + el + .css( vertical ? "bottom" : "right", 0 ) + .css( vertical ? "top" : "left", "" ) + .css({ position: "absolute" }); + animation[ ref2 ] = show ? '0' : String(distance); + } + + // // start at 0 if we are showing + if ( show ) { + wrapper.css( ref, 0 ); + if ( ! motion ) { + wrapper.css( ref2, distance ); + } + } + + // // Animate + wrapper.animate( animation, { + duration: o.duration, + easing: o.easing, + queue: false, + complete: function() { + if ( mode === "hide" ) { + el.hide(); + } + $.jqplot.effects.restore( el, props ); + $.jqplot.effects.removeWrapper( el ); + done(); + } + }); + + }; + + diff --git a/libreplan-webapp/src/main/webapp/jqplot/jquery.jqplot.min.css b/libreplan-webapp/src/main/webapp/jqplot/jquery.jqplot.min.css new file mode 100644 index 000000000..de15fff5b --- /dev/null +++ b/libreplan-webapp/src/main/webapp/jqplot/jquery.jqplot.min.css @@ -0,0 +1 @@ +.jqplot-target{position:relative;color:#666;font-family:"Trebuchet MS",Arial,Helvetica,sans-serif;font-size:1em;}.jqplot-axis{font-size:.75em;}.jqplot-xaxis{margin-top:10px;}.jqplot-x2axis{margin-bottom:10px;}.jqplot-yaxis{margin-right:10px;}.jqplot-y2axis,.jqplot-y3axis,.jqplot-y4axis,.jqplot-y5axis,.jqplot-y6axis,.jqplot-y7axis,.jqplot-y8axis,.jqplot-y9axis,.jqplot-yMidAxis{margin-left:10px;margin-right:10px;}.jqplot-axis-tick,.jqplot-xaxis-tick,.jqplot-yaxis-tick,.jqplot-x2axis-tick,.jqplot-y2axis-tick,.jqplot-y3axis-tick,.jqplot-y4axis-tick,.jqplot-y5axis-tick,.jqplot-y6axis-tick,.jqplot-y7axis-tick,.jqplot-y8axis-tick,.jqplot-y9axis-tick,.jqplot-yMidAxis-tick{position:absolute;white-space:pre;}.jqplot-xaxis-tick{top:0;left:15px;vertical-align:top;}.jqplot-x2axis-tick{bottom:0;left:15px;vertical-align:bottom;}.jqplot-yaxis-tick{right:0;top:15px;text-align:right;}.jqplot-yaxis-tick.jqplot-breakTick{right:-20px;margin-right:0;padding:1px 5px 1px 5px;z-index:2;font-size:1.5em;}.jqplot-y2axis-tick,.jqplot-y3axis-tick,.jqplot-y4axis-tick,.jqplot-y5axis-tick,.jqplot-y6axis-tick,.jqplot-y7axis-tick,.jqplot-y8axis-tick,.jqplot-y9axis-tick{left:0;top:15px;text-align:left;}.jqplot-yMidAxis-tick{text-align:center;white-space:nowrap;}.jqplot-xaxis-label{margin-top:10px;font-size:11pt;position:absolute;}.jqplot-x2axis-label{margin-bottom:10px;font-size:11pt;position:absolute;}.jqplot-yaxis-label{margin-right:10px;font-size:11pt;position:absolute;}.jqplot-yMidAxis-label{font-size:11pt;position:absolute;}.jqplot-y2axis-label,.jqplot-y3axis-label,.jqplot-y4axis-label,.jqplot-y5axis-label,.jqplot-y6axis-label,.jqplot-y7axis-label,.jqplot-y8axis-label,.jqplot-y9axis-label{font-size:11pt;margin-left:10px;position:absolute;}.jqplot-meterGauge-tick{font-size:.75em;color:#999;}.jqplot-meterGauge-label{font-size:1em;color:#999;}table.jqplot-table-legend{margin-top:12px;margin-bottom:12px;margin-left:12px;margin-right:12px;}table.jqplot-table-legend,table.jqplot-cursor-legend{background-color:rgba(255,255,255,0.6);border:1px solid #ccc;position:absolute;font-size:.75em;}td.jqplot-table-legend{vertical-align:middle;}td.jqplot-seriesToggle:hover,td.jqplot-seriesToggle:active{cursor:pointer;}.jqplot-table-legend .jqplot-series-hidden{text-decoration:line-through;}div.jqplot-table-legend-swatch-outline{border:1px solid #ccc;padding:1px;}div.jqplot-table-legend-swatch{width:0;height:0;border-top-width:5px;border-bottom-width:5px;border-left-width:6px;border-right-width:6px;border-top-style:solid;border-bottom-style:solid;border-left-style:solid;border-right-style:solid;}.jqplot-title{top:0;left:0;padding-bottom:.5em;font-size:1.2em;}table.jqplot-cursor-tooltip{border:1px solid #ccc;font-size:.75em;}.jqplot-cursor-tooltip{border:1px solid #ccc;font-size:.75em;white-space:nowrap;background:rgba(208,208,208,0.5);padding:1px;}.jqplot-highlighter-tooltip,.jqplot-canvasOverlay-tooltip{border:1px solid #ccc;font-size:.75em;white-space:nowrap;background:rgba(208,208,208,0.5);padding:1px;}.jqplot-point-label{font-size:.75em;z-index:2;}td.jqplot-cursor-legend-swatch{vertical-align:middle;text-align:center;}div.jqplot-cursor-legend-swatch{width:1.2em;height:.7em;}.jqplot-error{text-align:center;}.jqplot-error-message{position:relative;top:46%;display:inline-block;}div.jqplot-bubble-label{font-size:.8em;padding-left:2px;padding-right:2px;color:rgb(20%,20%,20%);}div.jqplot-bubble-label.jqplot-bubble-label-highlight{background:rgba(90%,90%,90%,0.7);}div.jqplot-noData-container{text-align:center;background-color:rgba(96%,96%,96%,0.3);} \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/jquery.jqplot.min.js b/libreplan-webapp/src/main/webapp/jqplot/jquery.jqplot.min.js new file mode 100644 index 000000000..52b575050 --- /dev/null +++ b/libreplan-webapp/src/main/webapp/jqplot/jquery.jqplot.min.js @@ -0,0 +1,57 @@ +/** + * jqPlot + * Pure JavaScript plotting plugin using jQuery + * + * Version: 1.0.0b2_r1012 + * + * Copyright (c) 2009-2011 Chris Leonello + * jqPlot is currently available for use in all personal or commercial projects + * under both the MIT (http://www.opensource.org/licenses/mit-license.php) and GPL + * version 2.0 (http://www.gnu.org/licenses/gpl-2.0.html) licenses. This means that you can + * choose the license that best suits your project and use it accordingly. + * + * Although not required, the author would appreciate an email letting him + * know of any substantial use of jqPlot. You can reach the author at: + * chris at jqplot dot com or see http://www.jqplot.com/info.php . + * + * If you are feeling kind and generous, consider supporting the project by + * making a donation at: http://www.jqplot.com/donate.php . + * + * sprintf functions contained in jqplot.sprintf.js by Ash Searle: + * + * version 2007.04.27 + * author Ash Searle + * http://hexmen.com/blog/2007/03/printf-sprintf/ + * http://hexmen.com/js/sprintf.js + * The author (Ash Searle) has placed this code in the public domain: + * "This code is unrestricted: you are free to use it however you like." + * + * included jsDate library by Chris Leonello: + * + * Copyright (c) 2010-2011 Chris Leonello + * + * jsDate is currently available for use in all personal or commercial projects + * under both the MIT and GPL version 2.0 licenses. This means that you can + * choose the license that best suits your project and use it accordingly. + * + * jsDate borrows many concepts and ideas from the Date Instance + * Methods by Ken Snyder along with some parts of Ken's actual code. + * + * Ken's origianl Date Instance Methods and copyright notice: + * + * Ken Snyder (ken d snyder at gmail dot com) + * 2008-09-10 + * version 2.0.2 (http://kendsnyder.com/sandbox/date/) + * Creative Commons Attribution License 3.0 (http://creativecommons.org/licenses/by/3.0/) + * + * jqplotToImage function based on Larry Siden's export-jqplot-to-png.js. + * Larry has generously given permission to adapt his code for inclusion + * into jqPlot. + * + * Larry's original code can be found here: + * + * https://github.com/lsiden/export-jqplot-to-png + * + * + */ +(function(H){var r;H.fn.emptyForce=function(){for(var ab=0,ac;(ac=H(this)[ab])!=null;ab++){if(ac.nodeType===1){jQuery.cleanData(ac.getElementsByTagName("*"))}if(H.jqplot_use_excanvas){ac.outerHTML=""}else{while(ac.firstChild){ac.removeChild(ac.firstChild)}}ac=null}return H(this)};H.fn.removeChildForce=function(ab){while(ab.firstChild){this.removeChildForce(ab.firstChild);ab.removeChild(ab.firstChild)}};H.jqplot=function(ah,ae,ac){var ad,ab;if(ac==null){if(jQuery.isArray(ae)){ad=ae;ab=null}else{if(typeof(ae)==="object"){ad=null;ab=ae}}}else{ad=ae;ab=ac}var ag=new N();H("#"+ah).removeClass("jqplot-error");if(H.jqplot.config.catchErrors){try{ag.init(ah,ad,ab);ag.draw();ag.themeEngine.init.call(ag);return ag}catch(af){var ai=H.jqplot.config.errorMessage||af.message;H("#"+ah).append('<div class="jqplot-error-message">'+ai+"</div>");H("#"+ah).addClass("jqplot-error");document.getElementById(ah).style.background=H.jqplot.config.errorBackground;document.getElementById(ah).style.border=H.jqplot.config.errorBorder;document.getElementById(ah).style.fontFamily=H.jqplot.config.errorFontFamily;document.getElementById(ah).style.fontSize=H.jqplot.config.errorFontSize;document.getElementById(ah).style.fontStyle=H.jqplot.config.errorFontStyle;document.getElementById(ah).style.fontWeight=H.jqplot.config.errorFontWeight}}else{ag.init(ah,ad,ab);ag.draw();ag.themeEngine.init.call(ag);return ag}};H.jqplot.version="1.0.0b2_r1012";H.jqplot.CanvasManager=function(){if(typeof H.jqplot.CanvasManager.canvases=="undefined"){H.jqplot.CanvasManager.canvases=[];H.jqplot.CanvasManager.free=[]}var ab=[];this.getCanvas=function(){var ae;var ad=true;if(!H.jqplot.use_excanvas){for(var af=0,ac=H.jqplot.CanvasManager.canvases.length;af<ac;af++){if(H.jqplot.CanvasManager.free[af]===true){ad=false;ae=H.jqplot.CanvasManager.canvases[af];H.jqplot.CanvasManager.free[af]=false;ab.push(af);break}}}if(ad){ae=document.createElement("canvas");ab.push(H.jqplot.CanvasManager.canvases.length);H.jqplot.CanvasManager.canvases.push(ae);H.jqplot.CanvasManager.free.push(false)}return ae};this.initCanvas=function(ac){if(H.jqplot.use_excanvas){return window.G_vmlCanvasManager.initElement(ac)}return ac};this.freeAllCanvases=function(){for(var ad=0,ac=ab.length;ad<ac;ad++){this.freeCanvas(ab[ad])}ab=[]};this.freeCanvas=function(ac){if(H.jqplot.use_excanvas&&window.G_vmlCanvasManager.uninitElement!==r){window.G_vmlCanvasManager.uninitElement(H.jqplot.CanvasManager.canvases[ac]);H.jqplot.CanvasManager.canvases[ac]=null}else{var ad=H.jqplot.CanvasManager.canvases[ac];ad.getContext("2d").clearRect(0,0,ad.width,ad.height);H(ad).unbind().removeAttr("class").removeAttr("style");H(ad).css({left:"",top:"",position:""});ad.width=0;ad.height=0;H.jqplot.CanvasManager.free[ac]=true}}};H.jqplot.log=function(){if(window.console){window.console.log.apply(window.console,arguments)}};H.jqplot.config={addDomReference:false,enablePlugins:false,defaultHeight:300,defaultWidth:400,UTCAdjust:false,timezoneOffset:new Date(new Date().getTimezoneOffset()*60000),errorMessage:"",errorBackground:"",errorBorder:"",errorFontFamily:"",errorFontSize:"",errorFontStyle:"",errorFontWeight:"",catchErrors:false,defaultTickFormatString:"%.1f",defaultColors:["#4bb2c5","#EAA228","#c5b47f","#579575","#839557","#958c12","#953579","#4b5de4","#d8b83f","#ff5800","#0085cc","#c747a3","#cddf54","#FBD178","#26B4E3","#bd70c7"],defaultNegativeColors:["#498991","#C08840","#9F9274","#546D61","#646C4A","#6F6621","#6E3F5F","#4F64B0","#A89050","#C45923","#187399","#945381","#959E5C","#C7AF7B","#478396","#907294"],dashLength:4,gapLength:4,dotGapLength:2.5,srcLocation:"jqplot/src/",pluginLocation:"jqplot/src/plugins/"};H.jqplot.arrayMax=function(ab){return Math.max.apply(Math,ab)};H.jqplot.arrayMin=function(ab){return Math.min.apply(Math,ab)};H.jqplot.enablePlugins=H.jqplot.config.enablePlugins;H.jqplot.support_canvas=function(){if(typeof H.jqplot.support_canvas.result=="undefined"){H.jqplot.support_canvas.result=!!document.createElement("canvas").getContext}return H.jqplot.support_canvas.result};H.jqplot.support_canvas_text=function(){if(typeof H.jqplot.support_canvas_text.result=="undefined"){if(window.G_vmlCanvasManager!==r&&window.G_vmlCanvasManager._version>887){H.jqplot.support_canvas_text.result=true}else{H.jqplot.support_canvas_text.result=!!(document.createElement("canvas").getContext&&typeof document.createElement("canvas").getContext("2d").fillText=="function")}}return H.jqplot.support_canvas_text.result};H.jqplot.use_excanvas=(H.browser.msie&&!H.jqplot.support_canvas())?true:false;H.jqplot.preInitHooks=[];H.jqplot.postInitHooks=[];H.jqplot.preParseOptionsHooks=[];H.jqplot.postParseOptionsHooks=[];H.jqplot.preDrawHooks=[];H.jqplot.postDrawHooks=[];H.jqplot.preDrawSeriesHooks=[];H.jqplot.postDrawSeriesHooks=[];H.jqplot.preDrawLegendHooks=[];H.jqplot.addLegendRowHooks=[];H.jqplot.preSeriesInitHooks=[];H.jqplot.postSeriesInitHooks=[];H.jqplot.preParseSeriesOptionsHooks=[];H.jqplot.postParseSeriesOptionsHooks=[];H.jqplot.eventListenerHooks=[];H.jqplot.preDrawSeriesShadowHooks=[];H.jqplot.postDrawSeriesShadowHooks=[];H.jqplot.ElemContainer=function(){this._elem;this._plotWidth;this._plotHeight;this._plotDimensions={height:null,width:null}};H.jqplot.ElemContainer.prototype.createElement=function(ae,ag,ac,ad,ah){this._offsets=ag;var ab=ac||"jqplot";var af=document.createElement(ae);this._elem=H(af);this._elem.addClass(ab);this._elem.css(ad);this._elem.attr(ah);af=null;return this._elem};H.jqplot.ElemContainer.prototype.getWidth=function(){if(this._elem){return this._elem.outerWidth(true)}else{return null}};H.jqplot.ElemContainer.prototype.getHeight=function(){if(this._elem){return this._elem.outerHeight(true)}else{return null}};H.jqplot.ElemContainer.prototype.getPosition=function(){if(this._elem){return this._elem.position()}else{return{top:null,left:null,bottom:null,right:null}}};H.jqplot.ElemContainer.prototype.getTop=function(){return this.getPosition().top};H.jqplot.ElemContainer.prototype.getLeft=function(){return this.getPosition().left};H.jqplot.ElemContainer.prototype.getBottom=function(){return this._elem.css("bottom")};H.jqplot.ElemContainer.prototype.getRight=function(){return this._elem.css("right")};function s(ab){H.jqplot.ElemContainer.call(this);this.name=ab;this._series=[];this.show=false;this.tickRenderer=H.jqplot.AxisTickRenderer;this.tickOptions={};this.labelRenderer=H.jqplot.AxisLabelRenderer;this.labelOptions={};this.label=null;this.showLabel=true;this.min=null;this.max=null;this.autoscale=false;this.pad=1.2;this.padMax=null;this.padMin=null;this.ticks=[];this.numberTicks;this.tickInterval;this.renderer=H.jqplot.LinearAxisRenderer;this.rendererOptions={};this.showTicks=true;this.showTickMarks=true;this.showMinorTicks=true;this.drawMajorGridlines=true;this.drawMinorGridlines=false;this.drawMajorTickMarks=true;this.drawMinorTickMarks=true;this.useSeriesColor=false;this.borderWidth=null;this.borderColor=null;this._dataBounds={min:null,max:null};this._intervalStats=[];this._offsets={min:null,max:null};this._ticks=[];this._label=null;this.syncTicks=null;this.tickSpacing=75;this._min=null;this._max=null;this._tickInterval=null;this._numberTicks=null;this.__ticks=null;this._options={}}s.prototype=new H.jqplot.ElemContainer();s.prototype.constructor=s;s.prototype.init=function(){this.renderer=new this.renderer();this.tickOptions.axis=this.name;if(this.tickOptions.showMark==null){this.tickOptions.showMark=this.showTicks}if(this.tickOptions.showMark==null){this.tickOptions.showMark=this.showTickMarks}if(this.tickOptions.showLabel==null){this.tickOptions.showLabel=this.showTicks}if(this.label==null||this.label==""){this.showLabel=false}else{this.labelOptions.label=this.label}if(this.showLabel==false){this.labelOptions.show=false}if(this.pad==0){this.pad=1}if(this.padMax==0){this.padMax=1}if(this.padMin==0){this.padMin=1}if(this.padMax==null){this.padMax=(this.pad-1)/2+1}if(this.padMin==null){this.padMin=(this.pad-1)/2+1}this.pad=this.padMax+this.padMin-1;if(this.min!=null||this.max!=null){this.autoscale=false}if(this.syncTicks==null&&this.name.indexOf("y")>-1){this.syncTicks=true}else{if(this.syncTicks==null){this.syncTicks=false}}this.renderer.init.call(this,this.rendererOptions)};s.prototype.draw=function(ab,ac){if(this.__ticks){this.__ticks=null}return this.renderer.draw.call(this,ab,ac)};s.prototype.set=function(){this.renderer.set.call(this)};s.prototype.pack=function(ac,ab){if(this.show){this.renderer.pack.call(this,ac,ab)}if(this._min==null){this._min=this.min;this._max=this.max;this._tickInterval=this.tickInterval;this._numberTicks=this.numberTicks;this.__ticks=this._ticks}};s.prototype.reset=function(){this.renderer.reset.call(this)};s.prototype.resetScale=function(ab){H.extend(true,this,{min:null,max:null,numberTicks:null,tickInterval:null,_ticks:[],ticks:[]},ab);this.resetDataBounds()};s.prototype.resetDataBounds=function(){var ai=this._dataBounds;ai.min=null;ai.max=null;var ac,aj,ag;var ad=(this.show)?true:false;for(var af=0;af<this._series.length;af++){aj=this._series[af];if(aj.show){ag=aj._plotData;if(aj._type==="line"&&aj.renderer.bands.show&&this.name.charAt(0)!=="x"){ag=[[0,aj.renderer.bands._min],[1,aj.renderer.bands._max]]}var ab=1,ah=1;if(aj._type!=null&&aj._type=="ohlc"){ab=3;ah=2}for(var ae=0,ac=ag.length;ae<ac;ae++){if(this.name=="xaxis"||this.name=="x2axis"){if((ag[ae][0]!=null&&ag[ae][0]<ai.min)||ai.min==null){ai.min=ag[ae][0]}if((ag[ae][0]!=null&&ag[ae][0]>ai.max)||ai.max==null){ai.max=ag[ae][0]}}else{if((ag[ae][ab]!=null&&ag[ae][ab]<ai.min)||ai.min==null){ai.min=ag[ae][ab]}if((ag[ae][ah]!=null&&ag[ae][ah]>ai.max)||ai.max==null){ai.max=ag[ae][ah]}}}if(ad&&aj.renderer.constructor!==H.jqplot.BarRenderer){ad=false}else{if(ad&&this._options.hasOwnProperty("forceTickAt0")&&this._options.forceTickAt0==false){ad=false}else{if(ad&&aj.renderer.constructor===H.jqplot.BarRenderer){if(aj.barDirection=="vertical"&&this.name!="xaxis"&&this.name!="x2axis"){if(this._options.pad!=null||this._options.padMin!=null){ad=false}}else{if(aj.barDirection=="horizontal"&&(this.name=="xaxis"||this.name=="x2axis")){if(this._options.pad!=null||this._options.padMin!=null){ad=false}}}}}}}}if(ad&&this.renderer.constructor===H.jqplot.LinearAxisRenderer&&ai.min>=0){this.padMin=1;this.forceTickAt0=true}};function n(ab){H.jqplot.ElemContainer.call(this);this.show=false;this.location="ne";this.labels=[];this.showLabels=true;this.showSwatches=true;this.placement="insideGrid";this.xoffset=0;this.yoffset=0;this.border;this.background;this.textColor;this.fontFamily;this.fontSize;this.rowSpacing="0.5em";this.renderer=H.jqplot.TableLegendRenderer;this.rendererOptions={};this.preDraw=false;this.marginTop=null;this.marginRight=null;this.marginBottom=null;this.marginLeft=null;this.escapeHtml=false;this._series=[];H.extend(true,this,ab)}n.prototype=new H.jqplot.ElemContainer();n.prototype.constructor=n;n.prototype.setOptions=function(ab){H.extend(true,this,ab);if(this.placement=="inside"){this.placement="insideGrid"}if(this.xoffset>0){if(this.placement=="insideGrid"){switch(this.location){case"nw":case"w":case"sw":if(this.marginLeft==null){this.marginLeft=this.xoffset+"px"}this.marginRight="0px";break;case"ne":case"e":case"se":default:if(this.marginRight==null){this.marginRight=this.xoffset+"px"}this.marginLeft="0px";break}}else{if(this.placement=="outside"){switch(this.location){case"nw":case"w":case"sw":if(this.marginRight==null){this.marginRight=this.xoffset+"px"}this.marginLeft="0px";break;case"ne":case"e":case"se":default:if(this.marginLeft==null){this.marginLeft=this.xoffset+"px"}this.marginRight="0px";break}}}this.xoffset=0}if(this.yoffset>0){if(this.placement=="outside"){switch(this.location){case"sw":case"s":case"se":if(this.marginTop==null){this.marginTop=this.yoffset+"px"}this.marginBottom="0px";break;case"ne":case"n":case"nw":default:if(this.marginBottom==null){this.marginBottom=this.yoffset+"px"}this.marginTop="0px";break}}else{if(this.placement=="insideGrid"){switch(this.location){case"sw":case"s":case"se":if(this.marginBottom==null){this.marginBottom=this.yoffset+"px"}this.marginTop="0px";break;case"ne":case"n":case"nw":default:if(this.marginTop==null){this.marginTop=this.yoffset+"px"}this.marginBottom="0px";break}}}this.yoffset=0}};n.prototype.init=function(){this.renderer=new this.renderer();this.renderer.init.call(this,this.rendererOptions)};n.prototype.draw=function(ac){for(var ab=0;ab<H.jqplot.preDrawLegendHooks.length;ab++){H.jqplot.preDrawLegendHooks[ab].call(this,ac)}return this.renderer.draw.call(this,ac)};n.prototype.pack=function(ab){this.renderer.pack.call(this,ab)};function u(ab){H.jqplot.ElemContainer.call(this);this.text=ab;this.show=true;this.fontFamily;this.fontSize;this.textAlign;this.textColor;this.renderer=H.jqplot.DivTitleRenderer;this.rendererOptions={};this.escapeHtml=false}u.prototype=new H.jqplot.ElemContainer();u.prototype.constructor=u;u.prototype.init=function(){this.renderer=new this.renderer();this.renderer.init.call(this,this.rendererOptions)};u.prototype.draw=function(ab){return this.renderer.draw.call(this,ab)};u.prototype.pack=function(){this.renderer.pack.call(this)};function O(){H.jqplot.ElemContainer.call(this);this.show=true;this.xaxis="xaxis";this._xaxis;this.yaxis="yaxis";this._yaxis;this.gridBorderWidth=2;this.renderer=H.jqplot.LineRenderer;this.rendererOptions={};this.data=[];this.gridData=[];this.label="";this.showLabel=true;this.color;this.negativeColor;this.lineWidth=2.5;this.lineJoin="round";this.lineCap="round";this.linePattern="solid";this.shadow=true;this.shadowAngle=45;this.shadowOffset=1.25;this.shadowDepth=3;this.shadowAlpha="0.1";this.breakOnNull=false;this.markerRenderer=H.jqplot.MarkerRenderer;this.markerOptions={};this.showLine=true;this.showMarker=true;this.index;this.fill=false;this.fillColor;this.fillAlpha;this.fillAndStroke=false;this.disableStack=false;this._stack=false;this.neighborThreshold=4;this.fillToZero=false;this.fillToValue=0;this.fillAxis="y";this.useNegativeColors=true;this._stackData=[];this._plotData=[];this._plotValues={x:[],y:[]};this._intervals={x:{},y:{}};this._prevPlotData=[];this._prevGridData=[];this._stackAxis="y";this._primaryAxis="_xaxis";this.canvas=new H.jqplot.GenericCanvas();this.shadowCanvas=new H.jqplot.GenericCanvas();this.plugins={};this._sumy=0;this._sumx=0;this._type=""}O.prototype=new H.jqplot.ElemContainer();O.prototype.constructor=O;O.prototype.init=function(ad,ah,af){this.index=ad;this.gridBorderWidth=ah;var ag=this.data;var ac=[],ae;for(ae=0;ae<ag.length;ae++){if(!this.breakOnNull){if(ag[ae]==null||ag[ae][0]==null||ag[ae][1]==null){continue}else{ac.push(ag[ae])}}else{ac.push(ag[ae])}}this.data=ac;if(!this.color&&this.show){this.color=af.colorGenerator.get(this.index)}if(!this.negativeColor&&this.show){this.negativeColor=af.negativeColorGenerator.get(this.index)}if(!this.fillColor){this.fillColor=this.color}if(this.fillAlpha){var ab=H.jqplot.normalize2rgb(this.fillColor);var ab=H.jqplot.getColorComponents(ab);this.fillColor="rgba("+ab[0]+","+ab[1]+","+ab[2]+","+this.fillAlpha+")"}this.renderer=new this.renderer();this.renderer.init.call(this,this.rendererOptions,af);this.markerRenderer=new this.markerRenderer();if(!this.markerOptions.color){this.markerOptions.color=this.color}if(this.markerOptions.show==null){this.markerOptions.show=this.showMarker}this.showMarker=this.markerOptions.show;this.markerRenderer.init(this.markerOptions)};O.prototype.draw=function(ah,ae,ag){var ac=(ae==r)?{}:ae;ah=(ah==r)?this.canvas._ctx:ah;var ab,af,ad;for(ab=0;ab<H.jqplot.preDrawSeriesHooks.length;ab++){H.jqplot.preDrawSeriesHooks[ab].call(this,ah,ac)}if(this.show){this.renderer.setGridData.call(this,ag);if(!ac.preventJqPlotSeriesDrawTrigger){H(ah.canvas).trigger("jqplotSeriesDraw",[this.data,this.gridData])}af=[];if(ac.data){af=ac.data}else{if(!this._stack){af=this.data}else{af=this._plotData}}ad=ac.gridData||this.renderer.makeGridData.call(this,af,ag);if(this._type==="line"&&this.renderer.smooth&&this.renderer._smoothedData.length){ad=this.renderer._smoothedData}this.renderer.draw.call(this,ah,ad,ac,ag)}for(ab=0;ab<H.jqplot.postDrawSeriesHooks.length;ab++){H.jqplot.postDrawSeriesHooks[ab].call(this,ah,ac,ag)}ah=ae=ag=ab=af=ad=null};O.prototype.drawShadow=function(ah,ae,ag){var ac=(ae==r)?{}:ae;ah=(ah==r)?this.shadowCanvas._ctx:ah;var ab,af,ad;for(ab=0;ab<H.jqplot.preDrawSeriesShadowHooks.length;ab++){H.jqplot.preDrawSeriesShadowHooks[ab].call(this,ah,ac)}if(this.shadow){this.renderer.setGridData.call(this,ag);af=[];if(ac.data){af=ac.data}else{if(!this._stack){af=this.data}else{af=this._plotData}}ad=ac.gridData||this.renderer.makeGridData.call(this,af,ag);this.renderer.drawShadow.call(this,ah,ad,ac)}for(ab=0;ab<H.jqplot.postDrawSeriesShadowHooks.length;ab++){H.jqplot.postDrawSeriesShadowHooks[ab].call(this,ah,ac)}ah=ae=ag=ab=af=ad=null};O.prototype.toggleDisplay=function(ac){var ab,ad;if(ac.data.series){ab=ac.data.series}else{ab=this}if(ac.data.speed){ad=ac.data.speed}if(ad){if(ab.canvas._elem.is(":hidden")){ab.canvas._elem.removeClass("jqplot-series-hidden");if(ab.shadowCanvas._elem){ab.shadowCanvas._elem.fadeIn(ad)}ab.canvas._elem.fadeIn(ad);ab.canvas._elem.nextAll(".jqplot-point-label.jqplot-series-"+ab.index).fadeIn(ad)}else{ab.canvas._elem.addClass("jqplot-series-hidden");if(ab.shadowCanvas._elem){ab.shadowCanvas._elem.fadeOut(ad)}ab.canvas._elem.fadeOut(ad);ab.canvas._elem.nextAll(".jqplot-point-label.jqplot-series-"+ab.index).fadeOut(ad)}}else{if(ab.canvas._elem.is(":hidden")){ab.canvas._elem.removeClass("jqplot-series-hidden");if(ab.shadowCanvas._elem){ab.shadowCanvas._elem.show()}ab.canvas._elem.show();ab.canvas._elem.nextAll(".jqplot-point-label.jqplot-series-"+ab.index).show()}else{ab.canvas._elem.addClass("jqplot-series-hidden");if(ab.shadowCanvas._elem){ab.shadowCanvas._elem.hide()}ab.canvas._elem.hide();ab.canvas._elem.nextAll(".jqplot-point-label.jqplot-series-"+ab.index).hide()}}};function I(){H.jqplot.ElemContainer.call(this);this.drawGridlines=true;this.gridLineColor="#cccccc";this.gridLineWidth=1;this.background="#fffdf6";this.borderColor="#999999";this.borderWidth=2;this.drawBorder=true;this.shadow=true;this.shadowAngle=45;this.shadowOffset=1.5;this.shadowWidth=3;this.shadowDepth=3;this.shadowColor=null;this.shadowAlpha="0.07";this._left;this._top;this._right;this._bottom;this._width;this._height;this._axes=[];this.renderer=H.jqplot.CanvasGridRenderer;this.rendererOptions={};this._offsets={top:null,bottom:null,left:null,right:null}}I.prototype=new H.jqplot.ElemContainer();I.prototype.constructor=I;I.prototype.init=function(){this.renderer=new this.renderer();this.renderer.init.call(this,this.rendererOptions)};I.prototype.createElement=function(ab,ac){this._offsets=ab;return this.renderer.createElement.call(this,ac)};I.prototype.draw=function(){this.renderer.draw.call(this)};H.jqplot.GenericCanvas=function(){H.jqplot.ElemContainer.call(this);this._ctx};H.jqplot.GenericCanvas.prototype=new H.jqplot.ElemContainer();H.jqplot.GenericCanvas.prototype.constructor=H.jqplot.GenericCanvas;H.jqplot.GenericCanvas.prototype.createElement=function(af,ad,ac,ag){this._offsets=af;var ab="jqplot";if(ad!=r){ab=ad}var ae;ae=ag.canvasManager.getCanvas();if(ac!=null){this._plotDimensions=ac}ae.width=this._plotDimensions.width-this._offsets.left-this._offsets.right;ae.height=this._plotDimensions.height-this._offsets.top-this._offsets.bottom;this._elem=H(ae);this._elem.css({position:"absolute",left:this._offsets.left,top:this._offsets.top});this._elem.addClass(ab);ae=ag.canvasManager.initCanvas(ae);ae=null;return this._elem};H.jqplot.GenericCanvas.prototype.setContext=function(){this._ctx=this._elem.get(0).getContext("2d");return this._ctx};H.jqplot.GenericCanvas.prototype.resetCanvas=function(){if(this._elem){if(H.jqplot.use_excanvas&&window.G_vmlCanvasManager.uninitElement!==r){window.G_vmlCanvasManager.uninitElement(this._elem.get(0))}this._elem.emptyForce()}this._ctx=null};H.jqplot.HooksManager=function(){this.hooks=[];this.args=[]};H.jqplot.HooksManager.prototype.addOnce=function(ae,ac){ac=ac||[];var af=false;for(var ad=0,ab=this.hooks.length;ad<ab;ad++){if(this.hooks[ad][0]==ae){af=true}}if(!af){this.hooks.push(ae);this.args.push(ac)}};H.jqplot.HooksManager.prototype.add=function(ac,ab){ab=ab||[];this.hooks.push(ac);this.args.push(ab)};H.jqplot.EventListenerManager=function(){this.hooks=[]};H.jqplot.EventListenerManager.prototype.addOnce=function(af,ae){var ag=false,ad,ac;for(var ac=0,ab=this.hooks.length;ac<ab;ac++){ad=this.hooks[ac];if(ad[0]==af&&ad[1]==ae){ag=true}}if(!ag){this.hooks.push([af,ae])}};H.jqplot.EventListenerManager.prototype.add=function(ac,ab){this.hooks.push([ac,ab])};var Q=["yMidAxis","xaxis","yaxis","x2axis","y2axis","y3axis","y4axis","y5axis","y6axis","y7axis","y8axis","y9axis"];function N(){this.animate=false;this.animateReplot=false;this.axes={xaxis:new s("xaxis"),yaxis:new s("yaxis"),x2axis:new s("x2axis"),y2axis:new s("y2axis"),y3axis:new s("y3axis"),y4axis:new s("y4axis"),y5axis:new s("y5axis"),y6axis:new s("y6axis"),y7axis:new s("y7axis"),y8axis:new s("y8axis"),y9axis:new s("y9axis"),yMidAxis:new s("yMidAxis")};this.baseCanvas=new H.jqplot.GenericCanvas();this.captureRightClick=false;this.data=[];this.dataRenderer;this.dataRendererOptions;this.defaults={axesDefaults:{},axes:{xaxis:{},yaxis:{},x2axis:{},y2axis:{},y3axis:{},y4axis:{},y5axis:{},y6axis:{},y7axis:{},y8axis:{},y9axis:{},yMidAxis:{}},seriesDefaults:{},series:[]};this.defaultAxisStart=1;this.drawIfHidden=false;this.eventCanvas=new H.jqplot.GenericCanvas();this.fillBetween={series1:null,series2:null,color:null,baseSeries:0,fill:true};this.fontFamily;this.fontSize;this.grid=new I();this.legend=new n();this.negativeSeriesColors=H.jqplot.config.defaultNegativeColors;this.noDataIndicator={show:false,indicator:"Loading Data...",axes:{xaxis:{min:0,max:10,tickInterval:2,show:true},yaxis:{min:0,max:12,tickInterval:3,show:true}}};this.options={};this.previousSeriesStack=[];this.plugins={};this.series=[];this.seriesStack=[];this.seriesColors=H.jqplot.config.defaultColors;this.sortData=true;this.stackSeries=false;this.syncXTicks=true;this.syncYTicks=true;this.target=null;this.targetId=null;this.textColor;this.title=new u();this._drawCount=0;this._sumy=0;this._sumx=0;this._stackData=[];this._plotData=[];this._width=null;this._height=null;this._plotDimensions={height:null,width:null};this._gridPadding={top:null,right:null,bottom:null,left:null};this._defaultGridPadding={top:10,right:10,bottom:23,left:10};this._addDomReference=H.jqplot.config.addDomReference;this.preInitHooks=new H.jqplot.HooksManager();this.postInitHooks=new H.jqplot.HooksManager();this.preParseOptionsHooks=new H.jqplot.HooksManager();this.postParseOptionsHooks=new H.jqplot.HooksManager();this.preDrawHooks=new H.jqplot.HooksManager();this.postDrawHooks=new H.jqplot.HooksManager();this.preDrawSeriesHooks=new H.jqplot.HooksManager();this.postDrawSeriesHooks=new H.jqplot.HooksManager();this.preDrawLegendHooks=new H.jqplot.HooksManager();this.addLegendRowHooks=new H.jqplot.HooksManager();this.preSeriesInitHooks=new H.jqplot.HooksManager();this.postSeriesInitHooks=new H.jqplot.HooksManager();this.preParseSeriesOptionsHooks=new H.jqplot.HooksManager();this.postParseSeriesOptionsHooks=new H.jqplot.HooksManager();this.eventListenerHooks=new H.jqplot.EventListenerManager();this.preDrawSeriesShadowHooks=new H.jqplot.HooksManager();this.postDrawSeriesShadowHooks=new H.jqplot.HooksManager();this.colorGenerator=new H.jqplot.ColorGenerator();this.negativeColorGenerator=new H.jqplot.ColorGenerator();this.canvasManager=new H.jqplot.CanvasManager();this.themeEngine=new H.jqplot.ThemeEngine();var ad=0;this.init=function(am,aj,ao){ao=ao||{};for(var ak=0;ak<H.jqplot.preInitHooks.length;ak++){H.jqplot.preInitHooks[ak].call(this,am,aj,ao)}for(var ak=0;ak<this.preInitHooks.hooks.length;ak++){this.preInitHooks.hooks[ak].call(this,am,aj,ao)}this.targetId="#"+am;this.target=H("#"+am);if(this._addDomReference){this.target.data("jqplot_plot",this)}this.target.removeClass("jqplot-error");if(!this.target.get(0)){throw"No plot target specified"}if(this.target.css("position")=="static"){this.target.css("position","relative")}if(!this.target.hasClass("jqplot-target")){this.target.addClass("jqplot-target")}if(!this.target.height()){var al;if(ao&&ao.height){al=parseInt(ao.height,10)}else{if(this.target.attr("data-height")){al=parseInt(this.target.attr("data-height"),10)}else{al=parseInt(H.jqplot.config.defaultHeight,10)}}this._height=al;this.target.css("height",al+"px")}else{this._height=al=this.target.height()}if(!this.target.width()){var an;if(ao&&ao.width){an=parseInt(ao.width,10)}else{if(this.target.attr("data-width")){an=parseInt(this.target.attr("data-width"),10)}else{an=parseInt(H.jqplot.config.defaultWidth,10)}}this._width=an;this.target.css("width",an+"px")}else{this._width=an=this.target.width()}this._plotDimensions.height=this._height;this._plotDimensions.width=this._width;this.grid._plotDimensions=this._plotDimensions;this.title._plotDimensions=this._plotDimensions;this.baseCanvas._plotDimensions=this._plotDimensions;this.eventCanvas._plotDimensions=this._plotDimensions;this.legend._plotDimensions=this._plotDimensions;if(this._height<=0||this._width<=0||!this._height||!this._width){throw"Canvas dimension not set"}if(ao.dataRenderer&&jQuery.isFunction(ao.dataRenderer)){if(ao.dataRendererOptions){this.dataRendererOptions=ao.dataRendererOptions}this.dataRenderer=ao.dataRenderer;aj=this.dataRenderer(aj,this,this.dataRendererOptions)}if(ao.noDataIndicator&&jQuery.isPlainObject(ao.noDataIndicator)){H.extend(true,this.noDataIndicator,ao.noDataIndicator)}if(aj==null||jQuery.isArray(aj)==false||aj.length==0||jQuery.isArray(aj[0])==false||aj[0].length==0){if(this.noDataIndicator.show==false){throw {name:"DataError",message:"No data to plot."}}else{for(var af in this.noDataIndicator.axes){for(var ah in this.noDataIndicator.axes[af]){this.axes[af][ah]=this.noDataIndicator.axes[af][ah]}}this.postDrawHooks.add(function(){var av=this.eventCanvas.getHeight();var ar=this.eventCanvas.getWidth();var aq=H('<div class="jqplot-noData-container" style="position:absolute;"></div>');this.target.append(aq);aq.height(av);aq.width(ar);aq.css("top",this.eventCanvas._offsets.top);aq.css("left",this.eventCanvas._offsets.left);var au=H('<div class="jqplot-noData-contents" style="text-align:center; position:relative; margin-left:auto; margin-right:auto;"></div>');aq.append(au);au.html(this.noDataIndicator.indicator);var at=au.height();var ap=au.width();au.height(at);au.width(ap);au.css("top",(av-at)/2+"px")})}}this.data=aj;this.parseOptions(ao);if(this.textColor){this.target.css("color",this.textColor)}if(this.fontFamily){this.target.css("font-family",this.fontFamily)}if(this.fontSize){this.target.css("font-size",this.fontSize)}this.title.init();this.legend.init();this._sumy=0;this._sumx=0;for(var ak=0;ak<this.series.length;ak++){this.seriesStack.push(ak);this.previousSeriesStack.push(ak);this.series[ak].shadowCanvas._plotDimensions=this._plotDimensions;this.series[ak].canvas._plotDimensions=this._plotDimensions;for(var ai=0;ai<H.jqplot.preSeriesInitHooks.length;ai++){H.jqplot.preSeriesInitHooks[ai].call(this.series[ak],am,aj,this.options.seriesDefaults,this.options.series[ak],this)}for(var ai=0;ai<this.preSeriesInitHooks.hooks.length;ai++){this.preSeriesInitHooks.hooks[ai].call(this.series[ak],am,aj,this.options.seriesDefaults,this.options.series[ak],this)}this.populatePlotData(this.series[ak],ak);this.series[ak]._plotDimensions=this._plotDimensions;this.series[ak].init(ak,this.grid.borderWidth,this);for(var ai=0;ai<H.jqplot.postSeriesInitHooks.length;ai++){H.jqplot.postSeriesInitHooks[ai].call(this.series[ak],am,aj,this.options.seriesDefaults,this.options.series[ak],this)}for(var ai=0;ai<this.postSeriesInitHooks.hooks.length;ai++){this.postSeriesInitHooks.hooks[ai].call(this.series[ak],am,aj,this.options.seriesDefaults,this.options.series[ak],this)}this._sumy+=this.series[ak]._sumy;this._sumx+=this.series[ak]._sumx}var ag;for(var ak=0;ak<12;ak++){ag=Q[ak];this.axes[ag]._plotDimensions=this._plotDimensions;this.axes[ag].init();if(this.axes[ag].borderColor==null){if(ag.charAt(0)!=="x"&&this.axes[ag].useSeriesColor===true&&this.axes[ag].show){this.axes[ag].borderColor=this.axes[ag]._series[0].color}else{this.axes[ag].borderColor=this.grid.borderColor}}}if(this.sortData){ab(this.series)}this.grid.init();this.grid._axes=this.axes;this.legend._series=this.series;for(var ak=0;ak<H.jqplot.postInitHooks.length;ak++){H.jqplot.postInitHooks[ak].call(this,am,aj,ao)}for(var ak=0;ak<this.postInitHooks.hooks.length;ak++){this.postInitHooks.hooks[ak].call(this,am,aj,ao)}};this.resetAxesScale=function(ak,ag){var ai=ag||{};var aj=ak||this.axes;if(aj===true){aj=this.axes}if(jQuery.isArray(aj)){for(var ah=0;ah<aj.length;ah++){this.axes[aj[ah]].resetScale(ai[aj[ah]])}}else{if(typeof(aj)==="object"){for(var af in aj){this.axes[af].resetScale(ai[af])}}}};this.reInitialize=function(){this._height=this.target.height();this._width=this.target.width();if(this._height<=0||this._width<=0||!this._height||!this._width){throw"Target dimension not set"}this._plotDimensions.height=this._height;this._plotDimensions.width=this._width;this.grid._plotDimensions=this._plotDimensions;this.title._plotDimensions=this._plotDimensions;this.baseCanvas._plotDimensions=this._plotDimensions;this.eventCanvas._plotDimensions=this._plotDimensions;this.legend._plotDimensions=this._plotDimensions;for(var ak in this.axes){this.axes[ak]._plotWidth=this._width;this.axes[ak]._plotHeight=this._height}this.title._plotWidth=this._width;if(this.textColor){this.target.css("color",this.textColor)}if(this.fontFamily){this.target.css("font-family",this.fontFamily)}if(this.fontSize){this.target.css("font-size",this.fontSize)}this._sumy=0;this._sumx=0;for(var ai=0;ai<this.series.length;ai++){this.populatePlotData(this.series[ai],ai);if(this.series[ai]._type==="line"&&this.series[ai].renderer.bands.show){this.series[ai].renderer.initBands.call(this.series[ai],this.series[ai].renderer.options,this)}this.series[ai]._plotDimensions=this._plotDimensions;this.series[ai].canvas._plotDimensions=this._plotDimensions;this._sumy+=this.series[ai]._sumy;this._sumx+=this.series[ai]._sumx}var ag;for(var af=0;af<12;af++){ag=Q[af];var ah=this.axes[ag]._ticks;for(var ai=0;ai<ah.length;ai++){var aj=ah[ai]._elem;if(aj){if(H.jqplot.use_excanvas&&window.G_vmlCanvasManager.uninitElement!==r){window.G_vmlCanvasManager.uninitElement(aj.get(0))}aj.emptyForce();aj=null;ah._elem=null}}ah=null;this.axes[ag]._plotDimensions=this._plotDimensions;this.axes[ag]._ticks=[]}if(this.sortData){ab(this.series)}this.grid._axes=this.axes;this.legend._series=this.series};function ab(aj){var an,ao,ap,af,am;for(var ak=0;ak<aj.length;ak++){var ag;var al=[aj[ak].data,aj[ak]._stackData,aj[ak]._plotData,aj[ak]._prevPlotData];for(var ah=0;ah<4;ah++){ag=true;an=al[ah];if(aj[ak]._stackAxis=="x"){for(var ai=0;ai<an.length;ai++){if(typeof(an[ai][1])!="number"){ag=false;break}}if(ag){an.sort(function(ar,aq){return ar[1]-aq[1]})}}else{for(var ai=0;ai<an.length;ai++){if(typeof(an[ai][0])!="number"){ag=false;break}}if(ag){an.sort(function(ar,aq){return ar[0]-aq[0]})}}}}}this.populatePlotData=function(aj,ak){this._plotData=[];this._stackData=[];aj._stackData=[];aj._plotData=[];var an={x:[],y:[]};if(this.stackSeries&&!aj.disableStack){aj._stack=true;var al=aj._stackAxis=="x"?0:1;var am=al?0:1;var ao=H.extend(true,[],aj.data);var ap=H.extend(true,[],aj.data);for(var ah=0;ah<ak;ah++){var af=this.series[ah].data;for(var ag=0;ag<af.length;ag++){ao[ag][0]+=af[ag][0];ao[ag][1]+=af[ag][1];ap[ag][al]+=af[ag][al]}}for(var ai=0;ai<ap.length;ai++){an.x.push(ap[ai][0]);an.y.push(ap[ai][1])}this._plotData.push(ap);this._stackData.push(ao);aj._stackData=ao;aj._plotData=ap;aj._plotValues=an}else{for(var ai=0;ai<aj.data.length;ai++){an.x.push(aj.data[ai][0]);an.y.push(aj.data[ai][1])}this._stackData.push(aj.data);this.series[ak]._stackData=aj.data;this._plotData.push(aj.data);aj._plotData=aj.data;aj._plotValues=an}if(ak>0){aj._prevPlotData=this.series[ak-1]._plotData}aj._sumy=0;aj._sumx=0;for(ai=aj.data.length-1;ai>-1;ai--){aj._sumy+=aj.data[ai][1];aj._sumx+=aj.data[ai][0]}};this.getNextSeriesColor=(function(ag){var af=0;var ah=ag.seriesColors;return function(){if(af<ah.length){return ah[af++]}else{af=0;return ah[af++]}}})(this);this.parseOptions=function(aq){for(var al=0;al<this.preParseOptionsHooks.hooks.length;al++){this.preParseOptionsHooks.hooks[al].call(this,aq)}for(var al=0;al<H.jqplot.preParseOptionsHooks.length;al++){H.jqplot.preParseOptionsHooks[al].call(this,aq)}this.options=H.extend(true,{},this.defaults,aq);var af=this.options;this.animate=af.animate;this.animateReplot=af.animateReplot;this.stackSeries=af.stackSeries;if(H.isPlainObject(af.fillBetween)){var ap=["series1","series2","color","baseSeries","fill"],am;for(var al=0,aj=ap.length;al<aj;al++){am=ap[al];if(af.fillBetween[am]!=null){this.fillBetween[am]=af.fillBetween[am]}}}if(af.seriesColors){this.seriesColors=af.seriesColors}if(af.negativeSeriesColors){this.negativeSeriesColors=af.negativeSeriesColors}if(af.captureRightClick){this.captureRightClick=af.captureRightClick}this.defaultAxisStart=(aq&&aq.defaultAxisStart!=null)?aq.defaultAxisStart:this.defaultAxisStart;this.colorGenerator.setColors(this.seriesColors);this.negativeColorGenerator.setColors(this.negativeSeriesColors);H.extend(true,this._gridPadding,af.gridPadding);this.sortData=(af.sortData!=null)?af.sortData:this.sortData;for(var al=0;al<12;al++){var ag=Q[al];var ai=this.axes[ag];ai._options=H.extend(true,{},af.axesDefaults,af.axes[ag]);H.extend(true,ai,af.axesDefaults,af.axes[ag]);ai._plotWidth=this._width;ai._plotHeight=this._height}var ao=function(av,at,aw){var ar=[];var au;at=at||"vertical";if(!jQuery.isArray(av[0])){for(au=0;au<av.length;au++){if(at=="vertical"){ar.push([aw+au,av[au]])}else{ar.push([av[au],aw+au])}}}else{H.extend(true,ar,av)}return ar};var an=0;for(var al=0;al<this.data.length;al++){var ap=new O();for(var ak=0;ak<H.jqplot.preParseSeriesOptionsHooks.length;ak++){H.jqplot.preParseSeriesOptionsHooks[ak].call(ap,this.options.seriesDefaults,this.options.series[al])}for(var ak=0;ak<this.preParseSeriesOptionsHooks.hooks.length;ak++){this.preParseSeriesOptionsHooks.hooks[ak].call(ap,this.options.seriesDefaults,this.options.series[al])}H.extend(true,ap,{seriesColors:this.seriesColors,negativeSeriesColors:this.negativeSeriesColors},this.options.seriesDefaults,this.options.series[al],{rendererOptions:{animation:{show:this.animate}}});var ah="vertical";if(ap.renderer===H.jqplot.BarRenderer&&ap.rendererOptions&&ap.rendererOptions.barDirection=="horizontal"&&ap.transposeData===true){ah="horizontal"}ap.data=ao(this.data[al],ah,this.defaultAxisStart);switch(ap.xaxis){case"xaxis":ap._xaxis=this.axes.xaxis;break;case"x2axis":ap._xaxis=this.axes.x2axis;break;default:break}ap._yaxis=this.axes[ap.yaxis];ap._xaxis._series.push(ap);ap._yaxis._series.push(ap);if(ap.show){ap._xaxis.show=true;ap._yaxis.show=true}if(!ap.label){ap.label="Series "+(al+1).toString()}this.series.push(ap);for(var ak=0;ak<H.jqplot.postParseSeriesOptionsHooks.length;ak++){H.jqplot.postParseSeriesOptionsHooks[ak].call(this.series[al],this.options.seriesDefaults,this.options.series[al])}for(var ak=0;ak<this.postParseSeriesOptionsHooks.hooks.length;ak++){this.postParseSeriesOptionsHooks.hooks[ak].call(this.series[al],this.options.seriesDefaults,this.options.series[al])}}H.extend(true,this.grid,this.options.grid);for(var al=0;al<12;al++){var ag=Q[al];var ai=this.axes[ag];if(ai.borderWidth==null){ai.borderWidth=this.grid.borderWidth}}if(typeof this.options.title=="string"){this.title.text=this.options.title}else{if(typeof this.options.title=="object"){H.extend(true,this.title,this.options.title)}}this.title._plotWidth=this._width;this.legend.setOptions(this.options.legend);for(var al=0;al<H.jqplot.postParseOptionsHooks.length;al++){H.jqplot.postParseOptionsHooks[al].call(this,aq)}for(var al=0;al<this.postParseOptionsHooks.hooks.length;al++){this.postParseOptionsHooks.hooks[al].call(this,aq)}};this.destroy=function(){this.canvasManager.freeAllCanvases();if(this.eventCanvas&&this.eventCanvas._elem){this.eventCanvas._elem.unbind()}this.target.empty();this.target[0].innerHTML=""};this.replot=function(ag){var ah=ag||{};var af=(ah.clear===false)?false:true;var ai=ah.resetAxes||false;this.target.trigger("jqplotPreReplot");if(af){this.destroy()}this.reInitialize();if(ai){this.resetAxesScale(ai,ah.axes)}this.draw();this.target.trigger("jqplotPostReplot")};this.redraw=function(af){af=(af!=null)?af:true;this.target.trigger("jqplotPreRedraw");if(af){this.canvasManager.freeAllCanvases();this.eventCanvas._elem.unbind();this.target.empty()}for(var ah in this.axes){this.axes[ah]._ticks=[]}for(var ag=0;ag<this.series.length;ag++){this.populatePlotData(this.series[ag],ag)}this._sumy=0;this._sumx=0;for(ag=0;ag<this.series.length;ag++){this._sumy+=this.series[ag]._sumy;this._sumx+=this.series[ag]._sumx}this.draw();this.target.trigger("jqplotPostRedraw")};this.draw=function(){if(this.drawIfHidden||this.target.is(":visible")){this.target.trigger("jqplotPreDraw");var aB,az,ay,ai;for(aB=0,ay=H.jqplot.preDrawHooks.length;aB<ay;aB++){H.jqplot.preDrawHooks[aB].call(this)}for(aB=0,ay=this.preDrawHooks.length;aB<ay;aB++){this.preDrawHooks.hooks[aB].apply(this,this.preDrawSeriesHooks.args[aB])}this.target.append(this.baseCanvas.createElement({left:0,right:0,top:0,bottom:0},"jqplot-base-canvas",null,this));this.baseCanvas.setContext();this.target.append(this.title.draw());this.title.pack({top:0,left:0});var aF=this.legend.draw();var af={top:0,left:0,bottom:0,right:0};if(this.legend.placement=="outsideGrid"){this.target.append(aF);switch(this.legend.location){case"n":af.top+=this.legend.getHeight();break;case"s":af.bottom+=this.legend.getHeight();break;case"ne":case"e":case"se":af.right+=this.legend.getWidth();break;case"nw":case"w":case"sw":af.left+=this.legend.getWidth();break;default:af.right+=this.legend.getWidth();break}aF=aF.detach()}var al=this.axes;var aG;for(aB=0;aB<12;aB++){aG=Q[aB];this.target.append(al[aG].draw(this.baseCanvas._ctx,this));al[aG].set()}if(al.yaxis.show){af.left+=al.yaxis.getWidth()}var aA=["y2axis","y3axis","y4axis","y5axis","y6axis","y7axis","y8axis","y9axis"];var ar=[0,0,0,0,0,0,0,0];var av=0;var au;for(au=0;au<8;au++){if(al[aA[au]].show){av+=al[aA[au]].getWidth();ar[au]=av}}af.right+=av;if(al.x2axis.show){af.top+=al.x2axis.getHeight()}if(this.title.show){af.top+=this.title.getHeight()}if(al.xaxis.show){af.bottom+=al.xaxis.getHeight()}if(this.options.gridDimensions&&H.isPlainObject(this.options.gridDimensions)){var am=parseInt(this.options.gridDimensions.width,10)||0;var aC=parseInt(this.options.gridDimensions.height,10)||0;var ah=(this._width-af.left-af.right-am)/2;var aE=(this._height-af.top-af.bottom-aC)/2;if(aE>=0&&ah>=0){af.top+=aE;af.bottom+=aE;af.left+=ah;af.right+=ah}}var ag=["top","bottom","left","right"];for(var au in ag){if(this._gridPadding[ag[au]]==null&&af[ag[au]]>0){this._gridPadding[ag[au]]=af[ag[au]]}else{if(this._gridPadding[ag[au]]==null){this._gridPadding[ag[au]]=this._defaultGridPadding[ag[au]]}}}var at=(this.legend.placement=="outsideGrid")?{top:this.title.getHeight(),left:0,right:0,bottom:0}:this._gridPadding;al.xaxis.pack({position:"absolute",bottom:this._gridPadding.bottom-al.xaxis.getHeight(),left:0,width:this._width},{min:this._gridPadding.left,max:this._width-this._gridPadding.right});al.yaxis.pack({position:"absolute",top:0,left:this._gridPadding.left-al.yaxis.getWidth(),height:this._height},{min:this._height-this._gridPadding.bottom,max:this._gridPadding.top});al.x2axis.pack({position:"absolute",top:this._gridPadding.top-al.x2axis.getHeight(),left:0,width:this._width},{min:this._gridPadding.left,max:this._width-this._gridPadding.right});for(aB=8;aB>0;aB--){al[aA[aB-1]].pack({position:"absolute",top:0,right:this._gridPadding.right-ar[aB-1]},{min:this._height-this._gridPadding.bottom,max:this._gridPadding.top})}var an=(this._width-this._gridPadding.left-this._gridPadding.right)/2+this._gridPadding.left-al.yMidAxis.getWidth()/2;al.yMidAxis.pack({position:"absolute",top:0,left:an,zIndex:9,textAlign:"center"},{min:this._height-this._gridPadding.bottom,max:this._gridPadding.top});this.target.append(this.grid.createElement(this._gridPadding,this));this.grid.draw();var ak=this.series;var aD=ak.length;for(aB=0,ay=aD;aB<ay;aB++){az=this.seriesStack[aB];this.target.append(ak[az].shadowCanvas.createElement(this._gridPadding,"jqplot-series-shadowCanvas",null,this));ak[az].shadowCanvas.setContext();ak[az].shadowCanvas._elem.data("seriesIndex",az)}for(aB=0,ay=aD;aB<ay;aB++){az=this.seriesStack[aB];this.target.append(ak[az].canvas.createElement(this._gridPadding,"jqplot-series-canvas",null,this));ak[az].canvas.setContext();ak[az].canvas._elem.data("seriesIndex",az)}this.target.append(this.eventCanvas.createElement(this._gridPadding,"jqplot-event-canvas",null,this));this.eventCanvas.setContext();this.eventCanvas._ctx.fillStyle="rgba(0,0,0,0)";this.eventCanvas._ctx.fillRect(0,0,this.eventCanvas._ctx.canvas.width,this.eventCanvas._ctx.canvas.height);this.bindCustomEvents();if(this.legend.preDraw){this.eventCanvas._elem.before(aF);this.legend.pack(at);if(this.legend._elem){this.drawSeries({legendInfo:{location:this.legend.location,placement:this.legend.placement,width:this.legend.getWidth(),height:this.legend.getHeight(),xoffset:this.legend.xoffset,yoffset:this.legend.yoffset}})}else{this.drawSeries()}}else{this.drawSeries();if(aD){H(ak[aD-1].canvas._elem).after(aF)}this.legend.pack(at)}for(var aB=0,ay=H.jqplot.eventListenerHooks.length;aB<ay;aB++){this.eventCanvas._elem.bind(H.jqplot.eventListenerHooks[aB][0],{plot:this},H.jqplot.eventListenerHooks[aB][1])}for(var aB=0,ay=this.eventListenerHooks.hooks.length;aB<ay;aB++){this.eventCanvas._elem.bind(this.eventListenerHooks.hooks[aB][0],{plot:this},this.eventListenerHooks.hooks[aB][1])}var aq=this.fillBetween;if(aq.fill&&aq.series1!==aq.series2&&aq.series1<aD&&aq.series2<aD&&ak[aq.series1]._type==="line"&&ak[aq.series2]._type==="line"){this.doFillBetweenLines()}for(var aB=0,ay=H.jqplot.postDrawHooks.length;aB<ay;aB++){H.jqplot.postDrawHooks[aB].call(this)}for(var aB=0,ay=this.postDrawHooks.hooks.length;aB<ay;aB++){this.postDrawHooks.hooks[aB].apply(this,this.postDrawHooks.args[aB])}if(this.target.is(":visible")){this._drawCount+=1}var ao,ap,aw,aj;for(aB=0,ay=aD;aB<ay;aB++){ao=ak[aB];ap=ao.renderer;aw=".jqplot-point-label.jqplot-series-"+aB;if(ap.animation&&ap.animation._supported&&ap.animation.show&&(this._drawCount<2||this.animateReplot)){aj=this.target.find(aw);aj.stop(true,true).hide();ao.canvas._elem.stop(true,true).hide();ao.shadowCanvas._elem.stop(true,true).hide();ao.canvas._elem.jqplotEffect("blind",{mode:"show",direction:ap.animation.direction},ap.animation.speed);ao.shadowCanvas._elem.jqplotEffect("blind",{mode:"show",direction:ap.animation.direction},ap.animation.speed);aj.fadeIn(ap.animation.speed*0.8)}}aj=null;this.target.trigger("jqplotPostDraw",[this])}};N.prototype.doFillBetweenLines=function(){var ah=this.fillBetween;var aq=ah.series1;var ao=ah.series2;var ap=(aq<ao)?aq:ao;var an=(ao>aq)?ao:aq;var al=this.series[ap];var ak=this.series[an];if(ak.renderer.smooth){var aj=ak.renderer._smoothedData.slice(0).reverse()}else{var aj=ak.gridData.slice(0).reverse()}if(al.renderer.smooth){var am=al.renderer._smoothedData.concat(aj)}else{var am=al.gridData.concat(aj)}var ai=(ah.color!==null)?ah.color:this.series[aq].fillColor;var ar=(ah.baseSeries!==null)?ah.baseSeries:ap;var ag=this.series[ar].renderer.shapeRenderer;var af={fillStyle:ai,fill:true,closePath:true};ag.draw(al.shadowCanvas._ctx,am,af)};this.bindCustomEvents=function(){this.eventCanvas._elem.bind("click",{plot:this},this.onClick);this.eventCanvas._elem.bind("dblclick",{plot:this},this.onDblClick);this.eventCanvas._elem.bind("mousedown",{plot:this},this.onMouseDown);this.eventCanvas._elem.bind("mousemove",{plot:this},this.onMouseMove);this.eventCanvas._elem.bind("mouseenter",{plot:this},this.onMouseEnter);this.eventCanvas._elem.bind("mouseleave",{plot:this},this.onMouseLeave);if(this.captureRightClick){this.eventCanvas._elem.bind("mouseup",{plot:this},this.onRightClick);this.eventCanvas._elem.get(0).oncontextmenu=function(){return false}}else{this.eventCanvas._elem.bind("mouseup",{plot:this},this.onMouseUp)}};function ac(ao){var am=ao.data.plot;var ai=am.eventCanvas._elem.offset();var al={x:ao.pageX-ai.left,y:ao.pageY-ai.top};var aj={xaxis:null,yaxis:null,x2axis:null,y2axis:null,y3axis:null,y4axis:null,y5axis:null,y6axis:null,y7axis:null,y8axis:null,y9axis:null,yMidAxis:null};var ak=["xaxis","yaxis","x2axis","y2axis","y3axis","y4axis","y5axis","y6axis","y7axis","y8axis","y9axis","yMidAxis"];var af=am.axes;var ag,ah;for(ag=11;ag>0;ag--){ah=ak[ag-1];if(af[ah].show){aj[ah]=af[ah].series_p2u(al[ah.charAt(0)])}}return{offsets:ai,gridPos:al,dataPos:aj}}function ae(af,ag){var ak=ag.series;var aP,aO,aN,aI,aJ,aD,aC,ap,an,at,au,aE;var aM,aQ,aK,al,aB,aG;var ah,aH;for(aN=ag.seriesStack.length-1;aN>=0;aN--){aP=ag.seriesStack[aN];aI=ak[aP];switch(aI.renderer.constructor){case H.jqplot.BarRenderer:case H.jqplot.PyramidRenderer:aD=af.x;aC=af.y;for(aO=0;aO<aI._barPoints.length;aO++){aB=aI._barPoints[aO];aK=aI.gridData[aO];if(aD>aB[0][0]&&aD<aB[2][0]&&aC>aB[2][1]&&aC<aB[0][1]){return{seriesIndex:aI.index,pointIndex:aO,gridData:aK,data:aI.data[aO],points:aI._barPoints[aO]}}}break;case H.jqplot.DonutRenderer:at=aI.startAngle/180*Math.PI;aD=af.x-aI._center[0];aC=af.y-aI._center[1];aJ=Math.sqrt(Math.pow(aD,2)+Math.pow(aC,2));if(aD>0&&-aC>=0){ap=2*Math.PI-Math.atan(-aC/aD)}else{if(aD>0&&-aC<0){ap=-Math.atan(-aC/aD)}else{if(aD<0){ap=Math.PI-Math.atan(-aC/aD)}else{if(aD==0&&-aC>0){ap=3*Math.PI/2}else{if(aD==0&&-aC<0){ap=Math.PI/2}else{if(aD==0&&aC==0){ap=0}}}}}}if(at){ap-=at;if(ap<0){ap+=2*Math.PI}else{if(ap>2*Math.PI){ap-=2*Math.PI}}}an=aI.sliceMargin/180*Math.PI;if(aJ<aI._radius&&aJ>aI._innerRadius){for(aO=0;aO<aI.gridData.length;aO++){au=(aO>0)?aI.gridData[aO-1][1]+an:an;aE=aI.gridData[aO][1];if(ap>au&&ap<aE){return{seriesIndex:aI.index,pointIndex:aO,gridData:aI.gridData[aO],data:aI.data[aO]}}}}break;case H.jqplot.PieRenderer:at=aI.startAngle/180*Math.PI;aD=af.x-aI._center[0];aC=af.y-aI._center[1];aJ=Math.sqrt(Math.pow(aD,2)+Math.pow(aC,2));if(aD>0&&-aC>=0){ap=2*Math.PI-Math.atan(-aC/aD)}else{if(aD>0&&-aC<0){ap=-Math.atan(-aC/aD)}else{if(aD<0){ap=Math.PI-Math.atan(-aC/aD)}else{if(aD==0&&-aC>0){ap=3*Math.PI/2}else{if(aD==0&&-aC<0){ap=Math.PI/2}else{if(aD==0&&aC==0){ap=0}}}}}}if(at){ap-=at;if(ap<0){ap+=2*Math.PI}else{if(ap>2*Math.PI){ap-=2*Math.PI}}}an=aI.sliceMargin/180*Math.PI;if(aJ<aI._radius){for(aO=0;aO<aI.gridData.length;aO++){au=(aO>0)?aI.gridData[aO-1][1]+an:an;aE=aI.gridData[aO][1];if(ap>au&&ap<aE){return{seriesIndex:aI.index,pointIndex:aO,gridData:aI.gridData[aO],data:aI.data[aO]}}}}break;case H.jqplot.BubbleRenderer:aD=af.x;aC=af.y;var az=null;if(aI.show){for(var aO=0;aO<aI.gridData.length;aO++){aK=aI.gridData[aO];aQ=Math.sqrt((aD-aK[0])*(aD-aK[0])+(aC-aK[1])*(aC-aK[1]));if(aQ<=aK[2]&&(aQ<=aM||aM==null)){aM=aQ;az={seriesIndex:aP,pointIndex:aO,gridData:aK,data:aI.data[aO]}}}if(az!=null){return az}}break;case H.jqplot.FunnelRenderer:aD=af.x;aC=af.y;var aF=aI._vertices,aj=aF[0],ai=aF[aF.length-1],am,ay,ar;function aL(aT,aV,aU){var aS=(aV[1]-aU[1])/(aV[0]-aU[0]);var aR=aV[1]-aS*aV[0];var aW=aT+aV[1];return[(aW-aR)/aS,aW]}am=aL(aC,aj[0],ai[3]);ay=aL(aC,aj[1],ai[2]);for(aO=0;aO<aF.length;aO++){ar=aF[aO];if(aC>=ar[0][1]&&aC<=ar[3][1]&&aD>=am[0]&&aD<=ay[0]){return{seriesIndex:aI.index,pointIndex:aO,gridData:null,data:aI.data[aO]}}}break;case H.jqplot.LineRenderer:aD=af.x;aC=af.y;aJ=aI.renderer;if(aI.show){if((aI.fill||(aI.renderer.bands.show&&aI.renderer.bands.fill))&&(!ag.plugins.highlighter||!ag.plugins.highlighter.show)){var aq=false;if(aD>aI._boundingBox[0][0]&&aD<aI._boundingBox[1][0]&&aC>aI._boundingBox[1][1]&&aC<aI._boundingBox[0][1]){var ax=aI._areaPoints.length;var aA;var aO=ax-1;for(var aA=0;aA<ax;aA++){var aw=[aI._areaPoints[aA][0],aI._areaPoints[aA][1]];var av=[aI._areaPoints[aO][0],aI._areaPoints[aO][1]];if(aw[1]<aC&&av[1]>=aC||av[1]<aC&&aw[1]>=aC){if(aw[0]+(aC-aw[1])/(av[1]-aw[1])*(av[0]-aw[0])<aD){aq=!aq}}aO=aA}}if(aq){return{seriesIndex:aP,pointIndex:null,gridData:aI.gridData,data:aI.data,points:aI._areaPoints}}break}else{aH=aI.markerRenderer.size/2+aI.neighborThreshold;ah=(aH>0)?aH:0;for(var aO=0;aO<aI.gridData.length;aO++){aK=aI.gridData[aO];if(aJ.constructor==H.jqplot.OHLCRenderer){if(aJ.candleStick){var ao=aI._yaxis.series_u2p;if(aD>=aK[0]-aJ._bodyWidth/2&&aD<=aK[0]+aJ._bodyWidth/2&&aC>=ao(aI.data[aO][2])&&aC<=ao(aI.data[aO][3])){return{seriesIndex:aP,pointIndex:aO,gridData:aK,data:aI.data[aO]}}}else{if(!aJ.hlc){var ao=aI._yaxis.series_u2p;if(aD>=aK[0]-aJ._tickLength&&aD<=aK[0]+aJ._tickLength&&aC>=ao(aI.data[aO][2])&&aC<=ao(aI.data[aO][3])){return{seriesIndex:aP,pointIndex:aO,gridData:aK,data:aI.data[aO]}}}else{var ao=aI._yaxis.series_u2p;if(aD>=aK[0]-aJ._tickLength&&aD<=aK[0]+aJ._tickLength&&aC>=ao(aI.data[aO][1])&&aC<=ao(aI.data[aO][2])){return{seriesIndex:aP,pointIndex:aO,gridData:aK,data:aI.data[aO]}}}}}else{if(aK[0]!=null&&aK[1]!=null){aQ=Math.sqrt((aD-aK[0])*(aD-aK[0])+(aC-aK[1])*(aC-aK[1]));if(aQ<=ah&&(aQ<=aM||aM==null)){aM=aQ;return{seriesIndex:aP,pointIndex:aO,gridData:aK,data:aI.data[aO]}}}}}}}break;default:aD=af.x;aC=af.y;aJ=aI.renderer;if(aI.show){aH=aI.markerRenderer.size/2+aI.neighborThreshold;ah=(aH>0)?aH:0;for(var aO=0;aO<aI.gridData.length;aO++){aK=aI.gridData[aO];if(aJ.constructor==H.jqplot.OHLCRenderer){if(aJ.candleStick){var ao=aI._yaxis.series_u2p;if(aD>=aK[0]-aJ._bodyWidth/2&&aD<=aK[0]+aJ._bodyWidth/2&&aC>=ao(aI.data[aO][2])&&aC<=ao(aI.data[aO][3])){return{seriesIndex:aP,pointIndex:aO,gridData:aK,data:aI.data[aO]}}}else{if(!aJ.hlc){var ao=aI._yaxis.series_u2p;if(aD>=aK[0]-aJ._tickLength&&aD<=aK[0]+aJ._tickLength&&aC>=ao(aI.data[aO][2])&&aC<=ao(aI.data[aO][3])){return{seriesIndex:aP,pointIndex:aO,gridData:aK,data:aI.data[aO]}}}else{var ao=aI._yaxis.series_u2p;if(aD>=aK[0]-aJ._tickLength&&aD<=aK[0]+aJ._tickLength&&aC>=ao(aI.data[aO][1])&&aC<=ao(aI.data[aO][2])){return{seriesIndex:aP,pointIndex:aO,gridData:aK,data:aI.data[aO]}}}}}else{aQ=Math.sqrt((aD-aK[0])*(aD-aK[0])+(aC-aK[1])*(aC-aK[1]));if(aQ<=ah&&(aQ<=aM||aM==null)){aM=aQ;return{seriesIndex:aP,pointIndex:aO,gridData:aK,data:aI.data[aO]}}}}}break}}return null}this.onClick=function(ah){var ag=ac(ah);var aj=ah.data.plot;var ai=ae(ag.gridPos,aj);var af=jQuery.Event("jqplotClick");af.pageX=ah.pageX;af.pageY=ah.pageY;H(this).trigger(af,[ag.gridPos,ag.dataPos,ai,aj])};this.onDblClick=function(ah){var ag=ac(ah);var aj=ah.data.plot;var ai=ae(ag.gridPos,aj);var af=jQuery.Event("jqplotDblClick");af.pageX=ah.pageX;af.pageY=ah.pageY;H(this).trigger(af,[ag.gridPos,ag.dataPos,ai,aj])};this.onMouseDown=function(ah){var ag=ac(ah);var aj=ah.data.plot;var ai=ae(ag.gridPos,aj);var af=jQuery.Event("jqplotMouseDown");af.pageX=ah.pageX;af.pageY=ah.pageY;H(this).trigger(af,[ag.gridPos,ag.dataPos,ai,aj])};this.onMouseUp=function(ah){var ag=ac(ah);var af=jQuery.Event("jqplotMouseUp");af.pageX=ah.pageX;af.pageY=ah.pageY;H(this).trigger(af,[ag.gridPos,ag.dataPos,null,ah.data.plot])};this.onRightClick=function(ah){var ag=ac(ah);var aj=ah.data.plot;var ai=ae(ag.gridPos,aj);if(aj.captureRightClick){if(ah.which==3){var af=jQuery.Event("jqplotRightClick");af.pageX=ah.pageX;af.pageY=ah.pageY;H(this).trigger(af,[ag.gridPos,ag.dataPos,ai,aj])}else{var af=jQuery.Event("jqplotMouseUp");af.pageX=ah.pageX;af.pageY=ah.pageY;H(this).trigger(af,[ag.gridPos,ag.dataPos,ai,aj])}}};this.onMouseMove=function(ah){var ag=ac(ah);var aj=ah.data.plot;var ai=ae(ag.gridPos,aj);var af=jQuery.Event("jqplotMouseMove");af.pageX=ah.pageX;af.pageY=ah.pageY;H(this).trigger(af,[ag.gridPos,ag.dataPos,ai,aj])};this.onMouseEnter=function(ah){var ag=ac(ah);var ai=ah.data.plot;var af=jQuery.Event("jqplotMouseEnter");af.pageX=ah.pageX;af.pageY=ah.pageY;af.relatedTarget=ah.relatedTarget;H(this).trigger(af,[ag.gridPos,ag.dataPos,null,ai])};this.onMouseLeave=function(ah){var ag=ac(ah);var ai=ah.data.plot;var af=jQuery.Event("jqplotMouseLeave");af.pageX=ah.pageX;af.pageY=ah.pageY;af.relatedTarget=ah.relatedTarget;H(this).trigger(af,[ag.gridPos,ag.dataPos,null,ai])};this.drawSeries=function(ah,af){var aj,ai,ag;af=(typeof(ah)==="number"&&af==null)?ah:af;ah=(typeof(ah)==="object")?ah:{};if(af!=r){ai=this.series[af];ag=ai.shadowCanvas._ctx;ag.clearRect(0,0,ag.canvas.width,ag.canvas.height);ai.drawShadow(ag,ah,this);ag=ai.canvas._ctx;ag.clearRect(0,0,ag.canvas.width,ag.canvas.height);ai.draw(ag,ah,this);if(ai.renderer.constructor==H.jqplot.BezierCurveRenderer){if(af<this.series.length-1){this.drawSeries(af+1)}}}else{for(aj=0;aj<this.series.length;aj++){ai=this.series[aj];ag=ai.shadowCanvas._ctx;ag.clearRect(0,0,ag.canvas.width,ag.canvas.height);ai.drawShadow(ag,ah,this);ag=ai.canvas._ctx;ag.clearRect(0,0,ag.canvas.width,ag.canvas.height);ai.draw(ag,ah,this)}}ah=af=aj=ai=ag=null};this.moveSeriesToFront=function(ag){ag=parseInt(ag,10);var aj=H.inArray(ag,this.seriesStack);if(aj==-1){return}if(aj==this.seriesStack.length-1){this.previousSeriesStack=this.seriesStack.slice(0);return}var af=this.seriesStack[this.seriesStack.length-1];var ai=this.series[ag].canvas._elem.detach();var ah=this.series[ag].shadowCanvas._elem.detach();this.series[af].shadowCanvas._elem.after(ah);this.series[af].canvas._elem.after(ai);this.previousSeriesStack=this.seriesStack.slice(0);this.seriesStack.splice(aj,1);this.seriesStack.push(ag)};this.moveSeriesToBack=function(ag){ag=parseInt(ag,10);var aj=H.inArray(ag,this.seriesStack);if(aj==0||aj==-1){return}var af=this.seriesStack[0];var ai=this.series[ag].canvas._elem.detach();var ah=this.series[ag].shadowCanvas._elem.detach();this.series[af].shadowCanvas._elem.before(ah);this.series[af].canvas._elem.before(ai);this.previousSeriesStack=this.seriesStack.slice(0);this.seriesStack.splice(aj,1);this.seriesStack.unshift(ag)};this.restorePreviousSeriesOrder=function(){var al,ak,aj,ai,ah,af,ag;if(this.seriesStack==this.previousSeriesStack){return}for(al=1;al<this.previousSeriesStack.length;al++){af=this.previousSeriesStack[al];ag=this.previousSeriesStack[al-1];aj=this.series[af].canvas._elem.detach();ai=this.series[af].shadowCanvas._elem.detach();this.series[ag].shadowCanvas._elem.after(ai);this.series[ag].canvas._elem.after(aj)}ah=this.seriesStack.slice(0);this.seriesStack=this.previousSeriesStack.slice(0);this.previousSeriesStack=ah};this.restoreOriginalSeriesOrder=function(){var aj,ai,af=[],ah,ag;for(aj=0;aj<this.series.length;aj++){af.push(aj)}if(this.seriesStack==af){return}this.previousSeriesStack=this.seriesStack.slice(0);this.seriesStack=af;for(aj=1;aj<this.seriesStack.length;aj++){ah=this.series[aj].canvas._elem.detach();ag=this.series[aj].shadowCanvas._elem.detach();this.series[aj-1].shadowCanvas._elem.after(ag);this.series[aj-1].canvas._elem.after(ah)}};this.activateTheme=function(af){this.themeEngine.activate(this,af)}}H.jqplot.computeHighlightColors=function(ac){var ae;if(jQuery.isArray(ac)){ae=[];for(var ag=0;ag<ac.length;ag++){var af=H.jqplot.getColorComponents(ac[ag]);var ab=[af[0],af[1],af[2]];var ah=ab[0]+ab[1]+ab[2];for(var ad=0;ad<3;ad++){ab[ad]=(ah>660)?ab[ad]*0.85:0.73*ab[ad]+90;ab[ad]=parseInt(ab[ad],10);(ab[ad]>255)?255:ab[ad]}ab[3]=0.3+0.35*af[3];ae.push("rgba("+ab[0]+","+ab[1]+","+ab[2]+","+ab[3]+")")}}else{var af=H.jqplot.getColorComponents(ac);var ab=[af[0],af[1],af[2]];var ah=ab[0]+ab[1]+ab[2];for(var ad=0;ad<3;ad++){ab[ad]=(ah>660)?ab[ad]*0.85:0.73*ab[ad]+90;ab[ad]=parseInt(ab[ad],10);(ab[ad]>255)?255:ab[ad]}ab[3]=0.3+0.35*af[3];ae="rgba("+ab[0]+","+ab[1]+","+ab[2]+","+ab[3]+")"}return ae};H.jqplot.ColorGenerator=function(ac){ac=ac||H.jqplot.config.defaultColors;var ab=0;this.next=function(){if(ab<ac.length){return ac[ab++]}else{ab=0;return ac[ab++]}};this.previous=function(){if(ab>0){return ac[ab--]}else{ab=ac.length-1;return ac[ab]}};this.get=function(ae){var ad=ae-ac.length*Math.floor(ae/ac.length);return ac[ad]};this.setColors=function(ad){ac=ad};this.reset=function(){ab=0};this.getIndex=function(){return ab};this.setIndex=function(ad){ab=ad}};H.jqplot.hex2rgb=function(ad,ab){ad=ad.replace("#","");if(ad.length==3){ad=ad.charAt(0)+ad.charAt(0)+ad.charAt(1)+ad.charAt(1)+ad.charAt(2)+ad.charAt(2)}var ac;ac="rgba("+parseInt(ad.slice(0,2),16)+", "+parseInt(ad.slice(2,4),16)+", "+parseInt(ad.slice(4,6),16);if(ab){ac+=", "+ab}ac+=")";return ac};H.jqplot.rgb2hex=function(ag){var ad=/rgba?\( *([0-9]{1,3}\.?[0-9]*%?) *, *([0-9]{1,3}\.?[0-9]*%?) *, *([0-9]{1,3}\.?[0-9]*%?) *(?:, *[0-9.]*)?\)/;var ab=ag.match(ad);var af="#";for(var ae=1;ae<4;ae++){var ac;if(ab[ae].search(/%/)!=-1){ac=parseInt(255*ab[ae]/100,10).toString(16);if(ac.length==1){ac="0"+ac}}else{ac=parseInt(ab[ae],10).toString(16);if(ac.length==1){ac="0"+ac}}af+=ac}return af};H.jqplot.normalize2rgb=function(ac,ab){if(ac.search(/^ *rgba?\(/)!=-1){return ac}else{if(ac.search(/^ *#?[0-9a-fA-F]?[0-9a-fA-F]/)!=-1){return H.jqplot.hex2rgb(ac,ab)}else{throw"invalid color spec"}}};H.jqplot.getColorComponents=function(ag){ag=H.jqplot.colorKeywordMap[ag]||ag;var ae=H.jqplot.normalize2rgb(ag);var ad=/rgba?\( *([0-9]{1,3}\.?[0-9]*%?) *, *([0-9]{1,3}\.?[0-9]*%?) *, *([0-9]{1,3}\.?[0-9]*%?) *,? *([0-9.]* *)?\)/;var ab=ae.match(ad);var ac=[];for(var af=1;af<4;af++){if(ab[af].search(/%/)!=-1){ac[af-1]=parseInt(255*ab[af]/100,10)}else{ac[af-1]=parseInt(ab[af],10)}}ac[3]=parseFloat(ab[4])?parseFloat(ab[4]):1;return ac};H.jqplot.colorKeywordMap={aliceblue:"rgb(240, 248, 255)",antiquewhite:"rgb(250, 235, 215)",aqua:"rgb( 0, 255, 255)",aquamarine:"rgb(127, 255, 212)",azure:"rgb(240, 255, 255)",beige:"rgb(245, 245, 220)",bisque:"rgb(255, 228, 196)",black:"rgb( 0, 0, 0)",blanchedalmond:"rgb(255, 235, 205)",blue:"rgb( 0, 0, 255)",blueviolet:"rgb(138, 43, 226)",brown:"rgb(165, 42, 42)",burlywood:"rgb(222, 184, 135)",cadetblue:"rgb( 95, 158, 160)",chartreuse:"rgb(127, 255, 0)",chocolate:"rgb(210, 105, 30)",coral:"rgb(255, 127, 80)",cornflowerblue:"rgb(100, 149, 237)",cornsilk:"rgb(255, 248, 220)",crimson:"rgb(220, 20, 60)",cyan:"rgb( 0, 255, 255)",darkblue:"rgb( 0, 0, 139)",darkcyan:"rgb( 0, 139, 139)",darkgoldenrod:"rgb(184, 134, 11)",darkgray:"rgb(169, 169, 169)",darkgreen:"rgb( 0, 100, 0)",darkgrey:"rgb(169, 169, 169)",darkkhaki:"rgb(189, 183, 107)",darkmagenta:"rgb(139, 0, 139)",darkolivegreen:"rgb( 85, 107, 47)",darkorange:"rgb(255, 140, 0)",darkorchid:"rgb(153, 50, 204)",darkred:"rgb(139, 0, 0)",darksalmon:"rgb(233, 150, 122)",darkseagreen:"rgb(143, 188, 143)",darkslateblue:"rgb( 72, 61, 139)",darkslategray:"rgb( 47, 79, 79)",darkslategrey:"rgb( 47, 79, 79)",darkturquoise:"rgb( 0, 206, 209)",darkviolet:"rgb(148, 0, 211)",deeppink:"rgb(255, 20, 147)",deepskyblue:"rgb( 0, 191, 255)",dimgray:"rgb(105, 105, 105)",dimgrey:"rgb(105, 105, 105)",dodgerblue:"rgb( 30, 144, 255)",firebrick:"rgb(178, 34, 34)",floralwhite:"rgb(255, 250, 240)",forestgreen:"rgb( 34, 139, 34)",fuchsia:"rgb(255, 0, 255)",gainsboro:"rgb(220, 220, 220)",ghostwhite:"rgb(248, 248, 255)",gold:"rgb(255, 215, 0)",goldenrod:"rgb(218, 165, 32)",gray:"rgb(128, 128, 128)",grey:"rgb(128, 128, 128)",green:"rgb( 0, 128, 0)",greenyellow:"rgb(173, 255, 47)",honeydew:"rgb(240, 255, 240)",hotpink:"rgb(255, 105, 180)",indianred:"rgb(205, 92, 92)",indigo:"rgb( 75, 0, 130)",ivory:"rgb(255, 255, 240)",khaki:"rgb(240, 230, 140)",lavender:"rgb(230, 230, 250)",lavenderblush:"rgb(255, 240, 245)",lawngreen:"rgb(124, 252, 0)",lemonchiffon:"rgb(255, 250, 205)",lightblue:"rgb(173, 216, 230)",lightcoral:"rgb(240, 128, 128)",lightcyan:"rgb(224, 255, 255)",lightgoldenrodyellow:"rgb(250, 250, 210)",lightgray:"rgb(211, 211, 211)",lightgreen:"rgb(144, 238, 144)",lightgrey:"rgb(211, 211, 211)",lightpink:"rgb(255, 182, 193)",lightsalmon:"rgb(255, 160, 122)",lightseagreen:"rgb( 32, 178, 170)",lightskyblue:"rgb(135, 206, 250)",lightslategray:"rgb(119, 136, 153)",lightslategrey:"rgb(119, 136, 153)",lightsteelblue:"rgb(176, 196, 222)",lightyellow:"rgb(255, 255, 224)",lime:"rgb( 0, 255, 0)",limegreen:"rgb( 50, 205, 50)",linen:"rgb(250, 240, 230)",magenta:"rgb(255, 0, 255)",maroon:"rgb(128, 0, 0)",mediumaquamarine:"rgb(102, 205, 170)",mediumblue:"rgb( 0, 0, 205)",mediumorchid:"rgb(186, 85, 211)",mediumpurple:"rgb(147, 112, 219)",mediumseagreen:"rgb( 60, 179, 113)",mediumslateblue:"rgb(123, 104, 238)",mediumspringgreen:"rgb( 0, 250, 154)",mediumturquoise:"rgb( 72, 209, 204)",mediumvioletred:"rgb(199, 21, 133)",midnightblue:"rgb( 25, 25, 112)",mintcream:"rgb(245, 255, 250)",mistyrose:"rgb(255, 228, 225)",moccasin:"rgb(255, 228, 181)",navajowhite:"rgb(255, 222, 173)",navy:"rgb( 0, 0, 128)",oldlace:"rgb(253, 245, 230)",olive:"rgb(128, 128, 0)",olivedrab:"rgb(107, 142, 35)",orange:"rgb(255, 165, 0)",orangered:"rgb(255, 69, 0)",orchid:"rgb(218, 112, 214)",palegoldenrod:"rgb(238, 232, 170)",palegreen:"rgb(152, 251, 152)",paleturquoise:"rgb(175, 238, 238)",palevioletred:"rgb(219, 112, 147)",papayawhip:"rgb(255, 239, 213)",peachpuff:"rgb(255, 218, 185)",peru:"rgb(205, 133, 63)",pink:"rgb(255, 192, 203)",plum:"rgb(221, 160, 221)",powderblue:"rgb(176, 224, 230)",purple:"rgb(128, 0, 128)",red:"rgb(255, 0, 0)",rosybrown:"rgb(188, 143, 143)",royalblue:"rgb( 65, 105, 225)",saddlebrown:"rgb(139, 69, 19)",salmon:"rgb(250, 128, 114)",sandybrown:"rgb(244, 164, 96)",seagreen:"rgb( 46, 139, 87)",seashell:"rgb(255, 245, 238)",sienna:"rgb(160, 82, 45)",silver:"rgb(192, 192, 192)",skyblue:"rgb(135, 206, 235)",slateblue:"rgb(106, 90, 205)",slategray:"rgb(112, 128, 144)",slategrey:"rgb(112, 128, 144)",snow:"rgb(255, 250, 250)",springgreen:"rgb( 0, 255, 127)",steelblue:"rgb( 70, 130, 180)",tan:"rgb(210, 180, 140)",teal:"rgb( 0, 128, 128)",thistle:"rgb(216, 191, 216)",tomato:"rgb(255, 99, 71)",turquoise:"rgb( 64, 224, 208)",violet:"rgb(238, 130, 238)",wheat:"rgb(245, 222, 179)",white:"rgb(255, 255, 255)",whitesmoke:"rgb(245, 245, 245)",yellow:"rgb(255, 255, 0)",yellowgreen:"rgb(154, 205, 50)"};H.jqplot.AxisLabelRenderer=function(ab){H.jqplot.ElemContainer.call(this);this.axis;this.show=true;this.label="";this.fontFamily=null;this.fontSize=null;this.textColor=null;this._elem;this.escapeHTML=false;H.extend(true,this,ab)};H.jqplot.AxisLabelRenderer.prototype=new H.jqplot.ElemContainer();H.jqplot.AxisLabelRenderer.prototype.constructor=H.jqplot.AxisLabelRenderer;H.jqplot.AxisLabelRenderer.prototype.init=function(ab){H.extend(true,this,ab)};H.jqplot.AxisLabelRenderer.prototype.draw=function(ab,ac){if(this._elem){this._elem.emptyForce();this._elem=null}this._elem=H('<div style="position:absolute;" class="jqplot-'+this.axis+'-label"></div>');if(Number(this.label)){this._elem.css("white-space","nowrap")}if(!this.escapeHTML){this._elem.html(this.label)}else{this._elem.text(this.label)}if(this.fontFamily){this._elem.css("font-family",this.fontFamily)}if(this.fontSize){this._elem.css("font-size",this.fontSize)}if(this.textColor){this._elem.css("color",this.textColor)}return this._elem};H.jqplot.AxisLabelRenderer.prototype.pack=function(){};H.jqplot.AxisTickRenderer=function(ab){H.jqplot.ElemContainer.call(this);this.mark="outside";this.axis;this.showMark=true;this.showGridline=true;this.isMinorTick=false;this.size=4;this.markSize=6;this.show=true;this.showLabel=true;this.label=null;this.value=null;this._styles={};this.formatter=H.jqplot.DefaultTickFormatter;this.prefix="";this.formatString="";this.fontFamily;this.fontSize;this.textColor;this.escapeHTML=false;this._elem;this._breakTick=false;H.extend(true,this,ab)};H.jqplot.AxisTickRenderer.prototype.init=function(ab){H.extend(true,this,ab)};H.jqplot.AxisTickRenderer.prototype=new H.jqplot.ElemContainer();H.jqplot.AxisTickRenderer.prototype.constructor=H.jqplot.AxisTickRenderer;H.jqplot.AxisTickRenderer.prototype.setTick=function(ab,ad,ac){this.value=ab;this.axis=ad;if(ac){this.isMinorTick=true}return this};H.jqplot.AxisTickRenderer.prototype.draw=function(){if(this.label===null){this.label=this.prefix+this.formatter(this.formatString,this.value)}var ac={position:"absolute"};if(Number(this.label)){ac.whitSpace="nowrap"}if(this._elem){this._elem.emptyForce();this._elem=null}this._elem=H(document.createElement("div"));this._elem.addClass("jqplot-"+this.axis+"-tick");if(!this.escapeHTML){this._elem.html(this.label)}else{this._elem.text(this.label)}this._elem.css(ac);for(var ab in this._styles){this._elem.css(ab,this._styles[ab])}if(this.fontFamily){this._elem.css("font-family",this.fontFamily)}if(this.fontSize){this._elem.css("font-size",this.fontSize)}if(this.textColor){this._elem.css("color",this.textColor)}if(this._breakTick){this._elem.addClass("jqplot-breakTick")}return this._elem};H.jqplot.DefaultTickFormatter=function(ab,ac){if(typeof ac=="number"){if(!ab){ab=H.jqplot.config.defaultTickFormatString}return H.jqplot.sprintf(ab,ac)}else{return String(ac)}};H.jqplot.AxisTickRenderer.prototype.pack=function(){};H.jqplot.CanvasGridRenderer=function(){this.shadowRenderer=new H.jqplot.ShadowRenderer()};H.jqplot.CanvasGridRenderer.prototype.init=function(ac){this._ctx;H.extend(true,this,ac);var ab={lineJoin:"miter",lineCap:"round",fill:false,isarc:false,angle:this.shadowAngle,offset:this.shadowOffset,alpha:this.shadowAlpha,depth:this.shadowDepth,lineWidth:this.shadowWidth,closePath:false,strokeStyle:this.shadowColor};this.renderer.shadowRenderer.init(ab)};H.jqplot.CanvasGridRenderer.prototype.createElement=function(ae){var ad;if(this._elem){if(H.jqplot.use_excanvas&&window.G_vmlCanvasManager.uninitElement!==r){ad=this._elem.get(0);window.G_vmlCanvasManager.uninitElement(ad);ad=null}this._elem.emptyForce();this._elem=null}ad=ae.canvasManager.getCanvas();var ab=this._plotDimensions.width;var ac=this._plotDimensions.height;ad.width=ab;ad.height=ac;this._elem=H(ad);this._elem.addClass("jqplot-grid-canvas");this._elem.css({position:"absolute",left:0,top:0});ad=ae.canvasManager.initCanvas(ad);this._top=this._offsets.top;this._bottom=ac-this._offsets.bottom;this._left=this._offsets.left;this._right=ab-this._offsets.right;this._width=this._right-this._left;this._height=this._bottom-this._top;ad=null;return this._elem};H.jqplot.CanvasGridRenderer.prototype.draw=function(){this._ctx=this._elem.get(0).getContext("2d");var am=this._ctx;var ap=this._axes;am.save();am.clearRect(0,0,this._plotDimensions.width,this._plotDimensions.height);am.fillStyle=this.backgroundColor||this.background;am.fillRect(this._left,this._top,this._width,this._height);am.save();am.lineJoin="miter";am.lineCap="butt";am.lineWidth=this.gridLineWidth;am.strokeStyle=this.gridLineColor;var at,ar,aj,ak;var ag=["xaxis","yaxis","x2axis","y2axis"];for(var aq=4;aq>0;aq--){var aw=ag[aq-1];var ab=ap[aw];var au=ab._ticks;var al=au.length;if(ab.show){if(ab.drawBaseline){var av={};if(ab.baselineWidth!==null){av.lineWidth=ab.baselineWidth}if(ab.baselineColor!==null){av.strokeStyle=ab.baselineColor}switch(aw){case"xaxis":ai(this._left,this._bottom,this._right,this._bottom,av);break;case"yaxis":ai(this._left,this._bottom,this._left,this._top,av);break;case"x2axis":ai(this._left,this._bottom,this._right,this._bottom,av);break;case"y2axis":ai(this._right,this._bottom,this._right,this._top,av);break}}for(var an=al;an>0;an--){var ah=au[an-1];if(ah.show){var ae=Math.round(ab.u2p(ah.value))+0.5;switch(aw){case"xaxis":if(ah.showGridline&&this.drawGridlines&&((!ah.isMinorTick&&ab.drawMajorGridlines)||(ah.isMinorTick&&ab.drawMinorGridlines))){ai(ae,this._top,ae,this._bottom)}if(ah.showMark&&ah.mark&&((!ah.isMinorTick&&ab.drawMajorTickMarks)||(ah.isMinorTick&&ab.drawMinorTickMarks))){aj=ah.markSize;ak=ah.mark;var ae=Math.round(ab.u2p(ah.value))+0.5;switch(ak){case"outside":at=this._bottom;ar=this._bottom+aj;break;case"inside":at=this._bottom-aj;ar=this._bottom;break;case"cross":at=this._bottom-aj;ar=this._bottom+aj;break;default:at=this._bottom;ar=this._bottom+aj;break}if(this.shadow){this.renderer.shadowRenderer.draw(am,[[ae,at],[ae,ar]],{lineCap:"butt",lineWidth:this.gridLineWidth,offset:this.gridLineWidth*0.75,depth:2,fill:false,closePath:false})}ai(ae,at,ae,ar)}break;case"yaxis":if(ah.showGridline&&this.drawGridlines&&((!ah.isMinorTick&&ab.drawMajorGridlines)||(ah.isMinorTick&&ab.drawMinorGridlines))){ai(this._right,ae,this._left,ae)}if(ah.showMark&&ah.mark&&((!ah.isMinorTick&&ab.drawMajorTickMarks)||(ah.isMinorTick&&ab.drawMinorTickMarks))){aj=ah.markSize;ak=ah.mark;var ae=Math.round(ab.u2p(ah.value))+0.5;switch(ak){case"outside":at=this._left-aj;ar=this._left;break;case"inside":at=this._left;ar=this._left+aj;break;case"cross":at=this._left-aj;ar=this._left+aj;break;default:at=this._left-aj;ar=this._left;break}if(this.shadow){this.renderer.shadowRenderer.draw(am,[[at,ae],[ar,ae]],{lineCap:"butt",lineWidth:this.gridLineWidth*1.5,offset:this.gridLineWidth*0.75,fill:false,closePath:false})}ai(at,ae,ar,ae,{strokeStyle:ab.borderColor})}break;case"x2axis":if(ah.showGridline&&this.drawGridlines&&((!ah.isMinorTick&&ab.drawMajorGridlines)||(ah.isMinorTick&&ab.drawMinorGridlines))){ai(ae,this._bottom,ae,this._top)}if(ah.showMark&&ah.mark&&((!ah.isMinorTick&&ab.drawMajorTickMarks)||(ah.isMinorTick&&ab.drawMinorTickMarks))){aj=ah.markSize;ak=ah.mark;var ae=Math.round(ab.u2p(ah.value))+0.5;switch(ak){case"outside":at=this._top-aj;ar=this._top;break;case"inside":at=this._top;ar=this._top+aj;break;case"cross":at=this._top-aj;ar=this._top+aj;break;default:at=this._top-aj;ar=this._top;break}if(this.shadow){this.renderer.shadowRenderer.draw(am,[[ae,at],[ae,ar]],{lineCap:"butt",lineWidth:this.gridLineWidth,offset:this.gridLineWidth*0.75,depth:2,fill:false,closePath:false})}ai(ae,at,ae,ar)}break;case"y2axis":if(ah.showGridline&&this.drawGridlines&&((!ah.isMinorTick&&ab.drawMajorGridlines)||(ah.isMinorTick&&ab.drawMinorGridlines))){ai(this._left,ae,this._right,ae)}if(ah.showMark&&ah.mark&&((!ah.isMinorTick&&ab.drawMajorTickMarks)||(ah.isMinorTick&&ab.drawMinorTickMarks))){aj=ah.markSize;ak=ah.mark;var ae=Math.round(ab.u2p(ah.value))+0.5;switch(ak){case"outside":at=this._right;ar=this._right+aj;break;case"inside":at=this._right-aj;ar=this._right;break;case"cross":at=this._right-aj;ar=this._right+aj;break;default:at=this._right;ar=this._right+aj;break}if(this.shadow){this.renderer.shadowRenderer.draw(am,[[at,ae],[ar,ae]],{lineCap:"butt",lineWidth:this.gridLineWidth*1.5,offset:this.gridLineWidth*0.75,fill:false,closePath:false})}ai(at,ae,ar,ae,{strokeStyle:ab.borderColor})}break;default:break}}}ah=null}ab=null;au=null}ag=["y3axis","y4axis","y5axis","y6axis","y7axis","y8axis","y9axis","yMidAxis"];for(var aq=7;aq>0;aq--){var ab=ap[ag[aq-1]];var au=ab._ticks;if(ab.show){var ac=au[ab.numberTicks-1];var af=au[0];var ad=ab.getLeft();var ao=[[ad,ac.getTop()+ac.getHeight()/2],[ad,af.getTop()+af.getHeight()/2+1]];if(this.shadow){this.renderer.shadowRenderer.draw(am,ao,{lineCap:"butt",fill:false,closePath:false})}ai(ao[0][0],ao[0][1],ao[1][0],ao[1][1],{lineCap:"butt",strokeStyle:ab.borderColor,lineWidth:ab.borderWidth});for(var an=au.length;an>0;an--){var ah=au[an-1];aj=ah.markSize;ak=ah.mark;var ae=Math.round(ab.u2p(ah.value))+0.5;if(ah.showMark&&ah.mark){switch(ak){case"outside":at=ad;ar=ad+aj;break;case"inside":at=ad-aj;ar=ad;break;case"cross":at=ad-aj;ar=ad+aj;break;default:at=ad;ar=ad+aj;break}ao=[[at,ae],[ar,ae]];if(this.shadow){this.renderer.shadowRenderer.draw(am,ao,{lineCap:"butt",lineWidth:this.gridLineWidth*1.5,offset:this.gridLineWidth*0.75,fill:false,closePath:false})}ai(at,ae,ar,ae,{strokeStyle:ab.borderColor})}ah=null}af=null}ab=null;au=null}am.restore();function ai(aB,aA,ay,ax,az){am.save();az=az||{};if(az.lineWidth==null||az.lineWidth!=0){H.extend(true,am,az);am.beginPath();am.moveTo(aB,aA);am.lineTo(ay,ax);am.stroke();am.restore()}}if(this.shadow){var ao=[[this._left,this._bottom],[this._right,this._bottom],[this._right,this._top]];this.renderer.shadowRenderer.draw(am,ao)}if(this.borderWidth!=0&&this.drawBorder){ai(this._left,this._top,this._right,this._top,{lineCap:"round",strokeStyle:ap.x2axis.borderColor,lineWidth:ap.x2axis.borderWidth});ai(this._right,this._top,this._right,this._bottom,{lineCap:"round",strokeStyle:ap.y2axis.borderColor,lineWidth:ap.y2axis.borderWidth});ai(this._right,this._bottom,this._left,this._bottom,{lineCap:"round",strokeStyle:ap.xaxis.borderColor,lineWidth:ap.xaxis.borderWidth});ai(this._left,this._bottom,this._left,this._top,{lineCap:"round",strokeStyle:ap.yaxis.borderColor,lineWidth:ap.yaxis.borderWidth})}am.restore();am=null;ap=null};H.jqplot.DivTitleRenderer=function(){};H.jqplot.DivTitleRenderer.prototype.init=function(ab){H.extend(true,this,ab)};H.jqplot.DivTitleRenderer.prototype.draw=function(){if(this._elem){this._elem.emptyForce();this._elem=null}var ae=this.renderer;var ad=document.createElement("div");this._elem=H(ad);this._elem.addClass("jqplot-title");if(!this.text){this.show=false;this._elem.height(0);this._elem.width(0)}else{if(this.text){var ab;if(this.color){ab=this.color}else{if(this.textColor){ab=this.textColor}}var ac={position:"absolute",top:"0px",left:"0px"};if(this._plotWidth){ac.width=this._plotWidth+"px"}if(this.fontSize){ac.fontSize=this.fontSize}if(typeof this.textAlign==="string"){ac.textAlign=this.textAlign}else{ac.textAlign="center"}if(ab){ac.color=ab}if(this.paddingBottom){ac.paddingBottom=this.paddingBottom}if(this.fontFamily){ac.fontFamily=this.fontFamily}this._elem.css(ac);if(this.escapeHtml){this._elem.text(this.text)}else{this._elem.html(this.text)}}}ad=null;return this._elem};H.jqplot.DivTitleRenderer.prototype.pack=function(){};var o=0.1;H.jqplot.LinePattern=function(ap,ak){var aj={dotted:[o,H.jqplot.config.dotGapLength],dashed:[H.jqplot.config.dashLength,H.jqplot.config.gapLength],solid:null};if(typeof ak==="string"){if(ak[0]==="."||ak[0]==="-"){var aq=ak;ak=[];for(var ai=0,af=aq.length;ai<af;ai++){if(aq[ai]==="."){ak.push(o)}else{if(aq[ai]==="-"){ak.push(H.jqplot.config.dashLength)}else{continue}}ak.push(H.jqplot.config.gapLength)}}else{ak=aj[ak]}}if(!(ak&&ak.length)){return ap}var ae=0;var al=ak[0];var an=0;var am=0;var ah=0;var ab=0;var ao=function(ar,at){ap.moveTo(ar,at);an=ar;am=at;ah=ar;ab=at};var ad=function(ar,ay){var aw=ap.lineWidth;var au=ar-an;var at=ay-am;var av=Math.sqrt(au*au+at*at);if((av>0)&&(aw>0)){au/=av;at/=av;while(true){var ax=aw*al;if(ax<av){an+=ax*au;am+=ax*at;if((ae&1)==0){ap.lineTo(an,am)}else{ap.moveTo(an,am)}av-=ax;ae++;if(ae>=ak.length){ae=0}al=ak[ae]}else{an=ar;am=ay;if((ae&1)==0){ap.lineTo(an,am)}else{ap.moveTo(an,am)}al-=av/aw;break}}}};var ac=function(){ap.beginPath()};var ag=function(){ad(ah,ab)};return{moveTo:ao,lineTo:ad,beginPath:ac,closePath:ag}};H.jqplot.LineRenderer=function(){this.shapeRenderer=new H.jqplot.ShapeRenderer();this.shadowRenderer=new H.jqplot.ShadowRenderer()};H.jqplot.LineRenderer.prototype.init=function(ac,ah){ac=ac||{};this._type="line";this.renderer.animation={show:false,direction:"left",speed:2500,_supported:true};this.renderer.smooth=false;this.renderer.tension=null;this.renderer.constrainSmoothing=true;this.renderer._smoothedData=[];this.renderer._smoothedPlotData=[];this.renderer._hiBandGridData=[];this.renderer._lowBandGridData=[];this.renderer._hiBandSmoothedData=[];this.renderer._lowBandSmoothedData=[];this.renderer.bandData=[];this.renderer.bands={show:false,hiData:[],lowData:[],color:this.color,showLines:false,fill:true,fillColor:null,_min:null,_max:null,interval:"3%"};var af={highlightMouseOver:ac.highlightMouseOver,highlightMouseDown:ac.highlightMouseDown,highlightColor:ac.highlightColor};delete (ac.highlightMouseOver);delete (ac.highlightMouseDown);delete (ac.highlightColor);H.extend(true,this.renderer,ac);this.renderer.options=ac;if(this.renderer.bandData.length>1&&(!ac.bands||ac.bands.show==null)){this.renderer.bands.show=true}else{if(ac.bands&&ac.bands.show==null&&ac.bands.interval!=null){this.renderer.bands.show=true}}if(this.fill){this.renderer.bands.show=false}if(this.renderer.bands.show){this.renderer.initBands.call(this,this.renderer.options,ah)}if(this._stack){this.renderer.smooth=false}var ag={lineJoin:this.lineJoin,lineCap:this.lineCap,fill:this.fill,isarc:false,strokeStyle:this.color,fillStyle:this.fillColor,lineWidth:this.lineWidth,linePattern:this.linePattern,closePath:this.fill};this.renderer.shapeRenderer.init(ag);var ad=ac.shadowOffset;if(ad==null){if(this.lineWidth>2.5){ad=1.25*(1+(Math.atan((this.lineWidth/2.5))/0.785398163-1)*0.6)}else{ad=1.25*Math.atan((this.lineWidth/2.5))/0.785398163}}var ab={lineJoin:this.lineJoin,lineCap:this.lineCap,fill:this.fill,isarc:false,angle:this.shadowAngle,offset:ad,alpha:this.shadowAlpha,depth:this.shadowDepth,lineWidth:this.lineWidth,linePattern:this.linePattern,closePath:this.fill};this.renderer.shadowRenderer.init(ab);this._areaPoints=[];this._boundingBox=[[],[]];if(!this.isTrendline&&this.fill||this.renderer.bands.show){this.highlightMouseOver=true;this.highlightMouseDown=false;this.highlightColor=null;if(af.highlightMouseDown&&af.highlightMouseOver==null){af.highlightMouseOver=false}H.extend(true,this,{highlightMouseOver:af.highlightMouseOver,highlightMouseDown:af.highlightMouseDown,highlightColor:af.highlightColor});if(!this.highlightColor){var ae=(this.renderer.bands.show)?this.renderer.bands.fillColor:this.fillColor;this.highlightColor=H.jqplot.computeHighlightColors(ae)}if(this.highlighter){this.highlighter.show=false}}if(!this.isTrendline&&ah){ah.plugins.lineRenderer={};ah.postInitHooks.addOnce(v);ah.postDrawHooks.addOnce(Z);ah.eventListenerHooks.addOnce("jqplotMouseMove",g);ah.eventListenerHooks.addOnce("jqplotMouseDown",d);ah.eventListenerHooks.addOnce("jqplotMouseUp",Y);ah.eventListenerHooks.addOnce("jqplotClick",f);ah.eventListenerHooks.addOnce("jqplotRightClick",p)}};H.jqplot.LineRenderer.prototype.initBands=function(ae,ao){var af=ae.bandData||[];var ah=this.renderer.bands;ah.hiData=[];ah.lowData=[];var av=this.data;ah._max=null;ah._min=null;if(af.length==2){if(H.isArray(af[0][0])){var ai;var ab=0,al=0;for(var ap=0,am=af[0].length;ap<am;ap++){ai=af[0][ap];if((ai[1]!=null&&ai[1]>ah._max)||ah._max==null){ah._max=ai[1]}if((ai[1]!=null&&ai[1]<ah._min)||ah._min==null){ah._min=ai[1]}}for(var ap=0,am=af[1].length;ap<am;ap++){ai=af[1][ap];if((ai[1]!=null&&ai[1]>ah._max)||ah._max==null){ah._max=ai[1];al=1}if((ai[1]!=null&&ai[1]<ah._min)||ah._min==null){ah._min=ai[1];ab=1}}if(al===ab){ah.show=false}ah.hiData=af[al];ah.lowData=af[ab]}else{if(af[0].length===av.length&&af[1].length===av.length){var ad=(af[0][0]>af[1][0])?0:1;var aw=(ad)?0:1;for(var ap=0,am=av.length;ap<am;ap++){ah.hiData.push([av[ap][0],af[ad][ap]]);ah.lowData.push([av[ap][0],af[aw][ap]])}}else{ah.show=false}}}else{if(af.length>2&&!H.isArray(af[0][0])){var ad=(af[0][0]>af[0][1])?0:1;var aw=(ad)?0:1;for(var ap=0,am=af.length;ap<am;ap++){ah.hiData.push([av[ap][0],af[ap][ad]]);ah.lowData.push([av[ap][0],af[ap][aw]])}}else{var ak=ah.interval;var au=null;var at=null;var ac=null;var an=null;if(H.isArray(ak)){au=ak[0];at=ak[1]}else{au=ak}if(isNaN(au)){if(au.charAt(au.length-1)==="%"){ac="multiply";au=parseFloat(au)/100+1}}else{au=parseFloat(au);ac="add"}if(at!==null&&isNaN(at)){if(at.charAt(at.length-1)==="%"){an="multiply";at=parseFloat(at)/100+1}}else{if(at!==null){at=parseFloat(at);an="add"}}if(au!==null){if(at===null){at=-au;an=ac;if(an==="multiply"){at+=2}}if(au<at){var aq=au;au=at;at=aq;aq=ac;ac=an;an=aq}for(var ap=0,am=av.length;ap<am;ap++){switch(ac){case"add":ah.hiData.push([av[ap][0],av[ap][1]+au]);break;case"multiply":ah.hiData.push([av[ap][0],av[ap][1]*au]);break}switch(an){case"add":ah.lowData.push([av[ap][0],av[ap][1]+at]);break;case"multiply":ah.lowData.push([av[ap][0],av[ap][1]*at]);break}}}else{ah.show=false}}}var ag=ah.hiData;var aj=ah.lowData;for(var ap=0,am=ag.length;ap<am;ap++){if((ag[ap][1]!=null&&ag[ap][1]>ah._max)||ah._max==null){ah._max=ag[ap][1]}}for(var ap=0,am=aj.length;ap<am;ap++){if((aj[ap][1]!=null&&aj[ap][1]<ah._min)||ah._min==null){ah._min=aj[ap][1]}}if(ah.fillColor===null){var ar=H.jqplot.getColorComponents(ah.color);ar[3]=ar[3]*0.5;ah.fillColor="rgba("+ar[0]+", "+ar[1]+", "+ar[2]+", "+ar[3]+")"}};function G(ac,ab){return(3.4182054+ab)*Math.pow(ac,-0.3534992)}function k(ad,ac){var ab=Math.sqrt(Math.pow((ac[0]-ad[0]),2)+Math.pow((ac[1]-ad[1]),2));return 5.7648*Math.log(ab)+7.4456}function w(ab){var ac=(Math.exp(2*ab)-1)/(Math.exp(2*ab)+1);return ac}function F(aD){var am=this.renderer.smooth;var ax=this.canvas.getWidth();var ah=this._xaxis.series_p2u;var aA=this._yaxis.series_p2u;var az=null;var ag=null;var at=aD.length/ax;var ad=[];var ar=[];if(!isNaN(parseFloat(am))){az=parseFloat(am)}else{az=G(at,0.5)}var ap=[];var ae=[];for(var ay=0,au=aD.length;ay<au;ay++){ap.push(aD[ay][1]);ae.push(aD[ay][0])}function ao(aE,aF){if(aE-aF==0){return Math.pow(10,10)}else{return aE-aF}}var aq,al,ak,aj;var ab=aD.length-1;for(var af=1,av=aD.length;af<av;af++){var ac=[];var an=[];for(var aw=0;aw<2;aw++){var ay=af-1+aw;if(ay==0||ay==ab){ac[aw]=Math.pow(10,10)}else{if(ap[ay+1]-ap[ay]==0||ap[ay]-ap[ay-1]==0){ac[aw]=0}else{if(((ae[ay+1]-ae[ay])/(ap[ay+1]-ap[ay])+(ae[ay]-ae[ay-1])/(ap[ay]-ap[ay-1]))==0){ac[aw]=0}else{if((ap[ay+1]-ap[ay])*(ap[ay]-ap[ay-1])<0){ac[aw]=0}else{ac[aw]=2/(ao(ae[ay+1],ae[ay])/(ap[ay+1]-ap[ay])+ao(ae[ay],ae[ay-1])/(ap[ay]-ap[ay-1]))}}}}}if(af==1){ac[0]=3/2*(ap[1]-ap[0])/ao(ae[1],ae[0])-ac[1]/2}else{if(af==ab){ac[1]=3/2*(ap[ab]-ap[ab-1])/ao(ae[ab],ae[ab-1])-ac[0]/2}}an[0]=-2*(ac[1]+2*ac[0])/ao(ae[af],ae[af-1])+6*(ap[af]-ap[af-1])/Math.pow(ao(ae[af],ae[af-1]),2);an[1]=2*(2*ac[1]+ac[0])/ao(ae[af],ae[af-1])-6*(ap[af]-ap[af-1])/Math.pow(ao(ae[af],ae[af-1]),2);aj=1/6*(an[1]-an[0])/ao(ae[af],ae[af-1]);ak=1/2*(ae[af]*an[0]-ae[af-1]*an[1])/ao(ae[af],ae[af-1]);al=(ap[af]-ap[af-1]-ak*(Math.pow(ae[af],2)-Math.pow(ae[af-1],2))-aj*(Math.pow(ae[af],3)-Math.pow(ae[af-1],3)))/ao(ae[af],ae[af-1]);aq=ap[af-1]-al*ae[af-1]-ak*Math.pow(ae[af-1],2)-aj*Math.pow(ae[af-1],3);var aC=(ae[af]-ae[af-1])/az;var aB,ai;for(var aw=0,au=az;aw<au;aw++){aB=[];ai=ae[af-1]+aw*aC;aB.push(ai);aB.push(aq+al*ai+ak*Math.pow(ai,2)+aj*Math.pow(ai,3));ad.push(aB);ar.push([ah(aB[0]),aA(aB[1])])}}ad.push(aD[ay]);ar.push([ah(aD[ay][0]),aA(aD[ay][1])]);return[ad,ar]}function B(aj){var ai=this.renderer.smooth;var aO=this.renderer.tension;var ab=this.canvas.getWidth();var aB=this._xaxis.series_p2u;var ak=this._yaxis.series_p2u;var aC=null;var aD=null;var aN=null;var aI=null;var aG=null;var am=null;var aL=null;var ag=null;var aE,aF,ax,aw,au,ar;var ae,ac,ao,an;var av,at,aH;var ap=[];var ad=[];var af=aj.length/ab;var aM,aq,az,aA,ay;var al=[];var ah=[];if(!isNaN(parseFloat(ai))){aC=parseFloat(ai)}else{aC=G(af,0.5)}if(!isNaN(parseFloat(aO))){aO=parseFloat(aO)}for(var aK=0,aJ=aj.length-1;aK<aJ;aK++){if(aO===null){am=Math.abs((aj[aK+1][1]-aj[aK][1])/(aj[aK+1][0]-aj[aK][0]));aM=0.3;aq=0.6;az=(aq-aM)/2;aA=2.5;ay=-1.4;ag=am/aA+ay;aI=az*w(ag)-az*w(ay)+aM;if(aK>0){aL=Math.abs((aj[aK][1]-aj[aK-1][1])/(aj[aK][0]-aj[aK-1][0]))}ag=aL/aA+ay;aG=az*w(ag)-az*w(ay)+aM;aN=(aI+aG)/2}else{aN=aO}for(aE=0;aE<aC;aE++){aF=aE/aC;ax=(1+2*aF)*Math.pow((1-aF),2);aw=aF*Math.pow((1-aF),2);au=Math.pow(aF,2)*(3-2*aF);ar=Math.pow(aF,2)*(aF-1);if(aj[aK-1]){ae=aN*(aj[aK+1][0]-aj[aK-1][0]);ac=aN*(aj[aK+1][1]-aj[aK-1][1])}else{ae=aN*(aj[aK+1][0]-aj[aK][0]);ac=aN*(aj[aK+1][1]-aj[aK][1])}if(aj[aK+2]){ao=aN*(aj[aK+2][0]-aj[aK][0]);an=aN*(aj[aK+2][1]-aj[aK][1])}else{ao=aN*(aj[aK+1][0]-aj[aK][0]);an=aN*(aj[aK+1][1]-aj[aK][1])}av=ax*aj[aK][0]+au*aj[aK+1][0]+aw*ae+ar*ao;at=ax*aj[aK][1]+au*aj[aK+1][1]+aw*ac+ar*an;aH=[av,at];al.push(aH);ah.push([aB(av),ak(at)])}}al.push(aj[aJ]);ah.push([aB(aj[aJ][0]),ak(aj[aJ][1])]);return[al,ah]}H.jqplot.LineRenderer.prototype.setGridData=function(aj){var af=this._xaxis.series_u2p;var ab=this._yaxis.series_u2p;var ag=this._plotData;var ak=this._prevPlotData;this.gridData=[];this._prevGridData=[];this.renderer._smoothedData=[];this.renderer._smoothedPlotData=[];this.renderer._hiBandGridData=[];this.renderer._lowBandGridData=[];this.renderer._hiBandSmoothedData=[];this.renderer._lowBandSmoothedData=[];var ae=this.renderer.bands;var ac=false;for(var ah=0,ad=this.data.length;ah<ad;ah++){if(ag[ah][0]!=null&&ag[ah][1]!=null){this.gridData.push([af.call(this._xaxis,ag[ah][0]),ab.call(this._yaxis,ag[ah][1])])}else{if(ag[ah][0]==null){ac=true;this.gridData.push([null,ab.call(this._yaxis,ag[ah][1])])}else{if(ag[ah][1]==null){ac=true;this.gridData.push([af.call(this._xaxis,ag[ah][0]),null])}}}if(ak[ah]!=null&&ak[ah][0]!=null&&ak[ah][1]!=null){this._prevGridData.push([af.call(this._xaxis,ak[ah][0]),ab.call(this._yaxis,ak[ah][1])])}else{if(ak[ah]!=null&&ak[ah][0]==null){this._prevGridData.push([null,ab.call(this._yaxis,ak[ah][1])])}else{if(ak[ah]!=null&&ak[ah][0]!=null&&ak[ah][1]==null){this._prevGridData.push([af.call(this._xaxis,ak[ah][0]),null])}}}}if(ac){this.renderer.smooth=false;if(this._type==="line"){ae.show=false}}if(this._type==="line"&&ae.show){for(var ah=0,ad=ae.hiData.length;ah<ad;ah++){this.renderer._hiBandGridData.push([af.call(this._xaxis,ae.hiData[ah][0]),ab.call(this._yaxis,ae.hiData[ah][1])])}for(var ah=0,ad=ae.lowData.length;ah<ad;ah++){this.renderer._lowBandGridData.push([af.call(this._xaxis,ae.lowData[ah][0]),ab.call(this._yaxis,ae.lowData[ah][1])])}}if(this._type==="line"&&this.renderer.smooth&&this.gridData.length>2){var ai;if(this.renderer.constrainSmoothing){ai=F.call(this,this.gridData);this.renderer._smoothedData=ai[0];this.renderer._smoothedPlotData=ai[1];if(ae.show){ai=F.call(this,this.renderer._hiBandGridData);this.renderer._hiBandSmoothedData=ai[0];ai=F.call(this,this.renderer._lowBandGridData);this.renderer._lowBandSmoothedData=ai[0]}ai=null}else{ai=B.call(this,this.gridData);this.renderer._smoothedData=ai[0];this.renderer._smoothedPlotData=ai[1];if(ae.show){ai=B.call(this,this.renderer._hiBandGridData);this.renderer._hiBandSmoothedData=ai[0];ai=B.call(this,this.renderer._lowBandGridData);this.renderer._lowBandSmoothedData=ai[0]}ai=null}}};H.jqplot.LineRenderer.prototype.makeGridData=function(ai,ak){var ag=this._xaxis.series_u2p;var ab=this._yaxis.series_u2p;var al=[];var ad=[];this.renderer._smoothedData=[];this.renderer._smoothedPlotData=[];this.renderer._hiBandGridData=[];this.renderer._lowBandGridData=[];this.renderer._hiBandSmoothedData=[];this.renderer._lowBandSmoothedData=[];var af=this.renderer.bands;var ac=false;for(var ah=0;ah<ai.length;ah++){if(ai[ah][0]!=null&&ai[ah][1]!=null){al.push([ag.call(this._xaxis,ai[ah][0]),ab.call(this._yaxis,ai[ah][1])])}else{if(ai[ah][0]==null){ac=true;al.push([null,ab.call(this._yaxis,ai[ah][1])])}else{if(ai[ah][1]==null){ac=true;al.push([ag.call(this._xaxis,ai[ah][0]),null])}}}}if(ac){this.renderer.smooth=false;if(this._type==="line"){af.show=false}}if(this._type==="line"&&af.show){for(var ah=0,ae=af.hiData.length;ah<ae;ah++){this.renderer._hiBandGridData.push([ag.call(this._xaxis,af.hiData[ah][0]),ab.call(this._yaxis,af.hiData[ah][1])])}for(var ah=0,ae=af.lowData.length;ah<ae;ah++){this.renderer._lowBandGridData.push([ag.call(this._xaxis,af.lowData[ah][0]),ab.call(this._yaxis,af.lowData[ah][1])])}}if(this._type==="line"&&this.renderer.smooth&&al.length>2){var aj;if(this.renderer.constrainSmoothing){aj=F.call(this,al);this.renderer._smoothedData=aj[0];this.renderer._smoothedPlotData=aj[1];if(af.show){aj=F.call(this,this.renderer._hiBandGridData);this.renderer._hiBandSmoothedData=aj[0];aj=F.call(this,this.renderer._lowBandGridData);this.renderer._lowBandSmoothedData=aj[0]}aj=null}else{aj=B.call(this,al);this.renderer._smoothedData=aj[0];this.renderer._smoothedPlotData=aj[1];if(af.show){aj=B.call(this,this.renderer._hiBandGridData);this.renderer._hiBandSmoothedData=aj[0];aj=B.call(this,this.renderer._lowBandGridData);this.renderer._lowBandSmoothedData=aj[0]}aj=null}}return al};H.jqplot.LineRenderer.prototype.draw=function(aq,aC,ac,av){var aw;var ak=H.extend(true,{},ac);var ae=(ak.shadow!=r)?ak.shadow:this.shadow;var aD=(ak.showLine!=r)?ak.showLine:this.showLine;var au=(ak.fill!=r)?ak.fill:this.fill;var ab=(ak.fillAndStroke!=r)?ak.fillAndStroke:this.fillAndStroke;var al,ar,ao,ay;aq.save();if(aC.length){if(aD){if(au){if(this.fillToZero){var az=this.negativeColor;if(!this.useNegativeColors){az=ak.fillStyle}var ai=false;var aj=ak.fillStyle;if(ab){var aB=aC.slice(0)}if(this.index==0||!this._stack){var ap=[];var aF=(this.renderer.smooth)?this.renderer._smoothedPlotData:this._plotData;this._areaPoints=[];var aA=this._yaxis.series_u2p(this.fillToValue);var ad=this._xaxis.series_u2p(this.fillToValue);ak.closePath=true;if(this.fillAxis=="y"){ap.push([aC[0][0],aA]);this._areaPoints.push([aC[0][0],aA]);for(var aw=0;aw<aC.length-1;aw++){ap.push(aC[aw]);this._areaPoints.push(aC[aw]);if(aF[aw][1]*aF[aw+1][1]<0){if(aF[aw][1]<0){ai=true;ak.fillStyle=az}else{ai=false;ak.fillStyle=aj}var ah=aC[aw][0]+(aC[aw+1][0]-aC[aw][0])*(aA-aC[aw][1])/(aC[aw+1][1]-aC[aw][1]);ap.push([ah,aA]);this._areaPoints.push([ah,aA]);if(ae){this.renderer.shadowRenderer.draw(aq,ap,ak)}this.renderer.shapeRenderer.draw(aq,ap,ak);ap=[[ah,aA]]}}if(aF[aC.length-1][1]<0){ai=true;ak.fillStyle=az}else{ai=false;ak.fillStyle=aj}ap.push(aC[aC.length-1]);this._areaPoints.push(aC[aC.length-1]);ap.push([aC[aC.length-1][0],aA]);this._areaPoints.push([aC[aC.length-1][0],aA])}if(ae){this.renderer.shadowRenderer.draw(aq,ap,ak)}this.renderer.shapeRenderer.draw(aq,ap,ak)}else{var an=this._prevGridData;for(var aw=an.length;aw>0;aw--){aC.push(an[aw-1])}if(ae){this.renderer.shadowRenderer.draw(aq,aC,ak)}this._areaPoints=aC;this.renderer.shapeRenderer.draw(aq,aC,ak)}}else{if(ab){var aB=aC.slice(0)}if(this.index==0||!this._stack){var af=aq.canvas.height;aC.unshift([aC[0][0],af]);var ax=aC.length;aC.push([aC[ax-1][0],af])}else{var an=this._prevGridData;for(var aw=an.length;aw>0;aw--){aC.push(an[aw-1])}}this._areaPoints=aC;if(ae){this.renderer.shadowRenderer.draw(aq,aC,ak)}this.renderer.shapeRenderer.draw(aq,aC,ak)}if(ab){var at=H.extend(true,{},ak,{fill:false,closePath:false});this.renderer.shapeRenderer.draw(aq,aB,at);if(this.markerRenderer.show){if(this.renderer.smooth){aB=this.gridData}for(aw=0;aw<aB.length;aw++){this.markerRenderer.draw(aB[aw][0],aB[aw][1],aq,ak.markerOptions)}}}}else{if(this.renderer.bands.show){var ag;var aE=H.extend(true,{},ak);if(this.renderer.bands.showLines){ag=(this.renderer.smooth)?this.renderer._hiBandSmoothedData:this.renderer._hiBandGridData;this.renderer.shapeRenderer.draw(aq,ag,ak);ag=(this.renderer.smooth)?this.renderer._lowBandSmoothedData:this.renderer._lowBandGridData;this.renderer.shapeRenderer.draw(aq,ag,aE)}if(this.renderer.bands.fill){if(this.renderer.smooth){ag=this.renderer._hiBandSmoothedData.concat(this.renderer._lowBandSmoothedData.reverse())}else{ag=this.renderer._hiBandGridData.concat(this.renderer._lowBandGridData.reverse())}this._areaPoints=ag;aE.closePath=true;aE.fill=true;aE.fillStyle=this.renderer.bands.fillColor;this.renderer.shapeRenderer.draw(aq,ag,aE)}}if(ae){this.renderer.shadowRenderer.draw(aq,aC,ak)}this.renderer.shapeRenderer.draw(aq,aC,ak)}}var al=ao=ar=ay=null;for(aw=0;aw<this._areaPoints.length;aw++){var am=this._areaPoints[aw];if(al>am[0]||al==null){al=am[0]}if(ay<am[1]||ay==null){ay=am[1]}if(ao<am[0]||ao==null){ao=am[0]}if(ar>am[1]||ar==null){ar=am[1]}}if(this.type==="line"&&this.renderer.bands.show){ay=this._yaxis.series_u2p(this.renderer.bands._min);ar=this._yaxis.series_u2p(this.renderer.bands._max)}this._boundingBox=[[al,ay],[ao,ar]];if(this.markerRenderer.show&&!au){if(this.renderer.smooth){aC=this.gridData}for(aw=0;aw<aC.length;aw++){if(aC[aw][0]!=null&&aC[aw][1]!=null){this.markerRenderer.draw(aC[aw][0],aC[aw][1],aq,ak.markerOptions)}}}}aq.restore()};H.jqplot.LineRenderer.prototype.drawShadow=function(ab,ad,ac){};function v(ae,ad,ab){for(var ac=0;ac<this.series.length;ac++){if(this.series[ac].renderer.constructor==H.jqplot.LineRenderer){if(this.series[ac].highlightMouseOver){this.series[ac].highlightMouseDown=false}}}}function Z(){if(this.plugins.lineRenderer&&this.plugins.lineRenderer.highlightCanvas){this.plugins.lineRenderer.highlightCanvas.resetCanvas();this.plugins.lineRenderer.highlightCanvas=null}this.plugins.lineRenderer.highlightedSeriesIndex=null;this.plugins.lineRenderer.highlightCanvas=new H.jqplot.GenericCanvas();this.eventCanvas._elem.before(this.plugins.lineRenderer.highlightCanvas.createElement(this._gridPadding,"jqplot-lineRenderer-highlight-canvas",this._plotDimensions,this));this.plugins.lineRenderer.highlightCanvas.setContext();this.eventCanvas._elem.bind("mouseleave",{plot:this},function(ab){V(ab.data.plot)})}function X(ah,ag,ae,ad){var ac=ah.series[ag];var ab=ah.plugins.lineRenderer.highlightCanvas;ab._ctx.clearRect(0,0,ab._ctx.canvas.width,ab._ctx.canvas.height);ac._highlightedPoint=ae;ah.plugins.lineRenderer.highlightedSeriesIndex=ag;var af={fillStyle:ac.highlightColor};if(ac.type==="line"&&ac.renderer.bands.show){af.fill=true;af.closePath=true}ac.renderer.shapeRenderer.draw(ab._ctx,ad,af);ab=null}function V(ad){var ab=ad.plugins.lineRenderer.highlightCanvas;ab._ctx.clearRect(0,0,ab._ctx.canvas.width,ab._ctx.canvas.height);for(var ac=0;ac<ad.series.length;ac++){ad.series[ac]._highlightedPoint=null}ad.plugins.lineRenderer.highlightedSeriesIndex=null;ad.target.trigger("jqplotDataUnhighlight");ab=null}function g(af,ae,ai,ah,ag){if(ah){var ad=[ah.seriesIndex,ah.pointIndex,ah.data];var ac=jQuery.Event("jqplotDataMouseOver");ac.pageX=af.pageX;ac.pageY=af.pageY;ag.target.trigger(ac,ad);if(ag.series[ad[0]].highlightMouseOver&&!(ad[0]==ag.plugins.lineRenderer.highlightedSeriesIndex)){var ab=jQuery.Event("jqplotDataHighlight");ab.pageX=af.pageX;ab.pageY=af.pageY;ag.target.trigger(ab,ad);X(ag,ah.seriesIndex,ah.pointIndex,ah.points)}}else{if(ah==null){V(ag)}}}function d(ae,ad,ah,ag,af){if(ag){var ac=[ag.seriesIndex,ag.pointIndex,ag.data];if(af.series[ac[0]].highlightMouseDown&&!(ac[0]==af.plugins.lineRenderer.highlightedSeriesIndex)){var ab=jQuery.Event("jqplotDataHighlight");ab.pageX=ae.pageX;ab.pageY=ae.pageY;af.target.trigger(ab,ac);X(af,ag.seriesIndex,ag.pointIndex,ag.points)}}else{if(ag==null){V(af)}}}function Y(ad,ac,ag,af,ae){var ab=ae.plugins.lineRenderer.highlightedSeriesIndex;if(ab!=null&&ae.series[ab].highlightMouseDown){V(ae)}}function f(ae,ad,ah,ag,af){if(ag){var ac=[ag.seriesIndex,ag.pointIndex,ag.data];var ab=jQuery.Event("jqplotDataClick");ab.pageX=ae.pageX;ab.pageY=ae.pageY;af.target.trigger(ab,ac)}}function p(af,ae,ai,ah,ag){if(ah){var ad=[ah.seriesIndex,ah.pointIndex,ah.data];var ab=ag.plugins.lineRenderer.highlightedSeriesIndex;if(ab!=null&&ag.series[ab].highlightMouseDown){V(ag)}var ac=jQuery.Event("jqplotDataRightClick");ac.pageX=af.pageX;ac.pageY=af.pageY;ag.target.trigger(ac,ad)}}H.jqplot.LinearAxisRenderer=function(){};H.jqplot.LinearAxisRenderer.prototype.init=function(ab){this.breakPoints=null;this.breakTickLabel="≈";this.drawBaseline=true;this.baselineWidth=null;this.baselineColor=null;this.forceTickAt0=false;this.forceTickAt100=false;this.tickInset=0;this.minorTicks=0;this.alignTicks=false;this._autoFormatString="";this._overrideFormatString=false;this._scalefact=1;H.extend(true,this,ab);if(this.breakPoints){if(!H.isArray(this.breakPoints)){this.breakPoints=null}else{if(this.breakPoints.length<2||this.breakPoints[1]<=this.breakPoints[0]){this.breakPoints=null}}}if(this.numberTicks!=null&&this.numberTicks<2){this.numberTicks=2}this.resetDataBounds()};H.jqplot.LinearAxisRenderer.prototype.draw=function(ab,ai){if(this.show){this.renderer.createTicks.call(this,ai);var ah=0;var ac;if(this._elem){this._elem.emptyForce();this._elem=null}this._elem=H(document.createElement("div"));this._elem.addClass("jqplot-axis jqplot-"+this.name);this._elem.css("position","absolute");if(this.name=="xaxis"||this.name=="x2axis"){this._elem.width(this._plotDimensions.width)}else{this._elem.height(this._plotDimensions.height)}this.labelOptions.axis=this.name;this._label=new this.labelRenderer(this.labelOptions);if(this._label.show){var ag=this._label.draw(ab,ai);ag.appendTo(this._elem);ag=null}var af=this._ticks;var ae;for(var ad=0;ad<af.length;ad++){ae=af[ad];if(ae.show&&ae.showLabel&&(!ae.isMinorTick||this.showMinorTicks)){this._elem.append(ae.draw(ab,ai))}}ae=null;af=null}return this._elem};H.jqplot.LinearAxisRenderer.prototype.reset=function(){this.min=this._options.min;this.max=this._options.max;this.tickInterval=this._options.tickInterval;this.numberTicks=this._options.numberTicks;this._autoFormatString="";if(this._overrideFormatString&&this.tickOptions&&this.tickOptions.formatString){this.tickOptions.formatString=""}};H.jqplot.LinearAxisRenderer.prototype.set=function(){var ai=0;var ad;var ac=0;var ah=0;var ab=(this._label==null)?false:this._label.show;if(this.show){var ag=this._ticks;var af;for(var ae=0;ae<ag.length;ae++){af=ag[ae];if(!af._breakTick&&af.show&&af.showLabel&&(!af.isMinorTick||this.showMinorTicks)){if(this.name=="xaxis"||this.name=="x2axis"){ad=af._elem.outerHeight(true)}else{ad=af._elem.outerWidth(true)}if(ad>ai){ai=ad}}}af=null;ag=null;if(ab){ac=this._label._elem.outerWidth(true);ah=this._label._elem.outerHeight(true)}if(this.name=="xaxis"){ai=ai+ah;this._elem.css({height:ai+"px",left:"0px",bottom:"0px"})}else{if(this.name=="x2axis"){ai=ai+ah;this._elem.css({height:ai+"px",left:"0px",top:"0px"})}else{if(this.name=="yaxis"){ai=ai+ac;this._elem.css({width:ai+"px",left:"0px",top:"0px"});if(ab&&this._label.constructor==H.jqplot.AxisLabelRenderer){this._label._elem.css("width",ac+"px")}}else{ai=ai+ac;this._elem.css({width:ai+"px",right:"0px",top:"0px"});if(ab&&this._label.constructor==H.jqplot.AxisLabelRenderer){this._label._elem.css("width",ac+"px")}}}}}};H.jqplot.LinearAxisRenderer.prototype.createTicks=function(ad){var aM=this._ticks;var aD=this.ticks;var at=this.name;var av=this._dataBounds;var ab=(this.name.charAt(0)==="x")?this._plotDimensions.width:this._plotDimensions.height;var ah;var aY,aB;var aj,ai;var aW,aT;var aA=this.min;var aX=this.max;var aP=this.numberTicks;var a2=this.tickInterval;var ag=30;this._scalefact=(Math.max(ab,ag+1)-ag)/300;if(aD.length){for(aT=0;aT<aD.length;aT++){var aH=aD[aT];var aN=new this.tickRenderer(this.tickOptions);if(H.isArray(aH)){aN.value=aH[0];if(this.breakPoints){if(aH[0]==this.breakPoints[0]){aN.label=this.breakTickLabel;aN._breakTick=true;aN.showGridline=false;aN.showMark=false}else{if(aH[0]>this.breakPoints[0]&&aH[0]<=this.breakPoints[1]){aN.show=false;aN.showGridline=false;aN.label=aH[1]}else{aN.label=aH[1]}}}else{aN.label=aH[1]}aN.setTick(aH[0],this.name);this._ticks.push(aN)}else{if(H.isPlainObject(aH)){H.extend(true,aN,aH);aN.axis=this.name;this._ticks.push(aN)}else{aN.value=aH;if(this.breakPoints){if(aH==this.breakPoints[0]){aN.label=this.breakTickLabel;aN._breakTick=true;aN.showGridline=false;aN.showMark=false}else{if(aH>this.breakPoints[0]&&aH<=this.breakPoints[1]){aN.show=false;aN.showGridline=false}}}aN.setTick(aH,this.name);this._ticks.push(aN)}}}this.numberTicks=aD.length;this.min=this._ticks[0].value;this.max=this._ticks[this.numberTicks-1].value;this.tickInterval=(this.max-this.min)/(this.numberTicks-1)}else{if(at=="xaxis"||at=="x2axis"){ab=this._plotDimensions.width}else{ab=this._plotDimensions.height}var aq=this.numberTicks;if(this.alignTicks){if(this.name==="x2axis"&&ad.axes.xaxis.show){aq=ad.axes.xaxis.numberTicks}else{if(this.name.charAt(0)==="y"&&this.name!=="yaxis"&&this.name!=="yMidAxis"&&ad.axes.yaxis.show){aq=ad.axes.yaxis.numberTicks}}}aY=((this.min!=null)?this.min:av.min);aB=((this.max!=null)?this.max:av.max);var ao=aB-aY;var aL,ar;var am;if(this.tickOptions==null||!this.tickOptions.formatString){this._overrideFormatString=true}if(this.min==null&&this.max==null&&this.tickInterval==null&&!this.autoscale){if(this.forceTickAt0){if(aY>0){aY=0}if(aB<0){aB=0}}if(this.forceTickAt100){if(aY>100){aY=100}if(aB<100){aB=100}}var aI=H.jqplot.LinearTickGenerator(aY,aB,this._scalefact,aq);var ap=aY+ao*(this.padMin-1);var aJ=aB-ao*(this.padMax-1);if(aY<ap||aB>aJ){ap=aY-ao*(this.padMin-1);aJ=aB+ao*(this.padMax-1);aI=H.jqplot.LinearTickGenerator(ap,aJ,this._scalefact,aq)}this.min=aI[0];this.max=aI[1];this.numberTicks=aI[2];this._autoFormatString=aI[3];this.tickInterval=aI[4]}else{if(aY==aB){var ac=0.05;if(aY>0){ac=Math.max(Math.log(aY)/Math.LN10,0.05)}aY-=ac;aB+=ac}if(this.autoscale&&this.min==null&&this.max==null){var ae,af,al;var aw=false;var aG=false;var au={min:null,max:null,average:null,stddev:null};for(var aT=0;aT<this._series.length;aT++){var aO=this._series[aT];var ax=(aO.fillAxis=="x")?aO._xaxis.name:aO._yaxis.name;if(this.name==ax){var aK=aO._plotValues[aO.fillAxis];var az=aK[0];var aU=aK[0];for(var aS=1;aS<aK.length;aS++){if(aK[aS]<az){az=aK[aS]}else{if(aK[aS]>aU){aU=aK[aS]}}}var an=(aU-az)/aU;if(aO.renderer.constructor==H.jqplot.BarRenderer){if(az>=0&&(aO.fillToZero||an>0.1)){aw=true}else{aw=false;if(aO.fill&&aO.fillToZero&&az<0&&aU>0){aG=true}else{aG=false}}}else{if(aO.fill){if(az>=0&&(aO.fillToZero||an>0.1)){aw=true}else{if(az<0&&aU>0&&aO.fillToZero){aw=false;aG=true}else{aw=false;aG=false}}}else{if(az<0){aw=false}}}}}if(aw){this.numberTicks=2+Math.ceil((ab-(this.tickSpacing-1))/this.tickSpacing);this.min=0;aA=0;af=aB/(this.numberTicks-1);am=Math.pow(10,Math.abs(Math.floor(Math.log(af)/Math.LN10)));if(af/am==parseInt(af/am,10)){af+=am}this.tickInterval=Math.ceil(af/am)*am;this.max=this.tickInterval*(this.numberTicks-1)}else{if(aG){this.numberTicks=2+Math.ceil((ab-(this.tickSpacing-1))/this.tickSpacing);var aC=Math.ceil(Math.abs(aY)/ao*(this.numberTicks-1));var a1=this.numberTicks-1-aC;af=Math.max(Math.abs(aY/aC),Math.abs(aB/a1));am=Math.pow(10,Math.abs(Math.floor(Math.log(af)/Math.LN10)));this.tickInterval=Math.ceil(af/am)*am;this.max=this.tickInterval*a1;this.min=-this.tickInterval*aC}else{if(this.numberTicks==null){if(this.tickInterval){this.numberTicks=3+Math.ceil(ao/this.tickInterval)}else{this.numberTicks=2+Math.ceil((ab-(this.tickSpacing-1))/this.tickSpacing)}}if(this.tickInterval==null){af=ao/(this.numberTicks-1);if(af<1){am=Math.pow(10,Math.abs(Math.floor(Math.log(af)/Math.LN10)))}else{am=1}this.tickInterval=Math.ceil(af*am*this.pad)/am}else{am=1/this.tickInterval}ae=this.tickInterval*(this.numberTicks-1);al=(ae-ao)/2;if(this.min==null){this.min=Math.floor(am*(aY-al))/am}if(this.max==null){this.max=this.min+ae}}}var ay=H.jqplot.getSignificantFigures(this.tickInterval);var aF;if(ay.digitsLeft>=ay.significantDigits){aF="%d"}else{var am=Math.max(0,5-ay.digitsLeft);am=Math.min(am,ay.digitsRight);aF="%."+am+"f"}this._autoFormatString=aF}else{aL=(this.min!=null)?this.min:aY-ao*(this.padMin-1);ar=(this.max!=null)?this.max:aB+ao*(this.padMax-1);ao=ar-aL;if(this.numberTicks==null){if(this.tickInterval!=null){this.numberTicks=Math.ceil((ar-aL)/this.tickInterval)+1}else{if(ab>100){this.numberTicks=parseInt(3+(ab-100)/75,10)}else{this.numberTicks=2}}}if(this.tickInterval==null){this.tickInterval=ao/(this.numberTicks-1)}if(this.max==null){ar=aL+this.tickInterval*(this.numberTicks-1)}if(this.min==null){aL=ar-this.tickInterval*(this.numberTicks-1)}var ay=H.jqplot.getSignificantFigures(this.tickInterval);var aF;if(ay.digitsLeft>=ay.significantDigits){aF="%d"}else{var am=Math.max(0,5-ay.digitsLeft);am=Math.min(am,ay.digitsRight);aF="%."+am+"f"}this._autoFormatString=aF;this.min=aL;this.max=ar}if(this.renderer.constructor==H.jqplot.LinearAxisRenderer&&this._autoFormatString==""){ao=this.max-this.min;var aZ=new this.tickRenderer(this.tickOptions);var aE=aZ.formatString||H.jqplot.config.defaultTickFormatString;var aE=aE.match(H.jqplot.sprintf.regex)[0];var aV=0;if(aE){if(aE.search(/[fFeEgGpP]/)>-1){var aR=aE.match(/\%\.(\d{0,})?[eEfFgGpP]/);if(aR){aV=parseInt(aR[1],10)}else{aV=6}}else{if(aE.search(/[di]/)>-1){aV=0}}var ak=Math.pow(10,-aV);if(this.tickInterval<ak){if(aP==null&&a2==null){this.tickInterval=ak;if(aX==null&&aA==null){this.min=Math.floor(this._dataBounds.min/ak)*ak;if(this.min==this._dataBounds.min){this.min=this._dataBounds.min-this.tickInterval}this.max=Math.ceil(this._dataBounds.max/ak)*ak;if(this.max==this._dataBounds.max){this.max=this._dataBounds.max+this.tickInterval}var aQ=(this.max-this.min)/this.tickInterval;aQ=aQ.toFixed(11);aQ=Math.ceil(aQ);this.numberTicks=aQ+1}else{if(aX==null){var aQ=(this._dataBounds.max-this.min)/this.tickInterval;aQ=aQ.toFixed(11);this.numberTicks=Math.ceil(aQ)+2;this.max=this.min+this.tickInterval*(this.numberTicks-1)}else{if(aA==null){var aQ=(this.max-this._dataBounds.min)/this.tickInterval;aQ=aQ.toFixed(11);this.numberTicks=Math.ceil(aQ)+2;this.min=this.max-this.tickInterval*(this.numberTicks-1)}else{this.numberTicks=Math.ceil((aX-aA)/this.tickInterval)+1;this.min=Math.floor(aA*Math.pow(10,aV))/Math.pow(10,aV);this.max=Math.ceil(aX*Math.pow(10,aV))/Math.pow(10,aV);this.numberTicks=Math.ceil((this.max-this.min)/this.tickInterval)+1}}}}}}}}if(this._overrideFormatString&&this._autoFormatString!=""){this.tickOptions=this.tickOptions||{};this.tickOptions.formatString=this._autoFormatString}var aN,a0;for(var aT=0;aT<this.numberTicks;aT++){aW=this.min+aT*this.tickInterval;aN=new this.tickRenderer(this.tickOptions);aN.setTick(aW,this.name);this._ticks.push(aN);if(aT<this.numberTicks-1){for(var aS=0;aS<this.minorTicks;aS++){aW+=this.tickInterval/(this.minorTicks+1);a0=H.extend(true,{},this.tickOptions,{name:this.name,value:aW,label:"",isMinorTick:true});aN=new this.tickRenderer(a0);this._ticks.push(aN)}}aN=null}}if(this.tickInset){this.min=this.min-this.tickInset*this.tickInterval;this.max=this.max+this.tickInset*this.tickInterval}aM=null};H.jqplot.LinearAxisRenderer.prototype.resetTickValues=function(ad){if(H.isArray(ad)&&ad.length==this._ticks.length){var ac;for(var ab=0;ab<ad.length;ab++){ac=this._ticks[ab];ac.value=ad[ab];ac.label=ac.formatter(ac.formatString,ad[ab]);ac.label=ac.prefix+ac.label;ac._elem.html(ac.label)}ac=null;this.min=H.jqplot.arrayMin(ad);this.max=H.jqplot.arrayMax(ad);this.pack()}};H.jqplot.LinearAxisRenderer.prototype.pack=function(ad,ac){ad=ad||{};ac=ac||this._offsets;var ar=this._ticks;var an=this.max;var am=this.min;var ai=ac.max;var ag=ac.min;var ak=(this._label==null)?false:this._label.show;for(var al in ad){this._elem.css(al,ad[al])}this._offsets=ac;var ae=ai-ag;var af=an-am;if(this.breakPoints){af=af-this.breakPoints[1]+this.breakPoints[0];this.p2u=function(au){return(au-ag)*af/ae+am};this.u2p=function(au){if(au>this.breakPoints[0]&&au<this.breakPoints[1]){au=this.breakPoints[0]}if(au<=this.breakPoints[0]){return(au-am)*ae/af+ag}else{return(au-this.breakPoints[1]+this.breakPoints[0]-am)*ae/af+ag}};if(this.name.charAt(0)=="x"){this.series_u2p=function(au){if(au>this.breakPoints[0]&&au<this.breakPoints[1]){au=this.breakPoints[0]}if(au<=this.breakPoints[0]){return(au-am)*ae/af}else{return(au-this.breakPoints[1]+this.breakPoints[0]-am)*ae/af}};this.series_p2u=function(au){return au*af/ae+am}}else{this.series_u2p=function(au){if(au>this.breakPoints[0]&&au<this.breakPoints[1]){au=this.breakPoints[0]}if(au>=this.breakPoints[1]){return(au-an)*ae/af}else{return(au+this.breakPoints[1]-this.breakPoints[0]-an)*ae/af}};this.series_p2u=function(au){return au*af/ae+an}}}else{this.p2u=function(au){return(au-ag)*af/ae+am};this.u2p=function(au){return(au-am)*ae/af+ag};if(this.name=="xaxis"||this.name=="x2axis"){this.series_u2p=function(au){return(au-am)*ae/af};this.series_p2u=function(au){return au*af/ae+am}}else{this.series_u2p=function(au){return(au-an)*ae/af};this.series_p2u=function(au){return au*af/ae+an}}}if(this.show){if(this.name=="xaxis"||this.name=="x2axis"){for(var ao=0;ao<ar.length;ao++){var aj=ar[ao];if(aj.show&&aj.showLabel){var ab;if(aj.constructor==H.jqplot.CanvasAxisTickRenderer&&aj.angle){var aq=(this.name=="xaxis")?1:-1;switch(aj.labelPosition){case"auto":if(aq*aj.angle<0){ab=-aj.getWidth()+aj._textRenderer.height*Math.sin(-aj._textRenderer.angle)/2}else{ab=-aj._textRenderer.height*Math.sin(aj._textRenderer.angle)/2}break;case"end":ab=-aj.getWidth()+aj._textRenderer.height*Math.sin(-aj._textRenderer.angle)/2;break;case"start":ab=-aj._textRenderer.height*Math.sin(aj._textRenderer.angle)/2;break;case"middle":ab=-aj.getWidth()/2+aj._textRenderer.height*Math.sin(-aj._textRenderer.angle)/2;break;default:ab=-aj.getWidth()/2+aj._textRenderer.height*Math.sin(-aj._textRenderer.angle)/2;break}}else{ab=-aj.getWidth()/2}var at=this.u2p(aj.value)+ab+"px";aj._elem.css("left",at);aj.pack()}}if(ak){var ah=this._label._elem.outerWidth(true);this._label._elem.css("left",ag+ae/2-ah/2+"px");if(this.name=="xaxis"){this._label._elem.css("bottom","0px")}else{this._label._elem.css("top","0px")}this._label.pack()}}else{for(var ao=0;ao<ar.length;ao++){var aj=ar[ao];if(aj.show&&aj.showLabel){var ab;if(aj.constructor==H.jqplot.CanvasAxisTickRenderer&&aj.angle){var aq=(this.name=="yaxis")?1:-1;switch(aj.labelPosition){case"auto":case"end":if(aq*aj.angle<0){ab=-aj._textRenderer.height*Math.cos(-aj._textRenderer.angle)/2}else{ab=-aj.getHeight()+aj._textRenderer.height*Math.cos(aj._textRenderer.angle)/2}break;case"start":if(aj.angle>0){ab=-aj._textRenderer.height*Math.cos(-aj._textRenderer.angle)/2}else{ab=-aj.getHeight()+aj._textRenderer.height*Math.cos(aj._textRenderer.angle)/2}break;case"middle":ab=-aj.getHeight()/2;break;default:ab=-aj.getHeight()/2;break}}else{ab=-aj.getHeight()/2}var at=this.u2p(aj.value)+ab+"px";aj._elem.css("top",at);aj.pack()}}if(ak){var ap=this._label._elem.outerHeight(true);this._label._elem.css("top",ai-ae/2-ap/2+"px");if(this.name=="yaxis"){this._label._elem.css("left","0px")}else{this._label._elem.css("right","0px")}this._label.pack()}}}ar=null};function h(ac){var ab;ac=Math.abs(ac);if(ac>=10){ab="%d"}else{if(ac>1){if(ac===parseInt(ac,10)){ab="%d"}else{ab="%.1f"}}else{var ad=-Math.floor(Math.log(ac)/Math.LN10);ab="%."+ad+"f"}}return ab}var a=[0.1,0.2,0.3,0.4,0.5,0.8,1,2,3,4,5];var b=function(ac){var ab=a.indexOf(ac);if(ab>0){return a[ab-1]}else{return a[a.length-1]/100}};var i=function(ac){var ab=a.indexOf(ac);if(ab<a.length-1){return a[ab+1]}else{return a[0]*100}};function c(af,an,am){var ak=Math.floor(am/2);var ac=Math.ceil(am*1.5);var ae=Number.MAX_VALUE;var ab=(an-af);var aq;var aj;var al;var ap;var ah;var ar=H.jqplot.getSignificantFigures;var ai;var ao;for(var ag=0,ad=ac-ak+1;ag<ad;ag++){ai=ak+ag;aq=ab/(ai-1);aj=ar(aq);aq=Math.abs(am-ai)+aj.digitsRight;if(aq<ae){ae=aq;al=ai;ao=aj.digitsRight}else{if(aq===ae){if(aj.digitsRight<ao){al=ai;ao=aj.digitsRight}}}}ap=Math.max(ao,Math.max(ar(af).digitsRight,ar(an).digitsRight));if(ap===0){ah="%d"}else{ah="%."+ap+"f"}aq=ab/(al-1);return[af,an,al,ah,aq]}function S(ac,af){af=af||7;var ae=ac/(af-1);var ad=Math.pow(10,Math.floor(Math.log(ae)/Math.LN10));var ag=ae/ad;var ab;if(ad<1){if(ag>5){ab=10*ad}else{if(ag>2){ab=5*ad}else{if(ag>1){ab=2*ad}else{ab=ad}}}}else{if(ag>5){ab=10*ad}else{if(ag>4){ab=5*ad}else{if(ag>3){ab=4*ad}else{if(ag>2){ab=3*ad}else{if(ag>1){ab=2*ad}else{ab=ad}}}}}}return ab}function M(ac,ab){ab=ab||1;var ae=Math.floor(Math.log(ac)/Math.LN10);var ag=Math.pow(10,ae);var af=ac/ag;var ad;af=af/ab;if(af<=0.38){ad=0.1}else{if(af<=1.6){ad=0.2}else{if(af<=4){ad=0.5}else{if(af<=8){ad=1}else{if(af<=16){ad=2}else{ad=5}}}}}return ad*ag}function t(ad,ac){var af=Math.floor(Math.log(ad)/Math.LN10);var ah=Math.pow(10,af);var ag=ad/ah;var ab;var ae;ag=ag/ac;if(ag<=0.38){ae=0.1}else{if(ag<=1.6){ae=0.2}else{if(ag<=4){ae=0.5}else{if(ag<=8){ae=1}else{if(ag<=16){ae=2}else{ae=5}}}}}ab=ae*ah;return[ab,ae,ah]}H.jqplot.LinearTickGenerator=function(ag,ah,ad,ae){if(ag===ah){ah=(ah)?0:1}ad=ad||1;if(ah<ag){var ai=ah;ah=ag;ag=ai}var ac=[];var aj=M(ah-ag,ad);if(ae==null){ac[0]=Math.floor(ag/aj)*aj;ac[1]=Math.ceil(ah/aj)*aj;ac[2]=Math.round((ac[1]-ac[0])/aj+1);ac[3]=h(aj);ac[4]=aj}else{var af=[];af[0]=Math.floor(ag/aj)*aj;af[1]=Math.ceil(ah/aj)*aj;af[2]=Math.round((af[1]-af[0])/aj+1);af[3]=h(aj);af[4]=aj;if(af[2]===ae){ac=af}else{var ab=S(af[1]-af[0],ae);ac[0]=af[0];ac[2]=ae;ac[4]=ab;ac[3]=h(ab);ac[1]=ac[0]+(ac[2]-1)*ac[4]}}return ac};H.jqplot.LinearTickGenerator.bestLinearInterval=M;H.jqplot.LinearTickGenerator.bestInterval=S;H.jqplot.LinearTickGenerator.bestLinearComponents=t;H.jqplot.LinearTickGenerator.bestConstrainedInterval=c;H.jqplot.MarkerRenderer=function(ab){this.show=true;this.style="filledCircle";this.lineWidth=2;this.size=9;this.color="#666666";this.shadow=true;this.shadowAngle=45;this.shadowOffset=1;this.shadowDepth=3;this.shadowAlpha="0.07";this.shadowRenderer=new H.jqplot.ShadowRenderer();this.shapeRenderer=new H.jqplot.ShapeRenderer();H.extend(true,this,ab)};H.jqplot.MarkerRenderer.prototype.init=function(ab){H.extend(true,this,ab);var ad={angle:this.shadowAngle,offset:this.shadowOffset,alpha:this.shadowAlpha,lineWidth:this.lineWidth,depth:this.shadowDepth,closePath:true};if(this.style.indexOf("filled")!=-1){ad.fill=true}if(this.style.indexOf("ircle")!=-1){ad.isarc=true;ad.closePath=false}this.shadowRenderer.init(ad);var ac={fill:false,isarc:false,strokeStyle:this.color,fillStyle:this.color,lineWidth:this.lineWidth,closePath:true};if(this.style.indexOf("filled")!=-1){ac.fill=true}if(this.style.indexOf("ircle")!=-1){ac.isarc=true;ac.closePath=false}this.shapeRenderer.init(ac)};H.jqplot.MarkerRenderer.prototype.drawDiamond=function(ad,ac,ag,af,ai){var ab=1.2;var aj=this.size/2/ab;var ah=this.size/2*ab;var ae=[[ad-aj,ac],[ad,ac+ah],[ad+aj,ac],[ad,ac-ah]];if(this.shadow){this.shadowRenderer.draw(ag,ae)}this.shapeRenderer.draw(ag,ae,ai)};H.jqplot.MarkerRenderer.prototype.drawPlus=function(ae,ad,ah,ag,ak){var ac=1;var al=this.size/2*ac;var ai=this.size/2*ac;var aj=[[ae,ad-ai],[ae,ad+ai]];var af=[[ae+al,ad],[ae-al,ad]];var ab=H.extend(true,{},this.options,{closePath:false});if(this.shadow){this.shadowRenderer.draw(ah,aj,{closePath:false});this.shadowRenderer.draw(ah,af,{closePath:false})}this.shapeRenderer.draw(ah,aj,ab);this.shapeRenderer.draw(ah,af,ab)};H.jqplot.MarkerRenderer.prototype.drawX=function(ae,ad,ah,ag,ak){var ac=1;var al=this.size/2*ac;var ai=this.size/2*ac;var ab=H.extend(true,{},this.options,{closePath:false});var aj=[[ae-al,ad-ai],[ae+al,ad+ai]];var af=[[ae-al,ad+ai],[ae+al,ad-ai]];if(this.shadow){this.shadowRenderer.draw(ah,aj,{closePath:false});this.shadowRenderer.draw(ah,af,{closePath:false})}this.shapeRenderer.draw(ah,aj,ab);this.shapeRenderer.draw(ah,af,ab)};H.jqplot.MarkerRenderer.prototype.drawDash=function(ad,ac,ag,af,ai){var ab=1;var aj=this.size/2*ab;var ah=this.size/2*ab;var ae=[[ad-aj,ac],[ad+aj,ac]];if(this.shadow){this.shadowRenderer.draw(ag,ae)}this.shapeRenderer.draw(ag,ae,ai)};H.jqplot.MarkerRenderer.prototype.drawLine=function(ag,af,ab,ae,ac){var ad=[ag,af];if(this.shadow){this.shadowRenderer.draw(ab,ad)}this.shapeRenderer.draw(ab,ad,ac)};H.jqplot.MarkerRenderer.prototype.drawSquare=function(ad,ac,ag,af,ai){var ab=1;var aj=this.size/2/ab;var ah=this.size/2*ab;var ae=[[ad-aj,ac-ah],[ad-aj,ac+ah],[ad+aj,ac+ah],[ad+aj,ac-ah]];if(this.shadow){this.shadowRenderer.draw(ag,ae)}this.shapeRenderer.draw(ag,ae,ai)};H.jqplot.MarkerRenderer.prototype.drawCircle=function(ac,ai,ae,ah,af){var ab=this.size/2;var ad=2*Math.PI;var ag=[ac,ai,ab,0,ad,true];if(this.shadow){this.shadowRenderer.draw(ae,ag)}this.shapeRenderer.draw(ae,ag,af)};H.jqplot.MarkerRenderer.prototype.draw=function(ab,ae,ac,ad){ad=ad||{};if(ad.show==null||ad.show!=false){if(ad.color&&!ad.fillStyle){ad.fillStyle=ad.color}if(ad.color&&!ad.strokeStyle){ad.strokeStyle=ad.color}switch(this.style){case"diamond":this.drawDiamond(ab,ae,ac,false,ad);break;case"filledDiamond":this.drawDiamond(ab,ae,ac,true,ad);break;case"circle":this.drawCircle(ab,ae,ac,false,ad);break;case"filledCircle":this.drawCircle(ab,ae,ac,true,ad);break;case"square":this.drawSquare(ab,ae,ac,false,ad);break;case"filledSquare":this.drawSquare(ab,ae,ac,true,ad);break;case"x":this.drawX(ab,ae,ac,true,ad);break;case"plus":this.drawPlus(ab,ae,ac,true,ad);break;case"dash":this.drawDash(ab,ae,ac,true,ad);break;case"line":this.drawLine(ab,ae,ac,false,ad);break;default:this.drawDiamond(ab,ae,ac,false,ad);break}}};H.jqplot.ShadowRenderer=function(ab){this.angle=45;this.offset=1;this.alpha=0.07;this.lineWidth=1.5;this.lineJoin="miter";this.lineCap="round";this.closePath=false;this.fill=false;this.depth=3;this.strokeStyle="rgba(0,0,0,0.1)";this.isarc=false;H.extend(true,this,ab)};H.jqplot.ShadowRenderer.prototype.init=function(ab){H.extend(true,this,ab)};H.jqplot.ShadowRenderer.prototype.draw=function(ao,am,aq){ao.save();var ab=(aq!=null)?aq:{};var an=(ab.fill!=null)?ab.fill:this.fill;var aj=(ab.fillRect!=null)?ab.fillRect:this.fillRect;var ai=(ab.closePath!=null)?ab.closePath:this.closePath;var af=(ab.offset!=null)?ab.offset:this.offset;var ad=(ab.alpha!=null)?ab.alpha:this.alpha;var ah=(ab.depth!=null)?ab.depth:this.depth;var ap=(ab.isarc!=null)?ab.isarc:this.isarc;var ak=(ab.linePattern!=null)?ab.linePattern:this.linePattern;ao.lineWidth=(ab.lineWidth!=null)?ab.lineWidth:this.lineWidth;ao.lineJoin=(ab.lineJoin!=null)?ab.lineJoin:this.lineJoin;ao.lineCap=(ab.lineCap!=null)?ab.lineCap:this.lineCap;ao.strokeStyle=ab.strokeStyle||this.strokeStyle||"rgba(0,0,0,"+ad+")";ao.fillStyle=ab.fillStyle||this.fillStyle||"rgba(0,0,0,"+ad+")";for(var ae=0;ae<ah;ae++){var al=H.jqplot.LinePattern(ao,ak);ao.translate(Math.cos(this.angle*Math.PI/180)*af,Math.sin(this.angle*Math.PI/180)*af);al.beginPath();if(ap){ao.arc(am[0],am[1],am[2],am[3],am[4],true)}else{if(aj){if(aj){ao.fillRect(am[0],am[1],am[2],am[3])}}else{if(am&&am.length){var ac=true;for(var ag=0;ag<am.length;ag++){if(am[ag][0]!=null&&am[ag][1]!=null){if(ac){al.moveTo(am[ag][0],am[ag][1]);ac=false}else{al.lineTo(am[ag][0],am[ag][1])}}else{ac=true}}}}}if(ai){al.closePath()}if(an){ao.fill()}else{ao.stroke()}}ao.restore()};H.jqplot.ShapeRenderer=function(ab){this.lineWidth=1.5;this.linePattern="solid";this.lineJoin="miter";this.lineCap="round";this.closePath=false;this.fill=false;this.isarc=false;this.fillRect=false;this.strokeRect=false;this.clearRect=false;this.strokeStyle="#999999";this.fillStyle="#999999";H.extend(true,this,ab)};H.jqplot.ShapeRenderer.prototype.init=function(ab){H.extend(true,this,ab)};H.jqplot.ShapeRenderer.prototype.draw=function(am,ak,ao){am.save();var ab=(ao!=null)?ao:{};var al=(ab.fill!=null)?ab.fill:this.fill;var ag=(ab.closePath!=null)?ab.closePath:this.closePath;var ah=(ab.fillRect!=null)?ab.fillRect:this.fillRect;var ae=(ab.strokeRect!=null)?ab.strokeRect:this.strokeRect;var ac=(ab.clearRect!=null)?ab.clearRect:this.clearRect;var an=(ab.isarc!=null)?ab.isarc:this.isarc;var ai=(ab.linePattern!=null)?ab.linePattern:this.linePattern;var aj=H.jqplot.LinePattern(am,ai);am.lineWidth=ab.lineWidth||this.lineWidth;am.lineJoin=ab.lineJoin||this.lineJoin;am.lineCap=ab.lineCap||this.lineCap;am.strokeStyle=(ab.strokeStyle||ab.color)||this.strokeStyle;am.fillStyle=ab.fillStyle||this.fillStyle;am.beginPath();if(an){am.arc(ak[0],ak[1],ak[2],ak[3],ak[4],true);if(ag){am.closePath()}if(al){am.fill()}else{am.stroke()}am.restore();return}else{if(ac){am.clearRect(ak[0],ak[1],ak[2],ak[3]);am.restore();return}else{if(ah||ae){if(ah){am.fillRect(ak[0],ak[1],ak[2],ak[3])}if(ae){am.strokeRect(ak[0],ak[1],ak[2],ak[3]);am.restore();return}}else{if(ak&&ak.length){var ad=true;for(var af=0;af<ak.length;af++){if(ak[af][0]!=null&&ak[af][1]!=null){if(ad){aj.moveTo(ak[af][0],ak[af][1]);ad=false}else{aj.lineTo(ak[af][0],ak[af][1])}}else{ad=true}}if(ag){aj.closePath()}if(al){am.fill()}else{am.stroke()}}}}}am.restore()};H.jqplot.TableLegendRenderer=function(){};H.jqplot.TableLegendRenderer.prototype.init=function(ab){H.extend(true,this,ab)};H.jqplot.TableLegendRenderer.prototype.addrow=function(ak,ae,ab,ai){var af=(ab)?this.rowSpacing+"px":"0px";var aj;var ad;var ac;var ah;var ag;ac=document.createElement("tr");aj=H(ac);aj.addClass("jqplot-table-legend");ac=null;if(ai){aj.prependTo(this._elem)}else{aj.appendTo(this._elem)}if(this.showSwatches){ad=H(document.createElement("td"));ad.addClass("jqplot-table-legend jqplot-table-legend-swatch");ad.css({textAlign:"center",paddingTop:af});ah=H(document.createElement("div"));ah.addClass("jqplot-table-legend-swatch-outline");ag=H(document.createElement("div"));ag.addClass("jqplot-table-legend-swatch");ag.css({backgroundColor:ae,borderColor:ae});aj.append(ad.append(ah.append(ag)))}if(this.showLabels){ad=H(document.createElement("td"));ad.addClass("jqplot-table-legend jqplot-table-legend-label");ad.css("paddingTop",af);aj.append(ad);if(this.escapeHtml){ad.text(ak)}else{ad.html(ak)}}ad=null;ah=null;ag=null;aj=null;ac=null};H.jqplot.TableLegendRenderer.prototype.draw=function(){if(this._elem){this._elem.emptyForce();this._elem=null}if(this.show){var ag=this._series;var ac=document.createElement("table");this._elem=H(ac);this._elem.addClass("jqplot-table-legend");var al={position:"absolute"};if(this.background){al.background=this.background}if(this.border){al.border=this.border}if(this.fontSize){al.fontSize=this.fontSize}if(this.fontFamily){al.fontFamily=this.fontFamily}if(this.textColor){al.textColor=this.textColor}if(this.marginTop!=null){al.marginTop=this.marginTop}if(this.marginBottom!=null){al.marginBottom=this.marginBottom}if(this.marginLeft!=null){al.marginLeft=this.marginLeft}if(this.marginRight!=null){al.marginRight=this.marginRight}var ab=false,ai=false,ak;for(var ah=0;ah<ag.length;ah++){ak=ag[ah];if(ak._stack||ak.renderer.constructor==H.jqplot.BezierCurveRenderer){ai=true}if(ak.show&&ak.showLabel){var af=this.labels[ah]||ak.label.toString();if(af){var ad=ak.color;if(ai&&ah<ag.length-1){ab=true}else{if(ai&&ah==ag.length-1){ab=false}}this.renderer.addrow.call(this,af,ad,ab,ai);ab=true}for(var ae=0;ae<H.jqplot.addLegendRowHooks.length;ae++){var aj=H.jqplot.addLegendRowHooks[ae].call(this,ak);if(aj){this.renderer.addrow.call(this,aj.label,aj.color,ab);ab=true}}af=null}}}return this._elem};H.jqplot.TableLegendRenderer.prototype.pack=function(ad){if(this.show){if(this.placement=="insideGrid"){switch(this.location){case"nw":var ac=ad.left;var ab=ad.top;this._elem.css("left",ac);this._elem.css("top",ab);break;case"n":var ac=(ad.left+(this._plotDimensions.width-ad.right))/2-this.getWidth()/2;var ab=ad.top;this._elem.css("left",ac);this._elem.css("top",ab);break;case"ne":var ac=ad.right;var ab=ad.top;this._elem.css({right:ac,top:ab});break;case"e":var ac=ad.right;var ab=(ad.top+(this._plotDimensions.height-ad.bottom))/2-this.getHeight()/2;this._elem.css({right:ac,top:ab});break;case"se":var ac=ad.right;var ab=ad.bottom;this._elem.css({right:ac,bottom:ab});break;case"s":var ac=(ad.left+(this._plotDimensions.width-ad.right))/2-this.getWidth()/2;var ab=ad.bottom;this._elem.css({left:ac,bottom:ab});break;case"sw":var ac=ad.left;var ab=ad.bottom;this._elem.css({left:ac,bottom:ab});break;case"w":var ac=ad.left;var ab=(ad.top+(this._plotDimensions.height-ad.bottom))/2-this.getHeight()/2;this._elem.css({left:ac,top:ab});break;default:var ac=ad.right;var ab=ad.bottom;this._elem.css({right:ac,bottom:ab});break}}else{if(this.placement=="outside"){switch(this.location){case"nw":var ac=this._plotDimensions.width-ad.left;var ab=ad.top;this._elem.css("right",ac);this._elem.css("top",ab);break;case"n":var ac=(ad.left+(this._plotDimensions.width-ad.right))/2-this.getWidth()/2;var ab=this._plotDimensions.height-ad.top;this._elem.css("left",ac);this._elem.css("bottom",ab);break;case"ne":var ac=this._plotDimensions.width-ad.right;var ab=ad.top;this._elem.css({left:ac,top:ab});break;case"e":var ac=this._plotDimensions.width-ad.right;var ab=(ad.top+(this._plotDimensions.height-ad.bottom))/2-this.getHeight()/2;this._elem.css({left:ac,top:ab});break;case"se":var ac=this._plotDimensions.width-ad.right;var ab=ad.bottom;this._elem.css({left:ac,bottom:ab});break;case"s":var ac=(ad.left+(this._plotDimensions.width-ad.right))/2-this.getWidth()/2;var ab=this._plotDimensions.height-ad.bottom;this._elem.css({left:ac,top:ab});break;case"sw":var ac=this._plotDimensions.width-ad.left;var ab=ad.bottom;this._elem.css({right:ac,bottom:ab});break;case"w":var ac=this._plotDimensions.width-ad.left;var ab=(ad.top+(this._plotDimensions.height-ad.bottom))/2-this.getHeight()/2;this._elem.css({right:ac,top:ab});break;default:var ac=ad.right;var ab=ad.bottom;this._elem.css({right:ac,bottom:ab});break}}else{switch(this.location){case"nw":this._elem.css({left:0,top:ad.top});break;case"n":var ac=(ad.left+(this._plotDimensions.width-ad.right))/2-this.getWidth()/2;this._elem.css({left:ac,top:ad.top});break;case"ne":this._elem.css({right:0,top:ad.top});break;case"e":var ab=(ad.top+(this._plotDimensions.height-ad.bottom))/2-this.getHeight()/2;this._elem.css({right:ad.right,top:ab});break;case"se":this._elem.css({right:ad.right,bottom:ad.bottom});break;case"s":var ac=(ad.left+(this._plotDimensions.width-ad.right))/2-this.getWidth()/2;this._elem.css({left:ac,bottom:ad.bottom});break;case"sw":this._elem.css({left:ad.left,bottom:ad.bottom});break;case"w":var ab=(ad.top+(this._plotDimensions.height-ad.bottom))/2-this.getHeight()/2;this._elem.css({left:ad.left,top:ab});break;default:this._elem.css({right:ad.right,bottom:ad.bottom});break}}}}};H.jqplot.ThemeEngine=function(){this.themes={};this.activeTheme=null};H.jqplot.ThemeEngine.prototype.init=function(){var ae=new H.jqplot.Theme({_name:"Default"});var ah,ac,ag;for(ah in ae.target){if(ah=="textColor"){ae.target[ah]=this.target.css("color")}else{ae.target[ah]=this.target.css(ah)}}if(this.title.show&&this.title._elem){for(ah in ae.title){if(ah=="textColor"){ae.title[ah]=this.title._elem.css("color")}else{ae.title[ah]=this.title._elem.css(ah)}}}for(ah in ae.grid){ae.grid[ah]=this.grid[ah]}if(ae.grid.backgroundColor==null&&this.grid.background!=null){ae.grid.backgroundColor=this.grid.background}if(this.legend.show&&this.legend._elem){for(ah in ae.legend){if(ah=="textColor"){ae.legend[ah]=this.legend._elem.css("color")}else{ae.legend[ah]=this.legend._elem.css(ah)}}}var ad;for(ac=0;ac<this.series.length;ac++){ad=this.series[ac];if(ad.renderer.constructor==H.jqplot.LineRenderer){ae.series.push(new m())}else{if(ad.renderer.constructor==H.jqplot.BarRenderer){ae.series.push(new P())}else{if(ad.renderer.constructor==H.jqplot.PieRenderer){ae.series.push(new e())}else{if(ad.renderer.constructor==H.jqplot.DonutRenderer){ae.series.push(new C())}else{if(ad.renderer.constructor==H.jqplot.FunnelRenderer){ae.series.push(new U())}else{if(ad.renderer.constructor==H.jqplot.MeterGaugeRenderer){ae.series.push(new z())}else{ae.series.push({})}}}}}}for(ah in ae.series[ac]){ae.series[ac][ah]=ad[ah]}}var ab,af;for(ah in this.axes){af=this.axes[ah];ab=ae.axes[ah]=new L();ab.borderColor=af.borderColor;ab.borderWidth=af.borderWidth;if(af._ticks&&af._ticks[0]){for(ag in ab.ticks){if(af._ticks[0].hasOwnProperty(ag)){ab.ticks[ag]=af._ticks[0][ag]}else{if(af._ticks[0]._elem){ab.ticks[ag]=af._ticks[0]._elem.css(ag)}}}}if(af._label&&af._label.show){for(ag in ab.label){if(af._label[ag]){ab.label[ag]=af._label[ag]}else{if(af._label._elem){if(ag=="textColor"){ab.label[ag]=af._label._elem.css("color")}else{ab.label[ag]=af._label._elem.css(ag)}}}}}}this.themeEngine._add(ae);this.themeEngine.activeTheme=this.themeEngine.themes[ae._name]};H.jqplot.ThemeEngine.prototype.get=function(ab){if(!ab){return this.activeTheme}else{return this.themes[ab]}};function K(ac,ab){return ac-ab}H.jqplot.ThemeEngine.prototype.getThemeNames=function(){var ab=[];for(var ac in this.themes){ab.push(ac)}return ab.sort(K)};H.jqplot.ThemeEngine.prototype.getThemes=function(){var ac=[];var ab=[];for(var ae in this.themes){ac.push(ae)}ac.sort(K);for(var ad=0;ad<ac.length;ad++){ab.push(this.themes[ac[ad]])}return ab};H.jqplot.ThemeEngine.prototype.activate=function(ao,au){var ab=false;if(!au&&this.activeTheme&&this.activeTheme._name){au=this.activeTheme._name}if(!this.themes.hasOwnProperty(au)){throw new Error("No theme of that name")}else{var ag=this.themes[au];this.activeTheme=ag;var at,am=false,al=false;var ac=["xaxis","x2axis","yaxis","y2axis"];for(ap=0;ap<ac.length;ap++){var ah=ac[ap];if(ag.axesStyles.borderColor!=null){ao.axes[ah].borderColor=ag.axesStyles.borderColor}if(ag.axesStyles.borderWidth!=null){ao.axes[ah].borderWidth=ag.axesStyles.borderWidth}}for(var ar in ao.axes){var ae=ao.axes[ar];if(ae.show){var ak=ag.axes[ar]||{};var ai=ag.axesStyles;var af=H.jqplot.extend(true,{},ak,ai);at=(ag.axesStyles.borderColor!=null)?ag.axesStyles.borderColor:af.borderColor;if(af.borderColor!=null){ae.borderColor=af.borderColor;ab=true}at=(ag.axesStyles.borderWidth!=null)?ag.axesStyles.borderWidth:af.borderWidth;if(af.borderWidth!=null){ae.borderWidth=af.borderWidth;ab=true}if(ae._ticks&&ae._ticks[0]){for(var ad in af.ticks){at=af.ticks[ad];if(at!=null){ae.tickOptions[ad]=at;ae._ticks=[];ab=true}}}if(ae._label&&ae._label.show){for(var ad in af.label){at=af.label[ad];if(at!=null){ae.labelOptions[ad]=at;ab=true}}}}}for(var an in ag.grid){if(ag.grid[an]!=null){ao.grid[an]=ag.grid[an]}}if(!ab){ao.grid.draw()}if(ao.legend.show){for(an in ag.legend){if(ag.legend[an]!=null){ao.legend[an]=ag.legend[an]}}}if(ao.title.show){for(an in ag.title){if(ag.title[an]!=null){ao.title[an]=ag.title[an]}}}var ap;for(ap=0;ap<ag.series.length;ap++){var aj={};var aq=false;for(an in ag.series[ap]){at=(ag.seriesStyles[an]!=null)?ag.seriesStyles[an]:ag.series[ap][an];if(at!=null){aj[an]=at;if(an=="color"){ao.series[ap].renderer.shapeRenderer.fillStyle=at;ao.series[ap].renderer.shapeRenderer.strokeStyle=at;ao.series[ap][an]=at}else{if((an=="lineWidth")||(an=="linePattern")){ao.series[ap].renderer.shapeRenderer[an]=at;ao.series[ap][an]=at}else{if(an=="markerOptions"){R(ao.series[ap].markerOptions,at);R(ao.series[ap].markerRenderer,at)}else{ao.series[ap][an]=at}}}ab=true}}}if(ab){ao.target.empty();ao.draw()}for(an in ag.target){if(ag.target[an]!=null){ao.target.css(an,ag.target[an])}}}};H.jqplot.ThemeEngine.prototype._add=function(ac,ab){if(ab){ac._name=ab}if(!ac._name){ac._name=Date.parse(new Date())}if(!this.themes.hasOwnProperty(ac._name)){this.themes[ac._name]=ac}else{throw new Error("jqplot.ThemeEngine Error: Theme already in use")}};H.jqplot.ThemeEngine.prototype.remove=function(ab){if(ab=="Default"){return false}return delete this.themes[ab]};H.jqplot.ThemeEngine.prototype.newTheme=function(ab,ad){if(typeof(ab)=="object"){ad=ad||ab;ab=null}if(ad&&ad._name){ab=ad._name}else{ab=ab||Date.parse(new Date())}var ac=this.copy(this.themes.Default._name,ab);H.jqplot.extend(ac,ad);return ac};function x(ad){if(ad==null||typeof(ad)!="object"){return ad}var ab=new ad.constructor();for(var ac in ad){ab[ac]=x(ad[ac])}return ab}H.jqplot.clone=x;function R(ad,ac){if(ac==null||typeof(ac)!="object"){return}for(var ab in ac){if(ab=="highlightColors"){ad[ab]=x(ac[ab])}if(ac[ab]!=null&&typeof(ac[ab])=="object"){if(!ad.hasOwnProperty(ab)){ad[ab]={}}R(ad[ab],ac[ab])}else{ad[ab]=ac[ab]}}}H.jqplot.merge=R;H.jqplot.extend=function(){var ag=arguments[0]||{},ae=1,af=arguments.length,ab=false,ad;if(typeof ag==="boolean"){ab=ag;ag=arguments[1]||{};ae=2}if(typeof ag!=="object"&&!toString.call(ag)==="[object Function]"){ag={}}for(;ae<af;ae++){if((ad=arguments[ae])!=null){for(var ac in ad){var ah=ag[ac],ai=ad[ac];if(ag===ai){continue}if(ab&&ai&&typeof ai==="object"&&!ai.nodeType){ag[ac]=H.jqplot.extend(ab,ah||(ai.length!=null?[]:{}),ai)}else{if(ai!==r){ag[ac]=ai}}}}}return ag};H.jqplot.ThemeEngine.prototype.rename=function(ac,ab){if(ac=="Default"||ab=="Default"){throw new Error("jqplot.ThemeEngine Error: Cannot rename from/to Default")}if(this.themes.hasOwnProperty(ab)){throw new Error("jqplot.ThemeEngine Error: New name already in use.")}else{if(this.themes.hasOwnProperty(ac)){var ad=this.copy(ac,ab);this.remove(ac);return ad}}throw new Error("jqplot.ThemeEngine Error: Old name or new name invalid")};H.jqplot.ThemeEngine.prototype.copy=function(ab,ad,af){if(ad=="Default"){throw new Error("jqplot.ThemeEngine Error: Cannot copy over Default theme")}if(!this.themes.hasOwnProperty(ab)){var ac="jqplot.ThemeEngine Error: Source name invalid";throw new Error(ac)}if(this.themes.hasOwnProperty(ad)){var ac="jqplot.ThemeEngine Error: Target name invalid";throw new Error(ac)}else{var ae=x(this.themes[ab]);ae._name=ad;H.jqplot.extend(true,ae,af);this._add(ae);return ae}};H.jqplot.Theme=function(ab,ac){if(typeof(ab)=="object"){ac=ac||ab;ab=null}ab=ab||Date.parse(new Date());this._name=ab;this.target={backgroundColor:null};this.legend={textColor:null,fontFamily:null,fontSize:null,border:null,background:null};this.title={textColor:null,fontFamily:null,fontSize:null,textAlign:null};this.seriesStyles={};this.series=[];this.grid={drawGridlines:null,gridLineColor:null,gridLineWidth:null,backgroundColor:null,borderColor:null,borderWidth:null,shadow:null};this.axesStyles={label:{},ticks:{}};this.axes={};if(typeof(ac)=="string"){this._name=ac}else{if(typeof(ac)=="object"){H.jqplot.extend(true,this,ac)}}};var L=function(){this.borderColor=null;this.borderWidth=null;this.ticks=new l();this.label=new q()};var l=function(){this.show=null;this.showGridline=null;this.showLabel=null;this.showMark=null;this.size=null;this.textColor=null;this.whiteSpace=null;this.fontSize=null;this.fontFamily=null};var q=function(){this.textColor=null;this.whiteSpace=null;this.fontSize=null;this.fontFamily=null;this.fontWeight=null};var m=function(){this.color=null;this.lineWidth=null;this.linePattern=null;this.shadow=null;this.fillColor=null;this.showMarker=null;this.markerOptions=new E()};var E=function(){this.show=null;this.style=null;this.lineWidth=null;this.size=null;this.color=null;this.shadow=null};var P=function(){this.color=null;this.seriesColors=null;this.lineWidth=null;this.shadow=null;this.barPadding=null;this.barMargin=null;this.barWidth=null;this.highlightColors=null};var e=function(){this.seriesColors=null;this.padding=null;this.sliceMargin=null;this.fill=null;this.shadow=null;this.startAngle=null;this.lineWidth=null;this.highlightColors=null};var C=function(){this.seriesColors=null;this.padding=null;this.sliceMargin=null;this.fill=null;this.shadow=null;this.startAngle=null;this.lineWidth=null;this.innerDiameter=null;this.thickness=null;this.ringMargin=null;this.highlightColors=null};var U=function(){this.color=null;this.lineWidth=null;this.shadow=null;this.padding=null;this.sectionMargin=null;this.seriesColors=null;this.highlightColors=null};var z=function(){this.padding=null;this.backgroundColor=null;this.ringColor=null;this.tickColor=null;this.ringWidth=null;this.intervalColors=null;this.intervalInnerRadius=null;this.intervalOuterRadius=null;this.hubRadius=null;this.needleThickness=null;this.needlePad=null};H.fn.jqplotChildText=function(){return H(this).contents().filter(function(){return this.nodeType==3}).text()};H.fn.jqplotGetComputedFontStyle=function(){var ae=window.getComputedStyle?window.getComputedStyle(this[0]):this[0].currentStyle;var ac=ae["font-style"]?["font-style","font-weight","font-size","font-family"]:["fontStyle","fontWeight","fontSize","fontFamily"];var af=[];for(var ad=0;ad<ac.length;++ad){var ab=String(ae[ac[ad]]);if(ab&&ab!="normal"){af.push(ab)}}return af.join(" ")};H.fn.jqplotToImageCanvas=function(ad){ad=ad||{};var ao=(ad.x_offset==null)?0:ad.x_offset;var aq=(ad.y_offset==null)?0:ad.y_offset;var af=(ad.backgroundColor==null)?"rgb(255,255,255)":ad.backgroundColor;if(H(this).width()==0||H(this).height()==0){return null}if(!H.jqplot.support_canvas){return null}var ah=document.createElement("canvas");var au=H(this).outerHeight(true);var am=H(this).outerWidth(true);var ag=H(this).offset();var ai=ag.left;var ak=ag.top;var an=0,al=0;var ar=["jqplot-table-legend","jqplot-xaxis-tick","jqplot-x2axis-tick","jqplot-yaxis-tick","jqplot-y2axis-tick","jqplot-y3axis-tick","jqplot-y4axis-tick","jqplot-y5axis-tick","jqplot-y6axis-tick","jqplot-y7axis-tick","jqplot-y8axis-tick","jqplot-y9axis-tick","jqplot-xaxis-label","jqplot-x2axis-label","jqplot-yaxis-label","jqplot-y2axis-label","jqplot-y3axis-label","jqplot-y4axis-label","jqplot-y5axis-label","jqplot-y6axis-label","jqplot-y7axis-label","jqplot-y8axis-label","jqplot-y9axis-label"];var aj,ab,ac,av;for(var at in ar){H(this).find("."+ar[at]).each(function(){aj=H(this).offset().top-ak;ab=H(this).offset().left-ai;av=ab+H(this).outerWidth(true)+an;ac=aj+H(this).outerHeight(true)+al;if(ab<-an){am=am-an-ab;an=-ab}if(aj<-al){au=au-al-aj;al=-aj}if(av>am){am=av}if(ac>au){au=ac}})}ah.width=am+Number(ao);ah.height=au+Number(aq);var ae=ah.getContext("2d");ae.save();ae.fillStyle=af;ae.fillRect(0,0,ah.width,ah.height);ae.restore();ae.translate(an,al);ae.textAlign="left";ae.textBaseline="top";function aw(ay){var az=parseInt(H(ay).css("line-height"),10);if(isNaN(az)){az=parseInt(H(ay).css("font-size"),10)*1.2}return az}function ax(az,ay,aM,aA,aI,aB){var aK=aw(az);var aE=H(az).innerWidth();var aF=H(az).innerHeight();var aH=aM.split(/\s+/);var aL=aH.length;var aJ="";var aG=[];var aO=aI;var aN=aA;for(var aD=0;aD<aL;aD++){aJ+=aH[aD];if(ay.measureText(aJ).width>aE){aG.push(aD);aJ=""}}if(aG.length===0){if(H(az).css("textAlign")==="center"){aN=aA+(aB-ay.measureText(aJ).width)/2-an}ay.fillText(aM,aN,aI)}else{aJ=aH.slice(0,aG[0]).join(" ");if(H(az).css("textAlign")==="center"){aN=aA+(aB-ay.measureText(aJ).width)/2-an}ay.fillText(aJ,aN,aO);aO+=aK;for(var aD=1,aC=aG.length;aD<aC;aD++){aJ=aH.slice(aG[aD-1],aG[aD]).join(" ");if(H(az).css("textAlign")==="center"){aN=aA+(aB-ay.measureText(aJ).width)/2-an}ay.fillText(aJ,aN,aO);aO+=aK}aJ=aH.slice(aG[aD-1],aH.length).join(" ");if(H(az).css("textAlign")==="center"){aN=aA+(aB-ay.measureText(aJ).width)/2-an}ay.fillText(aJ,aN,aO)}}function ap(aA,aD,ay){var aH=aA.tagName.toLowerCase();var az=H(aA).position();var aE=window.getComputedStyle?window.getComputedStyle(aA):aA.currentStyle;var aC=aD+az.left+parseInt(aE.marginLeft,10)+parseInt(aE.borderLeftWidth,10)+parseInt(aE.paddingLeft,10);var aF=ay+az.top+parseInt(aE.marginTop,10)+parseInt(aE.borderTopWidth,10)+parseInt(aE.paddingTop,10);var aG=ah.width;if((aH=="div"||aH=="span")&&!H(aA).hasClass("jqplot-highlighter-tooltip")){H(aA).children().each(function(){ap(this,aC,aF)});var aI=H(aA).jqplotChildText();if(aI){ae.font=H(aA).jqplotGetComputedFontStyle();ae.fillStyle=H(aA).css("color");ax(aA,ae,aI,aC,aF,aG)}}else{if(aH==="table"&&H(aA).hasClass("jqplot-table-legend")){ae.strokeStyle=H(aA).css("border-top-color");ae.fillStyle=H(aA).css("background-color");ae.fillRect(aC,aF,H(aA).innerWidth(),H(aA).innerHeight());if(parseInt(H(aA).css("border-top-width"),10)>0){ae.strokeRect(aC,aF,H(aA).innerWidth(),H(aA).innerHeight())}H(aA).find("div.jqplot-table-legend-swatch-outline").each(function(){var aO=H(this);ae.strokeStyle=aO.css("border-top-color");var aK=aC+aO.position().left;var aL=aF+aO.position().top;ae.strokeRect(aK,aL,aO.innerWidth(),aO.innerHeight());aK+=parseInt(aO.css("padding-left"),10);aL+=parseInt(aO.css("padding-top"),10);var aN=aO.innerHeight()-2*parseInt(aO.css("padding-top"),10);var aJ=aO.innerWidth()-2*parseInt(aO.css("padding-left"),10);var aM=aO.children("div.jqplot-table-legend-swatch");ae.fillStyle=aM.css("background-color");ae.fillRect(aK,aL,aJ,aN)});H(aA).find("td.jqplot-table-legend-label").each(function(){var aL=H(this);var aJ=aC+aL.position().left;var aK=aF+aL.position().top+parseInt(aL.css("padding-top"),10);ae.font=aL.jqplotGetComputedFontStyle();ae.fillStyle=aL.css("color");ae.fillText(aL.text(),aJ,aK)});var aB=null}else{if(aH=="canvas"){ae.drawImage(aA,aC,aF)}}}}H(this).children().each(function(){ap(this,ao,aq)});return ah};H.fn.jqplotToImageStr=function(ac){var ab=H(this).jqplotToImageCanvas(ac);if(ab){return ab.toDataURL("image/png")}else{return null}};H.fn.jqplotToImageElem=function(ab){var ac=document.createElement("img");var ad=H(this).jqplotToImageStr(ab);ac.src=ad;return ac};H.fn.jqplotToImageElemStr=function(ab){var ac="<img src="+H(this).jqplotToImageStr(ab)+" />";return ac};H.fn.jqplotSaveImage=function(){var ab=H(this).jqplotToImageStr({});if(ab){window.location.href=ab.replace("image/png","image/octet-stream")}};H.fn.jqplotViewImage=function(){var ac=H(this).jqplotToImageElemStr({});var ad=H(this).jqplotToImageStr({});if(ac){var ab=window.open("");ab.document.open("image/png");ab.document.write(ac);ab.document.close();ab=null}};var aa=function(){this.syntax=aa.config.syntax;this._type="jsDate";this.proxy=new Date();this.options={};this.locale=aa.regional.getLocale();this.formatString="";this.defaultCentury=aa.config.defaultCentury;switch(arguments.length){case 0:break;case 1:if(j(arguments[0])=="[object Object]"&&arguments[0]._type!="jsDate"){var ad=this.options=arguments[0];this.syntax=ad.syntax||this.syntax;this.defaultCentury=ad.defaultCentury||this.defaultCentury;this.proxy=aa.createDate(ad.date)}else{this.proxy=aa.createDate(arguments[0])}break;default:var ab=[];for(var ac=0;ac<arguments.length;ac++){ab.push(arguments[ac])}this.proxy=new Date();this.proxy.setFullYear.apply(this.proxy,ab.slice(0,3));if(ab.slice(3).length){this.proxy.setHours.apply(this.proxy,ab.slice(3))}break}};aa.config={defaultLocale:"en",syntax:"perl",defaultCentury:1900};aa.prototype.add=function(ad,ac){var ab=A[ac]||A.day;if(typeof ab=="number"){this.proxy.setTime(this.proxy.getTime()+(ab*ad))}else{ab.add(this,ad)}return this};aa.prototype.clone=function(){return new aa(this.proxy.getTime())};aa.prototype.getUtcOffset=function(){return this.proxy.getTimezoneOffset()*60000};aa.prototype.diff=function(ac,af,ab){ac=new aa(ac);if(ac===null){return null}var ad=A[af]||A.day;if(typeof ad=="number"){var ae=(this.proxy.getTime()-ac.proxy.getTime())/ad}else{var ae=ad.diff(this.proxy,ac.proxy)}return(ab?ae:Math[ae>0?"floor":"ceil"](ae))};aa.prototype.getAbbrDayName=function(){return aa.regional[this.locale]["dayNamesShort"][this.proxy.getDay()]};aa.prototype.getAbbrMonthName=function(){return aa.regional[this.locale]["monthNamesShort"][this.proxy.getMonth()]};aa.prototype.getAMPM=function(){return this.proxy.getHours()>=12?"PM":"AM"};aa.prototype.getAmPm=function(){return this.proxy.getHours()>=12?"pm":"am"};aa.prototype.getCentury=function(){return parseInt(this.proxy.getFullYear()/100,10)};aa.prototype.getDate=function(){return this.proxy.getDate()};aa.prototype.getDay=function(){return this.proxy.getDay()};aa.prototype.getDayOfWeek=function(){var ab=this.proxy.getDay();return ab===0?7:ab};aa.prototype.getDayOfYear=function(){var ac=this.proxy;var ab=ac-new Date(""+ac.getFullYear()+"/1/1 GMT");ab+=ac.getTimezoneOffset()*60000;ac=null;return parseInt(ab/60000/60/24,10)+1};aa.prototype.getDayName=function(){return aa.regional[this.locale]["dayNames"][this.proxy.getDay()]};aa.prototype.getFullWeekOfYear=function(){var ae=this.proxy;var ab=this.getDayOfYear();var ad=6-ae.getDay();var ac=parseInt((ab+ad)/7,10);return ac};aa.prototype.getFullYear=function(){return this.proxy.getFullYear()};aa.prototype.getGmtOffset=function(){var ab=this.proxy.getTimezoneOffset()/60;var ac=ab<0?"+":"-";ab=Math.abs(ab);return ac+J(Math.floor(ab),2)+":"+J((ab%1)*60,2)};aa.prototype.getHours=function(){return this.proxy.getHours()};aa.prototype.getHours12=function(){var ab=this.proxy.getHours();return ab>12?ab-12:(ab==0?12:ab)};aa.prototype.getIsoWeek=function(){var ae=this.proxy;var ad=ae.getWeekOfYear();var ab=(new Date(""+ae.getFullYear()+"/1/1")).getDay();var ac=ad+(ab>4||ab<=1?0:1);if(ac==53&&(new Date(""+ae.getFullYear()+"/12/31")).getDay()<4){ac=1}else{if(ac===0){ae=new aa(new Date(""+(ae.getFullYear()-1)+"/12/31"));ac=ae.getIsoWeek()}}ae=null;return ac};aa.prototype.getMilliseconds=function(){return this.proxy.getMilliseconds()};aa.prototype.getMinutes=function(){return this.proxy.getMinutes()};aa.prototype.getMonth=function(){return this.proxy.getMonth()};aa.prototype.getMonthName=function(){return aa.regional[this.locale]["monthNames"][this.proxy.getMonth()]};aa.prototype.getMonthNumber=function(){return this.proxy.getMonth()+1};aa.prototype.getSeconds=function(){return this.proxy.getSeconds()};aa.prototype.getShortYear=function(){return this.proxy.getYear()%100};aa.prototype.getTime=function(){return this.proxy.getTime()};aa.prototype.getTimezoneAbbr=function(){return this.proxy.toString().replace(/^.*\(([^)]+)\)$/,"$1")};aa.prototype.getTimezoneName=function(){var ab=/(?:\((.+)\)$| ([A-Z]{3}) )/.exec(this.toString());return ab[1]||ab[2]||"GMT"+this.getGmtOffset()};aa.prototype.getTimezoneOffset=function(){return this.proxy.getTimezoneOffset()};aa.prototype.getWeekOfYear=function(){var ab=this.getDayOfYear();var ad=7-this.getDayOfWeek();var ac=parseInt((ab+ad)/7,10);return ac};aa.prototype.getUnix=function(){return Math.round(this.proxy.getTime()/1000,0)};aa.prototype.getYear=function(){return this.proxy.getYear()};aa.prototype.next=function(ab){ab=ab||"day";return this.clone().add(1,ab)};aa.prototype.set=function(){switch(arguments.length){case 0:this.proxy=new Date();break;case 1:if(j(arguments[0])=="[object Object]"&&arguments[0]._type!="jsDate"){var ad=this.options=arguments[0];this.syntax=ad.syntax||this.syntax;this.defaultCentury=ad.defaultCentury||this.defaultCentury;this.proxy=aa.createDate(ad.date)}else{this.proxy=aa.createDate(arguments[0])}break;default:var ab=[];for(var ac=0;ac<arguments.length;ac++){ab.push(arguments[ac])}this.proxy=new Date();this.proxy.setFullYear.apply(this.proxy,ab.slice(0,3));if(ab.slice(3).length){this.proxy.setHours.apply(this.proxy,ab.slice(3))}break}return this};aa.prototype.setDate=function(ab){this.proxy.setDate(ab);return this};aa.prototype.setFullYear=function(){this.proxy.setFullYear.apply(this.proxy,arguments);return this};aa.prototype.setHours=function(){this.proxy.setHours.apply(this.proxy,arguments);return this};aa.prototype.setMilliseconds=function(ab){this.proxy.setMilliseconds(ab);return this};aa.prototype.setMinutes=function(){this.proxy.setMinutes.apply(this.proxy,arguments);return this};aa.prototype.setMonth=function(){this.proxy.setMonth.apply(this.proxy,arguments);return this};aa.prototype.setSeconds=function(){this.proxy.setSeconds.apply(this.proxy,arguments);return this};aa.prototype.setTime=function(ab){this.proxy.setTime(ab);return this};aa.prototype.setYear=function(){this.proxy.setYear.apply(this.proxy,arguments);return this};aa.prototype.strftime=function(ab){ab=ab||this.formatString||aa.regional[this.locale]["formatString"];return aa.strftime(this,ab,this.syntax)};aa.prototype.toString=function(){return this.proxy.toString()};aa.prototype.toYmdInt=function(){return(this.proxy.getFullYear()*10000)+(this.getMonthNumber()*100)+this.proxy.getDate()};aa.regional={en:{monthNames:["January","February","March","April","May","June","July","August","September","October","November","December"],monthNamesShort:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],dayNames:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],dayNamesShort:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],formatString:"%Y-%m-%d %H:%M:%S"},fr:{monthNames:["Janvier","Février","Mars","Avril","Mai","Juin","Juillet","Août","Septembre","Octobre","Novembre","Décembre"],monthNamesShort:["Jan","Fév","Mar","Avr","Mai","Jun","Jul","Aoû","Sep","Oct","Nov","Déc"],dayNames:["Dimanche","Lundi","Mardi","Mercredi","Jeudi","Vendredi","Samedi"],dayNamesShort:["Dim","Lun","Mar","Mer","Jeu","Ven","Sam"],formatString:"%Y-%m-%d %H:%M:%S"},de:{monthNames:["Januar","Februar","März","April","Mai","Juni","Juli","August","September","Oktober","November","Dezember"],monthNamesShort:["Jan","Feb","Mär","Apr","Mai","Jun","Jul","Aug","Sep","Okt","Nov","Dez"],dayNames:["Sonntag","Montag","Dienstag","Mittwoch","Donnerstag","Freitag","Samstag"],dayNamesShort:["So","Mo","Di","Mi","Do","Fr","Sa"],formatString:"%Y-%m-%d %H:%M:%S"},es:{monthNames:["Enero","Febrero","Marzo","Abril","Mayo","Junio","Julio","Agosto","Septiembre","Octubre","Noviembre","Diciembre"],monthNamesShort:["Ene","Feb","Mar","Abr","May","Jun","Jul","Ago","Sep","Oct","Nov","Dic"],dayNames:["Domingo","Lunes","Martes","Miércoles","Jueves","Viernes","Sábado"],dayNamesShort:["Dom","Lun","Mar","Mié","Juv","Vie","Sáb"],formatString:"%Y-%m-%d %H:%M:%S"},ru:{monthNames:["Январь","Февраль","Март","Апрель","Май","Июнь","Июль","Август","Сентябрь","Октябрь","Ноябрь","Декабрь"],monthNamesShort:["Янв","Фев","Мар","Апр","Май","Июн","Июл","Авг","Сен","Окт","Ноя","Дек"],dayNames:["воскресенье","понедельник","вторник","среда","четверг","пятница","суббота"],dayNamesShort:["вск","пнд","втр","срд","чтв","птн","сбт"],formatString:"%Y-%m-%d %H:%M:%S"},ar:{monthNames:["كانون الثاني","شباط","آذار","نيسان","آذار","حزيران","تموز","آب","أيلول","تشرين الأول","تشرين الثاني","كانون الأول"],monthNamesShort:["1","2","3","4","5","6","7","8","9","10","11","12"],dayNames:["السبت","الأحد","الاثنين","الثلاثاء","الأربعاء","الخميس","الجمعة"],dayNamesShort:["سبت","أحد","اثنين","ثلاثاء","أربعاء","خميس","جمعة"],formatString:"%Y-%m-%d %H:%M:%S"},pt:{monthNames:["Janeiro","Fevereiro","Março","Abril","Maio","Junho","Julho","Agosto","Setembro","Outubro","Novembro","Dezembro"],monthNamesShort:["Jan","Fev","Mar","Abr","Mai","Jun","Jul","Ago","Set","Out","Nov","Dez"],dayNames:["Domingo","Segunda-feira","Terça-feira","Quarta-feira","Quinta-feira","Sexta-feira","Sábado"],dayNamesShort:["Dom","Seg","Ter","Qua","Qui","Sex","Sáb"],formatString:"%Y-%m-%d %H:%M:%S"},"pt-BR":{monthNames:["Janeiro","Fevereiro","Março","Abril","Maio","Junho","Julho","Agosto","Setembro","Outubro","Novembro","Dezembro"],monthNamesShort:["Jan","Fev","Mar","Abr","Mai","Jun","Jul","Ago","Set","Out","Nov","Dez"],dayNames:["Domingo","Segunda-feira","Terça-feira","Quarta-feira","Quinta-feira","Sexta-feira","Sábado"],dayNamesShort:["Dom","Seg","Ter","Qua","Qui","Sex","Sáb"],formatString:"%Y-%m-%d %H:%M:%S"}};aa.regional["en-US"]=aa.regional["en-GB"]=aa.regional.en;aa.regional.getLocale=function(){var ab=aa.config.defaultLocale;if(document&&document.getElementsByTagName("html")&&document.getElementsByTagName("html")[0].lang){ab=document.getElementsByTagName("html")[0].lang;if(!aa.regional.hasOwnProperty(ab)){ab=aa.config.defaultLocale}}return ab};var y=24*60*60*1000;var J=function(ab,ae){ab=String(ab);var ac=ae-ab.length;var ad=String(Math.pow(10,ac)).slice(1);return ad.concat(ab)};var A={millisecond:1,second:1000,minute:60*1000,hour:60*60*1000,day:y,week:7*y,month:{add:function(ad,ab){A.year.add(ad,Math[ab>0?"floor":"ceil"](ab/12));var ac=ad.getMonth()+(ab%12);if(ac==12){ac=0;ad.setYear(ad.getFullYear()+1)}else{if(ac==-1){ac=11;ad.setYear(ad.getFullYear()-1)}}ad.setMonth(ac)},diff:function(af,ad){var ab=af.getFullYear()-ad.getFullYear();var ac=af.getMonth()-ad.getMonth()+(ab*12);var ae=af.getDate()-ad.getDate();return ac+(ae/30)}},year:{add:function(ac,ab){ac.setYear(ac.getFullYear()+Math[ab>0?"floor":"ceil"](ab))},diff:function(ac,ab){return A.month.diff(ac,ab)/12}}};for(var T in A){if(T.substring(T.length-1)!="s"){A[T+"s"]=A[T]}}var D=function(af,ae,ac){if(aa.formats[ac]["shortcuts"][ae]){return aa.strftime(af,aa.formats[ac]["shortcuts"][ae],ac)}else{var ab=(aa.formats[ac]["codes"][ae]||"").split(".");var ad=af["get"+ab[0]]?af["get"+ab[0]]():"";if(ab[1]){ad=J(ad,ab[1])}return ad}};aa.strftime=function(ah,ae,ad,ai){var ac="perl";var ag=aa.regional.getLocale();if(ad&&aa.formats.hasOwnProperty(ad)){ac=ad}else{if(ad&&aa.regional.hasOwnProperty(ad)){ag=ad}}if(ai&&aa.formats.hasOwnProperty(ai)){ac=ai}else{if(ai&&aa.regional.hasOwnProperty(ai)){ag=ai}}if(j(ah)!="[object Object]"||ah._type!="jsDate"){ah=new aa(ah);ah.locale=ag}if(!ae){ae=ah.formatString||aa.regional[ag]["formatString"]}var ab=ae||"%Y-%m-%d",aj="",af;while(ab.length>0){if(af=ab.match(aa.formats[ac].codes.matcher)){aj+=ab.slice(0,af.index);aj+=(af[1]||"")+D(ah,af[2],ac);ab=ab.slice(af.index+af[0].length)}else{aj+=ab;ab=""}}return aj};aa.formats={ISO:"%Y-%m-%dT%H:%M:%S.%N%G",SQL:"%Y-%m-%d %H:%M:%S"};aa.formats.perl={codes:{matcher:/()%(#?(%|[a-z]))/i,Y:"FullYear",y:"ShortYear.2",m:"MonthNumber.2","#m":"MonthNumber",B:"MonthName",b:"AbbrMonthName",d:"Date.2","#d":"Date",e:"Date",A:"DayName",a:"AbbrDayName",w:"Day",H:"Hours.2","#H":"Hours",I:"Hours12.2","#I":"Hours12",p:"AMPM",M:"Minutes.2","#M":"Minutes",S:"Seconds.2","#S":"Seconds",s:"Unix",N:"Milliseconds.3","#N":"Milliseconds",O:"TimezoneOffset",Z:"TimezoneName",G:"GmtOffset"},shortcuts:{F:"%Y-%m-%d",T:"%H:%M:%S",X:"%H:%M:%S",x:"%m/%d/%y",D:"%m/%d/%y","#c":"%a %b %e %H:%M:%S %Y",v:"%e-%b-%Y",R:"%H:%M",r:"%I:%M:%S %p",t:"\t",n:"\n","%":"%"}};aa.formats.php={codes:{matcher:/()%((%|[a-z]))/i,a:"AbbrDayName",A:"DayName",d:"Date.2",e:"Date",j:"DayOfYear.3",u:"DayOfWeek",w:"Day",U:"FullWeekOfYear.2",V:"IsoWeek.2",W:"WeekOfYear.2",b:"AbbrMonthName",B:"MonthName",m:"MonthNumber.2",h:"AbbrMonthName",C:"Century.2",y:"ShortYear.2",Y:"FullYear",H:"Hours.2",I:"Hours12.2",l:"Hours12",p:"AMPM",P:"AmPm",M:"Minutes.2",S:"Seconds.2",s:"Unix",O:"TimezoneOffset",z:"GmtOffset",Z:"TimezoneAbbr"},shortcuts:{D:"%m/%d/%y",F:"%Y-%m-%d",T:"%H:%M:%S",X:"%H:%M:%S",x:"%m/%d/%y",R:"%H:%M",r:"%I:%M:%S %p",t:"\t",n:"\n","%":"%"}};aa.createDate=function(ad){if(ad==null){return new Date()}if(ad instanceof Date){return ad}if(typeof ad=="number"){return new Date(ad)}var ai=String(ad).replace(/^\s*(.+)\s*$/g,"$1");ai=ai.replace(/^([0-9]{1,4})-([0-9]{1,2})-([0-9]{1,4})/,"$1/$2/$3");ai=ai.replace(/^(3[01]|[0-2]?\d)[-\/]([a-z]{3,})[-\/](\d{4})/i,"$1 $2 $3");var ah=ai.match(/^(3[01]|[0-2]?\d)[-\/]([a-z]{3,})[-\/](\d{2})\D*/i);if(ah&&ah.length>3){var am=parseFloat(ah[3]);var ag=aa.config.defaultCentury+am;ag=String(ag);ai=ai.replace(/^(3[01]|[0-2]?\d)[-\/]([a-z]{3,})[-\/](\d{2})\D*/i,ah[1]+" "+ah[2]+" "+ag)}ah=ai.match(/^([0-9]{1,2})[-\/]([0-9]{1,2})[-\/]([0-9]{1,2})[^0-9]/);function al(aq,ap){var aw=parseFloat(ap[1]);var av=parseFloat(ap[2]);var au=parseFloat(ap[3]);var at=aa.config.defaultCentury;var ao,an,ax,ar;if(aw>31){an=au;ax=av;ao=at+aw}else{an=av;ax=aw;ao=at+au}ar=ax+"/"+an+"/"+ao;return aq.replace(/^([0-9]{1,2})[-\/]([0-9]{1,2})[-\/]([0-9]{1,2})/,ar)}if(ah&&ah.length>3){ai=al(ai,ah)}var ah=ai.match(/^([0-9]{1,2})[-\/]([0-9]{1,2})[-\/]([0-9]{1,2})$/);if(ah&&ah.length>3){ai=al(ai,ah)}var af=0;var ac=aa.matchers.length;var ak,ab,aj=ai,ae;while(af<ac){ab=Date.parse(aj);if(!isNaN(ab)){return new Date(ab)}ak=aa.matchers[af];if(typeof ak=="function"){ae=ak.call(aa,aj);if(ae instanceof Date){return ae}}else{aj=ai.replace(ak[0],ak[1])}af++}return NaN};aa.daysInMonth=function(ab,ac){if(ac==2){return new Date(ab,1,29).getDate()==29?29:28}return[r,31,r,31,30,31,30,31,31,30,31,30,31][ac]};aa.matchers=[[/(3[01]|[0-2]\d)\s*\.\s*(1[0-2]|0\d)\s*\.\s*([1-9]\d{3})/,"$2/$1/$3"],[/([1-9]\d{3})\s*-\s*(1[0-2]|0\d)\s*-\s*(3[01]|[0-2]\d)/,"$2/$3/$1"],function(ae){var ac=ae.match(/^(?:(.+)\s+)?([012]?\d)(?:\s*\:\s*(\d\d))?(?:\s*\:\s*(\d\d(\.\d*)?))?\s*(am|pm)?\s*$/i);if(ac){if(ac[1]){var ad=this.createDate(ac[1]);if(isNaN(ad)){return}}else{var ad=new Date();ad.setMilliseconds(0)}var ab=parseFloat(ac[2]);if(ac[6]){ab=ac[6].toLowerCase()=="am"?(ab==12?0:ab):(ab==12?12:ab+12)}ad.setHours(ab,parseInt(ac[3]||0,10),parseInt(ac[4]||0,10),((parseFloat(ac[5]||0))||0)*1000);return ad}else{return ae}},function(ae){var ac=ae.match(/^(?:(.+))[T|\s+]([012]\d)(?:\:(\d\d))(?:\:(\d\d))(?:\.\d+)([\+\-]\d\d\:\d\d)$/i);if(ac){if(ac[1]){var ad=this.createDate(ac[1]);if(isNaN(ad)){return}}else{var ad=new Date();ad.setMilliseconds(0)}var ab=parseFloat(ac[2]);ad.setHours(ab,parseInt(ac[3],10),parseInt(ac[4],10),parseFloat(ac[5])*1000);return ad}else{return ae}},function(af){var ad=af.match(/^([0-3]?\d)\s*[-\/.\s]{1}\s*([a-zA-Z]{3,9})\s*[-\/.\s]{1}\s*([0-3]?\d)$/);if(ad){var ae=new Date();var ag=aa.config.defaultCentury;var ai=parseFloat(ad[1]);var ah=parseFloat(ad[3]);var ac,ab,aj;if(ai>31){ab=ah;ac=ag+ai}else{ab=ai;ac=ag+ah}var aj=W(ad[2],aa.regional[aa.regional.getLocale()]["monthNamesShort"]);if(aj==-1){aj=W(ad[2],aa.regional[aa.regional.getLocale()]["monthNames"])}ae.setFullYear(ac,aj,ab);ae.setHours(0,0,0,0);return ae}else{return af}}];function W(ad,ae){if(ae.indexOf){return ae.indexOf(ad)}for(var ab=0,ac=ae.length;ab<ac;ab++){if(ae[ab]===ad){return ab}}return -1}function j(ab){if(ab===null){return"[object Null]"}return Object.prototype.toString.call(ab)}H.jsDate=aa;H.jqplot.sprintf=function(){function ah(an,aj,ak,am){var al=(an.length>=aj)?"":Array(1+aj-an.length>>>0).join(ak);return am?an+al:al+an}function ae(al){var ak=new String(al);for(var aj=10;aj>0;aj--){if(ak==(ak=ak.replace(/^(\d+)(\d{3})/,"$1"+H.jqplot.sprintf.thousandsSeparator+"$2"))){break}}return ak}function ad(ao,an,aq,al,am,ak){var ap=al-ao.length;if(ap>0){var aj=" ";if(ak){aj=" "}if(aq||!am){ao=ah(ao,al,aj,aq)}else{ao=ao.slice(0,an.length)+ah("",ap,"0",true)+ao.slice(an.length)}}return ao}function ai(ar,ak,ap,al,aj,ao,aq,an){var am=ar>>>0;ap=ap&&am&&{"2":"0b","8":"0","16":"0x"}[ak]||"";ar=ap+ah(am.toString(ak),ao||0,"0",false);return ad(ar,ap,al,aj,aq,an)}function ab(an,ao,al,aj,am,ak){if(aj!=null){an=an.slice(0,aj)}return ad(an,"",ao,al,am,ak)}var ac=arguments,af=0,ag=ac[af++];return ag.replace(H.jqplot.sprintf.regex,function(aF,aq,ar,av,aH,aC,ao){if(aF=="%%"){return"%"}var aw=false,at="",au=false,aE=false,ap=false,an=false;for(var aB=0;ar&&aB<ar.length;aB++){switch(ar.charAt(aB)){case" ":at=" ";break;case"+":at="+";break;case"-":aw=true;break;case"0":au=true;break;case"#":aE=true;break;case"&":ap=true;break;case"'":an=true;break}}if(!av){av=0}else{if(av=="*"){av=+ac[af++]}else{if(av.charAt(0)=="*"){av=+ac[av.slice(1,-1)]}else{av=+av}}}if(av<0){av=-av;aw=true}if(!isFinite(av)){throw new Error("$.jqplot.sprintf: (minimum-)width must be finite")}if(!aC){aC="fFeE".indexOf(ao)>-1?6:(ao=="d")?0:void (0)}else{if(aC=="*"){aC=+ac[af++]}else{if(aC.charAt(0)=="*"){aC=+ac[aC.slice(1,-1)]}else{aC=+aC}}}var ay=aq?ac[aq.slice(0,-1)]:ac[af++];switch(ao){case"s":if(ay==null){return""}return ab(String(ay),aw,av,aC,au,ap);case"c":return ab(String.fromCharCode(+ay),aw,av,aC,au,ap);case"b":return ai(ay,2,aE,aw,av,aC,au,ap);case"o":return ai(ay,8,aE,aw,av,aC,au,ap);case"x":return ai(ay,16,aE,aw,av,aC,au,ap);case"X":return ai(ay,16,aE,aw,av,aC,au,ap).toUpperCase();case"u":return ai(ay,10,aE,aw,av,aC,au,ap);case"i":var al=parseInt(+ay,10);if(isNaN(al)){return""}var aA=al<0?"-":at;var aD=an?ae(String(Math.abs(al))):String(Math.abs(al));ay=aA+ah(aD,aC,"0",false);return ad(ay,aA,aw,av,au,ap);case"d":var al=Math.round(+ay);if(isNaN(al)){return""}var aA=al<0?"-":at;var aD=an?ae(String(Math.abs(al))):String(Math.abs(al));ay=aA+ah(aD,aC,"0",false);return ad(ay,aA,aw,av,au,ap);case"e":case"E":case"f":case"F":case"g":case"G":var al=+ay;if(isNaN(al)){return""}var aA=al<0?"-":at;var am=["toExponential","toFixed","toPrecision"]["efg".indexOf(ao.toLowerCase())];var aG=["toString","toUpperCase"]["eEfFgG".indexOf(ao)%2];var aD=Math.abs(al)[am](aC);aD=an?ae(aD):aD;ay=aA+aD;return ad(ay,aA,aw,av,au,ap)[aG]();case"p":case"P":var al=+ay;if(isNaN(al)){return""}var aA=al<0?"-":at;var ax=String(Number(Math.abs(al)).toExponential()).split(/e|E/);var ak=(ax[0].indexOf(".")!=-1)?ax[0].length-1:ax[0].length;var az=(ax[1]<0)?-ax[1]-1:0;if(Math.abs(al)<1){if(ak+az<=aC){ay=aA+Math.abs(al).toPrecision(ak)}else{if(ak<=aC-1){ay=aA+Math.abs(al).toExponential(ak-1)}else{ay=aA+Math.abs(al).toExponential(aC-1)}}}else{var aj=(ak<=aC)?ak:aC;ay=aA+Math.abs(al).toPrecision(aj)}var aG=["toString","toUpperCase"]["pP".indexOf(ao)%2];return ad(ay,aA,aw,av,au,ap)[aG]();case"n":return"";default:return aF}})};H.jqplot.sprintf.thousandsSeparator=",";H.jqplot.sprintf.regex=/%%|%(\d+\$)?([-+#0&\' ]*)(\*\d+\$|\*|\d+)?(\.(\*\d+\$|\*|\d+))?([nAscboxXuidfegpEGP])/g;H.jqplot.getSignificantFigures=function(af){var ah=String(Number(Math.abs(af)).toExponential()).split(/e|E/);var ag=(ah[0].indexOf(".")!=-1)?ah[0].length-1:ah[0].length;var ac=(ah[1]<0)?-ah[1]-1:0;var ab=parseInt(ah[1],10);var ad=(ab+1>0)?ab+1:0;var ae=(ag<=ad)?0:ag-ab-1;return{significantDigits:ag,digitsLeft:ad,digitsRight:ae,zeros:ac,exponent:ab}};H.jqplot.getPrecision=function(ab){return H.jqplot.getSignificantFigures(ab).digitsRight}})(jQuery);var backCompat=$.uiBackCompat!==false;$.jqplot.effects={effect:{}};var dataSpace="jqplot.storage.";$.extend($.jqplot.effects,{version:"1.9pre",save:function(b,c){for(var a=0;a<c.length;a++){if(c[a]!==null){b.data(dataSpace+c[a],b[0].style[c[a]])}}},restore:function(b,c){for(var a=0;a<c.length;a++){if(c[a]!==null){b.css(c[a],b.data(dataSpace+c[a]))}}},setMode:function(a,b){if(b==="toggle"){b=a.is(":hidden")?"show":"hide"}return b},createWrapper:function(b){if(b.parent().is(".ui-effects-wrapper")){return b.parent()}var c={width:b.outerWidth(true),height:b.outerHeight(true),"float":b.css("float")},e=$("<div></div>").addClass("ui-effects-wrapper").css({fontSize:"100%",background:"transparent",border:"none",margin:0,padding:0}),a={width:b.width(),height:b.height()},d=document.activeElement;b.wrap(e);if(b[0]===d||$.contains(b[0],d)){$(d).focus()}e=b.parent();if(b.css("position")==="static"){e.css({position:"relative"});b.css({position:"relative"})}else{$.extend(c,{position:b.css("position"),zIndex:b.css("z-index")});$.each(["top","left","bottom","right"],function(f,g){c[g]=b.css(g);if(isNaN(parseInt(c[g],10))){c[g]="auto"}});b.css({position:"relative",top:0,left:0,right:"auto",bottom:"auto"})}b.css(a);return e.css(c).show()},removeWrapper:function(a){var b=document.activeElement;if(a.parent().is(".ui-effects-wrapper")){a.parent().replaceWith(a);if(a[0]===b||$.contains(a[0],b)){$(b).focus()}}return a}});function _normalizeArguments(b,a,c,d){if($.isPlainObject(b)){return b}b={effect:b};if(a===undefined){a={}}if($.isFunction(a)){d=a;c=null;a={}}if($.type(a)==="number"||$.fx.speeds[a]){d=c;c=a;a={}}if($.isFunction(c)){d=c;c=null}if(a){$.extend(b,a)}c=c||a.duration;b.duration=$.fx.off?0:typeof c==="number"?c:c in $.fx.speeds?$.fx.speeds[c]:$.fx.speeds._default;b.complete=d||a.complete;return b}function standardSpeed(a){if(!a||typeof a==="number"||$.fx.speeds[a]){return true}if(typeof a==="string"&&!$.jqplot.effects.effect[a]){if(backCompat&&$.jqplot.effects[a]){return false}return true}return false}$.fn.extend({jqplotEffect:function(i,j,b,h){var g=_normalizeArguments.apply(this,arguments),d=g.mode,e=g.queue,f=$.jqplot.effects.effect[g.effect],a=!f&&backCompat&&$.jqplot.effects[g.effect];if($.fx.off||!(f||a)){if(d){return this[d](g.duration,g.complete)}else{return this.each(function(){if(g.complete){g.complete.call(this)}})}}function c(m){var n=$(this),l=g.complete,o=g.mode;function k(){if($.isFunction(l)){l.call(n[0])}if($.isFunction(m)){m()}}if(n.is(":hidden")?o==="hide":o==="show"){k()}else{f.call(n[0],g,k)}}if(f){return e===false?this.each(c):this.queue(e||"fx",c)}else{return a.call(this,{options:g,duration:g.duration,callback:g.complete,mode:g.mode})}}});var rvertical=/up|down|vertical/,rpositivemotion=/up|left|vertical|horizontal/;$.jqplot.effects.effect.blind=function(c,h){var d=$(this),k=["position","top","bottom","left","right","height","width"],i=$.jqplot.effects.setMode(d,c.mode||"hide"),m=c.direction||"up",f=rvertical.test(m),e=f?"height":"width",j=f?"top":"left",p=rpositivemotion.test(m),g={},n=i==="show",b,a,l;if(d.parent().is(".ui-effects-wrapper")){$.jqplot.effects.save(d.parent(),k)}else{$.jqplot.effects.save(d,k)}d.show();l=parseInt(d.css("top"),10);b=$.jqplot.effects.createWrapper(d).css({overflow:"hidden"});a=f?b[e]()+l:b[e]();g[e]=n?String(a):"0";if(!p){d.css(f?"bottom":"right",0).css(f?"top":"left","").css({position:"absolute"});g[j]=n?"0":String(a)}if(n){b.css(e,0);if(!p){b.css(j,a)}}b.animate(g,{duration:c.duration,easing:c.easing,queue:false,complete:function(){if(i==="hide"){d.hide()}$.jqplot.effects.restore(d,k);$.jqplot.effects.removeWrapper(d);h()}})}; \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/jquery.js b/libreplan-webapp/src/main/webapp/jqplot/jquery.js new file mode 100644 index 000000000..11e6d0679 --- /dev/null +++ b/libreplan-webapp/src/main/webapp/jqplot/jquery.js @@ -0,0 +1,9046 @@ +/*! + * jQuery JavaScript Library v1.6.4 + * http://jquery.com/ + * + * Copyright 2011, John Resig + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * Includes Sizzle.js + * http://sizzlejs.com/ + * Copyright 2011, The Dojo Foundation + * Released under the MIT, BSD, and GPL Licenses. + * + * Date: Mon Sep 12 18:54:48 2011 -0400 + */ +(function( window, undefined ) { + +// Use the correct document accordingly with window argument (sandbox) +var document = window.document, + navigator = window.navigator, + location = window.location; +var jQuery = (function() { + +// Define a local copy of jQuery +var jQuery = function( selector, context ) { + // The jQuery object is actually just the init constructor 'enhanced' + return new jQuery.fn.init( selector, context, rootjQuery ); + }, + + // Map over jQuery in case of overwrite + _jQuery = window.jQuery, + + // Map over the $ in case of overwrite + _$ = window.$, + + // A central reference to the root jQuery(document) + rootjQuery, + + // A simple way to check for HTML strings or ID strings + // Prioritize #id over <tag> to avoid XSS via location.hash (#9521) + quickExpr = /^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/, + + // Check if a string has a non-whitespace character in it + rnotwhite = /\S/, + + // Used for trimming whitespace + trimLeft = /^\s+/, + trimRight = /\s+$/, + + // Check for digits + rdigit = /\d/, + + // Match a standalone tag + rsingleTag = /^<(\w+)\s*\/?>(?:<\/\1>)?$/, + + // JSON RegExp + rvalidchars = /^[\],:{}\s]*$/, + rvalidescape = /\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, + rvalidtokens = /"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, + rvalidbraces = /(?:^|:|,)(?:\s*\[)+/g, + + // Useragent RegExp + rwebkit = /(webkit)[ \/]([\w.]+)/, + ropera = /(opera)(?:.*version)?[ \/]([\w.]+)/, + rmsie = /(msie) ([\w.]+)/, + rmozilla = /(mozilla)(?:.*? rv:([\w.]+))?/, + + // Matches dashed string for camelizing + rdashAlpha = /-([a-z]|[0-9])/ig, + rmsPrefix = /^-ms-/, + + // Used by jQuery.camelCase as callback to replace() + fcamelCase = function( all, letter ) { + return ( letter + "" ).toUpperCase(); + }, + + // Keep a UserAgent string for use with jQuery.browser + userAgent = navigator.userAgent, + + // For matching the engine and version of the browser + browserMatch, + + // The deferred used on DOM ready + readyList, + + // The ready event handler + DOMContentLoaded, + + // Save a reference to some core methods + toString = Object.prototype.toString, + hasOwn = Object.prototype.hasOwnProperty, + push = Array.prototype.push, + slice = Array.prototype.slice, + trim = String.prototype.trim, + indexOf = Array.prototype.indexOf, + + // [[Class]] -> type pairs + class2type = {}; + +jQuery.fn = jQuery.prototype = { + constructor: jQuery, + init: function( selector, context, rootjQuery ) { + var match, elem, ret, doc; + + // Handle $(""), $(null), or $(undefined) + if ( !selector ) { + return this; + } + + // Handle $(DOMElement) + if ( selector.nodeType ) { + this.context = this[0] = selector; + this.length = 1; + return this; + } + + // The body element only exists once, optimize finding it + if ( selector === "body" && !context && document.body ) { + this.context = document; + this[0] = document.body; + this.selector = selector; + this.length = 1; + return this; + } + + // Handle HTML strings + if ( typeof selector === "string" ) { + // Are we dealing with HTML string or an ID? + if ( selector.charAt(0) === "<" && selector.charAt( selector.length - 1 ) === ">" && selector.length >= 3 ) { + // Assume that strings that start and end with <> are HTML and skip the regex check + match = [ null, selector, null ]; + + } else { + match = quickExpr.exec( selector ); + } + + // Verify a match, and that no context was specified for #id + if ( match && (match[1] || !context) ) { + + // HANDLE: $(html) -> $(array) + if ( match[1] ) { + context = context instanceof jQuery ? context[0] : context; + doc = (context ? context.ownerDocument || context : document); + + // If a single string is passed in and it's a single tag + // just do a createElement and skip the rest + ret = rsingleTag.exec( selector ); + + if ( ret ) { + if ( jQuery.isPlainObject( context ) ) { + selector = [ document.createElement( ret[1] ) ]; + jQuery.fn.attr.call( selector, context, true ); + + } else { + selector = [ doc.createElement( ret[1] ) ]; + } + + } else { + ret = jQuery.buildFragment( [ match[1] ], [ doc ] ); + selector = (ret.cacheable ? jQuery.clone(ret.fragment) : ret.fragment).childNodes; + } + + return jQuery.merge( this, selector ); + + // HANDLE: $("#id") + } else { + elem = document.getElementById( match[2] ); + + // Check parentNode to catch when Blackberry 4.6 returns + // nodes that are no longer in the document #6963 + if ( elem && elem.parentNode ) { + // Handle the case where IE and Opera return items + // by name instead of ID + if ( elem.id !== match[2] ) { + return rootjQuery.find( selector ); + } + + // Otherwise, we inject the element directly into the jQuery object + this.length = 1; + this[0] = elem; + } + + this.context = document; + this.selector = selector; + return this; + } + + // HANDLE: $(expr, $(...)) + } else if ( !context || context.jquery ) { + return (context || rootjQuery).find( selector ); + + // HANDLE: $(expr, context) + // (which is just equivalent to: $(context).find(expr) + } else { + return this.constructor( context ).find( selector ); + } + + // HANDLE: $(function) + // Shortcut for document ready + } else if ( jQuery.isFunction( selector ) ) { + return rootjQuery.ready( selector ); + } + + if (selector.selector !== undefined) { + this.selector = selector.selector; + this.context = selector.context; + } + + return jQuery.makeArray( selector, this ); + }, + + // Start with an empty selector + selector: "", + + // The current version of jQuery being used + jquery: "1.6.4", + + // The default length of a jQuery object is 0 + length: 0, + + // The number of elements contained in the matched element set + size: function() { + return this.length; + }, + + toArray: function() { + return slice.call( this, 0 ); + }, + + // Get the Nth element in the matched element set OR + // Get the whole matched element set as a clean array + get: function( num ) { + return num == null ? + + // Return a 'clean' array + this.toArray() : + + // Return just the object + ( num < 0 ? this[ this.length + num ] : this[ num ] ); + }, + + // Take an array of elements and push it onto the stack + // (returning the new matched element set) + pushStack: function( elems, name, selector ) { + // Build a new jQuery matched element set + var ret = this.constructor(); + + if ( jQuery.isArray( elems ) ) { + push.apply( ret, elems ); + + } else { + jQuery.merge( ret, elems ); + } + + // Add the old object onto the stack (as a reference) + ret.prevObject = this; + + ret.context = this.context; + + if ( name === "find" ) { + ret.selector = this.selector + (this.selector ? " " : "") + selector; + } else if ( name ) { + ret.selector = this.selector + "." + name + "(" + selector + ")"; + } + + // Return the newly-formed element set + return ret; + }, + + // Execute a callback for every element in the matched set. + // (You can seed the arguments with an array of args, but this is + // only used internally.) + each: function( callback, args ) { + return jQuery.each( this, callback, args ); + }, + + ready: function( fn ) { + // Attach the listeners + jQuery.bindReady(); + + // Add the callback + readyList.done( fn ); + + return this; + }, + + eq: function( i ) { + return i === -1 ? + this.slice( i ) : + this.slice( i, +i + 1 ); + }, + + first: function() { + return this.eq( 0 ); + }, + + last: function() { + return this.eq( -1 ); + }, + + slice: function() { + return this.pushStack( slice.apply( this, arguments ), + "slice", slice.call(arguments).join(",") ); + }, + + map: function( callback ) { + return this.pushStack( jQuery.map(this, function( elem, i ) { + return callback.call( elem, i, elem ); + })); + }, + + end: function() { + return this.prevObject || this.constructor(null); + }, + + // For internal use only. + // Behaves like an Array's method, not like a jQuery method. + push: push, + sort: [].sort, + splice: [].splice +}; + +// Give the init function the jQuery prototype for later instantiation +jQuery.fn.init.prototype = jQuery.fn; + +jQuery.extend = jQuery.fn.extend = function() { + var options, name, src, copy, copyIsArray, clone, + target = arguments[0] || {}, + i = 1, + length = arguments.length, + deep = false; + + // Handle a deep copy situation + if ( typeof target === "boolean" ) { + deep = target; + target = arguments[1] || {}; + // skip the boolean and the target + i = 2; + } + + // Handle case when target is a string or something (possible in deep copy) + if ( typeof target !== "object" && !jQuery.isFunction(target) ) { + target = {}; + } + + // extend jQuery itself if only one argument is passed + if ( length === i ) { + target = this; + --i; + } + + for ( ; i < length; i++ ) { + // Only deal with non-null/undefined values + if ( (options = arguments[ i ]) != null ) { + // Extend the base object + for ( name in options ) { + src = target[ name ]; + copy = options[ name ]; + + // Prevent never-ending loop + if ( target === copy ) { + continue; + } + + // Recurse if we're merging plain objects or arrays + if ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) { + if ( copyIsArray ) { + copyIsArray = false; + clone = src && jQuery.isArray(src) ? src : []; + + } else { + clone = src && jQuery.isPlainObject(src) ? src : {}; + } + + // Never move original objects, clone them + target[ name ] = jQuery.extend( deep, clone, copy ); + + // Don't bring in undefined values + } else if ( copy !== undefined ) { + target[ name ] = copy; + } + } + } + } + + // Return the modified object + return target; +}; + +jQuery.extend({ + noConflict: function( deep ) { + if ( window.$ === jQuery ) { + window.$ = _$; + } + + if ( deep && window.jQuery === jQuery ) { + window.jQuery = _jQuery; + } + + return jQuery; + }, + + // Is the DOM ready to be used? Set to true once it occurs. + isReady: false, + + // A counter to track how many items to wait for before + // the ready event fires. See #6781 + readyWait: 1, + + // Hold (or release) the ready event + holdReady: function( hold ) { + if ( hold ) { + jQuery.readyWait++; + } else { + jQuery.ready( true ); + } + }, + + // Handle when the DOM is ready + ready: function( wait ) { + // Either a released hold or an DOMready/load event and not yet ready + if ( (wait === true && !--jQuery.readyWait) || (wait !== true && !jQuery.isReady) ) { + // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443). + if ( !document.body ) { + return setTimeout( jQuery.ready, 1 ); + } + + // Remember that the DOM is ready + jQuery.isReady = true; + + // If a normal DOM Ready event fired, decrement, and wait if need be + if ( wait !== true && --jQuery.readyWait > 0 ) { + return; + } + + // If there are functions bound, to execute + readyList.resolveWith( document, [ jQuery ] ); + + // Trigger any bound ready events + if ( jQuery.fn.trigger ) { + jQuery( document ).trigger( "ready" ).unbind( "ready" ); + } + } + }, + + bindReady: function() { + if ( readyList ) { + return; + } + + readyList = jQuery._Deferred(); + + // Catch cases where $(document).ready() is called after the + // browser event has already occurred. + if ( document.readyState === "complete" ) { + // Handle it asynchronously to allow scripts the opportunity to delay ready + return setTimeout( jQuery.ready, 1 ); + } + + // Mozilla, Opera and webkit nightlies currently support this event + if ( document.addEventListener ) { + // Use the handy event callback + document.addEventListener( "DOMContentLoaded", DOMContentLoaded, false ); + + // A fallback to window.onload, that will always work + window.addEventListener( "load", jQuery.ready, false ); + + // If IE event model is used + } else if ( document.attachEvent ) { + // ensure firing before onload, + // maybe late but safe also for iframes + document.attachEvent( "onreadystatechange", DOMContentLoaded ); + + // A fallback to window.onload, that will always work + window.attachEvent( "onload", jQuery.ready ); + + // If IE and not a frame + // continually check to see if the document is ready + var toplevel = false; + + try { + toplevel = window.frameElement == null; + } catch(e) {} + + if ( document.documentElement.doScroll && toplevel ) { + doScrollCheck(); + } + } + }, + + // See test/unit/core.js for details concerning isFunction. + // Since version 1.3, DOM methods and functions like alert + // aren't supported. They return false on IE (#2968). + isFunction: function( obj ) { + return jQuery.type(obj) === "function"; + }, + + isArray: Array.isArray || function( obj ) { + return jQuery.type(obj) === "array"; + }, + + // A crude way of determining if an object is a window + isWindow: function( obj ) { + return obj && typeof obj === "object" && "setInterval" in obj; + }, + + isNaN: function( obj ) { + return obj == null || !rdigit.test( obj ) || isNaN( obj ); + }, + + type: function( obj ) { + return obj == null ? + String( obj ) : + class2type[ toString.call(obj) ] || "object"; + }, + + isPlainObject: function( obj ) { + // Must be an Object. + // Because of IE, we also have to check the presence of the constructor property. + // Make sure that DOM nodes and window objects don't pass through, as well + if ( !obj || jQuery.type(obj) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) { + return false; + } + + try { + // Not own constructor property must be Object + if ( obj.constructor && + !hasOwn.call(obj, "constructor") && + !hasOwn.call(obj.constructor.prototype, "isPrototypeOf") ) { + return false; + } + } catch ( e ) { + // IE8,9 Will throw exceptions on certain host objects #9897 + return false; + } + + // Own properties are enumerated firstly, so to speed up, + // if last one is own, then all properties are own. + + var key; + for ( key in obj ) {} + + return key === undefined || hasOwn.call( obj, key ); + }, + + isEmptyObject: function( obj ) { + for ( var name in obj ) { + return false; + } + return true; + }, + + error: function( msg ) { + throw msg; + }, + + parseJSON: function( data ) { + if ( typeof data !== "string" || !data ) { + return null; + } + + // Make sure leading/trailing whitespace is removed (IE can't handle it) + data = jQuery.trim( data ); + + // Attempt to parse using the native JSON parser first + if ( window.JSON && window.JSON.parse ) { + return window.JSON.parse( data ); + } + + // Make sure the incoming data is actual JSON + // Logic borrowed from http://json.org/json2.js + if ( rvalidchars.test( data.replace( rvalidescape, "@" ) + .replace( rvalidtokens, "]" ) + .replace( rvalidbraces, "")) ) { + + return (new Function( "return " + data ))(); + + } + jQuery.error( "Invalid JSON: " + data ); + }, + + // Cross-browser xml parsing + parseXML: function( data ) { + var xml, tmp; + try { + if ( window.DOMParser ) { // Standard + tmp = new DOMParser(); + xml = tmp.parseFromString( data , "text/xml" ); + } else { // IE + xml = new ActiveXObject( "Microsoft.XMLDOM" ); + xml.async = "false"; + xml.loadXML( data ); + } + } catch( e ) { + xml = undefined; + } + if ( !xml || !xml.documentElement || xml.getElementsByTagName( "parsererror" ).length ) { + jQuery.error( "Invalid XML: " + data ); + } + return xml; + }, + + noop: function() {}, + + // Evaluates a script in a global context + // Workarounds based on findings by Jim Driscoll + // http://weblogs.java.net/blog/driscoll/archive/2009/09/08/eval-javascript-global-context + globalEval: function( data ) { + if ( data && rnotwhite.test( data ) ) { + // We use execScript on Internet Explorer + // We use an anonymous function so that context is window + // rather than jQuery in Firefox + ( window.execScript || function( data ) { + window[ "eval" ].call( window, data ); + } )( data ); + } + }, + + // Convert dashed to camelCase; used by the css and data modules + // Microsoft forgot to hump their vendor prefix (#9572) + camelCase: function( string ) { + return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase ); + }, + + nodeName: function( elem, name ) { + return elem.nodeName && elem.nodeName.toUpperCase() === name.toUpperCase(); + }, + + // args is for internal usage only + each: function( object, callback, args ) { + var name, i = 0, + length = object.length, + isObj = length === undefined || jQuery.isFunction( object ); + + if ( args ) { + if ( isObj ) { + for ( name in object ) { + if ( callback.apply( object[ name ], args ) === false ) { + break; + } + } + } else { + for ( ; i < length; ) { + if ( callback.apply( object[ i++ ], args ) === false ) { + break; + } + } + } + + // A special, fast, case for the most common use of each + } else { + if ( isObj ) { + for ( name in object ) { + if ( callback.call( object[ name ], name, object[ name ] ) === false ) { + break; + } + } + } else { + for ( ; i < length; ) { + if ( callback.call( object[ i ], i, object[ i++ ] ) === false ) { + break; + } + } + } + } + + return object; + }, + + // Use native String.trim function wherever possible + trim: trim ? + function( text ) { + return text == null ? + "" : + trim.call( text ); + } : + + // Otherwise use our own trimming functionality + function( text ) { + return text == null ? + "" : + text.toString().replace( trimLeft, "" ).replace( trimRight, "" ); + }, + + // results is for internal usage only + makeArray: function( array, results ) { + var ret = results || []; + + if ( array != null ) { + // The window, strings (and functions) also have 'length' + // The extra typeof function check is to prevent crashes + // in Safari 2 (See: #3039) + // Tweaked logic slightly to handle Blackberry 4.7 RegExp issues #6930 + var type = jQuery.type( array ); + + if ( array.length == null || type === "string" || type === "function" || type === "regexp" || jQuery.isWindow( array ) ) { + push.call( ret, array ); + } else { + jQuery.merge( ret, array ); + } + } + + return ret; + }, + + inArray: function( elem, array ) { + if ( !array ) { + return -1; + } + + if ( indexOf ) { + return indexOf.call( array, elem ); + } + + for ( var i = 0, length = array.length; i < length; i++ ) { + if ( array[ i ] === elem ) { + return i; + } + } + + return -1; + }, + + merge: function( first, second ) { + var i = first.length, + j = 0; + + if ( typeof second.length === "number" ) { + for ( var l = second.length; j < l; j++ ) { + first[ i++ ] = second[ j ]; + } + + } else { + while ( second[j] !== undefined ) { + first[ i++ ] = second[ j++ ]; + } + } + + first.length = i; + + return first; + }, + + grep: function( elems, callback, inv ) { + var ret = [], retVal; + inv = !!inv; + + // Go through the array, only saving the items + // that pass the validator function + for ( var i = 0, length = elems.length; i < length; i++ ) { + retVal = !!callback( elems[ i ], i ); + if ( inv !== retVal ) { + ret.push( elems[ i ] ); + } + } + + return ret; + }, + + // arg is for internal usage only + map: function( elems, callback, arg ) { + var value, key, ret = [], + i = 0, + length = elems.length, + // jquery objects are treated as arrays + isArray = elems instanceof jQuery || length !== undefined && typeof length === "number" && ( ( length > 0 && elems[ 0 ] && elems[ length -1 ] ) || length === 0 || jQuery.isArray( elems ) ) ; + + // Go through the array, translating each of the items to their + if ( isArray ) { + for ( ; i < length; i++ ) { + value = callback( elems[ i ], i, arg ); + + if ( value != null ) { + ret[ ret.length ] = value; + } + } + + // Go through every key on the object, + } else { + for ( key in elems ) { + value = callback( elems[ key ], key, arg ); + + if ( value != null ) { + ret[ ret.length ] = value; + } + } + } + + // Flatten any nested arrays + return ret.concat.apply( [], ret ); + }, + + // A global GUID counter for objects + guid: 1, + + // Bind a function to a context, optionally partially applying any + // arguments. + proxy: function( fn, context ) { + if ( typeof context === "string" ) { + var tmp = fn[ context ]; + context = fn; + fn = tmp; + } + + // Quick check to determine if target is callable, in the spec + // this throws a TypeError, but we will just return undefined. + if ( !jQuery.isFunction( fn ) ) { + return undefined; + } + + // Simulated bind + var args = slice.call( arguments, 2 ), + proxy = function() { + return fn.apply( context, args.concat( slice.call( arguments ) ) ); + }; + + // Set the guid of unique handler to the same of original handler, so it can be removed + proxy.guid = fn.guid = fn.guid || proxy.guid || jQuery.guid++; + + return proxy; + }, + + // Mutifunctional method to get and set values to a collection + // The value/s can optionally be executed if it's a function + access: function( elems, key, value, exec, fn, pass ) { + var length = elems.length; + + // Setting many attributes + if ( typeof key === "object" ) { + for ( var k in key ) { + jQuery.access( elems, k, key[k], exec, fn, value ); + } + return elems; + } + + // Setting one attribute + if ( value !== undefined ) { + // Optionally, function values get executed if exec is true + exec = !pass && exec && jQuery.isFunction(value); + + for ( var i = 0; i < length; i++ ) { + fn( elems[i], key, exec ? value.call( elems[i], i, fn( elems[i], key ) ) : value, pass ); + } + + return elems; + } + + // Getting an attribute + return length ? fn( elems[0], key ) : undefined; + }, + + now: function() { + return (new Date()).getTime(); + }, + + // Use of jQuery.browser is frowned upon. + // More details: http://docs.jquery.com/Utilities/jQuery.browser + uaMatch: function( ua ) { + ua = ua.toLowerCase(); + + var match = rwebkit.exec( ua ) || + ropera.exec( ua ) || + rmsie.exec( ua ) || + ua.indexOf("compatible") < 0 && rmozilla.exec( ua ) || + []; + + return { browser: match[1] || "", version: match[2] || "0" }; + }, + + sub: function() { + function jQuerySub( selector, context ) { + return new jQuerySub.fn.init( selector, context ); + } + jQuery.extend( true, jQuerySub, this ); + jQuerySub.superclass = this; + jQuerySub.fn = jQuerySub.prototype = this(); + jQuerySub.fn.constructor = jQuerySub; + jQuerySub.sub = this.sub; + jQuerySub.fn.init = function init( selector, context ) { + if ( context && context instanceof jQuery && !(context instanceof jQuerySub) ) { + context = jQuerySub( context ); + } + + return jQuery.fn.init.call( this, selector, context, rootjQuerySub ); + }; + jQuerySub.fn.init.prototype = jQuerySub.fn; + var rootjQuerySub = jQuerySub(document); + return jQuerySub; + }, + + browser: {} +}); + +// Populate the class2type map +jQuery.each("Boolean Number String Function Array Date RegExp Object".split(" "), function(i, name) { + class2type[ "[object " + name + "]" ] = name.toLowerCase(); +}); + +browserMatch = jQuery.uaMatch( userAgent ); +if ( browserMatch.browser ) { + jQuery.browser[ browserMatch.browser ] = true; + jQuery.browser.version = browserMatch.version; +} + +// Deprecated, use jQuery.browser.webkit instead +if ( jQuery.browser.webkit ) { + jQuery.browser.safari = true; +} + +// IE doesn't match non-breaking spaces with \s +if ( rnotwhite.test( "\xA0" ) ) { + trimLeft = /^[\s\xA0]+/; + trimRight = /[\s\xA0]+$/; +} + +// All jQuery objects should point back to these +rootjQuery = jQuery(document); + +// Cleanup functions for the document ready method +if ( document.addEventListener ) { + DOMContentLoaded = function() { + document.removeEventListener( "DOMContentLoaded", DOMContentLoaded, false ); + jQuery.ready(); + }; + +} else if ( document.attachEvent ) { + DOMContentLoaded = function() { + // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443). + if ( document.readyState === "complete" ) { + document.detachEvent( "onreadystatechange", DOMContentLoaded ); + jQuery.ready(); + } + }; +} + +// The DOM ready check for Internet Explorer +function doScrollCheck() { + if ( jQuery.isReady ) { + return; + } + + try { + // If IE is used, use the trick by Diego Perini + // http://javascript.nwbox.com/IEContentLoaded/ + document.documentElement.doScroll("left"); + } catch(e) { + setTimeout( doScrollCheck, 1 ); + return; + } + + // and execute any waiting functions + jQuery.ready(); +} + +return jQuery; + +})(); + + +var // Promise methods + promiseMethods = "done fail isResolved isRejected promise then always pipe".split( " " ), + // Static reference to slice + sliceDeferred = [].slice; + +jQuery.extend({ + // Create a simple deferred (one callbacks list) + _Deferred: function() { + var // callbacks list + callbacks = [], + // stored [ context , args ] + fired, + // to avoid firing when already doing so + firing, + // flag to know if the deferred has been cancelled + cancelled, + // the deferred itself + deferred = { + + // done( f1, f2, ...) + done: function() { + if ( !cancelled ) { + var args = arguments, + i, + length, + elem, + type, + _fired; + if ( fired ) { + _fired = fired; + fired = 0; + } + for ( i = 0, length = args.length; i < length; i++ ) { + elem = args[ i ]; + type = jQuery.type( elem ); + if ( type === "array" ) { + deferred.done.apply( deferred, elem ); + } else if ( type === "function" ) { + callbacks.push( elem ); + } + } + if ( _fired ) { + deferred.resolveWith( _fired[ 0 ], _fired[ 1 ] ); + } + } + return this; + }, + + // resolve with given context and args + resolveWith: function( context, args ) { + if ( !cancelled && !fired && !firing ) { + // make sure args are available (#8421) + args = args || []; + firing = 1; + try { + while( callbacks[ 0 ] ) { + callbacks.shift().apply( context, args ); + } + } + finally { + fired = [ context, args ]; + firing = 0; + } + } + return this; + }, + + // resolve with this as context and given arguments + resolve: function() { + deferred.resolveWith( this, arguments ); + return this; + }, + + // Has this deferred been resolved? + isResolved: function() { + return !!( firing || fired ); + }, + + // Cancel + cancel: function() { + cancelled = 1; + callbacks = []; + return this; + } + }; + + return deferred; + }, + + // Full fledged deferred (two callbacks list) + Deferred: function( func ) { + var deferred = jQuery._Deferred(), + failDeferred = jQuery._Deferred(), + promise; + // Add errorDeferred methods, then and promise + jQuery.extend( deferred, { + then: function( doneCallbacks, failCallbacks ) { + deferred.done( doneCallbacks ).fail( failCallbacks ); + return this; + }, + always: function() { + return deferred.done.apply( deferred, arguments ).fail.apply( this, arguments ); + }, + fail: failDeferred.done, + rejectWith: failDeferred.resolveWith, + reject: failDeferred.resolve, + isRejected: failDeferred.isResolved, + pipe: function( fnDone, fnFail ) { + return jQuery.Deferred(function( newDefer ) { + jQuery.each( { + done: [ fnDone, "resolve" ], + fail: [ fnFail, "reject" ] + }, function( handler, data ) { + var fn = data[ 0 ], + action = data[ 1 ], + returned; + if ( jQuery.isFunction( fn ) ) { + deferred[ handler ](function() { + returned = fn.apply( this, arguments ); + if ( returned && jQuery.isFunction( returned.promise ) ) { + returned.promise().then( newDefer.resolve, newDefer.reject ); + } else { + newDefer[ action + "With" ]( this === deferred ? newDefer : this, [ returned ] ); + } + }); + } else { + deferred[ handler ]( newDefer[ action ] ); + } + }); + }).promise(); + }, + // Get a promise for this deferred + // If obj is provided, the promise aspect is added to the object + promise: function( obj ) { + if ( obj == null ) { + if ( promise ) { + return promise; + } + promise = obj = {}; + } + var i = promiseMethods.length; + while( i-- ) { + obj[ promiseMethods[i] ] = deferred[ promiseMethods[i] ]; + } + return obj; + } + }); + // Make sure only one callback list will be used + deferred.done( failDeferred.cancel ).fail( deferred.cancel ); + // Unexpose cancel + delete deferred.cancel; + // Call given func if any + if ( func ) { + func.call( deferred, deferred ); + } + return deferred; + }, + + // Deferred helper + when: function( firstParam ) { + var args = arguments, + i = 0, + length = args.length, + count = length, + deferred = length <= 1 && firstParam && jQuery.isFunction( firstParam.promise ) ? + firstParam : + jQuery.Deferred(); + function resolveFunc( i ) { + return function( value ) { + args[ i ] = arguments.length > 1 ? sliceDeferred.call( arguments, 0 ) : value; + if ( !( --count ) ) { + // Strange bug in FF4: + // Values changed onto the arguments object sometimes end up as undefined values + // outside the $.when method. Cloning the object into a fresh array solves the issue + deferred.resolveWith( deferred, sliceDeferred.call( args, 0 ) ); + } + }; + } + if ( length > 1 ) { + for( ; i < length; i++ ) { + if ( args[ i ] && jQuery.isFunction( args[ i ].promise ) ) { + args[ i ].promise().then( resolveFunc(i), deferred.reject ); + } else { + --count; + } + } + if ( !count ) { + deferred.resolveWith( deferred, args ); + } + } else if ( deferred !== firstParam ) { + deferred.resolveWith( deferred, length ? [ firstParam ] : [] ); + } + return deferred.promise(); + } +}); + + + +jQuery.support = (function() { + + var div = document.createElement( "div" ), + documentElement = document.documentElement, + all, + a, + select, + opt, + input, + marginDiv, + support, + fragment, + body, + testElementParent, + testElement, + testElementStyle, + tds, + events, + eventName, + i, + isSupported; + + // Preliminary tests + div.setAttribute("className", "t"); + div.innerHTML = " <link/><table></table><a href='/a' style='top:1px;float:left;opacity:.55;'>a</a><input type='checkbox'/>"; + + + all = div.getElementsByTagName( "*" ); + a = div.getElementsByTagName( "a" )[ 0 ]; + + // Can't get basic test support + if ( !all || !all.length || !a ) { + return {}; + } + + // First batch of supports tests + select = document.createElement( "select" ); + opt = select.appendChild( document.createElement("option") ); + input = div.getElementsByTagName( "input" )[ 0 ]; + + support = { + // IE strips leading whitespace when .innerHTML is used + leadingWhitespace: ( div.firstChild.nodeType === 3 ), + + // Make sure that tbody elements aren't automatically inserted + // IE will insert them into empty tables + tbody: !div.getElementsByTagName( "tbody" ).length, + + // Make sure that link elements get serialized correctly by innerHTML + // This requires a wrapper element in IE + htmlSerialize: !!div.getElementsByTagName( "link" ).length, + + // Get the style information from getAttribute + // (IE uses .cssText instead) + style: /top/.test( a.getAttribute("style") ), + + // Make sure that URLs aren't manipulated + // (IE normalizes it by default) + hrefNormalized: ( a.getAttribute( "href" ) === "/a" ), + + // Make sure that element opacity exists + // (IE uses filter instead) + // Use a regex to work around a WebKit issue. See #5145 + opacity: /^0.55$/.test( a.style.opacity ), + + // Verify style float existence + // (IE uses styleFloat instead of cssFloat) + cssFloat: !!a.style.cssFloat, + + // Make sure that if no value is specified for a checkbox + // that it defaults to "on". + // (WebKit defaults to "" instead) + checkOn: ( input.value === "on" ), + + // Make sure that a selected-by-default option has a working selected property. + // (WebKit defaults to false instead of true, IE too, if it's in an optgroup) + optSelected: opt.selected, + + // Test setAttribute on camelCase class. If it works, we need attrFixes when doing get/setAttribute (ie6/7) + getSetAttribute: div.className !== "t", + + // Will be defined later + submitBubbles: true, + changeBubbles: true, + focusinBubbles: false, + deleteExpando: true, + noCloneEvent: true, + inlineBlockNeedsLayout: false, + shrinkWrapBlocks: false, + reliableMarginRight: true + }; + + // Make sure checked status is properly cloned + input.checked = true; + support.noCloneChecked = input.cloneNode( true ).checked; + + // Make sure that the options inside disabled selects aren't marked as disabled + // (WebKit marks them as disabled) + select.disabled = true; + support.optDisabled = !opt.disabled; + + // Test to see if it's possible to delete an expando from an element + // Fails in Internet Explorer + try { + delete div.test; + } catch( e ) { + support.deleteExpando = false; + } + + if ( !div.addEventListener && div.attachEvent && div.fireEvent ) { + div.attachEvent( "onclick", function() { + // Cloning a node shouldn't copy over any + // bound event handlers (IE does this) + support.noCloneEvent = false; + }); + div.cloneNode( true ).fireEvent( "onclick" ); + } + + // Check if a radio maintains it's value + // after being appended to the DOM + input = document.createElement("input"); + input.value = "t"; + input.setAttribute("type", "radio"); + support.radioValue = input.value === "t"; + + input.setAttribute("checked", "checked"); + div.appendChild( input ); + fragment = document.createDocumentFragment(); + fragment.appendChild( div.firstChild ); + + // WebKit doesn't clone checked state correctly in fragments + support.checkClone = fragment.cloneNode( true ).cloneNode( true ).lastChild.checked; + + div.innerHTML = ""; + + // Figure out if the W3C box model works as expected + div.style.width = div.style.paddingLeft = "1px"; + + body = document.getElementsByTagName( "body" )[ 0 ]; + // We use our own, invisible, body unless the body is already present + // in which case we use a div (#9239) + testElement = document.createElement( body ? "div" : "body" ); + testElementStyle = { + visibility: "hidden", + width: 0, + height: 0, + border: 0, + margin: 0, + background: "none" + }; + if ( body ) { + jQuery.extend( testElementStyle, { + position: "absolute", + left: "-1000px", + top: "-1000px" + }); + } + for ( i in testElementStyle ) { + testElement.style[ i ] = testElementStyle[ i ]; + } + testElement.appendChild( div ); + testElementParent = body || documentElement; + testElementParent.insertBefore( testElement, testElementParent.firstChild ); + + // Check if a disconnected checkbox will retain its checked + // value of true after appended to the DOM (IE6/7) + support.appendChecked = input.checked; + + support.boxModel = div.offsetWidth === 2; + + if ( "zoom" in div.style ) { + // Check if natively block-level elements act like inline-block + // elements when setting their display to 'inline' and giving + // them layout + // (IE < 8 does this) + div.style.display = "inline"; + div.style.zoom = 1; + support.inlineBlockNeedsLayout = ( div.offsetWidth === 2 ); + + // Check if elements with layout shrink-wrap their children + // (IE 6 does this) + div.style.display = ""; + div.innerHTML = "<div style='width:4px;'></div>"; + support.shrinkWrapBlocks = ( div.offsetWidth !== 2 ); + } + + div.innerHTML = "<table><tr><td style='padding:0;border:0;display:none'></td><td>t</td></tr></table>"; + tds = div.getElementsByTagName( "td" ); + + // Check if table cells still have offsetWidth/Height when they are set + // to display:none and there are still other visible table cells in a + // table row; if so, offsetWidth/Height are not reliable for use when + // determining if an element has been hidden directly using + // display:none (it is still safe to use offsets if a parent element is + // hidden; don safety goggles and see bug #4512 for more information). + // (only IE 8 fails this test) + isSupported = ( tds[ 0 ].offsetHeight === 0 ); + + tds[ 0 ].style.display = ""; + tds[ 1 ].style.display = "none"; + + // Check if empty table cells still have offsetWidth/Height + // (IE < 8 fail this test) + support.reliableHiddenOffsets = isSupported && ( tds[ 0 ].offsetHeight === 0 ); + div.innerHTML = ""; + + // Check if div with explicit width and no margin-right incorrectly + // gets computed margin-right based on width of container. For more + // info see bug #3333 + // Fails in WebKit before Feb 2011 nightlies + // WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right + if ( document.defaultView && document.defaultView.getComputedStyle ) { + marginDiv = document.createElement( "div" ); + marginDiv.style.width = "0"; + marginDiv.style.marginRight = "0"; + div.appendChild( marginDiv ); + support.reliableMarginRight = + ( parseInt( ( document.defaultView.getComputedStyle( marginDiv, null ) || { marginRight: 0 } ).marginRight, 10 ) || 0 ) === 0; + } + + // Remove the body element we added + testElement.innerHTML = ""; + testElementParent.removeChild( testElement ); + + // Technique from Juriy Zaytsev + // http://thinkweb2.com/projects/prototype/detecting-event-support-without-browser-sniffing/ + // We only care about the case where non-standard event systems + // are used, namely in IE. Short-circuiting here helps us to + // avoid an eval call (in setAttribute) which can cause CSP + // to go haywire. See: https://developer.mozilla.org/en/Security/CSP + if ( div.attachEvent ) { + for( i in { + submit: 1, + change: 1, + focusin: 1 + } ) { + eventName = "on" + i; + isSupported = ( eventName in div ); + if ( !isSupported ) { + div.setAttribute( eventName, "return;" ); + isSupported = ( typeof div[ eventName ] === "function" ); + } + support[ i + "Bubbles" ] = isSupported; + } + } + + // Null connected elements to avoid leaks in IE + testElement = fragment = select = opt = body = marginDiv = div = input = null; + + return support; +})(); + +// Keep track of boxModel +jQuery.boxModel = jQuery.support.boxModel; + + + + +var rbrace = /^(?:\{.*\}|\[.*\])$/, + rmultiDash = /([A-Z])/g; + +jQuery.extend({ + cache: {}, + + // Please use with caution + uuid: 0, + + // Unique for each copy of jQuery on the page + // Non-digits removed to match rinlinejQuery + expando: "jQuery" + ( jQuery.fn.jquery + Math.random() ).replace( /\D/g, "" ), + + // The following elements throw uncatchable exceptions if you + // attempt to add expando properties to them. + noData: { + "embed": true, + // Ban all objects except for Flash (which handle expandos) + "object": "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000", + "applet": true + }, + + hasData: function( elem ) { + elem = elem.nodeType ? jQuery.cache[ elem[jQuery.expando] ] : elem[ jQuery.expando ]; + + return !!elem && !isEmptyDataObject( elem ); + }, + + data: function( elem, name, data, pvt /* Internal Use Only */ ) { + if ( !jQuery.acceptData( elem ) ) { + return; + } + + var thisCache, ret, + internalKey = jQuery.expando, + getByName = typeof name === "string", + + // We have to handle DOM nodes and JS objects differently because IE6-7 + // can't GC object references properly across the DOM-JS boundary + isNode = elem.nodeType, + + // Only DOM nodes need the global jQuery cache; JS object data is + // attached directly to the object so GC can occur automatically + cache = isNode ? jQuery.cache : elem, + + // Only defining an ID for JS objects if its cache already exists allows + // the code to shortcut on the same path as a DOM node with no cache + id = isNode ? elem[ jQuery.expando ] : elem[ jQuery.expando ] && jQuery.expando; + + // Avoid doing any more work than we need to when trying to get data on an + // object that has no data at all + if ( (!id || (pvt && id && (cache[ id ] && !cache[ id ][ internalKey ]))) && getByName && data === undefined ) { + return; + } + + if ( !id ) { + // Only DOM nodes need a new unique ID for each element since their data + // ends up in the global cache + if ( isNode ) { + elem[ jQuery.expando ] = id = ++jQuery.uuid; + } else { + id = jQuery.expando; + } + } + + if ( !cache[ id ] ) { + cache[ id ] = {}; + + // TODO: This is a hack for 1.5 ONLY. Avoids exposing jQuery + // metadata on plain JS objects when the object is serialized using + // JSON.stringify + if ( !isNode ) { + cache[ id ].toJSON = jQuery.noop; + } + } + + // An object can be passed to jQuery.data instead of a key/value pair; this gets + // shallow copied over onto the existing cache + if ( typeof name === "object" || typeof name === "function" ) { + if ( pvt ) { + cache[ id ][ internalKey ] = jQuery.extend(cache[ id ][ internalKey ], name); + } else { + cache[ id ] = jQuery.extend(cache[ id ], name); + } + } + + thisCache = cache[ id ]; + + // Internal jQuery data is stored in a separate object inside the object's data + // cache in order to avoid key collisions between internal data and user-defined + // data + if ( pvt ) { + if ( !thisCache[ internalKey ] ) { + thisCache[ internalKey ] = {}; + } + + thisCache = thisCache[ internalKey ]; + } + + if ( data !== undefined ) { + thisCache[ jQuery.camelCase( name ) ] = data; + } + + // TODO: This is a hack for 1.5 ONLY. It will be removed in 1.6. Users should + // not attempt to inspect the internal events object using jQuery.data, as this + // internal data object is undocumented and subject to change. + if ( name === "events" && !thisCache[name] ) { + return thisCache[ internalKey ] && thisCache[ internalKey ].events; + } + + // Check for both converted-to-camel and non-converted data property names + // If a data property was specified + if ( getByName ) { + + // First Try to find as-is property data + ret = thisCache[ name ]; + + // Test for null|undefined property data + if ( ret == null ) { + + // Try to find the camelCased property + ret = thisCache[ jQuery.camelCase( name ) ]; + } + } else { + ret = thisCache; + } + + return ret; + }, + + removeData: function( elem, name, pvt /* Internal Use Only */ ) { + if ( !jQuery.acceptData( elem ) ) { + return; + } + + var thisCache, + + // Reference to internal data cache key + internalKey = jQuery.expando, + + isNode = elem.nodeType, + + // See jQuery.data for more information + cache = isNode ? jQuery.cache : elem, + + // See jQuery.data for more information + id = isNode ? elem[ jQuery.expando ] : jQuery.expando; + + // If there is already no cache entry for this object, there is no + // purpose in continuing + if ( !cache[ id ] ) { + return; + } + + if ( name ) { + + thisCache = pvt ? cache[ id ][ internalKey ] : cache[ id ]; + + if ( thisCache ) { + + // Support interoperable removal of hyphenated or camelcased keys + if ( !thisCache[ name ] ) { + name = jQuery.camelCase( name ); + } + + delete thisCache[ name ]; + + // If there is no data left in the cache, we want to continue + // and let the cache object itself get destroyed + if ( !isEmptyDataObject(thisCache) ) { + return; + } + } + } + + // See jQuery.data for more information + if ( pvt ) { + delete cache[ id ][ internalKey ]; + + // Don't destroy the parent cache unless the internal data object + // had been the only thing left in it + if ( !isEmptyDataObject(cache[ id ]) ) { + return; + } + } + + var internalCache = cache[ id ][ internalKey ]; + + // Browsers that fail expando deletion also refuse to delete expandos on + // the window, but it will allow it on all other JS objects; other browsers + // don't care + // Ensure that `cache` is not a window object #10080 + if ( jQuery.support.deleteExpando || !cache.setInterval ) { + delete cache[ id ]; + } else { + cache[ id ] = null; + } + + // We destroyed the entire user cache at once because it's faster than + // iterating through each key, but we need to continue to persist internal + // data if it existed + if ( internalCache ) { + cache[ id ] = {}; + // TODO: This is a hack for 1.5 ONLY. Avoids exposing jQuery + // metadata on plain JS objects when the object is serialized using + // JSON.stringify + if ( !isNode ) { + cache[ id ].toJSON = jQuery.noop; + } + + cache[ id ][ internalKey ] = internalCache; + + // Otherwise, we need to eliminate the expando on the node to avoid + // false lookups in the cache for entries that no longer exist + } else if ( isNode ) { + // IE does not allow us to delete expando properties from nodes, + // nor does it have a removeAttribute function on Document nodes; + // we must handle all of these cases + if ( jQuery.support.deleteExpando ) { + delete elem[ jQuery.expando ]; + } else if ( elem.removeAttribute ) { + elem.removeAttribute( jQuery.expando ); + } else { + elem[ jQuery.expando ] = null; + } + } + }, + + // For internal use only. + _data: function( elem, name, data ) { + return jQuery.data( elem, name, data, true ); + }, + + // A method for determining if a DOM node can handle the data expando + acceptData: function( elem ) { + if ( elem.nodeName ) { + var match = jQuery.noData[ elem.nodeName.toLowerCase() ]; + + if ( match ) { + return !(match === true || elem.getAttribute("classid") !== match); + } + } + + return true; + } +}); + +jQuery.fn.extend({ + data: function( key, value ) { + var data = null; + + if ( typeof key === "undefined" ) { + if ( this.length ) { + data = jQuery.data( this[0] ); + + if ( this[0].nodeType === 1 ) { + var attr = this[0].attributes, name; + for ( var i = 0, l = attr.length; i < l; i++ ) { + name = attr[i].name; + + if ( name.indexOf( "data-" ) === 0 ) { + name = jQuery.camelCase( name.substring(5) ); + + dataAttr( this[0], name, data[ name ] ); + } + } + } + } + + return data; + + } else if ( typeof key === "object" ) { + return this.each(function() { + jQuery.data( this, key ); + }); + } + + var parts = key.split("."); + parts[1] = parts[1] ? "." + parts[1] : ""; + + if ( value === undefined ) { + data = this.triggerHandler("getData" + parts[1] + "!", [parts[0]]); + + // Try to fetch any internally stored data first + if ( data === undefined && this.length ) { + data = jQuery.data( this[0], key ); + data = dataAttr( this[0], key, data ); + } + + return data === undefined && parts[1] ? + this.data( parts[0] ) : + data; + + } else { + return this.each(function() { + var $this = jQuery( this ), + args = [ parts[0], value ]; + + $this.triggerHandler( "setData" + parts[1] + "!", args ); + jQuery.data( this, key, value ); + $this.triggerHandler( "changeData" + parts[1] + "!", args ); + }); + } + }, + + removeData: function( key ) { + return this.each(function() { + jQuery.removeData( this, key ); + }); + } +}); + +function dataAttr( elem, key, data ) { + // If nothing was found internally, try to fetch any + // data from the HTML5 data-* attribute + if ( data === undefined && elem.nodeType === 1 ) { + + var name = "data-" + key.replace( rmultiDash, "-$1" ).toLowerCase(); + + data = elem.getAttribute( name ); + + if ( typeof data === "string" ) { + try { + data = data === "true" ? true : + data === "false" ? false : + data === "null" ? null : + !jQuery.isNaN( data ) ? parseFloat( data ) : + rbrace.test( data ) ? jQuery.parseJSON( data ) : + data; + } catch( e ) {} + + // Make sure we set the data so it isn't changed later + jQuery.data( elem, key, data ); + + } else { + data = undefined; + } + } + + return data; +} + +// TODO: This is a hack for 1.5 ONLY to allow objects with a single toJSON +// property to be considered empty objects; this property always exists in +// order to make sure JSON.stringify does not expose internal metadata +function isEmptyDataObject( obj ) { + for ( var name in obj ) { + if ( name !== "toJSON" ) { + return false; + } + } + + return true; +} + + + + +function handleQueueMarkDefer( elem, type, src ) { + var deferDataKey = type + "defer", + queueDataKey = type + "queue", + markDataKey = type + "mark", + defer = jQuery.data( elem, deferDataKey, undefined, true ); + if ( defer && + ( src === "queue" || !jQuery.data( elem, queueDataKey, undefined, true ) ) && + ( src === "mark" || !jQuery.data( elem, markDataKey, undefined, true ) ) ) { + // Give room for hard-coded callbacks to fire first + // and eventually mark/queue something else on the element + setTimeout( function() { + if ( !jQuery.data( elem, queueDataKey, undefined, true ) && + !jQuery.data( elem, markDataKey, undefined, true ) ) { + jQuery.removeData( elem, deferDataKey, true ); + defer.resolve(); + } + }, 0 ); + } +} + +jQuery.extend({ + + _mark: function( elem, type ) { + if ( elem ) { + type = (type || "fx") + "mark"; + jQuery.data( elem, type, (jQuery.data(elem,type,undefined,true) || 0) + 1, true ); + } + }, + + _unmark: function( force, elem, type ) { + if ( force !== true ) { + type = elem; + elem = force; + force = false; + } + if ( elem ) { + type = type || "fx"; + var key = type + "mark", + count = force ? 0 : ( (jQuery.data( elem, key, undefined, true) || 1 ) - 1 ); + if ( count ) { + jQuery.data( elem, key, count, true ); + } else { + jQuery.removeData( elem, key, true ); + handleQueueMarkDefer( elem, type, "mark" ); + } + } + }, + + queue: function( elem, type, data ) { + if ( elem ) { + type = (type || "fx") + "queue"; + var q = jQuery.data( elem, type, undefined, true ); + // Speed up dequeue by getting out quickly if this is just a lookup + if ( data ) { + if ( !q || jQuery.isArray(data) ) { + q = jQuery.data( elem, type, jQuery.makeArray(data), true ); + } else { + q.push( data ); + } + } + return q || []; + } + }, + + dequeue: function( elem, type ) { + type = type || "fx"; + + var queue = jQuery.queue( elem, type ), + fn = queue.shift(), + defer; + + // If the fx queue is dequeued, always remove the progress sentinel + if ( fn === "inprogress" ) { + fn = queue.shift(); + } + + if ( fn ) { + // Add a progress sentinel to prevent the fx queue from being + // automatically dequeued + if ( type === "fx" ) { + queue.unshift("inprogress"); + } + + fn.call(elem, function() { + jQuery.dequeue(elem, type); + }); + } + + if ( !queue.length ) { + jQuery.removeData( elem, type + "queue", true ); + handleQueueMarkDefer( elem, type, "queue" ); + } + } +}); + +jQuery.fn.extend({ + queue: function( type, data ) { + if ( typeof type !== "string" ) { + data = type; + type = "fx"; + } + + if ( data === undefined ) { + return jQuery.queue( this[0], type ); + } + return this.each(function() { + var queue = jQuery.queue( this, type, data ); + + if ( type === "fx" && queue[0] !== "inprogress" ) { + jQuery.dequeue( this, type ); + } + }); + }, + dequeue: function( type ) { + return this.each(function() { + jQuery.dequeue( this, type ); + }); + }, + // Based off of the plugin by Clint Helfers, with permission. + // http://blindsignals.com/index.php/2009/07/jquery-delay/ + delay: function( time, type ) { + time = jQuery.fx ? jQuery.fx.speeds[time] || time : time; + type = type || "fx"; + + return this.queue( type, function() { + var elem = this; + setTimeout(function() { + jQuery.dequeue( elem, type ); + }, time ); + }); + }, + clearQueue: function( type ) { + return this.queue( type || "fx", [] ); + }, + // Get a promise resolved when queues of a certain type + // are emptied (fx is the type by default) + promise: function( type, object ) { + if ( typeof type !== "string" ) { + object = type; + type = undefined; + } + type = type || "fx"; + var defer = jQuery.Deferred(), + elements = this, + i = elements.length, + count = 1, + deferDataKey = type + "defer", + queueDataKey = type + "queue", + markDataKey = type + "mark", + tmp; + function resolve() { + if ( !( --count ) ) { + defer.resolveWith( elements, [ elements ] ); + } + } + while( i-- ) { + if (( tmp = jQuery.data( elements[ i ], deferDataKey, undefined, true ) || + ( jQuery.data( elements[ i ], queueDataKey, undefined, true ) || + jQuery.data( elements[ i ], markDataKey, undefined, true ) ) && + jQuery.data( elements[ i ], deferDataKey, jQuery._Deferred(), true ) )) { + count++; + tmp.done( resolve ); + } + } + resolve(); + return defer.promise(); + } +}); + + + + +var rclass = /[\n\t\r]/g, + rspace = /\s+/, + rreturn = /\r/g, + rtype = /^(?:button|input)$/i, + rfocusable = /^(?:button|input|object|select|textarea)$/i, + rclickable = /^a(?:rea)?$/i, + rboolean = /^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i, + nodeHook, boolHook; + +jQuery.fn.extend({ + attr: function( name, value ) { + return jQuery.access( this, name, value, true, jQuery.attr ); + }, + + removeAttr: function( name ) { + return this.each(function() { + jQuery.removeAttr( this, name ); + }); + }, + + prop: function( name, value ) { + return jQuery.access( this, name, value, true, jQuery.prop ); + }, + + removeProp: function( name ) { + name = jQuery.propFix[ name ] || name; + return this.each(function() { + // try/catch handles cases where IE balks (such as removing a property on window) + try { + this[ name ] = undefined; + delete this[ name ]; + } catch( e ) {} + }); + }, + + addClass: function( value ) { + var classNames, i, l, elem, + setClass, c, cl; + + if ( jQuery.isFunction( value ) ) { + return this.each(function( j ) { + jQuery( this ).addClass( value.call(this, j, this.className) ); + }); + } + + if ( value && typeof value === "string" ) { + classNames = value.split( rspace ); + + for ( i = 0, l = this.length; i < l; i++ ) { + elem = this[ i ]; + + if ( elem.nodeType === 1 ) { + if ( !elem.className && classNames.length === 1 ) { + elem.className = value; + + } else { + setClass = " " + elem.className + " "; + + for ( c = 0, cl = classNames.length; c < cl; c++ ) { + if ( !~setClass.indexOf( " " + classNames[ c ] + " " ) ) { + setClass += classNames[ c ] + " "; + } + } + elem.className = jQuery.trim( setClass ); + } + } + } + } + + return this; + }, + + removeClass: function( value ) { + var classNames, i, l, elem, className, c, cl; + + if ( jQuery.isFunction( value ) ) { + return this.each(function( j ) { + jQuery( this ).removeClass( value.call(this, j, this.className) ); + }); + } + + if ( (value && typeof value === "string") || value === undefined ) { + classNames = (value || "").split( rspace ); + + for ( i = 0, l = this.length; i < l; i++ ) { + elem = this[ i ]; + + if ( elem.nodeType === 1 && elem.className ) { + if ( value ) { + className = (" " + elem.className + " ").replace( rclass, " " ); + for ( c = 0, cl = classNames.length; c < cl; c++ ) { + className = className.replace(" " + classNames[ c ] + " ", " "); + } + elem.className = jQuery.trim( className ); + + } else { + elem.className = ""; + } + } + } + } + + return this; + }, + + toggleClass: function( value, stateVal ) { + var type = typeof value, + isBool = typeof stateVal === "boolean"; + + if ( jQuery.isFunction( value ) ) { + return this.each(function( i ) { + jQuery( this ).toggleClass( value.call(this, i, this.className, stateVal), stateVal ); + }); + } + + return this.each(function() { + if ( type === "string" ) { + // toggle individual class names + var className, + i = 0, + self = jQuery( this ), + state = stateVal, + classNames = value.split( rspace ); + + while ( (className = classNames[ i++ ]) ) { + // check each className given, space seperated list + state = isBool ? state : !self.hasClass( className ); + self[ state ? "addClass" : "removeClass" ]( className ); + } + + } else if ( type === "undefined" || type === "boolean" ) { + if ( this.className ) { + // store className if set + jQuery._data( this, "__className__", this.className ); + } + + // toggle whole className + this.className = this.className || value === false ? "" : jQuery._data( this, "__className__" ) || ""; + } + }); + }, + + hasClass: function( selector ) { + var className = " " + selector + " "; + for ( var i = 0, l = this.length; i < l; i++ ) { + if ( this[i].nodeType === 1 && (" " + this[i].className + " ").replace(rclass, " ").indexOf( className ) > -1 ) { + return true; + } + } + + return false; + }, + + val: function( value ) { + var hooks, ret, + elem = this[0]; + + if ( !arguments.length ) { + if ( elem ) { + hooks = jQuery.valHooks[ elem.nodeName.toLowerCase() ] || jQuery.valHooks[ elem.type ]; + + if ( hooks && "get" in hooks && (ret = hooks.get( elem, "value" )) !== undefined ) { + return ret; + } + + ret = elem.value; + + return typeof ret === "string" ? + // handle most common string cases + ret.replace(rreturn, "") : + // handle cases where value is null/undef or number + ret == null ? "" : ret; + } + + return undefined; + } + + var isFunction = jQuery.isFunction( value ); + + return this.each(function( i ) { + var self = jQuery(this), val; + + if ( this.nodeType !== 1 ) { + return; + } + + if ( isFunction ) { + val = value.call( this, i, self.val() ); + } else { + val = value; + } + + // Treat null/undefined as ""; convert numbers to string + if ( val == null ) { + val = ""; + } else if ( typeof val === "number" ) { + val += ""; + } else if ( jQuery.isArray( val ) ) { + val = jQuery.map(val, function ( value ) { + return value == null ? "" : value + ""; + }); + } + + hooks = jQuery.valHooks[ this.nodeName.toLowerCase() ] || jQuery.valHooks[ this.type ]; + + // If set returns undefined, fall back to normal setting + if ( !hooks || !("set" in hooks) || hooks.set( this, val, "value" ) === undefined ) { + this.value = val; + } + }); + } +}); + +jQuery.extend({ + valHooks: { + option: { + get: function( elem ) { + // attributes.value is undefined in Blackberry 4.7 but + // uses .value. See #6932 + var val = elem.attributes.value; + return !val || val.specified ? elem.value : elem.text; + } + }, + select: { + get: function( elem ) { + var value, + index = elem.selectedIndex, + values = [], + options = elem.options, + one = elem.type === "select-one"; + + // Nothing was selected + if ( index < 0 ) { + return null; + } + + // Loop through all the selected options + for ( var i = one ? index : 0, max = one ? index + 1 : options.length; i < max; i++ ) { + var option = options[ i ]; + + // Don't return options that are disabled or in a disabled optgroup + if ( option.selected && (jQuery.support.optDisabled ? !option.disabled : option.getAttribute("disabled") === null) && + (!option.parentNode.disabled || !jQuery.nodeName( option.parentNode, "optgroup" )) ) { + + // Get the specific value for the option + value = jQuery( option ).val(); + + // We don't need an array for one selects + if ( one ) { + return value; + } + + // Multi-Selects return an array + values.push( value ); + } + } + + // Fixes Bug #2551 -- select.val() broken in IE after form.reset() + if ( one && !values.length && options.length ) { + return jQuery( options[ index ] ).val(); + } + + return values; + }, + + set: function( elem, value ) { + var values = jQuery.makeArray( value ); + + jQuery(elem).find("option").each(function() { + this.selected = jQuery.inArray( jQuery(this).val(), values ) >= 0; + }); + + if ( !values.length ) { + elem.selectedIndex = -1; + } + return values; + } + } + }, + + attrFn: { + val: true, + css: true, + html: true, + text: true, + data: true, + width: true, + height: true, + offset: true + }, + + attrFix: { + // Always normalize to ensure hook usage + tabindex: "tabIndex" + }, + + attr: function( elem, name, value, pass ) { + var nType = elem.nodeType; + + // don't get/set attributes on text, comment and attribute nodes + if ( !elem || nType === 3 || nType === 8 || nType === 2 ) { + return undefined; + } + + if ( pass && name in jQuery.attrFn ) { + return jQuery( elem )[ name ]( value ); + } + + // Fallback to prop when attributes are not supported + if ( !("getAttribute" in elem) ) { + return jQuery.prop( elem, name, value ); + } + + var ret, hooks, + notxml = nType !== 1 || !jQuery.isXMLDoc( elem ); + + // Normalize the name if needed + if ( notxml ) { + name = jQuery.attrFix[ name ] || name; + + hooks = jQuery.attrHooks[ name ]; + + if ( !hooks ) { + // Use boolHook for boolean attributes + if ( rboolean.test( name ) ) { + hooks = boolHook; + + // Use nodeHook if available( IE6/7 ) + } else if ( nodeHook ) { + hooks = nodeHook; + } + } + } + + if ( value !== undefined ) { + + if ( value === null ) { + jQuery.removeAttr( elem, name ); + return undefined; + + } else if ( hooks && "set" in hooks && notxml && (ret = hooks.set( elem, value, name )) !== undefined ) { + return ret; + + } else { + elem.setAttribute( name, "" + value ); + return value; + } + + } else if ( hooks && "get" in hooks && notxml && (ret = hooks.get( elem, name )) !== null ) { + return ret; + + } else { + + ret = elem.getAttribute( name ); + + // Non-existent attributes return null, we normalize to undefined + return ret === null ? + undefined : + ret; + } + }, + + removeAttr: function( elem, name ) { + var propName; + if ( elem.nodeType === 1 ) { + name = jQuery.attrFix[ name ] || name; + + jQuery.attr( elem, name, "" ); + elem.removeAttribute( name ); + + // Set corresponding property to false for boolean attributes + if ( rboolean.test( name ) && (propName = jQuery.propFix[ name ] || name) in elem ) { + elem[ propName ] = false; + } + } + }, + + attrHooks: { + type: { + set: function( elem, value ) { + // We can't allow the type property to be changed (since it causes problems in IE) + if ( rtype.test( elem.nodeName ) && elem.parentNode ) { + jQuery.error( "type property can't be changed" ); + } else if ( !jQuery.support.radioValue && value === "radio" && jQuery.nodeName(elem, "input") ) { + // Setting the type on a radio button after the value resets the value in IE6-9 + // Reset value to it's default in case type is set after value + // This is for element creation + var val = elem.value; + elem.setAttribute( "type", value ); + if ( val ) { + elem.value = val; + } + return value; + } + } + }, + // Use the value property for back compat + // Use the nodeHook for button elements in IE6/7 (#1954) + value: { + get: function( elem, name ) { + if ( nodeHook && jQuery.nodeName( elem, "button" ) ) { + return nodeHook.get( elem, name ); + } + return name in elem ? + elem.value : + null; + }, + set: function( elem, value, name ) { + if ( nodeHook && jQuery.nodeName( elem, "button" ) ) { + return nodeHook.set( elem, value, name ); + } + // Does not return so that setAttribute is also used + elem.value = value; + } + } + }, + + propFix: { + tabindex: "tabIndex", + readonly: "readOnly", + "for": "htmlFor", + "class": "className", + maxlength: "maxLength", + cellspacing: "cellSpacing", + cellpadding: "cellPadding", + rowspan: "rowSpan", + colspan: "colSpan", + usemap: "useMap", + frameborder: "frameBorder", + contenteditable: "contentEditable" + }, + + prop: function( elem, name, value ) { + var nType = elem.nodeType; + + // don't get/set properties on text, comment and attribute nodes + if ( !elem || nType === 3 || nType === 8 || nType === 2 ) { + return undefined; + } + + var ret, hooks, + notxml = nType !== 1 || !jQuery.isXMLDoc( elem ); + + if ( notxml ) { + // Fix name and attach hooks + name = jQuery.propFix[ name ] || name; + hooks = jQuery.propHooks[ name ]; + } + + if ( value !== undefined ) { + if ( hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ) { + return ret; + + } else { + return (elem[ name ] = value); + } + + } else { + if ( hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== null ) { + return ret; + + } else { + return elem[ name ]; + } + } + }, + + propHooks: { + tabIndex: { + get: function( elem ) { + // elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set + // http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/ + var attributeNode = elem.getAttributeNode("tabindex"); + + return attributeNode && attributeNode.specified ? + parseInt( attributeNode.value, 10 ) : + rfocusable.test( elem.nodeName ) || rclickable.test( elem.nodeName ) && elem.href ? + 0 : + undefined; + } + } + } +}); + +// Add the tabindex propHook to attrHooks for back-compat +jQuery.attrHooks.tabIndex = jQuery.propHooks.tabIndex; + +// Hook for boolean attributes +boolHook = { + get: function( elem, name ) { + // Align boolean attributes with corresponding properties + // Fall back to attribute presence where some booleans are not supported + var attrNode; + return jQuery.prop( elem, name ) === true || ( attrNode = elem.getAttributeNode( name ) ) && attrNode.nodeValue !== false ? + name.toLowerCase() : + undefined; + }, + set: function( elem, value, name ) { + var propName; + if ( value === false ) { + // Remove boolean attributes when set to false + jQuery.removeAttr( elem, name ); + } else { + // value is true since we know at this point it's type boolean and not false + // Set boolean attributes to the same name and set the DOM property + propName = jQuery.propFix[ name ] || name; + if ( propName in elem ) { + // Only set the IDL specifically if it already exists on the element + elem[ propName ] = true; + } + + elem.setAttribute( name, name.toLowerCase() ); + } + return name; + } +}; + +// IE6/7 do not support getting/setting some attributes with get/setAttribute +if ( !jQuery.support.getSetAttribute ) { + + // Use this for any attribute in IE6/7 + // This fixes almost every IE6/7 issue + nodeHook = jQuery.valHooks.button = { + get: function( elem, name ) { + var ret; + ret = elem.getAttributeNode( name ); + // Return undefined if nodeValue is empty string + return ret && ret.nodeValue !== "" ? + ret.nodeValue : + undefined; + }, + set: function( elem, value, name ) { + // Set the existing or create a new attribute node + var ret = elem.getAttributeNode( name ); + if ( !ret ) { + ret = document.createAttribute( name ); + elem.setAttributeNode( ret ); + } + return (ret.nodeValue = value + ""); + } + }; + + // Set width and height to auto instead of 0 on empty string( Bug #8150 ) + // This is for removals + jQuery.each([ "width", "height" ], function( i, name ) { + jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], { + set: function( elem, value ) { + if ( value === "" ) { + elem.setAttribute( name, "auto" ); + return value; + } + } + }); + }); +} + + +// Some attributes require a special call on IE +if ( !jQuery.support.hrefNormalized ) { + jQuery.each([ "href", "src", "width", "height" ], function( i, name ) { + jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], { + get: function( elem ) { + var ret = elem.getAttribute( name, 2 ); + return ret === null ? undefined : ret; + } + }); + }); +} + +if ( !jQuery.support.style ) { + jQuery.attrHooks.style = { + get: function( elem ) { + // Return undefined in the case of empty string + // Normalize to lowercase since IE uppercases css property names + return elem.style.cssText.toLowerCase() || undefined; + }, + set: function( elem, value ) { + return (elem.style.cssText = "" + value); + } + }; +} + +// Safari mis-reports the default selected property of an option +// Accessing the parent's selectedIndex property fixes it +if ( !jQuery.support.optSelected ) { + jQuery.propHooks.selected = jQuery.extend( jQuery.propHooks.selected, { + get: function( elem ) { + var parent = elem.parentNode; + + if ( parent ) { + parent.selectedIndex; + + // Make sure that it also works with optgroups, see #5701 + if ( parent.parentNode ) { + parent.parentNode.selectedIndex; + } + } + return null; + } + }); +} + +// Radios and checkboxes getter/setter +if ( !jQuery.support.checkOn ) { + jQuery.each([ "radio", "checkbox" ], function() { + jQuery.valHooks[ this ] = { + get: function( elem ) { + // Handle the case where in Webkit "" is returned instead of "on" if a value isn't specified + return elem.getAttribute("value") === null ? "on" : elem.value; + } + }; + }); +} +jQuery.each([ "radio", "checkbox" ], function() { + jQuery.valHooks[ this ] = jQuery.extend( jQuery.valHooks[ this ], { + set: function( elem, value ) { + if ( jQuery.isArray( value ) ) { + return (elem.checked = jQuery.inArray( jQuery(elem).val(), value ) >= 0); + } + } + }); +}); + + + + +var rnamespaces = /\.(.*)$/, + rformElems = /^(?:textarea|input|select)$/i, + rperiod = /\./g, + rspaces = / /g, + rescape = /[^\w\s.|`]/g, + fcleanup = function( nm ) { + return nm.replace(rescape, "\\$&"); + }; + +/* + * A number of helper functions used for managing events. + * Many of the ideas behind this code originated from + * Dean Edwards' addEvent library. + */ +jQuery.event = { + + // Bind an event to an element + // Original by Dean Edwards + add: function( elem, types, handler, data ) { + if ( elem.nodeType === 3 || elem.nodeType === 8 ) { + return; + } + + if ( handler === false ) { + handler = returnFalse; + } else if ( !handler ) { + // Fixes bug #7229. Fix recommended by jdalton + return; + } + + var handleObjIn, handleObj; + + if ( handler.handler ) { + handleObjIn = handler; + handler = handleObjIn.handler; + } + + // Make sure that the function being executed has a unique ID + if ( !handler.guid ) { + handler.guid = jQuery.guid++; + } + + // Init the element's event structure + var elemData = jQuery._data( elem ); + + // If no elemData is found then we must be trying to bind to one of the + // banned noData elements + if ( !elemData ) { + return; + } + + var events = elemData.events, + eventHandle = elemData.handle; + + if ( !events ) { + elemData.events = events = {}; + } + + if ( !eventHandle ) { + elemData.handle = eventHandle = function( e ) { + // Discard the second event of a jQuery.event.trigger() and + // when an event is called after a page has unloaded + return typeof jQuery !== "undefined" && (!e || jQuery.event.triggered !== e.type) ? + jQuery.event.handle.apply( eventHandle.elem, arguments ) : + undefined; + }; + } + + // Add elem as a property of the handle function + // This is to prevent a memory leak with non-native events in IE. + eventHandle.elem = elem; + + // Handle multiple events separated by a space + // jQuery(...).bind("mouseover mouseout", fn); + types = types.split(" "); + + var type, i = 0, namespaces; + + while ( (type = types[ i++ ]) ) { + handleObj = handleObjIn ? + jQuery.extend({}, handleObjIn) : + { handler: handler, data: data }; + + // Namespaced event handlers + if ( type.indexOf(".") > -1 ) { + namespaces = type.split("."); + type = namespaces.shift(); + handleObj.namespace = namespaces.slice(0).sort().join("."); + + } else { + namespaces = []; + handleObj.namespace = ""; + } + + handleObj.type = type; + if ( !handleObj.guid ) { + handleObj.guid = handler.guid; + } + + // Get the current list of functions bound to this event + var handlers = events[ type ], + special = jQuery.event.special[ type ] || {}; + + // Init the event handler queue + if ( !handlers ) { + handlers = events[ type ] = []; + + // Check for a special event handler + // Only use addEventListener/attachEvent if the special + // events handler returns false + if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) { + // Bind the global event handler to the element + if ( elem.addEventListener ) { + elem.addEventListener( type, eventHandle, false ); + + } else if ( elem.attachEvent ) { + elem.attachEvent( "on" + type, eventHandle ); + } + } + } + + if ( special.add ) { + special.add.call( elem, handleObj ); + + if ( !handleObj.handler.guid ) { + handleObj.handler.guid = handler.guid; + } + } + + // Add the function to the element's handler list + handlers.push( handleObj ); + + // Keep track of which events have been used, for event optimization + jQuery.event.global[ type ] = true; + } + + // Nullify elem to prevent memory leaks in IE + elem = null; + }, + + global: {}, + + // Detach an event or set of events from an element + remove: function( elem, types, handler, pos ) { + // don't do events on text and comment nodes + if ( elem.nodeType === 3 || elem.nodeType === 8 ) { + return; + } + + if ( handler === false ) { + handler = returnFalse; + } + + var ret, type, fn, j, i = 0, all, namespaces, namespace, special, eventType, handleObj, origType, + elemData = jQuery.hasData( elem ) && jQuery._data( elem ), + events = elemData && elemData.events; + + if ( !elemData || !events ) { + return; + } + + // types is actually an event object here + if ( types && types.type ) { + handler = types.handler; + types = types.type; + } + + // Unbind all events for the element + if ( !types || typeof types === "string" && types.charAt(0) === "." ) { + types = types || ""; + + for ( type in events ) { + jQuery.event.remove( elem, type + types ); + } + + return; + } + + // Handle multiple events separated by a space + // jQuery(...).unbind("mouseover mouseout", fn); + types = types.split(" "); + + while ( (type = types[ i++ ]) ) { + origType = type; + handleObj = null; + all = type.indexOf(".") < 0; + namespaces = []; + + if ( !all ) { + // Namespaced event handlers + namespaces = type.split("."); + type = namespaces.shift(); + + namespace = new RegExp("(^|\\.)" + + jQuery.map( namespaces.slice(0).sort(), fcleanup ).join("\\.(?:.*\\.)?") + "(\\.|$)"); + } + + eventType = events[ type ]; + + if ( !eventType ) { + continue; + } + + if ( !handler ) { + for ( j = 0; j < eventType.length; j++ ) { + handleObj = eventType[ j ]; + + if ( all || namespace.test( handleObj.namespace ) ) { + jQuery.event.remove( elem, origType, handleObj.handler, j ); + eventType.splice( j--, 1 ); + } + } + + continue; + } + + special = jQuery.event.special[ type ] || {}; + + for ( j = pos || 0; j < eventType.length; j++ ) { + handleObj = eventType[ j ]; + + if ( handler.guid === handleObj.guid ) { + // remove the given handler for the given type + if ( all || namespace.test( handleObj.namespace ) ) { + if ( pos == null ) { + eventType.splice( j--, 1 ); + } + + if ( special.remove ) { + special.remove.call( elem, handleObj ); + } + } + + if ( pos != null ) { + break; + } + } + } + + // remove generic event handler if no more handlers exist + if ( eventType.length === 0 || pos != null && eventType.length === 1 ) { + if ( !special.teardown || special.teardown.call( elem, namespaces ) === false ) { + jQuery.removeEvent( elem, type, elemData.handle ); + } + + ret = null; + delete events[ type ]; + } + } + + // Remove the expando if it's no longer used + if ( jQuery.isEmptyObject( events ) ) { + var handle = elemData.handle; + if ( handle ) { + handle.elem = null; + } + + delete elemData.events; + delete elemData.handle; + + if ( jQuery.isEmptyObject( elemData ) ) { + jQuery.removeData( elem, undefined, true ); + } + } + }, + + // Events that are safe to short-circuit if no handlers are attached. + // Native DOM events should not be added, they may have inline handlers. + customEvent: { + "getData": true, + "setData": true, + "changeData": true + }, + + trigger: function( event, data, elem, onlyHandlers ) { + // Event object or event type + var type = event.type || event, + namespaces = [], + exclusive; + + if ( type.indexOf("!") >= 0 ) { + // Exclusive events trigger only for the exact event (no namespaces) + type = type.slice(0, -1); + exclusive = true; + } + + if ( type.indexOf(".") >= 0 ) { + // Namespaced trigger; create a regexp to match event type in handle() + namespaces = type.split("."); + type = namespaces.shift(); + namespaces.sort(); + } + + if ( (!elem || jQuery.event.customEvent[ type ]) && !jQuery.event.global[ type ] ) { + // No jQuery handlers for this event type, and it can't have inline handlers + return; + } + + // Caller can pass in an Event, Object, or just an event type string + event = typeof event === "object" ? + // jQuery.Event object + event[ jQuery.expando ] ? event : + // Object literal + new jQuery.Event( type, event ) : + // Just the event type (string) + new jQuery.Event( type ); + + event.type = type; + event.exclusive = exclusive; + event.namespace = namespaces.join("."); + event.namespace_re = new RegExp("(^|\\.)" + namespaces.join("\\.(?:.*\\.)?") + "(\\.|$)"); + + // triggerHandler() and global events don't bubble or run the default action + if ( onlyHandlers || !elem ) { + event.preventDefault(); + event.stopPropagation(); + } + + // Handle a global trigger + if ( !elem ) { + // TODO: Stop taunting the data cache; remove global events and always attach to document + jQuery.each( jQuery.cache, function() { + // internalKey variable is just used to make it easier to find + // and potentially change this stuff later; currently it just + // points to jQuery.expando + var internalKey = jQuery.expando, + internalCache = this[ internalKey ]; + if ( internalCache && internalCache.events && internalCache.events[ type ] ) { + jQuery.event.trigger( event, data, internalCache.handle.elem ); + } + }); + return; + } + + // Don't do events on text and comment nodes + if ( elem.nodeType === 3 || elem.nodeType === 8 ) { + return; + } + + // Clean up the event in case it is being reused + event.result = undefined; + event.target = elem; + + // Clone any incoming data and prepend the event, creating the handler arg list + data = data != null ? jQuery.makeArray( data ) : []; + data.unshift( event ); + + var cur = elem, + // IE doesn't like method names with a colon (#3533, #8272) + ontype = type.indexOf(":") < 0 ? "on" + type : ""; + + // Fire event on the current element, then bubble up the DOM tree + do { + var handle = jQuery._data( cur, "handle" ); + + event.currentTarget = cur; + if ( handle ) { + handle.apply( cur, data ); + } + + // Trigger an inline bound script + if ( ontype && jQuery.acceptData( cur ) && cur[ ontype ] && cur[ ontype ].apply( cur, data ) === false ) { + event.result = false; + event.preventDefault(); + } + + // Bubble up to document, then to window + cur = cur.parentNode || cur.ownerDocument || cur === event.target.ownerDocument && window; + } while ( cur && !event.isPropagationStopped() ); + + // If nobody prevented the default action, do it now + if ( !event.isDefaultPrevented() ) { + var old, + special = jQuery.event.special[ type ] || {}; + + if ( (!special._default || special._default.call( elem.ownerDocument, event ) === false) && + !(type === "click" && jQuery.nodeName( elem, "a" )) && jQuery.acceptData( elem ) ) { + + // Call a native DOM method on the target with the same name name as the event. + // Can't use an .isFunction)() check here because IE6/7 fails that test. + // IE<9 dies on focus to hidden element (#1486), may want to revisit a try/catch. + try { + if ( ontype && elem[ type ] ) { + // Don't re-trigger an onFOO event when we call its FOO() method + old = elem[ ontype ]; + + if ( old ) { + elem[ ontype ] = null; + } + + jQuery.event.triggered = type; + elem[ type ](); + } + } catch ( ieError ) {} + + if ( old ) { + elem[ ontype ] = old; + } + + jQuery.event.triggered = undefined; + } + } + + return event.result; + }, + + handle: function( event ) { + event = jQuery.event.fix( event || window.event ); + // Snapshot the handlers list since a called handler may add/remove events. + var handlers = ((jQuery._data( this, "events" ) || {})[ event.type ] || []).slice(0), + run_all = !event.exclusive && !event.namespace, + args = Array.prototype.slice.call( arguments, 0 ); + + // Use the fix-ed Event rather than the (read-only) native event + args[0] = event; + event.currentTarget = this; + + for ( var j = 0, l = handlers.length; j < l; j++ ) { + var handleObj = handlers[ j ]; + + // Triggered event must 1) be non-exclusive and have no namespace, or + // 2) have namespace(s) a subset or equal to those in the bound event. + if ( run_all || event.namespace_re.test( handleObj.namespace ) ) { + // Pass in a reference to the handler function itself + // So that we can later remove it + event.handler = handleObj.handler; + event.data = handleObj.data; + event.handleObj = handleObj; + + var ret = handleObj.handler.apply( this, args ); + + if ( ret !== undefined ) { + event.result = ret; + if ( ret === false ) { + event.preventDefault(); + event.stopPropagation(); + } + } + + if ( event.isImmediatePropagationStopped() ) { + break; + } + } + } + return event.result; + }, + + props: "altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode layerX layerY metaKey newValue offsetX offsetY pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "), + + fix: function( event ) { + if ( event[ jQuery.expando ] ) { + return event; + } + + // store a copy of the original event object + // and "clone" to set read-only properties + var originalEvent = event; + event = jQuery.Event( originalEvent ); + + for ( var i = this.props.length, prop; i; ) { + prop = this.props[ --i ]; + event[ prop ] = originalEvent[ prop ]; + } + + // Fix target property, if necessary + if ( !event.target ) { + // Fixes #1925 where srcElement might not be defined either + event.target = event.srcElement || document; + } + + // check if target is a textnode (safari) + if ( event.target.nodeType === 3 ) { + event.target = event.target.parentNode; + } + + // Add relatedTarget, if necessary + if ( !event.relatedTarget && event.fromElement ) { + event.relatedTarget = event.fromElement === event.target ? event.toElement : event.fromElement; + } + + // Calculate pageX/Y if missing and clientX/Y available + if ( event.pageX == null && event.clientX != null ) { + var eventDocument = event.target.ownerDocument || document, + doc = eventDocument.documentElement, + body = eventDocument.body; + + event.pageX = event.clientX + (doc && doc.scrollLeft || body && body.scrollLeft || 0) - (doc && doc.clientLeft || body && body.clientLeft || 0); + event.pageY = event.clientY + (doc && doc.scrollTop || body && body.scrollTop || 0) - (doc && doc.clientTop || body && body.clientTop || 0); + } + + // Add which for key events + if ( event.which == null && (event.charCode != null || event.keyCode != null) ) { + event.which = event.charCode != null ? event.charCode : event.keyCode; + } + + // Add metaKey to non-Mac browsers (use ctrl for PC's and Meta for Macs) + if ( !event.metaKey && event.ctrlKey ) { + event.metaKey = event.ctrlKey; + } + + // Add which for click: 1 === left; 2 === middle; 3 === right + // Note: button is not normalized, so don't use it + if ( !event.which && event.button !== undefined ) { + event.which = (event.button & 1 ? 1 : ( event.button & 2 ? 3 : ( event.button & 4 ? 2 : 0 ) )); + } + + return event; + }, + + // Deprecated, use jQuery.guid instead + guid: 1E8, + + // Deprecated, use jQuery.proxy instead + proxy: jQuery.proxy, + + special: { + ready: { + // Make sure the ready event is setup + setup: jQuery.bindReady, + teardown: jQuery.noop + }, + + live: { + add: function( handleObj ) { + jQuery.event.add( this, + liveConvert( handleObj.origType, handleObj.selector ), + jQuery.extend({}, handleObj, {handler: liveHandler, guid: handleObj.handler.guid}) ); + }, + + remove: function( handleObj ) { + jQuery.event.remove( this, liveConvert( handleObj.origType, handleObj.selector ), handleObj ); + } + }, + + beforeunload: { + setup: function( data, namespaces, eventHandle ) { + // We only want to do this special case on windows + if ( jQuery.isWindow( this ) ) { + this.onbeforeunload = eventHandle; + } + }, + + teardown: function( namespaces, eventHandle ) { + if ( this.onbeforeunload === eventHandle ) { + this.onbeforeunload = null; + } + } + } + } +}; + +jQuery.removeEvent = document.removeEventListener ? + function( elem, type, handle ) { + if ( elem.removeEventListener ) { + elem.removeEventListener( type, handle, false ); + } + } : + function( elem, type, handle ) { + if ( elem.detachEvent ) { + elem.detachEvent( "on" + type, handle ); + } + }; + +jQuery.Event = function( src, props ) { + // Allow instantiation without the 'new' keyword + if ( !this.preventDefault ) { + return new jQuery.Event( src, props ); + } + + // Event object + if ( src && src.type ) { + this.originalEvent = src; + this.type = src.type; + + // Events bubbling up the document may have been marked as prevented + // by a handler lower down the tree; reflect the correct value. + this.isDefaultPrevented = (src.defaultPrevented || src.returnValue === false || + src.getPreventDefault && src.getPreventDefault()) ? returnTrue : returnFalse; + + // Event type + } else { + this.type = src; + } + + // Put explicitly provided properties onto the event object + if ( props ) { + jQuery.extend( this, props ); + } + + // timeStamp is buggy for some events on Firefox(#3843) + // So we won't rely on the native value + this.timeStamp = jQuery.now(); + + // Mark it as fixed + this[ jQuery.expando ] = true; +}; + +function returnFalse() { + return false; +} +function returnTrue() { + return true; +} + +// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding +// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html +jQuery.Event.prototype = { + preventDefault: function() { + this.isDefaultPrevented = returnTrue; + + var e = this.originalEvent; + if ( !e ) { + return; + } + + // if preventDefault exists run it on the original event + if ( e.preventDefault ) { + e.preventDefault(); + + // otherwise set the returnValue property of the original event to false (IE) + } else { + e.returnValue = false; + } + }, + stopPropagation: function() { + this.isPropagationStopped = returnTrue; + + var e = this.originalEvent; + if ( !e ) { + return; + } + // if stopPropagation exists run it on the original event + if ( e.stopPropagation ) { + e.stopPropagation(); + } + // otherwise set the cancelBubble property of the original event to true (IE) + e.cancelBubble = true; + }, + stopImmediatePropagation: function() { + this.isImmediatePropagationStopped = returnTrue; + this.stopPropagation(); + }, + isDefaultPrevented: returnFalse, + isPropagationStopped: returnFalse, + isImmediatePropagationStopped: returnFalse +}; + +// Checks if an event happened on an element within another element +// Used in jQuery.event.special.mouseenter and mouseleave handlers +var withinElement = function( event ) { + + // Check if mouse(over|out) are still within the same parent element + var related = event.relatedTarget, + inside = false, + eventType = event.type; + + event.type = event.data; + + if ( related !== this ) { + + if ( related ) { + inside = jQuery.contains( this, related ); + } + + if ( !inside ) { + + jQuery.event.handle.apply( this, arguments ); + + event.type = eventType; + } + } +}, + +// In case of event delegation, we only need to rename the event.type, +// liveHandler will take care of the rest. +delegate = function( event ) { + event.type = event.data; + jQuery.event.handle.apply( this, arguments ); +}; + +// Create mouseenter and mouseleave events +jQuery.each({ + mouseenter: "mouseover", + mouseleave: "mouseout" +}, function( orig, fix ) { + jQuery.event.special[ orig ] = { + setup: function( data ) { + jQuery.event.add( this, fix, data && data.selector ? delegate : withinElement, orig ); + }, + teardown: function( data ) { + jQuery.event.remove( this, fix, data && data.selector ? delegate : withinElement ); + } + }; +}); + +// submit delegation +if ( !jQuery.support.submitBubbles ) { + + jQuery.event.special.submit = { + setup: function( data, namespaces ) { + if ( !jQuery.nodeName( this, "form" ) ) { + jQuery.event.add(this, "click.specialSubmit", function( e ) { + // Avoid triggering error on non-existent type attribute in IE VML (#7071) + var elem = e.target, + type = jQuery.nodeName( elem, "input" ) || jQuery.nodeName( elem, "button" ) ? elem.type : ""; + + if ( (type === "submit" || type === "image") && jQuery( elem ).closest("form").length ) { + trigger( "submit", this, arguments ); + } + }); + + jQuery.event.add(this, "keypress.specialSubmit", function( e ) { + var elem = e.target, + type = jQuery.nodeName( elem, "input" ) || jQuery.nodeName( elem, "button" ) ? elem.type : ""; + + if ( (type === "text" || type === "password") && jQuery( elem ).closest("form").length && e.keyCode === 13 ) { + trigger( "submit", this, arguments ); + } + }); + + } else { + return false; + } + }, + + teardown: function( namespaces ) { + jQuery.event.remove( this, ".specialSubmit" ); + } + }; + +} + +// change delegation, happens here so we have bind. +if ( !jQuery.support.changeBubbles ) { + + var changeFilters, + + getVal = function( elem ) { + var type = jQuery.nodeName( elem, "input" ) ? elem.type : "", + val = elem.value; + + if ( type === "radio" || type === "checkbox" ) { + val = elem.checked; + + } else if ( type === "select-multiple" ) { + val = elem.selectedIndex > -1 ? + jQuery.map( elem.options, function( elem ) { + return elem.selected; + }).join("-") : + ""; + + } else if ( jQuery.nodeName( elem, "select" ) ) { + val = elem.selectedIndex; + } + + return val; + }, + + testChange = function testChange( e ) { + var elem = e.target, data, val; + + if ( !rformElems.test( elem.nodeName ) || elem.readOnly ) { + return; + } + + data = jQuery._data( elem, "_change_data" ); + val = getVal(elem); + + // the current data will be also retrieved by beforeactivate + if ( e.type !== "focusout" || elem.type !== "radio" ) { + jQuery._data( elem, "_change_data", val ); + } + + if ( data === undefined || val === data ) { + return; + } + + if ( data != null || val ) { + e.type = "change"; + e.liveFired = undefined; + jQuery.event.trigger( e, arguments[1], elem ); + } + }; + + jQuery.event.special.change = { + filters: { + focusout: testChange, + + beforedeactivate: testChange, + + click: function( e ) { + var elem = e.target, type = jQuery.nodeName( elem, "input" ) ? elem.type : ""; + + if ( type === "radio" || type === "checkbox" || jQuery.nodeName( elem, "select" ) ) { + testChange.call( this, e ); + } + }, + + // Change has to be called before submit + // Keydown will be called before keypress, which is used in submit-event delegation + keydown: function( e ) { + var elem = e.target, type = jQuery.nodeName( elem, "input" ) ? elem.type : ""; + + if ( (e.keyCode === 13 && !jQuery.nodeName( elem, "textarea" ) ) || + (e.keyCode === 32 && (type === "checkbox" || type === "radio")) || + type === "select-multiple" ) { + testChange.call( this, e ); + } + }, + + // Beforeactivate happens also before the previous element is blurred + // with this event you can't trigger a change event, but you can store + // information + beforeactivate: function( e ) { + var elem = e.target; + jQuery._data( elem, "_change_data", getVal(elem) ); + } + }, + + setup: function( data, namespaces ) { + if ( this.type === "file" ) { + return false; + } + + for ( var type in changeFilters ) { + jQuery.event.add( this, type + ".specialChange", changeFilters[type] ); + } + + return rformElems.test( this.nodeName ); + }, + + teardown: function( namespaces ) { + jQuery.event.remove( this, ".specialChange" ); + + return rformElems.test( this.nodeName ); + } + }; + + changeFilters = jQuery.event.special.change.filters; + + // Handle when the input is .focus()'d + changeFilters.focus = changeFilters.beforeactivate; +} + +function trigger( type, elem, args ) { + // Piggyback on a donor event to simulate a different one. + // Fake originalEvent to avoid donor's stopPropagation, but if the + // simulated event prevents default then we do the same on the donor. + // Don't pass args or remember liveFired; they apply to the donor event. + var event = jQuery.extend( {}, args[ 0 ] ); + event.type = type; + event.originalEvent = {}; + event.liveFired = undefined; + jQuery.event.handle.call( elem, event ); + if ( event.isDefaultPrevented() ) { + args[ 0 ].preventDefault(); + } +} + +// Create "bubbling" focus and blur events +if ( !jQuery.support.focusinBubbles ) { + jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fix ) { + + // Attach a single capturing handler while someone wants focusin/focusout + var attaches = 0; + + jQuery.event.special[ fix ] = { + setup: function() { + if ( attaches++ === 0 ) { + document.addEventListener( orig, handler, true ); + } + }, + teardown: function() { + if ( --attaches === 0 ) { + document.removeEventListener( orig, handler, true ); + } + } + }; + + function handler( donor ) { + // Donor event is always a native one; fix it and switch its type. + // Let focusin/out handler cancel the donor focus/blur event. + var e = jQuery.event.fix( donor ); + e.type = fix; + e.originalEvent = {}; + jQuery.event.trigger( e, null, e.target ); + if ( e.isDefaultPrevented() ) { + donor.preventDefault(); + } + } + }); +} + +jQuery.each(["bind", "one"], function( i, name ) { + jQuery.fn[ name ] = function( type, data, fn ) { + var handler; + + // Handle object literals + if ( typeof type === "object" ) { + for ( var key in type ) { + this[ name ](key, data, type[key], fn); + } + return this; + } + + if ( arguments.length === 2 || data === false ) { + fn = data; + data = undefined; + } + + if ( name === "one" ) { + handler = function( event ) { + jQuery( this ).unbind( event, handler ); + return fn.apply( this, arguments ); + }; + handler.guid = fn.guid || jQuery.guid++; + } else { + handler = fn; + } + + if ( type === "unload" && name !== "one" ) { + this.one( type, data, fn ); + + } else { + for ( var i = 0, l = this.length; i < l; i++ ) { + jQuery.event.add( this[i], type, handler, data ); + } + } + + return this; + }; +}); + +jQuery.fn.extend({ + unbind: function( type, fn ) { + // Handle object literals + if ( typeof type === "object" && !type.preventDefault ) { + for ( var key in type ) { + this.unbind(key, type[key]); + } + + } else { + for ( var i = 0, l = this.length; i < l; i++ ) { + jQuery.event.remove( this[i], type, fn ); + } + } + + return this; + }, + + delegate: function( selector, types, data, fn ) { + return this.live( types, data, fn, selector ); + }, + + undelegate: function( selector, types, fn ) { + if ( arguments.length === 0 ) { + return this.unbind( "live" ); + + } else { + return this.die( types, null, fn, selector ); + } + }, + + trigger: function( type, data ) { + return this.each(function() { + jQuery.event.trigger( type, data, this ); + }); + }, + + triggerHandler: function( type, data ) { + if ( this[0] ) { + return jQuery.event.trigger( type, data, this[0], true ); + } + }, + + toggle: function( fn ) { + // Save reference to arguments for access in closure + var args = arguments, + guid = fn.guid || jQuery.guid++, + i = 0, + toggler = function( event ) { + // Figure out which function to execute + var lastToggle = ( jQuery.data( this, "lastToggle" + fn.guid ) || 0 ) % i; + jQuery.data( this, "lastToggle" + fn.guid, lastToggle + 1 ); + + // Make sure that clicks stop + event.preventDefault(); + + // and execute the function + return args[ lastToggle ].apply( this, arguments ) || false; + }; + + // link all the functions, so any of them can unbind this click handler + toggler.guid = guid; + while ( i < args.length ) { + args[ i++ ].guid = guid; + } + + return this.click( toggler ); + }, + + hover: function( fnOver, fnOut ) { + return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver ); + } +}); + +var liveMap = { + focus: "focusin", + blur: "focusout", + mouseenter: "mouseover", + mouseleave: "mouseout" +}; + +jQuery.each(["live", "die"], function( i, name ) { + jQuery.fn[ name ] = function( types, data, fn, origSelector /* Internal Use Only */ ) { + var type, i = 0, match, namespaces, preType, + selector = origSelector || this.selector, + context = origSelector ? this : jQuery( this.context ); + + if ( typeof types === "object" && !types.preventDefault ) { + for ( var key in types ) { + context[ name ]( key, data, types[key], selector ); + } + + return this; + } + + if ( name === "die" && !types && + origSelector && origSelector.charAt(0) === "." ) { + + context.unbind( origSelector ); + + return this; + } + + if ( data === false || jQuery.isFunction( data ) ) { + fn = data || returnFalse; + data = undefined; + } + + types = (types || "").split(" "); + + while ( (type = types[ i++ ]) != null ) { + match = rnamespaces.exec( type ); + namespaces = ""; + + if ( match ) { + namespaces = match[0]; + type = type.replace( rnamespaces, "" ); + } + + if ( type === "hover" ) { + types.push( "mouseenter" + namespaces, "mouseleave" + namespaces ); + continue; + } + + preType = type; + + if ( liveMap[ type ] ) { + types.push( liveMap[ type ] + namespaces ); + type = type + namespaces; + + } else { + type = (liveMap[ type ] || type) + namespaces; + } + + if ( name === "live" ) { + // bind live handler + for ( var j = 0, l = context.length; j < l; j++ ) { + jQuery.event.add( context[j], "live." + liveConvert( type, selector ), + { data: data, selector: selector, handler: fn, origType: type, origHandler: fn, preType: preType } ); + } + + } else { + // unbind live handler + context.unbind( "live." + liveConvert( type, selector ), fn ); + } + } + + return this; + }; +}); + +function liveHandler( event ) { + var stop, maxLevel, related, match, handleObj, elem, j, i, l, data, close, namespace, ret, + elems = [], + selectors = [], + events = jQuery._data( this, "events" ); + + // Make sure we avoid non-left-click bubbling in Firefox (#3861) and disabled elements in IE (#6911) + if ( event.liveFired === this || !events || !events.live || event.target.disabled || event.button && event.type === "click" ) { + return; + } + + if ( event.namespace ) { + namespace = new RegExp("(^|\\.)" + event.namespace.split(".").join("\\.(?:.*\\.)?") + "(\\.|$)"); + } + + event.liveFired = this; + + var live = events.live.slice(0); + + for ( j = 0; j < live.length; j++ ) { + handleObj = live[j]; + + if ( handleObj.origType.replace( rnamespaces, "" ) === event.type ) { + selectors.push( handleObj.selector ); + + } else { + live.splice( j--, 1 ); + } + } + + match = jQuery( event.target ).closest( selectors, event.currentTarget ); + + for ( i = 0, l = match.length; i < l; i++ ) { + close = match[i]; + + for ( j = 0; j < live.length; j++ ) { + handleObj = live[j]; + + if ( close.selector === handleObj.selector && (!namespace || namespace.test( handleObj.namespace )) && !close.elem.disabled ) { + elem = close.elem; + related = null; + + // Those two events require additional checking + if ( handleObj.preType === "mouseenter" || handleObj.preType === "mouseleave" ) { + event.type = handleObj.preType; + related = jQuery( event.relatedTarget ).closest( handleObj.selector )[0]; + + // Make sure not to accidentally match a child element with the same selector + if ( related && jQuery.contains( elem, related ) ) { + related = elem; + } + } + + if ( !related || related !== elem ) { + elems.push({ elem: elem, handleObj: handleObj, level: close.level }); + } + } + } + } + + for ( i = 0, l = elems.length; i < l; i++ ) { + match = elems[i]; + + if ( maxLevel && match.level > maxLevel ) { + break; + } + + event.currentTarget = match.elem; + event.data = match.handleObj.data; + event.handleObj = match.handleObj; + + ret = match.handleObj.origHandler.apply( match.elem, arguments ); + + if ( ret === false || event.isPropagationStopped() ) { + maxLevel = match.level; + + if ( ret === false ) { + stop = false; + } + if ( event.isImmediatePropagationStopped() ) { + break; + } + } + } + + return stop; +} + +function liveConvert( type, selector ) { + return (type && type !== "*" ? type + "." : "") + selector.replace(rperiod, "`").replace(rspaces, "&"); +} + +jQuery.each( ("blur focus focusin focusout load resize scroll unload click dblclick " + + "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " + + "change select submit keydown keypress keyup error").split(" "), function( i, name ) { + + // Handle event binding + jQuery.fn[ name ] = function( data, fn ) { + if ( fn == null ) { + fn = data; + data = null; + } + + return arguments.length > 0 ? + this.bind( name, data, fn ) : + this.trigger( name ); + }; + + if ( jQuery.attrFn ) { + jQuery.attrFn[ name ] = true; + } +}); + + + +/*! + * Sizzle CSS Selector Engine + * Copyright 2011, The Dojo Foundation + * Released under the MIT, BSD, and GPL Licenses. + * More information: http://sizzlejs.com/ + */ +(function(){ + +var chunker = /((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g, + done = 0, + toString = Object.prototype.toString, + hasDuplicate = false, + baseHasDuplicate = true, + rBackslash = /\\/g, + rNonWord = /\W/; + +// Here we check if the JavaScript engine is using some sort of +// optimization where it does not always call our comparision +// function. If that is the case, discard the hasDuplicate value. +// Thus far that includes Google Chrome. +[0, 0].sort(function() { + baseHasDuplicate = false; + return 0; +}); + +var Sizzle = function( selector, context, results, seed ) { + results = results || []; + context = context || document; + + var origContext = context; + + if ( context.nodeType !== 1 && context.nodeType !== 9 ) { + return []; + } + + if ( !selector || typeof selector !== "string" ) { + return results; + } + + var m, set, checkSet, extra, ret, cur, pop, i, + prune = true, + contextXML = Sizzle.isXML( context ), + parts = [], + soFar = selector; + + // Reset the position of the chunker regexp (start from head) + do { + chunker.exec( "" ); + m = chunker.exec( soFar ); + + if ( m ) { + soFar = m[3]; + + parts.push( m[1] ); + + if ( m[2] ) { + extra = m[3]; + break; + } + } + } while ( m ); + + if ( parts.length > 1 && origPOS.exec( selector ) ) { + + if ( parts.length === 2 && Expr.relative[ parts[0] ] ) { + set = posProcess( parts[0] + parts[1], context ); + + } else { + set = Expr.relative[ parts[0] ] ? + [ context ] : + Sizzle( parts.shift(), context ); + + while ( parts.length ) { + selector = parts.shift(); + + if ( Expr.relative[ selector ] ) { + selector += parts.shift(); + } + + set = posProcess( selector, set ); + } + } + + } else { + // Take a shortcut and set the context if the root selector is an ID + // (but not if it'll be faster if the inner selector is an ID) + if ( !seed && parts.length > 1 && context.nodeType === 9 && !contextXML && + Expr.match.ID.test(parts[0]) && !Expr.match.ID.test(parts[parts.length - 1]) ) { + + ret = Sizzle.find( parts.shift(), context, contextXML ); + context = ret.expr ? + Sizzle.filter( ret.expr, ret.set )[0] : + ret.set[0]; + } + + if ( context ) { + ret = seed ? + { expr: parts.pop(), set: makeArray(seed) } : + Sizzle.find( parts.pop(), parts.length === 1 && (parts[0] === "~" || parts[0] === "+") && context.parentNode ? context.parentNode : context, contextXML ); + + set = ret.expr ? + Sizzle.filter( ret.expr, ret.set ) : + ret.set; + + if ( parts.length > 0 ) { + checkSet = makeArray( set ); + + } else { + prune = false; + } + + while ( parts.length ) { + cur = parts.pop(); + pop = cur; + + if ( !Expr.relative[ cur ] ) { + cur = ""; + } else { + pop = parts.pop(); + } + + if ( pop == null ) { + pop = context; + } + + Expr.relative[ cur ]( checkSet, pop, contextXML ); + } + + } else { + checkSet = parts = []; + } + } + + if ( !checkSet ) { + checkSet = set; + } + + if ( !checkSet ) { + Sizzle.error( cur || selector ); + } + + if ( toString.call(checkSet) === "[object Array]" ) { + if ( !prune ) { + results.push.apply( results, checkSet ); + + } else if ( context && context.nodeType === 1 ) { + for ( i = 0; checkSet[i] != null; i++ ) { + if ( checkSet[i] && (checkSet[i] === true || checkSet[i].nodeType === 1 && Sizzle.contains(context, checkSet[i])) ) { + results.push( set[i] ); + } + } + + } else { + for ( i = 0; checkSet[i] != null; i++ ) { + if ( checkSet[i] && checkSet[i].nodeType === 1 ) { + results.push( set[i] ); + } + } + } + + } else { + makeArray( checkSet, results ); + } + + if ( extra ) { + Sizzle( extra, origContext, results, seed ); + Sizzle.uniqueSort( results ); + } + + return results; +}; + +Sizzle.uniqueSort = function( results ) { + if ( sortOrder ) { + hasDuplicate = baseHasDuplicate; + results.sort( sortOrder ); + + if ( hasDuplicate ) { + for ( var i = 1; i < results.length; i++ ) { + if ( results[i] === results[ i - 1 ] ) { + results.splice( i--, 1 ); + } + } + } + } + + return results; +}; + +Sizzle.matches = function( expr, set ) { + return Sizzle( expr, null, null, set ); +}; + +Sizzle.matchesSelector = function( node, expr ) { + return Sizzle( expr, null, null, [node] ).length > 0; +}; + +Sizzle.find = function( expr, context, isXML ) { + var set; + + if ( !expr ) { + return []; + } + + for ( var i = 0, l = Expr.order.length; i < l; i++ ) { + var match, + type = Expr.order[i]; + + if ( (match = Expr.leftMatch[ type ].exec( expr )) ) { + var left = match[1]; + match.splice( 1, 1 ); + + if ( left.substr( left.length - 1 ) !== "\\" ) { + match[1] = (match[1] || "").replace( rBackslash, "" ); + set = Expr.find[ type ]( match, context, isXML ); + + if ( set != null ) { + expr = expr.replace( Expr.match[ type ], "" ); + break; + } + } + } + } + + if ( !set ) { + set = typeof context.getElementsByTagName !== "undefined" ? + context.getElementsByTagName( "*" ) : + []; + } + + return { set: set, expr: expr }; +}; + +Sizzle.filter = function( expr, set, inplace, not ) { + var match, anyFound, + old = expr, + result = [], + curLoop = set, + isXMLFilter = set && set[0] && Sizzle.isXML( set[0] ); + + while ( expr && set.length ) { + for ( var type in Expr.filter ) { + if ( (match = Expr.leftMatch[ type ].exec( expr )) != null && match[2] ) { + var found, item, + filter = Expr.filter[ type ], + left = match[1]; + + anyFound = false; + + match.splice(1,1); + + if ( left.substr( left.length - 1 ) === "\\" ) { + continue; + } + + if ( curLoop === result ) { + result = []; + } + + if ( Expr.preFilter[ type ] ) { + match = Expr.preFilter[ type ]( match, curLoop, inplace, result, not, isXMLFilter ); + + if ( !match ) { + anyFound = found = true; + + } else if ( match === true ) { + continue; + } + } + + if ( match ) { + for ( var i = 0; (item = curLoop[i]) != null; i++ ) { + if ( item ) { + found = filter( item, match, i, curLoop ); + var pass = not ^ !!found; + + if ( inplace && found != null ) { + if ( pass ) { + anyFound = true; + + } else { + curLoop[i] = false; + } + + } else if ( pass ) { + result.push( item ); + anyFound = true; + } + } + } + } + + if ( found !== undefined ) { + if ( !inplace ) { + curLoop = result; + } + + expr = expr.replace( Expr.match[ type ], "" ); + + if ( !anyFound ) { + return []; + } + + break; + } + } + } + + // Improper expression + if ( expr === old ) { + if ( anyFound == null ) { + Sizzle.error( expr ); + + } else { + break; + } + } + + old = expr; + } + + return curLoop; +}; + +Sizzle.error = function( msg ) { + throw "Syntax error, unrecognized expression: " + msg; +}; + +var Expr = Sizzle.selectors = { + order: [ "ID", "NAME", "TAG" ], + + match: { + ID: /#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/, + CLASS: /\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/, + NAME: /\[name=['"]*((?:[\w\u00c0-\uFFFF\-]|\\.)+)['"]*\]/, + ATTR: /\[\s*((?:[\w\u00c0-\uFFFF\-]|\\.)+)\s*(?:(\S?=)\s*(?:(['"])(.*?)\3|(#?(?:[\w\u00c0-\uFFFF\-]|\\.)*)|)|)\s*\]/, + TAG: /^((?:[\w\u00c0-\uFFFF\*\-]|\\.)+)/, + CHILD: /:(only|nth|last|first)-child(?:\(\s*(even|odd|(?:[+\-]?\d+|(?:[+\-]?\d*)?n\s*(?:[+\-]\s*\d+)?))\s*\))?/, + POS: /:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^\-]|$)/, + PSEUDO: /:((?:[\w\u00c0-\uFFFF\-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/ + }, + + leftMatch: {}, + + attrMap: { + "class": "className", + "for": "htmlFor" + }, + + attrHandle: { + href: function( elem ) { + return elem.getAttribute( "href" ); + }, + type: function( elem ) { + return elem.getAttribute( "type" ); + } + }, + + relative: { + "+": function(checkSet, part){ + var isPartStr = typeof part === "string", + isTag = isPartStr && !rNonWord.test( part ), + isPartStrNotTag = isPartStr && !isTag; + + if ( isTag ) { + part = part.toLowerCase(); + } + + for ( var i = 0, l = checkSet.length, elem; i < l; i++ ) { + if ( (elem = checkSet[i]) ) { + while ( (elem = elem.previousSibling) && elem.nodeType !== 1 ) {} + + checkSet[i] = isPartStrNotTag || elem && elem.nodeName.toLowerCase() === part ? + elem || false : + elem === part; + } + } + + if ( isPartStrNotTag ) { + Sizzle.filter( part, checkSet, true ); + } + }, + + ">": function( checkSet, part ) { + var elem, + isPartStr = typeof part === "string", + i = 0, + l = checkSet.length; + + if ( isPartStr && !rNonWord.test( part ) ) { + part = part.toLowerCase(); + + for ( ; i < l; i++ ) { + elem = checkSet[i]; + + if ( elem ) { + var parent = elem.parentNode; + checkSet[i] = parent.nodeName.toLowerCase() === part ? parent : false; + } + } + + } else { + for ( ; i < l; i++ ) { + elem = checkSet[i]; + + if ( elem ) { + checkSet[i] = isPartStr ? + elem.parentNode : + elem.parentNode === part; + } + } + + if ( isPartStr ) { + Sizzle.filter( part, checkSet, true ); + } + } + }, + + "": function(checkSet, part, isXML){ + var nodeCheck, + doneName = done++, + checkFn = dirCheck; + + if ( typeof part === "string" && !rNonWord.test( part ) ) { + part = part.toLowerCase(); + nodeCheck = part; + checkFn = dirNodeCheck; + } + + checkFn( "parentNode", part, doneName, checkSet, nodeCheck, isXML ); + }, + + "~": function( checkSet, part, isXML ) { + var nodeCheck, + doneName = done++, + checkFn = dirCheck; + + if ( typeof part === "string" && !rNonWord.test( part ) ) { + part = part.toLowerCase(); + nodeCheck = part; + checkFn = dirNodeCheck; + } + + checkFn( "previousSibling", part, doneName, checkSet, nodeCheck, isXML ); + } + }, + + find: { + ID: function( match, context, isXML ) { + if ( typeof context.getElementById !== "undefined" && !isXML ) { + var m = context.getElementById(match[1]); + // Check parentNode to catch when Blackberry 4.6 returns + // nodes that are no longer in the document #6963 + return m && m.parentNode ? [m] : []; + } + }, + + NAME: function( match, context ) { + if ( typeof context.getElementsByName !== "undefined" ) { + var ret = [], + results = context.getElementsByName( match[1] ); + + for ( var i = 0, l = results.length; i < l; i++ ) { + if ( results[i].getAttribute("name") === match[1] ) { + ret.push( results[i] ); + } + } + + return ret.length === 0 ? null : ret; + } + }, + + TAG: function( match, context ) { + if ( typeof context.getElementsByTagName !== "undefined" ) { + return context.getElementsByTagName( match[1] ); + } + } + }, + preFilter: { + CLASS: function( match, curLoop, inplace, result, not, isXML ) { + match = " " + match[1].replace( rBackslash, "" ) + " "; + + if ( isXML ) { + return match; + } + + for ( var i = 0, elem; (elem = curLoop[i]) != null; i++ ) { + if ( elem ) { + if ( not ^ (elem.className && (" " + elem.className + " ").replace(/[\t\n\r]/g, " ").indexOf(match) >= 0) ) { + if ( !inplace ) { + result.push( elem ); + } + + } else if ( inplace ) { + curLoop[i] = false; + } + } + } + + return false; + }, + + ID: function( match ) { + return match[1].replace( rBackslash, "" ); + }, + + TAG: function( match, curLoop ) { + return match[1].replace( rBackslash, "" ).toLowerCase(); + }, + + CHILD: function( match ) { + if ( match[1] === "nth" ) { + if ( !match[2] ) { + Sizzle.error( match[0] ); + } + + match[2] = match[2].replace(/^\+|\s*/g, ''); + + // parse equations like 'even', 'odd', '5', '2n', '3n+2', '4n-1', '-n+6' + var test = /(-?)(\d*)(?:n([+\-]?\d*))?/.exec( + match[2] === "even" && "2n" || match[2] === "odd" && "2n+1" || + !/\D/.test( match[2] ) && "0n+" + match[2] || match[2]); + + // calculate the numbers (first)n+(last) including if they are negative + match[2] = (test[1] + (test[2] || 1)) - 0; + match[3] = test[3] - 0; + } + else if ( match[2] ) { + Sizzle.error( match[0] ); + } + + // TODO: Move to normal caching system + match[0] = done++; + + return match; + }, + + ATTR: function( match, curLoop, inplace, result, not, isXML ) { + var name = match[1] = match[1].replace( rBackslash, "" ); + + if ( !isXML && Expr.attrMap[name] ) { + match[1] = Expr.attrMap[name]; + } + + // Handle if an un-quoted value was used + match[4] = ( match[4] || match[5] || "" ).replace( rBackslash, "" ); + + if ( match[2] === "~=" ) { + match[4] = " " + match[4] + " "; + } + + return match; + }, + + PSEUDO: function( match, curLoop, inplace, result, not ) { + if ( match[1] === "not" ) { + // If we're dealing with a complex expression, or a simple one + if ( ( chunker.exec(match[3]) || "" ).length > 1 || /^\w/.test(match[3]) ) { + match[3] = Sizzle(match[3], null, null, curLoop); + + } else { + var ret = Sizzle.filter(match[3], curLoop, inplace, true ^ not); + + if ( !inplace ) { + result.push.apply( result, ret ); + } + + return false; + } + + } else if ( Expr.match.POS.test( match[0] ) || Expr.match.CHILD.test( match[0] ) ) { + return true; + } + + return match; + }, + + POS: function( match ) { + match.unshift( true ); + + return match; + } + }, + + filters: { + enabled: function( elem ) { + return elem.disabled === false && elem.type !== "hidden"; + }, + + disabled: function( elem ) { + return elem.disabled === true; + }, + + checked: function( elem ) { + return elem.checked === true; + }, + + selected: function( elem ) { + // Accessing this property makes selected-by-default + // options in Safari work properly + if ( elem.parentNode ) { + elem.parentNode.selectedIndex; + } + + return elem.selected === true; + }, + + parent: function( elem ) { + return !!elem.firstChild; + }, + + empty: function( elem ) { + return !elem.firstChild; + }, + + has: function( elem, i, match ) { + return !!Sizzle( match[3], elem ).length; + }, + + header: function( elem ) { + return (/h\d/i).test( elem.nodeName ); + }, + + text: function( elem ) { + var attr = elem.getAttribute( "type" ), type = elem.type; + // IE6 and 7 will map elem.type to 'text' for new HTML5 types (search, etc) + // use getAttribute instead to test this case + return elem.nodeName.toLowerCase() === "input" && "text" === type && ( attr === type || attr === null ); + }, + + radio: function( elem ) { + return elem.nodeName.toLowerCase() === "input" && "radio" === elem.type; + }, + + checkbox: function( elem ) { + return elem.nodeName.toLowerCase() === "input" && "checkbox" === elem.type; + }, + + file: function( elem ) { + return elem.nodeName.toLowerCase() === "input" && "file" === elem.type; + }, + + password: function( elem ) { + return elem.nodeName.toLowerCase() === "input" && "password" === elem.type; + }, + + submit: function( elem ) { + var name = elem.nodeName.toLowerCase(); + return (name === "input" || name === "button") && "submit" === elem.type; + }, + + image: function( elem ) { + return elem.nodeName.toLowerCase() === "input" && "image" === elem.type; + }, + + reset: function( elem ) { + var name = elem.nodeName.toLowerCase(); + return (name === "input" || name === "button") && "reset" === elem.type; + }, + + button: function( elem ) { + var name = elem.nodeName.toLowerCase(); + return name === "input" && "button" === elem.type || name === "button"; + }, + + input: function( elem ) { + return (/input|select|textarea|button/i).test( elem.nodeName ); + }, + + focus: function( elem ) { + return elem === elem.ownerDocument.activeElement; + } + }, + setFilters: { + first: function( elem, i ) { + return i === 0; + }, + + last: function( elem, i, match, array ) { + return i === array.length - 1; + }, + + even: function( elem, i ) { + return i % 2 === 0; + }, + + odd: function( elem, i ) { + return i % 2 === 1; + }, + + lt: function( elem, i, match ) { + return i < match[3] - 0; + }, + + gt: function( elem, i, match ) { + return i > match[3] - 0; + }, + + nth: function( elem, i, match ) { + return match[3] - 0 === i; + }, + + eq: function( elem, i, match ) { + return match[3] - 0 === i; + } + }, + filter: { + PSEUDO: function( elem, match, i, array ) { + var name = match[1], + filter = Expr.filters[ name ]; + + if ( filter ) { + return filter( elem, i, match, array ); + + } else if ( name === "contains" ) { + return (elem.textContent || elem.innerText || Sizzle.getText([ elem ]) || "").indexOf(match[3]) >= 0; + + } else if ( name === "not" ) { + var not = match[3]; + + for ( var j = 0, l = not.length; j < l; j++ ) { + if ( not[j] === elem ) { + return false; + } + } + + return true; + + } else { + Sizzle.error( name ); + } + }, + + CHILD: function( elem, match ) { + var type = match[1], + node = elem; + + switch ( type ) { + case "only": + case "first": + while ( (node = node.previousSibling) ) { + if ( node.nodeType === 1 ) { + return false; + } + } + + if ( type === "first" ) { + return true; + } + + node = elem; + + case "last": + while ( (node = node.nextSibling) ) { + if ( node.nodeType === 1 ) { + return false; + } + } + + return true; + + case "nth": + var first = match[2], + last = match[3]; + + if ( first === 1 && last === 0 ) { + return true; + } + + var doneName = match[0], + parent = elem.parentNode; + + if ( parent && (parent.sizcache !== doneName || !elem.nodeIndex) ) { + var count = 0; + + for ( node = parent.firstChild; node; node = node.nextSibling ) { + if ( node.nodeType === 1 ) { + node.nodeIndex = ++count; + } + } + + parent.sizcache = doneName; + } + + var diff = elem.nodeIndex - last; + + if ( first === 0 ) { + return diff === 0; + + } else { + return ( diff % first === 0 && diff / first >= 0 ); + } + } + }, + + ID: function( elem, match ) { + return elem.nodeType === 1 && elem.getAttribute("id") === match; + }, + + TAG: function( elem, match ) { + return (match === "*" && elem.nodeType === 1) || elem.nodeName.toLowerCase() === match; + }, + + CLASS: function( elem, match ) { + return (" " + (elem.className || elem.getAttribute("class")) + " ") + .indexOf( match ) > -1; + }, + + ATTR: function( elem, match ) { + var name = match[1], + result = Expr.attrHandle[ name ] ? + Expr.attrHandle[ name ]( elem ) : + elem[ name ] != null ? + elem[ name ] : + elem.getAttribute( name ), + value = result + "", + type = match[2], + check = match[4]; + + return result == null ? + type === "!=" : + type === "=" ? + value === check : + type === "*=" ? + value.indexOf(check) >= 0 : + type === "~=" ? + (" " + value + " ").indexOf(check) >= 0 : + !check ? + value && result !== false : + type === "!=" ? + value !== check : + type === "^=" ? + value.indexOf(check) === 0 : + type === "$=" ? + value.substr(value.length - check.length) === check : + type === "|=" ? + value === check || value.substr(0, check.length + 1) === check + "-" : + false; + }, + + POS: function( elem, match, i, array ) { + var name = match[2], + filter = Expr.setFilters[ name ]; + + if ( filter ) { + return filter( elem, i, match, array ); + } + } + } +}; + +var origPOS = Expr.match.POS, + fescape = function(all, num){ + return "\\" + (num - 0 + 1); + }; + +for ( var type in Expr.match ) { + Expr.match[ type ] = new RegExp( Expr.match[ type ].source + (/(?![^\[]*\])(?![^\(]*\))/.source) ); + Expr.leftMatch[ type ] = new RegExp( /(^(?:.|\r|\n)*?)/.source + Expr.match[ type ].source.replace(/\\(\d+)/g, fescape) ); +} + +var makeArray = function( array, results ) { + array = Array.prototype.slice.call( array, 0 ); + + if ( results ) { + results.push.apply( results, array ); + return results; + } + + return array; +}; + +// Perform a simple check to determine if the browser is capable of +// converting a NodeList to an array using builtin methods. +// Also verifies that the returned array holds DOM nodes +// (which is not the case in the Blackberry browser) +try { + Array.prototype.slice.call( document.documentElement.childNodes, 0 )[0].nodeType; + +// Provide a fallback method if it does not work +} catch( e ) { + makeArray = function( array, results ) { + var i = 0, + ret = results || []; + + if ( toString.call(array) === "[object Array]" ) { + Array.prototype.push.apply( ret, array ); + + } else { + if ( typeof array.length === "number" ) { + for ( var l = array.length; i < l; i++ ) { + ret.push( array[i] ); + } + + } else { + for ( ; array[i]; i++ ) { + ret.push( array[i] ); + } + } + } + + return ret; + }; +} + +var sortOrder, siblingCheck; + +if ( document.documentElement.compareDocumentPosition ) { + sortOrder = function( a, b ) { + if ( a === b ) { + hasDuplicate = true; + return 0; + } + + if ( !a.compareDocumentPosition || !b.compareDocumentPosition ) { + return a.compareDocumentPosition ? -1 : 1; + } + + return a.compareDocumentPosition(b) & 4 ? -1 : 1; + }; + +} else { + sortOrder = function( a, b ) { + // The nodes are identical, we can exit early + if ( a === b ) { + hasDuplicate = true; + return 0; + + // Fallback to using sourceIndex (in IE) if it's available on both nodes + } else if ( a.sourceIndex && b.sourceIndex ) { + return a.sourceIndex - b.sourceIndex; + } + + var al, bl, + ap = [], + bp = [], + aup = a.parentNode, + bup = b.parentNode, + cur = aup; + + // If the nodes are siblings (or identical) we can do a quick check + if ( aup === bup ) { + return siblingCheck( a, b ); + + // If no parents were found then the nodes are disconnected + } else if ( !aup ) { + return -1; + + } else if ( !bup ) { + return 1; + } + + // Otherwise they're somewhere else in the tree so we need + // to build up a full list of the parentNodes for comparison + while ( cur ) { + ap.unshift( cur ); + cur = cur.parentNode; + } + + cur = bup; + + while ( cur ) { + bp.unshift( cur ); + cur = cur.parentNode; + } + + al = ap.length; + bl = bp.length; + + // Start walking down the tree looking for a discrepancy + for ( var i = 0; i < al && i < bl; i++ ) { + if ( ap[i] !== bp[i] ) { + return siblingCheck( ap[i], bp[i] ); + } + } + + // We ended someplace up the tree so do a sibling check + return i === al ? + siblingCheck( a, bp[i], -1 ) : + siblingCheck( ap[i], b, 1 ); + }; + + siblingCheck = function( a, b, ret ) { + if ( a === b ) { + return ret; + } + + var cur = a.nextSibling; + + while ( cur ) { + if ( cur === b ) { + return -1; + } + + cur = cur.nextSibling; + } + + return 1; + }; +} + +// Utility function for retreiving the text value of an array of DOM nodes +Sizzle.getText = function( elems ) { + var ret = "", elem; + + for ( var i = 0; elems[i]; i++ ) { + elem = elems[i]; + + // Get the text from text nodes and CDATA nodes + if ( elem.nodeType === 3 || elem.nodeType === 4 ) { + ret += elem.nodeValue; + + // Traverse everything else, except comment nodes + } else if ( elem.nodeType !== 8 ) { + ret += Sizzle.getText( elem.childNodes ); + } + } + + return ret; +}; + +// Check to see if the browser returns elements by name when +// querying by getElementById (and provide a workaround) +(function(){ + // We're going to inject a fake input element with a specified name + var form = document.createElement("div"), + id = "script" + (new Date()).getTime(), + root = document.documentElement; + + form.innerHTML = "<a name='" + id + "'/>"; + + // Inject it into the root element, check its status, and remove it quickly + root.insertBefore( form, root.firstChild ); + + // The workaround has to do additional checks after a getElementById + // Which slows things down for other browsers (hence the branching) + if ( document.getElementById( id ) ) { + Expr.find.ID = function( match, context, isXML ) { + if ( typeof context.getElementById !== "undefined" && !isXML ) { + var m = context.getElementById(match[1]); + + return m ? + m.id === match[1] || typeof m.getAttributeNode !== "undefined" && m.getAttributeNode("id").nodeValue === match[1] ? + [m] : + undefined : + []; + } + }; + + Expr.filter.ID = function( elem, match ) { + var node = typeof elem.getAttributeNode !== "undefined" && elem.getAttributeNode("id"); + + return elem.nodeType === 1 && node && node.nodeValue === match; + }; + } + + root.removeChild( form ); + + // release memory in IE + root = form = null; +})(); + +(function(){ + // Check to see if the browser returns only elements + // when doing getElementsByTagName("*") + + // Create a fake element + var div = document.createElement("div"); + div.appendChild( document.createComment("") ); + + // Make sure no comments are found + if ( div.getElementsByTagName("*").length > 0 ) { + Expr.find.TAG = function( match, context ) { + var results = context.getElementsByTagName( match[1] ); + + // Filter out possible comments + if ( match[1] === "*" ) { + var tmp = []; + + for ( var i = 0; results[i]; i++ ) { + if ( results[i].nodeType === 1 ) { + tmp.push( results[i] ); + } + } + + results = tmp; + } + + return results; + }; + } + + // Check to see if an attribute returns normalized href attributes + div.innerHTML = "<a href='#'></a>"; + + if ( div.firstChild && typeof div.firstChild.getAttribute !== "undefined" && + div.firstChild.getAttribute("href") !== "#" ) { + + Expr.attrHandle.href = function( elem ) { + return elem.getAttribute( "href", 2 ); + }; + } + + // release memory in IE + div = null; +})(); + +if ( document.querySelectorAll ) { + (function(){ + var oldSizzle = Sizzle, + div = document.createElement("div"), + id = "__sizzle__"; + + div.innerHTML = "<p class='TEST'></p>"; + + // Safari can't handle uppercase or unicode characters when + // in quirks mode. + if ( div.querySelectorAll && div.querySelectorAll(".TEST").length === 0 ) { + return; + } + + Sizzle = function( query, context, extra, seed ) { + context = context || document; + + // Only use querySelectorAll on non-XML documents + // (ID selectors don't work in non-HTML documents) + if ( !seed && !Sizzle.isXML(context) ) { + // See if we find a selector to speed up + var match = /^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec( query ); + + if ( match && (context.nodeType === 1 || context.nodeType === 9) ) { + // Speed-up: Sizzle("TAG") + if ( match[1] ) { + return makeArray( context.getElementsByTagName( query ), extra ); + + // Speed-up: Sizzle(".CLASS") + } else if ( match[2] && Expr.find.CLASS && context.getElementsByClassName ) { + return makeArray( context.getElementsByClassName( match[2] ), extra ); + } + } + + if ( context.nodeType === 9 ) { + // Speed-up: Sizzle("body") + // The body element only exists once, optimize finding it + if ( query === "body" && context.body ) { + return makeArray( [ context.body ], extra ); + + // Speed-up: Sizzle("#ID") + } else if ( match && match[3] ) { + var elem = context.getElementById( match[3] ); + + // Check parentNode to catch when Blackberry 4.6 returns + // nodes that are no longer in the document #6963 + if ( elem && elem.parentNode ) { + // Handle the case where IE and Opera return items + // by name instead of ID + if ( elem.id === match[3] ) { + return makeArray( [ elem ], extra ); + } + + } else { + return makeArray( [], extra ); + } + } + + try { + return makeArray( context.querySelectorAll(query), extra ); + } catch(qsaError) {} + + // qSA works strangely on Element-rooted queries + // We can work around this by specifying an extra ID on the root + // and working up from there (Thanks to Andrew Dupont for the technique) + // IE 8 doesn't work on object elements + } else if ( context.nodeType === 1 && context.nodeName.toLowerCase() !== "object" ) { + var oldContext = context, + old = context.getAttribute( "id" ), + nid = old || id, + hasParent = context.parentNode, + relativeHierarchySelector = /^\s*[+~]/.test( query ); + + if ( !old ) { + context.setAttribute( "id", nid ); + } else { + nid = nid.replace( /'/g, "\\$&" ); + } + if ( relativeHierarchySelector && hasParent ) { + context = context.parentNode; + } + + try { + if ( !relativeHierarchySelector || hasParent ) { + return makeArray( context.querySelectorAll( "[id='" + nid + "'] " + query ), extra ); + } + + } catch(pseudoError) { + } finally { + if ( !old ) { + oldContext.removeAttribute( "id" ); + } + } + } + } + + return oldSizzle(query, context, extra, seed); + }; + + for ( var prop in oldSizzle ) { + Sizzle[ prop ] = oldSizzle[ prop ]; + } + + // release memory in IE + div = null; + })(); +} + +(function(){ + var html = document.documentElement, + matches = html.matchesSelector || html.mozMatchesSelector || html.webkitMatchesSelector || html.msMatchesSelector; + + if ( matches ) { + // Check to see if it's possible to do matchesSelector + // on a disconnected node (IE 9 fails this) + var disconnectedMatch = !matches.call( document.createElement( "div" ), "div" ), + pseudoWorks = false; + + try { + // This should fail with an exception + // Gecko does not error, returns false instead + matches.call( document.documentElement, "[test!='']:sizzle" ); + + } catch( pseudoError ) { + pseudoWorks = true; + } + + Sizzle.matchesSelector = function( node, expr ) { + // Make sure that attribute selectors are quoted + expr = expr.replace(/\=\s*([^'"\]]*)\s*\]/g, "='$1']"); + + if ( !Sizzle.isXML( node ) ) { + try { + if ( pseudoWorks || !Expr.match.PSEUDO.test( expr ) && !/!=/.test( expr ) ) { + var ret = matches.call( node, expr ); + + // IE 9's matchesSelector returns false on disconnected nodes + if ( ret || !disconnectedMatch || + // As well, disconnected nodes are said to be in a document + // fragment in IE 9, so check for that + node.document && node.document.nodeType !== 11 ) { + return ret; + } + } + } catch(e) {} + } + + return Sizzle(expr, null, null, [node]).length > 0; + }; + } +})(); + +(function(){ + var div = document.createElement("div"); + + div.innerHTML = "<div class='test e'></div><div class='test'></div>"; + + // Opera can't find a second classname (in 9.6) + // Also, make sure that getElementsByClassName actually exists + if ( !div.getElementsByClassName || div.getElementsByClassName("e").length === 0 ) { + return; + } + + // Safari caches class attributes, doesn't catch changes (in 3.2) + div.lastChild.className = "e"; + + if ( div.getElementsByClassName("e").length === 1 ) { + return; + } + + Expr.order.splice(1, 0, "CLASS"); + Expr.find.CLASS = function( match, context, isXML ) { + if ( typeof context.getElementsByClassName !== "undefined" && !isXML ) { + return context.getElementsByClassName(match[1]); + } + }; + + // release memory in IE + div = null; +})(); + +function dirNodeCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) { + for ( var i = 0, l = checkSet.length; i < l; i++ ) { + var elem = checkSet[i]; + + if ( elem ) { + var match = false; + + elem = elem[dir]; + + while ( elem ) { + if ( elem.sizcache === doneName ) { + match = checkSet[elem.sizset]; + break; + } + + if ( elem.nodeType === 1 && !isXML ){ + elem.sizcache = doneName; + elem.sizset = i; + } + + if ( elem.nodeName.toLowerCase() === cur ) { + match = elem; + break; + } + + elem = elem[dir]; + } + + checkSet[i] = match; + } + } +} + +function dirCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) { + for ( var i = 0, l = checkSet.length; i < l; i++ ) { + var elem = checkSet[i]; + + if ( elem ) { + var match = false; + + elem = elem[dir]; + + while ( elem ) { + if ( elem.sizcache === doneName ) { + match = checkSet[elem.sizset]; + break; + } + + if ( elem.nodeType === 1 ) { + if ( !isXML ) { + elem.sizcache = doneName; + elem.sizset = i; + } + + if ( typeof cur !== "string" ) { + if ( elem === cur ) { + match = true; + break; + } + + } else if ( Sizzle.filter( cur, [elem] ).length > 0 ) { + match = elem; + break; + } + } + + elem = elem[dir]; + } + + checkSet[i] = match; + } + } +} + +if ( document.documentElement.contains ) { + Sizzle.contains = function( a, b ) { + return a !== b && (a.contains ? a.contains(b) : true); + }; + +} else if ( document.documentElement.compareDocumentPosition ) { + Sizzle.contains = function( a, b ) { + return !!(a.compareDocumentPosition(b) & 16); + }; + +} else { + Sizzle.contains = function() { + return false; + }; +} + +Sizzle.isXML = function( elem ) { + // documentElement is verified for cases where it doesn't yet exist + // (such as loading iframes in IE - #4833) + var documentElement = (elem ? elem.ownerDocument || elem : 0).documentElement; + + return documentElement ? documentElement.nodeName !== "HTML" : false; +}; + +var posProcess = function( selector, context ) { + var match, + tmpSet = [], + later = "", + root = context.nodeType ? [context] : context; + + // Position selectors must be done after the filter + // And so must :not(positional) so we move all PSEUDOs to the end + while ( (match = Expr.match.PSEUDO.exec( selector )) ) { + later += match[0]; + selector = selector.replace( Expr.match.PSEUDO, "" ); + } + + selector = Expr.relative[selector] ? selector + "*" : selector; + + for ( var i = 0, l = root.length; i < l; i++ ) { + Sizzle( selector, root[i], tmpSet ); + } + + return Sizzle.filter( later, tmpSet ); +}; + +// EXPOSE +jQuery.find = Sizzle; +jQuery.expr = Sizzle.selectors; +jQuery.expr[":"] = jQuery.expr.filters; +jQuery.unique = Sizzle.uniqueSort; +jQuery.text = Sizzle.getText; +jQuery.isXMLDoc = Sizzle.isXML; +jQuery.contains = Sizzle.contains; + + +})(); + + +var runtil = /Until$/, + rparentsprev = /^(?:parents|prevUntil|prevAll)/, + // Note: This RegExp should be improved, or likely pulled from Sizzle + rmultiselector = /,/, + isSimple = /^.[^:#\[\.,]*$/, + slice = Array.prototype.slice, + POS = jQuery.expr.match.POS, + // methods guaranteed to produce a unique set when starting from a unique set + guaranteedUnique = { + children: true, + contents: true, + next: true, + prev: true + }; + +jQuery.fn.extend({ + find: function( selector ) { + var self = this, + i, l; + + if ( typeof selector !== "string" ) { + return jQuery( selector ).filter(function() { + for ( i = 0, l = self.length; i < l; i++ ) { + if ( jQuery.contains( self[ i ], this ) ) { + return true; + } + } + }); + } + + var ret = this.pushStack( "", "find", selector ), + length, n, r; + + for ( i = 0, l = this.length; i < l; i++ ) { + length = ret.length; + jQuery.find( selector, this[i], ret ); + + if ( i > 0 ) { + // Make sure that the results are unique + for ( n = length; n < ret.length; n++ ) { + for ( r = 0; r < length; r++ ) { + if ( ret[r] === ret[n] ) { + ret.splice(n--, 1); + break; + } + } + } + } + } + + return ret; + }, + + has: function( target ) { + var targets = jQuery( target ); + return this.filter(function() { + for ( var i = 0, l = targets.length; i < l; i++ ) { + if ( jQuery.contains( this, targets[i] ) ) { + return true; + } + } + }); + }, + + not: function( selector ) { + return this.pushStack( winnow(this, selector, false), "not", selector); + }, + + filter: function( selector ) { + return this.pushStack( winnow(this, selector, true), "filter", selector ); + }, + + is: function( selector ) { + return !!selector && ( typeof selector === "string" ? + jQuery.filter( selector, this ).length > 0 : + this.filter( selector ).length > 0 ); + }, + + closest: function( selectors, context ) { + var ret = [], i, l, cur = this[0]; + + // Array + if ( jQuery.isArray( selectors ) ) { + var match, selector, + matches = {}, + level = 1; + + if ( cur && selectors.length ) { + for ( i = 0, l = selectors.length; i < l; i++ ) { + selector = selectors[i]; + + if ( !matches[ selector ] ) { + matches[ selector ] = POS.test( selector ) ? + jQuery( selector, context || this.context ) : + selector; + } + } + + while ( cur && cur.ownerDocument && cur !== context ) { + for ( selector in matches ) { + match = matches[ selector ]; + + if ( match.jquery ? match.index( cur ) > -1 : jQuery( cur ).is( match ) ) { + ret.push({ selector: selector, elem: cur, level: level }); + } + } + + cur = cur.parentNode; + level++; + } + } + + return ret; + } + + // String + var pos = POS.test( selectors ) || typeof selectors !== "string" ? + jQuery( selectors, context || this.context ) : + 0; + + for ( i = 0, l = this.length; i < l; i++ ) { + cur = this[i]; + + while ( cur ) { + if ( pos ? pos.index(cur) > -1 : jQuery.find.matchesSelector(cur, selectors) ) { + ret.push( cur ); + break; + + } else { + cur = cur.parentNode; + if ( !cur || !cur.ownerDocument || cur === context || cur.nodeType === 11 ) { + break; + } + } + } + } + + ret = ret.length > 1 ? jQuery.unique( ret ) : ret; + + return this.pushStack( ret, "closest", selectors ); + }, + + // Determine the position of an element within + // the matched set of elements + index: function( elem ) { + + // No argument, return index in parent + if ( !elem ) { + return ( this[0] && this[0].parentNode ) ? this.prevAll().length : -1; + } + + // index in selector + if ( typeof elem === "string" ) { + return jQuery.inArray( this[0], jQuery( elem ) ); + } + + // Locate the position of the desired element + return jQuery.inArray( + // If it receives a jQuery object, the first element is used + elem.jquery ? elem[0] : elem, this ); + }, + + add: function( selector, context ) { + var set = typeof selector === "string" ? + jQuery( selector, context ) : + jQuery.makeArray( selector && selector.nodeType ? [ selector ] : selector ), + all = jQuery.merge( this.get(), set ); + + return this.pushStack( isDisconnected( set[0] ) || isDisconnected( all[0] ) ? + all : + jQuery.unique( all ) ); + }, + + andSelf: function() { + return this.add( this.prevObject ); + } +}); + +// A painfully simple check to see if an element is disconnected +// from a document (should be improved, where feasible). +function isDisconnected( node ) { + return !node || !node.parentNode || node.parentNode.nodeType === 11; +} + +jQuery.each({ + parent: function( elem ) { + var parent = elem.parentNode; + return parent && parent.nodeType !== 11 ? parent : null; + }, + parents: function( elem ) { + return jQuery.dir( elem, "parentNode" ); + }, + parentsUntil: function( elem, i, until ) { + return jQuery.dir( elem, "parentNode", until ); + }, + next: function( elem ) { + return jQuery.nth( elem, 2, "nextSibling" ); + }, + prev: function( elem ) { + return jQuery.nth( elem, 2, "previousSibling" ); + }, + nextAll: function( elem ) { + return jQuery.dir( elem, "nextSibling" ); + }, + prevAll: function( elem ) { + return jQuery.dir( elem, "previousSibling" ); + }, + nextUntil: function( elem, i, until ) { + return jQuery.dir( elem, "nextSibling", until ); + }, + prevUntil: function( elem, i, until ) { + return jQuery.dir( elem, "previousSibling", until ); + }, + siblings: function( elem ) { + return jQuery.sibling( elem.parentNode.firstChild, elem ); + }, + children: function( elem ) { + return jQuery.sibling( elem.firstChild ); + }, + contents: function( elem ) { + return jQuery.nodeName( elem, "iframe" ) ? + elem.contentDocument || elem.contentWindow.document : + jQuery.makeArray( elem.childNodes ); + } +}, function( name, fn ) { + jQuery.fn[ name ] = function( until, selector ) { + var ret = jQuery.map( this, fn, until ), + // The variable 'args' was introduced in + // https://github.com/jquery/jquery/commit/52a0238 + // to work around a bug in Chrome 10 (Dev) and should be removed when the bug is fixed. + // http://code.google.com/p/v8/issues/detail?id=1050 + args = slice.call(arguments); + + if ( !runtil.test( name ) ) { + selector = until; + } + + if ( selector && typeof selector === "string" ) { + ret = jQuery.filter( selector, ret ); + } + + ret = this.length > 1 && !guaranteedUnique[ name ] ? jQuery.unique( ret ) : ret; + + if ( (this.length > 1 || rmultiselector.test( selector )) && rparentsprev.test( name ) ) { + ret = ret.reverse(); + } + + return this.pushStack( ret, name, args.join(",") ); + }; +}); + +jQuery.extend({ + filter: function( expr, elems, not ) { + if ( not ) { + expr = ":not(" + expr + ")"; + } + + return elems.length === 1 ? + jQuery.find.matchesSelector(elems[0], expr) ? [ elems[0] ] : [] : + jQuery.find.matches(expr, elems); + }, + + dir: function( elem, dir, until ) { + var matched = [], + cur = elem[ dir ]; + + while ( cur && cur.nodeType !== 9 && (until === undefined || cur.nodeType !== 1 || !jQuery( cur ).is( until )) ) { + if ( cur.nodeType === 1 ) { + matched.push( cur ); + } + cur = cur[dir]; + } + return matched; + }, + + nth: function( cur, result, dir, elem ) { + result = result || 1; + var num = 0; + + for ( ; cur; cur = cur[dir] ) { + if ( cur.nodeType === 1 && ++num === result ) { + break; + } + } + + return cur; + }, + + sibling: function( n, elem ) { + var r = []; + + for ( ; n; n = n.nextSibling ) { + if ( n.nodeType === 1 && n !== elem ) { + r.push( n ); + } + } + + return r; + } +}); + +// Implement the identical functionality for filter and not +function winnow( elements, qualifier, keep ) { + + // Can't pass null or undefined to indexOf in Firefox 4 + // Set to 0 to skip string check + qualifier = qualifier || 0; + + if ( jQuery.isFunction( qualifier ) ) { + return jQuery.grep(elements, function( elem, i ) { + var retVal = !!qualifier.call( elem, i, elem ); + return retVal === keep; + }); + + } else if ( qualifier.nodeType ) { + return jQuery.grep(elements, function( elem, i ) { + return (elem === qualifier) === keep; + }); + + } else if ( typeof qualifier === "string" ) { + var filtered = jQuery.grep(elements, function( elem ) { + return elem.nodeType === 1; + }); + + if ( isSimple.test( qualifier ) ) { + return jQuery.filter(qualifier, filtered, !keep); + } else { + qualifier = jQuery.filter( qualifier, filtered ); + } + } + + return jQuery.grep(elements, function( elem, i ) { + return (jQuery.inArray( elem, qualifier ) >= 0) === keep; + }); +} + + + + +var rinlinejQuery = / jQuery\d+="(?:\d+|null)"/g, + rleadingWhitespace = /^\s+/, + rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig, + rtagName = /<([\w:]+)/, + rtbody = /<tbody/i, + rhtml = /<|&#?\w+;/, + rnocache = /<(?:script|object|embed|option|style)/i, + // checked="checked" or checked + rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i, + rscriptType = /\/(java|ecma)script/i, + rcleanScript = /^\s*<!(?:\[CDATA\[|\-\-)/, + wrapMap = { + option: [ 1, "<select multiple='multiple'>", "</select>" ], + legend: [ 1, "<fieldset>", "</fieldset>" ], + thead: [ 1, "<table>", "</table>" ], + tr: [ 2, "<table><tbody>", "</tbody></table>" ], + td: [ 3, "<table><tbody><tr>", "</tr></tbody></table>" ], + col: [ 2, "<table><tbody></tbody><colgroup>", "</colgroup></table>" ], + area: [ 1, "<map>", "</map>" ], + _default: [ 0, "", "" ] + }; + +wrapMap.optgroup = wrapMap.option; +wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; +wrapMap.th = wrapMap.td; + +// IE can't serialize <link> and <script> tags normally +if ( !jQuery.support.htmlSerialize ) { + wrapMap._default = [ 1, "div<div>", "</div>" ]; +} + +jQuery.fn.extend({ + text: function( text ) { + if ( jQuery.isFunction(text) ) { + return this.each(function(i) { + var self = jQuery( this ); + + self.text( text.call(this, i, self.text()) ); + }); + } + + if ( typeof text !== "object" && text !== undefined ) { + return this.empty().append( (this[0] && this[0].ownerDocument || document).createTextNode( text ) ); + } + + return jQuery.text( this ); + }, + + wrapAll: function( html ) { + if ( jQuery.isFunction( html ) ) { + return this.each(function(i) { + jQuery(this).wrapAll( html.call(this, i) ); + }); + } + + if ( this[0] ) { + // The elements to wrap the target around + var wrap = jQuery( html, this[0].ownerDocument ).eq(0).clone(true); + + if ( this[0].parentNode ) { + wrap.insertBefore( this[0] ); + } + + wrap.map(function() { + var elem = this; + + while ( elem.firstChild && elem.firstChild.nodeType === 1 ) { + elem = elem.firstChild; + } + + return elem; + }).append( this ); + } + + return this; + }, + + wrapInner: function( html ) { + if ( jQuery.isFunction( html ) ) { + return this.each(function(i) { + jQuery(this).wrapInner( html.call(this, i) ); + }); + } + + return this.each(function() { + var self = jQuery( this ), + contents = self.contents(); + + if ( contents.length ) { + contents.wrapAll( html ); + + } else { + self.append( html ); + } + }); + }, + + wrap: function( html ) { + return this.each(function() { + jQuery( this ).wrapAll( html ); + }); + }, + + unwrap: function() { + return this.parent().each(function() { + if ( !jQuery.nodeName( this, "body" ) ) { + jQuery( this ).replaceWith( this.childNodes ); + } + }).end(); + }, + + append: function() { + return this.domManip(arguments, true, function( elem ) { + if ( this.nodeType === 1 ) { + this.appendChild( elem ); + } + }); + }, + + prepend: function() { + return this.domManip(arguments, true, function( elem ) { + if ( this.nodeType === 1 ) { + this.insertBefore( elem, this.firstChild ); + } + }); + }, + + before: function() { + if ( this[0] && this[0].parentNode ) { + return this.domManip(arguments, false, function( elem ) { + this.parentNode.insertBefore( elem, this ); + }); + } else if ( arguments.length ) { + var set = jQuery(arguments[0]); + set.push.apply( set, this.toArray() ); + return this.pushStack( set, "before", arguments ); + } + }, + + after: function() { + if ( this[0] && this[0].parentNode ) { + return this.domManip(arguments, false, function( elem ) { + this.parentNode.insertBefore( elem, this.nextSibling ); + }); + } else if ( arguments.length ) { + var set = this.pushStack( this, "after", arguments ); + set.push.apply( set, jQuery(arguments[0]).toArray() ); + return set; + } + }, + + // keepData is for internal use only--do not document + remove: function( selector, keepData ) { + for ( var i = 0, elem; (elem = this[i]) != null; i++ ) { + if ( !selector || jQuery.filter( selector, [ elem ] ).length ) { + if ( !keepData && elem.nodeType === 1 ) { + jQuery.cleanData( elem.getElementsByTagName("*") ); + jQuery.cleanData( [ elem ] ); + } + + if ( elem.parentNode ) { + elem.parentNode.removeChild( elem ); + } + } + } + + return this; + }, + + empty: function() { + for ( var i = 0, elem; (elem = this[i]) != null; i++ ) { + // Remove element nodes and prevent memory leaks + if ( elem.nodeType === 1 ) { + jQuery.cleanData( elem.getElementsByTagName("*") ); + } + + // Remove any remaining nodes + while ( elem.firstChild ) { + elem.removeChild( elem.firstChild ); + } + } + + return this; + }, + + clone: function( dataAndEvents, deepDataAndEvents ) { + dataAndEvents = dataAndEvents == null ? false : dataAndEvents; + deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents; + + return this.map( function () { + return jQuery.clone( this, dataAndEvents, deepDataAndEvents ); + }); + }, + + html: function( value ) { + if ( value === undefined ) { + return this[0] && this[0].nodeType === 1 ? + this[0].innerHTML.replace(rinlinejQuery, "") : + null; + + // See if we can take a shortcut and just use innerHTML + } else if ( typeof value === "string" && !rnocache.test( value ) && + (jQuery.support.leadingWhitespace || !rleadingWhitespace.test( value )) && + !wrapMap[ (rtagName.exec( value ) || ["", ""])[1].toLowerCase() ] ) { + + value = value.replace(rxhtmlTag, "<$1></$2>"); + + try { + for ( var i = 0, l = this.length; i < l; i++ ) { + // Remove element nodes and prevent memory leaks + if ( this[i].nodeType === 1 ) { + jQuery.cleanData( this[i].getElementsByTagName("*") ); + this[i].innerHTML = value; + } + } + + // If using innerHTML throws an exception, use the fallback method + } catch(e) { + this.empty().append( value ); + } + + } else if ( jQuery.isFunction( value ) ) { + this.each(function(i){ + var self = jQuery( this ); + + self.html( value.call(this, i, self.html()) ); + }); + + } else { + this.empty().append( value ); + } + + return this; + }, + + replaceWith: function( value ) { + if ( this[0] && this[0].parentNode ) { + // Make sure that the elements are removed from the DOM before they are inserted + // this can help fix replacing a parent with child elements + if ( jQuery.isFunction( value ) ) { + return this.each(function(i) { + var self = jQuery(this), old = self.html(); + self.replaceWith( value.call( this, i, old ) ); + }); + } + + if ( typeof value !== "string" ) { + value = jQuery( value ).detach(); + } + + return this.each(function() { + var next = this.nextSibling, + parent = this.parentNode; + + jQuery( this ).remove(); + + if ( next ) { + jQuery(next).before( value ); + } else { + jQuery(parent).append( value ); + } + }); + } else { + return this.length ? + this.pushStack( jQuery(jQuery.isFunction(value) ? value() : value), "replaceWith", value ) : + this; + } + }, + + detach: function( selector ) { + return this.remove( selector, true ); + }, + + domManip: function( args, table, callback ) { + var results, first, fragment, parent, + value = args[0], + scripts = []; + + // We can't cloneNode fragments that contain checked, in WebKit + if ( !jQuery.support.checkClone && arguments.length === 3 && typeof value === "string" && rchecked.test( value ) ) { + return this.each(function() { + jQuery(this).domManip( args, table, callback, true ); + }); + } + + if ( jQuery.isFunction(value) ) { + return this.each(function(i) { + var self = jQuery(this); + args[0] = value.call(this, i, table ? self.html() : undefined); + self.domManip( args, table, callback ); + }); + } + + if ( this[0] ) { + parent = value && value.parentNode; + + // If we're in a fragment, just use that instead of building a new one + if ( jQuery.support.parentNode && parent && parent.nodeType === 11 && parent.childNodes.length === this.length ) { + results = { fragment: parent }; + + } else { + results = jQuery.buildFragment( args, this, scripts ); + } + + fragment = results.fragment; + + if ( fragment.childNodes.length === 1 ) { + first = fragment = fragment.firstChild; + } else { + first = fragment.firstChild; + } + + if ( first ) { + table = table && jQuery.nodeName( first, "tr" ); + + for ( var i = 0, l = this.length, lastIndex = l - 1; i < l; i++ ) { + callback.call( + table ? + root(this[i], first) : + this[i], + // Make sure that we do not leak memory by inadvertently discarding + // the original fragment (which might have attached data) instead of + // using it; in addition, use the original fragment object for the last + // item instead of first because it can end up being emptied incorrectly + // in certain situations (Bug #8070). + // Fragments from the fragment cache must always be cloned and never used + // in place. + results.cacheable || (l > 1 && i < lastIndex) ? + jQuery.clone( fragment, true, true ) : + fragment + ); + } + } + + if ( scripts.length ) { + jQuery.each( scripts, evalScript ); + } + } + + return this; + } +}); + +function root( elem, cur ) { + return jQuery.nodeName(elem, "table") ? + (elem.getElementsByTagName("tbody")[0] || + elem.appendChild(elem.ownerDocument.createElement("tbody"))) : + elem; +} + +function cloneCopyEvent( src, dest ) { + + if ( dest.nodeType !== 1 || !jQuery.hasData( src ) ) { + return; + } + + var internalKey = jQuery.expando, + oldData = jQuery.data( src ), + curData = jQuery.data( dest, oldData ); + + // Switch to use the internal data object, if it exists, for the next + // stage of data copying + if ( (oldData = oldData[ internalKey ]) ) { + var events = oldData.events; + curData = curData[ internalKey ] = jQuery.extend({}, oldData); + + if ( events ) { + delete curData.handle; + curData.events = {}; + + for ( var type in events ) { + for ( var i = 0, l = events[ type ].length; i < l; i++ ) { + jQuery.event.add( dest, type + ( events[ type ][ i ].namespace ? "." : "" ) + events[ type ][ i ].namespace, events[ type ][ i ], events[ type ][ i ].data ); + } + } + } + } +} + +function cloneFixAttributes( src, dest ) { + var nodeName; + + // We do not need to do anything for non-Elements + if ( dest.nodeType !== 1 ) { + return; + } + + // clearAttributes removes the attributes, which we don't want, + // but also removes the attachEvent events, which we *do* want + if ( dest.clearAttributes ) { + dest.clearAttributes(); + } + + // mergeAttributes, in contrast, only merges back on the + // original attributes, not the events + if ( dest.mergeAttributes ) { + dest.mergeAttributes( src ); + } + + nodeName = dest.nodeName.toLowerCase(); + + // IE6-8 fail to clone children inside object elements that use + // the proprietary classid attribute value (rather than the type + // attribute) to identify the type of content to display + if ( nodeName === "object" ) { + dest.outerHTML = src.outerHTML; + + } else if ( nodeName === "input" && (src.type === "checkbox" || src.type === "radio") ) { + // IE6-8 fails to persist the checked state of a cloned checkbox + // or radio button. Worse, IE6-7 fail to give the cloned element + // a checked appearance if the defaultChecked value isn't also set + if ( src.checked ) { + dest.defaultChecked = dest.checked = src.checked; + } + + // IE6-7 get confused and end up setting the value of a cloned + // checkbox/radio button to an empty string instead of "on" + if ( dest.value !== src.value ) { + dest.value = src.value; + } + + // IE6-8 fails to return the selected option to the default selected + // state when cloning options + } else if ( nodeName === "option" ) { + dest.selected = src.defaultSelected; + + // IE6-8 fails to set the defaultValue to the correct value when + // cloning other types of input fields + } else if ( nodeName === "input" || nodeName === "textarea" ) { + dest.defaultValue = src.defaultValue; + } + + // Event data gets referenced instead of copied if the expando + // gets copied too + dest.removeAttribute( jQuery.expando ); +} + +jQuery.buildFragment = function( args, nodes, scripts ) { + var fragment, cacheable, cacheresults, doc; + + // nodes may contain either an explicit document object, + // a jQuery collection or context object. + // If nodes[0] contains a valid object to assign to doc + if ( nodes && nodes[0] ) { + doc = nodes[0].ownerDocument || nodes[0]; + } + + // Ensure that an attr object doesn't incorrectly stand in as a document object + // Chrome and Firefox seem to allow this to occur and will throw exception + // Fixes #8950 + if ( !doc.createDocumentFragment ) { + doc = document; + } + + // Only cache "small" (1/2 KB) HTML strings that are associated with the main document + // Cloning options loses the selected state, so don't cache them + // IE 6 doesn't like it when you put <object> or <embed> elements in a fragment + // Also, WebKit does not clone 'checked' attributes on cloneNode, so don't cache + if ( args.length === 1 && typeof args[0] === "string" && args[0].length < 512 && doc === document && + args[0].charAt(0) === "<" && !rnocache.test( args[0] ) && (jQuery.support.checkClone || !rchecked.test( args[0] )) ) { + + cacheable = true; + + cacheresults = jQuery.fragments[ args[0] ]; + if ( cacheresults && cacheresults !== 1 ) { + fragment = cacheresults; + } + } + + if ( !fragment ) { + fragment = doc.createDocumentFragment(); + jQuery.clean( args, doc, fragment, scripts ); + } + + if ( cacheable ) { + jQuery.fragments[ args[0] ] = cacheresults ? fragment : 1; + } + + return { fragment: fragment, cacheable: cacheable }; +}; + +jQuery.fragments = {}; + +jQuery.each({ + appendTo: "append", + prependTo: "prepend", + insertBefore: "before", + insertAfter: "after", + replaceAll: "replaceWith" +}, function( name, original ) { + jQuery.fn[ name ] = function( selector ) { + var ret = [], + insert = jQuery( selector ), + parent = this.length === 1 && this[0].parentNode; + + if ( parent && parent.nodeType === 11 && parent.childNodes.length === 1 && insert.length === 1 ) { + insert[ original ]( this[0] ); + return this; + + } else { + for ( var i = 0, l = insert.length; i < l; i++ ) { + var elems = (i > 0 ? this.clone(true) : this).get(); + jQuery( insert[i] )[ original ]( elems ); + ret = ret.concat( elems ); + } + + return this.pushStack( ret, name, insert.selector ); + } + }; +}); + +function getAll( elem ) { + if ( "getElementsByTagName" in elem ) { + return elem.getElementsByTagName( "*" ); + + } else if ( "querySelectorAll" in elem ) { + return elem.querySelectorAll( "*" ); + + } else { + return []; + } +} + +// Used in clean, fixes the defaultChecked property +function fixDefaultChecked( elem ) { + if ( elem.type === "checkbox" || elem.type === "radio" ) { + elem.defaultChecked = elem.checked; + } +} +// Finds all inputs and passes them to fixDefaultChecked +function findInputs( elem ) { + if ( jQuery.nodeName( elem, "input" ) ) { + fixDefaultChecked( elem ); + } else if ( "getElementsByTagName" in elem ) { + jQuery.grep( elem.getElementsByTagName("input"), fixDefaultChecked ); + } +} + +jQuery.extend({ + clone: function( elem, dataAndEvents, deepDataAndEvents ) { + var clone = elem.cloneNode(true), + srcElements, + destElements, + i; + + if ( (!jQuery.support.noCloneEvent || !jQuery.support.noCloneChecked) && + (elem.nodeType === 1 || elem.nodeType === 11) && !jQuery.isXMLDoc(elem) ) { + // IE copies events bound via attachEvent when using cloneNode. + // Calling detachEvent on the clone will also remove the events + // from the original. In order to get around this, we use some + // proprietary methods to clear the events. Thanks to MooTools + // guys for this hotness. + + cloneFixAttributes( elem, clone ); + + // Using Sizzle here is crazy slow, so we use getElementsByTagName + // instead + srcElements = getAll( elem ); + destElements = getAll( clone ); + + // Weird iteration because IE will replace the length property + // with an element if you are cloning the body and one of the + // elements on the page has a name or id of "length" + for ( i = 0; srcElements[i]; ++i ) { + // Ensure that the destination node is not null; Fixes #9587 + if ( destElements[i] ) { + cloneFixAttributes( srcElements[i], destElements[i] ); + } + } + } + + // Copy the events from the original to the clone + if ( dataAndEvents ) { + cloneCopyEvent( elem, clone ); + + if ( deepDataAndEvents ) { + srcElements = getAll( elem ); + destElements = getAll( clone ); + + for ( i = 0; srcElements[i]; ++i ) { + cloneCopyEvent( srcElements[i], destElements[i] ); + } + } + } + + srcElements = destElements = null; + + // Return the cloned set + return clone; + }, + + clean: function( elems, context, fragment, scripts ) { + var checkScriptType; + + context = context || document; + + // !context.createElement fails in IE with an error but returns typeof 'object' + if ( typeof context.createElement === "undefined" ) { + context = context.ownerDocument || context[0] && context[0].ownerDocument || document; + } + + var ret = [], j; + + for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) { + if ( typeof elem === "number" ) { + elem += ""; + } + + if ( !elem ) { + continue; + } + + // Convert html string into DOM nodes + if ( typeof elem === "string" ) { + if ( !rhtml.test( elem ) ) { + elem = context.createTextNode( elem ); + } else { + // Fix "XHTML"-style tags in all browsers + elem = elem.replace(rxhtmlTag, "<$1></$2>"); + + // Trim whitespace, otherwise indexOf won't work as expected + var tag = (rtagName.exec( elem ) || ["", ""])[1].toLowerCase(), + wrap = wrapMap[ tag ] || wrapMap._default, + depth = wrap[0], + div = context.createElement("div"); + + // Go to html and back, then peel off extra wrappers + div.innerHTML = wrap[1] + elem + wrap[2]; + + // Move to the right depth + while ( depth-- ) { + div = div.lastChild; + } + + // Remove IE's autoinserted <tbody> from table fragments + if ( !jQuery.support.tbody ) { + + // String was a <table>, *may* have spurious <tbody> + var hasBody = rtbody.test(elem), + tbody = tag === "table" && !hasBody ? + div.firstChild && div.firstChild.childNodes : + + // String was a bare <thead> or <tfoot> + wrap[1] === "<table>" && !hasBody ? + div.childNodes : + []; + + for ( j = tbody.length - 1; j >= 0 ; --j ) { + if ( jQuery.nodeName( tbody[ j ], "tbody" ) && !tbody[ j ].childNodes.length ) { + tbody[ j ].parentNode.removeChild( tbody[ j ] ); + } + } + } + + // IE completely kills leading whitespace when innerHTML is used + if ( !jQuery.support.leadingWhitespace && rleadingWhitespace.test( elem ) ) { + div.insertBefore( context.createTextNode( rleadingWhitespace.exec(elem)[0] ), div.firstChild ); + } + + elem = div.childNodes; + } + } + + // Resets defaultChecked for any radios and checkboxes + // about to be appended to the DOM in IE 6/7 (#8060) + var len; + if ( !jQuery.support.appendChecked ) { + if ( elem[0] && typeof (len = elem.length) === "number" ) { + for ( j = 0; j < len; j++ ) { + findInputs( elem[j] ); + } + } else { + findInputs( elem ); + } + } + + if ( elem.nodeType ) { + ret.push( elem ); + } else { + ret = jQuery.merge( ret, elem ); + } + } + + if ( fragment ) { + checkScriptType = function( elem ) { + return !elem.type || rscriptType.test( elem.type ); + }; + for ( i = 0; ret[i]; i++ ) { + if ( scripts && jQuery.nodeName( ret[i], "script" ) && (!ret[i].type || ret[i].type.toLowerCase() === "text/javascript") ) { + scripts.push( ret[i].parentNode ? ret[i].parentNode.removeChild( ret[i] ) : ret[i] ); + + } else { + if ( ret[i].nodeType === 1 ) { + var jsTags = jQuery.grep( ret[i].getElementsByTagName( "script" ), checkScriptType ); + + ret.splice.apply( ret, [i + 1, 0].concat( jsTags ) ); + } + fragment.appendChild( ret[i] ); + } + } + } + + return ret; + }, + + cleanData: function( elems ) { + var data, id, cache = jQuery.cache, internalKey = jQuery.expando, special = jQuery.event.special, + deleteExpando = jQuery.support.deleteExpando; + + for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) { + if ( elem.nodeName && jQuery.noData[elem.nodeName.toLowerCase()] ) { + continue; + } + + id = elem[ jQuery.expando ]; + + if ( id ) { + data = cache[ id ] && cache[ id ][ internalKey ]; + + if ( data && data.events ) { + for ( var type in data.events ) { + if ( special[ type ] ) { + jQuery.event.remove( elem, type ); + + // This is a shortcut to avoid jQuery.event.remove's overhead + } else { + jQuery.removeEvent( elem, type, data.handle ); + } + } + + // Null the DOM reference to avoid IE6/7/8 leak (#7054) + if ( data.handle ) { + data.handle.elem = null; + } + } + + if ( deleteExpando ) { + delete elem[ jQuery.expando ]; + + } else if ( elem.removeAttribute ) { + elem.removeAttribute( jQuery.expando ); + } + + delete cache[ id ]; + } + } + } +}); + +function evalScript( i, elem ) { + if ( elem.src ) { + jQuery.ajax({ + url: elem.src, + async: false, + dataType: "script" + }); + } else { + jQuery.globalEval( ( elem.text || elem.textContent || elem.innerHTML || "" ).replace( rcleanScript, "/*$0*/" ) ); + } + + if ( elem.parentNode ) { + elem.parentNode.removeChild( elem ); + } +} + + + + +var ralpha = /alpha\([^)]*\)/i, + ropacity = /opacity=([^)]*)/, + // fixed for IE9, see #8346 + rupper = /([A-Z]|^ms)/g, + rnumpx = /^-?\d+(?:px)?$/i, + rnum = /^-?\d/, + rrelNum = /^([\-+])=([\-+.\de]+)/, + + cssShow = { position: "absolute", visibility: "hidden", display: "block" }, + cssWidth = [ "Left", "Right" ], + cssHeight = [ "Top", "Bottom" ], + curCSS, + + getComputedStyle, + currentStyle; + +jQuery.fn.css = function( name, value ) { + // Setting 'undefined' is a no-op + if ( arguments.length === 2 && value === undefined ) { + return this; + } + + return jQuery.access( this, name, value, true, function( elem, name, value ) { + return value !== undefined ? + jQuery.style( elem, name, value ) : + jQuery.css( elem, name ); + }); +}; + +jQuery.extend({ + // Add in style property hooks for overriding the default + // behavior of getting and setting a style property + cssHooks: { + opacity: { + get: function( elem, computed ) { + if ( computed ) { + // We should always get a number back from opacity + var ret = curCSS( elem, "opacity", "opacity" ); + return ret === "" ? "1" : ret; + + } else { + return elem.style.opacity; + } + } + } + }, + + // Exclude the following css properties to add px + cssNumber: { + "fillOpacity": true, + "fontWeight": true, + "lineHeight": true, + "opacity": true, + "orphans": true, + "widows": true, + "zIndex": true, + "zoom": true + }, + + // Add in properties whose names you wish to fix before + // setting or getting the value + cssProps: { + // normalize float css property + "float": jQuery.support.cssFloat ? "cssFloat" : "styleFloat" + }, + + // Get and set the style property on a DOM Node + style: function( elem, name, value, extra ) { + // Don't set styles on text and comment nodes + if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) { + return; + } + + // Make sure that we're working with the right name + var ret, type, origName = jQuery.camelCase( name ), + style = elem.style, hooks = jQuery.cssHooks[ origName ]; + + name = jQuery.cssProps[ origName ] || origName; + + // Check if we're setting a value + if ( value !== undefined ) { + type = typeof value; + + // convert relative number strings (+= or -=) to relative numbers. #7345 + if ( type === "string" && (ret = rrelNum.exec( value )) ) { + value = ( +( ret[1] + 1) * +ret[2] ) + parseFloat( jQuery.css( elem, name ) ); + // Fixes bug #9237 + type = "number"; + } + + // Make sure that NaN and null values aren't set. See: #7116 + if ( value == null || type === "number" && isNaN( value ) ) { + return; + } + + // If a number was passed in, add 'px' to the (except for certain CSS properties) + if ( type === "number" && !jQuery.cssNumber[ origName ] ) { + value += "px"; + } + + // If a hook was provided, use that value, otherwise just set the specified value + if ( !hooks || !("set" in hooks) || (value = hooks.set( elem, value )) !== undefined ) { + // Wrapped to prevent IE from throwing errors when 'invalid' values are provided + // Fixes bug #5509 + try { + style[ name ] = value; + } catch(e) {} + } + + } else { + // If a hook was provided get the non-computed value from there + if ( hooks && "get" in hooks && (ret = hooks.get( elem, false, extra )) !== undefined ) { + return ret; + } + + // Otherwise just get the value from the style object + return style[ name ]; + } + }, + + css: function( elem, name, extra ) { + var ret, hooks; + + // Make sure that we're working with the right name + name = jQuery.camelCase( name ); + hooks = jQuery.cssHooks[ name ]; + name = jQuery.cssProps[ name ] || name; + + // cssFloat needs a special treatment + if ( name === "cssFloat" ) { + name = "float"; + } + + // If a hook was provided get the computed value from there + if ( hooks && "get" in hooks && (ret = hooks.get( elem, true, extra )) !== undefined ) { + return ret; + + // Otherwise, if a way to get the computed value exists, use that + } else if ( curCSS ) { + return curCSS( elem, name ); + } + }, + + // A method for quickly swapping in/out CSS properties to get correct calculations + swap: function( elem, options, callback ) { + var old = {}; + + // Remember the old values, and insert the new ones + for ( var name in options ) { + old[ name ] = elem.style[ name ]; + elem.style[ name ] = options[ name ]; + } + + callback.call( elem ); + + // Revert the old values + for ( name in options ) { + elem.style[ name ] = old[ name ]; + } + } +}); + +// DEPRECATED, Use jQuery.css() instead +jQuery.curCSS = jQuery.css; + +jQuery.each(["height", "width"], function( i, name ) { + jQuery.cssHooks[ name ] = { + get: function( elem, computed, extra ) { + var val; + + if ( computed ) { + if ( elem.offsetWidth !== 0 ) { + return getWH( elem, name, extra ); + } else { + jQuery.swap( elem, cssShow, function() { + val = getWH( elem, name, extra ); + }); + } + + return val; + } + }, + + set: function( elem, value ) { + if ( rnumpx.test( value ) ) { + // ignore negative width and height values #1599 + value = parseFloat( value ); + + if ( value >= 0 ) { + return value + "px"; + } + + } else { + return value; + } + } + }; +}); + +if ( !jQuery.support.opacity ) { + jQuery.cssHooks.opacity = { + get: function( elem, computed ) { + // IE uses filters for opacity + return ropacity.test( (computed && elem.currentStyle ? elem.currentStyle.filter : elem.style.filter) || "" ) ? + ( parseFloat( RegExp.$1 ) / 100 ) + "" : + computed ? "1" : ""; + }, + + set: function( elem, value ) { + var style = elem.style, + currentStyle = elem.currentStyle, + opacity = jQuery.isNaN( value ) ? "" : "alpha(opacity=" + value * 100 + ")", + filter = currentStyle && currentStyle.filter || style.filter || ""; + + // IE has trouble with opacity if it does not have layout + // Force it by setting the zoom level + style.zoom = 1; + + // if setting opacity to 1, and no other filters exist - attempt to remove filter attribute #6652 + if ( value >= 1 && jQuery.trim( filter.replace( ralpha, "" ) ) === "" ) { + + // Setting style.filter to null, "" & " " still leave "filter:" in the cssText + // if "filter:" is present at all, clearType is disabled, we want to avoid this + // style.removeAttribute is IE Only, but so apparently is this code path... + style.removeAttribute( "filter" ); + + // if there there is no filter style applied in a css rule, we are done + if ( currentStyle && !currentStyle.filter ) { + return; + } + } + + // otherwise, set new filter values + style.filter = ralpha.test( filter ) ? + filter.replace( ralpha, opacity ) : + filter + " " + opacity; + } + }; +} + +jQuery(function() { + // This hook cannot be added until DOM ready because the support test + // for it is not run until after DOM ready + if ( !jQuery.support.reliableMarginRight ) { + jQuery.cssHooks.marginRight = { + get: function( elem, computed ) { + // WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right + // Work around by temporarily setting element display to inline-block + var ret; + jQuery.swap( elem, { "display": "inline-block" }, function() { + if ( computed ) { + ret = curCSS( elem, "margin-right", "marginRight" ); + } else { + ret = elem.style.marginRight; + } + }); + return ret; + } + }; + } +}); + +if ( document.defaultView && document.defaultView.getComputedStyle ) { + getComputedStyle = function( elem, name ) { + var ret, defaultView, computedStyle; + + name = name.replace( rupper, "-$1" ).toLowerCase(); + + if ( !(defaultView = elem.ownerDocument.defaultView) ) { + return undefined; + } + + if ( (computedStyle = defaultView.getComputedStyle( elem, null )) ) { + ret = computedStyle.getPropertyValue( name ); + if ( ret === "" && !jQuery.contains( elem.ownerDocument.documentElement, elem ) ) { + ret = jQuery.style( elem, name ); + } + } + + return ret; + }; +} + +if ( document.documentElement.currentStyle ) { + currentStyle = function( elem, name ) { + var left, + ret = elem.currentStyle && elem.currentStyle[ name ], + rsLeft = elem.runtimeStyle && elem.runtimeStyle[ name ], + style = elem.style; + + // From the awesome hack by Dean Edwards + // http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291 + + // If we're not dealing with a regular pixel number + // but a number that has a weird ending, we need to convert it to pixels + if ( !rnumpx.test( ret ) && rnum.test( ret ) ) { + // Remember the original values + left = style.left; + + // Put in the new values to get a computed value out + if ( rsLeft ) { + elem.runtimeStyle.left = elem.currentStyle.left; + } + style.left = name === "fontSize" ? "1em" : (ret || 0); + ret = style.pixelLeft + "px"; + + // Revert the changed values + style.left = left; + if ( rsLeft ) { + elem.runtimeStyle.left = rsLeft; + } + } + + return ret === "" ? "auto" : ret; + }; +} + +curCSS = getComputedStyle || currentStyle; + +function getWH( elem, name, extra ) { + + // Start with offset property + var val = name === "width" ? elem.offsetWidth : elem.offsetHeight, + which = name === "width" ? cssWidth : cssHeight; + + if ( val > 0 ) { + if ( extra !== "border" ) { + jQuery.each( which, function() { + if ( !extra ) { + val -= parseFloat( jQuery.css( elem, "padding" + this ) ) || 0; + } + if ( extra === "margin" ) { + val += parseFloat( jQuery.css( elem, extra + this ) ) || 0; + } else { + val -= parseFloat( jQuery.css( elem, "border" + this + "Width" ) ) || 0; + } + }); + } + + return val + "px"; + } + + // Fall back to computed then uncomputed css if necessary + val = curCSS( elem, name, name ); + if ( val < 0 || val == null ) { + val = elem.style[ name ] || 0; + } + // Normalize "", auto, and prepare for extra + val = parseFloat( val ) || 0; + + // Add padding, border, margin + if ( extra ) { + jQuery.each( which, function() { + val += parseFloat( jQuery.css( elem, "padding" + this ) ) || 0; + if ( extra !== "padding" ) { + val += parseFloat( jQuery.css( elem, "border" + this + "Width" ) ) || 0; + } + if ( extra === "margin" ) { + val += parseFloat( jQuery.css( elem, extra + this ) ) || 0; + } + }); + } + + return val + "px"; +} + +if ( jQuery.expr && jQuery.expr.filters ) { + jQuery.expr.filters.hidden = function( elem ) { + var width = elem.offsetWidth, + height = elem.offsetHeight; + + return (width === 0 && height === 0) || (!jQuery.support.reliableHiddenOffsets && (elem.style.display || jQuery.css( elem, "display" )) === "none"); + }; + + jQuery.expr.filters.visible = function( elem ) { + return !jQuery.expr.filters.hidden( elem ); + }; +} + + + + +var r20 = /%20/g, + rbracket = /\[\]$/, + rCRLF = /\r?\n/g, + rhash = /#.*$/, + rheaders = /^(.*?):[ \t]*([^\r\n]*)\r?$/mg, // IE leaves an \r character at EOL + rinput = /^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i, + // #7653, #8125, #8152: local protocol detection + rlocalProtocol = /^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/, + rnoContent = /^(?:GET|HEAD)$/, + rprotocol = /^\/\//, + rquery = /\?/, + rscript = /<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi, + rselectTextarea = /^(?:select|textarea)/i, + rspacesAjax = /\s+/, + rts = /([?&])_=[^&]*/, + rurl = /^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/, + + // Keep a copy of the old load method + _load = jQuery.fn.load, + + /* Prefilters + * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example) + * 2) These are called: + * - BEFORE asking for a transport + * - AFTER param serialization (s.data is a string if s.processData is true) + * 3) key is the dataType + * 4) the catchall symbol "*" can be used + * 5) execution will start with transport dataType and THEN continue down to "*" if needed + */ + prefilters = {}, + + /* Transports bindings + * 1) key is the dataType + * 2) the catchall symbol "*" can be used + * 3) selection will start with transport dataType and THEN go to "*" if needed + */ + transports = {}, + + // Document location + ajaxLocation, + + // Document location segments + ajaxLocParts, + + // Avoid comment-prolog char sequence (#10098); must appease lint and evade compression + allTypes = ["*/"] + ["*"]; + +// #8138, IE may throw an exception when accessing +// a field from window.location if document.domain has been set +try { + ajaxLocation = location.href; +} catch( e ) { + // Use the href attribute of an A element + // since IE will modify it given document.location + ajaxLocation = document.createElement( "a" ); + ajaxLocation.href = ""; + ajaxLocation = ajaxLocation.href; +} + +// Segment location into parts +ajaxLocParts = rurl.exec( ajaxLocation.toLowerCase() ) || []; + +// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport +function addToPrefiltersOrTransports( structure ) { + + // dataTypeExpression is optional and defaults to "*" + return function( dataTypeExpression, func ) { + + if ( typeof dataTypeExpression !== "string" ) { + func = dataTypeExpression; + dataTypeExpression = "*"; + } + + if ( jQuery.isFunction( func ) ) { + var dataTypes = dataTypeExpression.toLowerCase().split( rspacesAjax ), + i = 0, + length = dataTypes.length, + dataType, + list, + placeBefore; + + // For each dataType in the dataTypeExpression + for(; i < length; i++ ) { + dataType = dataTypes[ i ]; + // We control if we're asked to add before + // any existing element + placeBefore = /^\+/.test( dataType ); + if ( placeBefore ) { + dataType = dataType.substr( 1 ) || "*"; + } + list = structure[ dataType ] = structure[ dataType ] || []; + // then we add to the structure accordingly + list[ placeBefore ? "unshift" : "push" ]( func ); + } + } + }; +} + +// Base inspection function for prefilters and transports +function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR, + dataType /* internal */, inspected /* internal */ ) { + + dataType = dataType || options.dataTypes[ 0 ]; + inspected = inspected || {}; + + inspected[ dataType ] = true; + + var list = structure[ dataType ], + i = 0, + length = list ? list.length : 0, + executeOnly = ( structure === prefilters ), + selection; + + for(; i < length && ( executeOnly || !selection ); i++ ) { + selection = list[ i ]( options, originalOptions, jqXHR ); + // If we got redirected to another dataType + // we try there if executing only and not done already + if ( typeof selection === "string" ) { + if ( !executeOnly || inspected[ selection ] ) { + selection = undefined; + } else { + options.dataTypes.unshift( selection ); + selection = inspectPrefiltersOrTransports( + structure, options, originalOptions, jqXHR, selection, inspected ); + } + } + } + // If we're only executing or nothing was selected + // we try the catchall dataType if not done already + if ( ( executeOnly || !selection ) && !inspected[ "*" ] ) { + selection = inspectPrefiltersOrTransports( + structure, options, originalOptions, jqXHR, "*", inspected ); + } + // unnecessary when only executing (prefilters) + // but it'll be ignored by the caller in that case + return selection; +} + +// A special extend for ajax options +// that takes "flat" options (not to be deep extended) +// Fixes #9887 +function ajaxExtend( target, src ) { + var key, deep, + flatOptions = jQuery.ajaxSettings.flatOptions || {}; + for( key in src ) { + if ( src[ key ] !== undefined ) { + ( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ]; + } + } + if ( deep ) { + jQuery.extend( true, target, deep ); + } +} + +jQuery.fn.extend({ + load: function( url, params, callback ) { + if ( typeof url !== "string" && _load ) { + return _load.apply( this, arguments ); + + // Don't do a request if no elements are being requested + } else if ( !this.length ) { + return this; + } + + var off = url.indexOf( " " ); + if ( off >= 0 ) { + var selector = url.slice( off, url.length ); + url = url.slice( 0, off ); + } + + // Default to a GET request + var type = "GET"; + + // If the second parameter was provided + if ( params ) { + // If it's a function + if ( jQuery.isFunction( params ) ) { + // We assume that it's the callback + callback = params; + params = undefined; + + // Otherwise, build a param string + } else if ( typeof params === "object" ) { + params = jQuery.param( params, jQuery.ajaxSettings.traditional ); + type = "POST"; + } + } + + var self = this; + + // Request the remote document + jQuery.ajax({ + url: url, + type: type, + dataType: "html", + data: params, + // Complete callback (responseText is used internally) + complete: function( jqXHR, status, responseText ) { + // Store the response as specified by the jqXHR object + responseText = jqXHR.responseText; + // If successful, inject the HTML into all the matched elements + if ( jqXHR.isResolved() ) { + // #4825: Get the actual response in case + // a dataFilter is present in ajaxSettings + jqXHR.done(function( r ) { + responseText = r; + }); + // See if a selector was specified + self.html( selector ? + // Create a dummy div to hold the results + jQuery("<div>") + // inject the contents of the document in, removing the scripts + // to avoid any 'Permission Denied' errors in IE + .append(responseText.replace(rscript, "")) + + // Locate the specified elements + .find(selector) : + + // If not, just inject the full result + responseText ); + } + + if ( callback ) { + self.each( callback, [ responseText, status, jqXHR ] ); + } + } + }); + + return this; + }, + + serialize: function() { + return jQuery.param( this.serializeArray() ); + }, + + serializeArray: function() { + return this.map(function(){ + return this.elements ? jQuery.makeArray( this.elements ) : this; + }) + .filter(function(){ + return this.name && !this.disabled && + ( this.checked || rselectTextarea.test( this.nodeName ) || + rinput.test( this.type ) ); + }) + .map(function( i, elem ){ + var val = jQuery( this ).val(); + + return val == null ? + null : + jQuery.isArray( val ) ? + jQuery.map( val, function( val, i ){ + return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) }; + }) : + { name: elem.name, value: val.replace( rCRLF, "\r\n" ) }; + }).get(); + } +}); + +// Attach a bunch of functions for handling common AJAX events +jQuery.each( "ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split( " " ), function( i, o ){ + jQuery.fn[ o ] = function( f ){ + return this.bind( o, f ); + }; +}); + +jQuery.each( [ "get", "post" ], function( i, method ) { + jQuery[ method ] = function( url, data, callback, type ) { + // shift arguments if data argument was omitted + if ( jQuery.isFunction( data ) ) { + type = type || callback; + callback = data; + data = undefined; + } + + return jQuery.ajax({ + type: method, + url: url, + data: data, + success: callback, + dataType: type + }); + }; +}); + +jQuery.extend({ + + getScript: function( url, callback ) { + return jQuery.get( url, undefined, callback, "script" ); + }, + + getJSON: function( url, data, callback ) { + return jQuery.get( url, data, callback, "json" ); + }, + + // Creates a full fledged settings object into target + // with both ajaxSettings and settings fields. + // If target is omitted, writes into ajaxSettings. + ajaxSetup: function( target, settings ) { + if ( settings ) { + // Building a settings object + ajaxExtend( target, jQuery.ajaxSettings ); + } else { + // Extending ajaxSettings + settings = target; + target = jQuery.ajaxSettings; + } + ajaxExtend( target, settings ); + return target; + }, + + ajaxSettings: { + url: ajaxLocation, + isLocal: rlocalProtocol.test( ajaxLocParts[ 1 ] ), + global: true, + type: "GET", + contentType: "application/x-www-form-urlencoded", + processData: true, + async: true, + /* + timeout: 0, + data: null, + dataType: null, + username: null, + password: null, + cache: null, + traditional: false, + headers: {}, + */ + + accepts: { + xml: "application/xml, text/xml", + html: "text/html", + text: "text/plain", + json: "application/json, text/javascript", + "*": allTypes + }, + + contents: { + xml: /xml/, + html: /html/, + json: /json/ + }, + + responseFields: { + xml: "responseXML", + text: "responseText" + }, + + // List of data converters + // 1) key format is "source_type destination_type" (a single space in-between) + // 2) the catchall symbol "*" can be used for source_type + converters: { + + // Convert anything to text + "* text": window.String, + + // Text to html (true = no transformation) + "text html": true, + + // Evaluate text as a json expression + "text json": jQuery.parseJSON, + + // Parse text as xml + "text xml": jQuery.parseXML + }, + + // For options that shouldn't be deep extended: + // you can add your own custom options here if + // and when you create one that shouldn't be + // deep extended (see ajaxExtend) + flatOptions: { + context: true, + url: true + } + }, + + ajaxPrefilter: addToPrefiltersOrTransports( prefilters ), + ajaxTransport: addToPrefiltersOrTransports( transports ), + + // Main method + ajax: function( url, options ) { + + // If url is an object, simulate pre-1.5 signature + if ( typeof url === "object" ) { + options = url; + url = undefined; + } + + // Force options to be an object + options = options || {}; + + var // Create the final options object + s = jQuery.ajaxSetup( {}, options ), + // Callbacks context + callbackContext = s.context || s, + // Context for global events + // It's the callbackContext if one was provided in the options + // and if it's a DOM node or a jQuery collection + globalEventContext = callbackContext !== s && + ( callbackContext.nodeType || callbackContext instanceof jQuery ) ? + jQuery( callbackContext ) : jQuery.event, + // Deferreds + deferred = jQuery.Deferred(), + completeDeferred = jQuery._Deferred(), + // Status-dependent callbacks + statusCode = s.statusCode || {}, + // ifModified key + ifModifiedKey, + // Headers (they are sent all at once) + requestHeaders = {}, + requestHeadersNames = {}, + // Response headers + responseHeadersString, + responseHeaders, + // transport + transport, + // timeout handle + timeoutTimer, + // Cross-domain detection vars + parts, + // The jqXHR state + state = 0, + // To know if global events are to be dispatched + fireGlobals, + // Loop variable + i, + // Fake xhr + jqXHR = { + + readyState: 0, + + // Caches the header + setRequestHeader: function( name, value ) { + if ( !state ) { + var lname = name.toLowerCase(); + name = requestHeadersNames[ lname ] = requestHeadersNames[ lname ] || name; + requestHeaders[ name ] = value; + } + return this; + }, + + // Raw string + getAllResponseHeaders: function() { + return state === 2 ? responseHeadersString : null; + }, + + // Builds headers hashtable if needed + getResponseHeader: function( key ) { + var match; + if ( state === 2 ) { + if ( !responseHeaders ) { + responseHeaders = {}; + while( ( match = rheaders.exec( responseHeadersString ) ) ) { + responseHeaders[ match[1].toLowerCase() ] = match[ 2 ]; + } + } + match = responseHeaders[ key.toLowerCase() ]; + } + return match === undefined ? null : match; + }, + + // Overrides response content-type header + overrideMimeType: function( type ) { + if ( !state ) { + s.mimeType = type; + } + return this; + }, + + // Cancel the request + abort: function( statusText ) { + statusText = statusText || "abort"; + if ( transport ) { + transport.abort( statusText ); + } + done( 0, statusText ); + return this; + } + }; + + // Callback for when everything is done + // It is defined here because jslint complains if it is declared + // at the end of the function (which would be more logical and readable) + function done( status, nativeStatusText, responses, headers ) { + + // Called once + if ( state === 2 ) { + return; + } + + // State is "done" now + state = 2; + + // Clear timeout if it exists + if ( timeoutTimer ) { + clearTimeout( timeoutTimer ); + } + + // Dereference transport for early garbage collection + // (no matter how long the jqXHR object will be used) + transport = undefined; + + // Cache response headers + responseHeadersString = headers || ""; + + // Set readyState + jqXHR.readyState = status > 0 ? 4 : 0; + + var isSuccess, + success, + error, + statusText = nativeStatusText, + response = responses ? ajaxHandleResponses( s, jqXHR, responses ) : undefined, + lastModified, + etag; + + // If successful, handle type chaining + if ( status >= 200 && status < 300 || status === 304 ) { + + // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. + if ( s.ifModified ) { + + if ( ( lastModified = jqXHR.getResponseHeader( "Last-Modified" ) ) ) { + jQuery.lastModified[ ifModifiedKey ] = lastModified; + } + if ( ( etag = jqXHR.getResponseHeader( "Etag" ) ) ) { + jQuery.etag[ ifModifiedKey ] = etag; + } + } + + // If not modified + if ( status === 304 ) { + + statusText = "notmodified"; + isSuccess = true; + + // If we have data + } else { + + try { + success = ajaxConvert( s, response ); + statusText = "success"; + isSuccess = true; + } catch(e) { + // We have a parsererror + statusText = "parsererror"; + error = e; + } + } + } else { + // We extract error from statusText + // then normalize statusText and status for non-aborts + error = statusText; + if( !statusText || status ) { + statusText = "error"; + if ( status < 0 ) { + status = 0; + } + } + } + + // Set data for the fake xhr object + jqXHR.status = status; + jqXHR.statusText = "" + ( nativeStatusText || statusText ); + + // Success/Error + if ( isSuccess ) { + deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] ); + } else { + deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] ); + } + + // Status-dependent callbacks + jqXHR.statusCode( statusCode ); + statusCode = undefined; + + if ( fireGlobals ) { + globalEventContext.trigger( "ajax" + ( isSuccess ? "Success" : "Error" ), + [ jqXHR, s, isSuccess ? success : error ] ); + } + + // Complete + completeDeferred.resolveWith( callbackContext, [ jqXHR, statusText ] ); + + if ( fireGlobals ) { + globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] ); + // Handle the global AJAX counter + if ( !( --jQuery.active ) ) { + jQuery.event.trigger( "ajaxStop" ); + } + } + } + + // Attach deferreds + deferred.promise( jqXHR ); + jqXHR.success = jqXHR.done; + jqXHR.error = jqXHR.fail; + jqXHR.complete = completeDeferred.done; + + // Status-dependent callbacks + jqXHR.statusCode = function( map ) { + if ( map ) { + var tmp; + if ( state < 2 ) { + for( tmp in map ) { + statusCode[ tmp ] = [ statusCode[tmp], map[tmp] ]; + } + } else { + tmp = map[ jqXHR.status ]; + jqXHR.then( tmp, tmp ); + } + } + return this; + }; + + // Remove hash character (#7531: and string promotion) + // Add protocol if not provided (#5866: IE7 issue with protocol-less urls) + // We also use the url parameter if available + s.url = ( ( url || s.url ) + "" ).replace( rhash, "" ).replace( rprotocol, ajaxLocParts[ 1 ] + "//" ); + + // Extract dataTypes list + s.dataTypes = jQuery.trim( s.dataType || "*" ).toLowerCase().split( rspacesAjax ); + + // Determine if a cross-domain request is in order + if ( s.crossDomain == null ) { + parts = rurl.exec( s.url.toLowerCase() ); + s.crossDomain = !!( parts && + ( parts[ 1 ] != ajaxLocParts[ 1 ] || parts[ 2 ] != ajaxLocParts[ 2 ] || + ( parts[ 3 ] || ( parts[ 1 ] === "http:" ? 80 : 443 ) ) != + ( ajaxLocParts[ 3 ] || ( ajaxLocParts[ 1 ] === "http:" ? 80 : 443 ) ) ) + ); + } + + // Convert data if not already a string + if ( s.data && s.processData && typeof s.data !== "string" ) { + s.data = jQuery.param( s.data, s.traditional ); + } + + // Apply prefilters + inspectPrefiltersOrTransports( prefilters, s, options, jqXHR ); + + // If request was aborted inside a prefiler, stop there + if ( state === 2 ) { + return false; + } + + // We can fire global events as of now if asked to + fireGlobals = s.global; + + // Uppercase the type + s.type = s.type.toUpperCase(); + + // Determine if request has content + s.hasContent = !rnoContent.test( s.type ); + + // Watch for a new set of requests + if ( fireGlobals && jQuery.active++ === 0 ) { + jQuery.event.trigger( "ajaxStart" ); + } + + // More options handling for requests with no content + if ( !s.hasContent ) { + + // If data is available, append data to url + if ( s.data ) { + s.url += ( rquery.test( s.url ) ? "&" : "?" ) + s.data; + // #9682: remove data so that it's not used in an eventual retry + delete s.data; + } + + // Get ifModifiedKey before adding the anti-cache parameter + ifModifiedKey = s.url; + + // Add anti-cache in url if needed + if ( s.cache === false ) { + + var ts = jQuery.now(), + // try replacing _= if it is there + ret = s.url.replace( rts, "$1_=" + ts ); + + // if nothing was replaced, add timestamp to the end + s.url = ret + ( (ret === s.url ) ? ( rquery.test( s.url ) ? "&" : "?" ) + "_=" + ts : "" ); + } + } + + // Set the correct header, if data is being sent + if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) { + jqXHR.setRequestHeader( "Content-Type", s.contentType ); + } + + // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. + if ( s.ifModified ) { + ifModifiedKey = ifModifiedKey || s.url; + if ( jQuery.lastModified[ ifModifiedKey ] ) { + jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ ifModifiedKey ] ); + } + if ( jQuery.etag[ ifModifiedKey ] ) { + jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ ifModifiedKey ] ); + } + } + + // Set the Accepts header for the server, depending on the dataType + jqXHR.setRequestHeader( + "Accept", + s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[0] ] ? + s.accepts[ s.dataTypes[0] ] + ( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) : + s.accepts[ "*" ] + ); + + // Check for headers option + for ( i in s.headers ) { + jqXHR.setRequestHeader( i, s.headers[ i ] ); + } + + // Allow custom headers/mimetypes and early abort + if ( s.beforeSend && ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || state === 2 ) ) { + // Abort if not done already + jqXHR.abort(); + return false; + + } + + // Install callbacks on deferreds + for ( i in { success: 1, error: 1, complete: 1 } ) { + jqXHR[ i ]( s[ i ] ); + } + + // Get transport + transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR ); + + // If no transport, we auto-abort + if ( !transport ) { + done( -1, "No Transport" ); + } else { + jqXHR.readyState = 1; + // Send global event + if ( fireGlobals ) { + globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] ); + } + // Timeout + if ( s.async && s.timeout > 0 ) { + timeoutTimer = setTimeout( function(){ + jqXHR.abort( "timeout" ); + }, s.timeout ); + } + + try { + state = 1; + transport.send( requestHeaders, done ); + } catch (e) { + // Propagate exception as error if not done + if ( state < 2 ) { + done( -1, e ); + // Simply rethrow otherwise + } else { + jQuery.error( e ); + } + } + } + + return jqXHR; + }, + + // Serialize an array of form elements or a set of + // key/values into a query string + param: function( a, traditional ) { + var s = [], + add = function( key, value ) { + // If value is a function, invoke it and return its value + value = jQuery.isFunction( value ) ? value() : value; + s[ s.length ] = encodeURIComponent( key ) + "=" + encodeURIComponent( value ); + }; + + // Set traditional to true for jQuery <= 1.3.2 behavior. + if ( traditional === undefined ) { + traditional = jQuery.ajaxSettings.traditional; + } + + // If an array was passed in, assume that it is an array of form elements. + if ( jQuery.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) { + // Serialize the form elements + jQuery.each( a, function() { + add( this.name, this.value ); + }); + + } else { + // If traditional, encode the "old" way (the way 1.3.2 or older + // did it), otherwise encode params recursively. + for ( var prefix in a ) { + buildParams( prefix, a[ prefix ], traditional, add ); + } + } + + // Return the resulting serialization + return s.join( "&" ).replace( r20, "+" ); + } +}); + +function buildParams( prefix, obj, traditional, add ) { + if ( jQuery.isArray( obj ) ) { + // Serialize array item. + jQuery.each( obj, function( i, v ) { + if ( traditional || rbracket.test( prefix ) ) { + // Treat each array item as a scalar. + add( prefix, v ); + + } else { + // If array item is non-scalar (array or object), encode its + // numeric index to resolve deserialization ambiguity issues. + // Note that rack (as of 1.0.0) can't currently deserialize + // nested arrays properly, and attempting to do so may cause + // a server error. Possible fixes are to modify rack's + // deserialization algorithm or to provide an option or flag + // to force array serialization to be shallow. + buildParams( prefix + "[" + ( typeof v === "object" || jQuery.isArray(v) ? i : "" ) + "]", v, traditional, add ); + } + }); + + } else if ( !traditional && obj != null && typeof obj === "object" ) { + // Serialize object item. + for ( var name in obj ) { + buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add ); + } + + } else { + // Serialize scalar item. + add( prefix, obj ); + } +} + +// This is still on the jQuery object... for now +// Want to move this to jQuery.ajax some day +jQuery.extend({ + + // Counter for holding the number of active queries + active: 0, + + // Last-Modified header cache for next request + lastModified: {}, + etag: {} + +}); + +/* Handles responses to an ajax request: + * - sets all responseXXX fields accordingly + * - finds the right dataType (mediates between content-type and expected dataType) + * - returns the corresponding response + */ +function ajaxHandleResponses( s, jqXHR, responses ) { + + var contents = s.contents, + dataTypes = s.dataTypes, + responseFields = s.responseFields, + ct, + type, + finalDataType, + firstDataType; + + // Fill responseXXX fields + for( type in responseFields ) { + if ( type in responses ) { + jqXHR[ responseFields[type] ] = responses[ type ]; + } + } + + // Remove auto dataType and get content-type in the process + while( dataTypes[ 0 ] === "*" ) { + dataTypes.shift(); + if ( ct === undefined ) { + ct = s.mimeType || jqXHR.getResponseHeader( "content-type" ); + } + } + + // Check if we're dealing with a known content-type + if ( ct ) { + for ( type in contents ) { + if ( contents[ type ] && contents[ type ].test( ct ) ) { + dataTypes.unshift( type ); + break; + } + } + } + + // Check to see if we have a response for the expected dataType + if ( dataTypes[ 0 ] in responses ) { + finalDataType = dataTypes[ 0 ]; + } else { + // Try convertible dataTypes + for ( type in responses ) { + if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[0] ] ) { + finalDataType = type; + break; + } + if ( !firstDataType ) { + firstDataType = type; + } + } + // Or just use first one + finalDataType = finalDataType || firstDataType; + } + + // If we found a dataType + // We add the dataType to the list if needed + // and return the corresponding response + if ( finalDataType ) { + if ( finalDataType !== dataTypes[ 0 ] ) { + dataTypes.unshift( finalDataType ); + } + return responses[ finalDataType ]; + } +} + +// Chain conversions given the request and the original response +function ajaxConvert( s, response ) { + + // Apply the dataFilter if provided + if ( s.dataFilter ) { + response = s.dataFilter( response, s.dataType ); + } + + var dataTypes = s.dataTypes, + converters = {}, + i, + key, + length = dataTypes.length, + tmp, + // Current and previous dataTypes + current = dataTypes[ 0 ], + prev, + // Conversion expression + conversion, + // Conversion function + conv, + // Conversion functions (transitive conversion) + conv1, + conv2; + + // For each dataType in the chain + for( i = 1; i < length; i++ ) { + + // Create converters map + // with lowercased keys + if ( i === 1 ) { + for( key in s.converters ) { + if( typeof key === "string" ) { + converters[ key.toLowerCase() ] = s.converters[ key ]; + } + } + } + + // Get the dataTypes + prev = current; + current = dataTypes[ i ]; + + // If current is auto dataType, update it to prev + if( current === "*" ) { + current = prev; + // If no auto and dataTypes are actually different + } else if ( prev !== "*" && prev !== current ) { + + // Get the converter + conversion = prev + " " + current; + conv = converters[ conversion ] || converters[ "* " + current ]; + + // If there is no direct converter, search transitively + if ( !conv ) { + conv2 = undefined; + for( conv1 in converters ) { + tmp = conv1.split( " " ); + if ( tmp[ 0 ] === prev || tmp[ 0 ] === "*" ) { + conv2 = converters[ tmp[1] + " " + current ]; + if ( conv2 ) { + conv1 = converters[ conv1 ]; + if ( conv1 === true ) { + conv = conv2; + } else if ( conv2 === true ) { + conv = conv1; + } + break; + } + } + } + } + // If we found no converter, dispatch an error + if ( !( conv || conv2 ) ) { + jQuery.error( "No conversion from " + conversion.replace(" "," to ") ); + } + // If found converter is not an equivalence + if ( conv !== true ) { + // Convert with 1 or 2 converters accordingly + response = conv ? conv( response ) : conv2( conv1(response) ); + } + } + } + return response; +} + + + + +var jsc = jQuery.now(), + jsre = /(\=)\?(&|$)|\?\?/i; + +// Default jsonp settings +jQuery.ajaxSetup({ + jsonp: "callback", + jsonpCallback: function() { + return jQuery.expando + "_" + ( jsc++ ); + } +}); + +// Detect, normalize options and install callbacks for jsonp requests +jQuery.ajaxPrefilter( "json jsonp", function( s, originalSettings, jqXHR ) { + + var inspectData = s.contentType === "application/x-www-form-urlencoded" && + ( typeof s.data === "string" ); + + if ( s.dataTypes[ 0 ] === "jsonp" || + s.jsonp !== false && ( jsre.test( s.url ) || + inspectData && jsre.test( s.data ) ) ) { + + var responseContainer, + jsonpCallback = s.jsonpCallback = + jQuery.isFunction( s.jsonpCallback ) ? s.jsonpCallback() : s.jsonpCallback, + previous = window[ jsonpCallback ], + url = s.url, + data = s.data, + replace = "$1" + jsonpCallback + "$2"; + + if ( s.jsonp !== false ) { + url = url.replace( jsre, replace ); + if ( s.url === url ) { + if ( inspectData ) { + data = data.replace( jsre, replace ); + } + if ( s.data === data ) { + // Add callback manually + url += (/\?/.test( url ) ? "&" : "?") + s.jsonp + "=" + jsonpCallback; + } + } + } + + s.url = url; + s.data = data; + + // Install callback + window[ jsonpCallback ] = function( response ) { + responseContainer = [ response ]; + }; + + // Clean-up function + jqXHR.always(function() { + // Set callback back to previous value + window[ jsonpCallback ] = previous; + // Call if it was a function and we have a response + if ( responseContainer && jQuery.isFunction( previous ) ) { + window[ jsonpCallback ]( responseContainer[ 0 ] ); + } + }); + + // Use data converter to retrieve json after script execution + s.converters["script json"] = function() { + if ( !responseContainer ) { + jQuery.error( jsonpCallback + " was not called" ); + } + return responseContainer[ 0 ]; + }; + + // force json dataType + s.dataTypes[ 0 ] = "json"; + + // Delegate to script + return "script"; + } +}); + + + + +// Install script dataType +jQuery.ajaxSetup({ + accepts: { + script: "text/javascript, application/javascript, application/ecmascript, application/x-ecmascript" + }, + contents: { + script: /javascript|ecmascript/ + }, + converters: { + "text script": function( text ) { + jQuery.globalEval( text ); + return text; + } + } +}); + +// Handle cache's special case and global +jQuery.ajaxPrefilter( "script", function( s ) { + if ( s.cache === undefined ) { + s.cache = false; + } + if ( s.crossDomain ) { + s.type = "GET"; + s.global = false; + } +}); + +// Bind script tag hack transport +jQuery.ajaxTransport( "script", function(s) { + + // This transport only deals with cross domain requests + if ( s.crossDomain ) { + + var script, + head = document.head || document.getElementsByTagName( "head" )[0] || document.documentElement; + + return { + + send: function( _, callback ) { + + script = document.createElement( "script" ); + + script.async = "async"; + + if ( s.scriptCharset ) { + script.charset = s.scriptCharset; + } + + script.src = s.url; + + // Attach handlers for all browsers + script.onload = script.onreadystatechange = function( _, isAbort ) { + + if ( isAbort || !script.readyState || /loaded|complete/.test( script.readyState ) ) { + + // Handle memory leak in IE + script.onload = script.onreadystatechange = null; + + // Remove the script + if ( head && script.parentNode ) { + head.removeChild( script ); + } + + // Dereference the script + script = undefined; + + // Callback if not abort + if ( !isAbort ) { + callback( 200, "success" ); + } + } + }; + // Use insertBefore instead of appendChild to circumvent an IE6 bug. + // This arises when a base node is used (#2709 and #4378). + head.insertBefore( script, head.firstChild ); + }, + + abort: function() { + if ( script ) { + script.onload( 0, 1 ); + } + } + }; + } +}); + + + + +var // #5280: Internet Explorer will keep connections alive if we don't abort on unload + xhrOnUnloadAbort = window.ActiveXObject ? function() { + // Abort all pending requests + for ( var key in xhrCallbacks ) { + xhrCallbacks[ key ]( 0, 1 ); + } + } : false, + xhrId = 0, + xhrCallbacks; + +// Functions to create xhrs +function createStandardXHR() { + try { + return new window.XMLHttpRequest(); + } catch( e ) {} +} + +function createActiveXHR() { + try { + return new window.ActiveXObject( "Microsoft.XMLHTTP" ); + } catch( e ) {} +} + +// Create the request object +// (This is still attached to ajaxSettings for backward compatibility) +jQuery.ajaxSettings.xhr = window.ActiveXObject ? + /* Microsoft failed to properly + * implement the XMLHttpRequest in IE7 (can't request local files), + * so we use the ActiveXObject when it is available + * Additionally XMLHttpRequest can be disabled in IE7/IE8 so + * we need a fallback. + */ + function() { + return !this.isLocal && createStandardXHR() || createActiveXHR(); + } : + // For all other browsers, use the standard XMLHttpRequest object + createStandardXHR; + +// Determine support properties +(function( xhr ) { + jQuery.extend( jQuery.support, { + ajax: !!xhr, + cors: !!xhr && ( "withCredentials" in xhr ) + }); +})( jQuery.ajaxSettings.xhr() ); + +// Create transport if the browser can provide an xhr +if ( jQuery.support.ajax ) { + + jQuery.ajaxTransport(function( s ) { + // Cross domain only allowed if supported through XMLHttpRequest + if ( !s.crossDomain || jQuery.support.cors ) { + + var callback; + + return { + send: function( headers, complete ) { + + // Get a new xhr + var xhr = s.xhr(), + handle, + i; + + // Open the socket + // Passing null username, generates a login popup on Opera (#2865) + if ( s.username ) { + xhr.open( s.type, s.url, s.async, s.username, s.password ); + } else { + xhr.open( s.type, s.url, s.async ); + } + + // Apply custom fields if provided + if ( s.xhrFields ) { + for ( i in s.xhrFields ) { + xhr[ i ] = s.xhrFields[ i ]; + } + } + + // Override mime type if needed + if ( s.mimeType && xhr.overrideMimeType ) { + xhr.overrideMimeType( s.mimeType ); + } + + // X-Requested-With header + // For cross-domain requests, seeing as conditions for a preflight are + // akin to a jigsaw puzzle, we simply never set it to be sure. + // (it can always be set on a per-request basis or even using ajaxSetup) + // For same-domain requests, won't change header if already provided. + if ( !s.crossDomain && !headers["X-Requested-With"] ) { + headers[ "X-Requested-With" ] = "XMLHttpRequest"; + } + + // Need an extra try/catch for cross domain requests in Firefox 3 + try { + for ( i in headers ) { + xhr.setRequestHeader( i, headers[ i ] ); + } + } catch( _ ) {} + + // Do send the request + // This may raise an exception which is actually + // handled in jQuery.ajax (so no try/catch here) + xhr.send( ( s.hasContent && s.data ) || null ); + + // Listener + callback = function( _, isAbort ) { + + var status, + statusText, + responseHeaders, + responses, + xml; + + // Firefox throws exceptions when accessing properties + // of an xhr when a network error occured + // http://helpful.knobs-dials.com/index.php/Component_returned_failure_code:_0x80040111_(NS_ERROR_NOT_AVAILABLE) + try { + + // Was never called and is aborted or complete + if ( callback && ( isAbort || xhr.readyState === 4 ) ) { + + // Only called once + callback = undefined; + + // Do not keep as active anymore + if ( handle ) { + xhr.onreadystatechange = jQuery.noop; + if ( xhrOnUnloadAbort ) { + delete xhrCallbacks[ handle ]; + } + } + + // If it's an abort + if ( isAbort ) { + // Abort it manually if needed + if ( xhr.readyState !== 4 ) { + xhr.abort(); + } + } else { + status = xhr.status; + responseHeaders = xhr.getAllResponseHeaders(); + responses = {}; + xml = xhr.responseXML; + + // Construct response list + if ( xml && xml.documentElement /* #4958 */ ) { + responses.xml = xml; + } + responses.text = xhr.responseText; + + // Firefox throws an exception when accessing + // statusText for faulty cross-domain requests + try { + statusText = xhr.statusText; + } catch( e ) { + // We normalize with Webkit giving an empty statusText + statusText = ""; + } + + // Filter status for non standard behaviors + + // If the request is local and we have data: assume a success + // (success with no data won't get notified, that's the best we + // can do given current implementations) + if ( !status && s.isLocal && !s.crossDomain ) { + status = responses.text ? 200 : 404; + // IE - #1450: sometimes returns 1223 when it should be 204 + } else if ( status === 1223 ) { + status = 204; + } + } + } + } catch( firefoxAccessException ) { + if ( !isAbort ) { + complete( -1, firefoxAccessException ); + } + } + + // Call complete if needed + if ( responses ) { + complete( status, statusText, responses, responseHeaders ); + } + }; + + // if we're in sync mode or it's in cache + // and has been retrieved directly (IE6 & IE7) + // we need to manually fire the callback + if ( !s.async || xhr.readyState === 4 ) { + callback(); + } else { + handle = ++xhrId; + if ( xhrOnUnloadAbort ) { + // Create the active xhrs callbacks list if needed + // and attach the unload handler + if ( !xhrCallbacks ) { + xhrCallbacks = {}; + jQuery( window ).unload( xhrOnUnloadAbort ); + } + // Add to list of active xhrs callbacks + xhrCallbacks[ handle ] = callback; + } + xhr.onreadystatechange = callback; + } + }, + + abort: function() { + if ( callback ) { + callback(0,1); + } + } + }; + } + }); +} + + + + +var elemdisplay = {}, + iframe, iframeDoc, + rfxtypes = /^(?:toggle|show|hide)$/, + rfxnum = /^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i, + timerId, + fxAttrs = [ + // height animations + [ "height", "marginTop", "marginBottom", "paddingTop", "paddingBottom" ], + // width animations + [ "width", "marginLeft", "marginRight", "paddingLeft", "paddingRight" ], + // opacity animations + [ "opacity" ] + ], + fxNow; + +jQuery.fn.extend({ + show: function( speed, easing, callback ) { + var elem, display; + + if ( speed || speed === 0 ) { + return this.animate( genFx("show", 3), speed, easing, callback); + + } else { + for ( var i = 0, j = this.length; i < j; i++ ) { + elem = this[i]; + + if ( elem.style ) { + display = elem.style.display; + + // Reset the inline display of this element to learn if it is + // being hidden by cascaded rules or not + if ( !jQuery._data(elem, "olddisplay") && display === "none" ) { + display = elem.style.display = ""; + } + + // Set elements which have been overridden with display: none + // in a stylesheet to whatever the default browser style is + // for such an element + if ( display === "" && jQuery.css( elem, "display" ) === "none" ) { + jQuery._data(elem, "olddisplay", defaultDisplay(elem.nodeName)); + } + } + } + + // Set the display of most of the elements in a second loop + // to avoid the constant reflow + for ( i = 0; i < j; i++ ) { + elem = this[i]; + + if ( elem.style ) { + display = elem.style.display; + + if ( display === "" || display === "none" ) { + elem.style.display = jQuery._data(elem, "olddisplay") || ""; + } + } + } + + return this; + } + }, + + hide: function( speed, easing, callback ) { + if ( speed || speed === 0 ) { + return this.animate( genFx("hide", 3), speed, easing, callback); + + } else { + for ( var i = 0, j = this.length; i < j; i++ ) { + if ( this[i].style ) { + var display = jQuery.css( this[i], "display" ); + + if ( display !== "none" && !jQuery._data( this[i], "olddisplay" ) ) { + jQuery._data( this[i], "olddisplay", display ); + } + } + } + + // Set the display of the elements in a second loop + // to avoid the constant reflow + for ( i = 0; i < j; i++ ) { + if ( this[i].style ) { + this[i].style.display = "none"; + } + } + + return this; + } + }, + + // Save the old toggle function + _toggle: jQuery.fn.toggle, + + toggle: function( fn, fn2, callback ) { + var bool = typeof fn === "boolean"; + + if ( jQuery.isFunction(fn) && jQuery.isFunction(fn2) ) { + this._toggle.apply( this, arguments ); + + } else if ( fn == null || bool ) { + this.each(function() { + var state = bool ? fn : jQuery(this).is(":hidden"); + jQuery(this)[ state ? "show" : "hide" ](); + }); + + } else { + this.animate(genFx("toggle", 3), fn, fn2, callback); + } + + return this; + }, + + fadeTo: function( speed, to, easing, callback ) { + return this.filter(":hidden").css("opacity", 0).show().end() + .animate({opacity: to}, speed, easing, callback); + }, + + animate: function( prop, speed, easing, callback ) { + var optall = jQuery.speed(speed, easing, callback); + + if ( jQuery.isEmptyObject( prop ) ) { + return this.each( optall.complete, [ false ] ); + } + + // Do not change referenced properties as per-property easing will be lost + prop = jQuery.extend( {}, prop ); + + return this[ optall.queue === false ? "each" : "queue" ](function() { + // XXX 'this' does not always have a nodeName when running the + // test suite + + if ( optall.queue === false ) { + jQuery._mark( this ); + } + + var opt = jQuery.extend( {}, optall ), + isElement = this.nodeType === 1, + hidden = isElement && jQuery(this).is(":hidden"), + name, val, p, + display, e, + parts, start, end, unit; + + // will store per property easing and be used to determine when an animation is complete + opt.animatedProperties = {}; + + for ( p in prop ) { + + // property name normalization + name = jQuery.camelCase( p ); + if ( p !== name ) { + prop[ name ] = prop[ p ]; + delete prop[ p ]; + } + + val = prop[ name ]; + + // easing resolution: per property > opt.specialEasing > opt.easing > 'swing' (default) + if ( jQuery.isArray( val ) ) { + opt.animatedProperties[ name ] = val[ 1 ]; + val = prop[ name ] = val[ 0 ]; + } else { + opt.animatedProperties[ name ] = opt.specialEasing && opt.specialEasing[ name ] || opt.easing || 'swing'; + } + + if ( val === "hide" && hidden || val === "show" && !hidden ) { + return opt.complete.call( this ); + } + + if ( isElement && ( name === "height" || name === "width" ) ) { + // Make sure that nothing sneaks out + // Record all 3 overflow attributes because IE does not + // change the overflow attribute when overflowX and + // overflowY are set to the same value + opt.overflow = [ this.style.overflow, this.style.overflowX, this.style.overflowY ]; + + // Set display property to inline-block for height/width + // animations on inline elements that are having width/height + // animated + if ( jQuery.css( this, "display" ) === "inline" && + jQuery.css( this, "float" ) === "none" ) { + if ( !jQuery.support.inlineBlockNeedsLayout ) { + this.style.display = "inline-block"; + + } else { + display = defaultDisplay( this.nodeName ); + + // inline-level elements accept inline-block; + // block-level elements need to be inline with layout + if ( display === "inline" ) { + this.style.display = "inline-block"; + + } else { + this.style.display = "inline"; + this.style.zoom = 1; + } + } + } + } + } + + if ( opt.overflow != null ) { + this.style.overflow = "hidden"; + } + + for ( p in prop ) { + e = new jQuery.fx( this, opt, p ); + val = prop[ p ]; + + if ( rfxtypes.test(val) ) { + e[ val === "toggle" ? hidden ? "show" : "hide" : val ](); + + } else { + parts = rfxnum.exec( val ); + start = e.cur(); + + if ( parts ) { + end = parseFloat( parts[2] ); + unit = parts[3] || ( jQuery.cssNumber[ p ] ? "" : "px" ); + + // We need to compute starting value + if ( unit !== "px" ) { + jQuery.style( this, p, (end || 1) + unit); + start = ((end || 1) / e.cur()) * start; + jQuery.style( this, p, start + unit); + } + + // If a +=/-= token was provided, we're doing a relative animation + if ( parts[1] ) { + end = ( (parts[ 1 ] === "-=" ? -1 : 1) * end ) + start; + } + + e.custom( start, end, unit ); + + } else { + e.custom( start, val, "" ); + } + } + } + + // For JS strict compliance + return true; + }); + }, + + stop: function( clearQueue, gotoEnd ) { + if ( clearQueue ) { + this.queue([]); + } + + this.each(function() { + var timers = jQuery.timers, + i = timers.length; + // clear marker counters if we know they won't be + if ( !gotoEnd ) { + jQuery._unmark( true, this ); + } + while ( i-- ) { + if ( timers[i].elem === this ) { + if (gotoEnd) { + // force the next step to be the last + timers[i](true); + } + + timers.splice(i, 1); + } + } + }); + + // start the next in the queue if the last step wasn't forced + if ( !gotoEnd ) { + this.dequeue(); + } + + return this; + } + +}); + +// Animations created synchronously will run synchronously +function createFxNow() { + setTimeout( clearFxNow, 0 ); + return ( fxNow = jQuery.now() ); +} + +function clearFxNow() { + fxNow = undefined; +} + +// Generate parameters to create a standard animation +function genFx( type, num ) { + var obj = {}; + + jQuery.each( fxAttrs.concat.apply([], fxAttrs.slice(0,num)), function() { + obj[ this ] = type; + }); + + return obj; +} + +// Generate shortcuts for custom animations +jQuery.each({ + slideDown: genFx("show", 1), + slideUp: genFx("hide", 1), + slideToggle: genFx("toggle", 1), + fadeIn: { opacity: "show" }, + fadeOut: { opacity: "hide" }, + fadeToggle: { opacity: "toggle" } +}, function( name, props ) { + jQuery.fn[ name ] = function( speed, easing, callback ) { + return this.animate( props, speed, easing, callback ); + }; +}); + +jQuery.extend({ + speed: function( speed, easing, fn ) { + var opt = speed && typeof speed === "object" ? jQuery.extend({}, speed) : { + complete: fn || !fn && easing || + jQuery.isFunction( speed ) && speed, + duration: speed, + easing: fn && easing || easing && !jQuery.isFunction(easing) && easing + }; + + opt.duration = jQuery.fx.off ? 0 : typeof opt.duration === "number" ? opt.duration : + opt.duration in jQuery.fx.speeds ? jQuery.fx.speeds[opt.duration] : jQuery.fx.speeds._default; + + // Queueing + opt.old = opt.complete; + opt.complete = function( noUnmark ) { + if ( jQuery.isFunction( opt.old ) ) { + opt.old.call( this ); + } + + if ( opt.queue !== false ) { + jQuery.dequeue( this ); + } else if ( noUnmark !== false ) { + jQuery._unmark( this ); + } + }; + + return opt; + }, + + easing: { + linear: function( p, n, firstNum, diff ) { + return firstNum + diff * p; + }, + swing: function( p, n, firstNum, diff ) { + return ((-Math.cos(p*Math.PI)/2) + 0.5) * diff + firstNum; + } + }, + + timers: [], + + fx: function( elem, options, prop ) { + this.options = options; + this.elem = elem; + this.prop = prop; + + options.orig = options.orig || {}; + } + +}); + +jQuery.fx.prototype = { + // Simple function for setting a style value + update: function() { + if ( this.options.step ) { + this.options.step.call( this.elem, this.now, this ); + } + + (jQuery.fx.step[this.prop] || jQuery.fx.step._default)( this ); + }, + + // Get the current size + cur: function() { + if ( this.elem[this.prop] != null && (!this.elem.style || this.elem.style[this.prop] == null) ) { + return this.elem[ this.prop ]; + } + + var parsed, + r = jQuery.css( this.elem, this.prop ); + // Empty strings, null, undefined and "auto" are converted to 0, + // complex values such as "rotate(1rad)" are returned as is, + // simple values such as "10px" are parsed to Float. + return isNaN( parsed = parseFloat( r ) ) ? !r || r === "auto" ? 0 : r : parsed; + }, + + // Start an animation from one number to another + custom: function( from, to, unit ) { + var self = this, + fx = jQuery.fx; + + this.startTime = fxNow || createFxNow(); + this.start = from; + this.end = to; + this.unit = unit || this.unit || ( jQuery.cssNumber[ this.prop ] ? "" : "px" ); + this.now = this.start; + this.pos = this.state = 0; + + function t( gotoEnd ) { + return self.step(gotoEnd); + } + + t.elem = this.elem; + + if ( t() && jQuery.timers.push(t) && !timerId ) { + timerId = setInterval( fx.tick, fx.interval ); + } + }, + + // Simple 'show' function + show: function() { + // Remember where we started, so that we can go back to it later + this.options.orig[this.prop] = jQuery.style( this.elem, this.prop ); + this.options.show = true; + + // Begin the animation + // Make sure that we start at a small width/height to avoid any + // flash of content + this.custom(this.prop === "width" || this.prop === "height" ? 1 : 0, this.cur()); + + // Start by showing the element + jQuery( this.elem ).show(); + }, + + // Simple 'hide' function + hide: function() { + // Remember where we started, so that we can go back to it later + this.options.orig[this.prop] = jQuery.style( this.elem, this.prop ); + this.options.hide = true; + + // Begin the animation + this.custom(this.cur(), 0); + }, + + // Each step of an animation + step: function( gotoEnd ) { + var t = fxNow || createFxNow(), + done = true, + elem = this.elem, + options = this.options, + i, n; + + if ( gotoEnd || t >= options.duration + this.startTime ) { + this.now = this.end; + this.pos = this.state = 1; + this.update(); + + options.animatedProperties[ this.prop ] = true; + + for ( i in options.animatedProperties ) { + if ( options.animatedProperties[i] !== true ) { + done = false; + } + } + + if ( done ) { + // Reset the overflow + if ( options.overflow != null && !jQuery.support.shrinkWrapBlocks ) { + + jQuery.each( [ "", "X", "Y" ], function (index, value) { + elem.style[ "overflow" + value ] = options.overflow[index]; + }); + } + + // Hide the element if the "hide" operation was done + if ( options.hide ) { + jQuery(elem).hide(); + } + + // Reset the properties, if the item has been hidden or shown + if ( options.hide || options.show ) { + for ( var p in options.animatedProperties ) { + jQuery.style( elem, p, options.orig[p] ); + } + } + + // Execute the complete function + options.complete.call( elem ); + } + + return false; + + } else { + // classical easing cannot be used with an Infinity duration + if ( options.duration == Infinity ) { + this.now = t; + } else { + n = t - this.startTime; + this.state = n / options.duration; + + // Perform the easing function, defaults to swing + this.pos = jQuery.easing[ options.animatedProperties[ this.prop ] ]( this.state, n, 0, 1, options.duration ); + this.now = this.start + ((this.end - this.start) * this.pos); + } + // Perform the next step of the animation + this.update(); + } + + return true; + } +}; + +jQuery.extend( jQuery.fx, { + tick: function() { + for ( var timers = jQuery.timers, i = 0 ; i < timers.length ; ++i ) { + if ( !timers[i]() ) { + timers.splice(i--, 1); + } + } + + if ( !timers.length ) { + jQuery.fx.stop(); + } + }, + + interval: 13, + + stop: function() { + clearInterval( timerId ); + timerId = null; + }, + + speeds: { + slow: 600, + fast: 200, + // Default speed + _default: 400 + }, + + step: { + opacity: function( fx ) { + jQuery.style( fx.elem, "opacity", fx.now ); + }, + + _default: function( fx ) { + if ( fx.elem.style && fx.elem.style[ fx.prop ] != null ) { + fx.elem.style[ fx.prop ] = (fx.prop === "width" || fx.prop === "height" ? Math.max(0, fx.now) : fx.now) + fx.unit; + } else { + fx.elem[ fx.prop ] = fx.now; + } + } + } +}); + +if ( jQuery.expr && jQuery.expr.filters ) { + jQuery.expr.filters.animated = function( elem ) { + return jQuery.grep(jQuery.timers, function( fn ) { + return elem === fn.elem; + }).length; + }; +} + +// Try to restore the default display value of an element +function defaultDisplay( nodeName ) { + + if ( !elemdisplay[ nodeName ] ) { + + var body = document.body, + elem = jQuery( "<" + nodeName + ">" ).appendTo( body ), + display = elem.css( "display" ); + + elem.remove(); + + // If the simple way fails, + // get element's real default display by attaching it to a temp iframe + if ( display === "none" || display === "" ) { + // No iframe to use yet, so create it + if ( !iframe ) { + iframe = document.createElement( "iframe" ); + iframe.frameBorder = iframe.width = iframe.height = 0; + } + + body.appendChild( iframe ); + + // Create a cacheable copy of the iframe document on first call. + // IE and Opera will allow us to reuse the iframeDoc without re-writing the fake HTML + // document to it; WebKit & Firefox won't allow reusing the iframe document. + if ( !iframeDoc || !iframe.createElement ) { + iframeDoc = ( iframe.contentWindow || iframe.contentDocument ).document; + iframeDoc.write( ( document.compatMode === "CSS1Compat" ? "<!doctype html>" : "" ) + "<html><body>" ); + iframeDoc.close(); + } + + elem = iframeDoc.createElement( nodeName ); + + iframeDoc.body.appendChild( elem ); + + display = jQuery.css( elem, "display" ); + + body.removeChild( iframe ); + } + + // Store the correct default display + elemdisplay[ nodeName ] = display; + } + + return elemdisplay[ nodeName ]; +} + + + + +var rtable = /^t(?:able|d|h)$/i, + rroot = /^(?:body|html)$/i; + +if ( "getBoundingClientRect" in document.documentElement ) { + jQuery.fn.offset = function( options ) { + var elem = this[0], box; + + if ( options ) { + return this.each(function( i ) { + jQuery.offset.setOffset( this, options, i ); + }); + } + + if ( !elem || !elem.ownerDocument ) { + return null; + } + + if ( elem === elem.ownerDocument.body ) { + return jQuery.offset.bodyOffset( elem ); + } + + try { + box = elem.getBoundingClientRect(); + } catch(e) {} + + var doc = elem.ownerDocument, + docElem = doc.documentElement; + + // Make sure we're not dealing with a disconnected DOM node + if ( !box || !jQuery.contains( docElem, elem ) ) { + return box ? { top: box.top, left: box.left } : { top: 0, left: 0 }; + } + + var body = doc.body, + win = getWindow(doc), + clientTop = docElem.clientTop || body.clientTop || 0, + clientLeft = docElem.clientLeft || body.clientLeft || 0, + scrollTop = win.pageYOffset || jQuery.support.boxModel && docElem.scrollTop || body.scrollTop, + scrollLeft = win.pageXOffset || jQuery.support.boxModel && docElem.scrollLeft || body.scrollLeft, + top = box.top + scrollTop - clientTop, + left = box.left + scrollLeft - clientLeft; + + return { top: top, left: left }; + }; + +} else { + jQuery.fn.offset = function( options ) { + var elem = this[0]; + + if ( options ) { + return this.each(function( i ) { + jQuery.offset.setOffset( this, options, i ); + }); + } + + if ( !elem || !elem.ownerDocument ) { + return null; + } + + if ( elem === elem.ownerDocument.body ) { + return jQuery.offset.bodyOffset( elem ); + } + + jQuery.offset.initialize(); + + var computedStyle, + offsetParent = elem.offsetParent, + prevOffsetParent = elem, + doc = elem.ownerDocument, + docElem = doc.documentElement, + body = doc.body, + defaultView = doc.defaultView, + prevComputedStyle = defaultView ? defaultView.getComputedStyle( elem, null ) : elem.currentStyle, + top = elem.offsetTop, + left = elem.offsetLeft; + + while ( (elem = elem.parentNode) && elem !== body && elem !== docElem ) { + if ( jQuery.offset.supportsFixedPosition && prevComputedStyle.position === "fixed" ) { + break; + } + + computedStyle = defaultView ? defaultView.getComputedStyle(elem, null) : elem.currentStyle; + top -= elem.scrollTop; + left -= elem.scrollLeft; + + if ( elem === offsetParent ) { + top += elem.offsetTop; + left += elem.offsetLeft; + + if ( jQuery.offset.doesNotAddBorder && !(jQuery.offset.doesAddBorderForTableAndCells && rtable.test(elem.nodeName)) ) { + top += parseFloat( computedStyle.borderTopWidth ) || 0; + left += parseFloat( computedStyle.borderLeftWidth ) || 0; + } + + prevOffsetParent = offsetParent; + offsetParent = elem.offsetParent; + } + + if ( jQuery.offset.subtractsBorderForOverflowNotVisible && computedStyle.overflow !== "visible" ) { + top += parseFloat( computedStyle.borderTopWidth ) || 0; + left += parseFloat( computedStyle.borderLeftWidth ) || 0; + } + + prevComputedStyle = computedStyle; + } + + if ( prevComputedStyle.position === "relative" || prevComputedStyle.position === "static" ) { + top += body.offsetTop; + left += body.offsetLeft; + } + + if ( jQuery.offset.supportsFixedPosition && prevComputedStyle.position === "fixed" ) { + top += Math.max( docElem.scrollTop, body.scrollTop ); + left += Math.max( docElem.scrollLeft, body.scrollLeft ); + } + + return { top: top, left: left }; + }; +} + +jQuery.offset = { + initialize: function() { + var body = document.body, container = document.createElement("div"), innerDiv, checkDiv, table, td, bodyMarginTop = parseFloat( jQuery.css(body, "marginTop") ) || 0, + html = "<div style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;'><div></div></div><table style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;' cellpadding='0' cellspacing='0'><tr><td></td></tr></table>"; + + jQuery.extend( container.style, { position: "absolute", top: 0, left: 0, margin: 0, border: 0, width: "1px", height: "1px", visibility: "hidden" } ); + + container.innerHTML = html; + body.insertBefore( container, body.firstChild ); + innerDiv = container.firstChild; + checkDiv = innerDiv.firstChild; + td = innerDiv.nextSibling.firstChild.firstChild; + + this.doesNotAddBorder = (checkDiv.offsetTop !== 5); + this.doesAddBorderForTableAndCells = (td.offsetTop === 5); + + checkDiv.style.position = "fixed"; + checkDiv.style.top = "20px"; + + // safari subtracts parent border width here which is 5px + this.supportsFixedPosition = (checkDiv.offsetTop === 20 || checkDiv.offsetTop === 15); + checkDiv.style.position = checkDiv.style.top = ""; + + innerDiv.style.overflow = "hidden"; + innerDiv.style.position = "relative"; + + this.subtractsBorderForOverflowNotVisible = (checkDiv.offsetTop === -5); + + this.doesNotIncludeMarginInBodyOffset = (body.offsetTop !== bodyMarginTop); + + body.removeChild( container ); + jQuery.offset.initialize = jQuery.noop; + }, + + bodyOffset: function( body ) { + var top = body.offsetTop, + left = body.offsetLeft; + + jQuery.offset.initialize(); + + if ( jQuery.offset.doesNotIncludeMarginInBodyOffset ) { + top += parseFloat( jQuery.css(body, "marginTop") ) || 0; + left += parseFloat( jQuery.css(body, "marginLeft") ) || 0; + } + + return { top: top, left: left }; + }, + + setOffset: function( elem, options, i ) { + var position = jQuery.css( elem, "position" ); + + // set position first, in-case top/left are set even on static elem + if ( position === "static" ) { + elem.style.position = "relative"; + } + + var curElem = jQuery( elem ), + curOffset = curElem.offset(), + curCSSTop = jQuery.css( elem, "top" ), + curCSSLeft = jQuery.css( elem, "left" ), + calculatePosition = (position === "absolute" || position === "fixed") && jQuery.inArray("auto", [curCSSTop, curCSSLeft]) > -1, + props = {}, curPosition = {}, curTop, curLeft; + + // need to be able to calculate position if either top or left is auto and position is either absolute or fixed + if ( calculatePosition ) { + curPosition = curElem.position(); + curTop = curPosition.top; + curLeft = curPosition.left; + } else { + curTop = parseFloat( curCSSTop ) || 0; + curLeft = parseFloat( curCSSLeft ) || 0; + } + + if ( jQuery.isFunction( options ) ) { + options = options.call( elem, i, curOffset ); + } + + if (options.top != null) { + props.top = (options.top - curOffset.top) + curTop; + } + if (options.left != null) { + props.left = (options.left - curOffset.left) + curLeft; + } + + if ( "using" in options ) { + options.using.call( elem, props ); + } else { + curElem.css( props ); + } + } +}; + + +jQuery.fn.extend({ + position: function() { + if ( !this[0] ) { + return null; + } + + var elem = this[0], + + // Get *real* offsetParent + offsetParent = this.offsetParent(), + + // Get correct offsets + offset = this.offset(), + parentOffset = rroot.test(offsetParent[0].nodeName) ? { top: 0, left: 0 } : offsetParent.offset(); + + // Subtract element margins + // note: when an element has margin: auto the offsetLeft and marginLeft + // are the same in Safari causing offset.left to incorrectly be 0 + offset.top -= parseFloat( jQuery.css(elem, "marginTop") ) || 0; + offset.left -= parseFloat( jQuery.css(elem, "marginLeft") ) || 0; + + // Add offsetParent borders + parentOffset.top += parseFloat( jQuery.css(offsetParent[0], "borderTopWidth") ) || 0; + parentOffset.left += parseFloat( jQuery.css(offsetParent[0], "borderLeftWidth") ) || 0; + + // Subtract the two offsets + return { + top: offset.top - parentOffset.top, + left: offset.left - parentOffset.left + }; + }, + + offsetParent: function() { + return this.map(function() { + var offsetParent = this.offsetParent || document.body; + while ( offsetParent && (!rroot.test(offsetParent.nodeName) && jQuery.css(offsetParent, "position") === "static") ) { + offsetParent = offsetParent.offsetParent; + } + return offsetParent; + }); + } +}); + + +// Create scrollLeft and scrollTop methods +jQuery.each( ["Left", "Top"], function( i, name ) { + var method = "scroll" + name; + + jQuery.fn[ method ] = function( val ) { + var elem, win; + + if ( val === undefined ) { + elem = this[ 0 ]; + + if ( !elem ) { + return null; + } + + win = getWindow( elem ); + + // Return the scroll offset + return win ? ("pageXOffset" in win) ? win[ i ? "pageYOffset" : "pageXOffset" ] : + jQuery.support.boxModel && win.document.documentElement[ method ] || + win.document.body[ method ] : + elem[ method ]; + } + + // Set the scroll offset + return this.each(function() { + win = getWindow( this ); + + if ( win ) { + win.scrollTo( + !i ? val : jQuery( win ).scrollLeft(), + i ? val : jQuery( win ).scrollTop() + ); + + } else { + this[ method ] = val; + } + }); + }; +}); + +function getWindow( elem ) { + return jQuery.isWindow( elem ) ? + elem : + elem.nodeType === 9 ? + elem.defaultView || elem.parentWindow : + false; +} + + + + +// Create width, height, innerHeight, innerWidth, outerHeight and outerWidth methods +jQuery.each([ "Height", "Width" ], function( i, name ) { + + var type = name.toLowerCase(); + + // innerHeight and innerWidth + jQuery.fn[ "inner" + name ] = function() { + var elem = this[0]; + return elem && elem.style ? + parseFloat( jQuery.css( elem, type, "padding" ) ) : + null; + }; + + // outerHeight and outerWidth + jQuery.fn[ "outer" + name ] = function( margin ) { + var elem = this[0]; + return elem && elem.style ? + parseFloat( jQuery.css( elem, type, margin ? "margin" : "border" ) ) : + null; + }; + + jQuery.fn[ type ] = function( size ) { + // Get window width or height + var elem = this[0]; + if ( !elem ) { + return size == null ? null : this; + } + + if ( jQuery.isFunction( size ) ) { + return this.each(function( i ) { + var self = jQuery( this ); + self[ type ]( size.call( this, i, self[ type ]() ) ); + }); + } + + if ( jQuery.isWindow( elem ) ) { + // Everyone else use document.documentElement or document.body depending on Quirks vs Standards mode + // 3rd condition allows Nokia support, as it supports the docElem prop but not CSS1Compat + var docElemProp = elem.document.documentElement[ "client" + name ], + body = elem.document.body; + return elem.document.compatMode === "CSS1Compat" && docElemProp || + body && body[ "client" + name ] || docElemProp; + + // Get document width or height + } else if ( elem.nodeType === 9 ) { + // Either scroll[Width/Height] or offset[Width/Height], whichever is greater + return Math.max( + elem.documentElement["client" + name], + elem.body["scroll" + name], elem.documentElement["scroll" + name], + elem.body["offset" + name], elem.documentElement["offset" + name] + ); + + // Get or set width or height on the element + } else if ( size === undefined ) { + var orig = jQuery.css( elem, type ), + ret = parseFloat( orig ); + + return jQuery.isNaN( ret ) ? orig : ret; + + // Set the width or height on the element (default to pixels if value is unitless) + } else { + return this.css( type, typeof size === "string" ? size : size + "px" ); + } + }; + +}); + + +// Expose jQuery to the global object +window.jQuery = window.$ = jQuery; +})(window); diff --git a/libreplan-webapp/src/main/webapp/jqplot/jquery.min.js b/libreplan-webapp/src/main/webapp/jqplot/jquery.min.js new file mode 100644 index 000000000..628ed9b31 --- /dev/null +++ b/libreplan-webapp/src/main/webapp/jqplot/jquery.min.js @@ -0,0 +1,4 @@ +/*! jQuery v1.6.4 http://jquery.com/ | http://jquery.org/license */ +(function(a,b){function cu(a){return f.isWindow(a)?a:a.nodeType===9?a.defaultView||a.parentWindow:!1}function cr(a){if(!cg[a]){var b=c.body,d=f("<"+a+">").appendTo(b),e=d.css("display");d.remove();if(e==="none"||e===""){ch||(ch=c.createElement("iframe"),ch.frameBorder=ch.width=ch.height=0),b.appendChild(ch);if(!ci||!ch.createElement)ci=(ch.contentWindow||ch.contentDocument).document,ci.write((c.compatMode==="CSS1Compat"?"<!doctype html>":"")+"<html><body>"),ci.close();d=ci.createElement(a),ci.body.appendChild(d),e=f.css(d,"display"),b.removeChild(ch)}cg[a]=e}return cg[a]}function cq(a,b){var c={};f.each(cm.concat.apply([],cm.slice(0,b)),function(){c[this]=a});return c}function cp(){cn=b}function co(){setTimeout(cp,0);return cn=f.now()}function cf(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}function ce(){try{return new a.XMLHttpRequest}catch(b){}}function b$(a,c){a.dataFilter&&(c=a.dataFilter(c,a.dataType));var d=a.dataTypes,e={},g,h,i=d.length,j,k=d[0],l,m,n,o,p;for(g=1;g<i;g++){if(g===1)for(h in a.converters)typeof h=="string"&&(e[h.toLowerCase()]=a.converters[h]);l=k,k=d[g];if(k==="*")k=l;else if(l!=="*"&&l!==k){m=l+" "+k,n=e[m]||e["* "+k];if(!n){p=b;for(o in e){j=o.split(" ");if(j[0]===l||j[0]==="*"){p=e[j[1]+" "+k];if(p){o=e[o],o===!0?n=p:p===!0&&(n=o);break}}}}!n&&!p&&f.error("No conversion from "+m.replace(" "," to ")),n!==!0&&(c=n?n(c):p(o(c)))}}return c}function bZ(a,c,d){var e=a.contents,f=a.dataTypes,g=a.responseFields,h,i,j,k;for(i in g)i in d&&(c[g[i]]=d[i]);while(f[0]==="*")f.shift(),h===b&&(h=a.mimeType||c.getResponseHeader("content-type"));if(h)for(i in e)if(e[i]&&e[i].test(h)){f.unshift(i);break}if(f[0]in d)j=f[0];else{for(i in d){if(!f[0]||a.converters[i+" "+f[0]]){j=i;break}k||(k=i)}j=j||k}if(j){j!==f[0]&&f.unshift(j);return d[j]}}function bY(a,b,c,d){if(f.isArray(b))f.each(b,function(b,e){c||bA.test(a)?d(a,e):bY(a+"["+(typeof e=="object"||f.isArray(e)?b:"")+"]",e,c,d)});else if(!c&&b!=null&&typeof b=="object")for(var e in b)bY(a+"["+e+"]",b[e],c,d);else d(a,b)}function bX(a,c){var d,e,g=f.ajaxSettings.flatOptions||{};for(d in c)c[d]!==b&&((g[d]?a:e||(e={}))[d]=c[d]);e&&f.extend(!0,a,e)}function bW(a,c,d,e,f,g){f=f||c.dataTypes[0],g=g||{},g[f]=!0;var h=a[f],i=0,j=h?h.length:0,k=a===bP,l;for(;i<j&&(k||!l);i++)l=h[i](c,d,e),typeof l=="string"&&(!k||g[l]?l=b:(c.dataTypes.unshift(l),l=bW(a,c,d,e,l,g)));(k||!l)&&!g["*"]&&(l=bW(a,c,d,e,"*",g));return l}function bV(a){return function(b,c){typeof b!="string"&&(c=b,b="*");if(f.isFunction(c)){var d=b.toLowerCase().split(bL),e=0,g=d.length,h,i,j;for(;e<g;e++)h=d[e],j=/^\+/.test(h),j&&(h=h.substr(1)||"*"),i=a[h]=a[h]||[],i[j?"unshift":"push"](c)}}}function by(a,b,c){var d=b==="width"?a.offsetWidth:a.offsetHeight,e=b==="width"?bt:bu;if(d>0){c!=="border"&&f.each(e,function(){c||(d-=parseFloat(f.css(a,"padding"+this))||0),c==="margin"?d+=parseFloat(f.css(a,c+this))||0:d-=parseFloat(f.css(a,"border"+this+"Width"))||0});return d+"px"}d=bv(a,b,b);if(d<0||d==null)d=a.style[b]||0;d=parseFloat(d)||0,c&&f.each(e,function(){d+=parseFloat(f.css(a,"padding"+this))||0,c!=="padding"&&(d+=parseFloat(f.css(a,"border"+this+"Width"))||0),c==="margin"&&(d+=parseFloat(f.css(a,c+this))||0)});return d+"px"}function bl(a,b){b.src?f.ajax({url:b.src,async:!1,dataType:"script"}):f.globalEval((b.text||b.textContent||b.innerHTML||"").replace(bd,"/*$0*/")),b.parentNode&&b.parentNode.removeChild(b)}function bk(a){f.nodeName(a,"input")?bj(a):"getElementsByTagName"in a&&f.grep(a.getElementsByTagName("input"),bj)}function bj(a){if(a.type==="checkbox"||a.type==="radio")a.defaultChecked=a.checked}function bi(a){return"getElementsByTagName"in a?a.getElementsByTagName("*"):"querySelectorAll"in a?a.querySelectorAll("*"):[]}function bh(a,b){var c;if(b.nodeType===1){b.clearAttributes&&b.clearAttributes(),b.mergeAttributes&&b.mergeAttributes(a),c=b.nodeName.toLowerCase();if(c==="object")b.outerHTML=a.outerHTML;else if(c!=="input"||a.type!=="checkbox"&&a.type!=="radio"){if(c==="option")b.selected=a.defaultSelected;else if(c==="input"||c==="textarea")b.defaultValue=a.defaultValue}else a.checked&&(b.defaultChecked=b.checked=a.checked),b.value!==a.value&&(b.value=a.value);b.removeAttribute(f.expando)}}function bg(a,b){if(b.nodeType===1&&!!f.hasData(a)){var c=f.expando,d=f.data(a),e=f.data(b,d);if(d=d[c]){var g=d.events;e=e[c]=f.extend({},d);if(g){delete e.handle,e.events={};for(var h in g)for(var i=0,j=g[h].length;i<j;i++)f.event.add(b,h+(g[h][i].namespace?".":"")+g[h][i].namespace,g[h][i],g[h][i].data)}}}}function bf(a,b){return f.nodeName(a,"table")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function V(a,b,c){b=b||0;if(f.isFunction(b))return f.grep(a,function(a,d){var e=!!b.call(a,d,a);return e===c});if(b.nodeType)return f.grep(a,function(a,d){return a===b===c});if(typeof b=="string"){var d=f.grep(a,function(a){return a.nodeType===1});if(Q.test(b))return f.filter(b,d,!c);b=f.filter(b,d)}return f.grep(a,function(a,d){return f.inArray(a,b)>=0===c})}function U(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function M(a,b){return(a&&a!=="*"?a+".":"")+b.replace(y,"`").replace(z,"&")}function L(a){var b,c,d,e,g,h,i,j,k,l,m,n,o,p=[],q=[],r=f._data(this,"events");if(!(a.liveFired===this||!r||!r.live||a.target.disabled||a.button&&a.type==="click")){a.namespace&&(n=new RegExp("(^|\\.)"+a.namespace.split(".").join("\\.(?:.*\\.)?")+"(\\.|$)")),a.liveFired=this;var s=r.live.slice(0);for(i=0;i<s.length;i++)g=s[i],g.origType.replace(w,"")===a.type?q.push(g.selector):s.splice(i--,1);e=f(a.target).closest(q,a.currentTarget);for(j=0,k=e.length;j<k;j++){m=e[j];for(i=0;i<s.length;i++){g=s[i];if(m.selector===g.selector&&(!n||n.test(g.namespace))&&!m.elem.disabled){h=m.elem,d=null;if(g.preType==="mouseenter"||g.preType==="mouseleave")a.type=g.preType,d=f(a.relatedTarget).closest(g.selector)[0],d&&f.contains(h,d)&&(d=h);(!d||d!==h)&&p.push({elem:h,handleObj:g,level:m.level})}}}for(j=0,k=p.length;j<k;j++){e=p[j];if(c&&e.level>c)break;a.currentTarget=e.elem,a.data=e.handleObj.data,a.handleObj=e.handleObj,o=e.handleObj.origHandler.apply(e.elem,arguments);if(o===!1||a.isPropagationStopped()){c=e.level,o===!1&&(b=!1);if(a.isImmediatePropagationStopped())break}}return b}}function J(a,c,d){var e=f.extend({},d[0]);e.type=a,e.originalEvent={},e.liveFired=b,f.event.handle.call(c,e),e.isDefaultPrevented()&&d[0].preventDefault()}function D(){return!0}function C(){return!1}function m(a,c,d){var e=c+"defer",g=c+"queue",h=c+"mark",i=f.data(a,e,b,!0);i&&(d==="queue"||!f.data(a,g,b,!0))&&(d==="mark"||!f.data(a,h,b,!0))&&setTimeout(function(){!f.data(a,g,b,!0)&&!f.data(a,h,b,!0)&&(f.removeData(a,e,!0),i.resolve())},0)}function l(a){for(var b in a)if(b!=="toJSON")return!1;return!0}function k(a,c,d){if(d===b&&a.nodeType===1){var e="data-"+c.replace(j,"-$1").toLowerCase();d=a.getAttribute(e);if(typeof d=="string"){try{d=d==="true"?!0:d==="false"?!1:d==="null"?null:f.isNaN(d)?i.test(d)?f.parseJSON(d):d:parseFloat(d)}catch(g){}f.data(a,c,d)}else d=b}return d}var c=a.document,d=a.navigator,e=a.location,f=function(){function K(){if(!e.isReady){try{c.documentElement.doScroll("left")}catch(a){setTimeout(K,1);return}e.ready()}}var e=function(a,b){return new e.fn.init(a,b,h)},f=a.jQuery,g=a.$,h,i=/^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,j=/\S/,k=/^\s+/,l=/\s+$/,m=/\d/,n=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,o=/^[\],:{}\s]*$/,p=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,q=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,r=/(?:^|:|,)(?:\s*\[)+/g,s=/(webkit)[ \/]([\w.]+)/,t=/(opera)(?:.*version)?[ \/]([\w.]+)/,u=/(msie) ([\w.]+)/,v=/(mozilla)(?:.*? rv:([\w.]+))?/,w=/-([a-z]|[0-9])/ig,x=/^-ms-/,y=function(a,b){return(b+"").toUpperCase()},z=d.userAgent,A,B,C,D=Object.prototype.toString,E=Object.prototype.hasOwnProperty,F=Array.prototype.push,G=Array.prototype.slice,H=String.prototype.trim,I=Array.prototype.indexOf,J={};e.fn=e.prototype={constructor:e,init:function(a,d,f){var g,h,j,k;if(!a)return this;if(a.nodeType){this.context=this[0]=a,this.length=1;return this}if(a==="body"&&!d&&c.body){this.context=c,this[0]=c.body,this.selector=a,this.length=1;return this}if(typeof a=="string"){a.charAt(0)!=="<"||a.charAt(a.length-1)!==">"||a.length<3?g=i.exec(a):g=[null,a,null];if(g&&(g[1]||!d)){if(g[1]){d=d instanceof e?d[0]:d,k=d?d.ownerDocument||d:c,j=n.exec(a),j?e.isPlainObject(d)?(a=[c.createElement(j[1])],e.fn.attr.call(a,d,!0)):a=[k.createElement(j[1])]:(j=e.buildFragment([g[1]],[k]),a=(j.cacheable?e.clone(j.fragment):j.fragment).childNodes);return e.merge(this,a)}h=c.getElementById(g[2]);if(h&&h.parentNode){if(h.id!==g[2])return f.find(a);this.length=1,this[0]=h}this.context=c,this.selector=a;return this}return!d||d.jquery?(d||f).find(a):this.constructor(d).find(a)}if(e.isFunction(a))return f.ready(a);a.selector!==b&&(this.selector=a.selector,this.context=a.context);return e.makeArray(a,this)},selector:"",jquery:"1.6.4",length:0,size:function(){return this.length},toArray:function(){return G.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this[this.length+a]:this[a]},pushStack:function(a,b,c){var d=this.constructor();e.isArray(a)?F.apply(d,a):e.merge(d,a),d.prevObject=this,d.context=this.context,b==="find"?d.selector=this.selector+(this.selector?" ":"")+c:b&&(d.selector=this.selector+"."+b+"("+c+")");return d},each:function(a,b){return e.each(this,a,b)},ready:function(a){e.bindReady(),B.done(a);return this},eq:function(a){return a===-1?this.slice(a):this.slice(a,+a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(G.apply(this,arguments),"slice",G.call(arguments).join(","))},map:function(a){return this.pushStack(e.map(this,function(b,c){return a.call(b,c,b)}))},end:function(){return this.prevObject||this.constructor(null)},push:F,sort:[].sort,splice:[].splice},e.fn.init.prototype=e.fn,e.extend=e.fn.extend=function(){var a,c,d,f,g,h,i=arguments[0]||{},j=1,k=arguments.length,l=!1;typeof i=="boolean"&&(l=i,i=arguments[1]||{},j=2),typeof i!="object"&&!e.isFunction(i)&&(i={}),k===j&&(i=this,--j);for(;j<k;j++)if((a=arguments[j])!=null)for(c in a){d=i[c],f=a[c];if(i===f)continue;l&&f&&(e.isPlainObject(f)||(g=e.isArray(f)))?(g?(g=!1,h=d&&e.isArray(d)?d:[]):h=d&&e.isPlainObject(d)?d:{},i[c]=e.extend(l,h,f)):f!==b&&(i[c]=f)}return i},e.extend({noConflict:function(b){a.$===e&&(a.$=g),b&&a.jQuery===e&&(a.jQuery=f);return e},isReady:!1,readyWait:1,holdReady:function(a){a?e.readyWait++:e.ready(!0)},ready:function(a){if(a===!0&&!--e.readyWait||a!==!0&&!e.isReady){if(!c.body)return setTimeout(e.ready,1);e.isReady=!0;if(a!==!0&&--e.readyWait>0)return;B.resolveWith(c,[e]),e.fn.trigger&&e(c).trigger("ready").unbind("ready")}},bindReady:function(){if(!B){B=e._Deferred();if(c.readyState==="complete")return setTimeout(e.ready,1);if(c.addEventListener)c.addEventListener("DOMContentLoaded",C,!1),a.addEventListener("load",e.ready,!1);else if(c.attachEvent){c.attachEvent("onreadystatechange",C),a.attachEvent("onload",e.ready);var b=!1;try{b=a.frameElement==null}catch(d){}c.documentElement.doScroll&&b&&K()}}},isFunction:function(a){return e.type(a)==="function"},isArray:Array.isArray||function(a){return e.type(a)==="array"},isWindow:function(a){return a&&typeof a=="object"&&"setInterval"in a},isNaN:function(a){return a==null||!m.test(a)||isNaN(a)},type:function(a){return a==null?String(a):J[D.call(a)]||"object"},isPlainObject:function(a){if(!a||e.type(a)!=="object"||a.nodeType||e.isWindow(a))return!1;try{if(a.constructor&&!E.call(a,"constructor")&&!E.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}var d;for(d in a);return d===b||E.call(a,d)},isEmptyObject:function(a){for(var b in a)return!1;return!0},error:function(a){throw a},parseJSON:function(b){if(typeof b!="string"||!b)return null;b=e.trim(b);if(a.JSON&&a.JSON.parse)return a.JSON.parse(b);if(o.test(b.replace(p,"@").replace(q,"]").replace(r,"")))return(new Function("return "+b))();e.error("Invalid JSON: "+b)},parseXML:function(c){var d,f;try{a.DOMParser?(f=new DOMParser,d=f.parseFromString(c,"text/xml")):(d=new ActiveXObject("Microsoft.XMLDOM"),d.async="false",d.loadXML(c))}catch(g){d=b}(!d||!d.documentElement||d.getElementsByTagName("parsererror").length)&&e.error("Invalid XML: "+c);return d},noop:function(){},globalEval:function(b){b&&j.test(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(x,"ms-").replace(w,y)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:function(a,c,d){var f,g=0,h=a.length,i=h===b||e.isFunction(a);if(d){if(i){for(f in a)if(c.apply(a[f],d)===!1)break}else for(;g<h;)if(c.apply(a[g++],d)===!1)break}else if(i){for(f in a)if(c.call(a[f],f,a[f])===!1)break}else for(;g<h;)if(c.call(a[g],g,a[g++])===!1)break;return a},trim:H?function(a){return a==null?"":H.call(a)}:function(a){return a==null?"":(a+"").replace(k,"").replace(l,"")},makeArray:function(a,b){var c=b||[];if(a!=null){var d=e.type(a);a.length==null||d==="string"||d==="function"||d==="regexp"||e.isWindow(a)?F.call(c,a):e.merge(c,a)}return c},inArray:function(a,b){if(!b)return-1;if(I)return I.call(b,a);for(var c=0,d=b.length;c<d;c++)if(b[c]===a)return c;return-1},merge:function(a,c){var d=a.length,e=0;if(typeof c.length=="number")for(var f=c.length;e<f;e++)a[d++]=c[e];else while(c[e]!==b)a[d++]=c[e++];a.length=d;return a},grep:function(a,b,c){var d=[],e;c=!!c;for(var f=0,g=a.length;f<g;f++)e=!!b(a[f],f),c!==e&&d.push(a[f]);return d},map:function(a,c,d){var f,g,h=[],i=0,j=a.length,k=a instanceof e||j!==b&&typeof j=="number"&&(j>0&&a[0]&&a[j-1]||j===0||e.isArray(a));if(k)for(;i<j;i++)f=c(a[i],i,d),f!=null&&(h[h.length]=f);else for(g in a)f=c(a[g],g,d),f!=null&&(h[h.length]=f);return h.concat.apply([],h)},guid:1,proxy:function(a,c){if(typeof c=="string"){var d=a[c];c=a,a=d}if(!e.isFunction(a))return b;var f=G.call(arguments,2),g=function(){return a.apply(c,f.concat(G.call(arguments)))};g.guid=a.guid=a.guid||g.guid||e.guid++;return g},access:function(a,c,d,f,g,h){var i=a.length;if(typeof c=="object"){for(var j in c)e.access(a,j,c[j],f,g,d);return a}if(d!==b){f=!h&&f&&e.isFunction(d);for(var k=0;k<i;k++)g(a[k],c,f?d.call(a[k],k,g(a[k],c)):d,h);return a}return i?g(a[0],c):b},now:function(){return(new Date).getTime()},uaMatch:function(a){a=a.toLowerCase();var b=s.exec(a)||t.exec(a)||u.exec(a)||a.indexOf("compatible")<0&&v.exec(a)||[];return{browser:b[1]||"",version:b[2]||"0"}},sub:function(){function a(b,c){return new a.fn.init(b,c)}e.extend(!0,a,this),a.superclass=this,a.fn=a.prototype=this(),a.fn.constructor=a,a.sub=this.sub,a.fn.init=function(d,f){f&&f instanceof e&&!(f instanceof a)&&(f=a(f));return e.fn.init.call(this,d,f,b)},a.fn.init.prototype=a.fn;var b=a(c);return a},browser:{}}),e.each("Boolean Number String Function Array Date RegExp Object".split(" "),function(a,b){J["[object "+b+"]"]=b.toLowerCase()}),A=e.uaMatch(z),A.browser&&(e.browser[A.browser]=!0,e.browser.version=A.version),e.browser.webkit&&(e.browser.safari=!0),j.test(" ")&&(k=/^[\s\xA0]+/,l=/[\s\xA0]+$/),h=e(c),c.addEventListener?C=function(){c.removeEventListener("DOMContentLoaded",C,!1),e.ready()}:c.attachEvent&&(C=function(){c.readyState==="complete"&&(c.detachEvent("onreadystatechange",C),e.ready())});return e}(),g="done fail isResolved isRejected promise then always pipe".split(" "),h=[].slice;f.extend({_Deferred:function(){var a=[],b,c,d,e={done:function(){if(!d){var c=arguments,g,h,i,j,k;b&&(k=b,b=0);for(g=0,h=c.length;g<h;g++)i=c[g],j=f.type(i),j==="array"?e.done.apply(e,i):j==="function"&&a.push(i);k&&e.resolveWith(k[0],k[1])}return this},resolveWith:function(e,f){if(!d&&!b&&!c){f=f||[],c=1;try{while(a[0])a.shift().apply(e,f)}finally{b=[e,f],c=0}}return this},resolve:function(){e.resolveWith(this,arguments);return this},isResolved:function(){return!!c||!!b},cancel:function(){d=1,a=[];return this}};return e},Deferred:function(a){var b=f._Deferred(),c=f._Deferred(),d;f.extend(b,{then:function(a,c){b.done(a).fail(c);return this},always:function(){return b.done.apply(b,arguments).fail.apply(this,arguments)},fail:c.done,rejectWith:c.resolveWith,reject:c.resolve,isRejected:c.isResolved,pipe:function(a,c){return f.Deferred(function(d){f.each({done:[a,"resolve"],fail:[c,"reject"]},function(a,c){var e=c[0],g=c[1],h;f.isFunction(e)?b[a](function(){h=e.apply(this,arguments),h&&f.isFunction(h.promise)?h.promise().then(d.resolve,d.reject):d[g+"With"](this===b?d:this,[h])}):b[a](d[g])})}).promise()},promise:function(a){if(a==null){if(d)return d;d=a={}}var c=g.length;while(c--)a[g[c]]=b[g[c]];return a}}),b.done(c.cancel).fail(b.cancel),delete b.cancel,a&&a.call(b,b);return b},when:function(a){function i(a){return function(c){b[a]=arguments.length>1?h.call(arguments,0):c,--e||g.resolveWith(g,h.call(b,0))}}var b=arguments,c=0,d=b.length,e=d,g=d<=1&&a&&f.isFunction(a.promise)?a:f.Deferred();if(d>1){for(;c<d;c++)b[c]&&f.isFunction(b[c].promise)?b[c].promise().then(i(c),g.reject):--e;e||g.resolveWith(g,b)}else g!==a&&g.resolveWith(g,d?[a]:[]);return g.promise()}}),f.support=function(){var a=c.createElement("div"),b=c.documentElement,d,e,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u;a.setAttribute("className","t"),a.innerHTML=" <link/><table></table><a href='/a' style='top:1px;float:left;opacity:.55;'>a</a><input type='checkbox'/>",d=a.getElementsByTagName("*"),e=a.getElementsByTagName("a")[0];if(!d||!d.length||!e)return{};g=c.createElement("select"),h=g.appendChild(c.createElement("option")),i=a.getElementsByTagName("input")[0],k={leadingWhitespace:a.firstChild.nodeType===3,tbody:!a.getElementsByTagName("tbody").length,htmlSerialize:!!a.getElementsByTagName("link").length,style:/top/.test(e.getAttribute("style")),hrefNormalized:e.getAttribute("href")==="/a",opacity:/^0.55$/.test(e.style.opacity),cssFloat:!!e.style.cssFloat,checkOn:i.value==="on",optSelected:h.selected,getSetAttribute:a.className!=="t",submitBubbles:!0,changeBubbles:!0,focusinBubbles:!1,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0},i.checked=!0,k.noCloneChecked=i.cloneNode(!0).checked,g.disabled=!0,k.optDisabled=!h.disabled;try{delete a.test}catch(v){k.deleteExpando=!1}!a.addEventListener&&a.attachEvent&&a.fireEvent&&(a.attachEvent("onclick",function(){k.noCloneEvent=!1}),a.cloneNode(!0).fireEvent("onclick")),i=c.createElement("input"),i.value="t",i.setAttribute("type","radio"),k.radioValue=i.value==="t",i.setAttribute("checked","checked"),a.appendChild(i),l=c.createDocumentFragment(),l.appendChild(a.firstChild),k.checkClone=l.cloneNode(!0).cloneNode(!0).lastChild.checked,a.innerHTML="",a.style.width=a.style.paddingLeft="1px",m=c.getElementsByTagName("body")[0],o=c.createElement(m?"div":"body"),p={visibility:"hidden",width:0,height:0,border:0,margin:0,background:"none"},m&&f.extend(p,{position:"absolute",left:"-1000px",top:"-1000px"});for(t in p)o.style[t]=p[t];o.appendChild(a),n=m||b,n.insertBefore(o,n.firstChild),k.appendChecked=i.checked,k.boxModel=a.offsetWidth===2,"zoom"in a.style&&(a.style.display="inline",a.style.zoom=1,k.inlineBlockNeedsLayout=a.offsetWidth===2,a.style.display="",a.innerHTML="<div style='width:4px;'></div>",k.shrinkWrapBlocks=a.offsetWidth!==2),a.innerHTML="<table><tr><td style='padding:0;border:0;display:none'></td><td>t</td></tr></table>",q=a.getElementsByTagName("td"),u=q[0].offsetHeight===0,q[0].style.display="",q[1].style.display="none",k.reliableHiddenOffsets=u&&q[0].offsetHeight===0,a.innerHTML="",c.defaultView&&c.defaultView.getComputedStyle&&(j=c.createElement("div"),j.style.width="0",j.style.marginRight="0",a.appendChild(j),k.reliableMarginRight=(parseInt((c.defaultView.getComputedStyle(j,null)||{marginRight:0}).marginRight,10)||0)===0),o.innerHTML="",n.removeChild(o);if(a.attachEvent)for(t in{submit:1,change:1,focusin:1})s="on"+t,u=s in a,u||(a.setAttribute(s,"return;"),u=typeof a[s]=="function"),k[t+"Bubbles"]=u;o=l=g=h=m=j=a=i=null;return k}(),f.boxModel=f.support.boxModel;var i=/^(?:\{.*\}|\[.*\])$/,j=/([A-Z])/g;f.extend({cache:{},uuid:0,expando:"jQuery"+(f.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(a){a=a.nodeType?f.cache[a[f.expando]]:a[f.expando];return!!a&&!l(a)},data:function(a,c,d,e){if(!!f.acceptData(a)){var g,h,i=f.expando,j=typeof c=="string",k=a.nodeType,l=k?f.cache:a,m=k?a[f.expando]:a[f.expando]&&f.expando;if((!m||e&&m&&l[m]&&!l[m][i])&&j&&d===b)return;m||(k?a[f.expando]=m=++f.uuid:m=f.expando),l[m]||(l[m]={},k||(l[m].toJSON=f.noop));if(typeof c=="object"||typeof c=="function")e?l[m][i]=f.extend(l[m][i],c):l[m]=f.extend(l[m],c);g=l[m],e&&(g[i]||(g[i]={}),g=g[i]),d!==b&&(g[f.camelCase(c)]=d);if(c==="events"&&!g[c])return g[i]&&g[i].events;j?(h=g[c],h==null&&(h=g[f.camelCase(c)])):h=g;return h}},removeData:function(a,b,c){if(!!f.acceptData(a)){var d,e=f.expando,g=a.nodeType,h=g?f.cache:a,i=g?a[f.expando]:f.expando;if(!h[i])return;if(b){d=c?h[i][e]:h[i];if(d){d[b]||(b=f.camelCase(b)),delete d[b];if(!l(d))return}}if(c){delete h[i][e];if(!l(h[i]))return}var j=h[i][e];f.support.deleteExpando||!h.setInterval?delete h[i]:h[i]=null,j?(h[i]={},g||(h[i].toJSON=f.noop),h[i][e]=j):g&&(f.support.deleteExpando?delete a[f.expando]:a.removeAttribute?a.removeAttribute(f.expando):a[f.expando]=null)}},_data:function(a,b,c){return f.data(a,b,c,!0)},acceptData:function(a){if(a.nodeName){var b=f.noData[a.nodeName.toLowerCase()];if(b)return b!==!0&&a.getAttribute("classid")===b}return!0}}),f.fn.extend({data:function(a,c){var d=null;if(typeof a=="undefined"){if(this.length){d=f.data(this[0]);if(this[0].nodeType===1){var e=this[0].attributes,g;for(var h=0,i=e.length;h<i;h++)g=e[h].name,g.indexOf("data-")===0&&(g=f.camelCase(g.substring(5)),k(this[0],g,d[g]))}}return d}if(typeof a=="object")return this.each(function(){f.data(this,a)});var j=a.split(".");j[1]=j[1]?"."+j[1]:"";if(c===b){d=this.triggerHandler("getData"+j[1]+"!",[j[0]]),d===b&&this.length&&(d=f.data(this[0],a),d=k(this[0],a,d));return d===b&&j[1]?this.data(j[0]):d}return this.each(function(){var b=f(this),d=[j[0],c];b.triggerHandler("setData"+j[1]+"!",d),f.data(this,a,c),b.triggerHandler("changeData"+j[1]+"!",d)})},removeData:function(a){return this.each(function(){f.removeData(this,a)})}}),f.extend({_mark:function(a,c){a&&(c=(c||"fx")+"mark",f.data(a,c,(f.data(a,c,b,!0)||0)+1,!0))},_unmark:function(a,c,d){a!==!0&&(d=c,c=a,a=!1);if(c){d=d||"fx";var e=d+"mark",g=a?0:(f.data(c,e,b,!0)||1)-1;g?f.data(c,e,g,!0):(f.removeData(c,e,!0),m(c,d,"mark"))}},queue:function(a,c,d){if(a){c=(c||"fx")+"queue";var e=f.data(a,c,b,!0);d&&(!e||f.isArray(d)?e=f.data(a,c,f.makeArray(d),!0):e.push(d));return e||[]}},dequeue:function(a,b){b=b||"fx";var c=f.queue(a,b),d=c.shift(),e;d==="inprogress"&&(d=c.shift()),d&&(b==="fx"&&c.unshift("inprogress"),d.call(a,function(){f.dequeue(a,b)})),c.length||(f.removeData(a,b+"queue",!0),m(a,b,"queue"))}}),f.fn.extend({queue:function(a,c){typeof a!="string"&&(c=a,a="fx");if(c===b)return f.queue(this[0],a);return this.each(function(){var b=f.queue(this,a,c);a==="fx"&&b[0]!=="inprogress"&&f.dequeue(this,a)})},dequeue:function(a){return this.each(function(){f.dequeue(this,a)})},delay:function(a,b){a=f.fx?f.fx.speeds[a]||a:a,b=b||"fx";return this.queue(b,function(){var c=this;setTimeout(function(){f.dequeue(c,b)},a)})},clearQueue:function(a){return this.queue(a||"fx",[])},promise:function(a,c){function m(){--h||d.resolveWith(e,[e])}typeof a!="string"&&(c=a,a=b),a=a||"fx";var d=f.Deferred(),e=this,g=e.length,h=1,i=a+"defer",j=a+"queue",k=a+"mark",l;while(g--)if(l=f.data(e[g],i,b,!0)||(f.data(e[g],j,b,!0)||f.data(e[g],k,b,!0))&&f.data(e[g],i,f._Deferred(),!0))h++,l.done(m);m();return d.promise()}});var n=/[\n\t\r]/g,o=/\s+/,p=/\r/g,q=/^(?:button|input)$/i,r=/^(?:button|input|object|select|textarea)$/i,s=/^a(?:rea)?$/i,t=/^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i,u,v;f.fn.extend({attr:function(a,b){return f.access(this,a,b,!0,f.attr)},removeAttr:function(a){return this.each(function(){f.removeAttr(this,a)})},prop:function(a,b){return f.access(this,a,b,!0,f.prop)},removeProp:function(a){a=f.propFix[a]||a;return this.each(function(){try{this[a]=b,delete this[a]}catch(c){}})},addClass:function(a){var b,c,d,e,g,h,i;if(f.isFunction(a))return this.each(function(b){f(this).addClass(a.call(this,b,this.className))});if(a&&typeof a=="string"){b=a.split(o);for(c=0,d=this.length;c<d;c++){e=this[c];if(e.nodeType===1)if(!e.className&&b.length===1)e.className=a;else{g=" "+e.className+" ";for(h=0,i=b.length;h<i;h++)~g.indexOf(" "+b[h]+" ")||(g+=b[h]+" ");e.className=f.trim(g)}}}return this},removeClass:function(a){var c,d,e,g,h,i,j;if(f.isFunction(a))return this.each(function(b){f(this).removeClass(a.call(this,b,this.className))});if(a&&typeof a=="string"||a===b){c=(a||"").split(o);for(d=0,e=this.length;d<e;d++){g=this[d];if(g.nodeType===1&&g.className)if(a){h=(" "+g.className+" ").replace(n," ");for(i=0,j=c.length;i<j;i++)h=h.replace(" "+c[i]+" "," ");g.className=f.trim(h)}else g.className=""}}return this},toggleClass:function(a,b){var c=typeof a,d=typeof b=="boolean";if(f.isFunction(a))return this.each(function(c){f(this).toggleClass(a.call(this,c,this.className,b),b)});return this.each(function(){if(c==="string"){var e,g=0,h=f(this),i=b,j=a.split(o);while(e=j[g++])i=d?i:!h.hasClass(e),h[i?"addClass":"removeClass"](e)}else if(c==="undefined"||c==="boolean")this.className&&f._data(this,"__className__",this.className),this.className=this.className||a===!1?"":f._data(this,"__className__")||""})},hasClass:function(a){var b=" "+a+" ";for(var c=0,d=this.length;c<d;c++)if(this[c].nodeType===1&&(" "+this[c].className+" ").replace(n," ").indexOf(b)>-1)return!0;return!1},val:function(a){var c,d,e=this[0];if(!arguments.length){if(e){c=f.valHooks[e.nodeName.toLowerCase()]||f.valHooks[e.type];if(c&&"get"in c&&(d=c.get(e,"value"))!==b)return d;d=e.value;return typeof d=="string"?d.replace(p,""):d==null?"":d}return b}var g=f.isFunction(a);return this.each(function(d){var e=f(this),h;if(this.nodeType===1){g?h=a.call(this,d,e.val()):h=a,h==null?h="":typeof h=="number"?h+="":f.isArray(h)&&(h=f.map(h,function(a){return a==null?"":a+""})),c=f.valHooks[this.nodeName.toLowerCase()]||f.valHooks[this.type];if(!c||!("set"in c)||c.set(this,h,"value")===b)this.value=h}})}}),f.extend({valHooks:{option:{get:function(a){var b=a.attributes.value;return!b||b.specified?a.value:a.text}},select:{get:function(a){var b,c=a.selectedIndex,d=[],e=a.options,g=a.type==="select-one";if(c<0)return null;for(var h=g?c:0,i=g?c+1:e.length;h<i;h++){var j=e[h];if(j.selected&&(f.support.optDisabled?!j.disabled:j.getAttribute("disabled")===null)&&(!j.parentNode.disabled||!f.nodeName(j.parentNode,"optgroup"))){b=f(j).val();if(g)return b;d.push(b)}}if(g&&!d.length&&e.length)return f(e[c]).val();return d},set:function(a,b){var c=f.makeArray(b);f(a).find("option").each(function(){this.selected=f.inArray(f(this).val(),c)>=0}),c.length||(a.selectedIndex=-1);return c}}},attrFn:{val:!0,css:!0,html:!0,text:!0,data:!0,width:!0,height:!0,offset:!0},attrFix:{tabindex:"tabIndex"},attr:function(a,c,d,e){var g=a.nodeType;if(!a||g===3||g===8||g===2)return b;if(e&&c in f.attrFn)return f(a)[c](d);if(!("getAttribute"in a))return f.prop(a,c,d);var h,i,j=g!==1||!f.isXMLDoc(a);j&&(c=f.attrFix[c]||c,i=f.attrHooks[c],i||(t.test(c)?i=v:u&&(i=u)));if(d!==b){if(d===null){f.removeAttr(a,c);return b}if(i&&"set"in i&&j&&(h=i.set(a,d,c))!==b)return h;a.setAttribute(c,""+d);return d}if(i&&"get"in i&&j&&(h=i.get(a,c))!==null)return h;h=a.getAttribute(c);return h===null?b:h},removeAttr:function(a,b){var c;a.nodeType===1&&(b=f.attrFix[b]||b,f.attr(a,b,""),a.removeAttribute(b),t.test(b)&&(c=f.propFix[b]||b)in a&&(a[c]=!1))},attrHooks:{type:{set:function(a,b){if(q.test(a.nodeName)&&a.parentNode)f.error("type property can't be changed");else if(!f.support.radioValue&&b==="radio"&&f.nodeName(a,"input")){var c=a.value;a.setAttribute("type",b),c&&(a.value=c);return b}}},value:{get:function(a,b){if(u&&f.nodeName(a,"button"))return u.get(a,b);return b in a?a.value:null},set:function(a,b,c){if(u&&f.nodeName(a,"button"))return u.set(a,b,c);a.value=b}}},propFix:{tabindex:"tabIndex",readonly:"readOnly","for":"htmlFor","class":"className",maxlength:"maxLength",cellspacing:"cellSpacing",cellpadding:"cellPadding",rowspan:"rowSpan",colspan:"colSpan",usemap:"useMap",frameborder:"frameBorder",contenteditable:"contentEditable"},prop:function(a,c,d){var e=a.nodeType;if(!a||e===3||e===8||e===2)return b;var g,h,i=e!==1||!f.isXMLDoc(a);i&&(c=f.propFix[c]||c,h=f.propHooks[c]);return d!==b?h&&"set"in h&&(g=h.set(a,d,c))!==b?g:a[c]=d:h&&"get"in h&&(g=h.get(a,c))!==null?g:a[c]},propHooks:{tabIndex:{get:function(a){var c=a.getAttributeNode("tabindex");return c&&c.specified?parseInt(c.value,10):r.test(a.nodeName)||s.test(a.nodeName)&&a.href?0:b}}}}),f.attrHooks.tabIndex=f.propHooks.tabIndex,v={get:function(a,c){var d;return f.prop(a,c)===!0||(d=a.getAttributeNode(c))&&d.nodeValue!==!1?c.toLowerCase():b},set:function(a,b,c){var d;b===!1?f.removeAttr(a,c):(d=f.propFix[c]||c,d in a&&(a[d]=!0),a.setAttribute(c,c.toLowerCase()));return c}},f.support.getSetAttribute||(u=f.valHooks.button={get:function(a,c){var d;d=a.getAttributeNode(c);return d&&d.nodeValue!==""?d.nodeValue:b},set:function(a,b,d){var e=a.getAttributeNode(d);e||(e=c.createAttribute(d),a.setAttributeNode(e));return e.nodeValue=b+""}},f.each(["width","height"],function(a,b){f.attrHooks[b]=f.extend(f.attrHooks[b],{set:function(a,c){if(c===""){a.setAttribute(b,"auto");return c}}})})),f.support.hrefNormalized||f.each(["href","src","width","height"],function(a,c){f.attrHooks[c]=f.extend(f.attrHooks[c],{get:function(a){var d=a.getAttribute(c,2);return d===null?b:d}})}),f.support.style||(f.attrHooks.style={get:function(a){return a.style.cssText.toLowerCase()||b},set:function(a,b){return a.style.cssText=""+b}}),f.support.optSelected||(f.propHooks.selected=f.extend(f.propHooks.selected,{get:function(a){var b=a.parentNode;b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex);return null}})),f.support.checkOn||f.each(["radio","checkbox"],function(){f.valHooks[this]={get:function(a){return a.getAttribute("value")===null?"on":a.value}}}),f.each(["radio","checkbox"],function(){f.valHooks[this]=f.extend(f.valHooks[this],{set:function(a,b){if(f.isArray(b))return a.checked=f.inArray(f(a).val(),b)>=0}})});var w=/\.(.*)$/,x=/^(?:textarea|input|select)$/i,y=/\./g,z=/ /g,A=/[^\w\s.|`]/g,B=function(a){return a.replace(A,"\\$&")};f.event={add:function(a,c,d,e){if(a.nodeType!==3&&a.nodeType!==8){if(d===!1)d=C;else if(!d)return;var g,h;d.handler&&(g=d,d=g.handler),d.guid||(d.guid=f.guid++);var i=f._data(a);if(!i)return;var j=i.events,k=i.handle;j||(i.events=j={}),k||(i.handle=k=function(a){return typeof f!="undefined"&&(!a||f.event.triggered!==a.type)?f.event.handle.apply(k.elem,arguments):b}),k.elem=a,c=c.split(" ");var l,m=0,n;while(l=c[m++]){h=g?f.extend({},g):{handler:d,data:e},l.indexOf(".")>-1?(n=l.split("."),l=n.shift(),h.namespace=n.slice(0).sort().join(".")):(n=[],h.namespace=""),h.type=l,h.guid||(h.guid=d.guid);var o=j[l],p=f.event.special[l]||{};if(!o){o=j[l]=[];if(!p.setup||p.setup.call(a,e,n,k)===!1)a.addEventListener?a.addEventListener(l,k,!1):a.attachEvent&&a.attachEvent("on"+l,k)}p.add&&(p.add.call(a,h),h.handler.guid||(h.handler.guid=d.guid)),o.push(h),f.event.global[l]=!0}a=null}},global:{},remove:function(a,c,d,e){if(a.nodeType!==3&&a.nodeType!==8){d===!1&&(d=C);var g,h,i,j,k=0,l,m,n,o,p,q,r,s=f.hasData(a)&&f._data(a),t=s&&s.events;if(!s||!t)return;c&&c.type&&(d=c.handler,c=c.type);if(!c||typeof c=="string"&&c.charAt(0)==="."){c=c||"";for(h in t)f.event.remove(a,h+c);return}c=c.split(" ");while(h=c[k++]){r=h,q=null,l=h.indexOf(".")<0,m=[],l||(m=h.split("."),h=m.shift(),n=new RegExp("(^|\\.)"+f.map(m.slice(0).sort(),B).join("\\.(?:.*\\.)?")+"(\\.|$)")),p=t[h];if(!p)continue;if(!d){for(j=0;j<p.length;j++){q=p[j];if(l||n.test(q.namespace))f.event.remove(a,r,q.handler,j),p.splice(j--,1)}continue}o=f.event.special[h]||{};for(j=e||0;j<p.length;j++){q=p[j];if(d.guid===q.guid){if(l||n.test(q.namespace))e==null&&p.splice(j--,1),o.remove&&o.remove.call(a,q);if(e!=null)break}}if(p.length===0||e!=null&&p.length===1)(!o.teardown||o.teardown.call(a,m)===!1)&&f.removeEvent(a,h,s.handle),g=null,delete +t[h]}if(f.isEmptyObject(t)){var u=s.handle;u&&(u.elem=null),delete s.events,delete s.handle,f.isEmptyObject(s)&&f.removeData(a,b,!0)}}},customEvent:{getData:!0,setData:!0,changeData:!0},trigger:function(c,d,e,g){var h=c.type||c,i=[],j;h.indexOf("!")>=0&&(h=h.slice(0,-1),j=!0),h.indexOf(".")>=0&&(i=h.split("."),h=i.shift(),i.sort());if(!!e&&!f.event.customEvent[h]||!!f.event.global[h]){c=typeof c=="object"?c[f.expando]?c:new f.Event(h,c):new f.Event(h),c.type=h,c.exclusive=j,c.namespace=i.join("."),c.namespace_re=new RegExp("(^|\\.)"+i.join("\\.(?:.*\\.)?")+"(\\.|$)");if(g||!e)c.preventDefault(),c.stopPropagation();if(!e){f.each(f.cache,function(){var a=f.expando,b=this[a];b&&b.events&&b.events[h]&&f.event.trigger(c,d,b.handle.elem)});return}if(e.nodeType===3||e.nodeType===8)return;c.result=b,c.target=e,d=d!=null?f.makeArray(d):[],d.unshift(c);var k=e,l=h.indexOf(":")<0?"on"+h:"";do{var m=f._data(k,"handle");c.currentTarget=k,m&&m.apply(k,d),l&&f.acceptData(k)&&k[l]&&k[l].apply(k,d)===!1&&(c.result=!1,c.preventDefault()),k=k.parentNode||k.ownerDocument||k===c.target.ownerDocument&&a}while(k&&!c.isPropagationStopped());if(!c.isDefaultPrevented()){var n,o=f.event.special[h]||{};if((!o._default||o._default.call(e.ownerDocument,c)===!1)&&(h!=="click"||!f.nodeName(e,"a"))&&f.acceptData(e)){try{l&&e[h]&&(n=e[l],n&&(e[l]=null),f.event.triggered=h,e[h]())}catch(p){}n&&(e[l]=n),f.event.triggered=b}}return c.result}},handle:function(c){c=f.event.fix(c||a.event);var d=((f._data(this,"events")||{})[c.type]||[]).slice(0),e=!c.exclusive&&!c.namespace,g=Array.prototype.slice.call(arguments,0);g[0]=c,c.currentTarget=this;for(var h=0,i=d.length;h<i;h++){var j=d[h];if(e||c.namespace_re.test(j.namespace)){c.handler=j.handler,c.data=j.data,c.handleObj=j;var k=j.handler.apply(this,g);k!==b&&(c.result=k,k===!1&&(c.preventDefault(),c.stopPropagation()));if(c.isImmediatePropagationStopped())break}}return c.result},props:"altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode layerX layerY metaKey newValue offsetX offsetY pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "),fix:function(a){if(a[f.expando])return a;var d=a;a=f.Event(d);for(var e=this.props.length,g;e;)g=this.props[--e],a[g]=d[g];a.target||(a.target=a.srcElement||c),a.target.nodeType===3&&(a.target=a.target.parentNode),!a.relatedTarget&&a.fromElement&&(a.relatedTarget=a.fromElement===a.target?a.toElement:a.fromElement);if(a.pageX==null&&a.clientX!=null){var h=a.target.ownerDocument||c,i=h.documentElement,j=h.body;a.pageX=a.clientX+(i&&i.scrollLeft||j&&j.scrollLeft||0)-(i&&i.clientLeft||j&&j.clientLeft||0),a.pageY=a.clientY+(i&&i.scrollTop||j&&j.scrollTop||0)-(i&&i.clientTop||j&&j.clientTop||0)}a.which==null&&(a.charCode!=null||a.keyCode!=null)&&(a.which=a.charCode!=null?a.charCode:a.keyCode),!a.metaKey&&a.ctrlKey&&(a.metaKey=a.ctrlKey),!a.which&&a.button!==b&&(a.which=a.button&1?1:a.button&2?3:a.button&4?2:0);return a},guid:1e8,proxy:f.proxy,special:{ready:{setup:f.bindReady,teardown:f.noop},live:{add:function(a){f.event.add(this,M(a.origType,a.selector),f.extend({},a,{handler:L,guid:a.handler.guid}))},remove:function(a){f.event.remove(this,M(a.origType,a.selector),a)}},beforeunload:{setup:function(a,b,c){f.isWindow(this)&&(this.onbeforeunload=c)},teardown:function(a,b){this.onbeforeunload===b&&(this.onbeforeunload=null)}}}},f.removeEvent=c.removeEventListener?function(a,b,c){a.removeEventListener&&a.removeEventListener(b,c,!1)}:function(a,b,c){a.detachEvent&&a.detachEvent("on"+b,c)},f.Event=function(a,b){if(!this.preventDefault)return new f.Event(a,b);a&&a.type?(this.originalEvent=a,this.type=a.type,this.isDefaultPrevented=a.defaultPrevented||a.returnValue===!1||a.getPreventDefault&&a.getPreventDefault()?D:C):this.type=a,b&&f.extend(this,b),this.timeStamp=f.now(),this[f.expando]=!0},f.Event.prototype={preventDefault:function(){this.isDefaultPrevented=D;var a=this.originalEvent;!a||(a.preventDefault?a.preventDefault():a.returnValue=!1)},stopPropagation:function(){this.isPropagationStopped=D;var a=this.originalEvent;!a||(a.stopPropagation&&a.stopPropagation(),a.cancelBubble=!0)},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=D,this.stopPropagation()},isDefaultPrevented:C,isPropagationStopped:C,isImmediatePropagationStopped:C};var E=function(a){var b=a.relatedTarget,c=!1,d=a.type;a.type=a.data,b!==this&&(b&&(c=f.contains(this,b)),c||(f.event.handle.apply(this,arguments),a.type=d))},F=function(a){a.type=a.data,f.event.handle.apply(this,arguments)};f.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(a,b){f.event.special[a]={setup:function(c){f.event.add(this,b,c&&c.selector?F:E,a)},teardown:function(a){f.event.remove(this,b,a&&a.selector?F:E)}}}),f.support.submitBubbles||(f.event.special.submit={setup:function(a,b){if(!f.nodeName(this,"form"))f.event.add(this,"click.specialSubmit",function(a){var b=a.target,c=f.nodeName(b,"input")||f.nodeName(b,"button")?b.type:"";(c==="submit"||c==="image")&&f(b).closest("form").length&&J("submit",this,arguments)}),f.event.add(this,"keypress.specialSubmit",function(a){var b=a.target,c=f.nodeName(b,"input")||f.nodeName(b,"button")?b.type:"";(c==="text"||c==="password")&&f(b).closest("form").length&&a.keyCode===13&&J("submit",this,arguments)});else return!1},teardown:function(a){f.event.remove(this,".specialSubmit")}});if(!f.support.changeBubbles){var G,H=function(a){var b=f.nodeName(a,"input")?a.type:"",c=a.value;b==="radio"||b==="checkbox"?c=a.checked:b==="select-multiple"?c=a.selectedIndex>-1?f.map(a.options,function(a){return a.selected}).join("-"):"":f.nodeName(a,"select")&&(c=a.selectedIndex);return c},I=function(c){var d=c.target,e,g;if(!!x.test(d.nodeName)&&!d.readOnly){e=f._data(d,"_change_data"),g=H(d),(c.type!=="focusout"||d.type!=="radio")&&f._data(d,"_change_data",g);if(e===b||g===e)return;if(e!=null||g)c.type="change",c.liveFired=b,f.event.trigger(c,arguments[1],d)}};f.event.special.change={filters:{focusout:I,beforedeactivate:I,click:function(a){var b=a.target,c=f.nodeName(b,"input")?b.type:"";(c==="radio"||c==="checkbox"||f.nodeName(b,"select"))&&I.call(this,a)},keydown:function(a){var b=a.target,c=f.nodeName(b,"input")?b.type:"";(a.keyCode===13&&!f.nodeName(b,"textarea")||a.keyCode===32&&(c==="checkbox"||c==="radio")||c==="select-multiple")&&I.call(this,a)},beforeactivate:function(a){var b=a.target;f._data(b,"_change_data",H(b))}},setup:function(a,b){if(this.type==="file")return!1;for(var c in G)f.event.add(this,c+".specialChange",G[c]);return x.test(this.nodeName)},teardown:function(a){f.event.remove(this,".specialChange");return x.test(this.nodeName)}},G=f.event.special.change.filters,G.focus=G.beforeactivate}f.support.focusinBubbles||f.each({focus:"focusin",blur:"focusout"},function(a,b){function e(a){var c=f.event.fix(a);c.type=b,c.originalEvent={},f.event.trigger(c,null,c.target),c.isDefaultPrevented()&&a.preventDefault()}var d=0;f.event.special[b]={setup:function(){d++===0&&c.addEventListener(a,e,!0)},teardown:function(){--d===0&&c.removeEventListener(a,e,!0)}}}),f.each(["bind","one"],function(a,c){f.fn[c]=function(a,d,e){var g;if(typeof a=="object"){for(var h in a)this[c](h,d,a[h],e);return this}if(arguments.length===2||d===!1)e=d,d=b;c==="one"?(g=function(a){f(this).unbind(a,g);return e.apply(this,arguments)},g.guid=e.guid||f.guid++):g=e;if(a==="unload"&&c!=="one")this.one(a,d,e);else for(var i=0,j=this.length;i<j;i++)f.event.add(this[i],a,g,d);return this}}),f.fn.extend({unbind:function(a,b){if(typeof a=="object"&&!a.preventDefault)for(var c in a)this.unbind(c,a[c]);else for(var d=0,e=this.length;d<e;d++)f.event.remove(this[d],a,b);return this},delegate:function(a,b,c,d){return this.live(b,c,d,a)},undelegate:function(a,b,c){return arguments.length===0?this.unbind("live"):this.die(b,null,c,a)},trigger:function(a,b){return this.each(function(){f.event.trigger(a,b,this)})},triggerHandler:function(a,b){if(this[0])return f.event.trigger(a,b,this[0],!0)},toggle:function(a){var b=arguments,c=a.guid||f.guid++,d=0,e=function(c){var e=(f.data(this,"lastToggle"+a.guid)||0)%d;f.data(this,"lastToggle"+a.guid,e+1),c.preventDefault();return b[e].apply(this,arguments)||!1};e.guid=c;while(d<b.length)b[d++].guid=c;return this.click(e)},hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}});var K={focus:"focusin",blur:"focusout",mouseenter:"mouseover",mouseleave:"mouseout"};f.each(["live","die"],function(a,c){f.fn[c]=function(a,d,e,g){var h,i=0,j,k,l,m=g||this.selector,n=g?this:f(this.context);if(typeof a=="object"&&!a.preventDefault){for(var o in a)n[c](o,d,a[o],m);return this}if(c==="die"&&!a&&g&&g.charAt(0)==="."){n.unbind(g);return this}if(d===!1||f.isFunction(d))e=d||C,d=b;a=(a||"").split(" ");while((h=a[i++])!=null){j=w.exec(h),k="",j&&(k=j[0],h=h.replace(w,""));if(h==="hover"){a.push("mouseenter"+k,"mouseleave"+k);continue}l=h,K[h]?(a.push(K[h]+k),h=h+k):h=(K[h]||h)+k;if(c==="live")for(var p=0,q=n.length;p<q;p++)f.event.add(n[p],"live."+M(h,m),{data:d,selector:m,handler:e,origType:h,origHandler:e,preType:l});else n.unbind("live."+M(h,m),e)}return this}}),f.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error".split(" "),function(a,b){f.fn[b]=function(a,c){c==null&&(c=a,a=null);return arguments.length>0?this.bind(b,a,c):this.trigger(b)},f.attrFn&&(f.attrFn[b]=!0)}),function(){function u(a,b,c,d,e,f){for(var g=0,h=d.length;g<h;g++){var i=d[g];if(i){var j=!1;i=i[a];while(i){if(i.sizcache===c){j=d[i.sizset];break}if(i.nodeType===1){f||(i.sizcache=c,i.sizset=g);if(typeof b!="string"){if(i===b){j=!0;break}}else if(k.filter(b,[i]).length>0){j=i;break}}i=i[a]}d[g]=j}}}function t(a,b,c,d,e,f){for(var g=0,h=d.length;g<h;g++){var i=d[g];if(i){var j=!1;i=i[a];while(i){if(i.sizcache===c){j=d[i.sizset];break}i.nodeType===1&&!f&&(i.sizcache=c,i.sizset=g);if(i.nodeName.toLowerCase()===b){j=i;break}i=i[a]}d[g]=j}}}var a=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,d=0,e=Object.prototype.toString,g=!1,h=!0,i=/\\/g,j=/\W/;[0,0].sort(function(){h=!1;return 0});var k=function(b,d,f,g){f=f||[],d=d||c;var h=d;if(d.nodeType!==1&&d.nodeType!==9)return[];if(!b||typeof b!="string")return f;var i,j,n,o,q,r,s,t,u=!0,w=k.isXML(d),x=[],y=b;do{a.exec(""),i=a.exec(y);if(i){y=i[3],x.push(i[1]);if(i[2]){o=i[3];break}}}while(i);if(x.length>1&&m.exec(b))if(x.length===2&&l.relative[x[0]])j=v(x[0]+x[1],d);else{j=l.relative[x[0]]?[d]:k(x.shift(),d);while(x.length)b=x.shift(),l.relative[b]&&(b+=x.shift()),j=v(b,j)}else{!g&&x.length>1&&d.nodeType===9&&!w&&l.match.ID.test(x[0])&&!l.match.ID.test(x[x.length-1])&&(q=k.find(x.shift(),d,w),d=q.expr?k.filter(q.expr,q.set)[0]:q.set[0]);if(d){q=g?{expr:x.pop(),set:p(g)}:k.find(x.pop(),x.length===1&&(x[0]==="~"||x[0]==="+")&&d.parentNode?d.parentNode:d,w),j=q.expr?k.filter(q.expr,q.set):q.set,x.length>0?n=p(j):u=!1;while(x.length)r=x.pop(),s=r,l.relative[r]?s=x.pop():r="",s==null&&(s=d),l.relative[r](n,s,w)}else n=x=[]}n||(n=j),n||k.error(r||b);if(e.call(n)==="[object Array]")if(!u)f.push.apply(f,n);else if(d&&d.nodeType===1)for(t=0;n[t]!=null;t++)n[t]&&(n[t]===!0||n[t].nodeType===1&&k.contains(d,n[t]))&&f.push(j[t]);else for(t=0;n[t]!=null;t++)n[t]&&n[t].nodeType===1&&f.push(j[t]);else p(n,f);o&&(k(o,h,f,g),k.uniqueSort(f));return f};k.uniqueSort=function(a){if(r){g=h,a.sort(r);if(g)for(var b=1;b<a.length;b++)a[b]===a[b-1]&&a.splice(b--,1)}return a},k.matches=function(a,b){return k(a,null,null,b)},k.matchesSelector=function(a,b){return k(b,null,null,[a]).length>0},k.find=function(a,b,c){var d;if(!a)return[];for(var e=0,f=l.order.length;e<f;e++){var g,h=l.order[e];if(g=l.leftMatch[h].exec(a)){var j=g[1];g.splice(1,1);if(j.substr(j.length-1)!=="\\"){g[1]=(g[1]||"").replace(i,""),d=l.find[h](g,b,c);if(d!=null){a=a.replace(l.match[h],"");break}}}}d||(d=typeof b.getElementsByTagName!="undefined"?b.getElementsByTagName("*"):[]);return{set:d,expr:a}},k.filter=function(a,c,d,e){var f,g,h=a,i=[],j=c,m=c&&c[0]&&k.isXML(c[0]);while(a&&c.length){for(var n in l.filter)if((f=l.leftMatch[n].exec(a))!=null&&f[2]){var o,p,q=l.filter[n],r=f[1];g=!1,f.splice(1,1);if(r.substr(r.length-1)==="\\")continue;j===i&&(i=[]);if(l.preFilter[n]){f=l.preFilter[n](f,j,d,i,e,m);if(!f)g=o=!0;else if(f===!0)continue}if(f)for(var s=0;(p=j[s])!=null;s++)if(p){o=q(p,f,s,j);var t=e^!!o;d&&o!=null?t?g=!0:j[s]=!1:t&&(i.push(p),g=!0)}if(o!==b){d||(j=i),a=a.replace(l.match[n],"");if(!g)return[];break}}if(a===h)if(g==null)k.error(a);else break;h=a}return j},k.error=function(a){throw"Syntax error, unrecognized expression: "+a};var l=k.selectors={order:["ID","NAME","TAG"],match:{ID:/#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,CLASS:/\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,NAME:/\[name=['"]*((?:[\w\u00c0-\uFFFF\-]|\\.)+)['"]*\]/,ATTR:/\[\s*((?:[\w\u00c0-\uFFFF\-]|\\.)+)\s*(?:(\S?=)\s*(?:(['"])(.*?)\3|(#?(?:[\w\u00c0-\uFFFF\-]|\\.)*)|)|)\s*\]/,TAG:/^((?:[\w\u00c0-\uFFFF\*\-]|\\.)+)/,CHILD:/:(only|nth|last|first)-child(?:\(\s*(even|odd|(?:[+\-]?\d+|(?:[+\-]?\d*)?n\s*(?:[+\-]\s*\d+)?))\s*\))?/,POS:/:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^\-]|$)/,PSEUDO:/:((?:[\w\u00c0-\uFFFF\-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/},leftMatch:{},attrMap:{"class":"className","for":"htmlFor"},attrHandle:{href:function(a){return a.getAttribute("href")},type:function(a){return a.getAttribute("type")}},relative:{"+":function(a,b){var c=typeof b=="string",d=c&&!j.test(b),e=c&&!d;d&&(b=b.toLowerCase());for(var f=0,g=a.length,h;f<g;f++)if(h=a[f]){while((h=h.previousSibling)&&h.nodeType!==1);a[f]=e||h&&h.nodeName.toLowerCase()===b?h||!1:h===b}e&&k.filter(b,a,!0)},">":function(a,b){var c,d=typeof b=="string",e=0,f=a.length;if(d&&!j.test(b)){b=b.toLowerCase();for(;e<f;e++){c=a[e];if(c){var g=c.parentNode;a[e]=g.nodeName.toLowerCase()===b?g:!1}}}else{for(;e<f;e++)c=a[e],c&&(a[e]=d?c.parentNode:c.parentNode===b);d&&k.filter(b,a,!0)}},"":function(a,b,c){var e,f=d++,g=u;typeof b=="string"&&!j.test(b)&&(b=b.toLowerCase(),e=b,g=t),g("parentNode",b,f,a,e,c)},"~":function(a,b,c){var e,f=d++,g=u;typeof b=="string"&&!j.test(b)&&(b=b.toLowerCase(),e=b,g=t),g("previousSibling",b,f,a,e,c)}},find:{ID:function(a,b,c){if(typeof b.getElementById!="undefined"&&!c){var d=b.getElementById(a[1]);return d&&d.parentNode?[d]:[]}},NAME:function(a,b){if(typeof b.getElementsByName!="undefined"){var c=[],d=b.getElementsByName(a[1]);for(var e=0,f=d.length;e<f;e++)d[e].getAttribute("name")===a[1]&&c.push(d[e]);return c.length===0?null:c}},TAG:function(a,b){if(typeof b.getElementsByTagName!="undefined")return b.getElementsByTagName(a[1])}},preFilter:{CLASS:function(a,b,c,d,e,f){a=" "+a[1].replace(i,"")+" ";if(f)return a;for(var g=0,h;(h=b[g])!=null;g++)h&&(e^(h.className&&(" "+h.className+" ").replace(/[\t\n\r]/g," ").indexOf(a)>=0)?c||d.push(h):c&&(b[g]=!1));return!1},ID:function(a){return a[1].replace(i,"")},TAG:function(a,b){return a[1].replace(i,"").toLowerCase()},CHILD:function(a){if(a[1]==="nth"){a[2]||k.error(a[0]),a[2]=a[2].replace(/^\+|\s*/g,"");var b=/(-?)(\d*)(?:n([+\-]?\d*))?/.exec(a[2]==="even"&&"2n"||a[2]==="odd"&&"2n+1"||!/\D/.test(a[2])&&"0n+"+a[2]||a[2]);a[2]=b[1]+(b[2]||1)-0,a[3]=b[3]-0}else a[2]&&k.error(a[0]);a[0]=d++;return a},ATTR:function(a,b,c,d,e,f){var g=a[1]=a[1].replace(i,"");!f&&l.attrMap[g]&&(a[1]=l.attrMap[g]),a[4]=(a[4]||a[5]||"").replace(i,""),a[2]==="~="&&(a[4]=" "+a[4]+" ");return a},PSEUDO:function(b,c,d,e,f){if(b[1]==="not")if((a.exec(b[3])||"").length>1||/^\w/.test(b[3]))b[3]=k(b[3],null,null,c);else{var g=k.filter(b[3],c,d,!0^f);d||e.push.apply(e,g);return!1}else if(l.match.POS.test(b[0])||l.match.CHILD.test(b[0]))return!0;return b},POS:function(a){a.unshift(!0);return a}},filters:{enabled:function(a){return a.disabled===!1&&a.type!=="hidden"},disabled:function(a){return a.disabled===!0},checked:function(a){return a.checked===!0},selected:function(a){a.parentNode&&a.parentNode.selectedIndex;return a.selected===!0},parent:function(a){return!!a.firstChild},empty:function(a){return!a.firstChild},has:function(a,b,c){return!!k(c[3],a).length},header:function(a){return/h\d/i.test(a.nodeName)},text:function(a){var b=a.getAttribute("type"),c=a.type;return a.nodeName.toLowerCase()==="input"&&"text"===c&&(b===c||b===null)},radio:function(a){return a.nodeName.toLowerCase()==="input"&&"radio"===a.type},checkbox:function(a){return a.nodeName.toLowerCase()==="input"&&"checkbox"===a.type},file:function(a){return a.nodeName.toLowerCase()==="input"&&"file"===a.type},password:function(a){return a.nodeName.toLowerCase()==="input"&&"password"===a.type},submit:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"submit"===a.type},image:function(a){return a.nodeName.toLowerCase()==="input"&&"image"===a.type},reset:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"reset"===a.type},button:function(a){var b=a.nodeName.toLowerCase();return b==="input"&&"button"===a.type||b==="button"},input:function(a){return/input|select|textarea|button/i.test(a.nodeName)},focus:function(a){return a===a.ownerDocument.activeElement}},setFilters:{first:function(a,b){return b===0},last:function(a,b,c,d){return b===d.length-1},even:function(a,b){return b%2===0},odd:function(a,b){return b%2===1},lt:function(a,b,c){return b<c[3]-0},gt:function(a,b,c){return b>c[3]-0},nth:function(a,b,c){return c[3]-0===b},eq:function(a,b,c){return c[3]-0===b}},filter:{PSEUDO:function(a,b,c,d){var e=b[1],f=l.filters[e];if(f)return f(a,c,b,d);if(e==="contains")return(a.textContent||a.innerText||k.getText([a])||"").indexOf(b[3])>=0;if(e==="not"){var g=b[3];for(var h=0,i=g.length;h<i;h++)if(g[h]===a)return!1;return!0}k.error(e)},CHILD:function(a,b){var c=b[1],d=a;switch(c){case"only":case"first":while(d=d.previousSibling)if(d.nodeType===1)return!1;if(c==="first")return!0;d=a;case"last":while(d=d.nextSibling)if(d.nodeType===1)return!1;return!0;case"nth":var e=b[2],f=b[3];if(e===1&&f===0)return!0;var g=b[0],h=a.parentNode;if(h&&(h.sizcache!==g||!a.nodeIndex)){var i=0;for(d=h.firstChild;d;d=d.nextSibling)d.nodeType===1&&(d.nodeIndex=++i);h.sizcache=g}var j=a.nodeIndex-f;return e===0?j===0:j%e===0&&j/e>=0}},ID:function(a,b){return a.nodeType===1&&a.getAttribute("id")===b},TAG:function(a,b){return b==="*"&&a.nodeType===1||a.nodeName.toLowerCase()===b},CLASS:function(a,b){return(" "+(a.className||a.getAttribute("class"))+" ").indexOf(b)>-1},ATTR:function(a,b){var c=b[1],d=l.attrHandle[c]?l.attrHandle[c](a):a[c]!=null?a[c]:a.getAttribute(c),e=d+"",f=b[2],g=b[4];return d==null?f==="!=":f==="="?e===g:f==="*="?e.indexOf(g)>=0:f==="~="?(" "+e+" ").indexOf(g)>=0:g?f==="!="?e!==g:f==="^="?e.indexOf(g)===0:f==="$="?e.substr(e.length-g.length)===g:f==="|="?e===g||e.substr(0,g.length+1)===g+"-":!1:e&&d!==!1},POS:function(a,b,c,d){var e=b[2],f=l.setFilters[e];if(f)return f(a,c,b,d)}}},m=l.match.POS,n=function(a,b){return"\\"+(b-0+1)};for(var o in l.match)l.match[o]=new RegExp(l.match[o].source+/(?![^\[]*\])(?![^\(]*\))/.source),l.leftMatch[o]=new RegExp(/(^(?:.|\r|\n)*?)/.source+l.match[o].source.replace(/\\(\d+)/g,n));var p=function(a,b){a=Array.prototype.slice.call(a,0);if(b){b.push.apply(b,a);return b}return a};try{Array.prototype.slice.call(c.documentElement.childNodes,0)[0].nodeType}catch(q){p=function(a,b){var c=0,d=b||[];if(e.call(a)==="[object Array]")Array.prototype.push.apply(d,a);else if(typeof a.length=="number")for(var f=a.length;c<f;c++)d.push(a[c]);else for(;a[c];c++)d.push(a[c]);return d}}var r,s;c.documentElement.compareDocumentPosition?r=function(a,b){if(a===b){g=!0;return 0}if(!a.compareDocumentPosition||!b.compareDocumentPosition)return a.compareDocumentPosition?-1:1;return a.compareDocumentPosition(b)&4?-1:1}:(r=function(a,b){if(a===b){g=!0;return 0}if(a.sourceIndex&&b.sourceIndex)return a.sourceIndex-b.sourceIndex;var c,d,e=[],f=[],h=a.parentNode,i=b.parentNode,j=h;if(h===i)return s(a,b);if(!h)return-1;if(!i)return 1;while(j)e.unshift(j),j=j.parentNode;j=i;while(j)f.unshift(j),j=j.parentNode;c=e.length,d=f.length;for(var k=0;k<c&&k<d;k++)if(e[k]!==f[k])return s(e[k],f[k]);return k===c?s(a,f[k],-1):s(e[k],b,1)},s=function(a,b,c){if(a===b)return c;var d=a.nextSibling;while(d){if(d===b)return-1;d=d.nextSibling}return 1}),k.getText=function(a){var b="",c;for(var d=0;a[d];d++)c=a[d],c.nodeType===3||c.nodeType===4?b+=c.nodeValue:c.nodeType!==8&&(b+=k.getText(c.childNodes));return b},function(){var a=c.createElement("div"),d="script"+(new Date).getTime(),e=c.documentElement;a.innerHTML="<a name='"+d+"'/>",e.insertBefore(a,e.firstChild),c.getElementById(d)&&(l.find.ID=function(a,c,d){if(typeof c.getElementById!="undefined"&&!d){var e=c.getElementById(a[1]);return e?e.id===a[1]||typeof e.getAttributeNode!="undefined"&&e.getAttributeNode("id").nodeValue===a[1]?[e]:b:[]}},l.filter.ID=function(a,b){var c=typeof a.getAttributeNode!="undefined"&&a.getAttributeNode("id");return a.nodeType===1&&c&&c.nodeValue===b}),e.removeChild(a),e=a=null}(),function(){var a=c.createElement("div");a.appendChild(c.createComment("")),a.getElementsByTagName("*").length>0&&(l.find.TAG=function(a,b){var c=b.getElementsByTagName(a[1]);if(a[1]==="*"){var d=[];for(var e=0;c[e];e++)c[e].nodeType===1&&d.push(c[e]);c=d}return c}),a.innerHTML="<a href='#'></a>",a.firstChild&&typeof a.firstChild.getAttribute!="undefined"&&a.firstChild.getAttribute("href")!=="#"&&(l.attrHandle.href=function(a){return a.getAttribute("href",2)}),a=null}(),c.querySelectorAll&&function(){var a=k,b=c.createElement("div"),d="__sizzle__";b.innerHTML="<p class='TEST'></p>";if(!b.querySelectorAll||b.querySelectorAll(".TEST").length!==0){k=function(b,e,f,g){e=e||c;if(!g&&!k.isXML(e)){var h=/^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec(b);if(h&&(e.nodeType===1||e.nodeType===9)){if(h[1])return p(e.getElementsByTagName(b),f);if(h[2]&&l.find.CLASS&&e.getElementsByClassName)return p(e.getElementsByClassName(h[2]),f)}if(e.nodeType===9){if(b==="body"&&e.body)return p([e.body],f);if(h&&h[3]){var i=e.getElementById(h[3]);if(!i||!i.parentNode)return p([],f);if(i.id===h[3])return p([i],f)}try{return p(e.querySelectorAll(b),f)}catch(j){}}else if(e.nodeType===1&&e.nodeName.toLowerCase()!=="object"){var m=e,n=e.getAttribute("id"),o=n||d,q=e.parentNode,r=/^\s*[+~]/.test(b);n?o=o.replace(/'/g,"\\$&"):e.setAttribute("id",o),r&&q&&(e=e.parentNode);try{if(!r||q)return p(e.querySelectorAll("[id='"+o+"'] "+b),f)}catch(s){}finally{n||m.removeAttribute("id")}}}return a(b,e,f,g)};for(var e in a)k[e]=a[e];b=null}}(),function(){var a=c.documentElement,b=a.matchesSelector||a.mozMatchesSelector||a.webkitMatchesSelector||a.msMatchesSelector;if(b){var d=!b.call(c.createElement("div"),"div"),e=!1;try{b.call(c.documentElement,"[test!='']:sizzle")}catch(f){e=!0}k.matchesSelector=function(a,c){c=c.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!k.isXML(a))try{if(e||!l.match.PSEUDO.test(c)&&!/!=/.test(c)){var f=b.call(a,c);if(f||!d||a.document&&a.document.nodeType!==11)return f}}catch(g){}return k(c,null,null,[a]).length>0}}}(),function(){var a=c.createElement("div");a.innerHTML="<div class='test e'></div><div class='test'></div>";if(!!a.getElementsByClassName&&a.getElementsByClassName("e").length!==0){a.lastChild.className="e";if(a.getElementsByClassName("e").length===1)return;l.order.splice(1,0,"CLASS"),l.find.CLASS=function(a,b,c){if(typeof b.getElementsByClassName!="undefined"&&!c)return b.getElementsByClassName(a[1])},a=null}}(),c.documentElement.contains?k.contains=function(a,b){return a!==b&&(a.contains?a.contains(b):!0)}:c.documentElement.compareDocumentPosition?k.contains=function(a,b){return!!(a.compareDocumentPosition(b)&16)}:k.contains=function(){return!1},k.isXML=function(a){var b=(a?a.ownerDocument||a:0).documentElement;return b?b.nodeName!=="HTML":!1};var v=function(a,b){var c,d=[],e="",f=b.nodeType?[b]:b;while(c=l.match.PSEUDO.exec(a))e+=c[0],a=a.replace(l.match.PSEUDO,"");a=l.relative[a]?a+"*":a;for(var g=0,h=f.length;g<h;g++)k(a,f[g],d);return k.filter(e,d)};f.find=k,f.expr=k.selectors,f.expr[":"]=f.expr.filters,f.unique=k.uniqueSort,f.text=k.getText,f.isXMLDoc=k.isXML,f.contains=k.contains}();var N=/Until$/,O=/^(?:parents|prevUntil|prevAll)/,P=/,/,Q=/^.[^:#\[\.,]*$/,R=Array.prototype.slice,S=f.expr.match.POS,T={children:!0,contents:!0,next:!0,prev:!0};f.fn.extend({find:function(a){var b=this,c,d;if(typeof a!="string")return f(a).filter(function(){for(c=0,d=b.length;c<d;c++)if(f.contains(b[c],this))return!0});var e=this.pushStack("","find",a),g,h,i;for(c=0,d=this.length;c<d;c++){g=e.length,f.find(a,this[c],e);if(c>0)for(h=g;h<e.length;h++)for(i=0;i<g;i++)if(e[i]===e[h]){e.splice(h--,1);break}}return e},has:function(a){var b=f(a);return this.filter(function(){for(var a=0,c=b.length;a<c;a++)if(f.contains(this,b[a]))return!0})},not:function(a){return this.pushStack(V(this,a,!1),"not",a)},filter:function(a){return this.pushStack(V(this,a,!0),"filter",a)},is:function(a){return!!a&&(typeof a=="string"?f.filter(a,this).length>0:this.filter(a).length>0)},closest:function(a,b){var c=[],d,e,g=this[0];if(f.isArray(a)){var h,i,j={},k=1;if(g&&a.length){for(d=0,e=a.length;d<e;d++)i=a[d],j[i]||(j[i]=S.test(i)?f(i,b||this.context):i);while(g&&g.ownerDocument&&g!==b){for(i in j)h=j[i],(h.jquery?h.index(g)>-1:f(g).is(h))&&c.push({selector:i,elem:g,level:k});g=g.parentNode,k++}}return c}var l=S.test(a)||typeof a!="string"?f(a,b||this.context):0;for(d=0,e=this.length;d<e;d++){g=this[d];while(g){if(l?l.index(g)>-1:f.find.matchesSelector(g,a)){c.push(g);break}g=g.parentNode;if(!g||!g.ownerDocument||g===b||g.nodeType===11)break}}c=c.length>1?f.unique(c):c;return this.pushStack(c,"closest",a)},index:function(a){if(!a)return this[0]&&this[0].parentNode?this.prevAll().length:-1;if(typeof a=="string")return f.inArray(this[0],f(a));return f.inArray(a.jquery?a[0]:a,this)},add:function(a,b){var c=typeof a=="string"?f(a,b):f.makeArray(a&&a.nodeType?[a]:a),d=f.merge(this.get(),c);return this.pushStack(U(c[0])||U(d[0])?d:f.unique(d))},andSelf:function(){return this.add(this.prevObject)}}),f.each({parent:function(a){var b=a.parentNode;return b&&b.nodeType!==11?b:null},parents:function(a){return f.dir(a,"parentNode")},parentsUntil:function(a,b,c){return f.dir(a,"parentNode",c)},next:function(a){return f.nth(a,2,"nextSibling")},prev:function(a){return f.nth(a,2,"previousSibling")},nextAll:function(a){return f.dir(a,"nextSibling")},prevAll:function(a){return f.dir(a,"previousSibling")},nextUntil:function(a,b,c){return f.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return f.dir(a,"previousSibling",c)},siblings:function(a){return f.sibling(a.parentNode.firstChild,a)},children:function(a){return f.sibling(a.firstChild)},contents:function(a){return f.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:f.makeArray(a.childNodes)}},function(a,b){f.fn[a]=function(c,d){var e=f.map(this,b,c),g=R.call(arguments);N.test(a)||(d=c),d&&typeof d=="string"&&(e=f.filter(d,e)),e=this.length>1&&!T[a]?f.unique(e):e,(this.length>1||P.test(d))&&O.test(a)&&(e=e.reverse());return this.pushStack(e,a,g.join(","))}}),f.extend({filter:function(a,b,c){c&&(a=":not("+a+")");return b.length===1?f.find.matchesSelector(b[0],a)?[b[0]]:[]:f.find.matches(a,b)},dir:function(a,c,d){var e=[],g=a[c];while(g&&g.nodeType!==9&&(d===b||g.nodeType!==1||!f(g).is(d)))g.nodeType===1&&e.push(g),g=g[c];return e},nth:function(a,b,c,d){b=b||1;var e=0;for(;a;a=a[c])if(a.nodeType===1&&++e===b)break;return a},sibling:function(a,b){var c=[];for(;a;a=a.nextSibling)a.nodeType===1&&a!==b&&c.push(a);return c}});var W=/ jQuery\d+="(?:\d+|null)"/g,X=/^\s+/,Y=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,Z=/<([\w:]+)/,$=/<tbody/i,_=/<|&#?\w+;/,ba=/<(?:script|object|embed|option|style)/i,bb=/checked\s*(?:[^=]|=\s*.checked.)/i,bc=/\/(java|ecma)script/i,bd=/^\s*<!(?:\[CDATA\[|\-\-)/,be={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],area:[1,"<map>","</map>"],_default:[0,"",""]};be.optgroup=be.option,be.tbody=be.tfoot=be.colgroup=be.caption=be.thead,be.th=be.td,f.support.htmlSerialize||(be._default=[1,"div<div>","</div>"]),f.fn.extend({text:function(a){if(f.isFunction(a))return this.each(function(b){var c=f(this);c.text(a.call(this,b,c.text()))});if(typeof a!="object"&&a!==b)return this.empty().append((this[0]&&this[0].ownerDocument||c).createTextNode(a));return f.text(this)},wrapAll:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapAll(a.call(this,b))});if(this[0]){var b=f(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&a.firstChild.nodeType===1)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapInner(a.call(this,b))});return this.each(function(){var b=f(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){return this.each(function(){f(this).wrapAll(a)})},unwrap:function(){return this.parent().each(function(){f.nodeName(this,"body")||f(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.appendChild(a)})},prepend:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this)});if(arguments.length){var a=f(arguments[0]);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this.nextSibling)});if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,f(arguments[0]).toArray());return a}},remove:function(a,b){for(var c=0,d;(d=this[c])!=null;c++)if(!a||f.filter(a,[d]).length)!b&&d.nodeType===1&&(f.cleanData(d.getElementsByTagName("*")),f.cleanData([d])),d.parentNode&&d.parentNode.removeChild(d);return this},empty:function(){for(var a=0,b;(b=this[a])!=null;a++){b.nodeType===1&&f.cleanData(b.getElementsByTagName("*"));while(b.firstChild)b.removeChild(b.firstChild)}return this},clone:function(a,b){a=a==null?!1:a,b=b==null?a:b;return this.map(function(){return f.clone(this,a,b)})},html:function(a){if(a===b)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(W,""):null;if(typeof a=="string"&&!ba.test(a)&&(f.support.leadingWhitespace||!X.test(a))&&!be[(Z.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Y,"<$1></$2>");try{for(var c=0,d=this.length;c<d;c++)this[c].nodeType===1&&(f.cleanData(this[c].getElementsByTagName("*")),this[c].innerHTML=a)}catch(e){this.empty().append(a)}}else f.isFunction(a)?this.each(function(b){var c=f(this);c.html(a.call(this,b,c.html()))}):this.empty().append(a);return this},replaceWith:function(a){if(this[0]&&this[0].parentNode){if(f.isFunction(a))return this.each(function(b){var c=f(this),d=c.html();c.replaceWith(a.call(this,b,d))});typeof a!="string"&&(a=f(a).detach());return this.each(function(){var b=this.nextSibling,c=this.parentNode;f(this).remove(),b?f(b).before(a):f(c).append(a)})}return this.length?this.pushStack(f(f.isFunction(a)?a():a),"replaceWith",a):this},detach:function(a){return this.remove(a,!0)},domManip:function(a,c,d){var e,g,h,i,j=a[0],k=[];if(!f.support.checkClone&&arguments.length===3&&typeof j=="string"&&bb.test(j))return this.each(function(){f(this).domManip(a,c,d,!0)});if(f.isFunction(j))return this.each(function(e){var g=f(this);a[0]=j.call(this,e,c?g.html():b),g.domManip(a,c,d)});if(this[0]){i=j&&j.parentNode,f.support.parentNode&&i&&i.nodeType===11&&i.childNodes.length===this.length?e={fragment:i}:e=f.buildFragment(a,this,k),h=e.fragment,h.childNodes.length===1?g=h=h.firstChild:g=h.firstChild;if(g){c=c&&f.nodeName(g,"tr");for(var l=0,m=this.length,n=m-1;l<m;l++)d.call(c?bf(this[l],g):this[l],e.cacheable||m>1&&l<n?f.clone(h,!0,!0):h)}k.length&&f.each(k,bl)}return this}}),f.buildFragment=function(a,b,d){var e,g,h,i;b&&b[0]&&(i=b[0].ownerDocument||b[0]),i.createDocumentFragment||(i=c),a.length===1&&typeof a[0]=="string"&&a[0].length<512&&i===c&&a[0].charAt(0)==="<"&&!ba.test(a[0])&&(f.support.checkClone||!bb.test(a[0]))&&(g=!0,h=f.fragments[a[0]],h&&h!==1&&(e=h)),e||(e=i.createDocumentFragment(),f.clean +(a,i,e,d)),g&&(f.fragments[a[0]]=h?e:1);return{fragment:e,cacheable:g}},f.fragments={},f.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){f.fn[a]=function(c){var d=[],e=f(c),g=this.length===1&&this[0].parentNode;if(g&&g.nodeType===11&&g.childNodes.length===1&&e.length===1){e[b](this[0]);return this}for(var h=0,i=e.length;h<i;h++){var j=(h>0?this.clone(!0):this).get();f(e[h])[b](j),d=d.concat(j)}return this.pushStack(d,a,e.selector)}}),f.extend({clone:function(a,b,c){var d=a.cloneNode(!0),e,g,h;if((!f.support.noCloneEvent||!f.support.noCloneChecked)&&(a.nodeType===1||a.nodeType===11)&&!f.isXMLDoc(a)){bh(a,d),e=bi(a),g=bi(d);for(h=0;e[h];++h)g[h]&&bh(e[h],g[h])}if(b){bg(a,d);if(c){e=bi(a),g=bi(d);for(h=0;e[h];++h)bg(e[h],g[h])}}e=g=null;return d},clean:function(a,b,d,e){var g;b=b||c,typeof b.createElement=="undefined"&&(b=b.ownerDocument||b[0]&&b[0].ownerDocument||c);var h=[],i;for(var j=0,k;(k=a[j])!=null;j++){typeof k=="number"&&(k+="");if(!k)continue;if(typeof k=="string")if(!_.test(k))k=b.createTextNode(k);else{k=k.replace(Y,"<$1></$2>");var l=(Z.exec(k)||["",""])[1].toLowerCase(),m=be[l]||be._default,n=m[0],o=b.createElement("div");o.innerHTML=m[1]+k+m[2];while(n--)o=o.lastChild;if(!f.support.tbody){var p=$.test(k),q=l==="table"&&!p?o.firstChild&&o.firstChild.childNodes:m[1]==="<table>"&&!p?o.childNodes:[];for(i=q.length-1;i>=0;--i)f.nodeName(q[i],"tbody")&&!q[i].childNodes.length&&q[i].parentNode.removeChild(q[i])}!f.support.leadingWhitespace&&X.test(k)&&o.insertBefore(b.createTextNode(X.exec(k)[0]),o.firstChild),k=o.childNodes}var r;if(!f.support.appendChecked)if(k[0]&&typeof (r=k.length)=="number")for(i=0;i<r;i++)bk(k[i]);else bk(k);k.nodeType?h.push(k):h=f.merge(h,k)}if(d){g=function(a){return!a.type||bc.test(a.type)};for(j=0;h[j];j++)if(e&&f.nodeName(h[j],"script")&&(!h[j].type||h[j].type.toLowerCase()==="text/javascript"))e.push(h[j].parentNode?h[j].parentNode.removeChild(h[j]):h[j]);else{if(h[j].nodeType===1){var s=f.grep(h[j].getElementsByTagName("script"),g);h.splice.apply(h,[j+1,0].concat(s))}d.appendChild(h[j])}}return h},cleanData:function(a){var b,c,d=f.cache,e=f.expando,g=f.event.special,h=f.support.deleteExpando;for(var i=0,j;(j=a[i])!=null;i++){if(j.nodeName&&f.noData[j.nodeName.toLowerCase()])continue;c=j[f.expando];if(c){b=d[c]&&d[c][e];if(b&&b.events){for(var k in b.events)g[k]?f.event.remove(j,k):f.removeEvent(j,k,b.handle);b.handle&&(b.handle.elem=null)}h?delete j[f.expando]:j.removeAttribute&&j.removeAttribute(f.expando),delete d[c]}}}});var bm=/alpha\([^)]*\)/i,bn=/opacity=([^)]*)/,bo=/([A-Z]|^ms)/g,bp=/^-?\d+(?:px)?$/i,bq=/^-?\d/,br=/^([\-+])=([\-+.\de]+)/,bs={position:"absolute",visibility:"hidden",display:"block"},bt=["Left","Right"],bu=["Top","Bottom"],bv,bw,bx;f.fn.css=function(a,c){if(arguments.length===2&&c===b)return this;return f.access(this,a,c,!0,function(a,c,d){return d!==b?f.style(a,c,d):f.css(a,c)})},f.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=bv(a,"opacity","opacity");return c===""?"1":c}return a.style.opacity}}},cssNumber:{fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":f.support.cssFloat?"cssFloat":"styleFloat"},style:function(a,c,d,e){if(!!a&&a.nodeType!==3&&a.nodeType!==8&&!!a.style){var g,h,i=f.camelCase(c),j=a.style,k=f.cssHooks[i];c=f.cssProps[i]||i;if(d===b){if(k&&"get"in k&&(g=k.get(a,!1,e))!==b)return g;return j[c]}h=typeof d,h==="string"&&(g=br.exec(d))&&(d=+(g[1]+1)*+g[2]+parseFloat(f.css(a,c)),h="number");if(d==null||h==="number"&&isNaN(d))return;h==="number"&&!f.cssNumber[i]&&(d+="px");if(!k||!("set"in k)||(d=k.set(a,d))!==b)try{j[c]=d}catch(l){}}},css:function(a,c,d){var e,g;c=f.camelCase(c),g=f.cssHooks[c],c=f.cssProps[c]||c,c==="cssFloat"&&(c="float");if(g&&"get"in g&&(e=g.get(a,!0,d))!==b)return e;if(bv)return bv(a,c)},swap:function(a,b,c){var d={};for(var e in b)d[e]=a.style[e],a.style[e]=b[e];c.call(a);for(e in b)a.style[e]=d[e]}}),f.curCSS=f.css,f.each(["height","width"],function(a,b){f.cssHooks[b]={get:function(a,c,d){var e;if(c){if(a.offsetWidth!==0)return by(a,b,d);f.swap(a,bs,function(){e=by(a,b,d)});return e}},set:function(a,b){if(!bp.test(b))return b;b=parseFloat(b);if(b>=0)return b+"px"}}}),f.support.opacity||(f.cssHooks.opacity={get:function(a,b){return bn.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?parseFloat(RegExp.$1)/100+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle,e=f.isNaN(b)?"":"alpha(opacity="+b*100+")",g=d&&d.filter||c.filter||"";c.zoom=1;if(b>=1&&f.trim(g.replace(bm,""))===""){c.removeAttribute("filter");if(d&&!d.filter)return}c.filter=bm.test(g)?g.replace(bm,e):g+" "+e}}),f(function(){f.support.reliableMarginRight||(f.cssHooks.marginRight={get:function(a,b){var c;f.swap(a,{display:"inline-block"},function(){b?c=bv(a,"margin-right","marginRight"):c=a.style.marginRight});return c}})}),c.defaultView&&c.defaultView.getComputedStyle&&(bw=function(a,c){var d,e,g;c=c.replace(bo,"-$1").toLowerCase();if(!(e=a.ownerDocument.defaultView))return b;if(g=e.getComputedStyle(a,null))d=g.getPropertyValue(c),d===""&&!f.contains(a.ownerDocument.documentElement,a)&&(d=f.style(a,c));return d}),c.documentElement.currentStyle&&(bx=function(a,b){var c,d=a.currentStyle&&a.currentStyle[b],e=a.runtimeStyle&&a.runtimeStyle[b],f=a.style;!bp.test(d)&&bq.test(d)&&(c=f.left,e&&(a.runtimeStyle.left=a.currentStyle.left),f.left=b==="fontSize"?"1em":d||0,d=f.pixelLeft+"px",f.left=c,e&&(a.runtimeStyle.left=e));return d===""?"auto":d}),bv=bw||bx,f.expr&&f.expr.filters&&(f.expr.filters.hidden=function(a){var b=a.offsetWidth,c=a.offsetHeight;return b===0&&c===0||!f.support.reliableHiddenOffsets&&(a.style.display||f.css(a,"display"))==="none"},f.expr.filters.visible=function(a){return!f.expr.filters.hidden(a)});var bz=/%20/g,bA=/\[\]$/,bB=/\r?\n/g,bC=/#.*$/,bD=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,bE=/^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,bF=/^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,bG=/^(?:GET|HEAD)$/,bH=/^\/\//,bI=/\?/,bJ=/<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,bK=/^(?:select|textarea)/i,bL=/\s+/,bM=/([?&])_=[^&]*/,bN=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,bO=f.fn.load,bP={},bQ={},bR,bS,bT=["*/"]+["*"];try{bR=e.href}catch(bU){bR=c.createElement("a"),bR.href="",bR=bR.href}bS=bN.exec(bR.toLowerCase())||[],f.fn.extend({load:function(a,c,d){if(typeof a!="string"&&bO)return bO.apply(this,arguments);if(!this.length)return this;var e=a.indexOf(" ");if(e>=0){var g=a.slice(e,a.length);a=a.slice(0,e)}var h="GET";c&&(f.isFunction(c)?(d=c,c=b):typeof c=="object"&&(c=f.param(c,f.ajaxSettings.traditional),h="POST"));var i=this;f.ajax({url:a,type:h,dataType:"html",data:c,complete:function(a,b,c){c=a.responseText,a.isResolved()&&(a.done(function(a){c=a}),i.html(g?f("<div>").append(c.replace(bJ,"")).find(g):c)),d&&i.each(d,[c,b,a])}});return this},serialize:function(){return f.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?f.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||bK.test(this.nodeName)||bE.test(this.type))}).map(function(a,b){var c=f(this).val();return c==null?null:f.isArray(c)?f.map(c,function(a,c){return{name:b.name,value:a.replace(bB,"\r\n")}}):{name:b.name,value:c.replace(bB,"\r\n")}}).get()}}),f.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){f.fn[b]=function(a){return this.bind(b,a)}}),f.each(["get","post"],function(a,c){f[c]=function(a,d,e,g){f.isFunction(d)&&(g=g||e,e=d,d=b);return f.ajax({type:c,url:a,data:d,success:e,dataType:g})}}),f.extend({getScript:function(a,c){return f.get(a,b,c,"script")},getJSON:function(a,b,c){return f.get(a,b,c,"json")},ajaxSetup:function(a,b){b?bX(a,f.ajaxSettings):(b=a,a=f.ajaxSettings),bX(a,b);return a},ajaxSettings:{url:bR,isLocal:bF.test(bS[1]),global:!0,type:"GET",contentType:"application/x-www-form-urlencoded",processData:!0,async:!0,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":bT},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":a.String,"text html":!0,"text json":f.parseJSON,"text xml":f.parseXML},flatOptions:{context:!0,url:!0}},ajaxPrefilter:bV(bP),ajaxTransport:bV(bQ),ajax:function(a,c){function w(a,c,l,m){if(s!==2){s=2,q&&clearTimeout(q),p=b,n=m||"",v.readyState=a>0?4:0;var o,r,u,w=c,x=l?bZ(d,v,l):b,y,z;if(a>=200&&a<300||a===304){if(d.ifModified){if(y=v.getResponseHeader("Last-Modified"))f.lastModified[k]=y;if(z=v.getResponseHeader("Etag"))f.etag[k]=z}if(a===304)w="notmodified",o=!0;else try{r=b$(d,x),w="success",o=!0}catch(A){w="parsererror",u=A}}else{u=w;if(!w||a)w="error",a<0&&(a=0)}v.status=a,v.statusText=""+(c||w),o?h.resolveWith(e,[r,w,v]):h.rejectWith(e,[v,w,u]),v.statusCode(j),j=b,t&&g.trigger("ajax"+(o?"Success":"Error"),[v,d,o?r:u]),i.resolveWith(e,[v,w]),t&&(g.trigger("ajaxComplete",[v,d]),--f.active||f.event.trigger("ajaxStop"))}}typeof a=="object"&&(c=a,a=b),c=c||{};var d=f.ajaxSetup({},c),e=d.context||d,g=e!==d&&(e.nodeType||e instanceof f)?f(e):f.event,h=f.Deferred(),i=f._Deferred(),j=d.statusCode||{},k,l={},m={},n,o,p,q,r,s=0,t,u,v={readyState:0,setRequestHeader:function(a,b){if(!s){var c=a.toLowerCase();a=m[c]=m[c]||a,l[a]=b}return this},getAllResponseHeaders:function(){return s===2?n:null},getResponseHeader:function(a){var c;if(s===2){if(!o){o={};while(c=bD.exec(n))o[c[1].toLowerCase()]=c[2]}c=o[a.toLowerCase()]}return c===b?null:c},overrideMimeType:function(a){s||(d.mimeType=a);return this},abort:function(a){a=a||"abort",p&&p.abort(a),w(0,a);return this}};h.promise(v),v.success=v.done,v.error=v.fail,v.complete=i.done,v.statusCode=function(a){if(a){var b;if(s<2)for(b in a)j[b]=[j[b],a[b]];else b=a[v.status],v.then(b,b)}return this},d.url=((a||d.url)+"").replace(bC,"").replace(bH,bS[1]+"//"),d.dataTypes=f.trim(d.dataType||"*").toLowerCase().split(bL),d.crossDomain==null&&(r=bN.exec(d.url.toLowerCase()),d.crossDomain=!(!r||r[1]==bS[1]&&r[2]==bS[2]&&(r[3]||(r[1]==="http:"?80:443))==(bS[3]||(bS[1]==="http:"?80:443)))),d.data&&d.processData&&typeof d.data!="string"&&(d.data=f.param(d.data,d.traditional)),bW(bP,d,c,v);if(s===2)return!1;t=d.global,d.type=d.type.toUpperCase(),d.hasContent=!bG.test(d.type),t&&f.active++===0&&f.event.trigger("ajaxStart");if(!d.hasContent){d.data&&(d.url+=(bI.test(d.url)?"&":"?")+d.data,delete d.data),k=d.url;if(d.cache===!1){var x=f.now(),y=d.url.replace(bM,"$1_="+x);d.url=y+(y===d.url?(bI.test(d.url)?"&":"?")+"_="+x:"")}}(d.data&&d.hasContent&&d.contentType!==!1||c.contentType)&&v.setRequestHeader("Content-Type",d.contentType),d.ifModified&&(k=k||d.url,f.lastModified[k]&&v.setRequestHeader("If-Modified-Since",f.lastModified[k]),f.etag[k]&&v.setRequestHeader("If-None-Match",f.etag[k])),v.setRequestHeader("Accept",d.dataTypes[0]&&d.accepts[d.dataTypes[0]]?d.accepts[d.dataTypes[0]]+(d.dataTypes[0]!=="*"?", "+bT+"; q=0.01":""):d.accepts["*"]);for(u in d.headers)v.setRequestHeader(u,d.headers[u]);if(d.beforeSend&&(d.beforeSend.call(e,v,d)===!1||s===2)){v.abort();return!1}for(u in{success:1,error:1,complete:1})v[u](d[u]);p=bW(bQ,d,c,v);if(!p)w(-1,"No Transport");else{v.readyState=1,t&&g.trigger("ajaxSend",[v,d]),d.async&&d.timeout>0&&(q=setTimeout(function(){v.abort("timeout")},d.timeout));try{s=1,p.send(l,w)}catch(z){s<2?w(-1,z):f.error(z)}}return v},param:function(a,c){var d=[],e=function(a,b){b=f.isFunction(b)?b():b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};c===b&&(c=f.ajaxSettings.traditional);if(f.isArray(a)||a.jquery&&!f.isPlainObject(a))f.each(a,function(){e(this.name,this.value)});else for(var g in a)bY(g,a[g],c,e);return d.join("&").replace(bz,"+")}}),f.extend({active:0,lastModified:{},etag:{}});var b_=f.now(),ca=/(\=)\?(&|$)|\?\?/i;f.ajaxSetup({jsonp:"callback",jsonpCallback:function(){return f.expando+"_"+b_++}}),f.ajaxPrefilter("json jsonp",function(b,c,d){var e=b.contentType==="application/x-www-form-urlencoded"&&typeof b.data=="string";if(b.dataTypes[0]==="jsonp"||b.jsonp!==!1&&(ca.test(b.url)||e&&ca.test(b.data))){var g,h=b.jsonpCallback=f.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,i=a[h],j=b.url,k=b.data,l="$1"+h+"$2";b.jsonp!==!1&&(j=j.replace(ca,l),b.url===j&&(e&&(k=k.replace(ca,l)),b.data===k&&(j+=(/\?/.test(j)?"&":"?")+b.jsonp+"="+h))),b.url=j,b.data=k,a[h]=function(a){g=[a]},d.always(function(){a[h]=i,g&&f.isFunction(i)&&a[h](g[0])}),b.converters["script json"]=function(){g||f.error(h+" was not called");return g[0]},b.dataTypes[0]="json";return"script"}}),f.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/javascript|ecmascript/},converters:{"text script":function(a){f.globalEval(a);return a}}}),f.ajaxPrefilter("script",function(a){a.cache===b&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),f.ajaxTransport("script",function(a){if(a.crossDomain){var d,e=c.head||c.getElementsByTagName("head")[0]||c.documentElement;return{send:function(f,g){d=c.createElement("script"),d.async="async",a.scriptCharset&&(d.charset=a.scriptCharset),d.src=a.url,d.onload=d.onreadystatechange=function(a,c){if(c||!d.readyState||/loaded|complete/.test(d.readyState))d.onload=d.onreadystatechange=null,e&&d.parentNode&&e.removeChild(d),d=b,c||g(200,"success")},e.insertBefore(d,e.firstChild)},abort:function(){d&&d.onload(0,1)}}}});var cb=a.ActiveXObject?function(){for(var a in cd)cd[a](0,1)}:!1,cc=0,cd;f.ajaxSettings.xhr=a.ActiveXObject?function(){return!this.isLocal&&ce()||cf()}:ce,function(a){f.extend(f.support,{ajax:!!a,cors:!!a&&"withCredentials"in a})}(f.ajaxSettings.xhr()),f.support.ajax&&f.ajaxTransport(function(c){if(!c.crossDomain||f.support.cors){var d;return{send:function(e,g){var h=c.xhr(),i,j;c.username?h.open(c.type,c.url,c.async,c.username,c.password):h.open(c.type,c.url,c.async);if(c.xhrFields)for(j in c.xhrFields)h[j]=c.xhrFields[j];c.mimeType&&h.overrideMimeType&&h.overrideMimeType(c.mimeType),!c.crossDomain&&!e["X-Requested-With"]&&(e["X-Requested-With"]="XMLHttpRequest");try{for(j in e)h.setRequestHeader(j,e[j])}catch(k){}h.send(c.hasContent&&c.data||null),d=function(a,e){var j,k,l,m,n;try{if(d&&(e||h.readyState===4)){d=b,i&&(h.onreadystatechange=f.noop,cb&&delete cd[i]);if(e)h.readyState!==4&&h.abort();else{j=h.status,l=h.getAllResponseHeaders(),m={},n=h.responseXML,n&&n.documentElement&&(m.xml=n),m.text=h.responseText;try{k=h.statusText}catch(o){k=""}!j&&c.isLocal&&!c.crossDomain?j=m.text?200:404:j===1223&&(j=204)}}}catch(p){e||g(-1,p)}m&&g(j,k,m,l)},!c.async||h.readyState===4?d():(i=++cc,cb&&(cd||(cd={},f(a).unload(cb)),cd[i]=d),h.onreadystatechange=d)},abort:function(){d&&d(0,1)}}}});var cg={},ch,ci,cj=/^(?:toggle|show|hide)$/,ck=/^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,cl,cm=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]],cn;f.fn.extend({show:function(a,b,c){var d,e;if(a||a===0)return this.animate(cq("show",3),a,b,c);for(var g=0,h=this.length;g<h;g++)d=this[g],d.style&&(e=d.style.display,!f._data(d,"olddisplay")&&e==="none"&&(e=d.style.display=""),e===""&&f.css(d,"display")==="none"&&f._data(d,"olddisplay",cr(d.nodeName)));for(g=0;g<h;g++){d=this[g];if(d.style){e=d.style.display;if(e===""||e==="none")d.style.display=f._data(d,"olddisplay")||""}}return this},hide:function(a,b,c){if(a||a===0)return this.animate(cq("hide",3),a,b,c);for(var d=0,e=this.length;d<e;d++)if(this[d].style){var g=f.css(this[d],"display");g!=="none"&&!f._data(this[d],"olddisplay")&&f._data(this[d],"olddisplay",g)}for(d=0;d<e;d++)this[d].style&&(this[d].style.display="none");return this},_toggle:f.fn.toggle,toggle:function(a,b,c){var d=typeof a=="boolean";f.isFunction(a)&&f.isFunction(b)?this._toggle.apply(this,arguments):a==null||d?this.each(function(){var b=d?a:f(this).is(":hidden");f(this)[b?"show":"hide"]()}):this.animate(cq("toggle",3),a,b,c);return this},fadeTo:function(a,b,c,d){return this.filter(":hidden").css("opacity",0).show().end().animate({opacity:b},a,c,d)},animate:function(a,b,c,d){var e=f.speed(b,c,d);if(f.isEmptyObject(a))return this.each(e.complete,[!1]);a=f.extend({},a);return this[e.queue===!1?"each":"queue"](function(){e.queue===!1&&f._mark(this);var b=f.extend({},e),c=this.nodeType===1,d=c&&f(this).is(":hidden"),g,h,i,j,k,l,m,n,o;b.animatedProperties={};for(i in a){g=f.camelCase(i),i!==g&&(a[g]=a[i],delete a[i]),h=a[g],f.isArray(h)?(b.animatedProperties[g]=h[1],h=a[g]=h[0]):b.animatedProperties[g]=b.specialEasing&&b.specialEasing[g]||b.easing||"swing";if(h==="hide"&&d||h==="show"&&!d)return b.complete.call(this);c&&(g==="height"||g==="width")&&(b.overflow=[this.style.overflow,this.style.overflowX,this.style.overflowY],f.css(this,"display")==="inline"&&f.css(this,"float")==="none"&&(f.support.inlineBlockNeedsLayout?(j=cr(this.nodeName),j==="inline"?this.style.display="inline-block":(this.style.display="inline",this.style.zoom=1)):this.style.display="inline-block"))}b.overflow!=null&&(this.style.overflow="hidden");for(i in a)k=new f.fx(this,b,i),h=a[i],cj.test(h)?k[h==="toggle"?d?"show":"hide":h]():(l=ck.exec(h),m=k.cur(),l?(n=parseFloat(l[2]),o=l[3]||(f.cssNumber[i]?"":"px"),o!=="px"&&(f.style(this,i,(n||1)+o),m=(n||1)/k.cur()*m,f.style(this,i,m+o)),l[1]&&(n=(l[1]==="-="?-1:1)*n+m),k.custom(m,n,o)):k.custom(m,h,""));return!0})},stop:function(a,b){a&&this.queue([]),this.each(function(){var a=f.timers,c=a.length;b||f._unmark(!0,this);while(c--)a[c].elem===this&&(b&&a[c](!0),a.splice(c,1))}),b||this.dequeue();return this}}),f.each({slideDown:cq("show",1),slideUp:cq("hide",1),slideToggle:cq("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){f.fn[a]=function(a,c,d){return this.animate(b,a,c,d)}}),f.extend({speed:function(a,b,c){var d=a&&typeof a=="object"?f.extend({},a):{complete:c||!c&&b||f.isFunction(a)&&a,duration:a,easing:c&&b||b&&!f.isFunction(b)&&b};d.duration=f.fx.off?0:typeof d.duration=="number"?d.duration:d.duration in f.fx.speeds?f.fx.speeds[d.duration]:f.fx.speeds._default,d.old=d.complete,d.complete=function(a){f.isFunction(d.old)&&d.old.call(this),d.queue!==!1?f.dequeue(this):a!==!1&&f._unmark(this)};return d},easing:{linear:function(a,b,c,d){return c+d*a},swing:function(a,b,c,d){return(-Math.cos(a*Math.PI)/2+.5)*d+c}},timers:[],fx:function(a,b,c){this.options=b,this.elem=a,this.prop=c,b.orig=b.orig||{}}}),f.fx.prototype={update:function(){this.options.step&&this.options.step.call(this.elem,this.now,this),(f.fx.step[this.prop]||f.fx.step._default)(this)},cur:function(){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null))return this.elem[this.prop];var a,b=f.css(this.elem,this.prop);return isNaN(a=parseFloat(b))?!b||b==="auto"?0:b:a},custom:function(a,b,c){function g(a){return d.step(a)}var d=this,e=f.fx;this.startTime=cn||co(),this.start=a,this.end=b,this.unit=c||this.unit||(f.cssNumber[this.prop]?"":"px"),this.now=this.start,this.pos=this.state=0,g.elem=this.elem,g()&&f.timers.push(g)&&!cl&&(cl=setInterval(e.tick,e.interval))},show:function(){this.options.orig[this.prop]=f.style(this.elem,this.prop),this.options.show=!0,this.custom(this.prop==="width"||this.prop==="height"?1:0,this.cur()),f(this.elem).show()},hide:function(){this.options.orig[this.prop]=f.style(this.elem,this.prop),this.options.hide=!0,this.custom(this.cur(),0)},step:function(a){var b=cn||co(),c=!0,d=this.elem,e=this.options,g,h;if(a||b>=e.duration+this.startTime){this.now=this.end,this.pos=this.state=1,this.update(),e.animatedProperties[this.prop]=!0;for(g in e.animatedProperties)e.animatedProperties[g]!==!0&&(c=!1);if(c){e.overflow!=null&&!f.support.shrinkWrapBlocks&&f.each(["","X","Y"],function(a,b){d.style["overflow"+b]=e.overflow[a]}),e.hide&&f(d).hide();if(e.hide||e.show)for(var i in e.animatedProperties)f.style(d,i,e.orig[i]);e.complete.call(d)}return!1}e.duration==Infinity?this.now=b:(h=b-this.startTime,this.state=h/e.duration,this.pos=f.easing[e.animatedProperties[this.prop]](this.state,h,0,1,e.duration),this.now=this.start+(this.end-this.start)*this.pos),this.update();return!0}},f.extend(f.fx,{tick:function(){for(var a=f.timers,b=0;b<a.length;++b)a[b]()||a.splice(b--,1);a.length||f.fx.stop()},interval:13,stop:function(){clearInterval(cl),cl=null},speeds:{slow:600,fast:200,_default:400},step:{opacity:function(a){f.style(a.elem,"opacity",a.now)},_default:function(a){a.elem.style&&a.elem.style[a.prop]!=null?a.elem.style[a.prop]=(a.prop==="width"||a.prop==="height"?Math.max(0,a.now):a.now)+a.unit:a.elem[a.prop]=a.now}}}),f.expr&&f.expr.filters&&(f.expr.filters.animated=function(a){return f.grep(f.timers,function(b){return a===b.elem}).length});var cs=/^t(?:able|d|h)$/i,ct=/^(?:body|html)$/i;"getBoundingClientRect"in c.documentElement?f.fn.offset=function(a){var b=this[0],c;if(a)return this.each(function(b){f.offset.setOffset(this,a,b)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return f.offset.bodyOffset(b);try{c=b.getBoundingClientRect()}catch(d){}var e=b.ownerDocument,g=e.documentElement;if(!c||!f.contains(g,b))return c?{top:c.top,left:c.left}:{top:0,left:0};var h=e.body,i=cu(e),j=g.clientTop||h.clientTop||0,k=g.clientLeft||h.clientLeft||0,l=i.pageYOffset||f.support.boxModel&&g.scrollTop||h.scrollTop,m=i.pageXOffset||f.support.boxModel&&g.scrollLeft||h.scrollLeft,n=c.top+l-j,o=c.left+m-k;return{top:n,left:o}}:f.fn.offset=function(a){var b=this[0];if(a)return this.each(function(b){f.offset.setOffset(this,a,b)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return f.offset.bodyOffset(b);f.offset.initialize();var c,d=b.offsetParent,e=b,g=b.ownerDocument,h=g.documentElement,i=g.body,j=g.defaultView,k=j?j.getComputedStyle(b,null):b.currentStyle,l=b.offsetTop,m=b.offsetLeft;while((b=b.parentNode)&&b!==i&&b!==h){if(f.offset.supportsFixedPosition&&k.position==="fixed")break;c=j?j.getComputedStyle(b,null):b.currentStyle,l-=b.scrollTop,m-=b.scrollLeft,b===d&&(l+=b.offsetTop,m+=b.offsetLeft,f.offset.doesNotAddBorder&&(!f.offset.doesAddBorderForTableAndCells||!cs.test(b.nodeName))&&(l+=parseFloat(c.borderTopWidth)||0,m+=parseFloat(c.borderLeftWidth)||0),e=d,d=b.offsetParent),f.offset.subtractsBorderForOverflowNotVisible&&c.overflow!=="visible"&&(l+=parseFloat(c.borderTopWidth)||0,m+=parseFloat(c.borderLeftWidth)||0),k=c}if(k.position==="relative"||k.position==="static")l+=i.offsetTop,m+=i.offsetLeft;f.offset.supportsFixedPosition&&k.position==="fixed"&&(l+=Math.max(h.scrollTop,i.scrollTop),m+=Math.max(h.scrollLeft,i.scrollLeft));return{top:l,left:m}},f.offset={initialize:function(){var a=c.body,b=c.createElement("div"),d,e,g,h,i=parseFloat(f.css(a,"marginTop"))||0,j="<div style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;'><div></div></div><table style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;' cellpadding='0' cellspacing='0'><tr><td></td></tr></table>";f.extend(b.style,{position:"absolute",top:0,left:0,margin:0,border:0,width:"1px",height:"1px",visibility:"hidden"}),b.innerHTML=j,a.insertBefore(b,a.firstChild),d=b.firstChild,e=d.firstChild,h=d.nextSibling.firstChild.firstChild,this.doesNotAddBorder=e.offsetTop!==5,this.doesAddBorderForTableAndCells=h.offsetTop===5,e.style.position="fixed",e.style.top="20px",this.supportsFixedPosition=e.offsetTop===20||e.offsetTop===15,e.style.position=e.style.top="",d.style.overflow="hidden",d.style.position="relative",this.subtractsBorderForOverflowNotVisible=e.offsetTop===-5,this.doesNotIncludeMarginInBodyOffset=a.offsetTop!==i,a.removeChild(b),f.offset.initialize=f.noop},bodyOffset:function(a){var b=a.offsetTop,c=a.offsetLeft;f.offset.initialize(),f.offset.doesNotIncludeMarginInBodyOffset&&(b+=parseFloat(f.css(a,"marginTop"))||0,c+=parseFloat(f.css(a,"marginLeft"))||0);return{top:b,left:c}},setOffset:function(a,b,c){var d=f.css(a,"position");d==="static"&&(a.style.position="relative");var e=f(a),g=e.offset(),h=f.css(a,"top"),i=f.css(a,"left"),j=(d==="absolute"||d==="fixed")&&f.inArray("auto",[h,i])>-1,k={},l={},m,n;j?(l=e.position(),m=l.top,n=l.left):(m=parseFloat(h)||0,n=parseFloat(i)||0),f.isFunction(b)&&(b=b.call(a,c,g)),b.top!=null&&(k.top=b.top-g.top+m),b.left!=null&&(k.left=b.left-g.left+n),"using"in b?b.using.call(a,k):e.css(k)}},f.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),c=this.offset(),d=ct.test(b[0].nodeName)?{top:0,left:0}:b.offset();c.top-=parseFloat(f.css(a,"marginTop"))||0,c.left-=parseFloat(f.css(a,"marginLeft"))||0,d.top+=parseFloat(f.css(b[0],"borderTopWidth"))||0,d.left+=parseFloat(f.css(b[0],"borderLeftWidth"))||0;return{top:c.top-d.top,left:c.left-d.left}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||c.body;while(a&&!ct.test(a.nodeName)&&f.css(a,"position")==="static")a=a.offsetParent;return a})}}),f.each(["Left","Top"],function(a,c){var d="scroll"+c;f.fn[d]=function(c){var e,g;if(c===b){e=this[0];if(!e)return null;g=cu(e);return g?"pageXOffset"in g?g[a?"pageYOffset":"pageXOffset"]:f.support.boxModel&&g.document.documentElement[d]||g.document.body[d]:e[d]}return this.each(function(){g=cu(this),g?g.scrollTo(a?f(g).scrollLeft():c,a?c:f(g).scrollTop()):this[d]=c})}}),f.each(["Height","Width"],function(a,c){var d=c.toLowerCase();f.fn["inner"+c]=function(){var a=this[0];return a&&a.style?parseFloat(f.css(a,d,"padding")):null},f.fn["outer"+c]=function(a){var b=this[0];return b&&b.style?parseFloat(f.css(b,d,a?"margin":"border")):null},f.fn[d]=function(a){var e=this[0];if(!e)return a==null?null:this;if(f.isFunction(a))return this.each(function(b){var c=f(this);c[d](a.call(this,b,c[d]()))});if(f.isWindow(e)){var g=e.document.documentElement["client"+c],h=e.document.body;return e.document.compatMode==="CSS1Compat"&&g||h&&h["client"+c]||g}if(e.nodeType===9)return Math.max(e.documentElement["client"+c],e.body["scroll"+c],e.documentElement["scroll"+c],e.body["offset"+c],e.documentElement["offset"+c]);if(a===b){var i=f.css(e,d),j=parseFloat(i);return f.isNaN(j)?i:j}return this.css(d,typeof a=="string"?a:a+"px")}}),a.jQuery=a.$=f})(window); \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/optionsTutorial.txt b/libreplan-webapp/src/main/webapp/jqplot/optionsTutorial.txt new file mode 100644 index 000000000..4ec4fe9b1 --- /dev/null +++ b/libreplan-webapp/src/main/webapp/jqplot/optionsTutorial.txt @@ -0,0 +1,240 @@ +Title: Options Tutorial + +This document will help you understand how jqPlot's options +relate to the API documentation and the jqPlot object +itself. For a listing of options available to jqPlot, +see <jqPlot Options> in the jqPlotOptions.txt file. + +The key to effectively using jqPlot is understanding jqPlot's +options. The online documentation is API documentation. While +it explains what attributes and methods various objects posses, +it doesn't explain how to use or set those attributes through +options. This tutorial will help explain that. + +Lets assume you are creating a plot +like this: + +> chart = $.jqplot('chart', dataSeries, optionsObj); + +First, note that you shouldn't try to directly set attributes on the +"chart" object (like chart.grid.shadow) after your call to $.jqplot(). +At best this won't do anything **(see below). You should pass options in via +the "optionsObj". + +the optionsObj really represents the plot object (jqPlot object, not +to be confused with the $.jqplot function which will create a jqPlot +object). Attributes you specify on that object will be merged with +attributes in the jqPlot object. The axes, legend, series, etc. are +attributes on the jqPlot object. The jqPlot/optionsObj object looks +something like (only some attributes shown): + +> jqPlot-| +> |-seriesColors +> |-textColor +> |-fontFamily +> |-fontSize +> |-stackSeries +> |-series(Array)-| +> | |-Series1-| +> | | |-lineWidth +> | | |-linePattern +> | | |-shadow +> | | |-showLine +> | | |-showMarker +> | | |-color +> | |-Series2... +> | |-... +> | |-SeriesN +> | +> |-grid(Object)-| +> | |-drawGridLines +> | |-background +> | |-borderColor +> | |-borderWidth +> | |-shadow +> | +> |-title(Object)-| +> | |-text +> | |-show +> | |-fontFamily +> | |-fontSize +> | |-textAlign +> | |-textColor +> | +> |-axes(Object)-| +> | |-xais-| +> | | |-min +> | | |-max +> | | |-numberTicks +> | | |-showTicks +> | | |-showTickMarks +> | | |-pad +> | +> | ... and so on + +The optionsObj should follow the same construction as if it were a +jqPlot object (with some exceptions/shortcuts I'll mention in a +moment). So generally, when you see something like +"this.drawGridLines" in the grid properties in the docs, just replace +"this" with "grid" in your options object. So it becomes +optionsObj.grid.drawGridLines. Do likewise with the other objects in +the plot, replacing "this", with the respective attribute on the plot +like "legend" or "title". Series and Axes are handled a little +different, because series is an array and axes has 4 distinct children +"xaxis", "yaxis", "x2axis" and "y2axis". + +So, to remove the shadow from the grid and change the grid border size +you would do: + +> optionObj = {grid:{shadow:false, borderWidth:9.0}}; + +To do the same as above but also make all the text in the plot red you +would do: + +> optionObj = { +> textColor:"#ff0000", +> grid:{shadow:false, borderWidth:9.0} +> } + +Here is a more deeply nested example. Say you want to specify a min +and max on your y axis and use a specific color for your second +series. That would look like: + +> optionsObj = { +> axes:{yaxis:{min:5, max:230}}, +> series:[{},{color:"#33ff66"}] +> } + +Note that series options are an array in order of the series data you +sent in to your plot. To get to the second series, you have to put an +object (even if empty) in place of the first series. + +There is a handy shortcut to assign options to all axes or all series +at one go. Use axesDefaults and seriesDefaults. So, if you wanted +both x and y axes to start at 0 and you wanted all series to not show +markers, you could do: + +> optionsObj = {axesDefaults:{min:0}, seriesDefaults:{showMarker:false}} + +Another shortcut is for the plot title. Normally, you would assign +options to the title as an object. If you specify a title option as a +string, it will assign that to the title.text property automatically. +So these two are equivalent: + +> optionsObj = {title:{text:"My Plot"}} + +and + +> optionsObj = {title:"My Plot"} + +Where things need more explaination is with renderers, plugins and +their options. Briefly, what's renderer, what's a plugin. + +A renderer is an object that is used to draw something and gets +attached to an existing object in the plot in order to draw it. A +plugin does more than just provide drawing functionality to an +object. It will do more like calculate a trend line, change the +cursor, provide event driven functionality, etc. I consider renderers +plugins, but plugins don't have to be renderers. + +So, how do you use renderers, plugins, and specify their options? +Some common renderes are for bar charts and category axes. If you +want to render your series as a bar chart with each set of bars +showing up in a category on the x axis, you do: + +> optionsObj = { +> seriesDefaults:{renderer:$.jqplot.BarRenderer}, +> axes:{xaxis:{renderer:$.jqplot.CategoryAxisRenderer}} +> } + +This replaces the default renderer used for all series in the plot +with a bar renderer and the x axis default renderer (but not any other +axis) with a category renderer. + +Now, how would I assign options to those renderers? The renderer's +attributes may not be present in the pre-existing jqPlot object, they +may be specific to the renderer. This is done through the +"rendererOptions" option on the appropriate object. So, if I wanted my +bars to be 25 pixels wide, I would do: + + +> optionsObj = { +> seriesDefaults:{ +> renderer:$.jqplot.BarRenderer}, +> rendererOptions:{ +> barWidth:25 +> }, +> axes:{xaxis:{renderer:$.jqplot.CategoryAxisRenderer}} +> } + +Again, this is using the "seriesDefaults" option, which will apply +options to all series in the plot. You could do the same on any +particular series in the plot through the "series" options array. + +Plugins are free to add their own options. For example, the +highlighter plugin has it's own set of options that are unique to it. +As a result, it responds to options placed in the "highlighter" +attribute of your options object. So, if I wanted to change the +highlighter tooltip to fade in and out slowly and be positioned +directly above the point I'm highlighting: + +> optionsObj = { +> highlighter:{tooltipFadeSpeed:'slow', tooltipLocation:'n'} +> } + +Other plugins, like dragable and trendlines, add their options in with +the series. This is because both of those plugins can have different +options for different series in the plot. So, if you wanted to specify the +color of the dragable and constrain it to drag only on the x axis as well +as specify the color of the trend line you could do: + +> series:[{ +> dragable: { +> color: '#ff3366', +> constrainTo: 'x' +> }, +> trendline: { +> color: '#cccccc' +> } +> }] + +This would apply those options to the first series only. If you had 2 series +and wanted to turn off dragging and trend lines on the second series, you could do: + +> series:[{ +> dragable: { +> color: '#ff3366', +> constrainTo: 'x' +> }, +> trendline: { +> color: '#cccccc' +> } +> }, { +> isDragable: false, +> trendline:{ +> show: false +> } +> }] + +Note, series dragability is turned off with the "isDragable" option directly on +the series itself, not with a suboption of "dragable". This may be improved +in the future. + +I hope this is helpful. +A few key points to remember: + +- When you see "this" in the api docs, you generally replace it with +the name of the object (in lowercase) you are looking at in your +options object. +- seriesDefaults and axesDefaults are convenient shortcuts. +- to assign options to a renderer, generally use the "rendererOptions" +- plugins may add their own options attribute, like "highlighter" or +"cursor". + +** Note: you can set attributes after the plot is created (like +plot.grid.shadow = false), but you'll have to issue the appropriate +calls to possibly reinitialize and redraw the plot. jqPlot can +definitely handle this to change the plot after creation (this is how +the dragable plugin updates the plot data and the trend line plugin +recomputes itself when data changes). This hasn't been documented +yet, however. \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/plugins/jqplot.BezierCurveRenderer.js b/libreplan-webapp/src/main/webapp/jqplot/plugins/jqplot.BezierCurveRenderer.js new file mode 100644 index 000000000..c05769569 --- /dev/null +++ b/libreplan-webapp/src/main/webapp/jqplot/plugins/jqplot.BezierCurveRenderer.js @@ -0,0 +1,312 @@ +/** + * jqPlot + * Pure JavaScript plotting plugin using jQuery + * + * Version: 1.0.0b2_r1012 + * + * Copyright (c) 2009-2011 Chris Leonello + * jqPlot is currently available for use in all personal or commercial projects + * under both the MIT (http://www.opensource.org/licenses/mit-license.php) and GPL + * version 2.0 (http://www.gnu.org/licenses/gpl-2.0.html) licenses. This means that you can + * choose the license that best suits your project and use it accordingly. + * + * Although not required, the author would appreciate an email letting him + * know of any substantial use of jqPlot. You can reach the author at: + * chris at jqplot dot com or see http://www.jqplot.com/info.php . + * + * If you are feeling kind and generous, consider supporting the project by + * making a donation at: http://www.jqplot.com/donate.php . + * + * sprintf functions contained in jqplot.sprintf.js by Ash Searle: + * + * version 2007.04.27 + * author Ash Searle + * http://hexmen.com/blog/2007/03/printf-sprintf/ + * http://hexmen.com/js/sprintf.js + * The author (Ash Searle) has placed this code in the public domain: + * "This code is unrestricted: you are free to use it however you like." + * + */ +(function($) { + // Class: $.jqplot.BezierCurveRenderer.js + // Renderer which draws lines as stacked bezier curves. + // Data for the line will not be specified as an array of + // [x, y] data point values, but as a an array of [start piont, bezier curve] + // So, the line is specified as: [[xstart, ystart], [cp1x, cp1y, cp2x, cp2y, xend, yend]]. + $.jqplot.BezierCurveRenderer = function(){ + $.jqplot.LineRenderer.call(this); + }; + + $.jqplot.BezierCurveRenderer.prototype = new $.jqplot.LineRenderer(); + $.jqplot.BezierCurveRenderer.prototype.constructor = $.jqplot.BezierCurveRenderer; + + + // Method: setGridData + // converts the user data values to grid coordinates and stores them + // in the gridData array. + // Called with scope of a series. + $.jqplot.BezierCurveRenderer.prototype.setGridData = function(plot) { + // recalculate the grid data + var xp = this._xaxis.series_u2p; + var yp = this._yaxis.series_u2p; + // this._plotData should be same as this.data + var data = this.data; + this.gridData = []; + this._prevGridData = []; + // if seriesIndex = 0, fill to x axis. + // if seriesIndex > 0, fill to previous series data. + var idx = this.index; + if (data.length == 2) { + if (idx == 0) { + this.gridData = [ + [xp.call(this._xaxis, data[0][0]), yp.call(this._yaxis, data[0][1])], + [xp.call(this._xaxis, data[1][0]), yp.call(this._yaxis, data[1][1]), + xp.call(this._xaxis, data[1][2]), yp.call(this._yaxis, data[1][3]), + xp.call(this._xaxis, data[1][4]), yp.call(this._yaxis, data[1][5])], + [xp.call(this._xaxis, data[1][4]), yp.call(this._yaxis, this._yaxis.min)], + [xp.call(this._xaxis, data[0][0]), yp.call(this._yaxis, this._yaxis.min)] + ]; + } + else { + var psd = plot.series[idx-1].data; + this.gridData = [ + [xp.call(this._xaxis, data[0][0]), yp.call(this._yaxis, data[0][1])], + [xp.call(this._xaxis, data[1][0]), yp.call(this._yaxis, data[1][1]), + xp.call(this._xaxis, data[1][2]), yp.call(this._yaxis, data[1][3]), + xp.call(this._xaxis, data[1][4]), yp.call(this._yaxis, data[1][5])], + [xp.call(this._xaxis, psd[1][4]), yp.call(this._yaxis, psd[1][5])], + [xp.call(this._xaxis, psd[1][2]), yp.call(this._yaxis, psd[1][3]), + xp.call(this._xaxis, psd[1][0]), yp.call(this._yaxis, psd[1][1]), + xp.call(this._xaxis, psd[0][0]), yp.call(this._yaxis, psd[0][1])] + ]; + } + } + else { + if (idx == 0) { + this.gridData = [ + [xp.call(this._xaxis, data[0][0]), yp.call(this._yaxis, data[0][1])], + [xp.call(this._xaxis, data[1][0]), yp.call(this._yaxis, data[1][1]), + xp.call(this._xaxis, data[2][0]), yp.call(this._yaxis, data[2][1]), + xp.call(this._xaxis, data[3][0]), yp.call(this._yaxis, data[3][1])], + [xp.call(this._xaxis, data[3][1]), yp.call(this._yaxis, this._yaxis.min)], + [xp.call(this._xaxis, data[0][0]), yp.call(this._yaxis, this._yaxis.min)] + ]; + } + else { + var psd = plot.series[idx-1].data; + this.gridData = [ + [xp.call(this._xaxis, data[0][0]), yp.call(this._yaxis, data[0][1])], + [xp.call(this._xaxis, data[1][0]), yp.call(this._yaxis, data[1][1]), + xp.call(this._xaxis, data[2][0]), yp.call(this._yaxis, data[2][1]), + xp.call(this._xaxis, data[3][0]), yp.call(this._yaxis, data[3][1])], + [xp.call(this._xaxis, psd[3][0]), yp.call(this._yaxis, psd[3][1])], + [xp.call(this._xaxis, psd[2][0]), yp.call(this._yaxis, psd[2][1]), + xp.call(this._xaxis, psd[1][0]), yp.call(this._yaxis, psd[1][1]), + xp.call(this._xaxis, psd[0][0]), yp.call(this._yaxis, psd[0][1])] + ]; + } + } + }; + + // Method: makeGridData + // converts any arbitrary data values to grid coordinates and + // returns them. This method exists so that plugins can use a series' + // linerenderer to generate grid data points without overwriting the + // grid data associated with that series. + // Called with scope of a series. + $.jqplot.BezierCurveRenderer.prototype.makeGridData = function(data, plot) { + // recalculate the grid data + var xp = this._xaxis.series_u2p; + var yp = this._yaxis.series_u2p; + var gd = []; + var pgd = []; + // if seriesIndex = 0, fill to x axis. + // if seriesIndex > 0, fill to previous series data. + var idx = this.index; + if (data.length == 2) { + if (idx == 0) { + gd = [ + [xp.call(this._xaxis, data[0][0]), yp.call(this._yaxis, data[0][1])], + [xp.call(this._xaxis, data[1][0]), yp.call(this._yaxis, data[1][1]), + xp.call(this._xaxis, data[1][2]), yp.call(this._yaxis, data[1][3]), + xp.call(this._xaxis, data[1][4]), yp.call(this._yaxis, data[1][5])], + [xp.call(this._xaxis, data[1][4]), yp.call(this._yaxis, this._yaxis.min)], + [xp.call(this._xaxis, data[0][0]), yp.call(this._yaxis, this._yaxis.min)] + ]; + } + else { + var psd = plot.series[idx-1].data; + gd = [ + [xp.call(this._xaxis, data[0][0]), yp.call(this._yaxis, data[0][1])], + [xp.call(this._xaxis, data[1][0]), yp.call(this._yaxis, data[1][1]), + xp.call(this._xaxis, data[1][2]), yp.call(this._yaxis, data[1][3]), + xp.call(this._xaxis, data[1][4]), yp.call(this._yaxis, data[1][5])], + [xp.call(this._xaxis, psd[1][4]), yp.call(this._yaxis, psd[1][5])], + [xp.call(this._xaxis, psd[1][2]), yp.call(this._yaxis, psd[1][3]), + xp.call(this._xaxis, psd[1][0]), yp.call(this._yaxis, psd[1][1]), + xp.call(this._xaxis, psd[0][0]), yp.call(this._yaxis, psd[0][1])] + ]; + } + } + else { + if (idx == 0) { + gd = [ + [xp.call(this._xaxis, data[0][0]), yp.call(this._yaxis, data[0][1])], + [xp.call(this._xaxis, data[1][0]), yp.call(this._yaxis, data[1][1]), + xp.call(this._xaxis, data[2][0]), yp.call(this._yaxis, data[2][1]), + xp.call(this._xaxis, data[3][0]), yp.call(this._yaxis, data[3][1])], + [xp.call(this._xaxis, data[3][1]), yp.call(this._yaxis, this._yaxis.min)], + [xp.call(this._xaxis, data[0][0]), yp.call(this._yaxis, this._yaxis.min)] + ]; + } + else { + var psd = plot.series[idx-1].data; + gd = [ + [xp.call(this._xaxis, data[0][0]), yp.call(this._yaxis, data[0][1])], + [xp.call(this._xaxis, data[1][0]), yp.call(this._yaxis, data[1][1]), + xp.call(this._xaxis, data[2][0]), yp.call(this._yaxis, data[2][1]), + xp.call(this._xaxis, data[3][0]), yp.call(this._yaxis, data[3][1])], + [xp.call(this._xaxis, psd[3][0]), yp.call(this._yaxis, psd[3][1])], + [xp.call(this._xaxis, psd[2][0]), yp.call(this._yaxis, psd[2][1]), + xp.call(this._xaxis, psd[1][0]), yp.call(this._yaxis, psd[1][1]), + xp.call(this._xaxis, psd[0][0]), yp.call(this._yaxis, psd[0][1])] + ]; + } + } + return gd; + }; + + + // called within scope of series. + $.jqplot.BezierCurveRenderer.prototype.draw = function(ctx, gd, options) { + var i; + ctx.save(); + if (gd.length) { + if (this.showLine) { + ctx.save(); + var opts = (options != null) ? options : {}; + ctx.fillStyle = opts.fillStyle || this.color; + ctx.beginPath(); + ctx.moveTo(gd[0][0], gd[0][1]); + ctx.bezierCurveTo(gd[1][0], gd[1][1], gd[1][2], gd[1][3], gd[1][4], gd[1][5]); + ctx.lineTo(gd[2][0], gd[2][1]); + if (gd[3].length == 2) { + ctx.lineTo(gd[3][0], gd[3][1]); + } + else { + ctx.bezierCurveTo(gd[3][0], gd[3][1], gd[3][2], gd[3][3], gd[3][4], gd[3][5]); + } + ctx.closePath(); + ctx.fill(); + ctx.restore(); + } + } + + ctx.restore(); + }; + + $.jqplot.BezierCurveRenderer.prototype.drawShadow = function(ctx, gd, options) { + // This is a no-op, shadows drawn with lines. + }; + + $.jqplot.BezierAxisRenderer = function() { + $.jqplot.LinearAxisRenderer.call(this); + }; + + $.jqplot.BezierAxisRenderer.prototype = new $.jqplot.LinearAxisRenderer(); + $.jqplot.BezierAxisRenderer.prototype.constructor = $.jqplot.BezierAxisRenderer; + + + // Axes on a plot with Bezier Curves + $.jqplot.BezierAxisRenderer.prototype.init = function(options){ + $.extend(true, this, options); + var db = this._dataBounds; + // Go through all the series attached to this axis and find + // the min/max bounds for this axis. + for (var i=0; i<this._series.length; i++) { + var s = this._series[i]; + var d = s.data; + if (d.length == 4) { + for (var j=0; j<d.length; j++) { + if (this.name == 'xaxis' || this.name == 'x2axis') { + if (d[j][0] < db.min || db.min == null) { + db.min = d[j][0]; + } + if (d[j][0] > db.max || db.max == null) { + db.max = d[j][0]; + } + } + else { + if (d[j][1] < db.min || db.min == null) { + db.min = d[j][1]; + } + if (d[j][1] > db.max || db.max == null) { + db.max = d[j][1]; + } + } + } + } + else { + if (this.name == 'xaxis' || this.name == 'x2axis') { + if (d[0][0] < db.min || db.min == null) { + db.min = d[0][0]; + } + if (d[0][0] > db.max || db.max == null) { + db.max = d[0][0]; + } + for (var j=0; j<5; j+=2) { + if (d[1][j] < db.min || db.min == null) { + db.min = d[1][j]; + } + if (d[1][j] > db.max || db.max == null) { + db.max = d[1][j]; + } + } + } + else { + if (d[0][1] < db.min || db.min == null) { + db.min = d[0][1]; + } + if (d[0][1] > db.max || db.max == null) { + db.max = d[0][1]; + } + for (var j=1; j<6; j+=2) { + if (d[1][j] < db.min || db.min == null) { + db.min = d[1][j]; + } + if (d[1][j] > db.max || db.max == null) { + db.max = d[1][j]; + } + } + } + } + } + }; + + // setup default renderers for axes and legend so user doesn't have to + // called with scope of plot + function preInit(target, data, options) { + options = options || {}; + options.axesDefaults = $.extend(true, {pad:0}, options.axesDefaults); + options.legend = $.extend(true, {placement:'outside'}, options.legend); + // only set these if there is a pie series + var setopts = false; + if (options.seriesDefaults.renderer == $.jqplot.BezierCurveRenderer) { + setopts = true; + } + else if (options.series) { + for (var i=0; i < options.series.length; i++) { + if (options.series[i].renderer == $.jqplot.BezierCurveRenderer) { + setopts = true; + } + } + } + + if (setopts) { + options.axesDefaults.renderer = $.jqplot.BezierAxisRenderer; + } + } + + $.jqplot.preInitHooks.push(preInit); + +})(jQuery); \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/plugins/jqplot.BezierCurveRenderer.min.js b/libreplan-webapp/src/main/webapp/jqplot/plugins/jqplot.BezierCurveRenderer.min.js new file mode 100644 index 000000000..35bb2eeff --- /dev/null +++ b/libreplan-webapp/src/main/webapp/jqplot/plugins/jqplot.BezierCurveRenderer.min.js @@ -0,0 +1,57 @@ +/** + * jqPlot + * Pure JavaScript plotting plugin using jQuery + * + * Version: 1.0.0b2_r1012 + * + * Copyright (c) 2009-2011 Chris Leonello + * jqPlot is currently available for use in all personal or commercial projects + * under both the MIT (http://www.opensource.org/licenses/mit-license.php) and GPL + * version 2.0 (http://www.gnu.org/licenses/gpl-2.0.html) licenses. This means that you can + * choose the license that best suits your project and use it accordingly. + * + * Although not required, the author would appreciate an email letting him + * know of any substantial use of jqPlot. You can reach the author at: + * chris at jqplot dot com or see http://www.jqplot.com/info.php . + * + * If you are feeling kind and generous, consider supporting the project by + * making a donation at: http://www.jqplot.com/donate.php . + * + * sprintf functions contained in jqplot.sprintf.js by Ash Searle: + * + * version 2007.04.27 + * author Ash Searle + * http://hexmen.com/blog/2007/03/printf-sprintf/ + * http://hexmen.com/js/sprintf.js + * The author (Ash Searle) has placed this code in the public domain: + * "This code is unrestricted: you are free to use it however you like." + * + * included jsDate library by Chris Leonello: + * + * Copyright (c) 2010-2011 Chris Leonello + * + * jsDate is currently available for use in all personal or commercial projects + * under both the MIT and GPL version 2.0 licenses. This means that you can + * choose the license that best suits your project and use it accordingly. + * + * jsDate borrows many concepts and ideas from the Date Instance + * Methods by Ken Snyder along with some parts of Ken's actual code. + * + * Ken's origianl Date Instance Methods and copyright notice: + * + * Ken Snyder (ken d snyder at gmail dot com) + * 2008-09-10 + * version 2.0.2 (http://kendsnyder.com/sandbox/date/) + * Creative Commons Attribution License 3.0 (http://creativecommons.org/licenses/by/3.0/) + * + * jqplotToImage function based on Larry Siden's export-jqplot-to-png.js. + * Larry has generously given permission to adapt his code for inclusion + * into jqPlot. + * + * Larry's original code can be found here: + * + * https://github.com/lsiden/export-jqplot-to-png + * + * + */ +(function(b){b.jqplot.BezierCurveRenderer=function(){b.jqplot.LineRenderer.call(this)};b.jqplot.BezierCurveRenderer.prototype=new b.jqplot.LineRenderer();b.jqplot.BezierCurveRenderer.prototype.constructor=b.jqplot.BezierCurveRenderer;b.jqplot.BezierCurveRenderer.prototype.setGridData=function(h){var e=this._xaxis.series_u2p;var g=this._yaxis.series_u2p;var f=this.data;this.gridData=[];this._prevGridData=[];var d=this.index;if(f.length==2){if(d==0){this.gridData=[[e.call(this._xaxis,f[0][0]),g.call(this._yaxis,f[0][1])],[e.call(this._xaxis,f[1][0]),g.call(this._yaxis,f[1][1]),e.call(this._xaxis,f[1][2]),g.call(this._yaxis,f[1][3]),e.call(this._xaxis,f[1][4]),g.call(this._yaxis,f[1][5])],[e.call(this._xaxis,f[1][4]),g.call(this._yaxis,this._yaxis.min)],[e.call(this._xaxis,f[0][0]),g.call(this._yaxis,this._yaxis.min)]]}else{var c=h.series[d-1].data;this.gridData=[[e.call(this._xaxis,f[0][0]),g.call(this._yaxis,f[0][1])],[e.call(this._xaxis,f[1][0]),g.call(this._yaxis,f[1][1]),e.call(this._xaxis,f[1][2]),g.call(this._yaxis,f[1][3]),e.call(this._xaxis,f[1][4]),g.call(this._yaxis,f[1][5])],[e.call(this._xaxis,c[1][4]),g.call(this._yaxis,c[1][5])],[e.call(this._xaxis,c[1][2]),g.call(this._yaxis,c[1][3]),e.call(this._xaxis,c[1][0]),g.call(this._yaxis,c[1][1]),e.call(this._xaxis,c[0][0]),g.call(this._yaxis,c[0][1])]]}}else{if(d==0){this.gridData=[[e.call(this._xaxis,f[0][0]),g.call(this._yaxis,f[0][1])],[e.call(this._xaxis,f[1][0]),g.call(this._yaxis,f[1][1]),e.call(this._xaxis,f[2][0]),g.call(this._yaxis,f[2][1]),e.call(this._xaxis,f[3][0]),g.call(this._yaxis,f[3][1])],[e.call(this._xaxis,f[3][1]),g.call(this._yaxis,this._yaxis.min)],[e.call(this._xaxis,f[0][0]),g.call(this._yaxis,this._yaxis.min)]]}else{var c=h.series[d-1].data;this.gridData=[[e.call(this._xaxis,f[0][0]),g.call(this._yaxis,f[0][1])],[e.call(this._xaxis,f[1][0]),g.call(this._yaxis,f[1][1]),e.call(this._xaxis,f[2][0]),g.call(this._yaxis,f[2][1]),e.call(this._xaxis,f[3][0]),g.call(this._yaxis,f[3][1])],[e.call(this._xaxis,c[3][0]),g.call(this._yaxis,c[3][1])],[e.call(this._xaxis,c[2][0]),g.call(this._yaxis,c[2][1]),e.call(this._xaxis,c[1][0]),g.call(this._yaxis,c[1][1]),e.call(this._xaxis,c[0][0]),g.call(this._yaxis,c[0][1])]]}}};b.jqplot.BezierCurveRenderer.prototype.makeGridData=function(g,i){var f=this._xaxis.series_u2p;var h=this._yaxis.series_u2p;var e=[];var j=[];var d=this.index;if(g.length==2){if(d==0){e=[[f.call(this._xaxis,g[0][0]),h.call(this._yaxis,g[0][1])],[f.call(this._xaxis,g[1][0]),h.call(this._yaxis,g[1][1]),f.call(this._xaxis,g[1][2]),h.call(this._yaxis,g[1][3]),f.call(this._xaxis,g[1][4]),h.call(this._yaxis,g[1][5])],[f.call(this._xaxis,g[1][4]),h.call(this._yaxis,this._yaxis.min)],[f.call(this._xaxis,g[0][0]),h.call(this._yaxis,this._yaxis.min)]]}else{var c=i.series[d-1].data;e=[[f.call(this._xaxis,g[0][0]),h.call(this._yaxis,g[0][1])],[f.call(this._xaxis,g[1][0]),h.call(this._yaxis,g[1][1]),f.call(this._xaxis,g[1][2]),h.call(this._yaxis,g[1][3]),f.call(this._xaxis,g[1][4]),h.call(this._yaxis,g[1][5])],[f.call(this._xaxis,c[1][4]),h.call(this._yaxis,c[1][5])],[f.call(this._xaxis,c[1][2]),h.call(this._yaxis,c[1][3]),f.call(this._xaxis,c[1][0]),h.call(this._yaxis,c[1][1]),f.call(this._xaxis,c[0][0]),h.call(this._yaxis,c[0][1])]]}}else{if(d==0){e=[[f.call(this._xaxis,g[0][0]),h.call(this._yaxis,g[0][1])],[f.call(this._xaxis,g[1][0]),h.call(this._yaxis,g[1][1]),f.call(this._xaxis,g[2][0]),h.call(this._yaxis,g[2][1]),f.call(this._xaxis,g[3][0]),h.call(this._yaxis,g[3][1])],[f.call(this._xaxis,g[3][1]),h.call(this._yaxis,this._yaxis.min)],[f.call(this._xaxis,g[0][0]),h.call(this._yaxis,this._yaxis.min)]]}else{var c=i.series[d-1].data;e=[[f.call(this._xaxis,g[0][0]),h.call(this._yaxis,g[0][1])],[f.call(this._xaxis,g[1][0]),h.call(this._yaxis,g[1][1]),f.call(this._xaxis,g[2][0]),h.call(this._yaxis,g[2][1]),f.call(this._xaxis,g[3][0]),h.call(this._yaxis,g[3][1])],[f.call(this._xaxis,c[3][0]),h.call(this._yaxis,c[3][1])],[f.call(this._xaxis,c[2][0]),h.call(this._yaxis,c[2][1]),f.call(this._xaxis,c[1][0]),h.call(this._yaxis,c[1][1]),f.call(this._xaxis,c[0][0]),h.call(this._yaxis,c[0][1])]]}}return e};b.jqplot.BezierCurveRenderer.prototype.draw=function(c,g,d){var e;c.save();if(g.length){if(this.showLine){c.save();var f=(d!=null)?d:{};c.fillStyle=f.fillStyle||this.color;c.beginPath();c.moveTo(g[0][0],g[0][1]);c.bezierCurveTo(g[1][0],g[1][1],g[1][2],g[1][3],g[1][4],g[1][5]);c.lineTo(g[2][0],g[2][1]);if(g[3].length==2){c.lineTo(g[3][0],g[3][1])}else{c.bezierCurveTo(g[3][0],g[3][1],g[3][2],g[3][3],g[3][4],g[3][5])}c.closePath();c.fill();c.restore()}}c.restore()};b.jqplot.BezierCurveRenderer.prototype.drawShadow=function(c,e,d){};b.jqplot.BezierAxisRenderer=function(){b.jqplot.LinearAxisRenderer.call(this)};b.jqplot.BezierAxisRenderer.prototype=new b.jqplot.LinearAxisRenderer();b.jqplot.BezierAxisRenderer.prototype.constructor=b.jqplot.BezierAxisRenderer;b.jqplot.BezierAxisRenderer.prototype.init=function(f){b.extend(true,this,f);var c=this._dataBounds;for(var g=0;g<this._series.length;g++){var h=this._series[g];var k=h.data;if(k.length==4){for(var e=0;e<k.length;e++){if(this.name=="xaxis"||this.name=="x2axis"){if(k[e][0]<c.min||c.min==null){c.min=k[e][0]}if(k[e][0]>c.max||c.max==null){c.max=k[e][0]}}else{if(k[e][1]<c.min||c.min==null){c.min=k[e][1]}if(k[e][1]>c.max||c.max==null){c.max=k[e][1]}}}}else{if(this.name=="xaxis"||this.name=="x2axis"){if(k[0][0]<c.min||c.min==null){c.min=k[0][0]}if(k[0][0]>c.max||c.max==null){c.max=k[0][0]}for(var e=0;e<5;e+=2){if(k[1][e]<c.min||c.min==null){c.min=k[1][e]}if(k[1][e]>c.max||c.max==null){c.max=k[1][e]}}}else{if(k[0][1]<c.min||c.min==null){c.min=k[0][1]}if(k[0][1]>c.max||c.max==null){c.max=k[0][1]}for(var e=1;e<6;e+=2){if(k[1][e]<c.min||c.min==null){c.min=k[1][e]}if(k[1][e]>c.max||c.max==null){c.max=k[1][e]}}}}}};function a(g,f,d){d=d||{};d.axesDefaults=b.extend(true,{pad:0},d.axesDefaults);d.legend=b.extend(true,{placement:"outside"},d.legend);var c=false;if(d.seriesDefaults.renderer==b.jqplot.BezierCurveRenderer){c=true}else{if(d.series){for(var e=0;e<d.series.length;e++){if(d.series[e].renderer==b.jqplot.BezierCurveRenderer){c=true}}}}if(c){d.axesDefaults.renderer=b.jqplot.BezierAxisRenderer}}b.jqplot.preInitHooks.push(a)})(jQuery); \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/plugins/jqplot.barRenderer.js b/libreplan-webapp/src/main/webapp/jqplot/plugins/jqplot.barRenderer.js new file mode 100644 index 000000000..53f2ccc9d --- /dev/null +++ b/libreplan-webapp/src/main/webapp/jqplot/plugins/jqplot.barRenderer.js @@ -0,0 +1,747 @@ +/** + * jqPlot + * Pure JavaScript plotting plugin using jQuery + * + * Version: 1.0.0b2_r1012 + * + * Copyright (c) 2009-2011 Chris Leonello + * jqPlot is currently available for use in all personal or commercial projects + * under both the MIT (http://www.opensource.org/licenses/mit-license.php) and GPL + * version 2.0 (http://www.gnu.org/licenses/gpl-2.0.html) licenses. This means that you can + * choose the license that best suits your project and use it accordingly. + * + * Although not required, the author would appreciate an email letting him + * know of any substantial use of jqPlot. You can reach the author at: + * chris at jqplot dot com or see http://www.jqplot.com/info.php . + * + * If you are feeling kind and generous, consider supporting the project by + * making a donation at: http://www.jqplot.com/donate.php . + * + * sprintf functions contained in jqplot.sprintf.js by Ash Searle: + * + * version 2007.04.27 + * author Ash Searle + * http://hexmen.com/blog/2007/03/printf-sprintf/ + * http://hexmen.com/js/sprintf.js + * The author (Ash Searle) has placed this code in the public domain: + * "This code is unrestricted: you are free to use it however you like." + * + */ +(function($) { + + // Class: $.jqplot.BarRenderer + // A plugin renderer for jqPlot to draw a bar plot. + // Draws series as a line. + + $.jqplot.BarRenderer = function(){ + $.jqplot.LineRenderer.call(this); + }; + + $.jqplot.BarRenderer.prototype = new $.jqplot.LineRenderer(); + $.jqplot.BarRenderer.prototype.constructor = $.jqplot.BarRenderer; + + // called with scope of series. + $.jqplot.BarRenderer.prototype.init = function(options, plot) { + // Group: Properties + // + // prop: barPadding + // Number of pixels between adjacent bars at the same axis value. + this.barPadding = 8; + // prop: barMargin + // Number of pixels between groups of bars at adjacent axis values. + this.barMargin = 10; + // prop: barDirection + // 'vertical' = up and down bars, 'horizontal' = side to side bars + this.barDirection = 'vertical'; + // prop: barWidth + // Width of the bar in pixels (auto by devaul). null = calculated automatically. + this.barWidth = null; + // prop: shadowOffset + // offset of the shadow from the slice and offset of + // each succesive stroke of the shadow from the last. + this.shadowOffset = 2; + // prop: shadowDepth + // number of strokes to apply to the shadow, + // each stroke offset shadowOffset from the last. + this.shadowDepth = 5; + // prop: shadowAlpha + // transparency of the shadow (0 = transparent, 1 = opaque) + this.shadowAlpha = 0.08; + // prop: waterfall + // true to enable waterfall plot. + this.waterfall = false; + // prop: groups + // group bars into this many groups + this.groups = 1; + // prop: varyBarColor + // true to color each bar of a series separately rather than + // have every bar of a given series the same color. + // If used for non-stacked multiple series bar plots, user should + // specify a separate 'seriesColors' array for each series. + // Otherwise, each series will set their bars to the same color array. + // This option has no Effect for stacked bar charts and is disabled. + this.varyBarColor = false; + // prop: highlightMouseOver + // True to highlight slice when moused over. + // This must be false to enable highlightMouseDown to highlight when clicking on a slice. + this.highlightMouseOver = true; + // prop: highlightMouseDown + // True to highlight when a mouse button is pressed over a slice. + // This will be disabled if highlightMouseOver is true. + this.highlightMouseDown = false; + // prop: highlightColors + // an array of colors to use when highlighting a bar. + this.highlightColors = []; + // prop: transposedData + // NOT IMPLEMENTED YET. True if this is a horizontal bar plot and + // x and y values are "transposed". Tranposed, or "swapped", data is + // required prior to rev. 894 builds of jqPlot with horizontal bars. + // Allows backward compatability of bar renderer horizontal bars with + // old style data sets. + this.transposedData = true; + this.renderer.animation = { + show: false, + direction: 'down', + speed: 3000, + _supported: true + }; + this._type = 'bar'; + + // if user has passed in highlightMouseDown option and not set highlightMouseOver, disable highlightMouseOver + if (options.highlightMouseDown && options.highlightMouseOver == null) { + options.highlightMouseOver = false; + } + + ////// + // This is probably wrong here. + // After going back and forth on wether renderer should be the thing + // or extend the thing, it seems that it it best if it is a property + // on the thing. This should be something that is commonized + // among series renderers in the future. + ////// + $.extend(true, this, options); + + // really should probably do this + $.extend(true, this.renderer, options); + // fill is still needed to properly draw the legend. + // bars have to be filled. + this.fill = true; + + // if horizontal bar and animating, reset the default direction + if (this.barDirection === 'horizontal' && this.rendererOptions.animation && this.rendererOptions.animation.direction == null) { + this.renderer.animation.direction = 'left'; + } + + if (this.waterfall) { + this.fillToZero = false; + this.disableStack = true; + } + + if (this.barDirection == 'vertical' ) { + this._primaryAxis = '_xaxis'; + this._stackAxis = 'y'; + this.fillAxis = 'y'; + } + else { + this._primaryAxis = '_yaxis'; + this._stackAxis = 'x'; + this.fillAxis = 'x'; + } + // index of the currenty highlighted point, if any + this._highlightedPoint = null; + // total number of values for all bar series, total number of bar series, and position of this series + this._plotSeriesInfo = null; + // Array of actual data colors used for each data point. + this._dataColors = []; + this._barPoints = []; + + // set the shape renderer options + var opts = {lineJoin:'miter', lineCap:'round', fill:true, isarc:false, strokeStyle:this.color, fillStyle:this.color, closePath:this.fill}; + this.renderer.shapeRenderer.init(opts); + // set the shadow renderer options + var sopts = {lineJoin:'miter', lineCap:'round', fill:true, isarc:false, angle:this.shadowAngle, offset:this.shadowOffset, alpha:this.shadowAlpha, depth:this.shadowDepth, closePath:this.fill}; + this.renderer.shadowRenderer.init(sopts); + + plot.postInitHooks.addOnce(postInit); + plot.postDrawHooks.addOnce(postPlotDraw); + plot.eventListenerHooks.addOnce('jqplotMouseMove', handleMove); + plot.eventListenerHooks.addOnce('jqplotMouseDown', handleMouseDown); + plot.eventListenerHooks.addOnce('jqplotMouseUp', handleMouseUp); + plot.eventListenerHooks.addOnce('jqplotClick', handleClick); + plot.eventListenerHooks.addOnce('jqplotRightClick', handleRightClick); + }; + + // called with scope of series + function barPreInit(target, data, seriesDefaults, options) { + if (this.rendererOptions.barDirection == 'horizontal') { + this._stackAxis = 'x'; + this._primaryAxis = '_yaxis'; + } + if (this.rendererOptions.waterfall == true) { + this._data = $.extend(true, [], this.data); + var sum = 0; + var pos = (!this.rendererOptions.barDirection || this.rendererOptions.barDirection === 'vertical' || this.transposedData === false) ? 1 : 0; + for(var i=0; i<this.data.length; i++) { + sum += this.data[i][pos]; + if (i>0) { + this.data[i][pos] += this.data[i-1][pos]; + } + } + this.data[this.data.length] = (pos == 1) ? [this.data.length+1, sum] : [sum, this.data.length+1]; + this._data[this._data.length] = (pos == 1) ? [this._data.length+1, sum] : [sum, this._data.length+1]; + } + if (this.rendererOptions.groups > 1) { + this.breakOnNull = true; + var l = this.data.length; + var skip = parseInt(l/this.rendererOptions.groups, 10); + var count = 0; + for (var i=skip; i<l; i+=skip) { + this.data.splice(i+count, 0, [null, null]); + count++; + } + for (i=0; i<this.data.length; i++) { + if (this._primaryAxis == '_xaxis') { + this.data[i][0] = i+1; + } + else { + this.data[i][1] = i+1; + } + } + } + } + + $.jqplot.preSeriesInitHooks.push(barPreInit); + + // needs to be called with scope of series, not renderer. + $.jqplot.BarRenderer.prototype.calcSeriesNumbers = function() { + var nvals = 0; + var nseries = 0; + var paxis = this[this._primaryAxis]; + var s, series, pos; + // loop through all series on this axis + for (var i=0; i < paxis._series.length; i++) { + series = paxis._series[i]; + if (series === this) { + pos = i; + } + // is the series rendered as a bar? + if (series.renderer.constructor == $.jqplot.BarRenderer) { + // gridData may not be computed yet, use data length insted + nvals += series.data.length; + nseries += 1; + } + } + // return total number of values for all bar series, total number of bar series, and position of this series + return [nvals, nseries, pos]; + }; + + $.jqplot.BarRenderer.prototype.setBarWidth = function() { + // need to know how many data values we have on the approprate axis and figure it out. + var i; + var nvals = 0; + var nseries = 0; + var paxis = this[this._primaryAxis]; + var s, series, pos; + var temp = this._plotSeriesInfo = this.renderer.calcSeriesNumbers.call(this); + nvals = temp[0]; + nseries = temp[1]; + var nticks = paxis.numberTicks; + var nbins = (nticks-1)/2; + // so, now we have total number of axis values. + if (paxis.name == 'xaxis' || paxis.name == 'x2axis') { + if (this._stack) { + this.barWidth = (paxis._offsets.max - paxis._offsets.min) / nvals * nseries - this.barMargin; + } + else { + this.barWidth = ((paxis._offsets.max - paxis._offsets.min)/nbins - this.barPadding * (nseries-1) - this.barMargin*2)/nseries; + // this.barWidth = (paxis._offsets.max - paxis._offsets.min) / nvals - this.barPadding - this.barMargin/nseries; + } + } + else { + if (this._stack) { + this.barWidth = (paxis._offsets.min - paxis._offsets.max) / nvals * nseries - this.barMargin; + } + else { + this.barWidth = ((paxis._offsets.min - paxis._offsets.max)/nbins - this.barPadding * (nseries-1) - this.barMargin*2)/nseries; + // this.barWidth = (paxis._offsets.min - paxis._offsets.max) / nvals - this.barPadding - this.barMargin/nseries; + } + } + return [nvals, nseries]; + }; + + function computeHighlightColors (colors) { + var ret = []; + for (var i=0; i<colors.length; i++){ + var rgba = $.jqplot.getColorComponents(colors[i]); + var newrgb = [rgba[0], rgba[1], rgba[2]]; + var sum = newrgb[0] + newrgb[1] + newrgb[2]; + for (var j=0; j<3; j++) { + // when darkening, lowest color component can be is 60. + newrgb[j] = (sum > 570) ? newrgb[j] * 0.8 : newrgb[j] + 0.3 * (255 - newrgb[j]); + newrgb[j] = parseInt(newrgb[j], 10); + } + ret.push('rgb('+newrgb[0]+','+newrgb[1]+','+newrgb[2]+')'); + } + return ret; + } + + $.jqplot.BarRenderer.prototype.draw = function(ctx, gridData, options) { + var i; + // Ughhh, have to make a copy of options b/c it may be modified later. + var opts = $.extend({}, options); + var shadow = (opts.shadow != undefined) ? opts.shadow : this.shadow; + var showLine = (opts.showLine != undefined) ? opts.showLine : this.showLine; + var fill = (opts.fill != undefined) ? opts.fill : this.fill; + var xaxis = this.xaxis; + var yaxis = this.yaxis; + var xp = this._xaxis.series_u2p; + var yp = this._yaxis.series_u2p; + var pointx, pointy; + // clear out data colors. + this._dataColors = []; + this._barPoints = []; + + if (this.barWidth == null) { + this.renderer.setBarWidth.call(this); + } + + var temp = this._plotSeriesInfo = this.renderer.calcSeriesNumbers.call(this); + var nvals = temp[0]; + var nseries = temp[1]; + var pos = temp[2]; + var points = []; + + if (this._stack) { + this._barNudge = 0; + } + else { + this._barNudge = (-Math.abs(nseries/2 - 0.5) + pos) * (this.barWidth + this.barPadding); + } + if (showLine) { + var negativeColors = new $.jqplot.ColorGenerator(this.negativeSeriesColors); + var positiveColors = new $.jqplot.ColorGenerator(this.seriesColors); + var negativeColor = negativeColors.get(this.index); + if (! this.useNegativeColors) { + negativeColor = opts.fillStyle; + } + var positiveColor = opts.fillStyle; + var base; + var xstart; + var ystart; + + if (this.barDirection == 'vertical') { + for (var i=0; i<gridData.length; i++) { + if (this.data[i][1] == null) { + continue; + } + points = []; + base = gridData[i][0] + this._barNudge; + ystart; + + // stacked + if (this._stack && this._prevGridData.length) { + ystart = this._prevGridData[i][1]; + } + // not stacked and first series in stack + else { + if (this.fillToZero) { + ystart = this._yaxis.series_u2p(0); + } + else if (this.waterfall && i > 0 && i < this.gridData.length-1) { + ystart = this.gridData[i-1][1]; + } + else if (this.waterfall && i == 0 && i < this.gridData.length-1) { + if (this._yaxis.min <= 0 && this._yaxis.max >= 0) { + ystart = this._yaxis.series_u2p(0); + } + else if (this._yaxis.min > 0) { + ystart = ctx.canvas.height; + } + else { + ystart = 0; + } + } + else if (this.waterfall && i == this.gridData.length - 1) { + if (this._yaxis.min <= 0 && this._yaxis.max >= 0) { + ystart = this._yaxis.series_u2p(0); + } + else if (this._yaxis.min > 0) { + ystart = ctx.canvas.height; + } + else { + ystart = 0; + } + } + else { + ystart = ctx.canvas.height; + } + } + if ((this.fillToZero && this._plotData[i][1] < 0) || (this.waterfall && this._data[i][1] < 0)) { + if (this.varyBarColor && !this._stack) { + if (this.useNegativeColors) { + opts.fillStyle = negativeColors.next(); + } + else { + opts.fillStyle = positiveColors.next(); + } + } + else { + opts.fillStyle = negativeColor; + } + } + else { + if (this.varyBarColor && !this._stack) { + opts.fillStyle = positiveColors.next(); + } + else { + opts.fillStyle = positiveColor; + } + } + + if (!this.fillToZero || this._plotData[i][1] >= 0) { + points.push([base-this.barWidth/2, ystart]); + points.push([base-this.barWidth/2, gridData[i][1]]); + points.push([base+this.barWidth/2, gridData[i][1]]); + points.push([base+this.barWidth/2, ystart]); + } + // for negative bars make sure points are always ordered clockwise + else { + points.push([base-this.barWidth/2, gridData[i][1]]); + points.push([base-this.barWidth/2, ystart]); + points.push([base+this.barWidth/2, ystart]); + points.push([base+this.barWidth/2, gridData[i][1]]); + } + this._barPoints.push(points); + // now draw the shadows if not stacked. + // for stacked plots, they are predrawn by drawShadow + if (shadow && !this._stack) { + var sopts = $.extend(true, {}, opts); + // need to get rid of fillStyle on shadow. + delete sopts.fillStyle; + this.renderer.shadowRenderer.draw(ctx, points, sopts); + } + var clr = opts.fillStyle || this.color; + this._dataColors.push(clr); + this.renderer.shapeRenderer.draw(ctx, points, opts); + } + } + + else if (this.barDirection == 'horizontal'){ + for (var i=0; i<gridData.length; i++) { + if (this.data[i][0] == null) { + continue; + } + points = []; + base = gridData[i][1] - this._barNudge; + xstart; + + if (this._stack && this._prevGridData.length) { + xstart = this._prevGridData[i][0]; + } + // not stacked and first series in stack + else { + if (this.fillToZero) { + xstart = this._xaxis.series_u2p(0); + } + else if (this.waterfall && i > 0 && i < this.gridData.length-1) { + xstart = this.gridData[i-1][1]; + } + else if (this.waterfall && i == 0 && i < this.gridData.length-1) { + if (this._xaxis.min <= 0 && this._xaxis.max >= 0) { + xstart = this._xaxis.series_u2p(0); + } + else if (this._xaxis.min > 0) { + xstart = 0; + } + else { + xstart = ctx.canvas.width; + } + } + else if (this.waterfall && i == this.gridData.length - 1) { + if (this._xaxis.min <= 0 && this._xaxis.max >= 0) { + xstart = this._xaxis.series_u2p(0); + } + else if (this._xaxis.min > 0) { + xstart = 0; + } + else { + xstart = ctx.canvas.width; + } + } + else { + xstart = 0; + } + } + if ((this.fillToZero && this._plotData[i][1] < 0) || (this.waterfall && this._data[i][1] < 0)) { + if (this.varyBarColor && !this._stack) { + if (this.useNegativeColors) { + opts.fillStyle = negativeColors.next(); + } + else { + opts.fillStyle = positiveColors.next(); + } + } + } + else { + if (this.varyBarColor && !this._stack) { + opts.fillStyle = positiveColors.next(); + } + else { + opts.fillStyle = positiveColor; + } + } + + + if (!this.fillToZero || this._plotData[i][0] >= 0) { + points.push([xstart, base + this.barWidth / 2]); + points.push([xstart, base - this.barWidth / 2]); + points.push([gridData[i][0], base - this.barWidth / 2]); + points.push([gridData[i][0], base + this.barWidth / 2]); + } + else { + points.push([gridData[i][0], base + this.barWidth / 2]); + points.push([gridData[i][0], base - this.barWidth / 2]); + points.push([xstart, base - this.barWidth / 2]); + points.push([xstart, base + this.barWidth / 2]); + } + + this._barPoints.push(points); + // now draw the shadows if not stacked. + // for stacked plots, they are predrawn by drawShadow + if (shadow && !this._stack) { + var sopts = $.extend(true, {}, opts); + delete sopts.fillStyle; + this.renderer.shadowRenderer.draw(ctx, points, sopts); + } + var clr = opts.fillStyle || this.color; + this._dataColors.push(clr); + this.renderer.shapeRenderer.draw(ctx, points, opts); + } + } + } + + if (this.highlightColors.length == 0) { + this.highlightColors = $.jqplot.computeHighlightColors(this._dataColors); + } + + else if (typeof(this.highlightColors) == 'string') { + var temp = this.highlightColors; + this.highlightColors = []; + for (var i=0; i<this._dataColors.length; i++) { + this.highlightColors.push(temp); + } + } + + }; + + + // for stacked plots, shadows will be pre drawn by drawShadow. + $.jqplot.BarRenderer.prototype.drawShadow = function(ctx, gridData, options) { + var i; + var opts = (options != undefined) ? options : {}; + var shadow = (opts.shadow != undefined) ? opts.shadow : this.shadow; + var showLine = (opts.showLine != undefined) ? opts.showLine : this.showLine; + var fill = (opts.fill != undefined) ? opts.fill : this.fill; + var xaxis = this.xaxis; + var yaxis = this.yaxis; + var xp = this._xaxis.series_u2p; + var yp = this._yaxis.series_u2p; + var pointx, points, pointy, nvals, nseries, pos; + + if (this._stack && this.shadow) { + if (this.barWidth == null) { + this.renderer.setBarWidth.call(this); + } + + var temp = this._plotSeriesInfo = this.renderer.calcSeriesNumbers.call(this); + nvals = temp[0]; + nseries = temp[1]; + pos = temp[2]; + + if (this._stack) { + this._barNudge = 0; + } + else { + this._barNudge = (-Math.abs(nseries/2 - 0.5) + pos) * (this.barWidth + this.barPadding); + } + if (showLine) { + + if (this.barDirection == 'vertical') { + for (var i=0; i<gridData.length; i++) { + if (this.data[i][1] == null) { + continue; + } + points = []; + var base = gridData[i][0] + this._barNudge; + var ystart; + + if (this._stack && this._prevGridData.length) { + ystart = this._prevGridData[i][1]; + } + else { + if (this.fillToZero) { + ystart = this._yaxis.series_u2p(0); + } + else { + ystart = ctx.canvas.height; + } + } + + points.push([base-this.barWidth/2, ystart]); + points.push([base-this.barWidth/2, gridData[i][1]]); + points.push([base+this.barWidth/2, gridData[i][1]]); + points.push([base+this.barWidth/2, ystart]); + this.renderer.shadowRenderer.draw(ctx, points, opts); + } + } + + else if (this.barDirection == 'horizontal'){ + for (var i=0; i<gridData.length; i++) { + if (this.data[i][0] == null) { + continue; + } + points = []; + var base = gridData[i][1] - this._barNudge; + var xstart; + + if (this._stack && this._prevGridData.length) { + xstart = this._prevGridData[i][0]; + } + else { + xstart = 0; + } + + points.push([xstart, base+this.barWidth/2]); + points.push([gridData[i][0], base+this.barWidth/2]); + points.push([gridData[i][0], base-this.barWidth/2]); + points.push([xstart, base-this.barWidth/2]); + this.renderer.shadowRenderer.draw(ctx, points, opts); + } + } + } + + } + }; + + function postInit(target, data, options) { + for (var i=0; i<this.series.length; i++) { + if (this.series[i].renderer.constructor == $.jqplot.BarRenderer) { + // don't allow mouseover and mousedown at same time. + if (this.series[i].highlightMouseOver) { + this.series[i].highlightMouseDown = false; + } + } + } + } + + // called within context of plot + // create a canvas which we can draw on. + // insert it before the eventCanvas, so eventCanvas will still capture events. + function postPlotDraw() { + // Memory Leaks patch + if (this.plugins.barRenderer && this.plugins.barRenderer.highlightCanvas) { + + this.plugins.barRenderer.highlightCanvas.resetCanvas(); + this.plugins.barRenderer.highlightCanvas = null; + } + + this.plugins.barRenderer = {highlightedSeriesIndex:null}; + this.plugins.barRenderer.highlightCanvas = new $.jqplot.GenericCanvas(); + + this.eventCanvas._elem.before(this.plugins.barRenderer.highlightCanvas.createElement(this._gridPadding, 'jqplot-barRenderer-highlight-canvas', this._plotDimensions, this)); + this.plugins.barRenderer.highlightCanvas.setContext(); + this.eventCanvas._elem.bind('mouseleave', {plot:this}, function (ev) { unhighlight(ev.data.plot); }); + } + + function highlight (plot, sidx, pidx, points) { + var s = plot.series[sidx]; + var canvas = plot.plugins.barRenderer.highlightCanvas; + canvas._ctx.clearRect(0,0,canvas._ctx.canvas.width, canvas._ctx.canvas.height); + s._highlightedPoint = pidx; + plot.plugins.barRenderer.highlightedSeriesIndex = sidx; + var opts = {fillStyle: s.highlightColors[pidx]}; + s.renderer.shapeRenderer.draw(canvas._ctx, points, opts); + canvas = null; + } + + function unhighlight (plot) { + var canvas = plot.plugins.barRenderer.highlightCanvas; + canvas._ctx.clearRect(0,0, canvas._ctx.canvas.width, canvas._ctx.canvas.height); + for (var i=0; i<plot.series.length; i++) { + plot.series[i]._highlightedPoint = null; + } + plot.plugins.barRenderer.highlightedSeriesIndex = null; + plot.target.trigger('jqplotDataUnhighlight'); + canvas = null; + } + + + function handleMove(ev, gridpos, datapos, neighbor, plot) { + if (neighbor) { + var ins = [neighbor.seriesIndex, neighbor.pointIndex, neighbor.data]; + var evt1 = jQuery.Event('jqplotDataMouseOver'); + evt1.pageX = ev.pageX; + evt1.pageY = ev.pageY; + plot.target.trigger(evt1, ins); + if (plot.series[ins[0]].highlightMouseOver && !(ins[0] == plot.plugins.barRenderer.highlightedSeriesIndex && ins[1] == plot.series[ins[0]]._highlightedPoint)) { + var evt = jQuery.Event('jqplotDataHighlight'); + evt.pageX = ev.pageX; + evt.pageY = ev.pageY; + plot.target.trigger(evt, ins); + highlight (plot, neighbor.seriesIndex, neighbor.pointIndex, neighbor.points); + } + } + else if (neighbor == null) { + unhighlight (plot); + } + } + + function handleMouseDown(ev, gridpos, datapos, neighbor, plot) { + if (neighbor) { + var ins = [neighbor.seriesIndex, neighbor.pointIndex, neighbor.data]; + if (plot.series[ins[0]].highlightMouseDown && !(ins[0] == plot.plugins.barRenderer.highlightedSeriesIndex && ins[1] == plot.series[ins[0]]._highlightedPoint)) { + var evt = jQuery.Event('jqplotDataHighlight'); + evt.pageX = ev.pageX; + evt.pageY = ev.pageY; + plot.target.trigger(evt, ins); + highlight (plot, neighbor.seriesIndex, neighbor.pointIndex, neighbor.points); + } + } + else if (neighbor == null) { + unhighlight (plot); + } + } + + function handleMouseUp(ev, gridpos, datapos, neighbor, plot) { + var idx = plot.plugins.barRenderer.highlightedSeriesIndex; + if (idx != null && plot.series[idx].highlightMouseDown) { + unhighlight(plot); + } + } + + function handleClick(ev, gridpos, datapos, neighbor, plot) { + if (neighbor) { + var ins = [neighbor.seriesIndex, neighbor.pointIndex, neighbor.data]; + var evt = jQuery.Event('jqplotDataClick'); + evt.pageX = ev.pageX; + evt.pageY = ev.pageY; + plot.target.trigger(evt, ins); + } + } + + function handleRightClick(ev, gridpos, datapos, neighbor, plot) { + if (neighbor) { + var ins = [neighbor.seriesIndex, neighbor.pointIndex, neighbor.data]; + var idx = plot.plugins.barRenderer.highlightedSeriesIndex; + if (idx != null && plot.series[idx].highlightMouseDown) { + unhighlight(plot); + } + var evt = jQuery.Event('jqplotDataRightClick'); + evt.pageX = ev.pageX; + evt.pageY = ev.pageY; + plot.target.trigger(evt, ins); + } + } + + +})(jQuery); \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/plugins/jqplot.barRenderer.min.js b/libreplan-webapp/src/main/webapp/jqplot/plugins/jqplot.barRenderer.min.js new file mode 100644 index 000000000..c406b64f8 --- /dev/null +++ b/libreplan-webapp/src/main/webapp/jqplot/plugins/jqplot.barRenderer.min.js @@ -0,0 +1,57 @@ +/** + * jqPlot + * Pure JavaScript plotting plugin using jQuery + * + * Version: 1.0.0b2_r1012 + * + * Copyright (c) 2009-2011 Chris Leonello + * jqPlot is currently available for use in all personal or commercial projects + * under both the MIT (http://www.opensource.org/licenses/mit-license.php) and GPL + * version 2.0 (http://www.gnu.org/licenses/gpl-2.0.html) licenses. This means that you can + * choose the license that best suits your project and use it accordingly. + * + * Although not required, the author would appreciate an email letting him + * know of any substantial use of jqPlot. You can reach the author at: + * chris at jqplot dot com or see http://www.jqplot.com/info.php . + * + * If you are feeling kind and generous, consider supporting the project by + * making a donation at: http://www.jqplot.com/donate.php . + * + * sprintf functions contained in jqplot.sprintf.js by Ash Searle: + * + * version 2007.04.27 + * author Ash Searle + * http://hexmen.com/blog/2007/03/printf-sprintf/ + * http://hexmen.com/js/sprintf.js + * The author (Ash Searle) has placed this code in the public domain: + * "This code is unrestricted: you are free to use it however you like." + * + * included jsDate library by Chris Leonello: + * + * Copyright (c) 2010-2011 Chris Leonello + * + * jsDate is currently available for use in all personal or commercial projects + * under both the MIT and GPL version 2.0 licenses. This means that you can + * choose the license that best suits your project and use it accordingly. + * + * jsDate borrows many concepts and ideas from the Date Instance + * Methods by Ken Snyder along with some parts of Ken's actual code. + * + * Ken's origianl Date Instance Methods and copyright notice: + * + * Ken Snyder (ken d snyder at gmail dot com) + * 2008-09-10 + * version 2.0.2 (http://kendsnyder.com/sandbox/date/) + * Creative Commons Attribution License 3.0 (http://creativecommons.org/licenses/by/3.0/) + * + * jqplotToImage function based on Larry Siden's export-jqplot-to-png.js. + * Larry has generously given permission to adapt his code for inclusion + * into jqPlot. + * + * Larry's original code can be found here: + * + * https://github.com/lsiden/export-jqplot-to-png + * + * + */ +(function(d){d.jqplot.BarRenderer=function(){d.jqplot.LineRenderer.call(this)};d.jqplot.BarRenderer.prototype=new d.jqplot.LineRenderer();d.jqplot.BarRenderer.prototype.constructor=d.jqplot.BarRenderer;d.jqplot.BarRenderer.prototype.init=function(n,p){this.barPadding=8;this.barMargin=10;this.barDirection="vertical";this.barWidth=null;this.shadowOffset=2;this.shadowDepth=5;this.shadowAlpha=0.08;this.waterfall=false;this.groups=1;this.varyBarColor=false;this.highlightMouseOver=true;this.highlightMouseDown=false;this.highlightColors=[];this.transposedData=true;this.renderer.animation={show:false,direction:"down",speed:3000,_supported:true};this._type="bar";if(n.highlightMouseDown&&n.highlightMouseOver==null){n.highlightMouseOver=false}d.extend(true,this,n);d.extend(true,this.renderer,n);this.fill=true;if(this.barDirection==="horizontal"&&this.rendererOptions.animation&&this.rendererOptions.animation.direction==null){this.renderer.animation.direction="left"}if(this.waterfall){this.fillToZero=false;this.disableStack=true}if(this.barDirection=="vertical"){this._primaryAxis="_xaxis";this._stackAxis="y";this.fillAxis="y"}else{this._primaryAxis="_yaxis";this._stackAxis="x";this.fillAxis="x"}this._highlightedPoint=null;this._plotSeriesInfo=null;this._dataColors=[];this._barPoints=[];var o={lineJoin:"miter",lineCap:"round",fill:true,isarc:false,strokeStyle:this.color,fillStyle:this.color,closePath:this.fill};this.renderer.shapeRenderer.init(o);var m={lineJoin:"miter",lineCap:"round",fill:true,isarc:false,angle:this.shadowAngle,offset:this.shadowOffset,alpha:this.shadowAlpha,depth:this.shadowDepth,closePath:this.fill};this.renderer.shadowRenderer.init(m);p.postInitHooks.addOnce(h);p.postDrawHooks.addOnce(i);p.eventListenerHooks.addOnce("jqplotMouseMove",b);p.eventListenerHooks.addOnce("jqplotMouseDown",a);p.eventListenerHooks.addOnce("jqplotMouseUp",k);p.eventListenerHooks.addOnce("jqplotClick",e);p.eventListenerHooks.addOnce("jqplotRightClick",l)};function g(s,o,n,v){if(this.rendererOptions.barDirection=="horizontal"){this._stackAxis="x";this._primaryAxis="_yaxis"}if(this.rendererOptions.waterfall==true){this._data=d.extend(true,[],this.data);var r=0;var t=(!this.rendererOptions.barDirection||this.rendererOptions.barDirection==="vertical"||this.transposedData===false)?1:0;for(var p=0;p<this.data.length;p++){r+=this.data[p][t];if(p>0){this.data[p][t]+=this.data[p-1][t]}}this.data[this.data.length]=(t==1)?[this.data.length+1,r]:[r,this.data.length+1];this._data[this._data.length]=(t==1)?[this._data.length+1,r]:[r,this._data.length+1]}if(this.rendererOptions.groups>1){this.breakOnNull=true;var m=this.data.length;var u=parseInt(m/this.rendererOptions.groups,10);var q=0;for(var p=u;p<m;p+=u){this.data.splice(p+q,0,[null,null]);q++}for(p=0;p<this.data.length;p++){if(this._primaryAxis=="_xaxis"){this.data[p][0]=p+1}else{this.data[p][1]=p+1}}}}d.jqplot.preSeriesInitHooks.push(g);d.jqplot.BarRenderer.prototype.calcSeriesNumbers=function(){var q=0;var r=0;var p=this[this._primaryAxis];var o,n,t;for(var m=0;m<p._series.length;m++){n=p._series[m];if(n===this){t=m}if(n.renderer.constructor==d.jqplot.BarRenderer){q+=n.data.length;r+=1}}return[q,r,t]};d.jqplot.BarRenderer.prototype.setBarWidth=function(){var p;var m=0;var n=0;var r=this[this._primaryAxis];var w,q,u;var v=this._plotSeriesInfo=this.renderer.calcSeriesNumbers.call(this);m=v[0];n=v[1];var t=r.numberTicks;var o=(t-1)/2;if(r.name=="xaxis"||r.name=="x2axis"){if(this._stack){this.barWidth=(r._offsets.max-r._offsets.min)/m*n-this.barMargin}else{this.barWidth=((r._offsets.max-r._offsets.min)/o-this.barPadding*(n-1)-this.barMargin*2)/n}}else{if(this._stack){this.barWidth=(r._offsets.min-r._offsets.max)/m*n-this.barMargin}else{this.barWidth=((r._offsets.min-r._offsets.max)/o-this.barPadding*(n-1)-this.barMargin*2)/n}}return[m,n]};function f(n){var p=[];for(var r=0;r<n.length;r++){var q=d.jqplot.getColorComponents(n[r]);var m=[q[0],q[1],q[2]];var s=m[0]+m[1]+m[2];for(var o=0;o<3;o++){m[o]=(s>570)?m[o]*0.8:m[o]+0.3*(255-m[o]);m[o]=parseInt(m[o],10)}p.push("rgb("+m[0]+","+m[1]+","+m[2]+")")}return p}d.jqplot.BarRenderer.prototype.draw=function(D,J,p){var G;var z=d.extend({},p);var u=(z.shadow!=undefined)?z.shadow:this.shadow;var M=(z.showLine!=undefined)?z.showLine:this.showLine;var E=(z.fill!=undefined)?z.fill:this.fill;var o=this.xaxis;var H=this.yaxis;var x=this._xaxis.series_u2p;var I=this._yaxis.series_u2p;var C,B;this._dataColors=[];this._barPoints=[];if(this.barWidth==null){this.renderer.setBarWidth.call(this)}var L=this._plotSeriesInfo=this.renderer.calcSeriesNumbers.call(this);var w=L[0];var v=L[1];var r=L[2];var F=[];if(this._stack){this._barNudge=0}else{this._barNudge=(-Math.abs(v/2-0.5)+r)*(this.barWidth+this.barPadding)}if(M){var t=new d.jqplot.ColorGenerator(this.negativeSeriesColors);var A=new d.jqplot.ColorGenerator(this.seriesColors);var K=t.get(this.index);if(!this.useNegativeColors){K=z.fillStyle}var s=z.fillStyle;var q;var N;var n;if(this.barDirection=="vertical"){for(var G=0;G<J.length;G++){if(this.data[G][1]==null){continue}F=[];q=J[G][0]+this._barNudge;n;if(this._stack&&this._prevGridData.length){n=this._prevGridData[G][1]}else{if(this.fillToZero){n=this._yaxis.series_u2p(0)}else{if(this.waterfall&&G>0&&G<this.gridData.length-1){n=this.gridData[G-1][1]}else{if(this.waterfall&&G==0&&G<this.gridData.length-1){if(this._yaxis.min<=0&&this._yaxis.max>=0){n=this._yaxis.series_u2p(0)}else{if(this._yaxis.min>0){n=D.canvas.height}else{n=0}}}else{if(this.waterfall&&G==this.gridData.length-1){if(this._yaxis.min<=0&&this._yaxis.max>=0){n=this._yaxis.series_u2p(0)}else{if(this._yaxis.min>0){n=D.canvas.height}else{n=0}}}else{n=D.canvas.height}}}}}if((this.fillToZero&&this._plotData[G][1]<0)||(this.waterfall&&this._data[G][1]<0)){if(this.varyBarColor&&!this._stack){if(this.useNegativeColors){z.fillStyle=t.next()}else{z.fillStyle=A.next()}}else{z.fillStyle=K}}else{if(this.varyBarColor&&!this._stack){z.fillStyle=A.next()}else{z.fillStyle=s}}if(!this.fillToZero||this._plotData[G][1]>=0){F.push([q-this.barWidth/2,n]);F.push([q-this.barWidth/2,J[G][1]]);F.push([q+this.barWidth/2,J[G][1]]);F.push([q+this.barWidth/2,n])}else{F.push([q-this.barWidth/2,J[G][1]]);F.push([q-this.barWidth/2,n]);F.push([q+this.barWidth/2,n]);F.push([q+this.barWidth/2,J[G][1]])}this._barPoints.push(F);if(u&&!this._stack){var y=d.extend(true,{},z);delete y.fillStyle;this.renderer.shadowRenderer.draw(D,F,y)}var m=z.fillStyle||this.color;this._dataColors.push(m);this.renderer.shapeRenderer.draw(D,F,z)}}else{if(this.barDirection=="horizontal"){for(var G=0;G<J.length;G++){if(this.data[G][0]==null){continue}F=[];q=J[G][1]-this._barNudge;N;if(this._stack&&this._prevGridData.length){N=this._prevGridData[G][0]}else{if(this.fillToZero){N=this._xaxis.series_u2p(0)}else{if(this.waterfall&&G>0&&G<this.gridData.length-1){N=this.gridData[G-1][1]}else{if(this.waterfall&&G==0&&G<this.gridData.length-1){if(this._xaxis.min<=0&&this._xaxis.max>=0){N=this._xaxis.series_u2p(0)}else{if(this._xaxis.min>0){N=0}else{N=D.canvas.width}}}else{if(this.waterfall&&G==this.gridData.length-1){if(this._xaxis.min<=0&&this._xaxis.max>=0){N=this._xaxis.series_u2p(0)}else{if(this._xaxis.min>0){N=0}else{N=D.canvas.width}}}else{N=0}}}}}if((this.fillToZero&&this._plotData[G][1]<0)||(this.waterfall&&this._data[G][1]<0)){if(this.varyBarColor&&!this._stack){if(this.useNegativeColors){z.fillStyle=t.next()}else{z.fillStyle=A.next()}}}else{if(this.varyBarColor&&!this._stack){z.fillStyle=A.next()}else{z.fillStyle=s}}if(!this.fillToZero||this._plotData[G][0]>=0){F.push([N,q+this.barWidth/2]);F.push([N,q-this.barWidth/2]);F.push([J[G][0],q-this.barWidth/2]);F.push([J[G][0],q+this.barWidth/2])}else{F.push([J[G][0],q+this.barWidth/2]);F.push([J[G][0],q-this.barWidth/2]);F.push([N,q-this.barWidth/2]);F.push([N,q+this.barWidth/2])}this._barPoints.push(F);if(u&&!this._stack){var y=d.extend(true,{},z);delete y.fillStyle;this.renderer.shadowRenderer.draw(D,F,y)}var m=z.fillStyle||this.color;this._dataColors.push(m);this.renderer.shapeRenderer.draw(D,F,z)}}}}if(this.highlightColors.length==0){this.highlightColors=d.jqplot.computeHighlightColors(this._dataColors)}else{if(typeof(this.highlightColors)=="string"){var L=this.highlightColors;this.highlightColors=[];for(var G=0;G<this._dataColors.length;G++){this.highlightColors.push(L)}}}};d.jqplot.BarRenderer.prototype.drawShadow=function(y,E,o){var B;var v=(o!=undefined)?o:{};var r=(v.shadow!=undefined)?v.shadow:this.shadow;var G=(v.showLine!=undefined)?v.showLine:this.showLine;var z=(v.fill!=undefined)?v.fill:this.fill;var n=this.xaxis;var C=this.yaxis;var u=this._xaxis.series_u2p;var D=this._yaxis.series_u2p;var x,A,w,t,s,q;if(this._stack&&this.shadow){if(this.barWidth==null){this.renderer.setBarWidth.call(this)}var F=this._plotSeriesInfo=this.renderer.calcSeriesNumbers.call(this);t=F[0];s=F[1];q=F[2];if(this._stack){this._barNudge=0}else{this._barNudge=(-Math.abs(s/2-0.5)+q)*(this.barWidth+this.barPadding)}if(G){if(this.barDirection=="vertical"){for(var B=0;B<E.length;B++){if(this.data[B][1]==null){continue}A=[];var p=E[B][0]+this._barNudge;var m;if(this._stack&&this._prevGridData.length){m=this._prevGridData[B][1]}else{if(this.fillToZero){m=this._yaxis.series_u2p(0)}else{m=y.canvas.height}}A.push([p-this.barWidth/2,m]);A.push([p-this.barWidth/2,E[B][1]]);A.push([p+this.barWidth/2,E[B][1]]);A.push([p+this.barWidth/2,m]);this.renderer.shadowRenderer.draw(y,A,v)}}else{if(this.barDirection=="horizontal"){for(var B=0;B<E.length;B++){if(this.data[B][0]==null){continue}A=[];var p=E[B][1]-this._barNudge;var H;if(this._stack&&this._prevGridData.length){H=this._prevGridData[B][0]}else{H=0}A.push([H,p+this.barWidth/2]);A.push([E[B][0],p+this.barWidth/2]);A.push([E[B][0],p-this.barWidth/2]);A.push([H,p-this.barWidth/2]);this.renderer.shadowRenderer.draw(y,A,v)}}}}}};function h(p,o,m){for(var n=0;n<this.series.length;n++){if(this.series[n].renderer.constructor==d.jqplot.BarRenderer){if(this.series[n].highlightMouseOver){this.series[n].highlightMouseDown=false}}}}function i(){if(this.plugins.barRenderer&&this.plugins.barRenderer.highlightCanvas){this.plugins.barRenderer.highlightCanvas.resetCanvas();this.plugins.barRenderer.highlightCanvas=null}this.plugins.barRenderer={highlightedSeriesIndex:null};this.plugins.barRenderer.highlightCanvas=new d.jqplot.GenericCanvas();this.eventCanvas._elem.before(this.plugins.barRenderer.highlightCanvas.createElement(this._gridPadding,"jqplot-barRenderer-highlight-canvas",this._plotDimensions,this));this.plugins.barRenderer.highlightCanvas.setContext();this.eventCanvas._elem.bind("mouseleave",{plot:this},function(m){j(m.data.plot)})}function c(t,r,p,o){var n=t.series[r];var m=t.plugins.barRenderer.highlightCanvas;m._ctx.clearRect(0,0,m._ctx.canvas.width,m._ctx.canvas.height);n._highlightedPoint=p;t.plugins.barRenderer.highlightedSeriesIndex=r;var q={fillStyle:n.highlightColors[p]};n.renderer.shapeRenderer.draw(m._ctx,o,q);m=null}function j(o){var m=o.plugins.barRenderer.highlightCanvas;m._ctx.clearRect(0,0,m._ctx.canvas.width,m._ctx.canvas.height);for(var n=0;n<o.series.length;n++){o.series[n]._highlightedPoint=null}o.plugins.barRenderer.highlightedSeriesIndex=null;o.target.trigger("jqplotDataUnhighlight");m=null}function b(q,p,t,s,r){if(s){var o=[s.seriesIndex,s.pointIndex,s.data];var n=jQuery.Event("jqplotDataMouseOver");n.pageX=q.pageX;n.pageY=q.pageY;r.target.trigger(n,o);if(r.series[o[0]].highlightMouseOver&&!(o[0]==r.plugins.barRenderer.highlightedSeriesIndex&&o[1]==r.series[o[0]]._highlightedPoint)){var m=jQuery.Event("jqplotDataHighlight");m.pageX=q.pageX;m.pageY=q.pageY;r.target.trigger(m,o);c(r,s.seriesIndex,s.pointIndex,s.points)}}else{if(s==null){j(r)}}}function a(p,o,s,r,q){if(r){var n=[r.seriesIndex,r.pointIndex,r.data];if(q.series[n[0]].highlightMouseDown&&!(n[0]==q.plugins.barRenderer.highlightedSeriesIndex&&n[1]==q.series[n[0]]._highlightedPoint)){var m=jQuery.Event("jqplotDataHighlight");m.pageX=p.pageX;m.pageY=p.pageY;q.target.trigger(m,n);c(q,r.seriesIndex,r.pointIndex,r.points)}}else{if(r==null){j(q)}}}function k(o,n,r,q,p){var m=p.plugins.barRenderer.highlightedSeriesIndex;if(m!=null&&p.series[m].highlightMouseDown){j(p)}}function e(p,o,s,r,q){if(r){var n=[r.seriesIndex,r.pointIndex,r.data];var m=jQuery.Event("jqplotDataClick");m.pageX=p.pageX;m.pageY=p.pageY;q.target.trigger(m,n)}}function l(q,p,t,s,r){if(s){var o=[s.seriesIndex,s.pointIndex,s.data];var m=r.plugins.barRenderer.highlightedSeriesIndex;if(m!=null&&r.series[m].highlightMouseDown){j(r)}var n=jQuery.Event("jqplotDataRightClick");n.pageX=q.pageX;n.pageY=q.pageY;r.target.trigger(n,o)}}})(jQuery); \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/plugins/jqplot.blockRenderer.js b/libreplan-webapp/src/main/webapp/jqplot/plugins/jqplot.blockRenderer.js new file mode 100644 index 000000000..7035e0ebc --- /dev/null +++ b/libreplan-webapp/src/main/webapp/jqplot/plugins/jqplot.blockRenderer.js @@ -0,0 +1,234 @@ +/** + * jqPlot + * Pure JavaScript plotting plugin using jQuery + * + * Version: 1.0.0b2_r1012 + * + * Copyright (c) 2009-2011 Chris Leonello + * jqPlot is currently available for use in all personal or commercial projects + * under both the MIT (http://www.opensource.org/licenses/mit-license.php) and GPL + * version 2.0 (http://www.gnu.org/licenses/gpl-2.0.html) licenses. This means that you can + * choose the license that best suits your project and use it accordingly. + * + * Although not required, the author would appreciate an email letting him + * know of any substantial use of jqPlot. You can reach the author at: + * chris at jqplot dot com or see http://www.jqplot.com/info.php . + * + * If you are feeling kind and generous, consider supporting the project by + * making a donation at: http://www.jqplot.com/donate.php . + * + * sprintf functions contained in jqplot.sprintf.js by Ash Searle: + * + * version 2007.04.27 + * author Ash Searle + * http://hexmen.com/blog/2007/03/printf-sprintf/ + * http://hexmen.com/js/sprintf.js + * The author (Ash Searle) has placed this code in the public domain: + * "This code is unrestricted: you are free to use it however you like." + * + */ +(function($) { + /** + * Class: $.jqplot.BlockRenderer + * Plugin renderer to draw a x-y block chart. A Block chart has data points displayed as + * colored squares with a text label inside. Data must be supplied in the form: + * + * > [[x1, y1, "label 1", {css}], [x2, y2, "label 2", {css}], ...] + * + * The label and css object are optional. If the label is ommitted, the + * box will collapse unless a css height and/or width is specified. + * + * The css object is an object specifying css properties + * such as: + * + * > {background:'#4f98a5', border:'3px solid gray', padding:'1px'} + * + * Note that css properties specified with the data point override defaults + * specified with the series. + * + */ + $.jqplot.BlockRenderer = function(){ + $.jqplot.LineRenderer.call(this); + }; + + $.jqplot.BlockRenderer.prototype = new $.jqplot.LineRenderer(); + $.jqplot.BlockRenderer.prototype.constructor = $.jqplot.BlockRenderer; + + // called with scope of a series + $.jqplot.BlockRenderer.prototype.init = function(options) { + // Group: Properties + // + // prop: css + // default css styles that will be applied to all data blocks. + // these values will be overridden by css styles supplied with the + // individulal data points. + this.css = {padding:'2px', border:'1px solid #999', textAlign:'center'}; + // prop: escapeHtml + // true to escape html in the box label. + this.escapeHtml = false; + // prop: insertBreaks + // true to turn spaces in data block label into html breaks <br />. + this.insertBreaks = true; + // prop: varyBlockColors + // true to vary the color of each block in this series according to + // the seriesColors array. False to set each block to the color + // specified on this series. This has no effect if a css background color + // option is specified in the renderer css options. + this.varyBlockColors = false; + $.extend(true, this, options); + if (this.css.backgroundColor) { + this.color = this.css.backgroundColor; + } + else if (this.css.background) { + this.color = this.css.background; + } + else if (!this.varyBlockColors) { + this.css.background = this.color; + } + this.canvas = new $.jqplot.BlockCanvas(); + this.shadowCanvas = new $.jqplot.BlockCanvas(); + this.canvas._plotDimensions = this._plotDimensions; + this.shadowCanvas._plotDimensions = this._plotDimensions; + this._type = 'block'; + + // group: Methods + // + // Method: moveBlock + // Moves an individual block. More efficient than redrawing + // the whole series by calling plot.drawSeries(). + // Properties: + // idx - the 0 based index of the block or point in this series. + // x - the x coordinate in data units (value on x axis) to move the block to. + // y - the y coordinate in data units (value on the y axis) to move the block to. + // duration - optional parameter to create an animated movement. Can be a + // number (higher is slower animation) or 'fast', 'normal' or 'slow'. If not + // provided, the element is moved without any animation. + this.moveBlock = function (idx, x, y, duration) { + // update plotData, stackData, data and gridData + // x and y are in data coordinates. + var el = this.canvas._elem.children(':eq('+idx+')'); + this.data[idx][0] = x; + this.data[idx][1] = y; + this._plotData[idx][0] = x; + this._plotData[idx][1] = y; + this._stackData[idx][0] = x; + this._stackData[idx][1] = y; + this.gridData[idx][0] = this._xaxis.series_u2p(x); + this.gridData[idx][1] = this._yaxis.series_u2p(y); + var w = el.outerWidth(); + var h = el.outerHeight(); + var left = this.gridData[idx][0] - w/2 + 'px'; + var top = this.gridData[idx][1] - h/2 + 'px'; + if (duration) { + if (parseInt(duration, 10)) { + duration = parseInt(duration, 10); + } + el.animate({left:left, top:top}, duration); + } + else { + el.css({left:left, top:top}); + } + el = null; + }; + }; + + // called with scope of series + $.jqplot.BlockRenderer.prototype.draw = function (ctx, gd, options) { + if (this.plugins.pointLabels) { + this.plugins.pointLabels.show = false; + } + var i, el, d, gd, t, css, w, h, left, top; + var opts = (options != undefined) ? options : {}; + var colorGenerator = new $.jqplot.ColorGenerator(this.seriesColors); + this.canvas._elem.empty(); + for (i=0; i<this.gridData.length; i++) { + d = this.data[i]; + gd = this.gridData[i]; + t = ''; + css = {}; + if (typeof d[2] == 'string') { + t = d[2]; + } + else if (typeof d[2] == 'object') { + css = d[2]; + } + if (typeof d[3] == 'object') { + css = d[3]; + } + if (this.insertBreaks){ + t = t.replace(/ /g, '<br />'); + } + css = $.extend(true, {}, this.css, css); + // create a div + el = $('<div style="position:absolute;margin-left:auto;margin-right:auto;"></div>'); + this.canvas._elem.append(el); + // set text + this.escapeHtml ? el.text(t) : el.html(t); + // style it + // remove styles we don't want overridden. + delete css.position; + delete css.marginRight; + delete css.marginLeft; + if (!css.background && !css.backgroundColor && !css.backgroundImage){ + css.background = colorGenerator.next(); + } + el.css(css); + w = el.outerWidth(); + h = el.outerHeight(); + left = gd[0] - w/2 + 'px'; + top = gd[1] - h/2 + 'px'; + el.css({left:left, top:top}); + el = null; + } + }; + + $.jqplot.BlockCanvas = function() { + $.jqplot.ElemContainer.call(this); + this._ctx; + }; + + $.jqplot.BlockCanvas.prototype = new $.jqplot.ElemContainer(); + $.jqplot.BlockCanvas.prototype.constructor = $.jqplot.BlockCanvas; + + $.jqplot.BlockCanvas.prototype.createElement = function(offsets, clss, plotDimensions) { + this._offsets = offsets; + var klass = 'jqplot-blockCanvas'; + if (clss != undefined) { + klass = clss; + } + var elem; + // if this canvas already has a dom element, don't make a new one. + if (this._elem) { + elem = this._elem.get(0); + } + else { + elem = document.createElement('div'); + } + // if new plotDimensions supplied, use them. + if (plotDimensions != undefined) { + this._plotDimensions = plotDimensions; + } + + var w = this._plotDimensions.width - this._offsets.left - this._offsets.right + 'px'; + var h = this._plotDimensions.height - this._offsets.top - this._offsets.bottom + 'px'; + this._elem = $(elem); + this._elem.css({ position: 'absolute', width:w, height:h, left: this._offsets.left, top: this._offsets.top }); + + this._elem.addClass(klass); + return this._elem; + }; + + $.jqplot.BlockCanvas.prototype.setContext = function() { + this._ctx = { + canvas:{ + width:0, + height:0 + }, + clearRect:function(){return null;} + }; + return this._ctx; + }; + +})(jQuery); + + \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/plugins/jqplot.blockRenderer.min.js b/libreplan-webapp/src/main/webapp/jqplot/plugins/jqplot.blockRenderer.min.js new file mode 100644 index 000000000..2872da819 --- /dev/null +++ b/libreplan-webapp/src/main/webapp/jqplot/plugins/jqplot.blockRenderer.min.js @@ -0,0 +1,57 @@ +/** + * jqPlot + * Pure JavaScript plotting plugin using jQuery + * + * Version: 1.0.0b2_r1012 + * + * Copyright (c) 2009-2011 Chris Leonello + * jqPlot is currently available for use in all personal or commercial projects + * under both the MIT (http://www.opensource.org/licenses/mit-license.php) and GPL + * version 2.0 (http://www.gnu.org/licenses/gpl-2.0.html) licenses. This means that you can + * choose the license that best suits your project and use it accordingly. + * + * Although not required, the author would appreciate an email letting him + * know of any substantial use of jqPlot. You can reach the author at: + * chris at jqplot dot com or see http://www.jqplot.com/info.php . + * + * If you are feeling kind and generous, consider supporting the project by + * making a donation at: http://www.jqplot.com/donate.php . + * + * sprintf functions contained in jqplot.sprintf.js by Ash Searle: + * + * version 2007.04.27 + * author Ash Searle + * http://hexmen.com/blog/2007/03/printf-sprintf/ + * http://hexmen.com/js/sprintf.js + * The author (Ash Searle) has placed this code in the public domain: + * "This code is unrestricted: you are free to use it however you like." + * + * included jsDate library by Chris Leonello: + * + * Copyright (c) 2010-2011 Chris Leonello + * + * jsDate is currently available for use in all personal or commercial projects + * under both the MIT and GPL version 2.0 licenses. This means that you can + * choose the license that best suits your project and use it accordingly. + * + * jsDate borrows many concepts and ideas from the Date Instance + * Methods by Ken Snyder along with some parts of Ken's actual code. + * + * Ken's origianl Date Instance Methods and copyright notice: + * + * Ken Snyder (ken d snyder at gmail dot com) + * 2008-09-10 + * version 2.0.2 (http://kendsnyder.com/sandbox/date/) + * Creative Commons Attribution License 3.0 (http://creativecommons.org/licenses/by/3.0/) + * + * jqplotToImage function based on Larry Siden's export-jqplot-to-png.js. + * Larry has generously given permission to adapt his code for inclusion + * into jqPlot. + * + * Larry's original code can be found here: + * + * https://github.com/lsiden/export-jqplot-to-png + * + * + */ +(function(a){a.jqplot.BlockRenderer=function(){a.jqplot.LineRenderer.call(this)};a.jqplot.BlockRenderer.prototype=new a.jqplot.LineRenderer();a.jqplot.BlockRenderer.prototype.constructor=a.jqplot.BlockRenderer;a.jqplot.BlockRenderer.prototype.init=function(b){this.css={padding:"2px",border:"1px solid #999",textAlign:"center"};this.escapeHtml=false;this.insertBreaks=true;this.varyBlockColors=false;a.extend(true,this,b);if(this.css.backgroundColor){this.color=this.css.backgroundColor}else{if(this.css.background){this.color=this.css.background}else{if(!this.varyBlockColors){this.css.background=this.color}}}this.canvas=new a.jqplot.BlockCanvas();this.shadowCanvas=new a.jqplot.BlockCanvas();this.canvas._plotDimensions=this._plotDimensions;this.shadowCanvas._plotDimensions=this._plotDimensions;this._type="block";this.moveBlock=function(l,j,i,e){var c=this.canvas._elem.children(":eq("+l+")");this.data[l][0]=j;this.data[l][1]=i;this._plotData[l][0]=j;this._plotData[l][1]=i;this._stackData[l][0]=j;this._stackData[l][1]=i;this.gridData[l][0]=this._xaxis.series_u2p(j);this.gridData[l][1]=this._yaxis.series_u2p(i);var k=c.outerWidth();var f=c.outerHeight();var d=this.gridData[l][0]-k/2+"px";var g=this.gridData[l][1]-f/2+"px";if(e){if(parseInt(e,10)){e=parseInt(e,10)}c.animate({left:d,top:g},e)}else{c.css({left:d,top:g})}c=null}};a.jqplot.BlockRenderer.prototype.draw=function(q,o,r){if(this.plugins.pointLabels){this.plugins.pointLabels.show=false}var f,c,l,o,p,k,n,g,e,m;var b=(r!=undefined)?r:{};var j=new a.jqplot.ColorGenerator(this.seriesColors);this.canvas._elem.empty();for(f=0;f<this.gridData.length;f++){l=this.data[f];o=this.gridData[f];p="";k={};if(typeof l[2]=="string"){p=l[2]}else{if(typeof l[2]=="object"){k=l[2]}}if(typeof l[3]=="object"){k=l[3]}if(this.insertBreaks){p=p.replace(/ /g,"<br />")}k=a.extend(true,{},this.css,k);c=a('<div style="position:absolute;margin-left:auto;margin-right:auto;"></div>');this.canvas._elem.append(c);this.escapeHtml?c.text(p):c.html(p);delete k.position;delete k.marginRight;delete k.marginLeft;if(!k.background&&!k.backgroundColor&&!k.backgroundImage){k.background=j.next()}c.css(k);n=c.outerWidth();g=c.outerHeight();e=o[0]-n/2+"px";m=o[1]-g/2+"px";c.css({left:e,top:m});c=null}};a.jqplot.BlockCanvas=function(){a.jqplot.ElemContainer.call(this);this._ctx};a.jqplot.BlockCanvas.prototype=new a.jqplot.ElemContainer();a.jqplot.BlockCanvas.prototype.constructor=a.jqplot.BlockCanvas;a.jqplot.BlockCanvas.prototype.createElement=function(i,e,c){this._offsets=i;var b="jqplot-blockCanvas";if(e!=undefined){b=e}var g;if(this._elem){g=this._elem.get(0)}else{g=document.createElement("div")}if(c!=undefined){this._plotDimensions=c}var d=this._plotDimensions.width-this._offsets.left-this._offsets.right+"px";var f=this._plotDimensions.height-this._offsets.top-this._offsets.bottom+"px";this._elem=a(g);this._elem.css({position:"absolute",width:d,height:f,left:this._offsets.left,top:this._offsets.top});this._elem.addClass(b);return this._elem};a.jqplot.BlockCanvas.prototype.setContext=function(){this._ctx={canvas:{width:0,height:0},clearRect:function(){return null}};return this._ctx}})(jQuery); \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/plugins/jqplot.bubbleRenderer.js b/libreplan-webapp/src/main/webapp/jqplot/plugins/jqplot.bubbleRenderer.js new file mode 100644 index 000000000..b3d2c8757 --- /dev/null +++ b/libreplan-webapp/src/main/webapp/jqplot/plugins/jqplot.bubbleRenderer.js @@ -0,0 +1,754 @@ +/** + * jqPlot + * Pure JavaScript plotting plugin using jQuery + * + * Version: 1.0.0b2_r1012 + * + * Copyright (c) 2009-2011 Chris Leonello + * jqPlot is currently available for use in all personal or commercial projects + * under both the MIT (http://www.opensource.org/licenses/mit-license.php) and GPL + * version 2.0 (http://www.gnu.org/licenses/gpl-2.0.html) licenses. This means that you can + * choose the license that best suits your project and use it accordingly. + * + * Although not required, the author would appreciate an email letting him + * know of any substantial use of jqPlot. You can reach the author at: + * chris at jqplot dot com or see http://www.jqplot.com/info.php . + * + * If you are feeling kind and generous, consider supporting the project by + * making a donation at: http://www.jqplot.com/donate.php . + * + * sprintf functions contained in jqplot.sprintf.js by Ash Searle: + * + * version 2007.04.27 + * author Ash Searle + * http://hexmen.com/blog/2007/03/printf-sprintf/ + * http://hexmen.com/js/sprintf.js + * The author (Ash Searle) has placed this code in the public domain: + * "This code is unrestricted: you are free to use it however you like." + * + */ +(function($) { + var arrayMax = function( array ){ + return Math.max.apply( Math, array ); + }; + var arrayMin = function( array ){ + return Math.min.apply( Math, array ); + }; + + /** + * Class: $.jqplot.BubbleRenderer + * Plugin renderer to draw a bubble chart. A Bubble chart has data points displayed as + * colored circles with an optional text label inside. To use + * the bubble renderer, you must include the bubble renderer like: + * + * > <script language="javascript" type="text/javascript" src="../src/plugins/jqplot.bubbleRenderer.js"></script> + * + * Data must be supplied in + * the form: + * + * > [[x1, y1, r1, <label or {label:'text', color:color}>], ...] + * + * where the label or options + * object is optional. + * + * Note that all bubble colors will be the same + * unless the "varyBubbleColors" option is set to true. Colors can be specified in the data array + * or in the seriesColors array option on the series. If no colors are defined, the default jqPlot + * series of 16 colors are used. Colors are automatically cycled around again if there are more + * bubbles than colors. + * + * Bubbles are autoscaled by default to fit within the chart area while maintaining + * relative sizes. If the "autoscaleBubbles" option is set to false, the r(adius) values + * in the data array a treated as literal pixel values for the radii of the bubbles. + * + * Properties are passed into the bubble renderer in the rendererOptions object of + * the series options like: + * + * > seriesDefaults: { + * > renderer: $.jqplot.BubbleRenderer, + * > rendererOptions: { + * > bubbleAlpha: 0.7, + * > varyBubbleColors: false + * > } + * > } + * + */ + $.jqplot.BubbleRenderer = function(){ + $.jqplot.LineRenderer.call(this); + }; + + $.jqplot.BubbleRenderer.prototype = new $.jqplot.LineRenderer(); + $.jqplot.BubbleRenderer.prototype.constructor = $.jqplot.BubbleRenderer; + + // called with scope of a series + $.jqplot.BubbleRenderer.prototype.init = function(options, plot) { + // Group: Properties + // + // prop: varyBubbleColors + // True to vary the color of each bubble in this series according to + // the seriesColors array. False to set each bubble to the color + // specified on this series. This has no effect if a css background color + // option is specified in the renderer css options. + this.varyBubbleColors = true; + // prop: autoscaleBubbles + // True to scale the bubble radius based on plot size. + // False will use the radius value as provided as a raw pixel value for + // bubble radius. + this.autoscaleBubbles = true; + // prop: autoscaleMultiplier + // Multiplier the bubble size if autoscaleBubbles is true. + this.autoscaleMultiplier = 1.0; + // prop: autoscalePointsFactor + // Factor which decreases bubble size based on how many bubbles on on the chart. + // 0 means no adjustment for number of bubbles. Negative values will decrease + // size of bubbles as more bubbles are added. Values between 0 and -0.2 + // should work well. + this.autoscalePointsFactor = -0.07; + // prop: escapeHtml + // True to escape html in bubble label text. + this.escapeHtml = true; + // prop: highlightMouseOver + // True to highlight bubbles when moused over. + // This must be false to enable highlightMouseDown to highlight when clicking on a slice. + this.highlightMouseOver = true; + // prop: highlightMouseDown + // True to highlight when a mouse button is pressed over a bubble. + // This will be disabled if highlightMouseOver is true. + this.highlightMouseDown = false; + // prop: highlightColors + // An array of colors to use when highlighting a slice. Calculated automatically + // if not supplied. + this.highlightColors = []; + // prop: bubbleAlpha + // Alpha transparency to apply to all bubbles in this series. + this.bubbleAlpha = 1.0; + // prop: highlightAlpha + // Alpha transparency to apply when highlighting bubble. + // Set to value of bubbleAlpha by default. + this.highlightAlpha = null; + // prop: bubbleGradients + // True to color the bubbles with gradient fills instead of flat colors. + // NOT AVAILABLE IN IE due to lack of excanvas support for radial gradient fills. + // will be ignored in IE. + this.bubbleGradients = false; + // prop: showLabels + // True to show labels on bubbles (if any), false to not show. + this.showLabels = true; + // array of [point index, radius] which will be sorted in descending order to plot + // largest points below smaller points. + this.radii = []; + this.maxRadius = 0; + // index of the currenty highlighted point, if any + this._highlightedPoint = null; + // array of jQuery labels. + this.labels = []; + this.bubbleCanvases = []; + this._type = 'bubble'; + + // if user has passed in highlightMouseDown option and not set highlightMouseOver, disable highlightMouseOver + if (options.highlightMouseDown && options.highlightMouseOver == null) { + options.highlightMouseOver = false; + } + + $.extend(true, this, options); + + if (this.highlightAlpha == null) { + this.highlightAlpha = this.bubbleAlpha; + if (this.bubbleGradients) { + this.highlightAlpha = 0.35; + } + } + + this.autoscaleMultiplier = this.autoscaleMultiplier * Math.pow(this.data.length, this.autoscalePointsFactor); + + // index of the currenty highlighted point, if any + this._highlightedPoint = null; + + // adjust the series colors for options colors passed in with data or for alpha. + // note, this can leave undefined holes in the seriesColors array. + var comps; + for (var i=0; i<this.data.length; i++) { + var color = null; + var d = this.data[i]; + this.maxRadius = Math.max(this.maxRadius, d[2]); + if (d[3]) { + if (typeof(d[3]) == 'object') { + color = d[3]['color']; + } + } + + if (color == null) { + if (this.seriesColors[i] != null) { + color = this.seriesColors[i]; + } + } + + if (color && this.bubbleAlpha < 1.0) { + comps = $.jqplot.getColorComponents(color); + color = 'rgba('+comps[0]+', '+comps[1]+', '+comps[2]+', '+this.bubbleAlpha+')'; + } + + if (color) { + this.seriesColors[i] = color; + } + } + + if (!this.varyBubbleColors) { + this.seriesColors = [this.color]; + } + + this.colorGenerator = new $.jqplot.ColorGenerator(this.seriesColors); + + // set highlight colors if none provided + if (this.highlightColors.length == 0) { + for (var i=0; i<this.seriesColors.length; i++){ + var rgba = $.jqplot.getColorComponents(this.seriesColors[i]); + var newrgb = [rgba[0], rgba[1], rgba[2]]; + var sum = newrgb[0] + newrgb[1] + newrgb[2]; + for (var j=0; j<3; j++) { + // when darkening, lowest color component can be is 60. + newrgb[j] = (sum > 570) ? newrgb[j] * 0.8 : newrgb[j] + 0.3 * (255 - newrgb[j]); + newrgb[j] = parseInt(newrgb[j], 10); + } + this.highlightColors.push('rgba('+newrgb[0]+','+newrgb[1]+','+newrgb[2]+', '+this.highlightAlpha+')'); + } + } + + this.highlightColorGenerator = new $.jqplot.ColorGenerator(this.highlightColors); + + var sopts = {fill:true, isarc:true, angle:this.shadowAngle, alpha:this.shadowAlpha, closePath:true}; + + this.renderer.shadowRenderer.init(sopts); + + this.canvas = new $.jqplot.DivCanvas(); + this.canvas._plotDimensions = this._plotDimensions; + + plot.eventListenerHooks.addOnce('jqplotMouseMove', handleMove); + plot.eventListenerHooks.addOnce('jqplotMouseDown', handleMouseDown); + plot.eventListenerHooks.addOnce('jqplotMouseUp', handleMouseUp); + plot.eventListenerHooks.addOnce('jqplotClick', handleClick); + plot.eventListenerHooks.addOnce('jqplotRightClick', handleRightClick); + plot.postDrawHooks.addOnce(postPlotDraw); + + }; + + + // converts the user data values to grid coordinates and stores them + // in the gridData array. + // Called with scope of a series. + $.jqplot.BubbleRenderer.prototype.setGridData = function(plot) { + // recalculate the grid data + var xp = this._xaxis.series_u2p; + var yp = this._yaxis.series_u2p; + var data = this._plotData; + this.gridData = []; + var radii = []; + this.radii = []; + var dim = Math.min(plot._height, plot._width); + for (var i=0; i<this.data.length; i++) { + if (data[i] != null) { + this.gridData.push([xp.call(this._xaxis, data[i][0]), yp.call(this._yaxis, data[i][1]), data[i][2]]); + this.radii.push([i, data[i][2]]); + radii.push(data[i][2]); + } + } + var r, val, maxr = this.maxRadius = arrayMax(radii); + var l = this.gridData.length; + if (this.autoscaleBubbles) { + for (var i=0; i<l; i++) { + val = radii[i]/maxr; + r = this.autoscaleMultiplier * dim / 6; + this.gridData[i][2] = r * val; + } + } + + this.radii.sort(function(a, b) { return b[1] - a[1]; }); + }; + + // converts any arbitrary data values to grid coordinates and + // returns them. This method exists so that plugins can use a series' + // linerenderer to generate grid data points without overwriting the + // grid data associated with that series. + // Called with scope of a series. + $.jqplot.BubbleRenderer.prototype.makeGridData = function(data, plot) { + // recalculate the grid data + var xp = this._xaxis.series_u2p; + var yp = this._yaxis.series_u2p; + var gd = []; + var radii = []; + this.radii = []; + var dim = Math.min(plot._height, plot._width); + for (var i=0; i<data.length; i++) { + if (data[i] != null) { + gd.push([xp.call(this._xaxis, data[i][0]), yp.call(this._yaxis, data[i][1]), data[i][2]]); + radii.push(data[i][2]); + this.radii.push([i, data[i][2]]); + } + } + var r, val, maxr = this.maxRadius = arrayMax(radii); + var l = this.gridData.length; + if (this.autoscaleBubbles) { + for (var i=0; i<l; i++) { + val = radii[i]/maxr; + r = this.autoscaleMultiplier * dim / 6; + gd[i][2] = r * val; + } + } + this.radii.sort(function(a, b) { return b[1] - a[1]; }); + return gd; + }; + + // called with scope of series + $.jqplot.BubbleRenderer.prototype.draw = function (ctx, gd, options) { + if (this.plugins.pointLabels) { + this.plugins.pointLabels.show = false; + } + var opts = (options != undefined) ? options : {}; + var shadow = (opts.shadow != undefined) ? opts.shadow : this.shadow; + this.canvas._elem.empty(); + for (var i=0; i<this.radii.length; i++) { + var idx = this.radii[i][0]; + var t=null; + var color = null; + var el = null; + var tel = null; + var d = this.data[idx]; + var gd = this.gridData[idx]; + if (d[3]) { + if (typeof(d[3]) == 'object') { + t = d[3]['label']; + } + else if (typeof(d[3]) == 'string') { + t = d[3]; + } + } + + // color = (this.varyBubbleColors) ? this.colorGenerator.get(idx) : this.color; + color = this.colorGenerator.get(idx); + + // If we're drawing a shadow, expand the canvas dimensions to accomodate. + var canvasRadius = gd[2]; + var offset, depth; + if (this.shadow) { + offset = (0.7 + gd[2]/40).toFixed(1); + depth = 1 + Math.ceil(gd[2]/15); + canvasRadius += offset*depth; + } + this.bubbleCanvases[idx] = new $.jqplot.BubbleCanvas(); + this.canvas._elem.append(this.bubbleCanvases[idx].createElement(gd[0], gd[1], canvasRadius)); + this.bubbleCanvases[idx].setContext(); + var ctx = this.bubbleCanvases[idx]._ctx; + var x = ctx.canvas.width/2; + var y = ctx.canvas.height/2; + if (this.shadow) { + this.renderer.shadowRenderer.draw(ctx, [x, y, gd[2], 0, 2*Math.PI], {offset: offset, depth: depth}); + } + this.bubbleCanvases[idx].draw(gd[2], color, this.bubbleGradients, this.shadowAngle/180*Math.PI); + + // now draw label. + if (t && this.showLabels) { + tel = $('<div style="position:absolute;" class="jqplot-bubble-label"></div>'); + if (this.escapeHtml) { + tel.text(t); + } + else { + tel.html(t); + } + this.canvas._elem.append(tel); + var h = $(tel).outerHeight(); + var w = $(tel).outerWidth(); + var top = gd[1] - 0.5*h; + var left = gd[0] - 0.5*w; + tel.css({top: top, left: left}); + this.labels[idx] = $(tel); + } + } + }; + + + $.jqplot.DivCanvas = function() { + $.jqplot.ElemContainer.call(this); + this._ctx; + }; + + $.jqplot.DivCanvas.prototype = new $.jqplot.ElemContainer(); + $.jqplot.DivCanvas.prototype.constructor = $.jqplot.DivCanvas; + + $.jqplot.DivCanvas.prototype.createElement = function(offsets, clss, plotDimensions) { + this._offsets = offsets; + var klass = 'jqplot-DivCanvas'; + if (clss != undefined) { + klass = clss; + } + var elem; + // if this canvas already has a dom element, don't make a new one. + if (this._elem) { + elem = this._elem.get(0); + } + else { + elem = document.createElement('div'); + } + // if new plotDimensions supplied, use them. + if (plotDimensions != undefined) { + this._plotDimensions = plotDimensions; + } + + var w = this._plotDimensions.width - this._offsets.left - this._offsets.right + 'px'; + var h = this._plotDimensions.height - this._offsets.top - this._offsets.bottom + 'px'; + this._elem = $(elem); + this._elem.css({ position: 'absolute', width:w, height:h, left: this._offsets.left, top: this._offsets.top }); + + this._elem.addClass(klass); + return this._elem; + }; + + $.jqplot.DivCanvas.prototype.setContext = function() { + this._ctx = { + canvas:{ + width:0, + height:0 + }, + clearRect:function(){return null;} + }; + return this._ctx; + }; + + $.jqplot.BubbleCanvas = function() { + $.jqplot.ElemContainer.call(this); + this._ctx; + }; + + $.jqplot.BubbleCanvas.prototype = new $.jqplot.ElemContainer(); + $.jqplot.BubbleCanvas.prototype.constructor = $.jqplot.BubbleCanvas; + + // initialize with the x,y pont of bubble center and the bubble radius. + $.jqplot.BubbleCanvas.prototype.createElement = function(x, y, r) { + var klass = 'jqplot-bubble-point'; + + var elem; + // if this canvas already has a dom element, don't make a new one. + if (this._elem) { + elem = this._elem.get(0); + } + else { + elem = document.createElement('canvas'); + } + + elem.width = (r != null) ? 2*r : elem.width; + elem.height = (r != null) ? 2*r : elem.height; + this._elem = $(elem); + var l = (x != null && r != null) ? x - r : this._elem.css('left'); + var t = (y != null && r != null) ? y - r : this._elem.css('top'); + this._elem.css({ position: 'absolute', left: l, top: t }); + + this._elem.addClass(klass); + if ($.jqplot.use_excanvas) { + window.G_vmlCanvasManager.init_(document); + elem = window.G_vmlCanvasManager.initElement(elem); + } + + return this._elem; + }; + + $.jqplot.BubbleCanvas.prototype.draw = function(r, color, gradients, angle) { + var ctx = this._ctx; + // r = Math.floor(r*1.04); + // var x = Math.round(ctx.canvas.width/2); + // var y = Math.round(ctx.canvas.height/2); + var x = ctx.canvas.width/2; + var y = ctx.canvas.height/2; + ctx.save(); + if (gradients && !$.jqplot.use_excanvas) { + r = r*1.04; + var comps = $.jqplot.getColorComponents(color); + var colorinner = 'rgba('+Math.round(comps[0]+0.8*(255-comps[0]))+', '+Math.round(comps[1]+0.8*(255-comps[1]))+', '+Math.round(comps[2]+0.8*(255-comps[2]))+', '+comps[3]+')'; + var colorend = 'rgba('+comps[0]+', '+comps[1]+', '+comps[2]+', 0)'; + // var rinner = Math.round(0.35 * r); + // var xinner = Math.round(x - Math.cos(angle) * 0.33 * r); + // var yinner = Math.round(y - Math.sin(angle) * 0.33 * r); + var rinner = 0.35 * r; + var xinner = x - Math.cos(angle) * 0.33 * r; + var yinner = y - Math.sin(angle) * 0.33 * r; + var radgrad = ctx.createRadialGradient(xinner, yinner, rinner, x, y, r); + radgrad.addColorStop(0, colorinner); + radgrad.addColorStop(0.93, color); + radgrad.addColorStop(0.96, colorend); + radgrad.addColorStop(1, colorend); + // radgrad.addColorStop(.98, colorend); + ctx.fillStyle = radgrad; + ctx.fillRect(0,0, ctx.canvas.width, ctx.canvas.height); + } + else { + ctx.fillStyle = color; + ctx.strokeStyle = color; + ctx.lineWidth = 1; + ctx.beginPath(); + var ang = 2*Math.PI; + ctx.arc(x, y, r, 0, ang, 0); + ctx.closePath(); + ctx.fill(); + } + ctx.restore(); + }; + + $.jqplot.BubbleCanvas.prototype.setContext = function() { + this._ctx = this._elem.get(0).getContext("2d"); + return this._ctx; + }; + + $.jqplot.BubbleAxisRenderer = function() { + $.jqplot.LinearAxisRenderer.call(this); + }; + + $.jqplot.BubbleAxisRenderer.prototype = new $.jqplot.LinearAxisRenderer(); + $.jqplot.BubbleAxisRenderer.prototype.constructor = $.jqplot.BubbleAxisRenderer; + + // called with scope of axis object. + $.jqplot.BubbleAxisRenderer.prototype.init = function(options){ + $.extend(true, this, options); + var db = this._dataBounds; + var minsidx = 0, + minpidx = 0, + maxsidx = 0, + maxpidx = 0, + maxr = 0, + minr = 0, + minMaxRadius = 0, + maxMaxRadius = 0, + maxMult = 0, + minMult = 0; + // Go through all the series attached to this axis and find + // the min/max bounds for this axis. + for (var i=0; i<this._series.length; i++) { + var s = this._series[i]; + var d = s._plotData; + + for (var j=0; j<d.length; j++) { + if (this.name == 'xaxis' || this.name == 'x2axis') { + if (d[j][0] < db.min || db.min == null) { + db.min = d[j][0]; + minsidx=i; + minpidx=j; + minr = d[j][2]; + minMaxRadius = s.maxRadius; + minMult = s.autoscaleMultiplier; + } + if (d[j][0] > db.max || db.max == null) { + db.max = d[j][0]; + maxsidx=i; + maxpidx=j; + maxr = d[j][2]; + maxMaxRadius = s.maxRadius; + maxMult = s.autoscaleMultiplier; + } + } + else { + if (d[j][1] < db.min || db.min == null) { + db.min = d[j][1]; + minsidx=i; + minpidx=j; + minr = d[j][2]; + minMaxRadius = s.maxRadius; + minMult = s.autoscaleMultiplier; + } + if (d[j][1] > db.max || db.max == null) { + db.max = d[j][1]; + maxsidx=i; + maxpidx=j; + maxr = d[j][2]; + maxMaxRadius = s.maxRadius; + maxMult = s.autoscaleMultiplier; + } + } + } + } + + var minRatio = minr/minMaxRadius; + var maxRatio = maxr/maxMaxRadius; + + // need to estimate the effect of the radius on total axis span and adjust axis accordingly. + var span = db.max - db.min; + // var dim = (this.name == 'xaxis' || this.name == 'x2axis') ? this._plotDimensions.width : this._plotDimensions.height; + var dim = Math.min(this._plotDimensions.width, this._plotDimensions.height); + + var minfact = minRatio * minMult/3 * span; + var maxfact = maxRatio * maxMult/3 * span; + db.max += maxfact; + db.min -= minfact; + }; + + function highlight (plot, sidx, pidx) { + plot.plugins.bubbleRenderer.highlightLabelCanvas.empty(); + var s = plot.series[sidx]; + var canvas = plot.plugins.bubbleRenderer.highlightCanvas; + var ctx = canvas._ctx; + ctx.clearRect(0,0,ctx.canvas.width, ctx.canvas.height); + s._highlightedPoint = pidx; + plot.plugins.bubbleRenderer.highlightedSeriesIndex = sidx; + + var color = s.highlightColorGenerator.get(pidx); + var x = s.gridData[pidx][0], + y = s.gridData[pidx][1], + r = s.gridData[pidx][2]; + ctx.save(); + ctx.fillStyle = color; + ctx.strokeStyle = color; + ctx.lineWidth = 1; + ctx.beginPath(); + ctx.arc(x, y, r, 0, 2*Math.PI, 0); + ctx.closePath(); + ctx.fill(); + ctx.restore(); + // bring label to front + if (s.labels[pidx]) { + plot.plugins.bubbleRenderer.highlightLabel = s.labels[pidx].clone(); + plot.plugins.bubbleRenderer.highlightLabel.appendTo(plot.plugins.bubbleRenderer.highlightLabelCanvas); + plot.plugins.bubbleRenderer.highlightLabel.addClass('jqplot-bubble-label-highlight'); + } + } + + function unhighlight (plot) { + var canvas = plot.plugins.bubbleRenderer.highlightCanvas; + var sidx = plot.plugins.bubbleRenderer.highlightedSeriesIndex; + plot.plugins.bubbleRenderer.highlightLabelCanvas.empty(); + canvas._ctx.clearRect(0,0, canvas._ctx.canvas.width, canvas._ctx.canvas.height); + for (var i=0; i<plot.series.length; i++) { + plot.series[i]._highlightedPoint = null; + } + plot.plugins.bubbleRenderer.highlightedSeriesIndex = null; + plot.target.trigger('jqplotDataUnhighlight'); + } + + + function handleMove(ev, gridpos, datapos, neighbor, plot) { + if (neighbor) { + var si = neighbor.seriesIndex; + var pi = neighbor.pointIndex; + var ins = [si, pi, neighbor.data, plot.series[si].gridData[pi][2]]; + var evt1 = jQuery.Event('jqplotDataMouseOver'); + evt1.pageX = ev.pageX; + evt1.pageY = ev.pageY; + plot.target.trigger(evt1, ins); + if (plot.series[ins[0]].highlightMouseOver && !(ins[0] == plot.plugins.bubbleRenderer.highlightedSeriesIndex && ins[1] == plot.series[ins[0]]._highlightedPoint)) { + var evt = jQuery.Event('jqplotDataHighlight'); + evt.pageX = ev.pageX; + evt.pageY = ev.pageY; + plot.target.trigger(evt, ins); + highlight (plot, ins[0], ins[1]); + } + } + else if (neighbor == null) { + unhighlight (plot); + } + } + + function handleMouseDown(ev, gridpos, datapos, neighbor, plot) { + if (neighbor) { + var si = neighbor.seriesIndex; + var pi = neighbor.pointIndex; + var ins = [si, pi, neighbor.data, plot.series[si].gridData[pi][2]]; + if (plot.series[ins[0]].highlightMouseDown && !(ins[0] == plot.plugins.bubbleRenderer.highlightedSeriesIndex && ins[1] == plot.series[ins[0]]._highlightedPoint)) { + var evt = jQuery.Event('jqplotDataHighlight'); + evt.pageX = ev.pageX; + evt.pageY = ev.pageY; + plot.target.trigger(evt, ins); + highlight (plot, ins[0], ins[1]); + } + } + else if (neighbor == null) { + unhighlight (plot); + } + } + + function handleMouseUp(ev, gridpos, datapos, neighbor, plot) { + var idx = plot.plugins.bubbleRenderer.highlightedSeriesIndex; + if (idx != null && plot.series[idx].highlightMouseDown) { + unhighlight(plot); + } + } + + function handleClick(ev, gridpos, datapos, neighbor, plot) { + if (neighbor) { + var si = neighbor.seriesIndex; + var pi = neighbor.pointIndex; + var ins = [si, pi, neighbor.data, plot.series[si].gridData[pi][2]]; + var evt = jQuery.Event('jqplotDataClick'); + evt.pageX = ev.pageX; + evt.pageY = ev.pageY; + plot.target.trigger(evt, ins); + } + } + + function handleRightClick(ev, gridpos, datapos, neighbor, plot) { + if (neighbor) { + var si = neighbor.seriesIndex; + var pi = neighbor.pointIndex; + var ins = [si, pi, neighbor.data, plot.series[si].gridData[pi][2]]; + var idx = plot.plugins.bubbleRenderer.highlightedSeriesIndex; + if (idx != null && plot.series[idx].highlightMouseDown) { + unhighlight(plot); + } + var evt = jQuery.Event('jqplotDataRightClick'); + evt.pageX = ev.pageX; + evt.pageY = ev.pageY; + plot.target.trigger(evt, ins); + } + } + + // called within context of plot + // create a canvas which we can draw on. + // insert it before the eventCanvas, so eventCanvas will still capture events. + function postPlotDraw() { + // Memory Leaks patch + if (this.plugins.bubbleRenderer && this.plugins.bubbleRenderer.highlightCanvas) { + this.plugins.bubbleRenderer.highlightCanvas.resetCanvas(); + this.plugins.bubbleRenderer.highlightCanvas = null; + } + + this.plugins.bubbleRenderer = {highlightedSeriesIndex:null}; + this.plugins.bubbleRenderer.highlightCanvas = new $.jqplot.GenericCanvas(); + this.plugins.bubbleRenderer.highlightLabel = null; + this.plugins.bubbleRenderer.highlightLabelCanvas = $('<div style="position:absolute;"></div>'); + var top = this._gridPadding.top; + var left = this._gridPadding.left; + var width = this._plotDimensions.width - this._gridPadding.left - this._gridPadding.right; + var height = this._plotDimensions.height - this._gridPadding.top - this._gridPadding.bottom; + this.plugins.bubbleRenderer.highlightLabelCanvas.css({top:top, left:left, width:width+'px', height:height+'px'}); + + this.eventCanvas._elem.before(this.plugins.bubbleRenderer.highlightCanvas.createElement(this._gridPadding, 'jqplot-bubbleRenderer-highlight-canvas', this._plotDimensions, this)); + this.eventCanvas._elem.before(this.plugins.bubbleRenderer.highlightLabelCanvas); + + var hctx = this.plugins.bubbleRenderer.highlightCanvas.setContext(); + } + + + // setup default renderers for axes and legend so user doesn't have to + // called with scope of plot + function preInit(target, data, options) { + options = options || {}; + options.axesDefaults = options.axesDefaults || {}; + options.seriesDefaults = options.seriesDefaults || {}; + // only set these if there is a Bubble series + var setopts = false; + if (options.seriesDefaults.renderer == $.jqplot.BubbleRenderer) { + setopts = true; + } + else if (options.series) { + for (var i=0; i < options.series.length; i++) { + if (options.series[i].renderer == $.jqplot.BubbleRenderer) { + setopts = true; + } + } + } + + if (setopts) { + options.axesDefaults.renderer = $.jqplot.BubbleAxisRenderer; + options.sortData = false; + } + } + + $.jqplot.preInitHooks.push(preInit); + +})(jQuery); + + \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/plugins/jqplot.bubbleRenderer.min.js b/libreplan-webapp/src/main/webapp/jqplot/plugins/jqplot.bubbleRenderer.min.js new file mode 100644 index 000000000..1678ee5f4 --- /dev/null +++ b/libreplan-webapp/src/main/webapp/jqplot/plugins/jqplot.bubbleRenderer.min.js @@ -0,0 +1,57 @@ +/** + * jqPlot + * Pure JavaScript plotting plugin using jQuery + * + * Version: 1.0.0b2_r1012 + * + * Copyright (c) 2009-2011 Chris Leonello + * jqPlot is currently available for use in all personal or commercial projects + * under both the MIT (http://www.opensource.org/licenses/mit-license.php) and GPL + * version 2.0 (http://www.gnu.org/licenses/gpl-2.0.html) licenses. This means that you can + * choose the license that best suits your project and use it accordingly. + * + * Although not required, the author would appreciate an email letting him + * know of any substantial use of jqPlot. You can reach the author at: + * chris at jqplot dot com or see http://www.jqplot.com/info.php . + * + * If you are feeling kind and generous, consider supporting the project by + * making a donation at: http://www.jqplot.com/donate.php . + * + * sprintf functions contained in jqplot.sprintf.js by Ash Searle: + * + * version 2007.04.27 + * author Ash Searle + * http://hexmen.com/blog/2007/03/printf-sprintf/ + * http://hexmen.com/js/sprintf.js + * The author (Ash Searle) has placed this code in the public domain: + * "This code is unrestricted: you are free to use it however you like." + * + * included jsDate library by Chris Leonello: + * + * Copyright (c) 2010-2011 Chris Leonello + * + * jsDate is currently available for use in all personal or commercial projects + * under both the MIT and GPL version 2.0 licenses. This means that you can + * choose the license that best suits your project and use it accordingly. + * + * jsDate borrows many concepts and ideas from the Date Instance + * Methods by Ken Snyder along with some parts of Ken's actual code. + * + * Ken's origianl Date Instance Methods and copyright notice: + * + * Ken Snyder (ken d snyder at gmail dot com) + * 2008-09-10 + * version 2.0.2 (http://kendsnyder.com/sandbox/date/) + * Creative Commons Attribution License 3.0 (http://creativecommons.org/licenses/by/3.0/) + * + * jqplotToImage function based on Larry Siden's export-jqplot-to-png.js. + * Larry has generously given permission to adapt his code for inclusion + * into jqPlot. + * + * Larry's original code can be found here: + * + * https://github.com/lsiden/export-jqplot-to-png + * + * + */ +(function(f){var d=function(m){return Math.max.apply(Math,m)};var j=function(m){return Math.min.apply(Math,m)};f.jqplot.BubbleRenderer=function(){f.jqplot.LineRenderer.call(this)};f.jqplot.BubbleRenderer.prototype=new f.jqplot.LineRenderer();f.jqplot.BubbleRenderer.prototype.constructor=f.jqplot.BubbleRenderer;f.jqplot.BubbleRenderer.prototype.init=function(w,t){this.varyBubbleColors=true;this.autoscaleBubbles=true;this.autoscaleMultiplier=1;this.autoscalePointsFactor=-0.07;this.escapeHtml=true;this.highlightMouseOver=true;this.highlightMouseDown=false;this.highlightColors=[];this.bubbleAlpha=1;this.highlightAlpha=null;this.bubbleGradients=false;this.showLabels=true;this.radii=[];this.maxRadius=0;this._highlightedPoint=null;this.labels=[];this.bubbleCanvases=[];this._type="bubble";if(w.highlightMouseDown&&w.highlightMouseOver==null){w.highlightMouseOver=false}f.extend(true,this,w);if(this.highlightAlpha==null){this.highlightAlpha=this.bubbleAlpha;if(this.bubbleGradients){this.highlightAlpha=0.35}}this.autoscaleMultiplier=this.autoscaleMultiplier*Math.pow(this.data.length,this.autoscalePointsFactor);this._highlightedPoint=null;var n;for(var r=0;r<this.data.length;r++){var p=null;var v=this.data[r];this.maxRadius=Math.max(this.maxRadius,v[2]);if(v[3]){if(typeof(v[3])=="object"){p=v[3]["color"]}}if(p==null){if(this.seriesColors[r]!=null){p=this.seriesColors[r]}}if(p&&this.bubbleAlpha<1){n=f.jqplot.getColorComponents(p);p="rgba("+n[0]+", "+n[1]+", "+n[2]+", "+this.bubbleAlpha+")"}if(p){this.seriesColors[r]=p}}if(!this.varyBubbleColors){this.seriesColors=[this.color]}this.colorGenerator=new f.jqplot.ColorGenerator(this.seriesColors);if(this.highlightColors.length==0){for(var r=0;r<this.seriesColors.length;r++){var o=f.jqplot.getColorComponents(this.seriesColors[r]);var u=[o[0],o[1],o[2]];var s=u[0]+u[1]+u[2];for(var q=0;q<3;q++){u[q]=(s>570)?u[q]*0.8:u[q]+0.3*(255-u[q]);u[q]=parseInt(u[q],10)}this.highlightColors.push("rgba("+u[0]+","+u[1]+","+u[2]+", "+this.highlightAlpha+")")}}this.highlightColorGenerator=new f.jqplot.ColorGenerator(this.highlightColors);var m={fill:true,isarc:true,angle:this.shadowAngle,alpha:this.shadowAlpha,closePath:true};this.renderer.shadowRenderer.init(m);this.canvas=new f.jqplot.DivCanvas();this.canvas._plotDimensions=this._plotDimensions;t.eventListenerHooks.addOnce("jqplotMouseMove",a);t.eventListenerHooks.addOnce("jqplotMouseDown",b);t.eventListenerHooks.addOnce("jqplotMouseUp",k);t.eventListenerHooks.addOnce("jqplotClick",g);t.eventListenerHooks.addOnce("jqplotRightClick",l);t.postDrawHooks.addOnce(h)};f.jqplot.BubbleRenderer.prototype.setGridData=function(w){var q=this._xaxis.series_u2p;var m=this._yaxis.series_u2p;var t=this._plotData;this.gridData=[];var s=[];this.radii=[];var v=Math.min(w._height,w._width);for(var u=0;u<this.data.length;u++){if(t[u]!=null){this.gridData.push([q.call(this._xaxis,t[u][0]),m.call(this._yaxis,t[u][1]),t[u][2]]);this.radii.push([u,t[u][2]]);s.push(t[u][2])}}var n,o,x=this.maxRadius=d(s);var p=this.gridData.length;if(this.autoscaleBubbles){for(var u=0;u<p;u++){o=s[u]/x;n=this.autoscaleMultiplier*v/6;this.gridData[u][2]=n*o}}this.radii.sort(function(y,r){return r[1]-y[1]})};f.jqplot.BubbleRenderer.prototype.makeGridData=function(t,w){var q=this._xaxis.series_u2p;var n=this._yaxis.series_u2p;var x=[];var s=[];this.radii=[];var v=Math.min(w._height,w._width);for(var u=0;u<t.length;u++){if(t[u]!=null){x.push([q.call(this._xaxis,t[u][0]),n.call(this._yaxis,t[u][1]),t[u][2]]);s.push(t[u][2]);this.radii.push([u,t[u][2]])}}var m,o,y=this.maxRadius=d(s);var p=this.gridData.length;if(this.autoscaleBubbles){for(var u=0;u<p;u++){o=s[u]/y;m=this.autoscaleMultiplier*v/6;x[u][2]=m*o}}this.radii.sort(function(z,r){return r[1]-z[1]});return x};f.jqplot.BubbleRenderer.prototype.draw=function(D,J,n){if(this.plugins.pointLabels){this.plugins.pointLabels.show=false}var A=(n!=undefined)?n:{};var r=(A.shadow!=undefined)?A.shadow:this.shadow;this.canvas._elem.empty();for(var G=0;G<this.radii.length;G++){var C=this.radii[G][0];var z=null;var F=null;var m=null;var p=null;var I=this.data[C];var J=this.gridData[C];if(I[3]){if(typeof(I[3])=="object"){z=I[3]["label"]}else{if(typeof(I[3])=="string"){z=I[3]}}}F=this.colorGenerator.get(C);var E=J[2];var q,K;if(this.shadow){q=(0.7+J[2]/40).toFixed(1);K=1+Math.ceil(J[2]/15);E+=q*K}this.bubbleCanvases[C]=new f.jqplot.BubbleCanvas();this.canvas._elem.append(this.bubbleCanvases[C].createElement(J[0],J[1],E));this.bubbleCanvases[C].setContext();var D=this.bubbleCanvases[C]._ctx;var u=D.canvas.width/2;var s=D.canvas.height/2;if(this.shadow){this.renderer.shadowRenderer.draw(D,[u,s,J[2],0,2*Math.PI],{offset:q,depth:K})}this.bubbleCanvases[C].draw(J[2],F,this.bubbleGradients,this.shadowAngle/180*Math.PI);if(z&&this.showLabels){p=f('<div style="position:absolute;" class="jqplot-bubble-label"></div>');if(this.escapeHtml){p.text(z)}else{p.html(z)}this.canvas._elem.append(p);var H=f(p).outerHeight();var v=f(p).outerWidth();var B=J[1]-0.5*H;var o=J[0]-0.5*v;p.css({top:B,left:o});this.labels[C]=f(p)}}};f.jqplot.DivCanvas=function(){f.jqplot.ElemContainer.call(this);this._ctx};f.jqplot.DivCanvas.prototype=new f.jqplot.ElemContainer();f.jqplot.DivCanvas.prototype.constructor=f.jqplot.DivCanvas;f.jqplot.DivCanvas.prototype.createElement=function(s,p,n){this._offsets=s;var m="jqplot-DivCanvas";if(p!=undefined){m=p}var r;if(this._elem){r=this._elem.get(0)}else{r=document.createElement("div")}if(n!=undefined){this._plotDimensions=n}var o=this._plotDimensions.width-this._offsets.left-this._offsets.right+"px";var q=this._plotDimensions.height-this._offsets.top-this._offsets.bottom+"px";this._elem=f(r);this._elem.css({position:"absolute",width:o,height:q,left:this._offsets.left,top:this._offsets.top});this._elem.addClass(m);return this._elem};f.jqplot.DivCanvas.prototype.setContext=function(){this._ctx={canvas:{width:0,height:0},clearRect:function(){return null}};return this._ctx};f.jqplot.BubbleCanvas=function(){f.jqplot.ElemContainer.call(this);this._ctx};f.jqplot.BubbleCanvas.prototype=new f.jqplot.ElemContainer();f.jqplot.BubbleCanvas.prototype.constructor=f.jqplot.BubbleCanvas;f.jqplot.BubbleCanvas.prototype.createElement=function(n,u,s){var m="jqplot-bubble-point";var q;if(this._elem){q=this._elem.get(0)}else{q=document.createElement("canvas")}q.width=(s!=null)?2*s:q.width;q.height=(s!=null)?2*s:q.height;this._elem=f(q);var o=(n!=null&&s!=null)?n-s:this._elem.css("left");var p=(u!=null&&s!=null)?u-s:this._elem.css("top");this._elem.css({position:"absolute",left:o,top:p});this._elem.addClass(m);if(f.jqplot.use_excanvas){window.G_vmlCanvasManager.init_(document);q=window.G_vmlCanvasManager.initElement(q)}return this._elem};f.jqplot.BubbleCanvas.prototype.draw=function(m,s,v,p){var D=this._ctx;var B=D.canvas.width/2;var z=D.canvas.height/2;D.save();if(v&&!f.jqplot.use_excanvas){m=m*1.04;var o=f.jqplot.getColorComponents(s);var u="rgba("+Math.round(o[0]+0.8*(255-o[0]))+", "+Math.round(o[1]+0.8*(255-o[1]))+", "+Math.round(o[2]+0.8*(255-o[2]))+", "+o[3]+")";var t="rgba("+o[0]+", "+o[1]+", "+o[2]+", 0)";var C=0.35*m;var A=B-Math.cos(p)*0.33*m;var n=z-Math.sin(p)*0.33*m;var w=D.createRadialGradient(A,n,C,B,z,m);w.addColorStop(0,u);w.addColorStop(0.93,s);w.addColorStop(0.96,t);w.addColorStop(1,t);D.fillStyle=w;D.fillRect(0,0,D.canvas.width,D.canvas.height)}else{D.fillStyle=s;D.strokeStyle=s;D.lineWidth=1;D.beginPath();var q=2*Math.PI;D.arc(B,z,m,0,q,0);D.closePath();D.fill()}D.restore()};f.jqplot.BubbleCanvas.prototype.setContext=function(){this._ctx=this._elem.get(0).getContext("2d");return this._ctx};f.jqplot.BubbleAxisRenderer=function(){f.jqplot.LinearAxisRenderer.call(this)};f.jqplot.BubbleAxisRenderer.prototype=new f.jqplot.LinearAxisRenderer();f.jqplot.BubbleAxisRenderer.prototype.constructor=f.jqplot.BubbleAxisRenderer;f.jqplot.BubbleAxisRenderer.prototype.init=function(n){f.extend(true,this,n);var I=this._dataBounds;var H=0,v=0,m=0,y=0,q=0,r=0,D=0,t=0,F=0,z=0;for(var E=0;E<this._series.length;E++){var x=this._series[E];var G=x._plotData;for(var B=0;B<G.length;B++){if(this.name=="xaxis"||this.name=="x2axis"){if(G[B][0]<I.min||I.min==null){I.min=G[B][0];H=E;v=B;r=G[B][2];D=x.maxRadius;z=x.autoscaleMultiplier}if(G[B][0]>I.max||I.max==null){I.max=G[B][0];m=E;y=B;q=G[B][2];t=x.maxRadius;F=x.autoscaleMultiplier}}else{if(G[B][1]<I.min||I.min==null){I.min=G[B][1];H=E;v=B;r=G[B][2];D=x.maxRadius;z=x.autoscaleMultiplier}if(G[B][1]>I.max||I.max==null){I.max=G[B][1];m=E;y=B;q=G[B][2];t=x.maxRadius;F=x.autoscaleMultiplier}}}}var o=r/D;var w=q/t;var C=I.max-I.min;var A=Math.min(this._plotDimensions.width,this._plotDimensions.height);var p=o*z/3*C;var u=w*F/3*C;I.max+=u;I.min-=p};function e(p,v,q){p.plugins.bubbleRenderer.highlightLabelCanvas.empty();var z=p.series[v];var n=p.plugins.bubbleRenderer.highlightCanvas;var w=n._ctx;w.clearRect(0,0,w.canvas.width,w.canvas.height);z._highlightedPoint=q;p.plugins.bubbleRenderer.highlightedSeriesIndex=v;var o=z.highlightColorGenerator.get(q);var u=z.gridData[q][0],t=z.gridData[q][1],m=z.gridData[q][2];w.save();w.fillStyle=o;w.strokeStyle=o;w.lineWidth=1;w.beginPath();w.arc(u,t,m,0,2*Math.PI,0);w.closePath();w.fill();w.restore();if(z.labels[q]){p.plugins.bubbleRenderer.highlightLabel=z.labels[q].clone();p.plugins.bubbleRenderer.highlightLabel.appendTo(p.plugins.bubbleRenderer.highlightLabelCanvas);p.plugins.bubbleRenderer.highlightLabel.addClass("jqplot-bubble-label-highlight")}}function i(p){var m=p.plugins.bubbleRenderer.highlightCanvas;var o=p.plugins.bubbleRenderer.highlightedSeriesIndex;p.plugins.bubbleRenderer.highlightLabelCanvas.empty();m._ctx.clearRect(0,0,m._ctx.canvas.width,m._ctx.canvas.height);for(var n=0;n<p.series.length;n++){p.series[n]._highlightedPoint=null}p.plugins.bubbleRenderer.highlightedSeriesIndex=null;p.target.trigger("jqplotDataUnhighlight")}function a(s,p,m,v,r){if(v){var n=v.seriesIndex;var o=v.pointIndex;var q=[n,o,v.data,r.series[n].gridData[o][2]];var t=jQuery.Event("jqplotDataMouseOver");t.pageX=s.pageX;t.pageY=s.pageY;r.target.trigger(t,q);if(r.series[q[0]].highlightMouseOver&&!(q[0]==r.plugins.bubbleRenderer.highlightedSeriesIndex&&q[1]==r.series[q[0]]._highlightedPoint)){var u=jQuery.Event("jqplotDataHighlight");u.pageX=s.pageX;u.pageY=s.pageY;r.target.trigger(u,q);e(r,q[0],q[1])}}else{if(v==null){i(r)}}}function b(s,p,m,u,r){if(u){var n=u.seriesIndex;var o=u.pointIndex;var q=[n,o,u.data,r.series[n].gridData[o][2]];if(r.series[q[0]].highlightMouseDown&&!(q[0]==r.plugins.bubbleRenderer.highlightedSeriesIndex&&q[1]==r.series[q[0]]._highlightedPoint)){var t=jQuery.Event("jqplotDataHighlight");t.pageX=s.pageX;t.pageY=s.pageY;r.target.trigger(t,q);e(r,q[0],q[1])}}else{if(u==null){i(r)}}}function k(o,n,r,q,p){var m=p.plugins.bubbleRenderer.highlightedSeriesIndex;if(m!=null&&p.series[m].highlightMouseDown){i(p)}}function g(s,p,m,u,r){if(u){var n=u.seriesIndex;var o=u.pointIndex;var q=[n,o,u.data,r.series[n].gridData[o][2]];var t=jQuery.Event("jqplotDataClick");t.pageX=s.pageX;t.pageY=s.pageY;r.target.trigger(t,q)}}function l(s,p,m,v,r){if(v){var n=v.seriesIndex;var o=v.pointIndex;var q=[n,o,v.data,r.series[n].gridData[o][2]];var t=r.plugins.bubbleRenderer.highlightedSeriesIndex;if(t!=null&&r.series[t].highlightMouseDown){i(r)}var u=jQuery.Event("jqplotDataRightClick");u.pageX=s.pageX;u.pageY=s.pageY;r.target.trigger(u,q)}}function h(){if(this.plugins.bubbleRenderer&&this.plugins.bubbleRenderer.highlightCanvas){this.plugins.bubbleRenderer.highlightCanvas.resetCanvas();this.plugins.bubbleRenderer.highlightCanvas=null}this.plugins.bubbleRenderer={highlightedSeriesIndex:null};this.plugins.bubbleRenderer.highlightCanvas=new f.jqplot.GenericCanvas();this.plugins.bubbleRenderer.highlightLabel=null;this.plugins.bubbleRenderer.highlightLabelCanvas=f('<div style="position:absolute;"></div>');var q=this._gridPadding.top;var p=this._gridPadding.left;var n=this._plotDimensions.width-this._gridPadding.left-this._gridPadding.right;var m=this._plotDimensions.height-this._gridPadding.top-this._gridPadding.bottom;this.plugins.bubbleRenderer.highlightLabelCanvas.css({top:q,left:p,width:n+"px",height:m+"px"});this.eventCanvas._elem.before(this.plugins.bubbleRenderer.highlightCanvas.createElement(this._gridPadding,"jqplot-bubbleRenderer-highlight-canvas",this._plotDimensions,this));this.eventCanvas._elem.before(this.plugins.bubbleRenderer.highlightLabelCanvas);var o=this.plugins.bubbleRenderer.highlightCanvas.setContext()}function c(q,p,n){n=n||{};n.axesDefaults=n.axesDefaults||{};n.seriesDefaults=n.seriesDefaults||{};var m=false;if(n.seriesDefaults.renderer==f.jqplot.BubbleRenderer){m=true}else{if(n.series){for(var o=0;o<n.series.length;o++){if(n.series[o].renderer==f.jqplot.BubbleRenderer){m=true}}}}if(m){n.axesDefaults.renderer=f.jqplot.BubbleAxisRenderer;n.sortData=false}}f.jqplot.preInitHooks.push(c)})(jQuery); \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/plugins/jqplot.canvasAxisLabelRenderer.js b/libreplan-webapp/src/main/webapp/jqplot/plugins/jqplot.canvasAxisLabelRenderer.js new file mode 100644 index 000000000..462f47ecd --- /dev/null +++ b/libreplan-webapp/src/main/webapp/jqplot/plugins/jqplot.canvasAxisLabelRenderer.js @@ -0,0 +1,202 @@ +/** + * jqPlot + * Pure JavaScript plotting plugin using jQuery + * + * Version: 1.0.0b2_r1012 + * + * Copyright (c) 2009-2011 Chris Leonello + * jqPlot is currently available for use in all personal or commercial projects + * under both the MIT (http://www.opensource.org/licenses/mit-license.php) and GPL + * version 2.0 (http://www.gnu.org/licenses/gpl-2.0.html) licenses. This means that you can + * choose the license that best suits your project and use it accordingly. + * + * Although not required, the author would appreciate an email letting him + * know of any substantial use of jqPlot. You can reach the author at: + * chris at jqplot dot com or see http://www.jqplot.com/info.php . + * + * If you are feeling kind and generous, consider supporting the project by + * making a donation at: http://www.jqplot.com/donate.php . + * + * sprintf functions contained in jqplot.sprintf.js by Ash Searle: + * + * version 2007.04.27 + * author Ash Searle + * http://hexmen.com/blog/2007/03/printf-sprintf/ + * http://hexmen.com/js/sprintf.js + * The author (Ash Searle) has placed this code in the public domain: + * "This code is unrestricted: you are free to use it however you like." + * + */ +(function($) { + /** + * Class: $.jqplot.CanvasAxisLabelRenderer + * Renderer to draw axis labels with a canvas element to support advanced + * featrues such as rotated text. This renderer uses a separate rendering engine + * to draw the text on the canvas. Two modes of rendering the text are available. + * If the browser has native font support for canvas fonts (currently Mozila 3.5 + * and Safari 4), you can enable text rendering with the canvas fillText method. + * You do so by setting the "enableFontSupport" option to true. + * + * Browsers lacking native font support will have the text drawn on the canvas + * using the Hershey font metrics. Even if the "enableFontSupport" option is true + * non-supporting browsers will still render with the Hershey font. + * + */ + $.jqplot.CanvasAxisLabelRenderer = function(options) { + // Group: Properties + + // prop: angle + // angle of text, measured clockwise from x axis. + this.angle = 0; + // name of the axis associated with this tick + this.axis; + // prop: show + // wether or not to show the tick (mark and label). + this.show = true; + // prop: showLabel + // wether or not to show the label. + this.showLabel = true; + // prop: label + // label for the axis. + this.label = ''; + // prop: fontFamily + // CSS spec for the font-family css attribute. + // Applies only to browsers supporting native font rendering in the + // canvas tag. Currently Mozilla 3.5 and Safari 4. + this.fontFamily = '"Trebuchet MS", Arial, Helvetica, sans-serif'; + // prop: fontSize + // CSS spec for font size. + this.fontSize = '11pt'; + // prop: fontWeight + // CSS spec for fontWeight: normal, bold, bolder, lighter or a number 100 - 900 + this.fontWeight = 'normal'; + // prop: fontStretch + // Multiplier to condense or expand font width. + // Applies only to browsers which don't support canvas native font rendering. + this.fontStretch = 1.0; + // prop: textColor + // css spec for the color attribute. + this.textColor = '#666666'; + // prop: enableFontSupport + // true to turn on native canvas font support in Mozilla 3.5+ and Safari 4+. + // If true, label will be drawn with canvas tag native support for fonts. + // If false, label will be drawn with Hershey font metrics. + this.enableFontSupport = true; + // prop: pt2px + // Point to pixel scaling factor, used for computing height of bounding box + // around a label. The labels text renderer has a default setting of 1.4, which + // should be suitable for most fonts. Leave as null to use default. If tops of + // letters appear clipped, increase this. If bounding box seems too big, decrease. + // This is an issue only with the native font renderering capabilities of Mozilla + // 3.5 and Safari 4 since they do not provide a method to determine the font height. + this.pt2px = null; + + this._elem; + this._ctx; + this._plotWidth; + this._plotHeight; + this._plotDimensions = {height:null, width:null}; + + $.extend(true, this, options); + + if (options.angle == null && this.axis != 'xaxis' && this.axis != 'x2axis') { + this.angle = -90; + } + + var ropts = {fontSize:this.fontSize, fontWeight:this.fontWeight, fontStretch:this.fontStretch, fillStyle:this.textColor, angle:this.getAngleRad(), fontFamily:this.fontFamily}; + if (this.pt2px) { + ropts.pt2px = this.pt2px; + } + + if (this.enableFontSupport) { + if ($.jqplot.support_canvas_text()) { + this._textRenderer = new $.jqplot.CanvasFontRenderer(ropts); + } + + else { + this._textRenderer = new $.jqplot.CanvasTextRenderer(ropts); + } + } + else { + this._textRenderer = new $.jqplot.CanvasTextRenderer(ropts); + } + }; + + $.jqplot.CanvasAxisLabelRenderer.prototype.init = function(options) { + $.extend(true, this, options); + this._textRenderer.init({fontSize:this.fontSize, fontWeight:this.fontWeight, fontStretch:this.fontStretch, fillStyle:this.textColor, angle:this.getAngleRad(), fontFamily:this.fontFamily}); + }; + + // return width along the x axis + // will check first to see if an element exists. + // if not, will return the computed text box width. + $.jqplot.CanvasAxisLabelRenderer.prototype.getWidth = function(ctx) { + if (this._elem) { + return this._elem.outerWidth(true); + } + else { + var tr = this._textRenderer; + var l = tr.getWidth(ctx); + var h = tr.getHeight(ctx); + var w = Math.abs(Math.sin(tr.angle)*h) + Math.abs(Math.cos(tr.angle)*l); + return w; + } + }; + + // return height along the y axis. + $.jqplot.CanvasAxisLabelRenderer.prototype.getHeight = function(ctx) { + if (this._elem) { + return this._elem.outerHeight(true); + } + else { + var tr = this._textRenderer; + var l = tr.getWidth(ctx); + var h = tr.getHeight(ctx); + var w = Math.abs(Math.cos(tr.angle)*h) + Math.abs(Math.sin(tr.angle)*l); + return w; + } + }; + + $.jqplot.CanvasAxisLabelRenderer.prototype.getAngleRad = function() { + var a = this.angle * Math.PI/180; + return a; + }; + + $.jqplot.CanvasAxisLabelRenderer.prototype.draw = function(ctx, plot) { + // Memory Leaks patch + if (this._elem) { + if ($.jqplot.use_excanvas && window.G_vmlCanvasManager.uninitElement !== undefined) { + window.G_vmlCanvasManager.uninitElement(this._elem.get(0)); + } + + this._elem.emptyForce(); + this._elem = null; + } + + // create a canvas here, but can't draw on it untill it is appended + // to dom for IE compatability. + var elem = plot.canvasManager.getCanvas(); + + this._textRenderer.setText(this.label, ctx); + var w = this.getWidth(ctx); + var h = this.getHeight(ctx); + elem.width = w; + elem.height = h; + elem.style.width = w; + elem.style.height = h; + + elem = plot.canvasManager.initCanvas(elem); + + this._elem = $(elem); + this._elem.css({ position: 'absolute'}); + this._elem.addClass('jqplot-'+this.axis+'-label'); + + elem = null; + return this._elem; + }; + + $.jqplot.CanvasAxisLabelRenderer.prototype.pack = function() { + this._textRenderer.draw(this._elem.get(0).getContext("2d"), this.label); + }; + +})(jQuery); \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/plugins/jqplot.canvasAxisLabelRenderer.min.js b/libreplan-webapp/src/main/webapp/jqplot/plugins/jqplot.canvasAxisLabelRenderer.min.js new file mode 100644 index 000000000..6d229d75d --- /dev/null +++ b/libreplan-webapp/src/main/webapp/jqplot/plugins/jqplot.canvasAxisLabelRenderer.min.js @@ -0,0 +1,57 @@ +/** + * jqPlot + * Pure JavaScript plotting plugin using jQuery + * + * Version: 1.0.0b2_r1012 + * + * Copyright (c) 2009-2011 Chris Leonello + * jqPlot is currently available for use in all personal or commercial projects + * under both the MIT (http://www.opensource.org/licenses/mit-license.php) and GPL + * version 2.0 (http://www.gnu.org/licenses/gpl-2.0.html) licenses. This means that you can + * choose the license that best suits your project and use it accordingly. + * + * Although not required, the author would appreciate an email letting him + * know of any substantial use of jqPlot. You can reach the author at: + * chris at jqplot dot com or see http://www.jqplot.com/info.php . + * + * If you are feeling kind and generous, consider supporting the project by + * making a donation at: http://www.jqplot.com/donate.php . + * + * sprintf functions contained in jqplot.sprintf.js by Ash Searle: + * + * version 2007.04.27 + * author Ash Searle + * http://hexmen.com/blog/2007/03/printf-sprintf/ + * http://hexmen.com/js/sprintf.js + * The author (Ash Searle) has placed this code in the public domain: + * "This code is unrestricted: you are free to use it however you like." + * + * included jsDate library by Chris Leonello: + * + * Copyright (c) 2010-2011 Chris Leonello + * + * jsDate is currently available for use in all personal or commercial projects + * under both the MIT and GPL version 2.0 licenses. This means that you can + * choose the license that best suits your project and use it accordingly. + * + * jsDate borrows many concepts and ideas from the Date Instance + * Methods by Ken Snyder along with some parts of Ken's actual code. + * + * Ken's origianl Date Instance Methods and copyright notice: + * + * Ken Snyder (ken d snyder at gmail dot com) + * 2008-09-10 + * version 2.0.2 (http://kendsnyder.com/sandbox/date/) + * Creative Commons Attribution License 3.0 (http://creativecommons.org/licenses/by/3.0/) + * + * jqplotToImage function based on Larry Siden's export-jqplot-to-png.js. + * Larry has generously given permission to adapt his code for inclusion + * into jqPlot. + * + * Larry's original code can be found here: + * + * https://github.com/lsiden/export-jqplot-to-png + * + * + */ +(function(a){a.jqplot.CanvasAxisLabelRenderer=function(b){this.angle=0;this.axis;this.show=true;this.showLabel=true;this.label="";this.fontFamily='"Trebuchet MS", Arial, Helvetica, sans-serif';this.fontSize="11pt";this.fontWeight="normal";this.fontStretch=1;this.textColor="#666666";this.enableFontSupport=true;this.pt2px=null;this._elem;this._ctx;this._plotWidth;this._plotHeight;this._plotDimensions={height:null,width:null};a.extend(true,this,b);if(b.angle==null&&this.axis!="xaxis"&&this.axis!="x2axis"){this.angle=-90}var c={fontSize:this.fontSize,fontWeight:this.fontWeight,fontStretch:this.fontStretch,fillStyle:this.textColor,angle:this.getAngleRad(),fontFamily:this.fontFamily};if(this.pt2px){c.pt2px=this.pt2px}if(this.enableFontSupport){if(a.jqplot.support_canvas_text()){this._textRenderer=new a.jqplot.CanvasFontRenderer(c)}else{this._textRenderer=new a.jqplot.CanvasTextRenderer(c)}}else{this._textRenderer=new a.jqplot.CanvasTextRenderer(c)}};a.jqplot.CanvasAxisLabelRenderer.prototype.init=function(b){a.extend(true,this,b);this._textRenderer.init({fontSize:this.fontSize,fontWeight:this.fontWeight,fontStretch:this.fontStretch,fillStyle:this.textColor,angle:this.getAngleRad(),fontFamily:this.fontFamily})};a.jqplot.CanvasAxisLabelRenderer.prototype.getWidth=function(d){if(this._elem){return this._elem.outerWidth(true)}else{var f=this._textRenderer;var c=f.getWidth(d);var e=f.getHeight(d);var b=Math.abs(Math.sin(f.angle)*e)+Math.abs(Math.cos(f.angle)*c);return b}};a.jqplot.CanvasAxisLabelRenderer.prototype.getHeight=function(d){if(this._elem){return this._elem.outerHeight(true)}else{var f=this._textRenderer;var c=f.getWidth(d);var e=f.getHeight(d);var b=Math.abs(Math.cos(f.angle)*e)+Math.abs(Math.sin(f.angle)*c);return b}};a.jqplot.CanvasAxisLabelRenderer.prototype.getAngleRad=function(){var b=this.angle*Math.PI/180;return b};a.jqplot.CanvasAxisLabelRenderer.prototype.draw=function(c,f){if(this._elem){if(a.jqplot.use_excanvas&&window.G_vmlCanvasManager.uninitElement!==undefined){window.G_vmlCanvasManager.uninitElement(this._elem.get(0))}this._elem.emptyForce();this._elem=null}var e=f.canvasManager.getCanvas();this._textRenderer.setText(this.label,c);var b=this.getWidth(c);var d=this.getHeight(c);e.width=b;e.height=d;e.style.width=b;e.style.height=d;e=f.canvasManager.initCanvas(e);this._elem=a(e);this._elem.css({position:"absolute"});this._elem.addClass("jqplot-"+this.axis+"-label");e=null;return this._elem};a.jqplot.CanvasAxisLabelRenderer.prototype.pack=function(){this._textRenderer.draw(this._elem.get(0).getContext("2d"),this.label)}})(jQuery); \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/plugins/jqplot.canvasAxisTickRenderer.js b/libreplan-webapp/src/main/webapp/jqplot/plugins/jqplot.canvasAxisTickRenderer.js new file mode 100644 index 000000000..472342677 --- /dev/null +++ b/libreplan-webapp/src/main/webapp/jqplot/plugins/jqplot.canvasAxisTickRenderer.js @@ -0,0 +1,242 @@ +/** + * jqPlot + * Pure JavaScript plotting plugin using jQuery + * + * Version: 1.0.0b2_r1012 + * + * Copyright (c) 2009-2011 Chris Leonello + * jqPlot is currently available for use in all personal or commercial projects + * under both the MIT (http://www.opensource.org/licenses/mit-license.php) and GPL + * version 2.0 (http://www.gnu.org/licenses/gpl-2.0.html) licenses. This means that you can + * choose the license that best suits your project and use it accordingly. + * + * Although not required, the author would appreciate an email letting him + * know of any substantial use of jqPlot. You can reach the author at: + * chris at jqplot dot com or see http://www.jqplot.com/info.php . + * + * If you are feeling kind and generous, consider supporting the project by + * making a donation at: http://www.jqplot.com/donate.php . + * + * sprintf functions contained in jqplot.sprintf.js by Ash Searle: + * + * version 2007.04.27 + * author Ash Searle + * http://hexmen.com/blog/2007/03/printf-sprintf/ + * http://hexmen.com/js/sprintf.js + * The author (Ash Searle) has placed this code in the public domain: + * "This code is unrestricted: you are free to use it however you like." + * + */ +(function($) { + /** + * Class: $.jqplot.CanvasAxisTickRenderer + * Renderer to draw axis ticks with a canvas element to support advanced + * featrues such as rotated text. This renderer uses a separate rendering engine + * to draw the text on the canvas. Two modes of rendering the text are available. + * If the browser has native font support for canvas fonts (currently Mozila 3.5 + * and Safari 4), you can enable text rendering with the canvas fillText method. + * You do so by setting the "enableFontSupport" option to true. + * + * Browsers lacking native font support will have the text drawn on the canvas + * using the Hershey font metrics. Even if the "enableFontSupport" option is true + * non-supporting browsers will still render with the Hershey font. + */ + $.jqplot.CanvasAxisTickRenderer = function(options) { + // Group: Properties + + // prop: mark + // tick mark on the axis. One of 'inside', 'outside', 'cross', '' or null. + this.mark = 'outside'; + // prop: showMark + // wether or not to show the mark on the axis. + this.showMark = true; + // prop: showGridline + // wether or not to draw the gridline on the grid at this tick. + this.showGridline = true; + // prop: isMinorTick + // if this is a minor tick. + this.isMinorTick = false; + // prop: angle + // angle of text, measured clockwise from x axis. + this.angle = 0; + // prop: markSize + // 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. + this.markSize = 4; + // prop: show + // wether or not to show the tick (mark and label). + this.show = true; + // prop: showLabel + // wether or not to show the label. + this.showLabel = true; + // prop: labelPosition + // 'auto', 'start', 'middle' or 'end'. + // Whether tick label should be positioned so the start, middle, or end + // of the tick mark. + this.labelPosition = 'auto'; + this.label = ''; + this.value = null; + this._styles = {}; + // prop: formatter + // A class of a formatter for the tick text. + // The default $.jqplot.DefaultTickFormatter uses sprintf. + this.formatter = $.jqplot.DefaultTickFormatter; + // prop: formatString + // string passed to the formatter. + this.formatString = ''; + // prop: prefix + // String to prepend to the tick label. + // Prefix is prepended to the formatted tick label. + this.prefix = ''; + // prop: fontFamily + // css spec for the font-family css attribute. + this.fontFamily = '"Trebuchet MS", Arial, Helvetica, sans-serif'; + // prop: fontSize + // CSS spec for font size. + this.fontSize = '10pt'; + // prop: fontWeight + // CSS spec for fontWeight + this.fontWeight = 'normal'; + // prop: fontStretch + // Multiplier to condense or expand font width. + // Applies only to browsers which don't support canvas native font rendering. + this.fontStretch = 1.0; + // prop: textColor + // css spec for the color attribute. + this.textColor = '#666666'; + // prop: enableFontSupport + // true to turn on native canvas font support in Mozilla 3.5+ and Safari 4+. + // If true, tick label will be drawn with canvas tag native support for fonts. + // If false, tick label will be drawn with Hershey font metrics. + this.enableFontSupport = true; + // prop: pt2px + // Point to pixel scaling factor, used for computing height of bounding box + // around a label. The labels text renderer has a default setting of 1.4, which + // should be suitable for most fonts. Leave as null to use default. If tops of + // letters appear clipped, increase this. If bounding box seems too big, decrease. + // This is an issue only with the native font renderering capabilities of Mozilla + // 3.5 and Safari 4 since they do not provide a method to determine the font height. + this.pt2px = null; + + this._elem; + this._ctx; + this._plotWidth; + this._plotHeight; + this._plotDimensions = {height:null, width:null}; + + $.extend(true, this, options); + + var ropts = {fontSize:this.fontSize, fontWeight:this.fontWeight, fontStretch:this.fontStretch, fillStyle:this.textColor, angle:this.getAngleRad(), fontFamily:this.fontFamily}; + if (this.pt2px) { + ropts.pt2px = this.pt2px; + } + + if (this.enableFontSupport) { + if ($.jqplot.support_canvas_text()) { + this._textRenderer = new $.jqplot.CanvasFontRenderer(ropts); + } + + else { + this._textRenderer = new $.jqplot.CanvasTextRenderer(ropts); + } + } + else { + this._textRenderer = new $.jqplot.CanvasTextRenderer(ropts); + } + }; + + $.jqplot.CanvasAxisTickRenderer.prototype.init = function(options) { + $.extend(true, this, options); + this._textRenderer.init({fontSize:this.fontSize, fontWeight:this.fontWeight, fontStretch:this.fontStretch, fillStyle:this.textColor, angle:this.getAngleRad(), fontFamily:this.fontFamily}); + }; + + // return width along the x axis + // will check first to see if an element exists. + // if not, will return the computed text box width. + $.jqplot.CanvasAxisTickRenderer.prototype.getWidth = function(ctx) { + if (this._elem) { + return this._elem.outerWidth(true); + } + else { + var tr = this._textRenderer; + var l = tr.getWidth(ctx); + var h = tr.getHeight(ctx); + var w = Math.abs(Math.sin(tr.angle)*h) + Math.abs(Math.cos(tr.angle)*l); + return w; + } + }; + + // return height along the y axis. + $.jqplot.CanvasAxisTickRenderer.prototype.getHeight = function(ctx) { + if (this._elem) { + return this._elem.outerHeight(true); + } + else { + var tr = this._textRenderer; + var l = tr.getWidth(ctx); + var h = tr.getHeight(ctx); + var w = Math.abs(Math.cos(tr.angle)*h) + Math.abs(Math.sin(tr.angle)*l); + return w; + } + }; + + $.jqplot.CanvasAxisTickRenderer.prototype.getAngleRad = function() { + var a = this.angle * Math.PI/180; + return a; + }; + + + $.jqplot.CanvasAxisTickRenderer.prototype.setTick = function(value, axisName, isMinor) { + this.value = value; + if (isMinor) { + this.isMinorTick = true; + } + return this; + }; + + $.jqplot.CanvasAxisTickRenderer.prototype.draw = function(ctx, plot) { + if (!this.label) { + this.label = this.prefix + this.formatter(this.formatString, this.value); + } + + // Memory Leaks patch + if (this._elem) { + if ($.jqplot.use_excanvas && window.G_vmlCanvasManager.uninitElement !== undefined) { + window.G_vmlCanvasManager.uninitElement(this._elem.get(0)); + } + + this._elem.emptyForce(); + this._elem = null; + } + + // create a canvas here, but can't draw on it untill it is appended + // to dom for IE compatability. + + var elem = plot.canvasManager.getCanvas(); + + this._textRenderer.setText(this.label, ctx); + var w = this.getWidth(ctx); + var h = this.getHeight(ctx); + // canvases seem to need to have width and heigh attributes directly set. + elem.width = w; + elem.height = h; + elem.style.width = w; + elem.style.height = h; + elem.style.textAlign = 'left'; + elem.style.position = 'absolute'; + + elem = plot.canvasManager.initCanvas(elem); + + this._elem = $(elem); + this._elem.css(this._styles); + this._elem.addClass('jqplot-'+this.axis+'-tick'); + + elem = null; + return this._elem; + }; + + $.jqplot.CanvasAxisTickRenderer.prototype.pack = function() { + this._textRenderer.draw(this._elem.get(0).getContext("2d"), this.label); + }; + +})(jQuery); \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/plugins/jqplot.canvasAxisTickRenderer.min.js b/libreplan-webapp/src/main/webapp/jqplot/plugins/jqplot.canvasAxisTickRenderer.min.js new file mode 100644 index 000000000..66d0219a2 --- /dev/null +++ b/libreplan-webapp/src/main/webapp/jqplot/plugins/jqplot.canvasAxisTickRenderer.min.js @@ -0,0 +1,57 @@ +/** + * jqPlot + * Pure JavaScript plotting plugin using jQuery + * + * Version: 1.0.0b2_r1012 + * + * Copyright (c) 2009-2011 Chris Leonello + * jqPlot is currently available for use in all personal or commercial projects + * under both the MIT (http://www.opensource.org/licenses/mit-license.php) and GPL + * version 2.0 (http://www.gnu.org/licenses/gpl-2.0.html) licenses. This means that you can + * choose the license that best suits your project and use it accordingly. + * + * Although not required, the author would appreciate an email letting him + * know of any substantial use of jqPlot. You can reach the author at: + * chris at jqplot dot com or see http://www.jqplot.com/info.php . + * + * If you are feeling kind and generous, consider supporting the project by + * making a donation at: http://www.jqplot.com/donate.php . + * + * sprintf functions contained in jqplot.sprintf.js by Ash Searle: + * + * version 2007.04.27 + * author Ash Searle + * http://hexmen.com/blog/2007/03/printf-sprintf/ + * http://hexmen.com/js/sprintf.js + * The author (Ash Searle) has placed this code in the public domain: + * "This code is unrestricted: you are free to use it however you like." + * + * included jsDate library by Chris Leonello: + * + * Copyright (c) 2010-2011 Chris Leonello + * + * jsDate is currently available for use in all personal or commercial projects + * under both the MIT and GPL version 2.0 licenses. This means that you can + * choose the license that best suits your project and use it accordingly. + * + * jsDate borrows many concepts and ideas from the Date Instance + * Methods by Ken Snyder along with some parts of Ken's actual code. + * + * Ken's origianl Date Instance Methods and copyright notice: + * + * Ken Snyder (ken d snyder at gmail dot com) + * 2008-09-10 + * version 2.0.2 (http://kendsnyder.com/sandbox/date/) + * Creative Commons Attribution License 3.0 (http://creativecommons.org/licenses/by/3.0/) + * + * jqplotToImage function based on Larry Siden's export-jqplot-to-png.js. + * Larry has generously given permission to adapt his code for inclusion + * into jqPlot. + * + * Larry's original code can be found here: + * + * https://github.com/lsiden/export-jqplot-to-png + * + * + */ +(function(a){a.jqplot.CanvasAxisTickRenderer=function(b){this.mark="outside";this.showMark=true;this.showGridline=true;this.isMinorTick=false;this.angle=0;this.markSize=4;this.show=true;this.showLabel=true;this.labelPosition="auto";this.label="";this.value=null;this._styles={};this.formatter=a.jqplot.DefaultTickFormatter;this.formatString="";this.prefix="";this.fontFamily='"Trebuchet MS", Arial, Helvetica, sans-serif';this.fontSize="10pt";this.fontWeight="normal";this.fontStretch=1;this.textColor="#666666";this.enableFontSupport=true;this.pt2px=null;this._elem;this._ctx;this._plotWidth;this._plotHeight;this._plotDimensions={height:null,width:null};a.extend(true,this,b);var c={fontSize:this.fontSize,fontWeight:this.fontWeight,fontStretch:this.fontStretch,fillStyle:this.textColor,angle:this.getAngleRad(),fontFamily:this.fontFamily};if(this.pt2px){c.pt2px=this.pt2px}if(this.enableFontSupport){if(a.jqplot.support_canvas_text()){this._textRenderer=new a.jqplot.CanvasFontRenderer(c)}else{this._textRenderer=new a.jqplot.CanvasTextRenderer(c)}}else{this._textRenderer=new a.jqplot.CanvasTextRenderer(c)}};a.jqplot.CanvasAxisTickRenderer.prototype.init=function(b){a.extend(true,this,b);this._textRenderer.init({fontSize:this.fontSize,fontWeight:this.fontWeight,fontStretch:this.fontStretch,fillStyle:this.textColor,angle:this.getAngleRad(),fontFamily:this.fontFamily})};a.jqplot.CanvasAxisTickRenderer.prototype.getWidth=function(d){if(this._elem){return this._elem.outerWidth(true)}else{var f=this._textRenderer;var c=f.getWidth(d);var e=f.getHeight(d);var b=Math.abs(Math.sin(f.angle)*e)+Math.abs(Math.cos(f.angle)*c);return b}};a.jqplot.CanvasAxisTickRenderer.prototype.getHeight=function(d){if(this._elem){return this._elem.outerHeight(true)}else{var f=this._textRenderer;var c=f.getWidth(d);var e=f.getHeight(d);var b=Math.abs(Math.cos(f.angle)*e)+Math.abs(Math.sin(f.angle)*c);return b}};a.jqplot.CanvasAxisTickRenderer.prototype.getAngleRad=function(){var b=this.angle*Math.PI/180;return b};a.jqplot.CanvasAxisTickRenderer.prototype.setTick=function(b,d,c){this.value=b;if(c){this.isMinorTick=true}return this};a.jqplot.CanvasAxisTickRenderer.prototype.draw=function(c,f){if(!this.label){this.label=this.prefix+this.formatter(this.formatString,this.value)}if(this._elem){if(a.jqplot.use_excanvas&&window.G_vmlCanvasManager.uninitElement!==undefined){window.G_vmlCanvasManager.uninitElement(this._elem.get(0))}this._elem.emptyForce();this._elem=null}var e=f.canvasManager.getCanvas();this._textRenderer.setText(this.label,c);var b=this.getWidth(c);var d=this.getHeight(c);e.width=b;e.height=d;e.style.width=b;e.style.height=d;e.style.textAlign="left";e.style.position="absolute";e=f.canvasManager.initCanvas(e);this._elem=a(e);this._elem.css(this._styles);this._elem.addClass("jqplot-"+this.axis+"-tick");e=null;return this._elem};a.jqplot.CanvasAxisTickRenderer.prototype.pack=function(){this._textRenderer.draw(this._elem.get(0).getContext("2d"),this.label)}})(jQuery); \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/plugins/jqplot.canvasOverlay.js b/libreplan-webapp/src/main/webapp/jqplot/plugins/jqplot.canvasOverlay.js new file mode 100644 index 000000000..d78869dbe --- /dev/null +++ b/libreplan-webapp/src/main/webapp/jqplot/plugins/jqplot.canvasOverlay.js @@ -0,0 +1,864 @@ +/** + * jqPlot + * Pure JavaScript plotting plugin using jQuery + * + * Version: 1.0.0b2_r1012 + * + * Copyright (c) 2009-2011 Chris Leonello + * jqPlot is currently available for use in all personal or commercial projects + * under both the MIT (http://www.opensource.org/licenses/mit-license.php) and GPL + * version 2.0 (http://www.gnu.org/licenses/gpl-2.0.html) licenses. This means that you can + * choose the license that best suits your project and use it accordingly. + * + * Although not required, the author would appreciate an email letting him + * know of any substantial use of jqPlot. You can reach the author at: + * chris at jqplot dot com or see http://www.jqplot.com/info.php . + * + * If you are feeling kind and generous, consider supporting the project by + * making a donation at: http://www.jqplot.com/donate.php . + * + * sprintf functions contained in jqplot.sprintf.js by Ash Searle: + * + * version 2007.04.27 + * author Ash Searle + * http://hexmen.com/blog/2007/03/printf-sprintf/ + * http://hexmen.com/js/sprintf.js + * The author (Ash Searle) has placed this code in the public domain: + * "This code is unrestricted: you are free to use it however you like." + * + */ +(function($) { + var objCounter = 0; + // class: $.jqplot.CanvasOverlay + $.jqplot.CanvasOverlay = function(opts){ + var options = opts || {}; + this.options = { + show: $.jqplot.config.enablePlugins, + deferDraw: false + }; + // prop: objects + this.objects = []; + this.objectNames = []; + this.canvas = null; + this.markerRenderer = new $.jqplot.MarkerRenderer({style:'line'}); + this.markerRenderer.init(); + this.highlightObjectIndex = null; + if (options.objects) { + var objs = options.objects, + obj; + for (var i=0; i<objs.length; i++) { + obj = objs[i]; + for (var n in obj) { + switch (n) { + case 'line': + this.addLine(obj[n]); + break; + case 'horizontalLine': + this.addHorizontalLine(obj[n]); + break; + case 'dashedHorizontalLine': + this.addDashedHorizontalLine(obj[n]); + break; + case 'verticalLine': + this.addVerticalLine(obj[n]); + break; + case 'dashedVerticalLine': + this.addDashedVerticalLine(obj[n]); + break; + default: + break; + } + } + } + } + $.extend(true, this.options, options); + }; + + // called with scope of a plot object + $.jqplot.CanvasOverlay.postPlotInit = function (target, data, opts) { + var options = opts || {}; + // add a canvasOverlay attribute to the plot + this.plugins.canvasOverlay = new $.jqplot.CanvasOverlay(options.canvasOverlay); + }; + + + function LineBase() { + this.uid = null; + this.type = null; + this.gridStart = null; + this.gridStop = null; + this.tooltipWidthFactor = 0; + this.options = { + // prop: name + // Optional name for the overlay object. + // Can be later used to retrieve the object by name. + name: null, + // prop: show + // true to show (draw), false to not draw. + show: true, + // prop: lineWidth + // Width of the line. + lineWidth: 2, + // prop: lineCap + // Type of ending placed on the line ['round', 'butt', 'square'] + lineCap: 'round', + // prop: color + // color of the line + color: '#666666', + // prop: shadow + // wether or not to draw a shadow on the line + shadow: true, + // prop: shadowAngle + // Shadow angle in degrees + shadowAngle: 45, + // prop: shadowOffset + // Shadow offset from line in pixels + shadowOffset: 1, + // prop: shadowDepth + // Number of times shadow is stroked, each stroke offset shadowOffset from the last. + shadowDepth: 3, + // prop: shadowAlpha + // Alpha channel transparency of shadow. 0 = transparent. + shadowAlpha: '0.07', + // prop: xaxis + // X axis to use for positioning/scaling the line. + xaxis: 'xaxis', + // prop: yaxis + // Y axis to use for positioning/scaling the line. + yaxis: 'yaxis', + // prop: showTooltip + // Show a tooltip with data point values. + showTooltip: false, + // prop: showTooltipPrecision + // Controls how close to line cursor must be to show tooltip. + // Higher number = closer to line, lower number = farther from line. + // 1.0 = cursor must be over line. + showTooltipPrecision: 0.6, + // prop: tooltipLocation + // Where to position tooltip, 'n', 'ne', 'e', 'se', 's', 'sw', 'w', 'nw' + tooltipLocation: 'nw', + // prop: fadeTooltip + // true = fade in/out tooltip, flase = show/hide tooltip + fadeTooltip: true, + // prop: tooltipFadeSpeed + // 'slow', 'def', 'fast', or number of milliseconds. + tooltipFadeSpeed: "fast", + // prop: tooltipOffset + // Pixel offset of tooltip from the highlight. + tooltipOffset: 4, + // prop: tooltipFormatString + // Format string passed the x and y values of the cursor on the line. + // e.g., 'Dogs: %.2f, Cats: %d'. + tooltipFormatString: '%d, %d' + }; + } + + /** + * Class: Line + * A straight line. + */ + function Line(options) { + LineBase.call(this); + this.type = 'line'; + var opts = { + // prop: start + // [x, y] coordinates for the start of the line. + start: [], + // prop: stop + // [x, y] coordinates for the end of the line. + stop: [] + }; + $.extend(true, this.options, opts, options); + + if (this.options.showTooltipPrecision < 0.01) { + this.options.showTooltipPrecision = 0.01; + } + } + + Line.prototype = new LineBase(); + Line.prototype.constructor = Line; + + + /** + * Class: HorizontalLine + * A straight horizontal line. + */ + function HorizontalLine(options) { + LineBase.call(this); + this.type = 'horizontalLine'; + var opts = { + // prop: y + // y value to position the line + y: null, + // prop: xmin + // x value for the start of the line, null to scale to axis min. + xmin: null, + // prop: xmax + // x value for the end of the line, null to scale to axis max. + xmax: null, + // prop xOffset + // offset ends of the line inside the grid. Number + xOffset: '6px', // number or string. Number interpreted as units, string as pixels. + xminOffset: null, + xmaxOffset: null + }; + $.extend(true, this.options, opts, options); + + if (this.options.showTooltipPrecision < 0.01) { + this.options.showTooltipPrecision = 0.01; + } + } + + HorizontalLine.prototype = new LineBase(); + HorizontalLine.prototype.constructor = HorizontalLine; + + + /** + * Class: DashedHorizontalLine + * A straight dashed horizontal line. + */ + function DashedHorizontalLine(options) { + LineBase.call(this); + this.type = 'dashedHorizontalLine'; + var opts = { + y: null, + xmin: null, + xmax: null, + xOffset: '6px', // number or string. Number interpreted as units, string as pixels. + xminOffset: null, + xmaxOffset: null, + // prop: dashPattern + // Array of line, space settings in pixels. + // Default is 8 pixel of line, 8 pixel of space. + // Note, limit to a 2 element array b/c of bug with higher order arrays. + dashPattern: [8,8] + }; + $.extend(true, this.options, opts, options); + + if (this.options.showTooltipPrecision < 0.01) { + this.options.showTooltipPrecision = 0.01; + } + } + + DashedHorizontalLine.prototype = new LineBase(); + DashedHorizontalLine.prototype.constructor = DashedHorizontalLine; + + + /** + * Class: VerticalLine + * A straight vertical line. + */ + function VerticalLine(options) { + LineBase.call(this); + this.type = 'verticalLine'; + var opts = { + x: null, + ymin: null, + ymax: null, + yOffset: '6px', // number or string. Number interpreted as units, string as pixels. + yminOffset: null, + ymaxOffset: null + }; + $.extend(true, this.options, opts, options); + + if (this.options.showTooltipPrecision < 0.01) { + this.options.showTooltipPrecision = 0.01; + } + } + + VerticalLine.prototype = new LineBase(); + VerticalLine.prototype.constructor = VerticalLine; + + + /** + * Class: DashedVerticalLine + * A straight dashed vertical line. + */ + function DashedVerticalLine(options) { + LineBase.call(this); + this.type = 'dashedVerticalLine'; + this.start = null; + this.stop = null; + var opts = { + x: null, + ymin: null, + ymax: null, + yOffset: '6px', // number or string. Number interpreted as units, string as pixels. + yminOffset: null, + ymaxOffset: null, + // prop: dashPattern + // Array of line, space settings in pixels. + // Default is 8 pixel of line, 8 pixel of space. + // Note, limit to a 2 element array b/c of bug with higher order arrays. + dashPattern: [8,8] + }; + $.extend(true, this.options, opts, options); + + if (this.options.showTooltipPrecision < 0.01) { + this.options.showTooltipPrecision = 0.01; + } + } + + DashedVerticalLine.prototype = new LineBase(); + DashedVerticalLine.prototype.constructor = DashedVerticalLine; + + $.jqplot.CanvasOverlay.prototype.addLine = function(opts) { + var line = new Line(opts); + line.uid = objCounter++; + this.objects.push(line); + this.objectNames.push(line.options.name); + }; + + $.jqplot.CanvasOverlay.prototype.addHorizontalLine = function(opts) { + var line = new HorizontalLine(opts); + line.uid = objCounter++; + this.objects.push(line); + this.objectNames.push(line.options.name); + }; + + $.jqplot.CanvasOverlay.prototype.addDashedHorizontalLine = function(opts) { + var line = new DashedHorizontalLine(opts); + line.uid = objCounter++; + this.objects.push(line); + this.objectNames.push(line.options.name); + }; + + $.jqplot.CanvasOverlay.prototype.addVerticalLine = function(opts) { + var line = new VerticalLine(opts); + line.uid = objCounter++; + this.objects.push(line); + this.objectNames.push(line.options.name); + }; + + $.jqplot.CanvasOverlay.prototype.addDashedVerticalLine = function(opts) { + var line = new DashedVerticalLine(opts); + line.uid = objCounter++; + this.objects.push(line); + this.objectNames.push(line.options.name); + }; + + $.jqplot.CanvasOverlay.prototype.removeObject = function(idx) { + // check if integer, remove by index + if ($.type(idx) == 'number') { + this.objects.splice(idx, 1); + this.objectNames.splice(idx, 1); + } + // if string, remove by name + else { + var id = $.inArray(idx, this.objectNames); + if (id != -1) { + this.objects.splice(id, 1); + this.objectNames.splice(id, 1); + } + } + }; + + $.jqplot.CanvasOverlay.prototype.getObject = function(idx) { + // check if integer, remove by index + if ($.type(idx) == 'number') { + return this.objects[idx]; + } + // if string, remove by name + else { + var id = $.inArray(idx, this.objectNames); + if (id != -1) { + return this.objects[id]; + } + } + }; + + // Set get as alias for getObject. + $.jqplot.CanvasOverlay.prototype.get = $.jqplot.CanvasOverlay.prototype.getObject; + + $.jqplot.CanvasOverlay.prototype.clear = function(plot) { + this.canvas._ctx.clearRect(0,0,this.canvas.getWidth(), this.canvas.getHeight()); + }; + + $.jqplot.CanvasOverlay.prototype.draw = function(plot) { + var obj, + objs = this.objects, + mr = this.markerRenderer, + start, + stop; + if (this.options.show) { + this.canvas._ctx.clearRect(0,0,this.canvas.getWidth(), this.canvas.getHeight()); + for (var k=0; k<objs.length; k++) { + obj = objs[k]; + var opts = $.extend(true, {}, obj.options); + if (obj.options.show) { + // style and shadow properties should be set before + // every draw of marker renderer. + mr.shadow = obj.options.shadow; + obj.tooltipWidthFactor = obj.options.lineWidth / obj.options.showTooltipPrecision; + switch (obj.type) { + case 'line': + // style and shadow properties should be set before + // every draw of marker renderer. + mr.style = 'line'; + opts.closePath = false; + start = [plot.axes[obj.options.xaxis].series_u2p(obj.options.start[0]), plot.axes[obj.options.yaxis].series_u2p(obj.options.start[1])]; + stop = [plot.axes[obj.options.xaxis].series_u2p(obj.options.stop[0]), plot.axes[obj.options.yaxis].series_u2p(obj.options.stop[1])]; + obj.gridStart = start; + obj.gridStop = stop; + mr.draw(start, stop, this.canvas._ctx, opts); + break; + case 'horizontalLine': + + // style and shadow properties should be set before + // every draw of marker renderer. + if (obj.options.y != null) { + mr.style = 'line'; + opts.closePath = false; + var xaxis = plot.axes[obj.options.xaxis], + xstart, + xstop, + y = plot.axes[obj.options.yaxis].series_u2p(obj.options.y), + xminoff = obj.options.xminOffset || obj.options.xOffset, + xmaxoff = obj.options.xmaxOffset || obj.options.xOffset; + if (obj.options.xmin != null) { + xstart = xaxis.series_u2p(obj.options.xmin); + } + else if (xminoff != null) { + if ($.type(xminoff) == "number") { + xstart = xaxis.series_u2p(xaxis.min + xminoff); + } + else if ($.type(xminoff) == "string") { + xstart = xaxis.series_u2p(xaxis.min) + parseFloat(xminoff); + } + } + if (obj.options.xmax != null) { + xstop = xaxis.series_u2p(obj.options.xmax); + } + else if (xmaxoff != null) { + if ($.type(xmaxoff) == "number") { + xstop = xaxis.series_u2p(xaxis.max - xmaxoff); + } + else if ($.type(xmaxoff) == "string") { + xstop = xaxis.series_u2p(xaxis.max) - parseFloat(xmaxoff); + } + } + if (xstop != null && xstart != null) { + obj.gridStart = [xstart, y]; + obj.gridStop = [xstop, y]; + mr.draw([xstart, y], [xstop, y], this.canvas._ctx, opts); + } + } + break; + + case 'dashedHorizontalLine': + + var dashPat = obj.options.dashPattern; + var dashPatLen = 0; + for (var i=0; i<dashPat.length; i++) { + dashPatLen += dashPat[i]; + } + + // style and shadow properties should be set before + // every draw of marker renderer. + if (obj.options.y != null) { + mr.style = 'line'; + opts.closePath = false; + var xaxis = plot.axes[obj.options.xaxis], + xstart, + xstop, + y = plot.axes[obj.options.yaxis].series_u2p(obj.options.y), + xminoff = obj.options.xminOffset || obj.options.xOffset, + xmaxoff = obj.options.xmaxOffset || obj.options.xOffset; + if (obj.options.xmin != null) { + xstart = xaxis.series_u2p(obj.options.xmin); + } + else if (xminoff != null) { + if ($.type(xminoff) == "number") { + xstart = xaxis.series_u2p(xaxis.min + xminoff); + } + else if ($.type(xminoff) == "string") { + xstart = xaxis.series_u2p(xaxis.min) + parseFloat(xminoff); + } + } + if (obj.options.xmax != null) { + xstop = xaxis.series_u2p(obj.options.xmax); + } + else if (xmaxoff != null) { + if ($.type(xmaxoff) == "number") { + xstop = xaxis.series_u2p(xaxis.max - xmaxoff); + } + else if ($.type(xmaxoff) == "string") { + xstop = xaxis.series_u2p(xaxis.max) - parseFloat(xmaxoff); + } + } + if (xstop != null && xstart != null) { + obj.gridStart = [xstart, y]; + obj.gridStop = [xstop, y]; + var numDash = Math.ceil((xstop - xstart)/dashPatLen); + var b=xstart, e; + for (var i=0; i<numDash; i++) { + for (var j=0; j<dashPat.length; j+=2) { + e = b+dashPat[j]; + mr.draw([b, y], [e, y], this.canvas._ctx, opts); + b += dashPat[j]; + if (j < dashPat.length-1) { + b += dashPat[j+1]; + } + } + } + } + } + break; + + case 'verticalLine': + + // style and shadow properties should be set before + // every draw of marker renderer. + if (obj.options.x != null) { + mr.style = 'line'; + opts.closePath = false; + var yaxis = plot.axes[obj.options.yaxis], + ystart, + ystop, + x = plot.axes[obj.options.xaxis].series_u2p(obj.options.x), + yminoff = obj.options.yminOffset || obj.options.yOffset, + ymaxoff = obj.options.ymaxOffset || obj.options.yOffset; + if (obj.options.ymin != null) { + ystart = yaxis.series_u2p(obj.options.ymin); + } + else if (yminoff != null) { + if ($.type(yminoff) == "number") { + ystart = yaxis.series_u2p(yaxis.min - yminoff); + } + else if ($.type(yminoff) == "string") { + ystart = yaxis.series_u2p(yaxis.min) - parseFloat(yminoff); + } + } + if (obj.options.ymax != null) { + ystop = yaxis.series_u2p(obj.options.ymax); + } + else if (ymaxoff != null) { + if ($.type(ymaxoff) == "number") { + ystop = yaxis.series_u2p(yaxis.max + ymaxoff); + } + else if ($.type(ymaxoff) == "string") { + ystop = yaxis.series_u2p(yaxis.max) + parseFloat(ymaxoff); + } + } + if (ystop != null && ystart != null) { + obj.gridStart = [x, ystart]; + obj.gridStop = [x, ystop]; + mr.draw([x, ystart], [x, ystop], this.canvas._ctx, opts); + } + } + break; + + case 'dashedVerticalLine': + + var dashPat = obj.options.dashPattern; + var dashPatLen = 0; + for (var i=0; i<dashPat.length; i++) { + dashPatLen += dashPat[i]; + } + + // style and shadow properties should be set before + // every draw of marker renderer. + if (obj.options.x != null) { + mr.style = 'line'; + opts.closePath = false; + var yaxis = plot.axes[obj.options.yaxis], + ystart, + ystop, + x = plot.axes[obj.options.xaxis].series_u2p(obj.options.x), + yminoff = obj.options.yminOffset || obj.options.yOffset, + ymaxoff = obj.options.ymaxOffset || obj.options.yOffset; + if (obj.options.ymin != null) { + ystart = yaxis.series_u2p(obj.options.ymin); + } + else if (yminoff != null) { + if ($.type(yminoff) == "number") { + ystart = yaxis.series_u2p(yaxis.min - yminoff); + } + else if ($.type(yminoff) == "string") { + ystart = yaxis.series_u2p(yaxis.min) - parseFloat(yminoff); + } + } + if (obj.options.ymax != null) { + ystop = yaxis.series_u2p(obj.options.ymax); + } + else if (ymaxoff != null) { + if ($.type(ymaxoff) == "number") { + ystop = yaxis.series_u2p(yaxis.max + ymaxoff); + } + else if ($.type(ymaxoff) == "string") { + ystop = yaxis.series_u2p(yaxis.max) + parseFloat(ymaxoff); + } + } + + + if (ystop != null && ystart != null) { + obj.gridStart = [x, ystart]; + obj.gridStop = [x, ystop]; + var numDash = Math.ceil((ystart - ystop)/dashPatLen); + var firstDashAdjust = ((numDash * dashPatLen) - (ystart - ystop))/2.0; + var b=ystart, e, bs, es; + for (var i=0; i<numDash; i++) { + for (var j=0; j<dashPat.length; j+=2) { + e = b - dashPat[j]; + if (e < ystop) { + e = ystop; + } + if (b < ystop) { + b = ystop; + } + // es = e; + // if (i == 0) { + // es += firstDashAdjust; + // } + mr.draw([x, b], [x, e], this.canvas._ctx, opts); + b -= dashPat[j]; + if (j < dashPat.length-1) { + b -= dashPat[j+1]; + } + } + } + } + } + break; + + default: + break; + } + } + } + } + }; + + // called within context of plot + // create a canvas which we can draw on. + // insert it before the eventCanvas, so eventCanvas will still capture events. + $.jqplot.CanvasOverlay.postPlotDraw = function() { + var co = this.plugins.canvasOverlay; + // Memory Leaks patch + if (co && co.highlightCanvas) { + co.highlightCanvas.resetCanvas(); + co.highlightCanvas = null; + } + co.canvas = new $.jqplot.GenericCanvas(); + + this.eventCanvas._elem.before(co.canvas.createElement(this._gridPadding, 'jqplot-overlayCanvas-canvas', this._plotDimensions, this)); + co.canvas.setContext(); + if (!co.deferDraw) { + co.draw(this); + } + + var elem = document.createElement('div'); + co._tooltipElem = $(elem); + elem = null; + co._tooltipElem.addClass('jqplot-canvasOverlay-tooltip'); + co._tooltipElem.css({position:'absolute', display:'none'}); + + this.eventCanvas._elem.before(co._tooltipElem); + this.eventCanvas._elem.bind('mouseleave', { elem: co._tooltipElem }, function (ev) { ev.data.elem.hide(); }); + + var co = null; + }; + + + function showTooltip(plot, obj, gridpos, datapos) { + var co = plot.plugins.canvasOverlay; + var elem = co._tooltipElem; + + var opts = obj.options, x, y; + + elem.html($.jqplot.sprintf(opts.tooltipFormatString, datapos[0], datapos[1])); + + switch (opts.tooltipLocation) { + case 'nw': + x = gridpos[0] + plot._gridPadding.left - elem.outerWidth(true) - opts.tooltipOffset; + y = gridpos[1] + plot._gridPadding.top - opts.tooltipOffset - elem.outerHeight(true); + break; + case 'n': + x = gridpos[0] + plot._gridPadding.left - elem.outerWidth(true)/2; + y = gridpos[1] + plot._gridPadding.top - opts.tooltipOffset - elem.outerHeight(true); + break; + case 'ne': + x = gridpos[0] + plot._gridPadding.left + opts.tooltipOffset; + y = gridpos[1] + plot._gridPadding.top - opts.tooltipOffset - elem.outerHeight(true); + break; + case 'e': + x = gridpos[0] + plot._gridPadding.left + opts.tooltipOffset; + y = gridpos[1] + plot._gridPadding.top - elem.outerHeight(true)/2; + break; + case 'se': + x = gridpos[0] + plot._gridPadding.left + opts.tooltipOffset; + y = gridpos[1] + plot._gridPadding.top + opts.tooltipOffset; + break; + case 's': + x = gridpos[0] + plot._gridPadding.left - elem.outerWidth(true)/2; + y = gridpos[1] + plot._gridPadding.top + opts.tooltipOffset; + break; + case 'sw': + x = gridpos[0] + plot._gridPadding.left - elem.outerWidth(true) - opts.tooltipOffset; + y = gridpos[1] + plot._gridPadding.top + opts.tooltipOffset; + break; + case 'w': + x = gridpos[0] + plot._gridPadding.left - elem.outerWidth(true) - opts.tooltipOffset; + y = gridpos[1] + plot._gridPadding.top - elem.outerHeight(true)/2; + break; + default: // same as 'nw' + x = gridpos[0] + plot._gridPadding.left - elem.outerWidth(true) - opts.tooltipOffset; + y = gridpos[1] + plot._gridPadding.top - opts.tooltipOffset - elem.outerHeight(true); + break; + } + + elem.css('left', x); + elem.css('top', y); + if (opts.fadeTooltip) { + // Fix for stacked up animations. Thnanks Trevor! + elem.stop(true,true).fadeIn(opts.tooltipFadeSpeed); + } + else { + elem.show(); + } + elem = null; + } + + + function isNearLine(point, lstart, lstop, width) { + // r is point to test, p and q are end points. + var rx = point[0]; + var ry = point[1]; + var px = Math.round(lstop[0]); + var py = Math.round(lstop[1]); + var qx = Math.round(lstart[0]); + var qy = Math.round(lstart[1]); + + var l = Math.sqrt(Math.pow(px-qx, 2) + Math.pow(py-qy, 2)); + + // scale error term by length of line. + var eps = width*l; + var res = Math.abs((qx-px) * (ry-py) - (qy-py) * (rx-px)); + var ret = (res < eps) ? true : false; + return ret; + } + + + function handleMove(ev, gridpos, datapos, neighbor, plot) { + var co = plot.plugins.canvasOverlay; + var objs = co.objects; + var l = objs.length; + var obj, haveHighlight=false; + var elem; + for (var i=0; i<l; i++) { + obj = objs[i]; + if (obj.options.showTooltip) { + var n = isNearLine([gridpos.x, gridpos.y], obj.gridStart, obj.gridStop, obj.tooltipWidthFactor); + datapos = [plot.axes[obj.options.xaxis].series_p2u(gridpos.x), plot.axes[obj.options.yaxis].series_p2u(gridpos.y)]; + + // cases: + // near line, no highlighting + // near line, highliting on this line + // near line, highlighting another line + // not near any line, highlighting + // not near any line, no highlighting + + // near line, not currently highlighting + if (n && co.highlightObjectIndex == null) { + switch (obj.type) { + case 'line': + showTooltip(plot, obj, [gridpos.x, gridpos.y], datapos); + break; + + case 'horizontalLine': + case 'dashedHorizontalLine': + showTooltip(plot, obj, [gridpos.x, obj.gridStart[1]], [datapos[0], obj.options.y]); + break; + + case 'verticalLine': + case 'dashedVerticalLine': + showTooltip(plot, obj, [obj.gridStart[0], gridpos.y], [obj.options.x, datapos[1]]); + break; + default: + break; + } + co.highlightObjectIndex = i; + haveHighlight = true; + break; + } + + // near line, highlighting another line. + else if (n && co.highlightObjectIndex !== i) { + // turn off tooltip. + elem = co._tooltipElem; + if (obj.fadeTooltip) { + elem.fadeOut(obj.tooltipFadeSpeed); + } + else { + elem.hide(); + } + + // turn on right tooltip. + switch (obj.type) { + case 'line': + showTooltip(plot, obj, [gridpos.x, gridpos.y], datapos); + break; + + case 'horizontalLine': + case 'dashedHorizontalLine': + showTooltip(plot, obj, [gridpos.x, obj.gridStart[1]], [datapos[0], obj.options.y]); + break; + + case 'verticalLine': + case 'dashedVerticalLine': + showTooltip(plot, obj, [obj.gridStart[0], gridpos.y], [obj.options.x, datapos[1]]); + break; + default: + break; + } + + co.highlightObjectIndex = i; + haveHighlight = true; + break; + } + + // near line, already highlighting this line, update + else if (n) { + switch (obj.type) { + case 'line': + showTooltip(plot, obj, [gridpos.x, gridpos.y], datapos); + break; + + case 'horizontalLine': + case 'dashedHorizontalLine': + showTooltip(plot, obj, [gridpos.x, obj.gridStart[1]], [datapos[0], obj.options.y]); + break; + + case 'verticalLine': + case 'dashedVerticalLine': + showTooltip(plot, obj, [obj.gridStart[0], gridpos.y], [obj.options.x, datapos[1]]); + break; + default: + break; + } + + haveHighlight = true; + break; + } + } + } + + // check if we are highlighting and not near a line, turn it off. + if (!haveHighlight && co.highlightObjectIndex !== null) { + elem = co._tooltipElem; + obj = co.getObject(co.highlightObjectIndex); + if (obj.fadeTooltip) { + elem.fadeOut(obj.tooltipFadeSpeed); + } + else { + elem.hide(); + } + co.highlightObjectIndex = null; + } + } + + $.jqplot.postInitHooks.push($.jqplot.CanvasOverlay.postPlotInit); + $.jqplot.postDrawHooks.push($.jqplot.CanvasOverlay.postPlotDraw); + $.jqplot.eventListenerHooks.push(['jqplotMouseMove', handleMove]); + +})(jQuery); \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/plugins/jqplot.canvasOverlay.min.js b/libreplan-webapp/src/main/webapp/jqplot/plugins/jqplot.canvasOverlay.min.js new file mode 100644 index 000000000..21814d3a9 --- /dev/null +++ b/libreplan-webapp/src/main/webapp/jqplot/plugins/jqplot.canvasOverlay.min.js @@ -0,0 +1,57 @@ +/** + * jqPlot + * Pure JavaScript plotting plugin using jQuery + * + * Version: 1.0.0b2_r1012 + * + * Copyright (c) 2009-2011 Chris Leonello + * jqPlot is currently available for use in all personal or commercial projects + * under both the MIT (http://www.opensource.org/licenses/mit-license.php) and GPL + * version 2.0 (http://www.gnu.org/licenses/gpl-2.0.html) licenses. This means that you can + * choose the license that best suits your project and use it accordingly. + * + * Although not required, the author would appreciate an email letting him + * know of any substantial use of jqPlot. You can reach the author at: + * chris at jqplot dot com or see http://www.jqplot.com/info.php . + * + * If you are feeling kind and generous, consider supporting the project by + * making a donation at: http://www.jqplot.com/donate.php . + * + * sprintf functions contained in jqplot.sprintf.js by Ash Searle: + * + * version 2007.04.27 + * author Ash Searle + * http://hexmen.com/blog/2007/03/printf-sprintf/ + * http://hexmen.com/js/sprintf.js + * The author (Ash Searle) has placed this code in the public domain: + * "This code is unrestricted: you are free to use it however you like." + * + * included jsDate library by Chris Leonello: + * + * Copyright (c) 2010-2011 Chris Leonello + * + * jsDate is currently available for use in all personal or commercial projects + * under both the MIT and GPL version 2.0 licenses. This means that you can + * choose the license that best suits your project and use it accordingly. + * + * jsDate borrows many concepts and ideas from the Date Instance + * Methods by Ken Snyder along with some parts of Ken's actual code. + * + * Ken's origianl Date Instance Methods and copyright notice: + * + * Ken Snyder (ken d snyder at gmail dot com) + * 2008-09-10 + * version 2.0.2 (http://kendsnyder.com/sandbox/date/) + * Creative Commons Attribution License 3.0 (http://creativecommons.org/licenses/by/3.0/) + * + * jqplotToImage function based on Larry Siden's export-jqplot-to-png.js. + * Larry has generously given permission to adapt his code for inclusion + * into jqPlot. + * + * Larry's original code can be found here: + * + * https://github.com/lsiden/export-jqplot-to-png + * + * + */ +(function(d){var f=0;d.jqplot.CanvasOverlay=function(o){var l=o||{};this.options={show:d.jqplot.config.enablePlugins,deferDraw:false};this.objects=[];this.objectNames=[];this.canvas=null;this.markerRenderer=new d.jqplot.MarkerRenderer({style:"line"});this.markerRenderer.init();this.highlightObjectIndex=null;if(l.objects){var q=l.objects,p;for(var m=0;m<q.length;m++){p=q[m];for(var r in p){switch(r){case"line":this.addLine(p[r]);break;case"horizontalLine":this.addHorizontalLine(p[r]);break;case"dashedHorizontalLine":this.addDashedHorizontalLine(p[r]);break;case"verticalLine":this.addVerticalLine(p[r]);break;case"dashedVerticalLine":this.addDashedVerticalLine(p[r]);break;default:break}}}}d.extend(true,this.options,l)};d.jqplot.CanvasOverlay.postPlotInit=function(o,n,m){var l=m||{};this.plugins.canvasOverlay=new d.jqplot.CanvasOverlay(l.canvasOverlay)};function h(){this.uid=null;this.type=null;this.gridStart=null;this.gridStop=null;this.tooltipWidthFactor=0;this.options={name:null,show:true,lineWidth:2,lineCap:"round",color:"#666666",shadow:true,shadowAngle:45,shadowOffset:1,shadowDepth:3,shadowAlpha:"0.07",xaxis:"xaxis",yaxis:"yaxis",showTooltip:false,showTooltipPrecision:0.6,tooltipLocation:"nw",fadeTooltip:true,tooltipFadeSpeed:"fast",tooltipOffset:4,tooltipFormatString:"%d, %d"}}function b(l){h.call(this);this.type="line";var m={start:[],stop:[]};d.extend(true,this.options,m,l);if(this.options.showTooltipPrecision<0.01){this.options.showTooltipPrecision=0.01}}b.prototype=new h();b.prototype.constructor=b;function e(l){h.call(this);this.type="horizontalLine";var m={y:null,xmin:null,xmax:null,xOffset:"6px",xminOffset:null,xmaxOffset:null};d.extend(true,this.options,m,l);if(this.options.showTooltipPrecision<0.01){this.options.showTooltipPrecision=0.01}}e.prototype=new h();e.prototype.constructor=e;function i(l){h.call(this);this.type="dashedHorizontalLine";var m={y:null,xmin:null,xmax:null,xOffset:"6px",xminOffset:null,xmaxOffset:null,dashPattern:[8,8]};d.extend(true,this.options,m,l);if(this.options.showTooltipPrecision<0.01){this.options.showTooltipPrecision=0.01}}i.prototype=new h();i.prototype.constructor=i;function c(l){h.call(this);this.type="verticalLine";var m={x:null,ymin:null,ymax:null,yOffset:"6px",yminOffset:null,ymaxOffset:null};d.extend(true,this.options,m,l);if(this.options.showTooltipPrecision<0.01){this.options.showTooltipPrecision=0.01}}c.prototype=new h();c.prototype.constructor=c;function k(l){h.call(this);this.type="dashedVerticalLine";this.start=null;this.stop=null;var m={x:null,ymin:null,ymax:null,yOffset:"6px",yminOffset:null,ymaxOffset:null,dashPattern:[8,8]};d.extend(true,this.options,m,l);if(this.options.showTooltipPrecision<0.01){this.options.showTooltipPrecision=0.01}}k.prototype=new h();k.prototype.constructor=k;d.jqplot.CanvasOverlay.prototype.addLine=function(m){var l=new b(m);l.uid=f++;this.objects.push(l);this.objectNames.push(l.options.name)};d.jqplot.CanvasOverlay.prototype.addHorizontalLine=function(m){var l=new e(m);l.uid=f++;this.objects.push(l);this.objectNames.push(l.options.name)};d.jqplot.CanvasOverlay.prototype.addDashedHorizontalLine=function(m){var l=new i(m);l.uid=f++;this.objects.push(l);this.objectNames.push(l.options.name)};d.jqplot.CanvasOverlay.prototype.addVerticalLine=function(m){var l=new c(m);l.uid=f++;this.objects.push(l);this.objectNames.push(l.options.name)};d.jqplot.CanvasOverlay.prototype.addDashedVerticalLine=function(m){var l=new k(m);l.uid=f++;this.objects.push(l);this.objectNames.push(l.options.name)};d.jqplot.CanvasOverlay.prototype.removeObject=function(l){if(d.type(l)=="number"){this.objects.splice(l,1);this.objectNames.splice(l,1)}else{var m=d.inArray(l,this.objectNames);if(m!=-1){this.objects.splice(m,1);this.objectNames.splice(m,1)}}};d.jqplot.CanvasOverlay.prototype.getObject=function(l){if(d.type(l)=="number"){return this.objects[l]}else{var m=d.inArray(l,this.objectNames);if(m!=-1){return this.objects[m]}}};d.jqplot.CanvasOverlay.prototype.get=d.jqplot.CanvasOverlay.prototype.getObject;d.jqplot.CanvasOverlay.prototype.clear=function(l){this.canvas._ctx.clearRect(0,0,this.canvas.getWidth(),this.canvas.getHeight())};d.jqplot.CanvasOverlay.prototype.draw=function(I){var w,t=this.objects,D=this.markerRenderer,q,E;if(this.options.show){this.canvas._ctx.clearRect(0,0,this.canvas.getWidth(),this.canvas.getHeight());for(var F=0;F<t.length;F++){w=t[F];var z=d.extend(true,{},w.options);if(w.options.show){D.shadow=w.options.shadow;w.tooltipWidthFactor=w.options.lineWidth/w.options.showTooltipPrecision;switch(w.type){case"line":D.style="line";z.closePath=false;q=[I.axes[w.options.xaxis].series_u2p(w.options.start[0]),I.axes[w.options.yaxis].series_u2p(w.options.start[1])];E=[I.axes[w.options.xaxis].series_u2p(w.options.stop[0]),I.axes[w.options.yaxis].series_u2p(w.options.stop[1])];w.gridStart=q;w.gridStop=E;D.draw(q,E,this.canvas._ctx,z);break;case"horizontalLine":if(w.options.y!=null){D.style="line";z.closePath=false;var n=I.axes[w.options.xaxis],Q,J,u=I.axes[w.options.yaxis].series_u2p(w.options.y),G=w.options.xminOffset||w.options.xOffset,r=w.options.xmaxOffset||w.options.xOffset;if(w.options.xmin!=null){Q=n.series_u2p(w.options.xmin)}else{if(G!=null){if(d.type(G)=="number"){Q=n.series_u2p(n.min+G)}else{if(d.type(G)=="string"){Q=n.series_u2p(n.min)+parseFloat(G)}}}}if(w.options.xmax!=null){J=n.series_u2p(w.options.xmax)}else{if(r!=null){if(d.type(r)=="number"){J=n.series_u2p(n.max-r)}else{if(d.type(r)=="string"){J=n.series_u2p(n.max)-parseFloat(r)}}}}if(J!=null&&Q!=null){w.gridStart=[Q,u];w.gridStop=[J,u];D.draw([Q,u],[J,u],this.canvas._ctx,z)}}break;case"dashedHorizontalLine":var m=w.options.dashPattern;var C=0;for(var K=0;K<m.length;K++){C+=m[K]}if(w.options.y!=null){D.style="line";z.closePath=false;var n=I.axes[w.options.xaxis],Q,J,u=I.axes[w.options.yaxis].series_u2p(w.options.y),G=w.options.xminOffset||w.options.xOffset,r=w.options.xmaxOffset||w.options.xOffset;if(w.options.xmin!=null){Q=n.series_u2p(w.options.xmin)}else{if(G!=null){if(d.type(G)=="number"){Q=n.series_u2p(n.min+G)}else{if(d.type(G)=="string"){Q=n.series_u2p(n.min)+parseFloat(G)}}}}if(w.options.xmax!=null){J=n.series_u2p(w.options.xmax)}else{if(r!=null){if(d.type(r)=="number"){J=n.series_u2p(n.max-r)}else{if(d.type(r)=="string"){J=n.series_u2p(n.max)-parseFloat(r)}}}}if(J!=null&&Q!=null){w.gridStart=[Q,u];w.gridStop=[J,u];var p=Math.ceil((J-Q)/C);var O=Q,M;for(var K=0;K<p;K++){for(var H=0;H<m.length;H+=2){M=O+m[H];D.draw([O,u],[M,u],this.canvas._ctx,z);O+=m[H];if(H<m.length-1){O+=m[H+1]}}}}}break;case"verticalLine":if(w.options.x!=null){D.style="line";z.closePath=false;var L=I.axes[w.options.yaxis],l,s,v=I.axes[w.options.xaxis].series_u2p(w.options.x),B=w.options.yminOffset||w.options.yOffset,o=w.options.ymaxOffset||w.options.yOffset;if(w.options.ymin!=null){l=L.series_u2p(w.options.ymin)}else{if(B!=null){if(d.type(B)=="number"){l=L.series_u2p(L.min-B)}else{if(d.type(B)=="string"){l=L.series_u2p(L.min)-parseFloat(B)}}}}if(w.options.ymax!=null){s=L.series_u2p(w.options.ymax)}else{if(o!=null){if(d.type(o)=="number"){s=L.series_u2p(L.max+o)}else{if(d.type(o)=="string"){s=L.series_u2p(L.max)+parseFloat(o)}}}}if(s!=null&&l!=null){w.gridStart=[v,l];w.gridStop=[v,s];D.draw([v,l],[v,s],this.canvas._ctx,z)}}break;case"dashedVerticalLine":var m=w.options.dashPattern;var C=0;for(var K=0;K<m.length;K++){C+=m[K]}if(w.options.x!=null){D.style="line";z.closePath=false;var L=I.axes[w.options.yaxis],l,s,v=I.axes[w.options.xaxis].series_u2p(w.options.x),B=w.options.yminOffset||w.options.yOffset,o=w.options.ymaxOffset||w.options.yOffset;if(w.options.ymin!=null){l=L.series_u2p(w.options.ymin)}else{if(B!=null){if(d.type(B)=="number"){l=L.series_u2p(L.min-B)}else{if(d.type(B)=="string"){l=L.series_u2p(L.min)-parseFloat(B)}}}}if(w.options.ymax!=null){s=L.series_u2p(w.options.ymax)}else{if(o!=null){if(d.type(o)=="number"){s=L.series_u2p(L.max+o)}else{if(d.type(o)=="string"){s=L.series_u2p(L.max)+parseFloat(o)}}}}if(s!=null&&l!=null){w.gridStart=[v,l];w.gridStop=[v,s];var p=Math.ceil((l-s)/C);var A=((p*C)-(l-s))/2;var O=l,M,N,P;for(var K=0;K<p;K++){for(var H=0;H<m.length;H+=2){M=O-m[H];if(M<s){M=s}if(O<s){O=s}D.draw([v,O],[v,M],this.canvas._ctx,z);O-=m[H];if(H<m.length-1){O-=m[H+1]}}}}}break;default:break}}}}};d.jqplot.CanvasOverlay.postPlotDraw=function(){var m=this.plugins.canvasOverlay;if(m&&m.highlightCanvas){m.highlightCanvas.resetCanvas();m.highlightCanvas=null}m.canvas=new d.jqplot.GenericCanvas();this.eventCanvas._elem.before(m.canvas.createElement(this._gridPadding,"jqplot-overlayCanvas-canvas",this._plotDimensions,this));m.canvas.setContext();if(!m.deferDraw){m.draw(this)}var l=document.createElement("div");m._tooltipElem=d(l);l=null;m._tooltipElem.addClass("jqplot-canvasOverlay-tooltip");m._tooltipElem.css({position:"absolute",display:"none"});this.eventCanvas._elem.before(m._tooltipElem);this.eventCanvas._elem.bind("mouseleave",{elem:m._tooltipElem},function(n){n.data.elem.hide()});var m=null};function j(q,o,p,n){var s=q.plugins.canvasOverlay;var m=s._tooltipElem;var l=o.options,t,r;m.html(d.jqplot.sprintf(l.tooltipFormatString,n[0],n[1]));switch(l.tooltipLocation){case"nw":t=p[0]+q._gridPadding.left-m.outerWidth(true)-l.tooltipOffset;r=p[1]+q._gridPadding.top-l.tooltipOffset-m.outerHeight(true);break;case"n":t=p[0]+q._gridPadding.left-m.outerWidth(true)/2;r=p[1]+q._gridPadding.top-l.tooltipOffset-m.outerHeight(true);break;case"ne":t=p[0]+q._gridPadding.left+l.tooltipOffset;r=p[1]+q._gridPadding.top-l.tooltipOffset-m.outerHeight(true);break;case"e":t=p[0]+q._gridPadding.left+l.tooltipOffset;r=p[1]+q._gridPadding.top-m.outerHeight(true)/2;break;case"se":t=p[0]+q._gridPadding.left+l.tooltipOffset;r=p[1]+q._gridPadding.top+l.tooltipOffset;break;case"s":t=p[0]+q._gridPadding.left-m.outerWidth(true)/2;r=p[1]+q._gridPadding.top+l.tooltipOffset;break;case"sw":t=p[0]+q._gridPadding.left-m.outerWidth(true)-l.tooltipOffset;r=p[1]+q._gridPadding.top+l.tooltipOffset;break;case"w":t=p[0]+q._gridPadding.left-m.outerWidth(true)-l.tooltipOffset;r=p[1]+q._gridPadding.top-m.outerHeight(true)/2;break;default:t=p[0]+q._gridPadding.left-m.outerWidth(true)-l.tooltipOffset;r=p[1]+q._gridPadding.top-l.tooltipOffset-m.outerHeight(true);break}m.css("left",t);m.css("top",r);if(l.fadeTooltip){m.stop(true,true).fadeIn(l.tooltipFadeSpeed)}else{m.show()}m=null}function g(y,p,r,o){var n=y[0];var m=y[1];var x=Math.round(r[0]);var w=Math.round(r[1]);var t=Math.round(p[0]);var s=Math.round(p[1]);var q=Math.sqrt(Math.pow(x-t,2)+Math.pow(w-s,2));var z=o*q;var v=Math.abs((t-x)*(m-w)-(s-w)*(n-x));var u=(v<z)?true:false;return u}function a(y,v,q,z,w){var x=w.plugins.canvasOverlay;var u=x.objects;var r=u.length;var t,m=false;var p;for(var s=0;s<r;s++){t=u[s];if(t.options.showTooltip){var o=g([v.x,v.y],t.gridStart,t.gridStop,t.tooltipWidthFactor);q=[w.axes[t.options.xaxis].series_p2u(v.x),w.axes[t.options.yaxis].series_p2u(v.y)];if(o&&x.highlightObjectIndex==null){switch(t.type){case"line":j(w,t,[v.x,v.y],q);break;case"horizontalLine":case"dashedHorizontalLine":j(w,t,[v.x,t.gridStart[1]],[q[0],t.options.y]);break;case"verticalLine":case"dashedVerticalLine":j(w,t,[t.gridStart[0],v.y],[t.options.x,q[1]]);break;default:break}x.highlightObjectIndex=s;m=true;break}else{if(o&&x.highlightObjectIndex!==s){p=x._tooltipElem;if(t.fadeTooltip){p.fadeOut(t.tooltipFadeSpeed)}else{p.hide()}switch(t.type){case"line":j(w,t,[v.x,v.y],q);break;case"horizontalLine":case"dashedHorizontalLine":j(w,t,[v.x,t.gridStart[1]],[q[0],t.options.y]);break;case"verticalLine":case"dashedVerticalLine":j(w,t,[t.gridStart[0],v.y],[t.options.x,q[1]]);break;default:break}x.highlightObjectIndex=s;m=true;break}else{if(o){switch(t.type){case"line":j(w,t,[v.x,v.y],q);break;case"horizontalLine":case"dashedHorizontalLine":j(w,t,[v.x,t.gridStart[1]],[q[0],t.options.y]);break;case"verticalLine":case"dashedVerticalLine":j(w,t,[t.gridStart[0],v.y],[t.options.x,q[1]]);break;default:break}m=true;break}}}}}if(!m&&x.highlightObjectIndex!==null){p=x._tooltipElem;t=x.getObject(x.highlightObjectIndex);if(t.fadeTooltip){p.fadeOut(t.tooltipFadeSpeed)}else{p.hide()}x.highlightObjectIndex=null}}d.jqplot.postInitHooks.push(d.jqplot.CanvasOverlay.postPlotInit);d.jqplot.postDrawHooks.push(d.jqplot.CanvasOverlay.postPlotDraw);d.jqplot.eventListenerHooks.push(["jqplotMouseMove",a])})(jQuery); \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/plugins/jqplot.canvasTextRenderer.js b/libreplan-webapp/src/main/webapp/jqplot/plugins/jqplot.canvasTextRenderer.js new file mode 100644 index 000000000..9e90c8c8f --- /dev/null +++ b/libreplan-webapp/src/main/webapp/jqplot/plugins/jqplot.canvasTextRenderer.js @@ -0,0 +1,448 @@ +/** + * jqPlot + * Pure JavaScript plotting plugin using jQuery + * + * Version: 1.0.0b2_r1012 + * + * Copyright (c) 2009-2011 Chris Leonello + * jqPlot is currently available for use in all personal or commercial projects + * under both the MIT (http://www.opensource.org/licenses/mit-license.php) and GPL + * version 2.0 (http://www.gnu.org/licenses/gpl-2.0.html) licenses. This means that you can + * choose the license that best suits your project and use it accordingly. + * + * Although not required, the author would appreciate an email letting him + * know of any substantial use of jqPlot. You can reach the author at: + * chris at jqplot dot com or see http://www.jqplot.com/info.php . + * + * If you are feeling kind and generous, consider supporting the project by + * making a donation at: http://www.jqplot.com/donate.php . + * + * sprintf functions contained in jqplot.sprintf.js by Ash Searle: + * + * version 2007.04.27 + * author Ash Searle + * http://hexmen.com/blog/2007/03/printf-sprintf/ + * http://hexmen.com/js/sprintf.js + * The author (Ash Searle) has placed this code in the public domain: + * "This code is unrestricted: you are free to use it however you like." + * + * included jsDate library by Chris Leonello: + * + * Copyright (c) 2010-2011 Chris Leonello + * + * jsDate is currently available for use in all personal or commercial projects + * under both the MIT and GPL version 2.0 licenses. This means that you can + * choose the license that best suits your project and use it accordingly. + * + * jsDate borrows many concepts and ideas from the Date Instance + * Methods by Ken Snyder along with some parts of Ken's actual code. + * + * Ken's origianl Date Instance Methods and copyright notice: + * + * Ken Snyder (ken d snyder at gmail dot com) + * 2008-09-10 + * version 2.0.2 (http://kendsnyder.com/sandbox/date/) + * Creative Commons Attribution License 3.0 (http://creativecommons.org/licenses/by/3.0/) + * + * jqplotToImage function based on Larry Siden's export-jqplot-to-png.js. + * Larry has generously given permission to adapt his code for inclusion + * into jqPlot. + * + * Larry's original code can be found here: + * + * https://github.com/lsiden/export-jqplot-to-png + * + * + */ + +(function($) { + // This code is a modified version of the canvastext.js code, copyright below: + // + // This code is released to the public domain by Jim Studt, 2007. + // He may keep some sort of up to date copy at http://www.federated.com/~jim/canvastext/ + // + $.jqplot.CanvasTextRenderer = function(options){ + this.fontStyle = 'normal'; // normal, italic, oblique [not implemented] + this.fontVariant = 'normal'; // normal, small caps [not implemented] + this.fontWeight = 'normal'; // normal, bold, bolder, lighter, 100 - 900 + this.fontSize = '10px'; + this.fontFamily = 'sans-serif'; + this.fontStretch = 1.0; + this.fillStyle = '#666666'; + this.angle = 0; + this.textAlign = 'start'; + this.textBaseline = 'alphabetic'; + this.text; + this.width; + this.height; + this.pt2px = 1.28; + + $.extend(true, this, options); + this.normalizedFontSize = this.normalizeFontSize(this.fontSize); + this.setHeight(); + }; + + $.jqplot.CanvasTextRenderer.prototype.init = function(options) { + $.extend(true, this, options); + this.normalizedFontSize = this.normalizeFontSize(this.fontSize); + this.setHeight(); + }; + + // convert css spec into point size + // returns float + $.jqplot.CanvasTextRenderer.prototype.normalizeFontSize = function(sz) { + sz = String(sz); + var n = parseFloat(sz); + if (sz.indexOf('px') > -1) { + return n/this.pt2px; + } + else if (sz.indexOf('pt') > -1) { + return n; + } + else if (sz.indexOf('em') > -1) { + return n*12; + } + else if (sz.indexOf('%') > -1) { + return n*12/100; + } + // default to pixels; + else { + return n/this.pt2px; + } + }; + + + $.jqplot.CanvasTextRenderer.prototype.fontWeight2Float = function(w) { + // w = normal | bold | bolder | lighter | 100 | 200 | 300 | 400 | 500 | 600 | 700 | 800 | 900 + // return values adjusted for Hershey font. + if (Number(w)) { + return w/400; + } + else { + switch (w) { + case 'normal': + return 1; + break; + case 'bold': + return 1.75; + break; + case 'bolder': + return 2.25; + break; + case 'lighter': + return 0.75; + break; + default: + return 1; + break; + } + } + }; + + $.jqplot.CanvasTextRenderer.prototype.getText = function() { + return this.text; + }; + + $.jqplot.CanvasTextRenderer.prototype.setText = function(t, ctx) { + this.text = t; + this.setWidth(ctx); + return this; + }; + + $.jqplot.CanvasTextRenderer.prototype.getWidth = function(ctx) { + return this.width; + }; + + $.jqplot.CanvasTextRenderer.prototype.setWidth = function(ctx, w) { + if (!w) { + this.width = this.measure(ctx, this.text); + } + else { + this.width = w; + } + return this; + }; + + // return height in pixels. + $.jqplot.CanvasTextRenderer.prototype.getHeight = function(ctx) { + return this.height; + }; + + // w - height in pt + // set heigh in px + $.jqplot.CanvasTextRenderer.prototype.setHeight = function(w) { + if (!w) { + //height = this.fontSize /0.75; + this.height = this.normalizedFontSize * this.pt2px; + } + else { + this.height = w; + } + return this; + }; + + $.jqplot.CanvasTextRenderer.prototype.letter = function (ch) + { + return this.letters[ch]; + }; + + $.jqplot.CanvasTextRenderer.prototype.ascent = function() + { + return this.normalizedFontSize; + }; + + $.jqplot.CanvasTextRenderer.prototype.descent = function() + { + return 7.0*this.normalizedFontSize/25.0; + }; + + $.jqplot.CanvasTextRenderer.prototype.measure = function(ctx, str) + { + var total = 0; + var len = str.length; + + for (var i = 0; i < len; i++) { + var c = this.letter(str.charAt(i)); + if (c) { + total += c.width * this.normalizedFontSize / 25.0 * this.fontStretch; + } + } + return total; + }; + + $.jqplot.CanvasTextRenderer.prototype.draw = function(ctx,str) + { + var x = 0; + // leave room at bottom for descenders. + var y = this.height*0.72; + var total = 0; + var len = str.length; + var mag = this.normalizedFontSize / 25.0; + + ctx.save(); + var tx, ty; + + // 1st quadrant + if ((-Math.PI/2 <= this.angle && this.angle <= 0) || (Math.PI*3/2 <= this.angle && this.angle <= Math.PI*2)) { + tx = 0; + ty = -Math.sin(this.angle) * this.width; + } + // 4th quadrant + else if ((0 < this.angle && this.angle <= Math.PI/2) || (-Math.PI*2 <= this.angle && this.angle <= -Math.PI*3/2)) { + tx = Math.sin(this.angle) * this.height; + ty = 0; + } + // 2nd quadrant + else if ((-Math.PI < this.angle && this.angle < -Math.PI/2) || (Math.PI <= this.angle && this.angle <= Math.PI*3/2)) { + tx = -Math.cos(this.angle) * this.width; + ty = -Math.sin(this.angle) * this.width - Math.cos(this.angle) * this.height; + } + // 3rd quadrant + else if ((-Math.PI*3/2 < this.angle && this.angle < Math.PI) || (Math.PI/2 < this.angle && this.angle < Math.PI)) { + tx = Math.sin(this.angle) * this.height - Math.cos(this.angle)*this.width; + ty = -Math.cos(this.angle) * this.height; + } + + ctx.strokeStyle = this.fillStyle; + ctx.fillStyle = this.fillStyle; + ctx.translate(tx, ty); + ctx.rotate(this.angle); + ctx.lineCap = "round"; + // multiplier was 2.0 + var fact = (this.normalizedFontSize > 30) ? 2.0 : 2 + (30 - this.normalizedFontSize)/20; + ctx.lineWidth = fact * mag * this.fontWeight2Float(this.fontWeight); + + for ( var i = 0; i < len; i++) { + var c = this.letter( str.charAt(i)); + if ( !c) { + continue; + } + + ctx.beginPath(); + + var penUp = 1; + var needStroke = 0; + for ( var j = 0; j < c.points.length; j++) { + var a = c.points[j]; + if ( a[0] == -1 && a[1] == -1) { + penUp = 1; + continue; + } + if ( penUp) { + ctx.moveTo( x + a[0]*mag*this.fontStretch, y - a[1]*mag); + penUp = false; + } else { + ctx.lineTo( x + a[0]*mag*this.fontStretch, y - a[1]*mag); + } + } + ctx.stroke(); + x += c.width*mag*this.fontStretch; + } + ctx.restore(); + return total; + }; + + $.jqplot.CanvasTextRenderer.prototype.letters = { + ' ': { width: 16, points: [] }, + '!': { width: 10, points: [[5,21],[5,7],[-1,-1],[5,2],[4,1],[5,0],[6,1],[5,2]] }, + '"': { width: 16, points: [[4,21],[4,14],[-1,-1],[12,21],[12,14]] }, + '#': { width: 21, points: [[11,25],[4,-7],[-1,-1],[17,25],[10,-7],[-1,-1],[4,12],[18,12],[-1,-1],[3,6],[17,6]] }, + '$': { width: 20, points: [[8,25],[8,-4],[-1,-1],[12,25],[12,-4],[-1,-1],[17,18],[15,20],[12,21],[8,21],[5,20],[3,18],[3,16],[4,14],[5,13],[7,12],[13,10],[15,9],[16,8],[17,6],[17,3],[15,1],[12,0],[8,0],[5,1],[3,3]] }, + '%': { width: 24, points: [[21,21],[3,0],[-1,-1],[8,21],[10,19],[10,17],[9,15],[7,14],[5,14],[3,16],[3,18],[4,20],[6,21],[8,21],[10,20],[13,19],[16,19],[19,20],[21,21],[-1,-1],[17,7],[15,6],[14,4],[14,2],[16,0],[18,0],[20,1],[21,3],[21,5],[19,7],[17,7]] }, + '&': { width: 26, points: [[23,12],[23,13],[22,14],[21,14],[20,13],[19,11],[17,6],[15,3],[13,1],[11,0],[7,0],[5,1],[4,2],[3,4],[3,6],[4,8],[5,9],[12,13],[13,14],[14,16],[14,18],[13,20],[11,21],[9,20],[8,18],[8,16],[9,13],[11,10],[16,3],[18,1],[20,0],[22,0],[23,1],[23,2]] }, + '\'': { width: 10, points: [[5,19],[4,20],[5,21],[6,20],[6,18],[5,16],[4,15]] }, + '(': { width: 14, points: [[11,25],[9,23],[7,20],[5,16],[4,11],[4,7],[5,2],[7,-2],[9,-5],[11,-7]] }, + ')': { width: 14, points: [[3,25],[5,23],[7,20],[9,16],[10,11],[10,7],[9,2],[7,-2],[5,-5],[3,-7]] }, + '*': { width: 16, points: [[8,21],[8,9],[-1,-1],[3,18],[13,12],[-1,-1],[13,18],[3,12]] }, + '+': { width: 26, points: [[13,18],[13,0],[-1,-1],[4,9],[22,9]] }, + ',': { width: 10, points: [[6,1],[5,0],[4,1],[5,2],[6,1],[6,-1],[5,-3],[4,-4]] }, + '-': { width: 18, points: [[6,9],[12,9]] }, + '.': { width: 10, points: [[5,2],[4,1],[5,0],[6,1],[5,2]] }, + '/': { width: 22, points: [[20,25],[2,-7]] }, + '0': { width: 20, points: [[9,21],[6,20],[4,17],[3,12],[3,9],[4,4],[6,1],[9,0],[11,0],[14,1],[16,4],[17,9],[17,12],[16,17],[14,20],[11,21],[9,21]] }, + '1': { width: 20, points: [[6,17],[8,18],[11,21],[11,0]] }, + '2': { width: 20, points: [[4,16],[4,17],[5,19],[6,20],[8,21],[12,21],[14,20],[15,19],[16,17],[16,15],[15,13],[13,10],[3,0],[17,0]] }, + '3': { width: 20, points: [[5,21],[16,21],[10,13],[13,13],[15,12],[16,11],[17,8],[17,6],[16,3],[14,1],[11,0],[8,0],[5,1],[4,2],[3,4]] }, + '4': { width: 20, points: [[13,21],[3,7],[18,7],[-1,-1],[13,21],[13,0]] }, + '5': { width: 20, points: [[15,21],[5,21],[4,12],[5,13],[8,14],[11,14],[14,13],[16,11],[17,8],[17,6],[16,3],[14,1],[11,0],[8,0],[5,1],[4,2],[3,4]] }, + '6': { width: 20, points: [[16,18],[15,20],[12,21],[10,21],[7,20],[5,17],[4,12],[4,7],[5,3],[7,1],[10,0],[11,0],[14,1],[16,3],[17,6],[17,7],[16,10],[14,12],[11,13],[10,13],[7,12],[5,10],[4,7]] }, + '7': { width: 20, points: [[17,21],[7,0],[-1,-1],[3,21],[17,21]] }, + '8': { width: 20, points: [[8,21],[5,20],[4,18],[4,16],[5,14],[7,13],[11,12],[14,11],[16,9],[17,7],[17,4],[16,2],[15,1],[12,0],[8,0],[5,1],[4,2],[3,4],[3,7],[4,9],[6,11],[9,12],[13,13],[15,14],[16,16],[16,18],[15,20],[12,21],[8,21]] }, + '9': { width: 20, points: [[16,14],[15,11],[13,9],[10,8],[9,8],[6,9],[4,11],[3,14],[3,15],[4,18],[6,20],[9,21],[10,21],[13,20],[15,18],[16,14],[16,9],[15,4],[13,1],[10,0],[8,0],[5,1],[4,3]] }, + ':': { width: 10, points: [[5,14],[4,13],[5,12],[6,13],[5,14],[-1,-1],[5,2],[4,1],[5,0],[6,1],[5,2]] }, + ';': { width: 10, points: [[5,14],[4,13],[5,12],[6,13],[5,14],[-1,-1],[6,1],[5,0],[4,1],[5,2],[6,1],[6,-1],[5,-3],[4,-4]] }, + '<': { width: 24, points: [[20,18],[4,9],[20,0]] }, + '=': { width: 26, points: [[4,12],[22,12],[-1,-1],[4,6],[22,6]] }, + '>': { width: 24, points: [[4,18],[20,9],[4,0]] }, + '?': { width: 18, points: [[3,16],[3,17],[4,19],[5,20],[7,21],[11,21],[13,20],[14,19],[15,17],[15,15],[14,13],[13,12],[9,10],[9,7],[-1,-1],[9,2],[8,1],[9,0],[10,1],[9,2]] }, + '@': { width: 27, points: [[18,13],[17,15],[15,16],[12,16],[10,15],[9,14],[8,11],[8,8],[9,6],[11,5],[14,5],[16,6],[17,8],[-1,-1],[12,16],[10,14],[9,11],[9,8],[10,6],[11,5],[-1,-1],[18,16],[17,8],[17,6],[19,5],[21,5],[23,7],[24,10],[24,12],[23,15],[22,17],[20,19],[18,20],[15,21],[12,21],[9,20],[7,19],[5,17],[4,15],[3,12],[3,9],[4,6],[5,4],[7,2],[9,1],[12,0],[15,0],[18,1],[20,2],[21,3],[-1,-1],[19,16],[18,8],[18,6],[19,5]] }, + 'A': { width: 18, points: [[9,21],[1,0],[-1,-1],[9,21],[17,0],[-1,-1],[4,7],[14,7]] }, + 'B': { width: 21, points: [[4,21],[4,0],[-1,-1],[4,21],[13,21],[16,20],[17,19],[18,17],[18,15],[17,13],[16,12],[13,11],[-1,-1],[4,11],[13,11],[16,10],[17,9],[18,7],[18,4],[17,2],[16,1],[13,0],[4,0]] }, + 'C': { width: 21, points: [[18,16],[17,18],[15,20],[13,21],[9,21],[7,20],[5,18],[4,16],[3,13],[3,8],[4,5],[5,3],[7,1],[9,0],[13,0],[15,1],[17,3],[18,5]] }, + 'D': { width: 21, points: [[4,21],[4,0],[-1,-1],[4,21],[11,21],[14,20],[16,18],[17,16],[18,13],[18,8],[17,5],[16,3],[14,1],[11,0],[4,0]] }, + 'E': { width: 19, points: [[4,21],[4,0],[-1,-1],[4,21],[17,21],[-1,-1],[4,11],[12,11],[-1,-1],[4,0],[17,0]] }, + 'F': { width: 18, points: [[4,21],[4,0],[-1,-1],[4,21],[17,21],[-1,-1],[4,11],[12,11]] }, + 'G': { width: 21, points: [[18,16],[17,18],[15,20],[13,21],[9,21],[7,20],[5,18],[4,16],[3,13],[3,8],[4,5],[5,3],[7,1],[9,0],[13,0],[15,1],[17,3],[18,5],[18,8],[-1,-1],[13,8],[18,8]] }, + 'H': { width: 22, points: [[4,21],[4,0],[-1,-1],[18,21],[18,0],[-1,-1],[4,11],[18,11]] }, + 'I': { width: 8, points: [[4,21],[4,0]] }, + 'J': { width: 16, points: [[12,21],[12,5],[11,2],[10,1],[8,0],[6,0],[4,1],[3,2],[2,5],[2,7]] }, + 'K': { width: 21, points: [[4,21],[4,0],[-1,-1],[18,21],[4,7],[-1,-1],[9,12],[18,0]] }, + 'L': { width: 17, points: [[4,21],[4,0],[-1,-1],[4,0],[16,0]] }, + 'M': { width: 24, points: [[4,21],[4,0],[-1,-1],[4,21],[12,0],[-1,-1],[20,21],[12,0],[-1,-1],[20,21],[20,0]] }, + 'N': { width: 22, points: [[4,21],[4,0],[-1,-1],[4,21],[18,0],[-1,-1],[18,21],[18,0]] }, + 'O': { width: 22, points: [[9,21],[7,20],[5,18],[4,16],[3,13],[3,8],[4,5],[5,3],[7,1],[9,0],[13,0],[15,1],[17,3],[18,5],[19,8],[19,13],[18,16],[17,18],[15,20],[13,21],[9,21]] }, + 'P': { width: 21, points: [[4,21],[4,0],[-1,-1],[4,21],[13,21],[16,20],[17,19],[18,17],[18,14],[17,12],[16,11],[13,10],[4,10]] }, + 'Q': { width: 22, points: [[9,21],[7,20],[5,18],[4,16],[3,13],[3,8],[4,5],[5,3],[7,1],[9,0],[13,0],[15,1],[17,3],[18,5],[19,8],[19,13],[18,16],[17,18],[15,20],[13,21],[9,21],[-1,-1],[12,4],[18,-2]] }, + 'R': { width: 21, points: [[4,21],[4,0],[-1,-1],[4,21],[13,21],[16,20],[17,19],[18,17],[18,15],[17,13],[16,12],[13,11],[4,11],[-1,-1],[11,11],[18,0]] }, + 'S': { width: 20, points: [[17,18],[15,20],[12,21],[8,21],[5,20],[3,18],[3,16],[4,14],[5,13],[7,12],[13,10],[15,9],[16,8],[17,6],[17,3],[15,1],[12,0],[8,0],[5,1],[3,3]] }, + 'T': { width: 16, points: [[8,21],[8,0],[-1,-1],[1,21],[15,21]] }, + 'U': { width: 22, points: [[4,21],[4,6],[5,3],[7,1],[10,0],[12,0],[15,1],[17,3],[18,6],[18,21]] }, + 'V': { width: 18, points: [[1,21],[9,0],[-1,-1],[17,21],[9,0]] }, + 'W': { width: 24, points: [[2,21],[7,0],[-1,-1],[12,21],[7,0],[-1,-1],[12,21],[17,0],[-1,-1],[22,21],[17,0]] }, + 'X': { width: 20, points: [[3,21],[17,0],[-1,-1],[17,21],[3,0]] }, + 'Y': { width: 18, points: [[1,21],[9,11],[9,0],[-1,-1],[17,21],[9,11]] }, + 'Z': { width: 20, points: [[17,21],[3,0],[-1,-1],[3,21],[17,21],[-1,-1],[3,0],[17,0]] }, + '[': { width: 14, points: [[4,25],[4,-7],[-1,-1],[5,25],[5,-7],[-1,-1],[4,25],[11,25],[-1,-1],[4,-7],[11,-7]] }, + '\\': { width: 14, points: [[0,21],[14,-3]] }, + ']': { width: 14, points: [[9,25],[9,-7],[-1,-1],[10,25],[10,-7],[-1,-1],[3,25],[10,25],[-1,-1],[3,-7],[10,-7]] }, + '^': { width: 16, points: [[6,15],[8,18],[10,15],[-1,-1],[3,12],[8,17],[13,12],[-1,-1],[8,17],[8,0]] }, + '_': { width: 16, points: [[0,-2],[16,-2]] }, + '`': { width: 10, points: [[6,21],[5,20],[4,18],[4,16],[5,15],[6,16],[5,17]] }, + 'a': { width: 19, points: [[15,14],[15,0],[-1,-1],[15,11],[13,13],[11,14],[8,14],[6,13],[4,11],[3,8],[3,6],[4,3],[6,1],[8,0],[11,0],[13,1],[15,3]] }, + 'b': { width: 19, points: [[4,21],[4,0],[-1,-1],[4,11],[6,13],[8,14],[11,14],[13,13],[15,11],[16,8],[16,6],[15,3],[13,1],[11,0],[8,0],[6,1],[4,3]] }, + 'c': { width: 18, points: [[15,11],[13,13],[11,14],[8,14],[6,13],[4,11],[3,8],[3,6],[4,3],[6,1],[8,0],[11,0],[13,1],[15,3]] }, + 'd': { width: 19, points: [[15,21],[15,0],[-1,-1],[15,11],[13,13],[11,14],[8,14],[6,13],[4,11],[3,8],[3,6],[4,3],[6,1],[8,0],[11,0],[13,1],[15,3]] }, + 'e': { width: 18, points: [[3,8],[15,8],[15,10],[14,12],[13,13],[11,14],[8,14],[6,13],[4,11],[3,8],[3,6],[4,3],[6,1],[8,0],[11,0],[13,1],[15,3]] }, + 'f': { width: 12, points: [[10,21],[8,21],[6,20],[5,17],[5,0],[-1,-1],[2,14],[9,14]] }, + 'g': { width: 19, points: [[15,14],[15,-2],[14,-5],[13,-6],[11,-7],[8,-7],[6,-6],[-1,-1],[15,11],[13,13],[11,14],[8,14],[6,13],[4,11],[3,8],[3,6],[4,3],[6,1],[8,0],[11,0],[13,1],[15,3]] }, + 'h': { width: 19, points: [[4,21],[4,0],[-1,-1],[4,10],[7,13],[9,14],[12,14],[14,13],[15,10],[15,0]] }, + 'i': { width: 8, points: [[3,21],[4,20],[5,21],[4,22],[3,21],[-1,-1],[4,14],[4,0]] }, + 'j': { width: 10, points: [[5,21],[6,20],[7,21],[6,22],[5,21],[-1,-1],[6,14],[6,-3],[5,-6],[3,-7],[1,-7]] }, + 'k': { width: 17, points: [[4,21],[4,0],[-1,-1],[14,14],[4,4],[-1,-1],[8,8],[15,0]] }, + 'l': { width: 8, points: [[4,21],[4,0]] }, + 'm': { width: 30, points: [[4,14],[4,0],[-1,-1],[4,10],[7,13],[9,14],[12,14],[14,13],[15,10],[15,0],[-1,-1],[15,10],[18,13],[20,14],[23,14],[25,13],[26,10],[26,0]] }, + 'n': { width: 19, points: [[4,14],[4,0],[-1,-1],[4,10],[7,13],[9,14],[12,14],[14,13],[15,10],[15,0]] }, + 'o': { width: 19, points: [[8,14],[6,13],[4,11],[3,8],[3,6],[4,3],[6,1],[8,0],[11,0],[13,1],[15,3],[16,6],[16,8],[15,11],[13,13],[11,14],[8,14]] }, + 'p': { width: 19, points: [[4,14],[4,-7],[-1,-1],[4,11],[6,13],[8,14],[11,14],[13,13],[15,11],[16,8],[16,6],[15,3],[13,1],[11,0],[8,0],[6,1],[4,3]] }, + 'q': { width: 19, points: [[15,14],[15,-7],[-1,-1],[15,11],[13,13],[11,14],[8,14],[6,13],[4,11],[3,8],[3,6],[4,3],[6,1],[8,0],[11,0],[13,1],[15,3]] }, + 'r': { width: 13, points: [[4,14],[4,0],[-1,-1],[4,8],[5,11],[7,13],[9,14],[12,14]] }, + 's': { width: 17, points: [[14,11],[13,13],[10,14],[7,14],[4,13],[3,11],[4,9],[6,8],[11,7],[13,6],[14,4],[14,3],[13,1],[10,0],[7,0],[4,1],[3,3]] }, + 't': { width: 12, points: [[5,21],[5,4],[6,1],[8,0],[10,0],[-1,-1],[2,14],[9,14]] }, + 'u': { width: 19, points: [[4,14],[4,4],[5,1],[7,0],[10,0],[12,1],[15,4],[-1,-1],[15,14],[15,0]] }, + 'v': { width: 16, points: [[2,14],[8,0],[-1,-1],[14,14],[8,0]] }, + 'w': { width: 22, points: [[3,14],[7,0],[-1,-1],[11,14],[7,0],[-1,-1],[11,14],[15,0],[-1,-1],[19,14],[15,0]] }, + 'x': { width: 17, points: [[3,14],[14,0],[-1,-1],[14,14],[3,0]] }, + 'y': { width: 16, points: [[2,14],[8,0],[-1,-1],[14,14],[8,0],[6,-4],[4,-6],[2,-7],[1,-7]] }, + 'z': { width: 17, points: [[14,14],[3,0],[-1,-1],[3,14],[14,14],[-1,-1],[3,0],[14,0]] }, + '{': { width: 14, points: [[9,25],[7,24],[6,23],[5,21],[5,19],[6,17],[7,16],[8,14],[8,12],[6,10],[-1,-1],[7,24],[6,22],[6,20],[7,18],[8,17],[9,15],[9,13],[8,11],[4,9],[8,7],[9,5],[9,3],[8,1],[7,0],[6,-2],[6,-4],[7,-6],[-1,-1],[6,8],[8,6],[8,4],[7,2],[6,1],[5,-1],[5,-3],[6,-5],[7,-6],[9,-7]] }, + '|': { width: 8, points: [[4,25],[4,-7]] }, + '}': { width: 14, points: [[5,25],[7,24],[8,23],[9,21],[9,19],[8,17],[7,16],[6,14],[6,12],[8,10],[-1,-1],[7,24],[8,22],[8,20],[7,18],[6,17],[5,15],[5,13],[6,11],[10,9],[6,7],[5,5],[5,3],[6,1],[7,0],[8,-2],[8,-4],[7,-6],[-1,-1],[8,8],[6,6],[6,4],[7,2],[8,1],[9,-1],[9,-3],[8,-5],[7,-6],[5,-7]] }, + '~': { width: 24, points: [[3,6],[3,8],[4,11],[6,12],[8,12],[10,11],[14,8],[16,7],[18,7],[20,8],[21,10],[-1,-1],[3,8],[4,10],[6,11],[8,11],[10,10],[14,7],[16,6],[18,6],[20,7],[21,10],[21,12]] } + }; + + $.jqplot.CanvasFontRenderer = function(options) { + options = options || {}; + if (!options.pt2px) { + options.pt2px = 1.5; + } + $.jqplot.CanvasTextRenderer.call(this, options); + }; + + $.jqplot.CanvasFontRenderer.prototype = new $.jqplot.CanvasTextRenderer({}); + $.jqplot.CanvasFontRenderer.prototype.constructor = $.jqplot.CanvasFontRenderer; + + $.jqplot.CanvasFontRenderer.prototype.measure = function(ctx, str) + { + // var fstyle = this.fontStyle+' '+this.fontVariant+' '+this.fontWeight+' '+this.fontSize+' '+this.fontFamily; + var fstyle = this.fontSize+' '+this.fontFamily; + ctx.save(); + ctx.font = fstyle; + var w = ctx.measureText(str).width; + ctx.restore(); + return w; + }; + + $.jqplot.CanvasFontRenderer.prototype.draw = function(ctx, str) + { + var x = 0; + // leave room at bottom for descenders. + var y = this.height*0.72; + //var y = 12; + + ctx.save(); + var tx, ty; + + // 1st quadrant + if ((-Math.PI/2 <= this.angle && this.angle <= 0) || (Math.PI*3/2 <= this.angle && this.angle <= Math.PI*2)) { + tx = 0; + ty = -Math.sin(this.angle) * this.width; + } + // 4th quadrant + else if ((0 < this.angle && this.angle <= Math.PI/2) || (-Math.PI*2 <= this.angle && this.angle <= -Math.PI*3/2)) { + tx = Math.sin(this.angle) * this.height; + ty = 0; + } + // 2nd quadrant + else if ((-Math.PI < this.angle && this.angle < -Math.PI/2) || (Math.PI <= this.angle && this.angle <= Math.PI*3/2)) { + tx = -Math.cos(this.angle) * this.width; + ty = -Math.sin(this.angle) * this.width - Math.cos(this.angle) * this.height; + } + // 3rd quadrant + else if ((-Math.PI*3/2 < this.angle && this.angle < Math.PI) || (Math.PI/2 < this.angle && this.angle < Math.PI)) { + tx = Math.sin(this.angle) * this.height - Math.cos(this.angle)*this.width; + ty = -Math.cos(this.angle) * this.height; + } + ctx.strokeStyle = this.fillStyle; + ctx.fillStyle = this.fillStyle; + // var fstyle = this.fontStyle+' '+this.fontVariant+' '+this.fontWeight+' '+this.fontSize+' '+this.fontFamily; + var fstyle = this.fontSize+' '+this.fontFamily; + ctx.font = fstyle; + ctx.translate(tx, ty); + ctx.rotate(this.angle); + ctx.fillText(str, x, y); + // ctx.strokeText(str, x, y); + + ctx.restore(); + }; + +})(jQuery); \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/plugins/jqplot.canvasTextRenderer.min.js b/libreplan-webapp/src/main/webapp/jqplot/plugins/jqplot.canvasTextRenderer.min.js new file mode 100644 index 000000000..a1ee0fdfe --- /dev/null +++ b/libreplan-webapp/src/main/webapp/jqplot/plugins/jqplot.canvasTextRenderer.min.js @@ -0,0 +1,57 @@ +/** + * jqPlot + * Pure JavaScript plotting plugin using jQuery + * + * Version: 1.0.0b2_r1012 + * + * Copyright (c) 2009-2011 Chris Leonello + * jqPlot is currently available for use in all personal or commercial projects + * under both the MIT (http://www.opensource.org/licenses/mit-license.php) and GPL + * version 2.0 (http://www.gnu.org/licenses/gpl-2.0.html) licenses. This means that you can + * choose the license that best suits your project and use it accordingly. + * + * Although not required, the author would appreciate an email letting him + * know of any substantial use of jqPlot. You can reach the author at: + * chris at jqplot dot com or see http://www.jqplot.com/info.php . + * + * If you are feeling kind and generous, consider supporting the project by + * making a donation at: http://www.jqplot.com/donate.php . + * + * sprintf functions contained in jqplot.sprintf.js by Ash Searle: + * + * version 2007.04.27 + * author Ash Searle + * http://hexmen.com/blog/2007/03/printf-sprintf/ + * http://hexmen.com/js/sprintf.js + * The author (Ash Searle) has placed this code in the public domain: + * "This code is unrestricted: you are free to use it however you like." + * + * included jsDate library by Chris Leonello: + * + * Copyright (c) 2010-2011 Chris Leonello + * + * jsDate is currently available for use in all personal or commercial projects + * under both the MIT and GPL version 2.0 licenses. This means that you can + * choose the license that best suits your project and use it accordingly. + * + * jsDate borrows many concepts and ideas from the Date Instance + * Methods by Ken Snyder along with some parts of Ken's actual code. + * + * Ken's origianl Date Instance Methods and copyright notice: + * + * Ken Snyder (ken d snyder at gmail dot com) + * 2008-09-10 + * version 2.0.2 (http://kendsnyder.com/sandbox/date/) + * Creative Commons Attribution License 3.0 (http://creativecommons.org/licenses/by/3.0/) + * + * jqplotToImage function based on Larry Siden's export-jqplot-to-png.js. + * Larry has generously given permission to adapt his code for inclusion + * into jqPlot. + * + * Larry's original code can be found here: + * + * https://github.com/lsiden/export-jqplot-to-png + * + * + */ +(function(a){a.jqplot.CanvasTextRenderer=function(b){this.fontStyle="normal";this.fontVariant="normal";this.fontWeight="normal";this.fontSize="10px";this.fontFamily="sans-serif";this.fontStretch=1;this.fillStyle="#666666";this.angle=0;this.textAlign="start";this.textBaseline="alphabetic";this.text;this.width;this.height;this.pt2px=1.28;a.extend(true,this,b);this.normalizedFontSize=this.normalizeFontSize(this.fontSize);this.setHeight()};a.jqplot.CanvasTextRenderer.prototype.init=function(b){a.extend(true,this,b);this.normalizedFontSize=this.normalizeFontSize(this.fontSize);this.setHeight()};a.jqplot.CanvasTextRenderer.prototype.normalizeFontSize=function(b){b=String(b);var c=parseFloat(b);if(b.indexOf("px")>-1){return c/this.pt2px}else{if(b.indexOf("pt")>-1){return c}else{if(b.indexOf("em")>-1){return c*12}else{if(b.indexOf("%")>-1){return c*12/100}else{return c/this.pt2px}}}}};a.jqplot.CanvasTextRenderer.prototype.fontWeight2Float=function(b){if(Number(b)){return b/400}else{switch(b){case"normal":return 1;break;case"bold":return 1.75;break;case"bolder":return 2.25;break;case"lighter":return 0.75;break;default:return 1;break}}};a.jqplot.CanvasTextRenderer.prototype.getText=function(){return this.text};a.jqplot.CanvasTextRenderer.prototype.setText=function(c,b){this.text=c;this.setWidth(b);return this};a.jqplot.CanvasTextRenderer.prototype.getWidth=function(b){return this.width};a.jqplot.CanvasTextRenderer.prototype.setWidth=function(c,b){if(!b){this.width=this.measure(c,this.text)}else{this.width=b}return this};a.jqplot.CanvasTextRenderer.prototype.getHeight=function(b){return this.height};a.jqplot.CanvasTextRenderer.prototype.setHeight=function(b){if(!b){this.height=this.normalizedFontSize*this.pt2px}else{this.height=b}return this};a.jqplot.CanvasTextRenderer.prototype.letter=function(b){return this.letters[b]};a.jqplot.CanvasTextRenderer.prototype.ascent=function(){return this.normalizedFontSize};a.jqplot.CanvasTextRenderer.prototype.descent=function(){return 7*this.normalizedFontSize/25};a.jqplot.CanvasTextRenderer.prototype.measure=function(d,g){var f=0;var b=g.length;for(var e=0;e<b;e++){var h=this.letter(g.charAt(e));if(h){f+=h.width*this.normalizedFontSize/25*this.fontStretch}}return f};a.jqplot.CanvasTextRenderer.prototype.draw=function(s,n){var r=0;var o=this.height*0.72;var p=0;var l=n.length;var k=this.normalizedFontSize/25;s.save();var h,f;if((-Math.PI/2<=this.angle&&this.angle<=0)||(Math.PI*3/2<=this.angle&&this.angle<=Math.PI*2)){h=0;f=-Math.sin(this.angle)*this.width}else{if((0<this.angle&&this.angle<=Math.PI/2)||(-Math.PI*2<=this.angle&&this.angle<=-Math.PI*3/2)){h=Math.sin(this.angle)*this.height;f=0}else{if((-Math.PI<this.angle&&this.angle<-Math.PI/2)||(Math.PI<=this.angle&&this.angle<=Math.PI*3/2)){h=-Math.cos(this.angle)*this.width;f=-Math.sin(this.angle)*this.width-Math.cos(this.angle)*this.height}else{if((-Math.PI*3/2<this.angle&&this.angle<Math.PI)||(Math.PI/2<this.angle&&this.angle<Math.PI)){h=Math.sin(this.angle)*this.height-Math.cos(this.angle)*this.width;f=-Math.cos(this.angle)*this.height}}}}s.strokeStyle=this.fillStyle;s.fillStyle=this.fillStyle;s.translate(h,f);s.rotate(this.angle);s.lineCap="round";var t=(this.normalizedFontSize>30)?2:2+(30-this.normalizedFontSize)/20;s.lineWidth=t*k*this.fontWeight2Float(this.fontWeight);for(var g=0;g<l;g++){var m=this.letter(n.charAt(g));if(!m){continue}s.beginPath();var e=1;var b=0;for(var d=0;d<m.points.length;d++){var q=m.points[d];if(q[0]==-1&&q[1]==-1){e=1;continue}if(e){s.moveTo(r+q[0]*k*this.fontStretch,o-q[1]*k);e=false}else{s.lineTo(r+q[0]*k*this.fontStretch,o-q[1]*k)}}s.stroke();r+=m.width*k*this.fontStretch}s.restore();return p};a.jqplot.CanvasTextRenderer.prototype.letters={" ":{width:16,points:[]},"!":{width:10,points:[[5,21],[5,7],[-1,-1],[5,2],[4,1],[5,0],[6,1],[5,2]]},'"':{width:16,points:[[4,21],[4,14],[-1,-1],[12,21],[12,14]]},"#":{width:21,points:[[11,25],[4,-7],[-1,-1],[17,25],[10,-7],[-1,-1],[4,12],[18,12],[-1,-1],[3,6],[17,6]]},"$":{width:20,points:[[8,25],[8,-4],[-1,-1],[12,25],[12,-4],[-1,-1],[17,18],[15,20],[12,21],[8,21],[5,20],[3,18],[3,16],[4,14],[5,13],[7,12],[13,10],[15,9],[16,8],[17,6],[17,3],[15,1],[12,0],[8,0],[5,1],[3,3]]},"%":{width:24,points:[[21,21],[3,0],[-1,-1],[8,21],[10,19],[10,17],[9,15],[7,14],[5,14],[3,16],[3,18],[4,20],[6,21],[8,21],[10,20],[13,19],[16,19],[19,20],[21,21],[-1,-1],[17,7],[15,6],[14,4],[14,2],[16,0],[18,0],[20,1],[21,3],[21,5],[19,7],[17,7]]},"&":{width:26,points:[[23,12],[23,13],[22,14],[21,14],[20,13],[19,11],[17,6],[15,3],[13,1],[11,0],[7,0],[5,1],[4,2],[3,4],[3,6],[4,8],[5,9],[12,13],[13,14],[14,16],[14,18],[13,20],[11,21],[9,20],[8,18],[8,16],[9,13],[11,10],[16,3],[18,1],[20,0],[22,0],[23,1],[23,2]]},"'":{width:10,points:[[5,19],[4,20],[5,21],[6,20],[6,18],[5,16],[4,15]]},"(":{width:14,points:[[11,25],[9,23],[7,20],[5,16],[4,11],[4,7],[5,2],[7,-2],[9,-5],[11,-7]]},")":{width:14,points:[[3,25],[5,23],[7,20],[9,16],[10,11],[10,7],[9,2],[7,-2],[5,-5],[3,-7]]},"*":{width:16,points:[[8,21],[8,9],[-1,-1],[3,18],[13,12],[-1,-1],[13,18],[3,12]]},"+":{width:26,points:[[13,18],[13,0],[-1,-1],[4,9],[22,9]]},",":{width:10,points:[[6,1],[5,0],[4,1],[5,2],[6,1],[6,-1],[5,-3],[4,-4]]},"-":{width:18,points:[[6,9],[12,9]]},".":{width:10,points:[[5,2],[4,1],[5,0],[6,1],[5,2]]},"/":{width:22,points:[[20,25],[2,-7]]},"0":{width:20,points:[[9,21],[6,20],[4,17],[3,12],[3,9],[4,4],[6,1],[9,0],[11,0],[14,1],[16,4],[17,9],[17,12],[16,17],[14,20],[11,21],[9,21]]},"1":{width:20,points:[[6,17],[8,18],[11,21],[11,0]]},"2":{width:20,points:[[4,16],[4,17],[5,19],[6,20],[8,21],[12,21],[14,20],[15,19],[16,17],[16,15],[15,13],[13,10],[3,0],[17,0]]},"3":{width:20,points:[[5,21],[16,21],[10,13],[13,13],[15,12],[16,11],[17,8],[17,6],[16,3],[14,1],[11,0],[8,0],[5,1],[4,2],[3,4]]},"4":{width:20,points:[[13,21],[3,7],[18,7],[-1,-1],[13,21],[13,0]]},"5":{width:20,points:[[15,21],[5,21],[4,12],[5,13],[8,14],[11,14],[14,13],[16,11],[17,8],[17,6],[16,3],[14,1],[11,0],[8,0],[5,1],[4,2],[3,4]]},"6":{width:20,points:[[16,18],[15,20],[12,21],[10,21],[7,20],[5,17],[4,12],[4,7],[5,3],[7,1],[10,0],[11,0],[14,1],[16,3],[17,6],[17,7],[16,10],[14,12],[11,13],[10,13],[7,12],[5,10],[4,7]]},"7":{width:20,points:[[17,21],[7,0],[-1,-1],[3,21],[17,21]]},"8":{width:20,points:[[8,21],[5,20],[4,18],[4,16],[5,14],[7,13],[11,12],[14,11],[16,9],[17,7],[17,4],[16,2],[15,1],[12,0],[8,0],[5,1],[4,2],[3,4],[3,7],[4,9],[6,11],[9,12],[13,13],[15,14],[16,16],[16,18],[15,20],[12,21],[8,21]]},"9":{width:20,points:[[16,14],[15,11],[13,9],[10,8],[9,8],[6,9],[4,11],[3,14],[3,15],[4,18],[6,20],[9,21],[10,21],[13,20],[15,18],[16,14],[16,9],[15,4],[13,1],[10,0],[8,0],[5,1],[4,3]]},":":{width:10,points:[[5,14],[4,13],[5,12],[6,13],[5,14],[-1,-1],[5,2],[4,1],[5,0],[6,1],[5,2]]},";":{width:10,points:[[5,14],[4,13],[5,12],[6,13],[5,14],[-1,-1],[6,1],[5,0],[4,1],[5,2],[6,1],[6,-1],[5,-3],[4,-4]]},"<":{width:24,points:[[20,18],[4,9],[20,0]]},"=":{width:26,points:[[4,12],[22,12],[-1,-1],[4,6],[22,6]]},">":{width:24,points:[[4,18],[20,9],[4,0]]},"?":{width:18,points:[[3,16],[3,17],[4,19],[5,20],[7,21],[11,21],[13,20],[14,19],[15,17],[15,15],[14,13],[13,12],[9,10],[9,7],[-1,-1],[9,2],[8,1],[9,0],[10,1],[9,2]]},"@":{width:27,points:[[18,13],[17,15],[15,16],[12,16],[10,15],[9,14],[8,11],[8,8],[9,6],[11,5],[14,5],[16,6],[17,8],[-1,-1],[12,16],[10,14],[9,11],[9,8],[10,6],[11,5],[-1,-1],[18,16],[17,8],[17,6],[19,5],[21,5],[23,7],[24,10],[24,12],[23,15],[22,17],[20,19],[18,20],[15,21],[12,21],[9,20],[7,19],[5,17],[4,15],[3,12],[3,9],[4,6],[5,4],[7,2],[9,1],[12,0],[15,0],[18,1],[20,2],[21,3],[-1,-1],[19,16],[18,8],[18,6],[19,5]]},A:{width:18,points:[[9,21],[1,0],[-1,-1],[9,21],[17,0],[-1,-1],[4,7],[14,7]]},B:{width:21,points:[[4,21],[4,0],[-1,-1],[4,21],[13,21],[16,20],[17,19],[18,17],[18,15],[17,13],[16,12],[13,11],[-1,-1],[4,11],[13,11],[16,10],[17,9],[18,7],[18,4],[17,2],[16,1],[13,0],[4,0]]},C:{width:21,points:[[18,16],[17,18],[15,20],[13,21],[9,21],[7,20],[5,18],[4,16],[3,13],[3,8],[4,5],[5,3],[7,1],[9,0],[13,0],[15,1],[17,3],[18,5]]},D:{width:21,points:[[4,21],[4,0],[-1,-1],[4,21],[11,21],[14,20],[16,18],[17,16],[18,13],[18,8],[17,5],[16,3],[14,1],[11,0],[4,0]]},E:{width:19,points:[[4,21],[4,0],[-1,-1],[4,21],[17,21],[-1,-1],[4,11],[12,11],[-1,-1],[4,0],[17,0]]},F:{width:18,points:[[4,21],[4,0],[-1,-1],[4,21],[17,21],[-1,-1],[4,11],[12,11]]},G:{width:21,points:[[18,16],[17,18],[15,20],[13,21],[9,21],[7,20],[5,18],[4,16],[3,13],[3,8],[4,5],[5,3],[7,1],[9,0],[13,0],[15,1],[17,3],[18,5],[18,8],[-1,-1],[13,8],[18,8]]},H:{width:22,points:[[4,21],[4,0],[-1,-1],[18,21],[18,0],[-1,-1],[4,11],[18,11]]},I:{width:8,points:[[4,21],[4,0]]},J:{width:16,points:[[12,21],[12,5],[11,2],[10,1],[8,0],[6,0],[4,1],[3,2],[2,5],[2,7]]},K:{width:21,points:[[4,21],[4,0],[-1,-1],[18,21],[4,7],[-1,-1],[9,12],[18,0]]},L:{width:17,points:[[4,21],[4,0],[-1,-1],[4,0],[16,0]]},M:{width:24,points:[[4,21],[4,0],[-1,-1],[4,21],[12,0],[-1,-1],[20,21],[12,0],[-1,-1],[20,21],[20,0]]},N:{width:22,points:[[4,21],[4,0],[-1,-1],[4,21],[18,0],[-1,-1],[18,21],[18,0]]},O:{width:22,points:[[9,21],[7,20],[5,18],[4,16],[3,13],[3,8],[4,5],[5,3],[7,1],[9,0],[13,0],[15,1],[17,3],[18,5],[19,8],[19,13],[18,16],[17,18],[15,20],[13,21],[9,21]]},P:{width:21,points:[[4,21],[4,0],[-1,-1],[4,21],[13,21],[16,20],[17,19],[18,17],[18,14],[17,12],[16,11],[13,10],[4,10]]},Q:{width:22,points:[[9,21],[7,20],[5,18],[4,16],[3,13],[3,8],[4,5],[5,3],[7,1],[9,0],[13,0],[15,1],[17,3],[18,5],[19,8],[19,13],[18,16],[17,18],[15,20],[13,21],[9,21],[-1,-1],[12,4],[18,-2]]},R:{width:21,points:[[4,21],[4,0],[-1,-1],[4,21],[13,21],[16,20],[17,19],[18,17],[18,15],[17,13],[16,12],[13,11],[4,11],[-1,-1],[11,11],[18,0]]},S:{width:20,points:[[17,18],[15,20],[12,21],[8,21],[5,20],[3,18],[3,16],[4,14],[5,13],[7,12],[13,10],[15,9],[16,8],[17,6],[17,3],[15,1],[12,0],[8,0],[5,1],[3,3]]},T:{width:16,points:[[8,21],[8,0],[-1,-1],[1,21],[15,21]]},U:{width:22,points:[[4,21],[4,6],[5,3],[7,1],[10,0],[12,0],[15,1],[17,3],[18,6],[18,21]]},V:{width:18,points:[[1,21],[9,0],[-1,-1],[17,21],[9,0]]},W:{width:24,points:[[2,21],[7,0],[-1,-1],[12,21],[7,0],[-1,-1],[12,21],[17,0],[-1,-1],[22,21],[17,0]]},X:{width:20,points:[[3,21],[17,0],[-1,-1],[17,21],[3,0]]},Y:{width:18,points:[[1,21],[9,11],[9,0],[-1,-1],[17,21],[9,11]]},Z:{width:20,points:[[17,21],[3,0],[-1,-1],[3,21],[17,21],[-1,-1],[3,0],[17,0]]},"[":{width:14,points:[[4,25],[4,-7],[-1,-1],[5,25],[5,-7],[-1,-1],[4,25],[11,25],[-1,-1],[4,-7],[11,-7]]},"\\":{width:14,points:[[0,21],[14,-3]]},"]":{width:14,points:[[9,25],[9,-7],[-1,-1],[10,25],[10,-7],[-1,-1],[3,25],[10,25],[-1,-1],[3,-7],[10,-7]]},"^":{width:16,points:[[6,15],[8,18],[10,15],[-1,-1],[3,12],[8,17],[13,12],[-1,-1],[8,17],[8,0]]},_:{width:16,points:[[0,-2],[16,-2]]},"`":{width:10,points:[[6,21],[5,20],[4,18],[4,16],[5,15],[6,16],[5,17]]},a:{width:19,points:[[15,14],[15,0],[-1,-1],[15,11],[13,13],[11,14],[8,14],[6,13],[4,11],[3,8],[3,6],[4,3],[6,1],[8,0],[11,0],[13,1],[15,3]]},b:{width:19,points:[[4,21],[4,0],[-1,-1],[4,11],[6,13],[8,14],[11,14],[13,13],[15,11],[16,8],[16,6],[15,3],[13,1],[11,0],[8,0],[6,1],[4,3]]},c:{width:18,points:[[15,11],[13,13],[11,14],[8,14],[6,13],[4,11],[3,8],[3,6],[4,3],[6,1],[8,0],[11,0],[13,1],[15,3]]},d:{width:19,points:[[15,21],[15,0],[-1,-1],[15,11],[13,13],[11,14],[8,14],[6,13],[4,11],[3,8],[3,6],[4,3],[6,1],[8,0],[11,0],[13,1],[15,3]]},e:{width:18,points:[[3,8],[15,8],[15,10],[14,12],[13,13],[11,14],[8,14],[6,13],[4,11],[3,8],[3,6],[4,3],[6,1],[8,0],[11,0],[13,1],[15,3]]},f:{width:12,points:[[10,21],[8,21],[6,20],[5,17],[5,0],[-1,-1],[2,14],[9,14]]},g:{width:19,points:[[15,14],[15,-2],[14,-5],[13,-6],[11,-7],[8,-7],[6,-6],[-1,-1],[15,11],[13,13],[11,14],[8,14],[6,13],[4,11],[3,8],[3,6],[4,3],[6,1],[8,0],[11,0],[13,1],[15,3]]},h:{width:19,points:[[4,21],[4,0],[-1,-1],[4,10],[7,13],[9,14],[12,14],[14,13],[15,10],[15,0]]},i:{width:8,points:[[3,21],[4,20],[5,21],[4,22],[3,21],[-1,-1],[4,14],[4,0]]},j:{width:10,points:[[5,21],[6,20],[7,21],[6,22],[5,21],[-1,-1],[6,14],[6,-3],[5,-6],[3,-7],[1,-7]]},k:{width:17,points:[[4,21],[4,0],[-1,-1],[14,14],[4,4],[-1,-1],[8,8],[15,0]]},l:{width:8,points:[[4,21],[4,0]]},m:{width:30,points:[[4,14],[4,0],[-1,-1],[4,10],[7,13],[9,14],[12,14],[14,13],[15,10],[15,0],[-1,-1],[15,10],[18,13],[20,14],[23,14],[25,13],[26,10],[26,0]]},n:{width:19,points:[[4,14],[4,0],[-1,-1],[4,10],[7,13],[9,14],[12,14],[14,13],[15,10],[15,0]]},o:{width:19,points:[[8,14],[6,13],[4,11],[3,8],[3,6],[4,3],[6,1],[8,0],[11,0],[13,1],[15,3],[16,6],[16,8],[15,11],[13,13],[11,14],[8,14]]},p:{width:19,points:[[4,14],[4,-7],[-1,-1],[4,11],[6,13],[8,14],[11,14],[13,13],[15,11],[16,8],[16,6],[15,3],[13,1],[11,0],[8,0],[6,1],[4,3]]},q:{width:19,points:[[15,14],[15,-7],[-1,-1],[15,11],[13,13],[11,14],[8,14],[6,13],[4,11],[3,8],[3,6],[4,3],[6,1],[8,0],[11,0],[13,1],[15,3]]},r:{width:13,points:[[4,14],[4,0],[-1,-1],[4,8],[5,11],[7,13],[9,14],[12,14]]},s:{width:17,points:[[14,11],[13,13],[10,14],[7,14],[4,13],[3,11],[4,9],[6,8],[11,7],[13,6],[14,4],[14,3],[13,1],[10,0],[7,0],[4,1],[3,3]]},t:{width:12,points:[[5,21],[5,4],[6,1],[8,0],[10,0],[-1,-1],[2,14],[9,14]]},u:{width:19,points:[[4,14],[4,4],[5,1],[7,0],[10,0],[12,1],[15,4],[-1,-1],[15,14],[15,0]]},v:{width:16,points:[[2,14],[8,0],[-1,-1],[14,14],[8,0]]},w:{width:22,points:[[3,14],[7,0],[-1,-1],[11,14],[7,0],[-1,-1],[11,14],[15,0],[-1,-1],[19,14],[15,0]]},x:{width:17,points:[[3,14],[14,0],[-1,-1],[14,14],[3,0]]},y:{width:16,points:[[2,14],[8,0],[-1,-1],[14,14],[8,0],[6,-4],[4,-6],[2,-7],[1,-7]]},z:{width:17,points:[[14,14],[3,0],[-1,-1],[3,14],[14,14],[-1,-1],[3,0],[14,0]]},"{":{width:14,points:[[9,25],[7,24],[6,23],[5,21],[5,19],[6,17],[7,16],[8,14],[8,12],[6,10],[-1,-1],[7,24],[6,22],[6,20],[7,18],[8,17],[9,15],[9,13],[8,11],[4,9],[8,7],[9,5],[9,3],[8,1],[7,0],[6,-2],[6,-4],[7,-6],[-1,-1],[6,8],[8,6],[8,4],[7,2],[6,1],[5,-1],[5,-3],[6,-5],[7,-6],[9,-7]]},"|":{width:8,points:[[4,25],[4,-7]]},"}":{width:14,points:[[5,25],[7,24],[8,23],[9,21],[9,19],[8,17],[7,16],[6,14],[6,12],[8,10],[-1,-1],[7,24],[8,22],[8,20],[7,18],[6,17],[5,15],[5,13],[6,11],[10,9],[6,7],[5,5],[5,3],[6,1],[7,0],[8,-2],[8,-4],[7,-6],[-1,-1],[8,8],[6,6],[6,4],[7,2],[8,1],[9,-1],[9,-3],[8,-5],[7,-6],[5,-7]]},"~":{width:24,points:[[3,6],[3,8],[4,11],[6,12],[8,12],[10,11],[14,8],[16,7],[18,7],[20,8],[21,10],[-1,-1],[3,8],[4,10],[6,11],[8,11],[10,10],[14,7],[16,6],[18,6],[20,7],[21,10],[21,12]]}};a.jqplot.CanvasFontRenderer=function(b){b=b||{};if(!b.pt2px){b.pt2px=1.5}a.jqplot.CanvasTextRenderer.call(this,b)};a.jqplot.CanvasFontRenderer.prototype=new a.jqplot.CanvasTextRenderer({});a.jqplot.CanvasFontRenderer.prototype.constructor=a.jqplot.CanvasFontRenderer;a.jqplot.CanvasFontRenderer.prototype.measure=function(c,e){var d=this.fontSize+" "+this.fontFamily;c.save();c.font=d;var b=c.measureText(e).width;c.restore();return b};a.jqplot.CanvasFontRenderer.prototype.draw=function(e,g){var c=0;var h=this.height*0.72;e.save();var d,b;if((-Math.PI/2<=this.angle&&this.angle<=0)||(Math.PI*3/2<=this.angle&&this.angle<=Math.PI*2)){d=0;b=-Math.sin(this.angle)*this.width}else{if((0<this.angle&&this.angle<=Math.PI/2)||(-Math.PI*2<=this.angle&&this.angle<=-Math.PI*3/2)){d=Math.sin(this.angle)*this.height;b=0}else{if((-Math.PI<this.angle&&this.angle<-Math.PI/2)||(Math.PI<=this.angle&&this.angle<=Math.PI*3/2)){d=-Math.cos(this.angle)*this.width;b=-Math.sin(this.angle)*this.width-Math.cos(this.angle)*this.height}else{if((-Math.PI*3/2<this.angle&&this.angle<Math.PI)||(Math.PI/2<this.angle&&this.angle<Math.PI)){d=Math.sin(this.angle)*this.height-Math.cos(this.angle)*this.width;b=-Math.cos(this.angle)*this.height}}}}e.strokeStyle=this.fillStyle;e.fillStyle=this.fillStyle;var f=this.fontSize+" "+this.fontFamily;e.font=f;e.translate(d,b);e.rotate(this.angle);e.fillText(g,c,h);e.restore()}})(jQuery); \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/plugins/jqplot.categoryAxisRenderer.js b/libreplan-webapp/src/main/webapp/jqplot/plugins/jqplot.categoryAxisRenderer.js new file mode 100644 index 000000000..742096c31 --- /dev/null +++ b/libreplan-webapp/src/main/webapp/jqplot/plugins/jqplot.categoryAxisRenderer.js @@ -0,0 +1,636 @@ +/** + * jqPlot + * Pure JavaScript plotting plugin using jQuery + * + * Version: 1.0.0b2_r1012 + * + * Copyright (c) 2009-2011 Chris Leonello + * jqPlot is currently available for use in all personal or commercial projects + * under both the MIT (http://www.opensource.org/licenses/mit-license.php) and GPL + * version 2.0 (http://www.gnu.org/licenses/gpl-2.0.html) licenses. This means that you can + * choose the license that best suits your project and use it accordingly. + * + * Although not required, the author would appreciate an email letting him + * know of any substantial use of jqPlot. You can reach the author at: + * chris at jqplot dot com or see http://www.jqplot.com/info.php . + * + * If you are feeling kind and generous, consider supporting the project by + * making a donation at: http://www.jqplot.com/donate.php . + * + * sprintf functions contained in jqplot.sprintf.js by Ash Searle: + * + * version 2007.04.27 + * author Ash Searle + * http://hexmen.com/blog/2007/03/printf-sprintf/ + * http://hexmen.com/js/sprintf.js + * The author (Ash Searle) has placed this code in the public domain: + * "This code is unrestricted: you are free to use it however you like." + * + */ +(function($) { + /** + * class: $.jqplot.CategoryAxisRenderer + * A plugin for jqPlot to render a category style axis, with equal pixel spacing between y data values of a series. + * + * To use this renderer, include the plugin in your source + * > <script type="text/javascript" language="javascript" src="plugins/jqplot.categoryAxisRenderer.js"></script> + * + * and supply the appropriate options to your plot + * + * > {axes:{xaxis:{renderer:$.jqplot.CategoryAxisRenderer}}} + **/ + $.jqplot.CategoryAxisRenderer = function(options) { + $.jqplot.LinearAxisRenderer.call(this); + // prop: sortMergedLabels + // True to sort tick labels when labels are created by merging + // x axis values from multiple series. That is, say you have + // two series like: + // > line1 = [[2006, 4], [2008, 9], [2009, 16]]; + // > line2 = [[2006, 3], [2007, 7], [2008, 6]]; + // If no label array is specified, tick labels will be collected + // from the x values of the series. With sortMergedLabels + // set to true, tick labels will be: + // > [2006, 2007, 2008, 2009] + // With sortMergedLabels set to false, tick labels will be: + // > [2006, 2008, 2009, 2007] + // + // Note, this property is specified on the renderOptions for the + // axes when creating a plot: + // > axes:{xaxis:{renderer:$.jqplot.CategoryAxisRenderer, rendererOptions:{sortMergedLabels:true}}} + this.sortMergedLabels = false; + }; + + $.jqplot.CategoryAxisRenderer.prototype = new $.jqplot.LinearAxisRenderer(); + $.jqplot.CategoryAxisRenderer.prototype.constructor = $.jqplot.CategoryAxisRenderer; + + $.jqplot.CategoryAxisRenderer.prototype.init = function(options){ + this.groups = 1; + this.groupLabels = []; + this._groupLabels = []; + this._grouped = false; + this._barsPerGroup = null; + // prop: tickRenderer + // A class of a rendering engine for creating the ticks labels displayed on the plot, + // See <$.jqplot.AxisTickRenderer>. + // this.tickRenderer = $.jqplot.AxisTickRenderer; + // this.labelRenderer = $.jqplot.AxisLabelRenderer; + $.extend(true, this, {tickOptions:{formatString:'%d'}}, options); + var db = this._dataBounds; + // Go through all the series attached to this axis and find + // the min/max bounds for this axis. + for (var i=0; i<this._series.length; i++) { + var s = this._series[i]; + if (s.groups) { + this.groups = s.groups; + } + var d = s.data; + + for (var j=0; j<d.length; j++) { + if (this.name == 'xaxis' || this.name == 'x2axis') { + if (d[j][0] < db.min || db.min == null) { + db.min = d[j][0]; + } + if (d[j][0] > db.max || db.max == null) { + db.max = d[j][0]; + } + } + else { + if (d[j][1] < db.min || db.min == null) { + db.min = d[j][1]; + } + if (d[j][1] > db.max || db.max == null) { + db.max = d[j][1]; + } + } + } + } + + if (this.groupLabels.length) { + this.groups = this.groupLabels.length; + } + }; + + + $.jqplot.CategoryAxisRenderer.prototype.createTicks = function() { + // we're are operating on an axis here + var ticks = this._ticks; + var userTicks = this.ticks; + var name = this.name; + // databounds were set on axis initialization. + var db = this._dataBounds; + var dim, interval; + var min, max; + var pos1, pos2; + var tt, i; + + // if we already have ticks, use them. + if (userTicks.length) { + // adjust with blanks if we have groups + if (this.groups > 1 && !this._grouped) { + var l = userTicks.length; + var skip = parseInt(l/this.groups, 10); + var count = 0; + for (var i=skip; i<l; i+=skip) { + userTicks.splice(i+count, 0, ' '); + count++; + } + this._grouped = true; + } + this.min = 0.5; + this.max = userTicks.length + 0.5; + var range = this.max - this.min; + this.numberTicks = 2*userTicks.length + 1; + for (i=0; i<userTicks.length; i++){ + tt = this.min + 2 * i * range / (this.numberTicks-1); + // need a marker before and after the tick + var t = new this.tickRenderer(this.tickOptions); + t.showLabel = false; + // t.showMark = true; + t.setTick(tt, this.name); + this._ticks.push(t); + var t = new this.tickRenderer(this.tickOptions); + t.label = userTicks[i]; + // t.showLabel = true; + t.showMark = false; + t.showGridline = false; + t.setTick(tt+0.5, this.name); + this._ticks.push(t); + } + // now add the last tick at the end + var t = new this.tickRenderer(this.tickOptions); + t.showLabel = false; + // t.showMark = true; + t.setTick(tt+1, this.name); + this._ticks.push(t); + } + + // we don't have any ticks yet, let's make some! + else { + if (name == 'xaxis' || name == 'x2axis') { + dim = this._plotDimensions.width; + } + else { + dim = this._plotDimensions.height; + } + + // if min, max and number of ticks specified, user can't specify interval. + if (this.min != null && this.max != null && this.numberTicks != null) { + this.tickInterval = null; + } + + // if max, min, and interval specified and interval won't fit, ignore interval. + if (this.min != null && this.max != null && this.tickInterval != null) { + if (parseInt((this.max-this.min)/this.tickInterval, 10) != (this.max-this.min)/this.tickInterval) { + this.tickInterval = null; + } + } + + // find out how many categories are in the lines and collect labels + var labels = []; + var numcats = 0; + var min = 0.5; + var max, val; + var isMerged = false; + for (var i=0; i<this._series.length; i++) { + var s = this._series[i]; + for (var j=0; j<s.data.length; j++) { + if (this.name == 'xaxis' || this.name == 'x2axis') { + val = s.data[j][0]; + } + else { + val = s.data[j][1]; + } + if ($.inArray(val, labels) == -1) { + isMerged = true; + numcats += 1; + labels.push(val); + } + } + } + + if (isMerged && this.sortMergedLabels) { + labels.sort(function(a,b) { return a - b; }); + } + + // keep a reference to these tick labels to use for redrawing plot (see bug #57) + this.ticks = labels; + + // now bin the data values to the right lables. + for (var i=0; i<this._series.length; i++) { + var s = this._series[i]; + for (var j=0; j<s.data.length; j++) { + if (this.name == 'xaxis' || this.name == 'x2axis') { + val = s.data[j][0]; + } + else { + val = s.data[j][1]; + } + // for category axis, force the values into category bins. + // we should have the value in the label array now. + var idx = $.inArray(val, labels)+1; + if (this.name == 'xaxis' || this.name == 'x2axis') { + s.data[j][0] = idx; + } + else { + s.data[j][1] = idx; + } + } + } + + // adjust with blanks if we have groups + if (this.groups > 1 && !this._grouped) { + var l = labels.length; + var skip = parseInt(l/this.groups, 10); + var count = 0; + for (var i=skip; i<l; i+=skip+1) { + labels[i] = ' '; + } + this._grouped = true; + } + + max = numcats + 0.5; + if (this.numberTicks == null) { + this.numberTicks = 2*numcats + 1; + } + + var range = max - min; + this.min = min; + this.max = max; + var track = 0; + + // todo: adjust this so more ticks displayed. + var maxVisibleTicks = parseInt(3+dim/10, 10); + var skip = parseInt(numcats/maxVisibleTicks, 10); + + if (this.tickInterval == null) { + + this.tickInterval = range / (this.numberTicks-1); + + } + // if tickInterval is specified, we will ignore any computed maximum. + for (var i=0; i<this.numberTicks; i++){ + tt = this.min + i * this.tickInterval; + var t = new this.tickRenderer(this.tickOptions); + // if even tick, it isn't a category, it's a divider + if (i/2 == parseInt(i/2, 10)) { + t.showLabel = false; + t.showMark = true; + } + else { + if (skip>0 && track<skip) { + t.showLabel = false; + track += 1; + } + else { + t.showLabel = true; + track = 0; + } + t.label = t.formatter(t.formatString, labels[(i-1)/2]); + t.showMark = false; + t.showGridline = false; + } + t.setTick(tt, this.name); + this._ticks.push(t); + } + } + + }; + + // called with scope of axis + $.jqplot.CategoryAxisRenderer.prototype.draw = function(ctx, plot) { + if (this.show) { + // populate the axis label and value properties. + // createTicks is a method on the renderer, but + // call it within the scope of the axis. + this.renderer.createTicks.call(this); + // fill a div with axes labels in the right direction. + // Need to pregenerate each axis to get it's bounds and + // position it and the labels correctly on the plot. + var dim=0; + var temp; + // Added for theming. + if (this._elem) { + // this._elem.empty(); + // Memory Leaks patch + this._elem.emptyForce(); + } + + this._elem = this._elem || $('<div class="jqplot-axis jqplot-'+this.name+'" style="position:absolute;"></div>'); + + if (this.name == 'xaxis' || this.name == 'x2axis') { + this._elem.width(this._plotDimensions.width); + } + else { + this._elem.height(this._plotDimensions.height); + } + + // create a _label object. + this.labelOptions.axis = this.name; + this._label = new this.labelRenderer(this.labelOptions); + if (this._label.show) { + var elem = this._label.draw(ctx, plot); + elem.appendTo(this._elem); + } + + var t = this._ticks; + for (var i=0; i<t.length; i++) { + var tick = t[i]; + if (tick.showLabel && (!tick.isMinorTick || this.showMinorTicks)) { + var elem = tick.draw(ctx, plot); + elem.appendTo(this._elem); + } + } + + this._groupLabels = []; + // now make group labels + for (var i=0; i<this.groupLabels.length; i++) + { + var elem = $('<div style="position:absolute;" class="jqplot-'+this.name+'-groupLabel"></div>'); + elem.html(this.groupLabels[i]); + this._groupLabels.push(elem); + elem.appendTo(this._elem); + } + } + return this._elem; + }; + + // called with scope of axis + $.jqplot.CategoryAxisRenderer.prototype.set = function() { + var dim = 0; + var temp; + var w = 0; + var h = 0; + var lshow = (this._label == null) ? false : this._label.show; + if (this.show) { + var t = this._ticks; + for (var i=0; i<t.length; i++) { + var tick = t[i]; + if (tick.showLabel && (!tick.isMinorTick || this.showMinorTicks)) { + if (this.name == 'xaxis' || this.name == 'x2axis') { + temp = tick._elem.outerHeight(true); + } + else { + temp = tick._elem.outerWidth(true); + } + if (temp > dim) { + dim = temp; + } + } + } + + var dim2 = 0; + for (var i=0; i<this._groupLabels.length; i++) { + var l = this._groupLabels[i]; + if (this.name == 'xaxis' || this.name == 'x2axis') { + temp = l.outerHeight(true); + } + else { + temp = l.outerWidth(true); + } + if (temp > dim2) { + dim2 = temp; + } + } + + if (lshow) { + w = this._label._elem.outerWidth(true); + h = this._label._elem.outerHeight(true); + } + if (this.name == 'xaxis') { + dim += dim2 + h; + this._elem.css({'height':dim+'px', left:'0px', bottom:'0px'}); + } + else if (this.name == 'x2axis') { + dim += dim2 + h; + this._elem.css({'height':dim+'px', left:'0px', top:'0px'}); + } + else if (this.name == 'yaxis') { + dim += dim2 + w; + this._elem.css({'width':dim+'px', left:'0px', top:'0px'}); + if (lshow && this._label.constructor == $.jqplot.AxisLabelRenderer) { + this._label._elem.css('width', w+'px'); + } + } + else { + dim += dim2 + w; + this._elem.css({'width':dim+'px', right:'0px', top:'0px'}); + if (lshow && this._label.constructor == $.jqplot.AxisLabelRenderer) { + this._label._elem.css('width', w+'px'); + } + } + } + }; + + // called with scope of axis + $.jqplot.CategoryAxisRenderer.prototype.pack = function(pos, offsets) { + var ticks = this._ticks; + var max = this.max; + var min = this.min; + var offmax = offsets.max; + var offmin = offsets.min; + var lshow = (this._label == null) ? false : this._label.show; + var i; + + for (var p in pos) { + this._elem.css(p, pos[p]); + } + + this._offsets = offsets; + // pixellength will be + for x axes and - for y axes becasue pixels always measured from top left. + var pixellength = offmax - offmin; + var unitlength = max - min; + + // point to unit and unit to point conversions references to Plot DOM element top left corner. + this.p2u = function(p){ + return (p - offmin) * unitlength / pixellength + min; + }; + + this.u2p = function(u){ + return (u - min) * pixellength / unitlength + offmin; + }; + + if (this.name == 'xaxis' || this.name == 'x2axis'){ + this.series_u2p = function(u){ + return (u - min) * pixellength / unitlength; + }; + this.series_p2u = function(p){ + return p * unitlength / pixellength + min; + }; + } + + else { + this.series_u2p = function(u){ + return (u - max) * pixellength / unitlength; + }; + this.series_p2u = function(p){ + return p * unitlength / pixellength + max; + }; + } + + if (this.show) { + if (this.name == 'xaxis' || this.name == 'x2axis') { + for (i=0; i<ticks.length; i++) { + var t = ticks[i]; + if (t.show && t.showLabel) { + var shim; + + if (t.constructor == $.jqplot.CanvasAxisTickRenderer && t.angle) { + // will need to adjust auto positioning based on which axis this is. + var temp = (this.name == 'xaxis') ? 1 : -1; + switch (t.labelPosition) { + case 'auto': + // position at end + if (temp * t.angle < 0) { + shim = -t.getWidth() + t._textRenderer.height * Math.sin(-t._textRenderer.angle) / 2; + } + // position at start + else { + shim = -t._textRenderer.height * Math.sin(t._textRenderer.angle) / 2; + } + break; + case 'end': + shim = -t.getWidth() + t._textRenderer.height * Math.sin(-t._textRenderer.angle) / 2; + break; + case 'start': + shim = -t._textRenderer.height * Math.sin(t._textRenderer.angle) / 2; + break; + case 'middle': + shim = -t.getWidth()/2 + t._textRenderer.height * Math.sin(-t._textRenderer.angle) / 2; + break; + default: + shim = -t.getWidth()/2 + t._textRenderer.height * Math.sin(-t._textRenderer.angle) / 2; + break; + } + } + else { + shim = -t.getWidth()/2; + } + var val = this.u2p(t.value) + shim + 'px'; + t._elem.css('left', val); + t.pack(); + } + } + + var labeledge=['bottom', 0]; + if (lshow) { + var w = this._label._elem.outerWidth(true); + this._label._elem.css('left', offmin + pixellength/2 - w/2 + 'px'); + if (this.name == 'xaxis') { + this._label._elem.css('bottom', '0px'); + labeledge = ['bottom', this._label._elem.outerHeight(true)]; + } + else { + this._label._elem.css('top', '0px'); + labeledge = ['top', this._label._elem.outerHeight(true)]; + } + this._label.pack(); + } + + // draw the group labels + var step = parseInt(this._ticks.length/this.groups, 10); + for (i=0; i<this._groupLabels.length; i++) { + var mid = 0; + var count = 0; + for (var j=i*step; j<=(i+1)*step; j++) { + if (this._ticks[j]._elem && this._ticks[j].label != " ") { + var t = this._ticks[j]._elem; + var p = t.position(); + mid += p.left + t.outerWidth(true)/2; + count++; + } + } + mid = mid/count; + this._groupLabels[i].css({'left':(mid - this._groupLabels[i].outerWidth(true)/2)}); + this._groupLabels[i].css(labeledge[0], labeledge[1]); + } + } + else { + for (i=0; i<ticks.length; i++) { + var t = ticks[i]; + if (t.show && t.showLabel) { + var shim; + if (t.constructor == $.jqplot.CanvasAxisTickRenderer && t.angle) { + // will need to adjust auto positioning based on which axis this is. + var temp = (this.name == 'yaxis') ? 1 : -1; + switch (t.labelPosition) { + case 'auto': + // position at end + case 'end': + if (temp * t.angle < 0) { + shim = -t._textRenderer.height * Math.cos(-t._textRenderer.angle) / 2; + } + else { + shim = -t.getHeight() + t._textRenderer.height * Math.cos(t._textRenderer.angle) / 2; + } + break; + case 'start': + if (t.angle > 0) { + shim = -t._textRenderer.height * Math.cos(-t._textRenderer.angle) / 2; + } + else { + shim = -t.getHeight() + t._textRenderer.height * Math.cos(t._textRenderer.angle) / 2; + } + break; + case 'middle': + // if (t.angle > 0) { + // shim = -t.getHeight()/2 + t._textRenderer.height * Math.sin(-t._textRenderer.angle) / 2; + // } + // else { + // shim = -t.getHeight()/2 - t._textRenderer.height * Math.sin(t._textRenderer.angle) / 2; + // } + shim = -t.getHeight()/2; + break; + default: + shim = -t.getHeight()/2; + break; + } + } + else { + shim = -t.getHeight()/2; + } + + var val = this.u2p(t.value) + shim + 'px'; + t._elem.css('top', val); + t.pack(); + } + } + + var labeledge=['left', 0]; + if (lshow) { + var h = this._label._elem.outerHeight(true); + this._label._elem.css('top', offmax - pixellength/2 - h/2 + 'px'); + if (this.name == 'yaxis') { + this._label._elem.css('left', '0px'); + labeledge = ['left', this._label._elem.outerWidth(true)]; + } + else { + this._label._elem.css('right', '0px'); + labeledge = ['right', this._label._elem.outerWidth(true)]; + } + this._label.pack(); + } + + // draw the group labels, position top here, do left after label position. + var step = parseInt(this._ticks.length/this.groups, 10); + for (i=0; i<this._groupLabels.length; i++) { + var mid = 0; + var count = 0; + for (var j=i*step; j<=(i+1)*step; j++) { + if (this._ticks[j]._elem && this._ticks[j].label != " ") { + var t = this._ticks[j]._elem; + var p = t.position(); + mid += p.top + t.outerHeight()/2; + count++; + } + } + mid = mid/count; + this._groupLabels[i].css({'top':mid - this._groupLabels[i].outerHeight()/2}); + this._groupLabels[i].css(labeledge[0], labeledge[1]); + + } + } + } + }; + + +})(jQuery); \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/plugins/jqplot.categoryAxisRenderer.min.js b/libreplan-webapp/src/main/webapp/jqplot/plugins/jqplot.categoryAxisRenderer.min.js new file mode 100644 index 000000000..e822bfee1 --- /dev/null +++ b/libreplan-webapp/src/main/webapp/jqplot/plugins/jqplot.categoryAxisRenderer.min.js @@ -0,0 +1,57 @@ +/** + * jqPlot + * Pure JavaScript plotting plugin using jQuery + * + * Version: 1.0.0b2_r1012 + * + * Copyright (c) 2009-2011 Chris Leonello + * jqPlot is currently available for use in all personal or commercial projects + * under both the MIT (http://www.opensource.org/licenses/mit-license.php) and GPL + * version 2.0 (http://www.gnu.org/licenses/gpl-2.0.html) licenses. This means that you can + * choose the license that best suits your project and use it accordingly. + * + * Although not required, the author would appreciate an email letting him + * know of any substantial use of jqPlot. You can reach the author at: + * chris at jqplot dot com or see http://www.jqplot.com/info.php . + * + * If you are feeling kind and generous, consider supporting the project by + * making a donation at: http://www.jqplot.com/donate.php . + * + * sprintf functions contained in jqplot.sprintf.js by Ash Searle: + * + * version 2007.04.27 + * author Ash Searle + * http://hexmen.com/blog/2007/03/printf-sprintf/ + * http://hexmen.com/js/sprintf.js + * The author (Ash Searle) has placed this code in the public domain: + * "This code is unrestricted: you are free to use it however you like." + * + * included jsDate library by Chris Leonello: + * + * Copyright (c) 2010-2011 Chris Leonello + * + * jsDate is currently available for use in all personal or commercial projects + * under both the MIT and GPL version 2.0 licenses. This means that you can + * choose the license that best suits your project and use it accordingly. + * + * jsDate borrows many concepts and ideas from the Date Instance + * Methods by Ken Snyder along with some parts of Ken's actual code. + * + * Ken's origianl Date Instance Methods and copyright notice: + * + * Ken Snyder (ken d snyder at gmail dot com) + * 2008-09-10 + * version 2.0.2 (http://kendsnyder.com/sandbox/date/) + * Creative Commons Attribution License 3.0 (http://creativecommons.org/licenses/by/3.0/) + * + * jqplotToImage function based on Larry Siden's export-jqplot-to-png.js. + * Larry has generously given permission to adapt his code for inclusion + * into jqPlot. + * + * Larry's original code can be found here: + * + * https://github.com/lsiden/export-jqplot-to-png + * + * + */ +(function(a){a.jqplot.CategoryAxisRenderer=function(b){a.jqplot.LinearAxisRenderer.call(this);this.sortMergedLabels=false};a.jqplot.CategoryAxisRenderer.prototype=new a.jqplot.LinearAxisRenderer();a.jqplot.CategoryAxisRenderer.prototype.constructor=a.jqplot.CategoryAxisRenderer;a.jqplot.CategoryAxisRenderer.prototype.init=function(e){this.groups=1;this.groupLabels=[];this._groupLabels=[];this._grouped=false;this._barsPerGroup=null;a.extend(true,this,{tickOptions:{formatString:"%d"}},e);var b=this._dataBounds;for(var f=0;f<this._series.length;f++){var g=this._series[f];if(g.groups){this.groups=g.groups}var h=g.data;for(var c=0;c<h.length;c++){if(this.name=="xaxis"||this.name=="x2axis"){if(h[c][0]<b.min||b.min==null){b.min=h[c][0]}if(h[c][0]>b.max||b.max==null){b.max=h[c][0]}}else{if(h[c][1]<b.min||b.min==null){b.min=h[c][1]}if(h[c][1]>b.max||b.max==null){b.max=h[c][1]}}}}if(this.groupLabels.length){this.groups=this.groupLabels.length}};a.jqplot.CategoryAxisRenderer.prototype.createTicks=function(){var D=this._ticks;var z=this.ticks;var F=this.name;var C=this._dataBounds;var v,A;var q,w;var d,c;var b,x;if(z.length){if(this.groups>1&&!this._grouped){var r=z.length;var p=parseInt(r/this.groups,10);var e=0;for(var x=p;x<r;x+=p){z.splice(x+e,0," ");e++}this._grouped=true}this.min=0.5;this.max=z.length+0.5;var m=this.max-this.min;this.numberTicks=2*z.length+1;for(x=0;x<z.length;x++){b=this.min+2*x*m/(this.numberTicks-1);var h=new this.tickRenderer(this.tickOptions);h.showLabel=false;h.setTick(b,this.name);this._ticks.push(h);var h=new this.tickRenderer(this.tickOptions);h.label=z[x];h.showMark=false;h.showGridline=false;h.setTick(b+0.5,this.name);this._ticks.push(h)}var h=new this.tickRenderer(this.tickOptions);h.showLabel=false;h.setTick(b+1,this.name);this._ticks.push(h)}else{if(F=="xaxis"||F=="x2axis"){v=this._plotDimensions.width}else{v=this._plotDimensions.height}if(this.min!=null&&this.max!=null&&this.numberTicks!=null){this.tickInterval=null}if(this.min!=null&&this.max!=null&&this.tickInterval!=null){if(parseInt((this.max-this.min)/this.tickInterval,10)!=(this.max-this.min)/this.tickInterval){this.tickInterval=null}}var y=[];var B=0;var q=0.5;var w,E;var f=false;for(var x=0;x<this._series.length;x++){var k=this._series[x];for(var u=0;u<k.data.length;u++){if(this.name=="xaxis"||this.name=="x2axis"){E=k.data[u][0]}else{E=k.data[u][1]}if(a.inArray(E,y)==-1){f=true;B+=1;y.push(E)}}}if(f&&this.sortMergedLabels){y.sort(function(j,i){return j-i})}this.ticks=y;for(var x=0;x<this._series.length;x++){var k=this._series[x];for(var u=0;u<k.data.length;u++){if(this.name=="xaxis"||this.name=="x2axis"){E=k.data[u][0]}else{E=k.data[u][1]}var n=a.inArray(E,y)+1;if(this.name=="xaxis"||this.name=="x2axis"){k.data[u][0]=n}else{k.data[u][1]=n}}}if(this.groups>1&&!this._grouped){var r=y.length;var p=parseInt(r/this.groups,10);var e=0;for(var x=p;x<r;x+=p+1){y[x]=" "}this._grouped=true}w=B+0.5;if(this.numberTicks==null){this.numberTicks=2*B+1}var m=w-q;this.min=q;this.max=w;var o=0;var g=parseInt(3+v/10,10);var p=parseInt(B/g,10);if(this.tickInterval==null){this.tickInterval=m/(this.numberTicks-1)}for(var x=0;x<this.numberTicks;x++){b=this.min+x*this.tickInterval;var h=new this.tickRenderer(this.tickOptions);if(x/2==parseInt(x/2,10)){h.showLabel=false;h.showMark=true}else{if(p>0&&o<p){h.showLabel=false;o+=1}else{h.showLabel=true;o=0}h.label=h.formatter(h.formatString,y[(x-1)/2]);h.showMark=false;h.showGridline=false}h.setTick(b,this.name);this._ticks.push(h)}}};a.jqplot.CategoryAxisRenderer.prototype.draw=function(b,j){if(this.show){this.renderer.createTicks.call(this);var h=0;var c;if(this._elem){this._elem.emptyForce()}this._elem=this._elem||a('<div class="jqplot-axis jqplot-'+this.name+'" style="position:absolute;"></div>');if(this.name=="xaxis"||this.name=="x2axis"){this._elem.width(this._plotDimensions.width)}else{this._elem.height(this._plotDimensions.height)}this.labelOptions.axis=this.name;this._label=new this.labelRenderer(this.labelOptions);if(this._label.show){var g=this._label.draw(b,j);g.appendTo(this._elem)}var f=this._ticks;for(var e=0;e<f.length;e++){var d=f[e];if(d.showLabel&&(!d.isMinorTick||this.showMinorTicks)){var g=d.draw(b,j);g.appendTo(this._elem)}}this._groupLabels=[];for(var e=0;e<this.groupLabels.length;e++){var g=a('<div style="position:absolute;" class="jqplot-'+this.name+'-groupLabel"></div>');g.html(this.groupLabels[e]);this._groupLabels.push(g);g.appendTo(this._elem)}}return this._elem};a.jqplot.CategoryAxisRenderer.prototype.set=function(){var e=0;var m;var k=0;var f=0;var d=(this._label==null)?false:this._label.show;if(this.show){var n=this._ticks;for(var c=0;c<n.length;c++){var g=n[c];if(g.showLabel&&(!g.isMinorTick||this.showMinorTicks)){if(this.name=="xaxis"||this.name=="x2axis"){m=g._elem.outerHeight(true)}else{m=g._elem.outerWidth(true)}if(m>e){e=m}}}var j=0;for(var c=0;c<this._groupLabels.length;c++){var b=this._groupLabels[c];if(this.name=="xaxis"||this.name=="x2axis"){m=b.outerHeight(true)}else{m=b.outerWidth(true)}if(m>j){j=m}}if(d){k=this._label._elem.outerWidth(true);f=this._label._elem.outerHeight(true)}if(this.name=="xaxis"){e+=j+f;this._elem.css({height:e+"px",left:"0px",bottom:"0px"})}else{if(this.name=="x2axis"){e+=j+f;this._elem.css({height:e+"px",left:"0px",top:"0px"})}else{if(this.name=="yaxis"){e+=j+k;this._elem.css({width:e+"px",left:"0px",top:"0px"});if(d&&this._label.constructor==a.jqplot.AxisLabelRenderer){this._label._elem.css("width",k+"px")}}else{e+=j+k;this._elem.css({width:e+"px",right:"0px",top:"0px"});if(d&&this._label.constructor==a.jqplot.AxisLabelRenderer){this._label._elem.css("width",k+"px")}}}}}};a.jqplot.CategoryAxisRenderer.prototype.pack=function(e,c){var C=this._ticks;var v=this.max;var s=this.min;var n=c.max;var l=c.min;var q=(this._label==null)?false:this._label.show;var x;for(var r in e){this._elem.css(r,e[r])}this._offsets=c;var g=n-l;var k=v-s;this.p2u=function(h){return(h-l)*k/g+s};this.u2p=function(h){return(h-s)*g/k+l};if(this.name=="xaxis"||this.name=="x2axis"){this.series_u2p=function(h){return(h-s)*g/k};this.series_p2u=function(h){return h*k/g+s}}else{this.series_u2p=function(h){return(h-v)*g/k};this.series_p2u=function(h){return h*k/g+v}}if(this.show){if(this.name=="xaxis"||this.name=="x2axis"){for(x=0;x<C.length;x++){var o=C[x];if(o.show&&o.showLabel){var b;if(o.constructor==a.jqplot.CanvasAxisTickRenderer&&o.angle){var A=(this.name=="xaxis")?1:-1;switch(o.labelPosition){case"auto":if(A*o.angle<0){b=-o.getWidth()+o._textRenderer.height*Math.sin(-o._textRenderer.angle)/2}else{b=-o._textRenderer.height*Math.sin(o._textRenderer.angle)/2}break;case"end":b=-o.getWidth()+o._textRenderer.height*Math.sin(-o._textRenderer.angle)/2;break;case"start":b=-o._textRenderer.height*Math.sin(o._textRenderer.angle)/2;break;case"middle":b=-o.getWidth()/2+o._textRenderer.height*Math.sin(-o._textRenderer.angle)/2;break;default:b=-o.getWidth()/2+o._textRenderer.height*Math.sin(-o._textRenderer.angle)/2;break}}else{b=-o.getWidth()/2}var D=this.u2p(o.value)+b+"px";o._elem.css("left",D);o.pack()}}var z=["bottom",0];if(q){var m=this._label._elem.outerWidth(true);this._label._elem.css("left",l+g/2-m/2+"px");if(this.name=="xaxis"){this._label._elem.css("bottom","0px");z=["bottom",this._label._elem.outerHeight(true)]}else{this._label._elem.css("top","0px");z=["top",this._label._elem.outerHeight(true)]}this._label.pack()}var d=parseInt(this._ticks.length/this.groups,10);for(x=0;x<this._groupLabels.length;x++){var B=0;var f=0;for(var u=x*d;u<=(x+1)*d;u++){if(this._ticks[u]._elem&&this._ticks[u].label!=" "){var o=this._ticks[u]._elem;var r=o.position();B+=r.left+o.outerWidth(true)/2;f++}}B=B/f;this._groupLabels[x].css({left:(B-this._groupLabels[x].outerWidth(true)/2)});this._groupLabels[x].css(z[0],z[1])}}else{for(x=0;x<C.length;x++){var o=C[x];if(o.show&&o.showLabel){var b;if(o.constructor==a.jqplot.CanvasAxisTickRenderer&&o.angle){var A=(this.name=="yaxis")?1:-1;switch(o.labelPosition){case"auto":case"end":if(A*o.angle<0){b=-o._textRenderer.height*Math.cos(-o._textRenderer.angle)/2}else{b=-o.getHeight()+o._textRenderer.height*Math.cos(o._textRenderer.angle)/2}break;case"start":if(o.angle>0){b=-o._textRenderer.height*Math.cos(-o._textRenderer.angle)/2}else{b=-o.getHeight()+o._textRenderer.height*Math.cos(o._textRenderer.angle)/2}break;case"middle":b=-o.getHeight()/2;break;default:b=-o.getHeight()/2;break}}else{b=-o.getHeight()/2}var D=this.u2p(o.value)+b+"px";o._elem.css("top",D);o.pack()}}var z=["left",0];if(q){var y=this._label._elem.outerHeight(true);this._label._elem.css("top",n-g/2-y/2+"px");if(this.name=="yaxis"){this._label._elem.css("left","0px");z=["left",this._label._elem.outerWidth(true)]}else{this._label._elem.css("right","0px");z=["right",this._label._elem.outerWidth(true)]}this._label.pack()}var d=parseInt(this._ticks.length/this.groups,10);for(x=0;x<this._groupLabels.length;x++){var B=0;var f=0;for(var u=x*d;u<=(x+1)*d;u++){if(this._ticks[u]._elem&&this._ticks[u].label!=" "){var o=this._ticks[u]._elem;var r=o.position();B+=r.top+o.outerHeight()/2;f++}}B=B/f;this._groupLabels[x].css({top:B-this._groupLabels[x].outerHeight()/2});this._groupLabels[x].css(z[0],z[1])}}}}})(jQuery); \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/plugins/jqplot.ciParser.js b/libreplan-webapp/src/main/webapp/jqplot/plugins/jqplot.ciParser.js new file mode 100644 index 000000000..9236ed83b --- /dev/null +++ b/libreplan-webapp/src/main/webapp/jqplot/plugins/jqplot.ciParser.js @@ -0,0 +1,115 @@ +/** + * jqPlot + * Pure JavaScript plotting plugin using jQuery + * + * Version: 1.0.0b2_r1012 + * + * Copyright (c) 2009-2011 Chris Leonello + * jqPlot is currently available for use in all personal or commercial projects + * under both the MIT (http://www.opensource.org/licenses/mit-license.php) and GPL + * version 2.0 (http://www.gnu.org/licenses/gpl-2.0.html) licenses. This means that you can + * choose the license that best suits your project and use it accordingly. + * + * Although not required, the author would appreciate an email letting him + * know of any substantial use of jqPlot. You can reach the author at: + * chris at jqplot dot com or see http://www.jqplot.com/info.php . + * + * If you are feeling kind and generous, consider supporting the project by + * making a donation at: http://www.jqplot.com/donate.php . + * + * sprintf functions contained in jqplot.sprintf.js by Ash Searle: + * + * version 2007.04.27 + * author Ash Searle + * http://hexmen.com/blog/2007/03/printf-sprintf/ + * http://hexmen.com/js/sprintf.js + * The author (Ash Searle) has placed this code in the public domain: + * "This code is unrestricted: you are free to use it however you like." + * + */ +(function($) { + /** + * Class: $.jqplot.ciParser + * Data Renderer function which converts a custom JSON data object into jqPlot data format. + * Set this as a callable on the jqplot dataRenderer plot option: + * + * > plot = $.jqplot('mychart', [data], { dataRenderer: $.jqplot.ciParser, ... }); + * + * Where data is an object in JSON format or a JSON encoded string conforming to the + * City Index API spec. + * + * Note that calling the renderer function is handled internally by jqPlot. The + * user does not have to call the function. The parameters described below will + * automatically be passed to the ciParser function. + * + * Parameters: + * data - JSON encoded string or object. + * plot - reference to jqPlot Plot object. + * + * Returns: + * data array in jqPlot format. + * + */ + $.jqplot.ciParser = function (data, plot) { + var ret = [], + line, + temp, + i, j, k, kk; + + if (typeof(data) == "string") { + data = $.jqplot.JSON.parse(data, handleStrings); + } + + else if (typeof(data) == "object") { + for (k in data) { + for (i=0; i<data[k].length; i++) { + for (kk in data[k][i]) { + data[k][i][kk] = handleStrings(kk, data[k][i][kk]); + } + } + } + } + + else { + return null; + } + + // function handleStrings + // Checks any JSON encoded strings to see if they are + // encoded dates. If so, pull out the timestamp. + // Expects dates to be represented by js timestamps. + + function handleStrings(key, value) { + var a; + if (value != null) { + if (value.toString().indexOf('Date') >= 0) { + //here we will try to extract the ticks from the Date string in the "value" fields of JSON returned data + a = /^\/Date\((-?[0-9]+)\)\/$/.exec(value); + if (a) { + return parseInt(a[1], 10); + } + } + return value; + } + } + + for (var prop in data) { + line = []; + temp = data[prop]; + switch (prop) { + case "PriceTicks": + for (i=0; i<temp.length; i++) { + line.push([temp[i]['TickDate'], temp[i]['Price']]); + } + break; + case "PriceBars": + for (i=0; i<temp.length; i++) { + line.push([temp[i]['BarDate'], temp[i]['Open'], temp[i]['High'], temp[i]['Low'], temp[i]['Close']]); + } + break; + } + ret.push(line); + } + return ret; + }; +})(jQuery); \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/plugins/jqplot.ciParser.min.js b/libreplan-webapp/src/main/webapp/jqplot/plugins/jqplot.ciParser.min.js new file mode 100644 index 000000000..aaafc5cd6 --- /dev/null +++ b/libreplan-webapp/src/main/webapp/jqplot/plugins/jqplot.ciParser.min.js @@ -0,0 +1,57 @@ +/** + * jqPlot + * Pure JavaScript plotting plugin using jQuery + * + * Version: 1.0.0b2_r1012 + * + * Copyright (c) 2009-2011 Chris Leonello + * jqPlot is currently available for use in all personal or commercial projects + * under both the MIT (http://www.opensource.org/licenses/mit-license.php) and GPL + * version 2.0 (http://www.gnu.org/licenses/gpl-2.0.html) licenses. This means that you can + * choose the license that best suits your project and use it accordingly. + * + * Although not required, the author would appreciate an email letting him + * know of any substantial use of jqPlot. You can reach the author at: + * chris at jqplot dot com or see http://www.jqplot.com/info.php . + * + * If you are feeling kind and generous, consider supporting the project by + * making a donation at: http://www.jqplot.com/donate.php . + * + * sprintf functions contained in jqplot.sprintf.js by Ash Searle: + * + * version 2007.04.27 + * author Ash Searle + * http://hexmen.com/blog/2007/03/printf-sprintf/ + * http://hexmen.com/js/sprintf.js + * The author (Ash Searle) has placed this code in the public domain: + * "This code is unrestricted: you are free to use it however you like." + * + * included jsDate library by Chris Leonello: + * + * Copyright (c) 2010-2011 Chris Leonello + * + * jsDate is currently available for use in all personal or commercial projects + * under both the MIT and GPL version 2.0 licenses. This means that you can + * choose the license that best suits your project and use it accordingly. + * + * jsDate borrows many concepts and ideas from the Date Instance + * Methods by Ken Snyder along with some parts of Ken's actual code. + * + * Ken's origianl Date Instance Methods and copyright notice: + * + * Ken Snyder (ken d snyder at gmail dot com) + * 2008-09-10 + * version 2.0.2 (http://kendsnyder.com/sandbox/date/) + * Creative Commons Attribution License 3.0 (http://creativecommons.org/licenses/by/3.0/) + * + * jqplotToImage function based on Larry Siden's export-jqplot-to-png.js. + * Larry has generously given permission to adapt his code for inclusion + * into jqPlot. + * + * Larry's original code can be found here: + * + * https://github.com/lsiden/export-jqplot-to-png + * + * + */ +(function(a){a.jqplot.ciParser=function(g,l){var m=[],o,n,h,f,e,c;if(typeof(g)=="string"){g=a.jqplot.JSON.parse(g,d)}else{if(typeof(g)=="object"){for(e in g){for(h=0;h<g[e].length;h++){for(c in g[e][h]){g[e][h][c]=d(c,g[e][h][c])}}}}else{return null}}function d(j,k){var i;if(k!=null){if(k.toString().indexOf("Date")>=0){i=/^\/Date\((-?[0-9]+)\)\/$/.exec(k);if(i){return parseInt(i[1],10)}}return k}}for(var b in g){o=[];n=g[b];switch(b){case"PriceTicks":for(h=0;h<n.length;h++){o.push([n[h]["TickDate"],n[h]["Price"]])}break;case"PriceBars":for(h=0;h<n.length;h++){o.push([n[h]["BarDate"],n[h]["Open"],n[h]["High"],n[h]["Low"],n[h]["Close"]])}break}m.push(o)}return m}})(jQuery); \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/plugins/jqplot.cursor.js b/libreplan-webapp/src/main/webapp/jqplot/plugins/jqplot.cursor.js new file mode 100644 index 000000000..8304b7d53 --- /dev/null +++ b/libreplan-webapp/src/main/webapp/jqplot/plugins/jqplot.cursor.js @@ -0,0 +1,1093 @@ +/** + * jqPlot + * Pure JavaScript plotting plugin using jQuery + * + * Version: 1.0.0b2_r1012 + * + * Copyright (c) 2009-2011 Chris Leonello + * jqPlot is currently available for use in all personal or commercial projects + * under both the MIT (http://www.opensource.org/licenses/mit-license.php) and GPL + * version 2.0 (http://www.gnu.org/licenses/gpl-2.0.html) licenses. This means that you can + * choose the license that best suits your project and use it accordingly. + * + * Although not required, the author would appreciate an email letting him + * know of any substantial use of jqPlot. You can reach the author at: + * chris at jqplot dot com or see http://www.jqplot.com/info.php . + * + * If you are feeling kind and generous, consider supporting the project by + * making a donation at: http://www.jqplot.com/donate.php . + * + * sprintf functions contained in jqplot.sprintf.js by Ash Searle: + * + * version 2007.04.27 + * author Ash Searle + * http://hexmen.com/blog/2007/03/printf-sprintf/ + * http://hexmen.com/js/sprintf.js + * The author (Ash Searle) has placed this code in the public domain: + * "This code is unrestricted: you are free to use it however you like." + * + */ +(function($) { + + /** + * Class: $.jqplot.Cursor + * Plugin class representing the cursor as displayed on the plot. + */ + $.jqplot.Cursor = function(options) { + // Group: Properties + // + // prop: style + // CSS spec for cursor style + this.style = 'crosshair'; + this.previousCursor = 'auto'; + // prop: show + // wether to show the cursor or not. + this.show = $.jqplot.config.enablePlugins; + // prop: showTooltip + // show a cursor position tooltip. Location of the tooltip + // will be controlled by followMouse and tooltipLocation. + this.showTooltip = true; + // prop: followMouse + // Tooltip follows the mouse, it is not at a fixed location. + // Tooltip will show on the grid at the location given by + // tooltipLocation, offset from the grid edge by tooltipOffset. + this.followMouse = false; + // prop: tooltipLocation + // Where to position tooltip. If followMouse is true, this is + // relative to the cursor, otherwise, it is relative to the grid. + // One of 'n', 'ne', 'e', 'se', 's', 'sw', 'w', 'nw' + this.tooltipLocation = 'se'; + // prop: tooltipOffset + // Pixel offset of tooltip from the grid boudaries or cursor center. + this.tooltipOffset = 6; + // prop: showTooltipGridPosition + // show the grid pixel coordinates of the mouse. + this.showTooltipGridPosition = false; + // prop: showTooltipUnitPosition + // show the unit (data) coordinates of the mouse. + this.showTooltipUnitPosition = true; + // prop: showTooltipDataPosition + // Used with showVerticalLine to show intersecting data points in the tooltip. + this.showTooltipDataPosition = false; + // prop: tooltipFormatString + // sprintf format string for the tooltip. + // Uses Ash Searle's javascript sprintf implementation + // found here: http://hexmen.com/blog/2007/03/printf-sprintf/ + // See http://perldoc.perl.org/functions/sprintf.html for reference + // Note, if showTooltipDataPosition is true, the default tooltipFormatString + // will be set to the cursorLegendFormatString, not the default given here. + this.tooltipFormatString = '%.4P, %.4P'; + // prop: useAxesFormatters + // Use the x and y axes formatters to format the text in the tooltip. + this.useAxesFormatters = true; + // prop: tooltipAxisGroups + // Show position for the specified axes. + // This is an array like [['xaxis', 'yaxis'], ['xaxis', 'y2axis']] + // Default is to compute automatically for all visible axes. + this.tooltipAxisGroups = []; + // prop: zoom + // Enable plot zooming. + this.zoom = false; + // zoomProxy and zoomTarget properties are not directly set by user. + // They Will be set through call to zoomProxy method. + this.zoomProxy = false; + this.zoomTarget = false; + // prop: looseZoom + // Will expand zoom range to provide more rounded tick values. + // Works only with linear, log and date axes. + this.looseZoom = true; + // prop: clickReset + // Will reset plot zoom if single click on plot without drag. + this.clickReset = false; + // prop: dblClickReset + // Will reset plot zoom if double click on plot without drag. + this.dblClickReset = true; + // prop: showVerticalLine + // draw a vertical line across the plot which follows the cursor. + // When the line is near a data point, a special legend and/or tooltip can + // be updated with the data values. + this.showVerticalLine = false; + // prop: showHorizontalLine + // draw a horizontal line across the plot which follows the cursor. + this.showHorizontalLine = false; + // prop: constrainZoomTo + // 'none', 'x' or 'y' + this.constrainZoomTo = 'none'; + // // prop: autoscaleConstraint + // // when a constrained axis is specified, true will + // // auatoscale the adjacent axis. + // this.autoscaleConstraint = true; + this.shapeRenderer = new $.jqplot.ShapeRenderer(); + this._zoom = {start:[], end:[], started: false, zooming:false, isZoomed:false, axes:{start:{}, end:{}}, gridpos:{}, datapos:{}}; + this._tooltipElem; + this.zoomCanvas; + this.cursorCanvas; + // prop: intersectionThreshold + // pixel distance from data point or marker to consider cursor lines intersecting with point. + // If data point markers are not shown, this should be >= 1 or will often miss point intersections. + this.intersectionThreshold = 2; + // prop: showCursorLegend + // Replace the plot legend with an enhanced legend displaying intersection information. + this.showCursorLegend = false; + // prop: cursorLegendFormatString + // Format string used in the cursor legend. If showTooltipDataPosition is true, + // this will also be the default format string used by tooltipFormatString. + this.cursorLegendFormatString = $.jqplot.Cursor.cursorLegendFormatString; + // whether the cursor is over the grid or not. + this._oldHandlers = {onselectstart: null, ondrag: null, onmousedown: null}; + // prop: constrainOutsideZoom + // True to limit actual zoom area to edges of grid, even when zooming + // outside of plot area. That is, can't zoom out by mousing outside plot. + this.constrainOutsideZoom = true; + // prop: showTooltipOutsideZoom + // True will keep updating the tooltip when zooming of the grid. + this.showTooltipOutsideZoom = false; + // true if mouse is over grid, false if not. + this.onGrid = false; + $.extend(true, this, options); + }; + + $.jqplot.Cursor.cursorLegendFormatString = '%s x:%s, y:%s'; + + // called with scope of plot + $.jqplot.Cursor.init = function (target, data, opts){ + // add a cursor attribute to the plot + var options = opts || {}; + this.plugins.cursor = new $.jqplot.Cursor(options.cursor); + var c = this.plugins.cursor; + + if (c.show) { + $.jqplot.eventListenerHooks.push(['jqplotMouseEnter', handleMouseEnter]); + $.jqplot.eventListenerHooks.push(['jqplotMouseLeave', handleMouseLeave]); + $.jqplot.eventListenerHooks.push(['jqplotMouseMove', handleMouseMove]); + + if (c.showCursorLegend) { + opts.legend = opts.legend || {}; + opts.legend.renderer = $.jqplot.CursorLegendRenderer; + opts.legend.formatString = this.plugins.cursor.cursorLegendFormatString; + opts.legend.show = true; + } + + if (c.zoom) { + $.jqplot.eventListenerHooks.push(['jqplotMouseDown', handleMouseDown]); + + if (c.clickReset) { + $.jqplot.eventListenerHooks.push(['jqplotClick', handleClick]); + } + + if (c.dblClickReset) { + $.jqplot.eventListenerHooks.push(['jqplotDblClick', handleDblClick]); + } + } + + this.resetZoom = function() { + var axes = this.axes; + if (!c.zoomProxy) { + for (var ax in axes) { + axes[ax].reset(); + axes[ax]._ticks = []; + // fake out tick creation algorithm to make sure original auto + // computed format string is used if _overrideFormatString is true + if (c._zoom.axes[ax] !== undefined) { + axes[ax]._autoFormatString = c._zoom.axes[ax].tickFormatString; + } + } + this.redraw(); + } + else { + var ctx = this.plugins.cursor.zoomCanvas._ctx; + ctx.clearRect(0,0,ctx.canvas.width, ctx.canvas.height); + ctx = null; + } + this.plugins.cursor._zoom.isZoomed = false; + this.target.trigger('jqplotResetZoom', [this, this.plugins.cursor]); + }; + + + if (c.showTooltipDataPosition) { + c.showTooltipUnitPosition = false; + c.showTooltipGridPosition = false; + if (options.cursor.tooltipFormatString == undefined) { + c.tooltipFormatString = $.jqplot.Cursor.cursorLegendFormatString; + } + } + } + }; + + // called with context of plot + $.jqplot.Cursor.postDraw = function() { + var c = this.plugins.cursor; + + // Memory Leaks patch + if (c.zoomCanvas) { + c.zoomCanvas.resetCanvas(); + c.zoomCanvas = null; + } + + if (c.cursorCanvas) { + c.cursorCanvas.resetCanvas(); + c.cursorCanvas = null; + } + + if (c._tooltipElem) { + c._tooltipElem.emptyForce(); + c._tooltipElem = null; + } + + + if (c.zoom) { + c.zoomCanvas = new $.jqplot.GenericCanvas(); + this.eventCanvas._elem.before(c.zoomCanvas.createElement(this._gridPadding, 'jqplot-zoom-canvas', this._plotDimensions, this)); + c.zoomCanvas.setContext(); + } + + var elem = document.createElement('div'); + c._tooltipElem = $(elem); + elem = null; + c._tooltipElem.addClass('jqplot-cursor-tooltip'); + c._tooltipElem.css({position:'absolute', display:'none'}); + + + if (c.zoomCanvas) { + c.zoomCanvas._elem.before(c._tooltipElem); + } + + else { + this.eventCanvas._elem.before(c._tooltipElem); + } + + if (c.showVerticalLine || c.showHorizontalLine) { + c.cursorCanvas = new $.jqplot.GenericCanvas(); + this.eventCanvas._elem.before(c.cursorCanvas.createElement(this._gridPadding, 'jqplot-cursor-canvas', this._plotDimensions, this)); + c.cursorCanvas.setContext(); + } + + // if we are showing the positions in unit coordinates, and no axes groups + // were specified, create a default set. + if (c.showTooltipUnitPosition){ + if (c.tooltipAxisGroups.length === 0) { + var series = this.series; + var s; + var temp = []; + for (var i=0; i<series.length; i++) { + s = series[i]; + var ax = s.xaxis+','+s.yaxis; + if ($.inArray(ax, temp) == -1) { + temp.push(ax); + } + } + for (var i=0; i<temp.length; i++) { + c.tooltipAxisGroups.push(temp[i].split(',')); + } + } + } + }; + + // Group: methods + // + // method: $.jqplot.Cursor.zoomProxy + // links targetPlot to controllerPlot so that plot zooming of + // targetPlot will be controlled by zooming on the controllerPlot. + // controllerPlot will not actually zoom, but acts as an + // overview plot. Note, the zoom options must be set to true for + // zoomProxy to work. + $.jqplot.Cursor.zoomProxy = function(targetPlot, controllerPlot) { + var tc = targetPlot.plugins.cursor; + var cc = controllerPlot.plugins.cursor; + tc.zoomTarget = true; + tc.zoom = true; + tc.style = 'auto'; + tc.dblClickReset = false; + cc.zoom = true; + cc.zoomProxy = true; + + controllerPlot.target.bind('jqplotZoom', plotZoom); + controllerPlot.target.bind('jqplotResetZoom', plotReset); + + function plotZoom(ev, gridpos, datapos, plot, cursor) { + tc.doZoom(gridpos, datapos, targetPlot, cursor); + } + + function plotReset(ev, plot, cursor) { + targetPlot.resetZoom(); + } + }; + + $.jqplot.Cursor.prototype.resetZoom = function(plot, cursor) { + var axes = plot.axes; + var cax = cursor._zoom.axes; + if (!plot.plugins.cursor.zoomProxy && cursor._zoom.isZoomed) { + for (var ax in axes) { + // axes[ax]._ticks = []; + // axes[ax].min = cax[ax].min; + // axes[ax].max = cax[ax].max; + // axes[ax].numberTicks = cax[ax].numberTicks; + // axes[ax].tickInterval = cax[ax].tickInterval; + // // for date axes + // axes[ax].daTickInterval = cax[ax].daTickInterval; + axes[ax].reset(); + axes[ax]._ticks = []; + // fake out tick creation algorithm to make sure original auto + // computed format string is used if _overrideFormatString is true + axes[ax]._autoFormatString = cax[ax].tickFormatString; + } + plot.redraw(); + cursor._zoom.isZoomed = false; + } + else { + var ctx = cursor.zoomCanvas._ctx; + ctx.clearRect(0,0,ctx.canvas.width, ctx.canvas.height); + ctx = null; + } + plot.target.trigger('jqplotResetZoom', [plot, cursor]); + }; + + $.jqplot.Cursor.resetZoom = function(plot) { + plot.resetZoom(); + }; + + $.jqplot.Cursor.prototype.doZoom = function (gridpos, datapos, plot, cursor) { + var c = cursor; + var axes = plot.axes; + var zaxes = c._zoom.axes; + var start = zaxes.start; + var end = zaxes.end; + var min, max, dp, span, + newmin, newmax, curax, _numberTicks, ret; + var ctx = plot.plugins.cursor.zoomCanvas._ctx; + // don't zoom if zoom area is too small (in pixels) + if ((c.constrainZoomTo == 'none' && Math.abs(gridpos.x - c._zoom.start[0]) > 6 && Math.abs(gridpos.y - c._zoom.start[1]) > 6) || (c.constrainZoomTo == 'x' && Math.abs(gridpos.x - c._zoom.start[0]) > 6) || (c.constrainZoomTo == 'y' && Math.abs(gridpos.y - c._zoom.start[1]) > 6)) { + if (!plot.plugins.cursor.zoomProxy) { + for (var ax in datapos) { + // make a copy of the original axes to revert back. + if (c._zoom.axes[ax] == undefined) { + c._zoom.axes[ax] = {}; + c._zoom.axes[ax].numberTicks = axes[ax].numberTicks; + c._zoom.axes[ax].tickInterval = axes[ax].tickInterval; + // for date axes... + c._zoom.axes[ax].daTickInterval = axes[ax].daTickInterval; + c._zoom.axes[ax].min = axes[ax].min; + c._zoom.axes[ax].max = axes[ax].max; + c._zoom.axes[ax].tickFormatString = (axes[ax].tickOptions != null) ? axes[ax].tickOptions.formatString : ''; + } + + + if ((c.constrainZoomTo == 'none') || (c.constrainZoomTo == 'x' && ax.charAt(0) == 'x') || (c.constrainZoomTo == 'y' && ax.charAt(0) == 'y')) { + dp = datapos[ax]; + if (dp != null) { + if (dp > start[ax]) { + newmin = start[ax]; + newmax = dp; + } + else { + span = start[ax] - dp; + newmin = dp; + newmax = start[ax]; + } + + curax = axes[ax]; + + _numberTicks = null; + + // if aligning this axis, use number of ticks from previous axis. + // Do I need to reset somehow if alignTicks is changed and then graph is replotted?? + if (curax.alignTicks) { + if (curax.name === 'x2axis' && plot.axes.xaxis.show) { + _numberTicks = plot.axes.xaxis.numberTicks; + } + else if (curax.name.charAt(0) === 'y' && curax.name !== 'yaxis' && curax.name !== 'yMidAxis' && plot.axes.yaxis.show) { + _numberTicks = plot.axes.yaxis.numberTicks; + } + } + + if (this.looseZoom && (axes[ax].renderer.constructor === $.jqplot.LinearAxisRenderer || axes[ax].renderer.constructor === $.jqplot.LogAxisRenderer )) { //} || axes[ax].renderer.constructor === $.jqplot.DateAxisRenderer)) { + + ret = $.jqplot.LinearTickGenerator(newmin, newmax, curax._scalefact, _numberTicks); + + // if new minimum is less than "true" minimum of axis display, adjust it + if (axes[ax].tickInset && ret[0] < axes[ax].min + axes[ax].tickInset * axes[ax].tickInterval) { + ret[0] += ret[4]; + ret[2] -= 1; + } + + // if new maximum is greater than "true" max of axis display, adjust it + if (axes[ax].tickInset && ret[1] > axes[ax].max - axes[ax].tickInset * axes[ax].tickInterval) { + ret[1] -= ret[4]; + ret[2] -= 1; + } + + // for log axes, don't fall below current minimum, this will look bad and can't have 0 in range anyway. + if (axes[ax].renderer.constructor === $.jqplot.LogAxisRenderer && ret[0] < axes[ax].min) { + // remove a tick and shift min up + ret[0] += ret[4]; + ret[2] -= 1; + } + + axes[ax].min = ret[0]; + axes[ax].max = ret[1]; + axes[ax]._autoFormatString = ret[3]; + axes[ax].numberTicks = ret[2]; + axes[ax].tickInterval = ret[4]; + // for date axes... + axes[ax].daTickInterval = [ret[4]/1000, 'seconds']; + } + else { + axes[ax].min = newmin; + axes[ax].max = newmax; + axes[ax].tickInterval = null; + axes[ax].numberTicks = null; + // for date axes... + axes[ax].daTickInterval = null; + } + + axes[ax]._ticks = []; + } + } + + // if ((c.constrainZoomTo == 'x' && ax.charAt(0) == 'y' && c.autoscaleConstraint) || (c.constrainZoomTo == 'y' && ax.charAt(0) == 'x' && c.autoscaleConstraint)) { + // dp = datapos[ax]; + // if (dp != null) { + // axes[ax].max == null; + // axes[ax].min = null; + // } + // } + } + ctx.clearRect(0,0,ctx.canvas.width, ctx.canvas.height); + plot.redraw(); + c._zoom.isZoomed = true; + ctx = null; + } + plot.target.trigger('jqplotZoom', [gridpos, datapos, plot, cursor]); + } + }; + + $.jqplot.preInitHooks.push($.jqplot.Cursor.init); + $.jqplot.postDrawHooks.push($.jqplot.Cursor.postDraw); + + function updateTooltip(gridpos, datapos, plot) { + var c = plot.plugins.cursor; + var s = ''; + var addbr = false; + if (c.showTooltipGridPosition) { + s = gridpos.x+', '+gridpos.y; + addbr = true; + } + if (c.showTooltipUnitPosition) { + var g; + for (var i=0; i<c.tooltipAxisGroups.length; i++) { + g = c.tooltipAxisGroups[i]; + if (addbr) { + s += '<br />'; + } + if (c.useAxesFormatters) { + var xf = plot.axes[g[0]]._ticks[0].formatter; + var yf = plot.axes[g[1]]._ticks[0].formatter; + var xfstr = plot.axes[g[0]]._ticks[0].formatString; + var yfstr = plot.axes[g[1]]._ticks[0].formatString; + s += xf(xfstr, datapos[g[0]]) + ', '+ yf(yfstr, datapos[g[1]]); + } + else { + s += $.jqplot.sprintf(c.tooltipFormatString, datapos[g[0]], datapos[g[1]]); + } + addbr = true; + } + } + + if (c.showTooltipDataPosition) { + var series = plot.series; + var ret = getIntersectingPoints(plot, gridpos.x, gridpos.y); + var addbr = false; + + for (var i = 0; i< series.length; i++) { + if (series[i].show) { + var idx = series[i].index; + var label = series[i].label.toString(); + var cellid = $.inArray(idx, ret.indices); + var sx = undefined; + var sy = undefined; + if (cellid != -1) { + var data = ret.data[cellid].data; + if (c.useAxesFormatters) { + var xf = series[i]._xaxis._ticks[0].formatter; + var yf = series[i]._yaxis._ticks[0].formatter; + var xfstr = series[i]._xaxis._ticks[0].formatString; + var yfstr = series[i]._yaxis._ticks[0].formatString; + sx = xf(xfstr, data[0]); + sy = yf(yfstr, data[1]); + } + else { + sx = data[0]; + sy = data[1]; + } + if (addbr) { + s += '<br />'; + } + s += $.jqplot.sprintf(c.tooltipFormatString, label, sx, sy); + addbr = true; + } + } + } + + } + c._tooltipElem.html(s); + } + + function moveLine(gridpos, plot) { + var c = plot.plugins.cursor; + var ctx = c.cursorCanvas._ctx; + ctx.clearRect(0,0,ctx.canvas.width, ctx.canvas.height); + if (c.showVerticalLine) { + c.shapeRenderer.draw(ctx, [[gridpos.x, 0], [gridpos.x, ctx.canvas.height]]); + } + if (c.showHorizontalLine) { + c.shapeRenderer.draw(ctx, [[0, gridpos.y], [ctx.canvas.width, gridpos.y]]); + } + var ret = getIntersectingPoints(plot, gridpos.x, gridpos.y); + if (c.showCursorLegend) { + var cells = $(plot.targetId + ' td.jqplot-cursor-legend-label'); + for (var i=0; i<cells.length; i++) { + var idx = $(cells[i]).data('seriesIndex'); + var series = plot.series[idx]; + var label = series.label.toString(); + var cellid = $.inArray(idx, ret.indices); + var sx = undefined; + var sy = undefined; + if (cellid != -1) { + var data = ret.data[cellid].data; + if (c.useAxesFormatters) { + var xf = series._xaxis._ticks[0].formatter; + var yf = series._yaxis._ticks[0].formatter; + var xfstr = series._xaxis._ticks[0].formatString; + var yfstr = series._yaxis._ticks[0].formatString; + sx = xf(xfstr, data[0]); + sy = yf(yfstr, data[1]); + } + else { + sx = data[0]; + sy = data[1]; + } + } + if (plot.legend.escapeHtml) { + $(cells[i]).text($.jqplot.sprintf(c.cursorLegendFormatString, label, sx, sy)); + } + else { + $(cells[i]).html($.jqplot.sprintf(c.cursorLegendFormatString, label, sx, sy)); + } + } + } + ctx = null; + } + + function getIntersectingPoints(plot, x, y) { + var ret = {indices:[], data:[]}; + var s, i, d0, d, j, r, p; + var threshold; + var c = plot.plugins.cursor; + for (var i=0; i<plot.series.length; i++) { + s = plot.series[i]; + r = s.renderer; + if (s.show) { + threshold = c.intersectionThreshold; + if (s.showMarker) { + threshold += s.markerRenderer.size/2; + } + for (var j=0; j<s.gridData.length; j++) { + p = s.gridData[j]; + // check vertical line + if (c.showVerticalLine) { + if (Math.abs(x-p[0]) <= threshold) { + ret.indices.push(i); + ret.data.push({seriesIndex: i, pointIndex:j, gridData:p, data:s.data[j]}); + } + } + } + } + } + return ret; + } + + function moveTooltip(gridpos, plot) { + var c = plot.plugins.cursor; + var elem = c._tooltipElem; + switch (c.tooltipLocation) { + case 'nw': + var x = gridpos.x + plot._gridPadding.left - elem.outerWidth(true) - c.tooltipOffset; + var y = gridpos.y + plot._gridPadding.top - c.tooltipOffset - elem.outerHeight(true); + break; + case 'n': + var x = gridpos.x + plot._gridPadding.left - elem.outerWidth(true)/2; + var y = gridpos.y + plot._gridPadding.top - c.tooltipOffset - elem.outerHeight(true); + break; + case 'ne': + var x = gridpos.x + plot._gridPadding.left + c.tooltipOffset; + var y = gridpos.y + plot._gridPadding.top - c.tooltipOffset - elem.outerHeight(true); + break; + case 'e': + var x = gridpos.x + plot._gridPadding.left + c.tooltipOffset; + var y = gridpos.y + plot._gridPadding.top - elem.outerHeight(true)/2; + break; + case 'se': + var x = gridpos.x + plot._gridPadding.left + c.tooltipOffset; + var y = gridpos.y + plot._gridPadding.top + c.tooltipOffset; + break; + case 's': + var x = gridpos.x + plot._gridPadding.left - elem.outerWidth(true)/2; + var y = gridpos.y + plot._gridPadding.top + c.tooltipOffset; + break; + case 'sw': + var x = gridpos.x + plot._gridPadding.left - elem.outerWidth(true) - c.tooltipOffset; + var y = gridpos.y + plot._gridPadding.top + c.tooltipOffset; + break; + case 'w': + var x = gridpos.x + plot._gridPadding.left - elem.outerWidth(true) - c.tooltipOffset; + var y = gridpos.y + plot._gridPadding.top - elem.outerHeight(true)/2; + break; + default: + var x = gridpos.x + plot._gridPadding.left + c.tooltipOffset; + var y = gridpos.y + plot._gridPadding.top + c.tooltipOffset; + break; + } + + elem.css('left', x); + elem.css('top', y); + elem = null; + } + + function positionTooltip(plot) { + // fake a grid for positioning + var grid = plot._gridPadding; + var c = plot.plugins.cursor; + var elem = c._tooltipElem; + switch (c.tooltipLocation) { + case 'nw': + var a = grid.left + c.tooltipOffset; + var b = grid.top + c.tooltipOffset; + elem.css('left', a); + elem.css('top', b); + break; + case 'n': + var a = (grid.left + (plot._plotDimensions.width - grid.right))/2 - elem.outerWidth(true)/2; + var b = grid.top + c.tooltipOffset; + elem.css('left', a); + elem.css('top', b); + break; + case 'ne': + var a = grid.right + c.tooltipOffset; + var b = grid.top + c.tooltipOffset; + elem.css({right:a, top:b}); + break; + case 'e': + var a = grid.right + c.tooltipOffset; + var b = (grid.top + (plot._plotDimensions.height - grid.bottom))/2 - elem.outerHeight(true)/2; + elem.css({right:a, top:b}); + break; + case 'se': + var a = grid.right + c.tooltipOffset; + var b = grid.bottom + c.tooltipOffset; + elem.css({right:a, bottom:b}); + break; + case 's': + var a = (grid.left + (plot._plotDimensions.width - grid.right))/2 - elem.outerWidth(true)/2; + var b = grid.bottom + c.tooltipOffset; + elem.css({left:a, bottom:b}); + break; + case 'sw': + var a = grid.left + c.tooltipOffset; + var b = grid.bottom + c.tooltipOffset; + elem.css({left:a, bottom:b}); + break; + case 'w': + var a = grid.left + c.tooltipOffset; + var b = (grid.top + (plot._plotDimensions.height - grid.bottom))/2 - elem.outerHeight(true)/2; + elem.css({left:a, top:b}); + break; + default: // same as 'se' + var a = grid.right - c.tooltipOffset; + var b = grid.bottom + c.tooltipOffset; + elem.css({right:a, bottom:b}); + break; + } + elem = null; + } + + function handleClick (ev, gridpos, datapos, neighbor, plot) { + ev.preventDefault(); + ev.stopImmediatePropagation(); + var c = plot.plugins.cursor; + if (c.clickReset) { + c.resetZoom(plot, c); + } + var sel = window.getSelection; + if (document.selection && document.selection.empty) + { + document.selection.empty(); + } + else if (sel && !sel().isCollapsed) { + sel().collapse(); + } + return false; + } + + function handleDblClick (ev, gridpos, datapos, neighbor, plot) { + ev.preventDefault(); + ev.stopImmediatePropagation(); + var c = plot.plugins.cursor; + if (c.dblClickReset) { + c.resetZoom(plot, c); + } + var sel = window.getSelection; + if (document.selection && document.selection.empty) + { + document.selection.empty(); + } + else if (sel && !sel().isCollapsed) { + sel().collapse(); + } + return false; + } + + function handleMouseLeave(ev, gridpos, datapos, neighbor, plot) { + var c = plot.plugins.cursor; + c.onGrid = false; + if (c.show) { + $(ev.target).css('cursor', c.previousCursor); + if (c.showTooltip && !(c._zoom.zooming && c.showTooltipOutsideZoom && !c.constrainOutsideZoom)) { + c._tooltipElem.hide(); + } + if (c.zoom) { + c._zoom.gridpos = gridpos; + c._zoom.datapos = datapos; + } + if (c.showVerticalLine || c.showHorizontalLine) { + var ctx = c.cursorCanvas._ctx; + ctx.clearRect(0,0,ctx.canvas.width, ctx.canvas.height); + ctx = null; + } + if (c.showCursorLegend) { + var cells = $(plot.targetId + ' td.jqplot-cursor-legend-label'); + for (var i=0; i<cells.length; i++) { + var idx = $(cells[i]).data('seriesIndex'); + var series = plot.series[idx]; + var label = series.label.toString(); + if (plot.legend.escapeHtml) { + $(cells[i]).text($.jqplot.sprintf(c.cursorLegendFormatString, label, undefined, undefined)); + } + else { + $(cells[i]).html($.jqplot.sprintf(c.cursorLegendFormatString, label, undefined, undefined)); + } + + } + } + } + } + + function handleMouseEnter(ev, gridpos, datapos, neighbor, plot) { + var c = plot.plugins.cursor; + c.onGrid = true; + if (c.show) { + c.previousCursor = ev.target.style.cursor; + ev.target.style.cursor = c.style; + if (c.showTooltip) { + updateTooltip(gridpos, datapos, plot); + if (c.followMouse) { + moveTooltip(gridpos, plot); + } + else { + positionTooltip(plot); + } + c._tooltipElem.show(); + } + if (c.showVerticalLine || c.showHorizontalLine) { + moveLine(gridpos, plot); + } + } + + } + + function handleMouseMove(ev, gridpos, datapos, neighbor, plot) { + var c = plot.plugins.cursor; + if (c.show) { + if (c.showTooltip) { + updateTooltip(gridpos, datapos, plot); + if (c.followMouse) { + moveTooltip(gridpos, plot); + } + } + if (c.showVerticalLine || c.showHorizontalLine) { + moveLine(gridpos, plot); + } + } + } + + function getEventPosition(ev) { + var plot = ev.data.plot; + var go = plot.eventCanvas._elem.offset(); + var gridPos = {x:ev.pageX - go.left, y:ev.pageY - go.top}; + ////// + // TO DO: handle yMidAxis + ////// + var dataPos = {xaxis:null, yaxis:null, x2axis:null, y2axis:null, y3axis:null, y4axis:null, y5axis:null, y6axis:null, y7axis:null, y8axis:null, y9axis:null, yMidAxis:null}; + var an = ['xaxis', 'yaxis', 'x2axis', 'y2axis', 'y3axis', 'y4axis', 'y5axis', 'y6axis', 'y7axis', 'y8axis', 'y9axis', 'yMidAxis']; + var ax = plot.axes; + var n, axis; + for (n=11; n>0; n--) { + axis = an[n-1]; + if (ax[axis].show) { + dataPos[axis] = ax[axis].series_p2u(gridPos[axis.charAt(0)]); + } + } + + return {offsets:go, gridPos:gridPos, dataPos:dataPos}; + } + + function handleZoomMove(ev) { + var plot = ev.data.plot; + var c = plot.plugins.cursor; + // don't do anything if not on grid. + if (c.show && c.zoom && c._zoom.started && !c.zoomTarget) { + var ctx = c.zoomCanvas._ctx; + var positions = getEventPosition(ev); + var gridpos = positions.gridPos; + var datapos = positions.dataPos; + c._zoom.gridpos = gridpos; + c._zoom.datapos = datapos; + c._zoom.zooming = true; + var xpos = gridpos.x; + var ypos = gridpos.y; + var height = ctx.canvas.height; + var width = ctx.canvas.width; + if (c.showTooltip && !c.onGrid && c.showTooltipOutsideZoom) { + updateTooltip(gridpos, datapos, plot); + if (c.followMouse) { + moveTooltip(gridpos, plot); + } + } + if (c.constrainZoomTo == 'x') { + c._zoom.end = [xpos, height]; + } + else if (c.constrainZoomTo == 'y') { + c._zoom.end = [width, ypos]; + } + else { + c._zoom.end = [xpos, ypos]; + } + var sel = window.getSelection; + if (document.selection && document.selection.empty) + { + document.selection.empty(); + } + else if (sel && !sel().isCollapsed) { + sel().collapse(); + } + drawZoomBox.call(c); + ctx = null; + } + } + + function handleMouseDown(ev, gridpos, datapos, neighbor, plot) { + var c = plot.plugins.cursor; + $(document).one('mouseup.jqplot_cursor', {plot:plot}, handleMouseUp); + var axes = plot.axes; + if (document.onselectstart != undefined) { + c._oldHandlers.onselectstart = document.onselectstart; + document.onselectstart = function () { return false; }; + } + if (document.ondrag != undefined) { + c._oldHandlers.ondrag = document.ondrag; + document.ondrag = function () { return false; }; + } + if (document.onmousedown != undefined) { + c._oldHandlers.onmousedown = document.onmousedown; + document.onmousedown = function () { return false; }; + } + if (c.zoom) { + if (!c.zoomProxy) { + var ctx = c.zoomCanvas._ctx; + ctx.clearRect(0,0,ctx.canvas.width, ctx.canvas.height); + ctx = null; + } + if (c.constrainZoomTo == 'x') { + c._zoom.start = [gridpos.x, 0]; + } + else if (c.constrainZoomTo == 'y') { + c._zoom.start = [0, gridpos.y]; + } + else { + c._zoom.start = [gridpos.x, gridpos.y]; + } + c._zoom.started = true; + for (var ax in datapos) { + // get zoom starting position. + c._zoom.axes.start[ax] = datapos[ax]; + } + $(document).bind('mousemove.jqplotCursor', {plot:plot}, handleZoomMove); + } + } + + function handleMouseUp(ev) { + var plot = ev.data.plot; + var c = plot.plugins.cursor; + if (c.zoom && c._zoom.zooming && !c.zoomTarget) { + var xpos = c._zoom.gridpos.x; + var ypos = c._zoom.gridpos.y; + var datapos = c._zoom.datapos; + var height = c.zoomCanvas._ctx.canvas.height; + var width = c.zoomCanvas._ctx.canvas.width; + var axes = plot.axes; + + if (c.constrainOutsideZoom && !c.onGrid) { + if (xpos < 0) { xpos = 0; } + else if (xpos > width) { xpos = width; } + if (ypos < 0) { ypos = 0; } + else if (ypos > height) { ypos = height; } + + for (var axis in datapos) { + if (datapos[axis]) { + if (axis.charAt(0) == 'x') { + datapos[axis] = axes[axis].series_p2u(xpos); + } + else { + datapos[axis] = axes[axis].series_p2u(ypos); + } + } + } + } + + if (c.constrainZoomTo == 'x') { + ypos = height; + } + else if (c.constrainZoomTo == 'y') { + xpos = width; + } + c._zoom.end = [xpos, ypos]; + c._zoom.gridpos = {x:xpos, y:ypos}; + + c.doZoom(c._zoom.gridpos, datapos, plot, c); + } + c._zoom.started = false; + c._zoom.zooming = false; + + $(document).unbind('mousemove.jqplotCursor', handleZoomMove); + + if (document.onselectstart != undefined && c._oldHandlers.onselectstart != null){ + document.onselectstart = c._oldHandlers.onselectstart; + c._oldHandlers.onselectstart = null; + } + if (document.ondrag != undefined && c._oldHandlers.ondrag != null){ + document.ondrag = c._oldHandlers.ondrag; + c._oldHandlers.ondrag = null; + } + if (document.onmousedown != undefined && c._oldHandlers.onmousedown != null){ + document.onmousedown = c._oldHandlers.onmousedown; + c._oldHandlers.onmousedown = null; + } + + } + + function drawZoomBox() { + var start = this._zoom.start; + var end = this._zoom.end; + var ctx = this.zoomCanvas._ctx; + var l, t, h, w; + if (end[0] > start[0]) { + l = start[0]; + w = end[0] - start[0]; + } + else { + l = end[0]; + w = start[0] - end[0]; + } + if (end[1] > start[1]) { + t = start[1]; + h = end[1] - start[1]; + } + else { + t = end[1]; + h = start[1] - end[1]; + } + ctx.fillStyle = 'rgba(0,0,0,0.2)'; + ctx.strokeStyle = '#999999'; + ctx.lineWidth = 1.0; + ctx.clearRect(0,0,ctx.canvas.width, ctx.canvas.height); + ctx.fillRect(0,0,ctx.canvas.width, ctx.canvas.height); + ctx.clearRect(l, t, w, h); + // IE won't show transparent fill rect, so stroke a rect also. + ctx.strokeRect(l,t,w,h); + ctx = null; + } + + $.jqplot.CursorLegendRenderer = function(options) { + $.jqplot.TableLegendRenderer.call(this, options); + this.formatString = '%s'; + }; + + $.jqplot.CursorLegendRenderer.prototype = new $.jqplot.TableLegendRenderer(); + $.jqplot.CursorLegendRenderer.prototype.constructor = $.jqplot.CursorLegendRenderer; + + // called in context of a Legend + $.jqplot.CursorLegendRenderer.prototype.draw = function() { + if (this._elem) { + this._elem.emptyForce(); + this._elem = null; + } + if (this.show) { + var series = this._series, s; + // make a table. one line label per row. + var elem = document.createElement('div'); + this._elem = $(elem); + elem = null; + this._elem.addClass('jqplot-legend jqplot-cursor-legend'); + this._elem.css('position', 'absolute'); + + var pad = false; + for (var i = 0; i< series.length; i++) { + s = series[i]; + if (s.show && s.showLabel) { + var lt = $.jqplot.sprintf(this.formatString, s.label.toString()); + if (lt) { + var color = s.color; + if (s._stack && !s.fill) { + color = ''; + } + addrow.call(this, lt, color, pad, i); + pad = true; + } + // let plugins add more rows to legend. Used by trend line plugin. + for (var j=0; j<$.jqplot.addLegendRowHooks.length; j++) { + var item = $.jqplot.addLegendRowHooks[j].call(this, s); + if (item) { + addrow.call(this, item.label, item.color, pad); + pad = true; + } + } + } + } + series = s = null; + delete series; + delete s; + } + + function addrow(label, color, pad, idx) { + var rs = (pad) ? this.rowSpacing : '0'; + var tr = $('<tr class="jqplot-legend jqplot-cursor-legend"></tr>').appendTo(this._elem); + tr.data('seriesIndex', idx); + $('<td class="jqplot-legend jqplot-cursor-legend-swatch" style="padding-top:'+rs+';">'+ + '<div style="border:1px solid #cccccc;padding:0.2em;">'+ + '<div class="jqplot-cursor-legend-swatch" style="background-color:'+color+';"></div>'+ + '</div></td>').appendTo(tr); + var td = $('<td class="jqplot-legend jqplot-cursor-legend-label" style="vertical-align:middle;padding-top:'+rs+';"></td>'); + td.appendTo(tr); + td.data('seriesIndex', idx); + if (this.escapeHtml) { + td.text(label); + } + else { + td.html(label); + } + tr = null; + td = null; + } + return this._elem; + }; + +})(jQuery); \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/plugins/jqplot.cursor.min.js b/libreplan-webapp/src/main/webapp/jqplot/plugins/jqplot.cursor.min.js new file mode 100644 index 000000000..ef71ea405 --- /dev/null +++ b/libreplan-webapp/src/main/webapp/jqplot/plugins/jqplot.cursor.min.js @@ -0,0 +1,57 @@ +/** + * jqPlot + * Pure JavaScript plotting plugin using jQuery + * + * Version: 1.0.0b2_r1012 + * + * Copyright (c) 2009-2011 Chris Leonello + * jqPlot is currently available for use in all personal or commercial projects + * under both the MIT (http://www.opensource.org/licenses/mit-license.php) and GPL + * version 2.0 (http://www.gnu.org/licenses/gpl-2.0.html) licenses. This means that you can + * choose the license that best suits your project and use it accordingly. + * + * Although not required, the author would appreciate an email letting him + * know of any substantial use of jqPlot. You can reach the author at: + * chris at jqplot dot com or see http://www.jqplot.com/info.php . + * + * If you are feeling kind and generous, consider supporting the project by + * making a donation at: http://www.jqplot.com/donate.php . + * + * sprintf functions contained in jqplot.sprintf.js by Ash Searle: + * + * version 2007.04.27 + * author Ash Searle + * http://hexmen.com/blog/2007/03/printf-sprintf/ + * http://hexmen.com/js/sprintf.js + * The author (Ash Searle) has placed this code in the public domain: + * "This code is unrestricted: you are free to use it however you like." + * + * included jsDate library by Chris Leonello: + * + * Copyright (c) 2010-2011 Chris Leonello + * + * jsDate is currently available for use in all personal or commercial projects + * under both the MIT and GPL version 2.0 licenses. This means that you can + * choose the license that best suits your project and use it accordingly. + * + * jsDate borrows many concepts and ideas from the Date Instance + * Methods by Ken Snyder along with some parts of Ken's actual code. + * + * Ken's origianl Date Instance Methods and copyright notice: + * + * Ken Snyder (ken d snyder at gmail dot com) + * 2008-09-10 + * version 2.0.2 (http://kendsnyder.com/sandbox/date/) + * Creative Commons Attribution License 3.0 (http://creativecommons.org/licenses/by/3.0/) + * + * jqplotToImage function based on Larry Siden's export-jqplot-to-png.js. + * Larry has generously given permission to adapt his code for inclusion + * into jqPlot. + * + * Larry's original code can be found here: + * + * https://github.com/lsiden/export-jqplot-to-png + * + * + */ +(function(j){j.jqplot.Cursor=function(q){this.style="crosshair";this.previousCursor="auto";this.show=j.jqplot.config.enablePlugins;this.showTooltip=true;this.followMouse=false;this.tooltipLocation="se";this.tooltipOffset=6;this.showTooltipGridPosition=false;this.showTooltipUnitPosition=true;this.showTooltipDataPosition=false;this.tooltipFormatString="%.4P, %.4P";this.useAxesFormatters=true;this.tooltipAxisGroups=[];this.zoom=false;this.zoomProxy=false;this.zoomTarget=false;this.looseZoom=true;this.clickReset=false;this.dblClickReset=true;this.showVerticalLine=false;this.showHorizontalLine=false;this.constrainZoomTo="none";this.shapeRenderer=new j.jqplot.ShapeRenderer();this._zoom={start:[],end:[],started:false,zooming:false,isZoomed:false,axes:{start:{},end:{}},gridpos:{},datapos:{}};this._tooltipElem;this.zoomCanvas;this.cursorCanvas;this.intersectionThreshold=2;this.showCursorLegend=false;this.cursorLegendFormatString=j.jqplot.Cursor.cursorLegendFormatString;this._oldHandlers={onselectstart:null,ondrag:null,onmousedown:null};this.constrainOutsideZoom=true;this.showTooltipOutsideZoom=false;this.onGrid=false;j.extend(true,this,q)};j.jqplot.Cursor.cursorLegendFormatString="%s x:%s, y:%s";j.jqplot.Cursor.init=function(t,s,r){var q=r||{};this.plugins.cursor=new j.jqplot.Cursor(q.cursor);var u=this.plugins.cursor;if(u.show){j.jqplot.eventListenerHooks.push(["jqplotMouseEnter",b]);j.jqplot.eventListenerHooks.push(["jqplotMouseLeave",f]);j.jqplot.eventListenerHooks.push(["jqplotMouseMove",i]);if(u.showCursorLegend){r.legend=r.legend||{};r.legend.renderer=j.jqplot.CursorLegendRenderer;r.legend.formatString=this.plugins.cursor.cursorLegendFormatString;r.legend.show=true}if(u.zoom){j.jqplot.eventListenerHooks.push(["jqplotMouseDown",a]);if(u.clickReset){j.jqplot.eventListenerHooks.push(["jqplotClick",k])}if(u.dblClickReset){j.jqplot.eventListenerHooks.push(["jqplotDblClick",c])}}this.resetZoom=function(){var x=this.axes;if(!u.zoomProxy){for(var w in x){x[w].reset();x[w]._ticks=[];if(u._zoom.axes[w]!==undefined){x[w]._autoFormatString=u._zoom.axes[w].tickFormatString}}this.redraw()}else{var v=this.plugins.cursor.zoomCanvas._ctx;v.clearRect(0,0,v.canvas.width,v.canvas.height);v=null}this.plugins.cursor._zoom.isZoomed=false;this.target.trigger("jqplotResetZoom",[this,this.plugins.cursor])};if(u.showTooltipDataPosition){u.showTooltipUnitPosition=false;u.showTooltipGridPosition=false;if(q.cursor.tooltipFormatString==undefined){u.tooltipFormatString=j.jqplot.Cursor.cursorLegendFormatString}}}};j.jqplot.Cursor.postDraw=function(){var x=this.plugins.cursor;if(x.zoomCanvas){x.zoomCanvas.resetCanvas();x.zoomCanvas=null}if(x.cursorCanvas){x.cursorCanvas.resetCanvas();x.cursorCanvas=null}if(x._tooltipElem){x._tooltipElem.emptyForce();x._tooltipElem=null}if(x.zoom){x.zoomCanvas=new j.jqplot.GenericCanvas();this.eventCanvas._elem.before(x.zoomCanvas.createElement(this._gridPadding,"jqplot-zoom-canvas",this._plotDimensions,this));x.zoomCanvas.setContext()}var v=document.createElement("div");x._tooltipElem=j(v);v=null;x._tooltipElem.addClass("jqplot-cursor-tooltip");x._tooltipElem.css({position:"absolute",display:"none"});if(x.zoomCanvas){x.zoomCanvas._elem.before(x._tooltipElem)}else{this.eventCanvas._elem.before(x._tooltipElem)}if(x.showVerticalLine||x.showHorizontalLine){x.cursorCanvas=new j.jqplot.GenericCanvas();this.eventCanvas._elem.before(x.cursorCanvas.createElement(this._gridPadding,"jqplot-cursor-canvas",this._plotDimensions,this));x.cursorCanvas.setContext()}if(x.showTooltipUnitPosition){if(x.tooltipAxisGroups.length===0){var t=this.series;var u;var q=[];for(var r=0;r<t.length;r++){u=t[r];var w=u.xaxis+","+u.yaxis;if(j.inArray(w,q)==-1){q.push(w)}}for(var r=0;r<q.length;r++){x.tooltipAxisGroups.push(q[r].split(","))}}}};j.jqplot.Cursor.zoomProxy=function(v,r){var q=v.plugins.cursor;var u=r.plugins.cursor;q.zoomTarget=true;q.zoom=true;q.style="auto";q.dblClickReset=false;u.zoom=true;u.zoomProxy=true;r.target.bind("jqplotZoom",t);r.target.bind("jqplotResetZoom",s);function t(x,w,z,y,A){q.doZoom(w,z,v,A)}function s(w,x,y){v.resetZoom()}};j.jqplot.Cursor.prototype.resetZoom=function(u,v){var t=u.axes;var s=v._zoom.axes;if(!u.plugins.cursor.zoomProxy&&v._zoom.isZoomed){for(var r in t){t[r].reset();t[r]._ticks=[];t[r]._autoFormatString=s[r].tickFormatString}u.redraw();v._zoom.isZoomed=false}else{var q=v.zoomCanvas._ctx;q.clearRect(0,0,q.canvas.width,q.canvas.height);q=null}u.target.trigger("jqplotResetZoom",[u,v])};j.jqplot.Cursor.resetZoom=function(q){q.resetZoom()};j.jqplot.Cursor.prototype.doZoom=function(G,t,C,u){var I=u;var F=C.axes;var r=I._zoom.axes;var w=r.start;var s=r.end;var B,E,z,D,v,x,q,H,J;var A=C.plugins.cursor.zoomCanvas._ctx;if((I.constrainZoomTo=="none"&&Math.abs(G.x-I._zoom.start[0])>6&&Math.abs(G.y-I._zoom.start[1])>6)||(I.constrainZoomTo=="x"&&Math.abs(G.x-I._zoom.start[0])>6)||(I.constrainZoomTo=="y"&&Math.abs(G.y-I._zoom.start[1])>6)){if(!C.plugins.cursor.zoomProxy){for(var y in t){if(I._zoom.axes[y]==undefined){I._zoom.axes[y]={};I._zoom.axes[y].numberTicks=F[y].numberTicks;I._zoom.axes[y].tickInterval=F[y].tickInterval;I._zoom.axes[y].daTickInterval=F[y].daTickInterval;I._zoom.axes[y].min=F[y].min;I._zoom.axes[y].max=F[y].max;I._zoom.axes[y].tickFormatString=(F[y].tickOptions!=null)?F[y].tickOptions.formatString:""}if((I.constrainZoomTo=="none")||(I.constrainZoomTo=="x"&&y.charAt(0)=="x")||(I.constrainZoomTo=="y"&&y.charAt(0)=="y")){z=t[y];if(z!=null){if(z>w[y]){v=w[y];x=z}else{D=w[y]-z;v=z;x=w[y]}q=F[y];H=null;if(q.alignTicks){if(q.name==="x2axis"&&C.axes.xaxis.show){H=C.axes.xaxis.numberTicks}else{if(q.name.charAt(0)==="y"&&q.name!=="yaxis"&&q.name!=="yMidAxis"&&C.axes.yaxis.show){H=C.axes.yaxis.numberTicks}}}if(this.looseZoom&&(F[y].renderer.constructor===j.jqplot.LinearAxisRenderer||F[y].renderer.constructor===j.jqplot.LogAxisRenderer)){J=j.jqplot.LinearTickGenerator(v,x,q._scalefact,H);if(F[y].tickInset&&J[0]<F[y].min+F[y].tickInset*F[y].tickInterval){J[0]+=J[4];J[2]-=1}if(F[y].tickInset&&J[1]>F[y].max-F[y].tickInset*F[y].tickInterval){J[1]-=J[4];J[2]-=1}if(F[y].renderer.constructor===j.jqplot.LogAxisRenderer&&J[0]<F[y].min){J[0]+=J[4];J[2]-=1}F[y].min=J[0];F[y].max=J[1];F[y]._autoFormatString=J[3];F[y].numberTicks=J[2];F[y].tickInterval=J[4];F[y].daTickInterval=[J[4]/1000,"seconds"]}else{F[y].min=v;F[y].max=x;F[y].tickInterval=null;F[y].numberTicks=null;F[y].daTickInterval=null}F[y]._ticks=[]}}}A.clearRect(0,0,A.canvas.width,A.canvas.height);C.redraw();I._zoom.isZoomed=true;A=null}C.target.trigger("jqplotZoom",[G,t,C,u])}};j.jqplot.preInitHooks.push(j.jqplot.Cursor.init);j.jqplot.postDrawHooks.push(j.jqplot.Cursor.postDraw);function e(E,r,B){var G=B.plugins.cursor;var w="";var K=false;if(G.showTooltipGridPosition){w=E.x+", "+E.y;K=true}if(G.showTooltipUnitPosition){var D;for(var C=0;C<G.tooltipAxisGroups.length;C++){D=G.tooltipAxisGroups[C];if(K){w+="<br />"}if(G.useAxesFormatters){var A=B.axes[D[0]]._ticks[0].formatter;var q=B.axes[D[1]]._ticks[0].formatter;var H=B.axes[D[0]]._ticks[0].formatString;var v=B.axes[D[1]]._ticks[0].formatString;w+=A(H,r[D[0]])+", "+q(v,r[D[1]])}else{w+=j.jqplot.sprintf(G.tooltipFormatString,r[D[0]],r[D[1]])}K=true}}if(G.showTooltipDataPosition){var u=B.series;var J=d(B,E.x,E.y);var K=false;for(var C=0;C<u.length;C++){if(u[C].show){var y=u[C].index;var t=u[C].label.toString();var F=j.inArray(y,J.indices);var z=undefined;var x=undefined;if(F!=-1){var I=J.data[F].data;if(G.useAxesFormatters){var A=u[C]._xaxis._ticks[0].formatter;var q=u[C]._yaxis._ticks[0].formatter;var H=u[C]._xaxis._ticks[0].formatString;var v=u[C]._yaxis._ticks[0].formatString;z=A(H,I[0]);x=q(v,I[1])}else{z=I[0];x=I[1]}if(K){w+="<br />"}w+=j.jqplot.sprintf(G.tooltipFormatString,t,z,x);K=true}}}}G._tooltipElem.html(w)}function g(C,A){var E=A.plugins.cursor;var z=E.cursorCanvas._ctx;z.clearRect(0,0,z.canvas.width,z.canvas.height);if(E.showVerticalLine){E.shapeRenderer.draw(z,[[C.x,0],[C.x,z.canvas.height]])}if(E.showHorizontalLine){E.shapeRenderer.draw(z,[[0,C.y],[z.canvas.width,C.y]])}var G=d(A,C.x,C.y);if(E.showCursorLegend){var r=j(A.targetId+" td.jqplot-cursor-legend-label");for(var B=0;B<r.length;B++){var v=j(r[B]).data("seriesIndex");var t=A.series[v];var s=t.label.toString();var D=j.inArray(v,G.indices);var x=undefined;var w=undefined;if(D!=-1){var H=G.data[D].data;if(E.useAxesFormatters){var y=t._xaxis._ticks[0].formatter;var q=t._yaxis._ticks[0].formatter;var F=t._xaxis._ticks[0].formatString;var u=t._yaxis._ticks[0].formatString;x=y(F,H[0]);w=q(u,H[1])}else{x=H[0];w=H[1]}}if(A.legend.escapeHtml){j(r[B]).text(j.jqplot.sprintf(E.cursorLegendFormatString,s,x,w))}else{j(r[B]).html(j.jqplot.sprintf(E.cursorLegendFormatString,s,x,w))}}}z=null}function d(A,F,E){var B={indices:[],data:[]};var G,w,u,C,v,q,t;var z;var D=A.plugins.cursor;for(var w=0;w<A.series.length;w++){G=A.series[w];q=G.renderer;if(G.show){z=D.intersectionThreshold;if(G.showMarker){z+=G.markerRenderer.size/2}for(var v=0;v<G.gridData.length;v++){t=G.gridData[v];if(D.showVerticalLine){if(Math.abs(F-t[0])<=z){B.indices.push(w);B.data.push({seriesIndex:w,pointIndex:v,gridData:t,data:G.data[v]})}}}}}return B}function n(r,t){var v=t.plugins.cursor;var s=v._tooltipElem;switch(v.tooltipLocation){case"nw":var q=r.x+t._gridPadding.left-s.outerWidth(true)-v.tooltipOffset;var u=r.y+t._gridPadding.top-v.tooltipOffset-s.outerHeight(true);break;case"n":var q=r.x+t._gridPadding.left-s.outerWidth(true)/2;var u=r.y+t._gridPadding.top-v.tooltipOffset-s.outerHeight(true);break;case"ne":var q=r.x+t._gridPadding.left+v.tooltipOffset;var u=r.y+t._gridPadding.top-v.tooltipOffset-s.outerHeight(true);break;case"e":var q=r.x+t._gridPadding.left+v.tooltipOffset;var u=r.y+t._gridPadding.top-s.outerHeight(true)/2;break;case"se":var q=r.x+t._gridPadding.left+v.tooltipOffset;var u=r.y+t._gridPadding.top+v.tooltipOffset;break;case"s":var q=r.x+t._gridPadding.left-s.outerWidth(true)/2;var u=r.y+t._gridPadding.top+v.tooltipOffset;break;case"sw":var q=r.x+t._gridPadding.left-s.outerWidth(true)-v.tooltipOffset;var u=r.y+t._gridPadding.top+v.tooltipOffset;break;case"w":var q=r.x+t._gridPadding.left-s.outerWidth(true)-v.tooltipOffset;var u=r.y+t._gridPadding.top-s.outerHeight(true)/2;break;default:var q=r.x+t._gridPadding.left+v.tooltipOffset;var u=r.y+t._gridPadding.top+v.tooltipOffset;break}s.css("left",q);s.css("top",u);s=null}function m(u){var s=u._gridPadding;var v=u.plugins.cursor;var t=v._tooltipElem;switch(v.tooltipLocation){case"nw":var r=s.left+v.tooltipOffset;var q=s.top+v.tooltipOffset;t.css("left",r);t.css("top",q);break;case"n":var r=(s.left+(u._plotDimensions.width-s.right))/2-t.outerWidth(true)/2;var q=s.top+v.tooltipOffset;t.css("left",r);t.css("top",q);break;case"ne":var r=s.right+v.tooltipOffset;var q=s.top+v.tooltipOffset;t.css({right:r,top:q});break;case"e":var r=s.right+v.tooltipOffset;var q=(s.top+(u._plotDimensions.height-s.bottom))/2-t.outerHeight(true)/2;t.css({right:r,top:q});break;case"se":var r=s.right+v.tooltipOffset;var q=s.bottom+v.tooltipOffset;t.css({right:r,bottom:q});break;case"s":var r=(s.left+(u._plotDimensions.width-s.right))/2-t.outerWidth(true)/2;var q=s.bottom+v.tooltipOffset;t.css({left:r,bottom:q});break;case"sw":var r=s.left+v.tooltipOffset;var q=s.bottom+v.tooltipOffset;t.css({left:r,bottom:q});break;case"w":var r=s.left+v.tooltipOffset;var q=(s.top+(u._plotDimensions.height-s.bottom))/2-t.outerHeight(true)/2;t.css({left:r,top:q});break;default:var r=s.right-v.tooltipOffset;var q=s.bottom+v.tooltipOffset;t.css({right:r,bottom:q});break}t=null}function k(r,q,v,u,t){r.preventDefault();r.stopImmediatePropagation();var w=t.plugins.cursor;if(w.clickReset){w.resetZoom(t,w)}var s=window.getSelection;if(document.selection&&document.selection.empty){document.selection.empty()}else{if(s&&!s().isCollapsed){s().collapse()}}return false}function c(r,q,v,u,t){r.preventDefault();r.stopImmediatePropagation();var w=t.plugins.cursor;if(w.dblClickReset){w.resetZoom(t,w)}var s=window.getSelection;if(document.selection&&document.selection.empty){document.selection.empty()}else{if(s&&!s().isCollapsed){s().collapse()}}return false}function f(w,t,q,z,u){var v=u.plugins.cursor;v.onGrid=false;if(v.show){j(w.target).css("cursor",v.previousCursor);if(v.showTooltip&&!(v._zoom.zooming&&v.showTooltipOutsideZoom&&!v.constrainOutsideZoom)){v._tooltipElem.hide()}if(v.zoom){v._zoom.gridpos=t;v._zoom.datapos=q}if(v.showVerticalLine||v.showHorizontalLine){var B=v.cursorCanvas._ctx;B.clearRect(0,0,B.canvas.width,B.canvas.height);B=null}if(v.showCursorLegend){var A=j(u.targetId+" td.jqplot-cursor-legend-label");for(var s=0;s<A.length;s++){var y=j(A[s]).data("seriesIndex");var r=u.series[y];var x=r.label.toString();if(u.legend.escapeHtml){j(A[s]).text(j.jqplot.sprintf(v.cursorLegendFormatString,x,undefined,undefined))}else{j(A[s]).html(j.jqplot.sprintf(v.cursorLegendFormatString,x,undefined,undefined))}}}}}function b(r,q,u,t,s){var v=s.plugins.cursor;v.onGrid=true;if(v.show){v.previousCursor=r.target.style.cursor;r.target.style.cursor=v.style;if(v.showTooltip){e(q,u,s);if(v.followMouse){n(q,s)}else{m(s)}v._tooltipElem.show()}if(v.showVerticalLine||v.showHorizontalLine){g(q,s)}}}function i(r,q,u,t,s){var v=s.plugins.cursor;if(v.show){if(v.showTooltip){e(q,u,s);if(v.followMouse){n(q,s)}}if(v.showVerticalLine||v.showHorizontalLine){g(q,s)}}}function o(y){var x=y.data.plot;var t=x.eventCanvas._elem.offset();var w={x:y.pageX-t.left,y:y.pageY-t.top};var u={xaxis:null,yaxis:null,x2axis:null,y2axis:null,y3axis:null,y4axis:null,y5axis:null,y6axis:null,y7axis:null,y8axis:null,y9axis:null,yMidAxis:null};var v=["xaxis","yaxis","x2axis","y2axis","y3axis","y4axis","y5axis","y6axis","y7axis","y8axis","y9axis","yMidAxis"];var q=x.axes;var r,s;for(r=11;r>0;r--){s=v[r-1];if(q[s].show){u[s]=q[s].series_p2u(w[s.charAt(0)])}}return{offsets:t,gridPos:w,dataPos:u}}function h(z){var x=z.data.plot;var y=x.plugins.cursor;if(y.show&&y.zoom&&y._zoom.started&&!y.zoomTarget){var B=y.zoomCanvas._ctx;var v=o(z);var w=v.gridPos;var t=v.dataPos;y._zoom.gridpos=w;y._zoom.datapos=t;y._zoom.zooming=true;var u=w.x;var s=w.y;var A=B.canvas.height;var q=B.canvas.width;if(y.showTooltip&&!y.onGrid&&y.showTooltipOutsideZoom){e(w,t,x);if(y.followMouse){n(w,x)}}if(y.constrainZoomTo=="x"){y._zoom.end=[u,A]}else{if(y.constrainZoomTo=="y"){y._zoom.end=[q,s]}else{y._zoom.end=[u,s]}}var r=window.getSelection;if(document.selection&&document.selection.empty){document.selection.empty()}else{if(r&&!r().isCollapsed){r().collapse()}}l.call(y);B=null}}function a(w,s,r,x,t){var v=t.plugins.cursor;j(document).one("mouseup.jqplot_cursor",{plot:t},p);var u=t.axes;if(document.onselectstart!=undefined){v._oldHandlers.onselectstart=document.onselectstart;document.onselectstart=function(){return false}}if(document.ondrag!=undefined){v._oldHandlers.ondrag=document.ondrag;document.ondrag=function(){return false}}if(document.onmousedown!=undefined){v._oldHandlers.onmousedown=document.onmousedown;document.onmousedown=function(){return false}}if(v.zoom){if(!v.zoomProxy){var y=v.zoomCanvas._ctx;y.clearRect(0,0,y.canvas.width,y.canvas.height);y=null}if(v.constrainZoomTo=="x"){v._zoom.start=[s.x,0]}else{if(v.constrainZoomTo=="y"){v._zoom.start=[0,s.y]}else{v._zoom.start=[s.x,s.y]}}v._zoom.started=true;for(var q in r){v._zoom.axes.start[q]=r[q]}j(document).bind("mousemove.jqplotCursor",{plot:t},h)}}function p(y){var v=y.data.plot;var x=v.plugins.cursor;if(x.zoom&&x._zoom.zooming&&!x.zoomTarget){var u=x._zoom.gridpos.x;var r=x._zoom.gridpos.y;var t=x._zoom.datapos;var z=x.zoomCanvas._ctx.canvas.height;var q=x.zoomCanvas._ctx.canvas.width;var w=v.axes;if(x.constrainOutsideZoom&&!x.onGrid){if(u<0){u=0}else{if(u>q){u=q}}if(r<0){r=0}else{if(r>z){r=z}}for(var s in t){if(t[s]){if(s.charAt(0)=="x"){t[s]=w[s].series_p2u(u)}else{t[s]=w[s].series_p2u(r)}}}}if(x.constrainZoomTo=="x"){r=z}else{if(x.constrainZoomTo=="y"){u=q}}x._zoom.end=[u,r];x._zoom.gridpos={x:u,y:r};x.doZoom(x._zoom.gridpos,t,v,x)}x._zoom.started=false;x._zoom.zooming=false;j(document).unbind("mousemove.jqplotCursor",h);if(document.onselectstart!=undefined&&x._oldHandlers.onselectstart!=null){document.onselectstart=x._oldHandlers.onselectstart;x._oldHandlers.onselectstart=null}if(document.ondrag!=undefined&&x._oldHandlers.ondrag!=null){document.ondrag=x._oldHandlers.ondrag;x._oldHandlers.ondrag=null}if(document.onmousedown!=undefined&&x._oldHandlers.onmousedown!=null){document.onmousedown=x._oldHandlers.onmousedown;x._oldHandlers.onmousedown=null}}function l(){var y=this._zoom.start;var u=this._zoom.end;var s=this.zoomCanvas._ctx;var r,v,x,q;if(u[0]>y[0]){r=y[0];q=u[0]-y[0]}else{r=u[0];q=y[0]-u[0]}if(u[1]>y[1]){v=y[1];x=u[1]-y[1]}else{v=u[1];x=y[1]-u[1]}s.fillStyle="rgba(0,0,0,0.2)";s.strokeStyle="#999999";s.lineWidth=1;s.clearRect(0,0,s.canvas.width,s.canvas.height);s.fillRect(0,0,s.canvas.width,s.canvas.height);s.clearRect(r,v,q,x);s.strokeRect(r,v,q,x);s=null}j.jqplot.CursorLegendRenderer=function(q){j.jqplot.TableLegendRenderer.call(this,q);this.formatString="%s"};j.jqplot.CursorLegendRenderer.prototype=new j.jqplot.TableLegendRenderer();j.jqplot.CursorLegendRenderer.prototype.constructor=j.jqplot.CursorLegendRenderer;j.jqplot.CursorLegendRenderer.prototype.draw=function(){if(this._elem){this._elem.emptyForce();this._elem=null}if(this.show){var w=this._series,A;var r=document.createElement("div");this._elem=j(r);r=null;this._elem.addClass("jqplot-legend jqplot-cursor-legend");this._elem.css("position","absolute");var q=false;for(var x=0;x<w.length;x++){A=w[x];if(A.show&&A.showLabel){var v=j.jqplot.sprintf(this.formatString,A.label.toString());if(v){var t=A.color;if(A._stack&&!A.fill){t=""}z.call(this,v,t,q,x);q=true}for(var u=0;u<j.jqplot.addLegendRowHooks.length;u++){var y=j.jqplot.addLegendRowHooks[u].call(this,A);if(y){z.call(this,y.label,y.color,q);q=true}}}}w=A=null;delete w;delete A}function z(D,C,F,s){var B=(F)?this.rowSpacing:"0";var E=j('<tr class="jqplot-legend jqplot-cursor-legend"></tr>').appendTo(this._elem);E.data("seriesIndex",s);j('<td class="jqplot-legend jqplot-cursor-legend-swatch" style="padding-top:'+B+';"><div style="border:1px solid #cccccc;padding:0.2em;"><div class="jqplot-cursor-legend-swatch" style="background-color:'+C+';"></div></div></td>').appendTo(E);var G=j('<td class="jqplot-legend jqplot-cursor-legend-label" style="vertical-align:middle;padding-top:'+B+';"></td>');G.appendTo(E);G.data("seriesIndex",s);if(this.escapeHtml){G.text(D)}else{G.html(D)}E=null;G=null}return this._elem}})(jQuery); \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/plugins/jqplot.dateAxisRenderer.js b/libreplan-webapp/src/main/webapp/jqplot/plugins/jqplot.dateAxisRenderer.js new file mode 100644 index 000000000..f09fc5443 --- /dev/null +++ b/libreplan-webapp/src/main/webapp/jqplot/plugins/jqplot.dateAxisRenderer.js @@ -0,0 +1,702 @@ +/** + * jqPlot + * Pure JavaScript plotting plugin using jQuery + * + * Version: 1.0.0b2_r1012 + * + * Copyright (c) 2009-2011 Chris Leonello + * jqPlot is currently available for use in all personal or commercial projects + * under both the MIT (http://www.opensource.org/licenses/mit-license.php) and GPL + * version 2.0 (http://www.gnu.org/licenses/gpl-2.0.html) licenses. This means that you can + * choose the license that best suits your project and use it accordingly. + * + * Although not required, the author would appreciate an email letting him + * know of any substantial use of jqPlot. You can reach the author at: + * chris at jqplot dot com or see http://www.jqplot.com/info.php . + * + * If you are feeling kind and generous, consider supporting the project by + * making a donation at: http://www.jqplot.com/donate.php . + * + * sprintf functions contained in jqplot.sprintf.js by Ash Searle: + * + * version 2007.04.27 + * author Ash Searle + * http://hexmen.com/blog/2007/03/printf-sprintf/ + * http://hexmen.com/js/sprintf.js + * The author (Ash Searle) has placed this code in the public domain: + * "This code is unrestricted: you are free to use it however you like." + * + */ +(function($) { + /** + * Class: $.jqplot.DateAxisRenderer + * A plugin for a jqPlot to render an axis as a series of date values. + * This renderer has no options beyond those supplied by the <Axis> class. + * It supplies it's own tick formatter, so the tickOptions.formatter option + * should not be overridden. + * + * Thanks to Ken Synder for his enhanced Date instance methods which are + * included with this code <http://kendsnyder.com/sandbox/date/>. + * + * To use this renderer, include the plugin in your source + * > <script type="text/javascript" language="javascript" src="plugins/jqplot.dateAxisRenderer.js"></script> + * + * and supply the appropriate options to your plot + * + * > {axes:{xaxis:{renderer:$.jqplot.DateAxisRenderer}}} + * + * Dates can be passed into the axis in almost any recognizable value and + * will be parsed. They will be rendered on the axis in the format + * specified by tickOptions.formatString. e.g. tickOptions.formatString = '%Y-%m-%d'. + * + * Accecptable format codes + * are: + * + * > Code Result Description + * > == Years == + * > %Y 2008 Four-digit year + * > %y 08 Two-digit year + * > == Months == + * > %m 09 Two-digit month + * > %#m 9 One or two-digit month + * > %B September Full month name + * > %b Sep Abbreviated month name + * > == Days == + * > %d 05 Two-digit day of month + * > %#d 5 One or two-digit day of month + * > %e 5 One or two-digit day of month + * > %A Sunday Full name of the day of the week + * > %a Sun Abbreviated name of the day of the week + * > %w 0 Number of the day of the week (0 = Sunday, 6 = Saturday) + * > %o th The ordinal suffix string following the day of the month + * > == Hours == + * > %H 23 Hours in 24-hour format (two digits) + * > %#H 3 Hours in 24-hour integer format (one or two digits) + * > %I 11 Hours in 12-hour format (two digits) + * > %#I 3 Hours in 12-hour integer format (one or two digits) + * > %p PM AM or PM + * > == Minutes == + * > %M 09 Minutes (two digits) + * > %#M 9 Minutes (one or two digits) + * > == Seconds == + * > %S 02 Seconds (two digits) + * > %#S 2 Seconds (one or two digits) + * > %s 1206567625723 Unix timestamp (Seconds past 1970-01-01 00:00:00) + * > == Milliseconds == + * > %N 008 Milliseconds (three digits) + * > %#N 8 Milliseconds (one to three digits) + * > == Timezone == + * > %O 360 difference in minutes between local time and GMT + * > %Z Mountain Standard Time Name of timezone as reported by browser + * > %G -06:00 Hours and minutes between GMT + * > == Shortcuts == + * > %F 2008-03-26 %Y-%m-%d + * > %T 05:06:30 %H:%M:%S + * > %X 05:06:30 %H:%M:%S + * > %x 03/26/08 %m/%d/%y + * > %D 03/26/08 %m/%d/%y + * > %#c Wed Mar 26 15:31:00 2008 %a %b %e %H:%M:%S %Y + * > %v 3-Sep-2008 %e-%b-%Y + * > %R 15:31 %H:%M + * > %r 3:31:00 PM %I:%M:%S %p + * > == Characters == + * > %n \n Newline + * > %t \t Tab + * > %% % Percent Symbol + */ + $.jqplot.DateAxisRenderer = function() { + $.jqplot.LinearAxisRenderer.call(this); + this.date = new $.jsDate(); + }; + + var second = 1000; + var minute = 60 * second; + var hour = 60 * minute; + var day = 24 * hour; + var week = 7 * day; + + // these are less definitive + var month = 30.4368499 * day; + var year = 365.242199 * day; + + var daysInMonths = [31,28,31,30,31,30,31,30,31,30,31,30]; + // array of consistent nice intervals. Longer intervals + // will depend on days in month, days in year, etc. + var niceFormatStrings = ['%M:%S.%#N', '%M:%S.%#N', '%M:%S.%#N', '%M:%S', '%M:%S', '%M:%S', '%M:%S', '%H:%M:%S', '%H:%M:%S', '%H:%M', '%H:%M', '%H:%M', '%H:%M', '%H:%M', '%H:%M', '%a %H:%M', '%a %H:%M', '%b %e %H:%M', '%b %e %H:%M', '%b %e %H:%M', '%b %e %H:%M', '%v', '%v', '%v', '%v', '%v', '%v', '%v']; + var niceIntervals = [0.1*second, 0.2*second, 0.5*second, second, 2*second, 5*second, 10*second, 15*second, 30*second, minute, 2*minute, 5*minute, 10*minute, 15*minute, 30*minute, hour, 2*hour, 4*hour, 6*hour, 8*hour, 12*hour, day, 2*day, 3*day, 4*day, 5*day, week, 2*week]; + + var niceMonthlyIntervals = []; + + function bestDateInterval(min, max, titarget) { + // iterate through niceIntervals to find one closest to titarget + var badness = Number.MAX_VALUE; + var temp, bestTi, bestfmt; + for (var i=0, l=niceIntervals.length; i < l; i++) { + temp = Math.abs(titarget - niceIntervals[i]); + if (temp < badness) { + badness = temp; + bestTi = niceIntervals[i]; + bestfmt = niceFormatStrings[i]; + } + } + + return [bestTi, bestfmt]; + } + + $.jqplot.DateAxisRenderer.prototype = new $.jqplot.LinearAxisRenderer(); + $.jqplot.DateAxisRenderer.prototype.constructor = $.jqplot.DateAxisRenderer; + + $.jqplot.DateTickFormatter = function(format, val) { + if (!format) { + format = '%Y/%m/%d'; + } + return $.jsDate.strftime(val, format); + }; + + $.jqplot.DateAxisRenderer.prototype.init = function(options){ + // prop: tickRenderer + // A class of a rendering engine for creating the ticks labels displayed on the plot, + // See <$.jqplot.AxisTickRenderer>. + // this.tickRenderer = $.jqplot.AxisTickRenderer; + // this.labelRenderer = $.jqplot.AxisLabelRenderer; + this.tickOptions.formatter = $.jqplot.DateTickFormatter; + // prop: tickInset + // Controls the amount to inset the first and last ticks from + // the edges of the grid, in multiples of the tick interval. + // 0 is no inset, 0.5 is one half a tick interval, 1 is a full + // tick interval, etc. + this.tickInset = 0; + // prop: drawBaseline + // True to draw the axis baseline. + this.drawBaseline = true; + // prop: baselineWidth + // width of the baseline in pixels. + this.baselineWidth = null; + // prop: baselineColor + // CSS color spec for the baseline. + this.baselineColor = null; + this.daTickInterval = null; + this._daTickInterval = null; + + $.extend(true, this, options); + + var db = this._dataBounds, + stats, + sum, + s, + d, + pd, + sd, + intv; + + // Go through all the series attached to this axis and find + // the min/max bounds for this axis. + for (var i=0; i<this._series.length; i++) { + stats = {intervals:[], frequencies:{}, sortedIntervals:[], min:null, max:null, mean:null}; + sum = 0; + s = this._series[i]; + d = s.data; + pd = s._plotData; + sd = s._stackData; + intv = 0; + + for (var j=0; j<d.length; j++) { + if (this.name == 'xaxis' || this.name == 'x2axis') { + d[j][0] = new $.jsDate(d[j][0]).getTime(); + pd[j][0] = new $.jsDate(d[j][0]).getTime(); + sd[j][0] = new $.jsDate(d[j][0]).getTime(); + if ((d[j][0] != null && d[j][0] < db.min) || db.min == null) { + db.min = d[j][0]; + } + if ((d[j][0] != null && d[j][0] > db.max) || db.max == null) { + db.max = d[j][0]; + } + if (j>0) { + intv = Math.abs(d[j][0] - d[j-1][0]); + stats.intervals.push(intv); + if (stats.frequencies.hasOwnProperty(intv)) { + stats.frequencies[intv] += 1; + } + else { + stats.frequencies[intv] = 1; + } + } + sum += intv; + + } + else { + d[j][1] = new $.jsDate(d[j][1]).getTime(); + pd[j][1] = new $.jsDate(d[j][1]).getTime(); + sd[j][1] = new $.jsDate(d[j][1]).getTime(); + if ((d[j][1] != null && d[j][1] < db.min) || db.min == null) { + db.min = d[j][1]; + } + if ((d[j][1] != null && d[j][1] > db.max) || db.max == null) { + db.max = d[j][1]; + } + if (j>0) { + intv = Math.abs(d[j][1] - d[j-1][1]); + stats.intervals.push(intv); + if (stats.frequencies.hasOwnProperty(intv)) { + stats.frequencies[intv] += 1; + } + else { + stats.frequencies[intv] = 1; + } + } + } + sum += intv; + } + + if (s.renderer.bands) { + if (s.renderer.bands.hiData.length) { + var bd = s.renderer.bands.hiData; + for (var j=0, l=bd.length; j < l; j++) { + if (this.name === 'xaxis' || this.name === 'x2axis') { + bd[j][0] = new $.jsDate(bd[j][0]).getTime(); + if ((bd[j][0] != null && bd[j][0] > db.max) || db.max == null) { + db.max = bd[j][0]; + } + } + else { + bd[j][1] = new $.jsDate(bd[j][1]).getTime(); + if ((bd[j][1] != null && bd[j][1] > db.max) || db.max == null) { + db.max = bd[j][1]; + } + } + } + } + if (s.renderer.bands.lowData.length) { + var bd = s.renderer.bands.lowData; + for (var j=0, l=bd.length; j < l; j++) { + if (this.name === 'xaxis' || this.name === 'x2axis') { + bd[j][0] = new $.jsDate(bd[j][0]).getTime(); + if ((bd[j][0] != null && bd[j][0] < db.min) || db.min == null) { + db.min = bd[j][0]; + } + } + else { + bd[j][1] = new $.jsDate(bd[j][1]).getTime(); + if ((bd[j][1] != null && bd[j][1] < db.min) || db.min == null) { + db.min = bd[j][1]; + } + } + } + } + } + + var tempf = 0, + tempn=0; + for (var n in stats.frequencies) { + stats.sortedIntervals.push({interval:n, frequency:stats.frequencies[n]}); + } + stats.sortedIntervals.sort(function(a, b){ + return b.frequency - a.frequency; + }); + + stats.min = $.jqplot.arrayMin(stats.intervals); + stats.max = $.jqplot.arrayMax(stats.intervals); + stats.mean = sum/d.length; + this._intervalStats.push(stats); + stats = sum = s = d = pd = sd = null; + } + db = null; + + }; + + // called with scope of an axis + $.jqplot.DateAxisRenderer.prototype.reset = function() { + this.min = this._options.min; + this.max = this._options.max; + this.tickInterval = this._options.tickInterval; + this.numberTicks = this._options.numberTicks; + this._autoFormatString = ''; + if (this._overrideFormatString && this.tickOptions && this.tickOptions.formatString) { + this.tickOptions.formatString = ''; + } + this.daTickInterval = this._daTickInterval; + // this._ticks = this.__ticks; + }; + + $.jqplot.DateAxisRenderer.prototype.createTicks = function(plot) { + // we're are operating on an axis here + var ticks = this._ticks; + var userTicks = this.ticks; + var name = this.name; + // databounds were set on axis initialization. + var db = this._dataBounds; + var iv = this._intervalStats; + var dim = (this.name.charAt(0) === 'x') ? this._plotDimensions.width : this._plotDimensions.height; + var interval; + var min, max; + var pos1, pos2; + var tt, i; + var threshold = 30; + var insetMult = 1; + + var tickInterval = this.tickInterval; + + // if we already have ticks, use them. + // ticks must be in order of increasing value. + + min = ((this.min != null) ? new $.jsDate(this.min).getTime() : db.min); + max = ((this.max != null) ? new $.jsDate(this.max).getTime() : db.max); + + // see if we're zooming. if we are, don't use the min and max we're given, + // but compute some nice ones. They will be reset later. + + var cursor = plot.plugins.cursor; + + if (cursor && cursor._zoom && cursor._zoom.zooming) { + this.min = null; + this.max = null; + } + + var range = max - min; + + if (this.tickOptions == null || !this.tickOptions.formatString) { + this._overrideFormatString = true; + } + + if (userTicks.length) { + // ticks could be 1D or 2D array of [val, val, ,,,] or [[val, label], [val, label], ...] or mixed + for (i=0; i<userTicks.length; i++){ + var ut = userTicks[i]; + var t = new this.tickRenderer(this.tickOptions); + if (ut.constructor == Array) { + t.value = new $.jsDate(ut[0]).getTime(); + t.label = ut[1]; + if (!this.showTicks) { + t.showLabel = false; + t.showMark = false; + } + else if (!this.showTickMarks) { + t.showMark = false; + } + t.setTick(t.value, this.name); + this._ticks.push(t); + } + + else { + t.value = new $.jsDate(ut).getTime(); + if (!this.showTicks) { + t.showLabel = false; + t.showMark = false; + } + else if (!this.showTickMarks) { + t.showMark = false; + } + t.setTick(t.value, this.name); + this._ticks.push(t); + } + } + this.numberTicks = userTicks.length; + this.min = this._ticks[0].value; + this.max = this._ticks[this.numberTicks-1].value; + this.daTickInterval = [(this.max - this.min) / (this.numberTicks - 1)/1000, 'seconds']; + } + + //////// + // We don't have any ticks yet, let's make some! + //////// + + // if user specified min and max are null, we set those to make best ticks. + else if (this.min == null && this.max == null) { + var opts = $.extend(true, {}, this.tickOptions, {name: this.name, value: null}); + // want to find a nice interval + var nttarget, + titarget; + + // if no tickInterval or numberTicks options specified, make a good guess. + if (!this.tickInterval && !this.numberTicks) { + var tdim = Math.max(dim, threshold+1); + // how many ticks to put on the axis? + // date labels tend to be long. If ticks not rotated, + // don't use too many and have a high spacing factor. + // If we are rotating ticks, use a lower factor. + var spacingFactor = 115; + if (this.tickRenderer === $.jqplot.CanvasAxisTickRenderer && this.tickOptions.angle) { + spacingFactor = 115 - 40 * Math.abs(Math.sin(this.tickOptions.angle/180*Math.PI)); + } + + nttarget = Math.ceil((tdim-threshold)/spacingFactor + 1); + titarget = (max - min) / (nttarget - 1); + } + + // If tickInterval is specified, we'll try to honor it. + // Not gauranteed to get this interval, but we'll get as close as + // we can. + // tickInterval will be used before numberTicks, that is if + // both are specified, numberTicks will be ignored. + else if (this.tickInterval) { + titarget = this.tickInterval; + } + + // if numberTicks specified, try to honor it. + // Not gauranteed, but will try to get close. + else if (this.numberTicks) { + nttarget = this.numberTicks; + titarget = (max - min) / (nttarget - 1); + } + + // If we can use an interval of 2 weeks or less, pick best one + if (titarget <= 19*day) { + var ret = bestDateInterval(min, max, titarget); + var tempti = ret[0]; + this._autoFormatString = ret[1]; + + min = Math.floor(min/tempti) * tempti; + min = new $.jsDate(min); + min = min.getTime() + min.getUtcOffset(); + + nttarget = Math.ceil((max - min) / tempti) + 1; + this.min = min; + this.max = min + (nttarget - 1) * tempti; + + // if max is less than max, add an interval + if (this.max < max) { + this.max += tempti; + nttarget += 1; + } + this.tickInterval = tempti; + this.numberTicks = nttarget; + + for (var i=0; i<nttarget; i++) { + opts.value = this.min + i * tempti; + t = new this.tickRenderer(opts); + + if (this._overrideFormatString && this._autoFormatString != '') { + t.formatString = this._autoFormatString; + } + if (!this.showTicks) { + t.showLabel = false; + t.showMark = false; + } + else if (!this.showTickMarks) { + t.showMark = false; + } + this._ticks.push(t); + } + + insetMult = this.tickInterval; + } + + // should we use a monthly interval? + else if (titarget <= 9 * month) { + + this._autoFormatString = '%v'; + + // how many months in an interval? + var intv = Math.round(titarget/month); + if (intv < 1) { + intv = 1; + } + else if (intv > 6) { + intv = 6; + } + + // figure out the starting month and ending month. + var mstart = new $.jsDate(min).setDate(1).setHours(0,0,0,0); + + // See if max ends exactly on a month + var tempmend = new $.jsDate(max); + var mend = new $.jsDate(max).setDate(1).setHours(0,0,0,0); + + if (tempmend.getTime() !== mend.getTime()) { + mend = mend.add(1, 'month'); + } + + var nmonths = mend.diff(mstart, 'month'); + + nttarget = Math.ceil(nmonths/intv) + 1; + + this.min = mstart.getTime(); + this.max = mstart.clone().add((nttarget - 1) * intv, 'month').getTime(); + this.numberTicks = nttarget; + + for (var i=0; i<nttarget; i++) { + if (i === 0) { + opts.value = mstart.getTime(); + } + else { + opts.value = mstart.add(intv, 'month').getTime(); + } + t = new this.tickRenderer(opts); + + if (this._overrideFormatString && this._autoFormatString != '') { + t.formatString = this._autoFormatString; + } + if (!this.showTicks) { + t.showLabel = false; + t.showMark = false; + } + else if (!this.showTickMarks) { + t.showMark = false; + } + this._ticks.push(t); + } + + insetMult = intv * month; + } + + // use yearly intervals + else { + + this._autoFormatString = '%v'; + + // how many years in an interval? + var intv = Math.round(titarget/year); + if (intv < 1) { + intv = 1; + } + + // figure out the starting and ending years. + var mstart = new $.jsDate(min).setMonth(0, 1).setHours(0,0,0,0); + var mend = new $.jsDate(max).add(1, 'year').setMonth(0, 1).setHours(0,0,0,0); + + var nyears = mend.diff(mstart, 'year'); + + nttarget = Math.ceil(nyears/intv) + 1; + + this.min = mstart.getTime(); + this.max = mstart.clone().add((nttarget - 1) * intv, 'year').getTime(); + this.numberTicks = nttarget; + + for (var i=0; i<nttarget; i++) { + if (i === 0) { + opts.value = mstart.getTime(); + } + else { + opts.value = mstart.add(intv, 'year').getTime(); + } + t = new this.tickRenderer(opts); + + if (this._overrideFormatString && this._autoFormatString != '') { + t.formatString = this._autoFormatString; + } + if (!this.showTicks) { + t.showLabel = false; + t.showMark = false; + } + else if (!this.showTickMarks) { + t.showMark = false; + } + this._ticks.push(t); + } + + insetMult = intv * year; + } + } + + //////// + // Some option(s) specified, work around that. + //////// + + else { + if (name == 'xaxis' || name == 'x2axis') { + dim = this._plotDimensions.width; + } + else { + dim = this._plotDimensions.height; + } + + // if min, max and number of ticks specified, user can't specify interval. + if (this.min != null && this.max != null && this.numberTicks != null) { + this.tickInterval = null; + } + + // if user specified a tick interval, convert to usable. + if (this.tickInterval != null) + { + // if interval is a number or can be converted to one, use it. + // Assume it is in SECONDS!!! + if (Number(this.tickInterval)) { + this.daTickInterval = [Number(this.tickInterval), 'seconds']; + } + // else, parse out something we can build from. + else if (typeof this.tickInterval == "string") { + var parts = this.tickInterval.split(' '); + if (parts.length == 1) { + this.daTickInterval = [1, parts[0]]; + } + else if (parts.length == 2) { + this.daTickInterval = [parts[0], parts[1]]; + } + } + } + + // if min and max are same, space them out a bit + if (min == max) { + var adj = 24*60*60*500; // 1/2 day + min -= adj; + max += adj; + } + + range = max - min; + + var optNumTicks = 2 + parseInt(Math.max(0, dim-100)/100, 10); + + + var rmin, rmax; + + rmin = (this.min != null) ? new $.jsDate(this.min).getTime() : min - range/2*(this.padMin - 1); + rmax = (this.max != null) ? new $.jsDate(this.max).getTime() : max + range/2*(this.padMax - 1); + this.min = rmin; + this.max = rmax; + range = this.max - this.min; + + if (this.numberTicks == null){ + // if tickInterval is specified by user, we will ignore computed maximum. + // max will be equal or greater to fit even # of ticks. + if (this.daTickInterval != null) { + var nc = new $.jsDate(this.max).diff(this.min, this.daTickInterval[1], true); + this.numberTicks = Math.ceil(nc/this.daTickInterval[0]) +1; + // this.max = new $.jsDate(this.min).add(this.numberTicks-1, this.daTickInterval[1]).getTime(); + this.max = new $.jsDate(this.min).add((this.numberTicks-1) * this.daTickInterval[0], this.daTickInterval[1]).getTime(); + } + else if (dim > 200) { + this.numberTicks = parseInt(3+(dim-200)/100, 10); + } + else { + this.numberTicks = 2; + } + } + + insetMult = range / (this.numberTicks-1)/1000; + + if (this.daTickInterval == null) { + this.daTickInterval = [insetMult, 'seconds']; + } + + + for (var i=0; i<this.numberTicks; i++){ + var min = new $.jsDate(this.min); + tt = min.add(i*this.daTickInterval[0], this.daTickInterval[1]).getTime(); + var t = new this.tickRenderer(this.tickOptions); + // var t = new $.jqplot.AxisTickRenderer(this.tickOptions); + if (!this.showTicks) { + t.showLabel = false; + t.showMark = false; + } + else if (!this.showTickMarks) { + t.showMark = false; + } + t.setTick(tt, this.name); + this._ticks.push(t); + } + } + + if (this.tickInset) { + this.min = this.min - this.tickInset * insetMult; + this.max = this.max + this.tickInset * insetMult; + } + + if (this._daTickInterval == null) { + this._daTickInterval = this.daTickInterval; + } + + ticks = null; + }; + +})(jQuery); + diff --git a/libreplan-webapp/src/main/webapp/jqplot/plugins/jqplot.dateAxisRenderer.min.js b/libreplan-webapp/src/main/webapp/jqplot/plugins/jqplot.dateAxisRenderer.min.js new file mode 100644 index 000000000..4173e918b --- /dev/null +++ b/libreplan-webapp/src/main/webapp/jqplot/plugins/jqplot.dateAxisRenderer.min.js @@ -0,0 +1,57 @@ +/** + * jqPlot + * Pure JavaScript plotting plugin using jQuery + * + * Version: 1.0.0b2_r1012 + * + * Copyright (c) 2009-2011 Chris Leonello + * jqPlot is currently available for use in all personal or commercial projects + * under both the MIT (http://www.opensource.org/licenses/mit-license.php) and GPL + * version 2.0 (http://www.gnu.org/licenses/gpl-2.0.html) licenses. This means that you can + * choose the license that best suits your project and use it accordingly. + * + * Although not required, the author would appreciate an email letting him + * know of any substantial use of jqPlot. You can reach the author at: + * chris at jqplot dot com or see http://www.jqplot.com/info.php . + * + * If you are feeling kind and generous, consider supporting the project by + * making a donation at: http://www.jqplot.com/donate.php . + * + * sprintf functions contained in jqplot.sprintf.js by Ash Searle: + * + * version 2007.04.27 + * author Ash Searle + * http://hexmen.com/blog/2007/03/printf-sprintf/ + * http://hexmen.com/js/sprintf.js + * The author (Ash Searle) has placed this code in the public domain: + * "This code is unrestricted: you are free to use it however you like." + * + * included jsDate library by Chris Leonello: + * + * Copyright (c) 2010-2011 Chris Leonello + * + * jsDate is currently available for use in all personal or commercial projects + * under both the MIT and GPL version 2.0 licenses. This means that you can + * choose the license that best suits your project and use it accordingly. + * + * jsDate borrows many concepts and ideas from the Date Instance + * Methods by Ken Snyder along with some parts of Ken's actual code. + * + * Ken's origianl Date Instance Methods and copyright notice: + * + * Ken Snyder (ken d snyder at gmail dot com) + * 2008-09-10 + * version 2.0.2 (http://kendsnyder.com/sandbox/date/) + * Creative Commons Attribution License 3.0 (http://creativecommons.org/licenses/by/3.0/) + * + * jqplotToImage function based on Larry Siden's export-jqplot-to-png.js. + * Larry has generously given permission to adapt his code for inclusion + * into jqPlot. + * + * Larry's original code can be found here: + * + * https://github.com/lsiden/export-jqplot-to-png + * + * + */ +(function(h){h.jqplot.DateAxisRenderer=function(){h.jqplot.LinearAxisRenderer.call(this);this.date=new h.jsDate()};var c=1000;var e=60*c;var f=60*e;var l=24*f;var b=7*l;var j=30.4368499*l;var k=365.242199*l;var g=[31,28,31,30,31,30,31,30,31,30,31,30];var i=["%M:%S.%#N","%M:%S.%#N","%M:%S.%#N","%M:%S","%M:%S","%M:%S","%M:%S","%H:%M:%S","%H:%M:%S","%H:%M","%H:%M","%H:%M","%H:%M","%H:%M","%H:%M","%a %H:%M","%a %H:%M","%b %e %H:%M","%b %e %H:%M","%b %e %H:%M","%b %e %H:%M","%v","%v","%v","%v","%v","%v","%v"];var m=[0.1*c,0.2*c,0.5*c,c,2*c,5*c,10*c,15*c,30*c,e,2*e,5*e,10*e,15*e,30*e,f,2*f,4*f,6*f,8*f,12*f,l,2*l,3*l,4*l,5*l,b,2*b];var d=[];function a(p,s,t){var o=Number.MAX_VALUE;var u,r,v;for(var q=0,n=m.length;q<n;q++){u=Math.abs(t-m[q]);if(u<o){o=u;r=m[q];v=i[q]}}return[r,v]}h.jqplot.DateAxisRenderer.prototype=new h.jqplot.LinearAxisRenderer();h.jqplot.DateAxisRenderer.prototype.constructor=h.jqplot.DateAxisRenderer;h.jqplot.DateTickFormatter=function(n,o){if(!n){n="%Y/%m/%d"}return h.jsDate.strftime(o,n)};h.jqplot.DateAxisRenderer.prototype.init=function(E){this.tickOptions.formatter=h.jqplot.DateTickFormatter;this.tickInset=0;this.drawBaseline=true;this.baselineWidth=null;this.baselineColor=null;this.daTickInterval=null;this._daTickInterval=null;h.extend(true,this,E);var C=this._dataBounds,u,x,D,y,A,z,o;for(var t=0;t<this._series.length;t++){u={intervals:[],frequencies:{},sortedIntervals:[],min:null,max:null,mean:null};x=0;D=this._series[t];y=D.data;A=D._plotData;z=D._stackData;o=0;for(var r=0;r<y.length;r++){if(this.name=="xaxis"||this.name=="x2axis"){y[r][0]=new h.jsDate(y[r][0]).getTime();A[r][0]=new h.jsDate(y[r][0]).getTime();z[r][0]=new h.jsDate(y[r][0]).getTime();if((y[r][0]!=null&&y[r][0]<C.min)||C.min==null){C.min=y[r][0]}if((y[r][0]!=null&&y[r][0]>C.max)||C.max==null){C.max=y[r][0]}if(r>0){o=Math.abs(y[r][0]-y[r-1][0]);u.intervals.push(o);if(u.frequencies.hasOwnProperty(o)){u.frequencies[o]+=1}else{u.frequencies[o]=1}}x+=o}else{y[r][1]=new h.jsDate(y[r][1]).getTime();A[r][1]=new h.jsDate(y[r][1]).getTime();z[r][1]=new h.jsDate(y[r][1]).getTime();if((y[r][1]!=null&&y[r][1]<C.min)||C.min==null){C.min=y[r][1]}if((y[r][1]!=null&&y[r][1]>C.max)||C.max==null){C.max=y[r][1]}if(r>0){o=Math.abs(y[r][1]-y[r-1][1]);u.intervals.push(o);if(u.frequencies.hasOwnProperty(o)){u.frequencies[o]+=1}else{u.frequencies[o]=1}}}x+=o}if(D.renderer.bands){if(D.renderer.bands.hiData.length){var w=D.renderer.bands.hiData;for(var r=0,q=w.length;r<q;r++){if(this.name==="xaxis"||this.name==="x2axis"){w[r][0]=new h.jsDate(w[r][0]).getTime();if((w[r][0]!=null&&w[r][0]>C.max)||C.max==null){C.max=w[r][0]}}else{w[r][1]=new h.jsDate(w[r][1]).getTime();if((w[r][1]!=null&&w[r][1]>C.max)||C.max==null){C.max=w[r][1]}}}}if(D.renderer.bands.lowData.length){var w=D.renderer.bands.lowData;for(var r=0,q=w.length;r<q;r++){if(this.name==="xaxis"||this.name==="x2axis"){w[r][0]=new h.jsDate(w[r][0]).getTime();if((w[r][0]!=null&&w[r][0]<C.min)||C.min==null){C.min=w[r][0]}}else{w[r][1]=new h.jsDate(w[r][1]).getTime();if((w[r][1]!=null&&w[r][1]<C.min)||C.min==null){C.min=w[r][1]}}}}}var B=0,v=0;for(var p in u.frequencies){u.sortedIntervals.push({interval:p,frequency:u.frequencies[p]})}u.sortedIntervals.sort(function(s,n){return n.frequency-s.frequency});u.min=h.jqplot.arrayMin(u.intervals);u.max=h.jqplot.arrayMax(u.intervals);u.mean=x/y.length;this._intervalStats.push(u);u=x=D=y=A=z=null}C=null};h.jqplot.DateAxisRenderer.prototype.reset=function(){this.min=this._options.min;this.max=this._options.max;this.tickInterval=this._options.tickInterval;this.numberTicks=this._options.numberTicks;this._autoFormatString="";if(this._overrideFormatString&&this.tickOptions&&this.tickOptions.formatString){this.tickOptions.formatString=""}this.daTickInterval=this._daTickInterval};h.jqplot.DateAxisRenderer.prototype.createTicks=function(p){var U=this._ticks;var J=this.ticks;var E=this.name;var G=this._dataBounds;var L=this._intervalStats;var n=(this.name.charAt(0)==="x")?this._plotDimensions.width:this._plotDimensions.height;var w;var ab,I;var y,x;var aa,X;var s=30;var N=1;var v=this.tickInterval;ab=((this.min!=null)?new h.jsDate(this.min).getTime():G.min);I=((this.max!=null)?new h.jsDate(this.max).getTime():G.max);var A=p.plugins.cursor;if(A&&A._zoom&&A._zoom.zooming){this.min=null;this.max=null}var B=I-ab;if(this.tickOptions==null||!this.tickOptions.formatString){this._overrideFormatString=true}if(J.length){for(X=0;X<J.length;X++){var O=J[X];var V=new this.tickRenderer(this.tickOptions);if(O.constructor==Array){V.value=new h.jsDate(O[0]).getTime();V.label=O[1];if(!this.showTicks){V.showLabel=false;V.showMark=false}else{if(!this.showTickMarks){V.showMark=false}}V.setTick(V.value,this.name);this._ticks.push(V)}else{V.value=new h.jsDate(O).getTime();if(!this.showTicks){V.showLabel=false;V.showMark=false}else{if(!this.showTickMarks){V.showMark=false}}V.setTick(V.value,this.name);this._ticks.push(V)}}this.numberTicks=J.length;this.min=this._ticks[0].value;this.max=this._ticks[this.numberTicks-1].value;this.daTickInterval=[(this.max-this.min)/(this.numberTicks-1)/1000,"seconds"]}else{if(this.min==null&&this.max==null){var M=h.extend(true,{},this.tickOptions,{name:this.name,value:null});var Y,H;if(!this.tickInterval&&!this.numberTicks){var Q=Math.max(n,s+1);var W=115;if(this.tickRenderer===h.jqplot.CanvasAxisTickRenderer&&this.tickOptions.angle){W=115-40*Math.abs(Math.sin(this.tickOptions.angle/180*Math.PI))}Y=Math.ceil((Q-s)/W+1);H=(I-ab)/(Y-1)}else{if(this.tickInterval){H=this.tickInterval}else{if(this.numberTicks){Y=this.numberTicks;H=(I-ab)/(Y-1)}}}if(H<=19*l){var P=a(ab,I,H);var r=P[0];this._autoFormatString=P[1];ab=Math.floor(ab/r)*r;ab=new h.jsDate(ab);ab=ab.getTime()+ab.getUtcOffset();Y=Math.ceil((I-ab)/r)+1;this.min=ab;this.max=ab+(Y-1)*r;if(this.max<I){this.max+=r;Y+=1}this.tickInterval=r;this.numberTicks=Y;for(var X=0;X<Y;X++){M.value=this.min+X*r;V=new this.tickRenderer(M);if(this._overrideFormatString&&this._autoFormatString!=""){V.formatString=this._autoFormatString}if(!this.showTicks){V.showLabel=false;V.showMark=false}else{if(!this.showTickMarks){V.showMark=false}}this._ticks.push(V)}N=this.tickInterval}else{if(H<=9*j){this._autoFormatString="%v";var D=Math.round(H/j);if(D<1){D=1}else{if(D>6){D=6}}var S=new h.jsDate(ab).setDate(1).setHours(0,0,0,0);var q=new h.jsDate(I);var z=new h.jsDate(I).setDate(1).setHours(0,0,0,0);if(q.getTime()!==z.getTime()){z=z.add(1,"month")}var R=z.diff(S,"month");Y=Math.ceil(R/D)+1;this.min=S.getTime();this.max=S.clone().add((Y-1)*D,"month").getTime();this.numberTicks=Y;for(var X=0;X<Y;X++){if(X===0){M.value=S.getTime()}else{M.value=S.add(D,"month").getTime()}V=new this.tickRenderer(M);if(this._overrideFormatString&&this._autoFormatString!=""){V.formatString=this._autoFormatString}if(!this.showTicks){V.showLabel=false;V.showMark=false}else{if(!this.showTickMarks){V.showMark=false}}this._ticks.push(V)}N=D*j}else{this._autoFormatString="%v";var D=Math.round(H/k);if(D<1){D=1}var S=new h.jsDate(ab).setMonth(0,1).setHours(0,0,0,0);var z=new h.jsDate(I).add(1,"year").setMonth(0,1).setHours(0,0,0,0);var K=z.diff(S,"year");Y=Math.ceil(K/D)+1;this.min=S.getTime();this.max=S.clone().add((Y-1)*D,"year").getTime();this.numberTicks=Y;for(var X=0;X<Y;X++){if(X===0){M.value=S.getTime()}else{M.value=S.add(D,"year").getTime()}V=new this.tickRenderer(M);if(this._overrideFormatString&&this._autoFormatString!=""){V.formatString=this._autoFormatString}if(!this.showTicks){V.showLabel=false;V.showMark=false}else{if(!this.showTickMarks){V.showMark=false}}this._ticks.push(V)}N=D*k}}}else{if(E=="xaxis"||E=="x2axis"){n=this._plotDimensions.width}else{n=this._plotDimensions.height}if(this.min!=null&&this.max!=null&&this.numberTicks!=null){this.tickInterval=null}if(this.tickInterval!=null){if(Number(this.tickInterval)){this.daTickInterval=[Number(this.tickInterval),"seconds"]}else{if(typeof this.tickInterval=="string"){var Z=this.tickInterval.split(" ");if(Z.length==1){this.daTickInterval=[1,Z[0]]}else{if(Z.length==2){this.daTickInterval=[Z[0],Z[1]]}}}}}if(ab==I){var o=24*60*60*500;ab-=o;I+=o}B=I-ab;var F=2+parseInt(Math.max(0,n-100)/100,10);var T,C;T=(this.min!=null)?new h.jsDate(this.min).getTime():ab-B/2*(this.padMin-1);C=(this.max!=null)?new h.jsDate(this.max).getTime():I+B/2*(this.padMax-1);this.min=T;this.max=C;B=this.max-this.min;if(this.numberTicks==null){if(this.daTickInterval!=null){var u=new h.jsDate(this.max).diff(this.min,this.daTickInterval[1],true);this.numberTicks=Math.ceil(u/this.daTickInterval[0])+1;this.max=new h.jsDate(this.min).add((this.numberTicks-1)*this.daTickInterval[0],this.daTickInterval[1]).getTime()}else{if(n>200){this.numberTicks=parseInt(3+(n-200)/100,10)}else{this.numberTicks=2}}}N=B/(this.numberTicks-1)/1000;if(this.daTickInterval==null){this.daTickInterval=[N,"seconds"]}for(var X=0;X<this.numberTicks;X++){var ab=new h.jsDate(this.min);aa=ab.add(X*this.daTickInterval[0],this.daTickInterval[1]).getTime();var V=new this.tickRenderer(this.tickOptions);if(!this.showTicks){V.showLabel=false;V.showMark=false}else{if(!this.showTickMarks){V.showMark=false}}V.setTick(aa,this.name);this._ticks.push(V)}}}if(this.tickInset){this.min=this.min-this.tickInset*N;this.max=this.max+this.tickInset*N}if(this._daTickInterval==null){this._daTickInterval=this.daTickInterval}U=null}})(jQuery); \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/plugins/jqplot.donutRenderer.js b/libreplan-webapp/src/main/webapp/jqplot/plugins/jqplot.donutRenderer.js new file mode 100644 index 000000000..e541e3ae4 --- /dev/null +++ b/libreplan-webapp/src/main/webapp/jqplot/plugins/jqplot.donutRenderer.js @@ -0,0 +1,800 @@ +/** + * jqPlot + * Pure JavaScript plotting plugin using jQuery + * + * Version: 1.0.0b2_r1012 + * + * Copyright (c) 2009-2011 Chris Leonello + * jqPlot is currently available for use in all personal or commercial projects + * under both the MIT (http://www.opensource.org/licenses/mit-license.php) and GPL + * version 2.0 (http://www.gnu.org/licenses/gpl-2.0.html) licenses. This means that you can + * choose the license that best suits your project and use it accordingly. + * + * Although not required, the author would appreciate an email letting him + * know of any substantial use of jqPlot. You can reach the author at: + * chris at jqplot dot com or see http://www.jqplot.com/info.php . + * + * If you are feeling kind and generous, consider supporting the project by + * making a donation at: http://www.jqplot.com/donate.php . + * + * sprintf functions contained in jqplot.sprintf.js by Ash Searle: + * + * version 2007.04.27 + * author Ash Searle + * http://hexmen.com/blog/2007/03/printf-sprintf/ + * http://hexmen.com/js/sprintf.js + * The author (Ash Searle) has placed this code in the public domain: + * "This code is unrestricted: you are free to use it however you like." + * + */ +(function($) { + /** + * Class: $.jqplot.DonutRenderer + * Plugin renderer to draw a donut chart. + * x values, if present, will be used as slice labels. + * y values give slice size. + * + * To use this renderer, you need to include the + * donut renderer plugin, for example: + * + * > <script type="text/javascript" src="plugins/jqplot.donutRenderer.js"></script> + * + * Properties described here are passed into the $.jqplot function + * as options on the series renderer. For example: + * + * > plot2 = $.jqplot('chart2', [s1, s2], { + * > seriesDefaults: { + * > renderer:$.jqplot.DonutRenderer, + * > rendererOptions:{ + * > sliceMargin: 2, + * > innerDiameter: 110, + * > startAngle: -90 + * > } + * > } + * > }); + * + * A donut plot will trigger events on the plot target + * according to user interaction. All events return the event object, + * the series index, the point (slice) index, and the point data for + * the appropriate slice. + * + * 'jqplotDataMouseOver' - triggered when user mouseing over a slice. + * 'jqplotDataHighlight' - triggered the first time user mouses over a slice, + * if highlighting is enabled. + * 'jqplotDataUnhighlight' - triggered when a user moves the mouse out of + * a highlighted slice. + * 'jqplotDataClick' - triggered when the user clicks on a slice. + * 'jqplotDataRightClick' - tiggered when the user right clicks on a slice if + * the "captureRightClick" option is set to true on the plot. + */ + $.jqplot.DonutRenderer = function(){ + $.jqplot.LineRenderer.call(this); + }; + + $.jqplot.DonutRenderer.prototype = new $.jqplot.LineRenderer(); + $.jqplot.DonutRenderer.prototype.constructor = $.jqplot.DonutRenderer; + + // called with scope of a series + $.jqplot.DonutRenderer.prototype.init = function(options, plot) { + // Group: Properties + // + // prop: diameter + // Outer diameter of the donut, auto computed by default + this.diameter = null; + // prop: innerDiameter + // Inner diameter of the donut, auto calculated by default. + // If specified will override thickness value. + this.innerDiameter = null; + // prop: thickness + // thickness of the donut, auto computed by default + // Overridden by if innerDiameter is specified. + this.thickness = null; + // prop: padding + // padding between the donut and plot edges, legend, etc. + this.padding = 20; + // prop: sliceMargin + // angular spacing between donut slices in degrees. + this.sliceMargin = 0; + // prop: ringMargin + // pixel distance between rings, or multiple series in a donut plot. + // null will compute ringMargin based on sliceMargin. + this.ringMargin = null; + // prop: fill + // true or false, wether to fil the slices. + this.fill = true; + // prop: shadowOffset + // offset of the shadow from the slice and offset of + // each succesive stroke of the shadow from the last. + this.shadowOffset = 2; + // prop: shadowAlpha + // transparency of the shadow (0 = transparent, 1 = opaque) + this.shadowAlpha = 0.07; + // prop: shadowDepth + // number of strokes to apply to the shadow, + // each stroke offset shadowOffset from the last. + this.shadowDepth = 5; + // prop: highlightMouseOver + // True to highlight slice when moused over. + // This must be false to enable highlightMouseDown to highlight when clicking on a slice. + this.highlightMouseOver = true; + // prop: highlightMouseDown + // True to highlight when a mouse button is pressed over a slice. + // This will be disabled if highlightMouseOver is true. + this.highlightMouseDown = false; + // prop: highlightColors + // an array of colors to use when highlighting a slice. + this.highlightColors = []; + // prop: dataLabels + // Either 'label', 'value', 'percent' or an array of labels to place on the pie slices. + // Defaults to percentage of each pie slice. + this.dataLabels = 'percent'; + // prop: showDataLabels + // true to show data labels on slices. + this.showDataLabels = false; + // prop: dataLabelFormatString + // Format string for data labels. If none, '%s' is used for "label" and for arrays, '%d' for value and '%d%%' for percentage. + this.dataLabelFormatString = null; + // prop: dataLabelThreshold + // 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. + this.dataLabelThreshold = 3; + // prop: dataLabelPositionFactor + // A Multiplier (0-1) of the pie radius which controls position of label on slice. + // Increasing will slide label toward edge of pie, decreasing will slide label toward center of pie. + this.dataLabelPositionFactor = 0.4; + // prop: dataLabelNudge + // Number of pixels to slide the label away from (+) or toward (-) the center of the pie. + this.dataLabelNudge = 0; + // prop: startAngle + // Angle to start drawing donut in degrees. + // According to orientation of canvas coordinate system: + // 0 = on the positive x axis + // -90 = on the positive y axis. + // 90 = on the negaive y axis. + // 180 or - 180 = on the negative x axis. + this.startAngle = 0; + this.tickRenderer = $.jqplot.DonutTickRenderer; + // Used as check for conditions where donut shouldn't be drawn. + this._drawData = true; + this._type = 'donut'; + + // if user has passed in highlightMouseDown option and not set highlightMouseOver, disable highlightMouseOver + if (options.highlightMouseDown && options.highlightMouseOver == null) { + options.highlightMouseOver = false; + } + + $.extend(true, this, options); + if (this.diameter != null) { + this.diameter = this.diameter - this.sliceMargin; + } + this._diameter = null; + this._innerDiameter = null; + this._radius = null; + this._innerRadius = null; + this._thickness = null; + // references to the previous series in the plot to properly calculate diameters + // and thicknesses of nested rings. + this._previousSeries = []; + this._numberSeries = 1; + // array of [start,end] angles arrays, one for each slice. In radians. + this._sliceAngles = []; + // index of the currenty highlighted point, if any + this._highlightedPoint = null; + + // set highlight colors if none provided + if (this.highlightColors.length == 0) { + for (var i=0; i<this.seriesColors.length; i++){ + var rgba = $.jqplot.getColorComponents(this.seriesColors[i]); + var newrgb = [rgba[0], rgba[1], rgba[2]]; + var sum = newrgb[0] + newrgb[1] + newrgb[2]; + for (var j=0; j<3; j++) { + // when darkening, lowest color component can be is 60. + newrgb[j] = (sum > 570) ? newrgb[j] * 0.8 : newrgb[j] + 0.3 * (255 - newrgb[j]); + newrgb[j] = parseInt(newrgb[j], 10); + } + this.highlightColors.push('rgb('+newrgb[0]+','+newrgb[1]+','+newrgb[2]+')'); + } + } + + plot.postParseOptionsHooks.addOnce(postParseOptions); + plot.postInitHooks.addOnce(postInit); + plot.eventListenerHooks.addOnce('jqplotMouseMove', handleMove); + plot.eventListenerHooks.addOnce('jqplotMouseDown', handleMouseDown); + plot.eventListenerHooks.addOnce('jqplotMouseUp', handleMouseUp); + plot.eventListenerHooks.addOnce('jqplotClick', handleClick); + plot.eventListenerHooks.addOnce('jqplotRightClick', handleRightClick); + plot.postDrawHooks.addOnce(postPlotDraw); + + + }; + + $.jqplot.DonutRenderer.prototype.setGridData = function(plot) { + // set gridData property. This will hold angle in radians of each data point. + var stack = []; + var td = []; + var sa = this.startAngle/180*Math.PI; + var tot = 0; + // don't know if we have any valid data yet, so set plot to not draw. + this._drawData = false; + for (var i=0; i<this.data.length; i++){ + if (this.data[i][1] != 0) { + // we have data, O.K. to draw. + this._drawData = true; + } + stack.push(this.data[i][1]); + td.push([this.data[i][0]]); + if (i>0) { + stack[i] += stack[i-1]; + } + tot += this.data[i][1]; + } + var fact = Math.PI*2/stack[stack.length - 1]; + + for (var i=0; i<stack.length; i++) { + td[i][1] = stack[i] * fact; + td[i][2] = this.data[i][1]/tot; + } + this.gridData = td; + }; + + $.jqplot.DonutRenderer.prototype.makeGridData = function(data, plot) { + var stack = []; + var td = []; + var tot = 0; + var sa = this.startAngle/180*Math.PI; + // don't know if we have any valid data yet, so set plot to not draw. + this._drawData = false; + for (var i=0; i<data.length; i++){ + if (this.data[i][1] != 0) { + // we have data, O.K. to draw. + this._drawData = true; + } + stack.push(data[i][1]); + td.push([data[i][0]]); + if (i>0) { + stack[i] += stack[i-1]; + } + tot += data[i][1]; + } + var fact = Math.PI*2/stack[stack.length - 1]; + + for (var i=0; i<stack.length; i++) { + td[i][1] = stack[i] * fact; + td[i][2] = data[i][1]/tot; + } + return td; + }; + + $.jqplot.DonutRenderer.prototype.drawSlice = function (ctx, ang1, ang2, color, isShadow) { + var r = this._diameter / 2; + var ri = r - this._thickness; + var fill = this.fill; + // var lineWidth = this.lineWidth; + ctx.save(); + ctx.translate(this._center[0], this._center[1]); + // ctx.translate(this.sliceMargin*Math.cos((ang1+ang2)/2), this.sliceMargin*Math.sin((ang1+ang2)/2)); + + if (isShadow) { + for (var i=0; i<this.shadowDepth; i++) { + ctx.save(); + ctx.translate(this.shadowOffset*Math.cos(this.shadowAngle/180*Math.PI), this.shadowOffset*Math.sin(this.shadowAngle/180*Math.PI)); + doDraw(); + } + } + + else { + doDraw(); + } + + function doDraw () { + // Fix for IE and Chrome that can't seem to draw circles correctly. + // ang2 should always be <= 2 pi since that is the way the data is converted. + if (ang2 > 6.282 + this.startAngle) { + ang2 = 6.282 + this.startAngle; + if (ang1 > ang2) { + ang1 = 6.281 + this.startAngle; + } + } + // Fix for IE, where it can't seem to handle 0 degree angles. Also avoids + // ugly line on unfilled donuts. + if (ang1 >= ang2) { + return; + } + ctx.beginPath(); + ctx.fillStyle = color; + ctx.strokeStyle = color; + // ctx.lineWidth = lineWidth; + ctx.arc(0, 0, r, ang1, ang2, false); + ctx.lineTo(ri*Math.cos(ang2), ri*Math.sin(ang2)); + ctx.arc(0,0, ri, ang2, ang1, true); + ctx.closePath(); + if (fill) { + ctx.fill(); + } + else { + ctx.stroke(); + } + } + + if (isShadow) { + for (var i=0; i<this.shadowDepth; i++) { + ctx.restore(); + } + } + + ctx.restore(); + }; + + // called with scope of series + $.jqplot.DonutRenderer.prototype.draw = function (ctx, gd, options, plot) { + var i; + var opts = (options != undefined) ? options : {}; + // offset and direction of offset due to legend placement + var offx = 0; + var offy = 0; + var trans = 1; + // var colorGenerator = new this.colorGenerator(this.seriesColors); + if (options.legendInfo && options.legendInfo.placement == 'insideGrid') { + var li = options.legendInfo; + switch (li.location) { + case 'nw': + offx = li.width + li.xoffset; + break; + case 'w': + offx = li.width + li.xoffset; + break; + case 'sw': + offx = li.width + li.xoffset; + break; + case 'ne': + offx = li.width + li.xoffset; + trans = -1; + break; + case 'e': + offx = li.width + li.xoffset; + trans = -1; + break; + case 'se': + offx = li.width + li.xoffset; + trans = -1; + break; + case 'n': + offy = li.height + li.yoffset; + break; + case 's': + offy = li.height + li.yoffset; + trans = -1; + break; + default: + break; + } + } + + var shadow = (opts.shadow != undefined) ? opts.shadow : this.shadow; + var showLine = (opts.showLine != undefined) ? opts.showLine : this.showLine; + var fill = (opts.fill != undefined) ? opts.fill : this.fill; + var cw = ctx.canvas.width; + var ch = ctx.canvas.height; + var w = cw - offx - 2 * this.padding; + var h = ch - offy - 2 * this.padding; + var mindim = Math.min(w,h); + var d = mindim; + var ringmargin = (this.ringMargin == null) ? this.sliceMargin * 2.0 : this.ringMargin; + + for (var i=0; i<this._previousSeries.length; i++) { + d -= 2.0 * this._previousSeries[i]._thickness + 2.0 * ringmargin; + } + this._diameter = this.diameter || d; + if (this.innerDiameter != null) { + var od = (this._numberSeries > 1 && this.index > 0) ? this._previousSeries[0]._diameter : this._diameter; + this._thickness = this.thickness || (od - this.innerDiameter - 2.0*ringmargin*this._numberSeries) / this._numberSeries/2.0; + } + else { + this._thickness = this.thickness || mindim / 2 / (this._numberSeries + 1) * 0.85; + } + + var r = this._radius = this._diameter/2; + this._innerRadius = this._radius - this._thickness; + var sa = this.startAngle / 180 * Math.PI; + this._center = [(cw - trans * offx)/2 + trans * offx, (ch - trans*offy)/2 + trans * offy]; + + if (this.shadow) { + var shadowColor = 'rgba(0,0,0,'+this.shadowAlpha+')'; + for (var i=0; i<gd.length; i++) { + var ang1 = (i == 0) ? sa : gd[i-1][1] + sa; + // Adjust ang1 and ang2 for sliceMargin + ang1 += this.sliceMargin/180*Math.PI; + this.renderer.drawSlice.call (this, ctx, ang1, gd[i][1]+sa, shadowColor, true); + } + + } + for (var i=0; i<gd.length; i++) { + var ang1 = (i == 0) ? sa : gd[i-1][1] + sa; + // Adjust ang1 and ang2 for sliceMargin + ang1 += this.sliceMargin/180*Math.PI; + var ang2 = gd[i][1] + sa; + this._sliceAngles.push([ang1, ang2]); + this.renderer.drawSlice.call (this, ctx, ang1, ang2, this.seriesColors[i], false); + + if (this.showDataLabels && gd[i][2]*100 >= this.dataLabelThreshold) { + var fstr, avgang = (ang1+ang2)/2, label; + + if (this.dataLabels == 'label') { + fstr = this.dataLabelFormatString || '%s'; + label = $.jqplot.sprintf(fstr, gd[i][0]); + } + else if (this.dataLabels == 'value') { + fstr = this.dataLabelFormatString || '%d'; + label = $.jqplot.sprintf(fstr, this.data[i][1]); + } + else if (this.dataLabels == 'percent') { + fstr = this.dataLabelFormatString || '%d%%'; + label = $.jqplot.sprintf(fstr, gd[i][2]*100); + } + else if (this.dataLabels.constructor == Array) { + fstr = this.dataLabelFormatString || '%s'; + label = $.jqplot.sprintf(fstr, this.dataLabels[i]); + } + + var fact = this._innerRadius + this._thickness * this.dataLabelPositionFactor + this.sliceMargin + this.dataLabelNudge; + + var x = this._center[0] + Math.cos(avgang) * fact + this.canvas._offsets.left; + var y = this._center[1] + Math.sin(avgang) * fact + this.canvas._offsets.top; + + var labelelem = $('<span class="jqplot-donut-series jqplot-data-label" style="position:absolute;">' + label + '</span>').insertBefore(plot.eventCanvas._elem); + x -= labelelem.width()/2; + y -= labelelem.height()/2; + x = Math.round(x); + y = Math.round(y); + labelelem.css({left: x, top: y}); + } + } + + }; + + $.jqplot.DonutAxisRenderer = function() { + $.jqplot.LinearAxisRenderer.call(this); + }; + + $.jqplot.DonutAxisRenderer.prototype = new $.jqplot.LinearAxisRenderer(); + $.jqplot.DonutAxisRenderer.prototype.constructor = $.jqplot.DonutAxisRenderer; + + + // There are no traditional axes on a donut chart. We just need to provide + // dummy objects with properties so the plot will render. + // called with scope of axis object. + $.jqplot.DonutAxisRenderer.prototype.init = function(options){ + // + this.tickRenderer = $.jqplot.DonutTickRenderer; + $.extend(true, this, options); + // I don't think I'm going to need _dataBounds here. + // have to go Axis scaling in a way to fit chart onto plot area + // and provide u2p and p2u functionality for mouse cursor, etc. + // for convienence set _dataBounds to 0 and 100 and + // set min/max to 0 and 100. + this._dataBounds = {min:0, max:100}; + this.min = 0; + this.max = 100; + this.showTicks = false; + this.ticks = []; + this.showMark = false; + this.show = false; + }; + + + + + $.jqplot.DonutLegendRenderer = function(){ + $.jqplot.TableLegendRenderer.call(this); + }; + + $.jqplot.DonutLegendRenderer.prototype = new $.jqplot.TableLegendRenderer(); + $.jqplot.DonutLegendRenderer.prototype.constructor = $.jqplot.DonutLegendRenderer; + + /** + * Class: $.jqplot.DonutLegendRenderer + * Legend Renderer specific to donut plots. Set by default + * when user creates a donut plot. + */ + $.jqplot.DonutLegendRenderer.prototype.init = function(options) { + // Group: Properties + // + // prop: numberRows + // Maximum number of rows in the legend. 0 or null for unlimited. + this.numberRows = null; + // prop: numberColumns + // Maximum number of columns in the legend. 0 or null for unlimited. + this.numberColumns = null; + $.extend(true, this, options); + }; + + // called with context of legend + $.jqplot.DonutLegendRenderer.prototype.draw = function() { + var legend = this; + if (this.show) { + var series = this._series; + var ss = 'position:absolute;'; + ss += (this.background) ? 'background:'+this.background+';' : ''; + ss += (this.border) ? 'border:'+this.border+';' : ''; + ss += (this.fontSize) ? 'font-size:'+this.fontSize+';' : ''; + ss += (this.fontFamily) ? 'font-family:'+this.fontFamily+';' : ''; + ss += (this.textColor) ? 'color:'+this.textColor+';' : ''; + ss += (this.marginTop != null) ? 'margin-top:'+this.marginTop+';' : ''; + ss += (this.marginBottom != null) ? 'margin-bottom:'+this.marginBottom+';' : ''; + ss += (this.marginLeft != null) ? 'margin-left:'+this.marginLeft+';' : ''; + ss += (this.marginRight != null) ? 'margin-right:'+this.marginRight+';' : ''; + this._elem = $('<table class="jqplot-table-legend" style="'+ss+'"></table>'); + // Donut charts legends don't go by number of series, but by number of data points + // in the series. Refactor things here for that. + + var pad = false, + reverse = false, + nr, nc; + var s = series[0]; + var colorGenerator = new $.jqplot.ColorGenerator(s.seriesColors); + + if (s.show) { + var pd = s.data; + if (this.numberRows) { + nr = this.numberRows; + if (!this.numberColumns){ + nc = Math.ceil(pd.length/nr); + } + else{ + nc = this.numberColumns; + } + } + else if (this.numberColumns) { + nc = this.numberColumns; + nr = Math.ceil(pd.length/this.numberColumns); + } + else { + nr = pd.length; + nc = 1; + } + + var i, j, tr, td1, td2, lt, rs, color; + var idx = 0; + + for (i=0; i<nr; i++) { + if (reverse){ + tr = $('<tr class="jqplot-table-legend"></tr>').prependTo(this._elem); + } + else{ + tr = $('<tr class="jqplot-table-legend"></tr>').appendTo(this._elem); + } + for (j=0; j<nc; j++) { + if (idx < pd.length){ + lt = this.labels[idx] || pd[idx][0].toString(); + color = colorGenerator.next(); + if (!reverse){ + if (i>0){ + pad = true; + } + else{ + pad = false; + } + } + else{ + if (i == nr -1){ + pad = false; + } + else{ + pad = true; + } + } + rs = (pad) ? this.rowSpacing : '0'; + + td1 = $('<td class="jqplot-table-legend" style="text-align:center;padding-top:'+rs+';">'+ + '<div><div class="jqplot-table-legend-swatch" style="border-color:'+color+';"></div>'+ + '</div></td>'); + td2 = $('<td class="jqplot-table-legend" style="padding-top:'+rs+';"></td>'); + if (this.escapeHtml){ + td2.text(lt); + } + else { + td2.html(lt); + } + if (reverse) { + td2.prependTo(tr); + td1.prependTo(tr); + } + else { + td1.appendTo(tr); + td2.appendTo(tr); + } + pad = true; + } + idx++; + } + } + } + } + return this._elem; + }; + + // setup default renderers for axes and legend so user doesn't have to + // called with scope of plot + function preInit(target, data, options) { + options = options || {}; + options.axesDefaults = options.axesDefaults || {}; + options.legend = options.legend || {}; + options.seriesDefaults = options.seriesDefaults || {}; + // only set these if there is a donut series + var setopts = false; + if (options.seriesDefaults.renderer == $.jqplot.DonutRenderer) { + setopts = true; + } + else if (options.series) { + for (var i=0; i < options.series.length; i++) { + if (options.series[i].renderer == $.jqplot.DonutRenderer) { + setopts = true; + } + } + } + + if (setopts) { + options.axesDefaults.renderer = $.jqplot.DonutAxisRenderer; + options.legend.renderer = $.jqplot.DonutLegendRenderer; + options.legend.preDraw = true; + options.seriesDefaults.pointLabels = {show: false}; + } + } + + // called with scope of plot. + function postInit(target, data, options) { + // if multiple series, add a reference to the previous one so that + // donut rings can nest. + for (var i=1; i<this.series.length; i++) { + if (!this.series[i]._previousSeries.length){ + for (var j=0; j<i; j++) { + if (this.series[i].renderer.constructor == $.jqplot.DonutRenderer && this.series[j].renderer.constructor == $.jqplot.DonutRenderer) { + this.series[i]._previousSeries.push(this.series[j]); + } + } + } + } + for (i=0; i<this.series.length; i++) { + if (this.series[i].renderer.constructor == $.jqplot.DonutRenderer) { + this.series[i]._numberSeries = this.series.length; + // don't allow mouseover and mousedown at same time. + if (this.series[i].highlightMouseOver) { + this.series[i].highlightMouseDown = false; + } + } + } + } + + var postParseOptionsRun = false; + // called with scope of plot + function postParseOptions(options) { + for (var i=0; i<this.series.length; i++) { + this.series[i].seriesColors = this.seriesColors; + this.series[i].colorGenerator = $.jqplot.colorGenerator; + } + } + + function highlight (plot, sidx, pidx) { + var s = plot.series[sidx]; + var canvas = plot.plugins.donutRenderer.highlightCanvas; + canvas._ctx.clearRect(0,0,canvas._ctx.canvas.width, canvas._ctx.canvas.height); + s._highlightedPoint = pidx; + plot.plugins.donutRenderer.highlightedSeriesIndex = sidx; + s.renderer.drawSlice.call(s, canvas._ctx, s._sliceAngles[pidx][0], s._sliceAngles[pidx][1], s.highlightColors[pidx], false); + } + + function unhighlight (plot) { + var canvas = plot.plugins.donutRenderer.highlightCanvas; + canvas._ctx.clearRect(0,0, canvas._ctx.canvas.width, canvas._ctx.canvas.height); + for (var i=0; i<plot.series.length; i++) { + plot.series[i]._highlightedPoint = null; + } + plot.plugins.donutRenderer.highlightedSeriesIndex = null; + plot.target.trigger('jqplotDataUnhighlight'); + } + + function handleMove(ev, gridpos, datapos, neighbor, plot) { + if (neighbor) { + var ins = [neighbor.seriesIndex, neighbor.pointIndex, neighbor.data]; + var evt1 = jQuery.Event('jqplotDataMouseOver'); + evt1.pageX = ev.pageX; + evt1.pageY = ev.pageY; + plot.target.trigger(evt1, ins); + if (plot.series[ins[0]].highlightMouseOver && !(ins[0] == plot.plugins.donutRenderer.highlightedSeriesIndex && ins[1] == plot.series[ins[0]]._highlightedPoint)) { + var evt = jQuery.Event('jqplotDataHighlight'); + evt.pageX = ev.pageX; + evt.pageY = ev.pageY; + plot.target.trigger(evt, ins); + highlight (plot, ins[0], ins[1]); + } + } + else if (neighbor == null) { + unhighlight (plot); + } + } + + function handleMouseDown(ev, gridpos, datapos, neighbor, plot) { + if (neighbor) { + var ins = [neighbor.seriesIndex, neighbor.pointIndex, neighbor.data]; + if (plot.series[ins[0]].highlightMouseDown && !(ins[0] == plot.plugins.donutRenderer.highlightedSeriesIndex && ins[1] == plot.series[ins[0]]._highlightedPoint)) { + var evt = jQuery.Event('jqplotDataHighlight'); + evt.pageX = ev.pageX; + evt.pageY = ev.pageY; + plot.target.trigger(evt, ins); + highlight (plot, ins[0], ins[1]); + } + } + else if (neighbor == null) { + unhighlight (plot); + } + } + + function handleMouseUp(ev, gridpos, datapos, neighbor, plot) { + var idx = plot.plugins.donutRenderer.highlightedSeriesIndex; + if (idx != null && plot.series[idx].highlightMouseDown) { + unhighlight(plot); + } + } + + function handleClick(ev, gridpos, datapos, neighbor, plot) { + if (neighbor) { + var ins = [neighbor.seriesIndex, neighbor.pointIndex, neighbor.data]; + var evt = jQuery.Event('jqplotDataClick'); + evt.pageX = ev.pageX; + evt.pageY = ev.pageY; + plot.target.trigger(evt, ins); + } + } + + function handleRightClick(ev, gridpos, datapos, neighbor, plot) { + if (neighbor) { + var ins = [neighbor.seriesIndex, neighbor.pointIndex, neighbor.data]; + var idx = plot.plugins.donutRenderer.highlightedSeriesIndex; + if (idx != null && plot.series[idx].highlightMouseDown) { + unhighlight(plot); + } + var evt = jQuery.Event('jqplotDataRightClick'); + evt.pageX = ev.pageX; + evt.pageY = ev.pageY; + plot.target.trigger(evt, ins); + } + } + + // called within context of plot + // create a canvas which we can draw on. + // insert it before the eventCanvas, so eventCanvas will still capture events. + function postPlotDraw() { + // Memory Leaks patch + if (this.plugins.donutRenderer && this.plugins.donutRenderer.highlightCanvas) { + this.plugins.donutRenderer.highlightCanvas.resetCanvas(); + this.plugins.donutRenderer.highlightCanvas = null; + } + + this.plugins.donutRenderer = {highlightedSeriesIndex:null}; + this.plugins.donutRenderer.highlightCanvas = new $.jqplot.GenericCanvas(); + // do we have any data labels? if so, put highlight canvas before those + // Fix for broken jquery :first selector with canvas (VML) elements. + var labels = $(this.targetId+' .jqplot-data-label'); + if (labels.length) { + $(labels[0]).before(this.plugins.donutRenderer.highlightCanvas.createElement(this._gridPadding, 'jqplot-donutRenderer-highlight-canvas', this._plotDimensions, this)); + } + // else put highlight canvas before event canvas. + else { + this.eventCanvas._elem.before(this.plugins.donutRenderer.highlightCanvas.createElement(this._gridPadding, 'jqplot-donutRenderer-highlight-canvas', this._plotDimensions, this)); + } + var hctx = this.plugins.donutRenderer.highlightCanvas.setContext(); + this.eventCanvas._elem.bind('mouseleave', {plot:this}, function (ev) { unhighlight(ev.data.plot); }); + } + + $.jqplot.preInitHooks.push(preInit); + + $.jqplot.DonutTickRenderer = function() { + $.jqplot.AxisTickRenderer.call(this); + }; + + $.jqplot.DonutTickRenderer.prototype = new $.jqplot.AxisTickRenderer(); + $.jqplot.DonutTickRenderer.prototype.constructor = $.jqplot.DonutTickRenderer; + +})(jQuery); + + \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/plugins/jqplot.donutRenderer.min.js b/libreplan-webapp/src/main/webapp/jqplot/plugins/jqplot.donutRenderer.min.js new file mode 100644 index 000000000..4ea82b30c --- /dev/null +++ b/libreplan-webapp/src/main/webapp/jqplot/plugins/jqplot.donutRenderer.min.js @@ -0,0 +1,57 @@ +/** + * jqPlot + * Pure JavaScript plotting plugin using jQuery + * + * Version: 1.0.0b2_r1012 + * + * Copyright (c) 2009-2011 Chris Leonello + * jqPlot is currently available for use in all personal or commercial projects + * under both the MIT (http://www.opensource.org/licenses/mit-license.php) and GPL + * version 2.0 (http://www.gnu.org/licenses/gpl-2.0.html) licenses. This means that you can + * choose the license that best suits your project and use it accordingly. + * + * Although not required, the author would appreciate an email letting him + * know of any substantial use of jqPlot. You can reach the author at: + * chris at jqplot dot com or see http://www.jqplot.com/info.php . + * + * If you are feeling kind and generous, consider supporting the project by + * making a donation at: http://www.jqplot.com/donate.php . + * + * sprintf functions contained in jqplot.sprintf.js by Ash Searle: + * + * version 2007.04.27 + * author Ash Searle + * http://hexmen.com/blog/2007/03/printf-sprintf/ + * http://hexmen.com/js/sprintf.js + * The author (Ash Searle) has placed this code in the public domain: + * "This code is unrestricted: you are free to use it however you like." + * + * included jsDate library by Chris Leonello: + * + * Copyright (c) 2010-2011 Chris Leonello + * + * jsDate is currently available for use in all personal or commercial projects + * under both the MIT and GPL version 2.0 licenses. This means that you can + * choose the license that best suits your project and use it accordingly. + * + * jsDate borrows many concepts and ideas from the Date Instance + * Methods by Ken Snyder along with some parts of Ken's actual code. + * + * Ken's origianl Date Instance Methods and copyright notice: + * + * Ken Snyder (ken d snyder at gmail dot com) + * 2008-09-10 + * version 2.0.2 (http://kendsnyder.com/sandbox/date/) + * Creative Commons Attribution License 3.0 (http://creativecommons.org/licenses/by/3.0/) + * + * jqplotToImage function based on Larry Siden's export-jqplot-to-png.js. + * Larry has generously given permission to adapt his code for inclusion + * into jqPlot. + * + * Larry's original code can be found here: + * + * https://github.com/lsiden/export-jqplot-to-png + * + * + */ +(function(e){e.jqplot.DonutRenderer=function(){e.jqplot.LineRenderer.call(this)};e.jqplot.DonutRenderer.prototype=new e.jqplot.LineRenderer();e.jqplot.DonutRenderer.prototype.constructor=e.jqplot.DonutRenderer;e.jqplot.DonutRenderer.prototype.init=function(p,t){this.diameter=null;this.innerDiameter=null;this.thickness=null;this.padding=20;this.sliceMargin=0;this.ringMargin=null;this.fill=true;this.shadowOffset=2;this.shadowAlpha=0.07;this.shadowDepth=5;this.highlightMouseOver=true;this.highlightMouseDown=false;this.highlightColors=[];this.dataLabels="percent";this.showDataLabels=false;this.dataLabelFormatString=null;this.dataLabelThreshold=3;this.dataLabelPositionFactor=0.4;this.dataLabelNudge=0;this.startAngle=0;this.tickRenderer=e.jqplot.DonutTickRenderer;this._drawData=true;this._type="donut";if(p.highlightMouseDown&&p.highlightMouseOver==null){p.highlightMouseOver=false}e.extend(true,this,p);if(this.diameter!=null){this.diameter=this.diameter-this.sliceMargin}this._diameter=null;this._innerDiameter=null;this._radius=null;this._innerRadius=null;this._thickness=null;this._previousSeries=[];this._numberSeries=1;this._sliceAngles=[];this._highlightedPoint=null;if(this.highlightColors.length==0){for(var r=0;r<this.seriesColors.length;r++){var q=e.jqplot.getColorComponents(this.seriesColors[r]);var n=[q[0],q[1],q[2]];var s=n[0]+n[1]+n[2];for(var o=0;o<3;o++){n[o]=(s>570)?n[o]*0.8:n[o]+0.3*(255-n[o]);n[o]=parseInt(n[o],10)}this.highlightColors.push("rgb("+n[0]+","+n[1]+","+n[2]+")")}}t.postParseOptionsHooks.addOnce(l);t.postInitHooks.addOnce(g);t.eventListenerHooks.addOnce("jqplotMouseMove",b);t.eventListenerHooks.addOnce("jqplotMouseDown",a);t.eventListenerHooks.addOnce("jqplotMouseUp",j);t.eventListenerHooks.addOnce("jqplotClick",f);t.eventListenerHooks.addOnce("jqplotRightClick",m);t.postDrawHooks.addOnce(h)};e.jqplot.DonutRenderer.prototype.setGridData=function(s){var o=[];var t=[];var n=this.startAngle/180*Math.PI;var r=0;this._drawData=false;for(var q=0;q<this.data.length;q++){if(this.data[q][1]!=0){this._drawData=true}o.push(this.data[q][1]);t.push([this.data[q][0]]);if(q>0){o[q]+=o[q-1]}r+=this.data[q][1]}var p=Math.PI*2/o[o.length-1];for(var q=0;q<o.length;q++){t[q][1]=o[q]*p;t[q][2]=this.data[q][1]/r}this.gridData=t};e.jqplot.DonutRenderer.prototype.makeGridData=function(s,t){var o=[];var u=[];var r=0;var n=this.startAngle/180*Math.PI;this._drawData=false;for(var q=0;q<s.length;q++){if(this.data[q][1]!=0){this._drawData=true}o.push(s[q][1]);u.push([s[q][0]]);if(q>0){o[q]+=o[q-1]}r+=s[q][1]}var p=Math.PI*2/o[o.length-1];for(var q=0;q<o.length;q++){u[q][1]=o[q]*p;u[q][2]=s[q][1]/r}return u};e.jqplot.DonutRenderer.prototype.drawSlice=function(x,u,t,p,s){var n=this._diameter/2;var v=n-this._thickness;var w=this.fill;x.save();x.translate(this._center[0],this._center[1]);if(s){for(var q=0;q<this.shadowDepth;q++){x.save();x.translate(this.shadowOffset*Math.cos(this.shadowAngle/180*Math.PI),this.shadowOffset*Math.sin(this.shadowAngle/180*Math.PI));o()}}else{o()}function o(){if(t>6.282+this.startAngle){t=6.282+this.startAngle;if(u>t){u=6.281+this.startAngle}}if(u>=t){return}x.beginPath();x.fillStyle=p;x.strokeStyle=p;x.arc(0,0,n,u,t,false);x.lineTo(v*Math.cos(t),v*Math.sin(t));x.arc(0,0,v,t,u,true);x.closePath();if(w){x.fill()}else{x.stroke()}}if(s){for(var q=0;q<this.shadowDepth;q++){x.restore()}}x.restore()};e.jqplot.DonutRenderer.prototype.draw=function(N,V,t,P){var Q;var J=(t!=undefined)?t:{};var q=0;var p=0;var u=1;if(t.legendInfo&&t.legendInfo.placement=="insideGrid"){var I=t.legendInfo;switch(I.location){case"nw":q=I.width+I.xoffset;break;case"w":q=I.width+I.xoffset;break;case"sw":q=I.width+I.xoffset;break;case"ne":q=I.width+I.xoffset;u=-1;break;case"e":q=I.width+I.xoffset;u=-1;break;case"se":q=I.width+I.xoffset;u=-1;break;case"n":p=I.height+I.yoffset;break;case"s":p=I.height+I.yoffset;u=-1;break;default:break}}var B=(J.shadow!=undefined)?J.shadow:this.shadow;var W=(J.showLine!=undefined)?J.showLine:this.showLine;var O=(J.fill!=undefined)?J.fill:this.fill;var s=N.canvas.width;var H=N.canvas.height;var G=s-q-2*this.padding;var R=H-p-2*this.padding;var v=Math.min(G,R);var T=v;var X=(this.ringMargin==null)?this.sliceMargin*2:this.ringMargin;for(var Q=0;Q<this._previousSeries.length;Q++){T-=2*this._previousSeries[Q]._thickness+2*X}this._diameter=this.diameter||T;if(this.innerDiameter!=null){var M=(this._numberSeries>1&&this.index>0)?this._previousSeries[0]._diameter:this._diameter;this._thickness=this.thickness||(M-this.innerDiameter-2*X*this._numberSeries)/this._numberSeries/2}else{this._thickness=this.thickness||v/2/(this._numberSeries+1)*0.85}var K=this._radius=this._diameter/2;this._innerRadius=this._radius-this._thickness;var o=this.startAngle/180*Math.PI;this._center=[(s-u*q)/2+u*q,(H-u*p)/2+u*p];if(this.shadow){var L="rgba(0,0,0,"+this.shadowAlpha+")";for(var Q=0;Q<V.length;Q++){var A=(Q==0)?o:V[Q-1][1]+o;A+=this.sliceMargin/180*Math.PI;this.renderer.drawSlice.call(this,N,A,V[Q][1]+o,L,true)}}for(var Q=0;Q<V.length;Q++){var A=(Q==0)?o:V[Q-1][1]+o;A+=this.sliceMargin/180*Math.PI;var z=V[Q][1]+o;this._sliceAngles.push([A,z]);this.renderer.drawSlice.call(this,N,A,z,this.seriesColors[Q],false);if(this.showDataLabels&&V[Q][2]*100>=this.dataLabelThreshold){var S,U=(A+z)/2,C;if(this.dataLabels=="label"){S=this.dataLabelFormatString||"%s";C=e.jqplot.sprintf(S,V[Q][0])}else{if(this.dataLabels=="value"){S=this.dataLabelFormatString||"%d";C=e.jqplot.sprintf(S,this.data[Q][1])}else{if(this.dataLabels=="percent"){S=this.dataLabelFormatString||"%d%%";C=e.jqplot.sprintf(S,V[Q][2]*100)}else{if(this.dataLabels.constructor==Array){S=this.dataLabelFormatString||"%s";C=e.jqplot.sprintf(S,this.dataLabels[Q])}}}}var n=this._innerRadius+this._thickness*this.dataLabelPositionFactor+this.sliceMargin+this.dataLabelNudge;var F=this._center[0]+Math.cos(U)*n+this.canvas._offsets.left;var E=this._center[1]+Math.sin(U)*n+this.canvas._offsets.top;var D=e('<span class="jqplot-donut-series jqplot-data-label" style="position:absolute;">'+C+"</span>").insertBefore(P.eventCanvas._elem);F-=D.width()/2;E-=D.height()/2;F=Math.round(F);E=Math.round(E);D.css({left:F,top:E})}}};e.jqplot.DonutAxisRenderer=function(){e.jqplot.LinearAxisRenderer.call(this)};e.jqplot.DonutAxisRenderer.prototype=new e.jqplot.LinearAxisRenderer();e.jqplot.DonutAxisRenderer.prototype.constructor=e.jqplot.DonutAxisRenderer;e.jqplot.DonutAxisRenderer.prototype.init=function(n){this.tickRenderer=e.jqplot.DonutTickRenderer;e.extend(true,this,n);this._dataBounds={min:0,max:100};this.min=0;this.max=100;this.showTicks=false;this.ticks=[];this.showMark=false;this.show=false};e.jqplot.DonutLegendRenderer=function(){e.jqplot.TableLegendRenderer.call(this)};e.jqplot.DonutLegendRenderer.prototype=new e.jqplot.TableLegendRenderer();e.jqplot.DonutLegendRenderer.prototype.constructor=e.jqplot.DonutLegendRenderer;e.jqplot.DonutLegendRenderer.prototype.init=function(n){this.numberRows=null;this.numberColumns=null;e.extend(true,this,n)};e.jqplot.DonutLegendRenderer.prototype.draw=function(){var q=this;if(this.show){var y=this._series;var B="position:absolute;";B+=(this.background)?"background:"+this.background+";":"";B+=(this.border)?"border:"+this.border+";":"";B+=(this.fontSize)?"font-size:"+this.fontSize+";":"";B+=(this.fontFamily)?"font-family:"+this.fontFamily+";":"";B+=(this.textColor)?"color:"+this.textColor+";":"";B+=(this.marginTop!=null)?"margin-top:"+this.marginTop+";":"";B+=(this.marginBottom!=null)?"margin-bottom:"+this.marginBottom+";":"";B+=(this.marginLeft!=null)?"margin-left:"+this.marginLeft+";":"";B+=(this.marginRight!=null)?"margin-right:"+this.marginRight+";":"";this._elem=e('<table class="jqplot-table-legend" style="'+B+'"></table>');var F=false,x=false,n,v;var z=y[0];var o=new e.jqplot.ColorGenerator(z.seriesColors);if(z.show){var G=z.data;if(this.numberRows){n=this.numberRows;if(!this.numberColumns){v=Math.ceil(G.length/n)}else{v=this.numberColumns}}else{if(this.numberColumns){v=this.numberColumns;n=Math.ceil(G.length/this.numberColumns)}else{n=G.length;v=1}}var E,D,p,t,r,u,w,C;var A=0;for(E=0;E<n;E++){if(x){p=e('<tr class="jqplot-table-legend"></tr>').prependTo(this._elem)}else{p=e('<tr class="jqplot-table-legend"></tr>').appendTo(this._elem)}for(D=0;D<v;D++){if(A<G.length){u=this.labels[A]||G[A][0].toString();C=o.next();if(!x){if(E>0){F=true}else{F=false}}else{if(E==n-1){F=false}else{F=true}}w=(F)?this.rowSpacing:"0";t=e('<td class="jqplot-table-legend" style="text-align:center;padding-top:'+w+';"><div><div class="jqplot-table-legend-swatch" style="border-color:'+C+';"></div></div></td>');r=e('<td class="jqplot-table-legend" style="padding-top:'+w+';"></td>');if(this.escapeHtml){r.text(u)}else{r.html(u)}if(x){r.prependTo(p);t.prependTo(p)}else{t.appendTo(p);r.appendTo(p)}F=true}A++}}}}return this._elem};function c(r,q,o){o=o||{};o.axesDefaults=o.axesDefaults||{};o.legend=o.legend||{};o.seriesDefaults=o.seriesDefaults||{};var n=false;if(o.seriesDefaults.renderer==e.jqplot.DonutRenderer){n=true}else{if(o.series){for(var p=0;p<o.series.length;p++){if(o.series[p].renderer==e.jqplot.DonutRenderer){n=true}}}}if(n){o.axesDefaults.renderer=e.jqplot.DonutAxisRenderer;o.legend.renderer=e.jqplot.DonutLegendRenderer;o.legend.preDraw=true;o.seriesDefaults.pointLabels={show:false}}}function g(r,q,o){for(var p=1;p<this.series.length;p++){if(!this.series[p]._previousSeries.length){for(var n=0;n<p;n++){if(this.series[p].renderer.constructor==e.jqplot.DonutRenderer&&this.series[n].renderer.constructor==e.jqplot.DonutRenderer){this.series[p]._previousSeries.push(this.series[n])}}}}for(p=0;p<this.series.length;p++){if(this.series[p].renderer.constructor==e.jqplot.DonutRenderer){this.series[p]._numberSeries=this.series.length;if(this.series[p].highlightMouseOver){this.series[p].highlightMouseDown=false}}}}var k=false;function l(n){for(var o=0;o<this.series.length;o++){this.series[o].seriesColors=this.seriesColors;this.series[o].colorGenerator=e.jqplot.colorGenerator}}function d(r,q,p){var o=r.series[q];var n=r.plugins.donutRenderer.highlightCanvas;n._ctx.clearRect(0,0,n._ctx.canvas.width,n._ctx.canvas.height);o._highlightedPoint=p;r.plugins.donutRenderer.highlightedSeriesIndex=q;o.renderer.drawSlice.call(o,n._ctx,o._sliceAngles[p][0],o._sliceAngles[p][1],o.highlightColors[p],false)}function i(p){var n=p.plugins.donutRenderer.highlightCanvas;n._ctx.clearRect(0,0,n._ctx.canvas.width,n._ctx.canvas.height);for(var o=0;o<p.series.length;o++){p.series[o]._highlightedPoint=null}p.plugins.donutRenderer.highlightedSeriesIndex=null;p.target.trigger("jqplotDataUnhighlight")}function b(r,q,u,t,s){if(t){var p=[t.seriesIndex,t.pointIndex,t.data];var o=jQuery.Event("jqplotDataMouseOver");o.pageX=r.pageX;o.pageY=r.pageY;s.target.trigger(o,p);if(s.series[p[0]].highlightMouseOver&&!(p[0]==s.plugins.donutRenderer.highlightedSeriesIndex&&p[1]==s.series[p[0]]._highlightedPoint)){var n=jQuery.Event("jqplotDataHighlight");n.pageX=r.pageX;n.pageY=r.pageY;s.target.trigger(n,p);d(s,p[0],p[1])}}else{if(t==null){i(s)}}}function a(q,p,t,s,r){if(s){var o=[s.seriesIndex,s.pointIndex,s.data];if(r.series[o[0]].highlightMouseDown&&!(o[0]==r.plugins.donutRenderer.highlightedSeriesIndex&&o[1]==r.series[o[0]]._highlightedPoint)){var n=jQuery.Event("jqplotDataHighlight");n.pageX=q.pageX;n.pageY=q.pageY;r.target.trigger(n,o);d(r,o[0],o[1])}}else{if(s==null){i(r)}}}function j(p,o,s,r,q){var n=q.plugins.donutRenderer.highlightedSeriesIndex;if(n!=null&&q.series[n].highlightMouseDown){i(q)}}function f(q,p,t,s,r){if(s){var o=[s.seriesIndex,s.pointIndex,s.data];var n=jQuery.Event("jqplotDataClick");n.pageX=q.pageX;n.pageY=q.pageY;r.target.trigger(n,o)}}function m(r,q,u,t,s){if(t){var p=[t.seriesIndex,t.pointIndex,t.data];var n=s.plugins.donutRenderer.highlightedSeriesIndex;if(n!=null&&s.series[n].highlightMouseDown){i(s)}var o=jQuery.Event("jqplotDataRightClick");o.pageX=r.pageX;o.pageY=r.pageY;s.target.trigger(o,p)}}function h(){if(this.plugins.donutRenderer&&this.plugins.donutRenderer.highlightCanvas){this.plugins.donutRenderer.highlightCanvas.resetCanvas();this.plugins.donutRenderer.highlightCanvas=null}this.plugins.donutRenderer={highlightedSeriesIndex:null};this.plugins.donutRenderer.highlightCanvas=new e.jqplot.GenericCanvas();var o=e(this.targetId+" .jqplot-data-label");if(o.length){e(o[0]).before(this.plugins.donutRenderer.highlightCanvas.createElement(this._gridPadding,"jqplot-donutRenderer-highlight-canvas",this._plotDimensions,this))}else{this.eventCanvas._elem.before(this.plugins.donutRenderer.highlightCanvas.createElement(this._gridPadding,"jqplot-donutRenderer-highlight-canvas",this._plotDimensions,this))}var n=this.plugins.donutRenderer.highlightCanvas.setContext();this.eventCanvas._elem.bind("mouseleave",{plot:this},function(p){i(p.data.plot)})}e.jqplot.preInitHooks.push(c);e.jqplot.DonutTickRenderer=function(){e.jqplot.AxisTickRenderer.call(this)};e.jqplot.DonutTickRenderer.prototype=new e.jqplot.AxisTickRenderer();e.jqplot.DonutTickRenderer.prototype.constructor=e.jqplot.DonutTickRenderer})(jQuery); \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/plugins/jqplot.dragable.js b/libreplan-webapp/src/main/webapp/jqplot/plugins/jqplot.dragable.js new file mode 100644 index 000000000..5ae7d429c --- /dev/null +++ b/libreplan-webapp/src/main/webapp/jqplot/plugins/jqplot.dragable.js @@ -0,0 +1,224 @@ +/** + * jqPlot + * Pure JavaScript plotting plugin using jQuery + * + * Version: 1.0.0b2_r1012 + * + * Copyright (c) 2009-2011 Chris Leonello + * jqPlot is currently available for use in all personal or commercial projects + * under both the MIT (http://www.opensource.org/licenses/mit-license.php) and GPL + * version 2.0 (http://www.gnu.org/licenses/gpl-2.0.html) licenses. This means that you can + * choose the license that best suits your project and use it accordingly. + * + * Although not required, the author would appreciate an email letting him + * know of any substantial use of jqPlot. You can reach the author at: + * chris at jqplot dot com or see http://www.jqplot.com/info.php . + * + * If you are feeling kind and generous, consider supporting the project by + * making a donation at: http://www.jqplot.com/donate.php . + * + * sprintf functions contained in jqplot.sprintf.js by Ash Searle: + * + * version 2007.04.27 + * author Ash Searle + * http://hexmen.com/blog/2007/03/printf-sprintf/ + * http://hexmen.com/js/sprintf.js + * The author (Ash Searle) has placed this code in the public domain: + * "This code is unrestricted: you are free to use it however you like." + * + */ +(function($) { + + /** + * Class: $.jqplot.Dragable + * Plugin to make plotted points dragable by the user. + */ + $.jqplot.Dragable = function(options) { + // Group: Properties + this.markerRenderer = new $.jqplot.MarkerRenderer({shadow:false}); + this.shapeRenderer = new $.jqplot.ShapeRenderer(); + this.isDragging = false; + this.isOver = false; + this._ctx; + this._elem; + this._point; + this._gridData; + // prop: color + // CSS color spec for the dragged point (and adjacent line segment or bar). + this.color; + // prop: constrainTo + // Constrain dragging motion to an axis or to none. + // Allowable values are 'none', 'x', 'y' + this.constrainTo = 'none'; // 'x', 'y', or 'none'; + $.extend(true, this, options); + }; + + function DragCanvas() { + $.jqplot.GenericCanvas.call(this); + this.isDragging = false; + this.isOver = false; + this._neighbor; + this._cursors = []; + } + + DragCanvas.prototype = new $.jqplot.GenericCanvas(); + DragCanvas.prototype.constructor = DragCanvas; + + + // called within scope of series + $.jqplot.Dragable.parseOptions = function (defaults, opts) { + var options = opts || {}; + this.plugins.dragable = new $.jqplot.Dragable(options.dragable); + // since this function is called before series options are parsed, + // we can set this here and it will be overridden if needed. + this.isDragable = $.jqplot.config.enablePlugins; + }; + + // called within context of plot + // create a canvas which we can draw on. + // insert it before the eventCanvas, so eventCanvas will still capture events. + // add a new DragCanvas object to the plot plugins to handle drawing on this new canvas. + $.jqplot.Dragable.postPlotDraw = function() { + // Memory Leaks patch + if (this.plugins.dragable && this.plugins.dragable.highlightCanvas) { + this.plugins.dragable.highlightCanvas.resetCanvas(); + this.plugins.dragable.highlightCanvas = null; + } + + this.plugins.dragable = {previousCursor:'auto', isOver:false}; + this.plugins.dragable.dragCanvas = new DragCanvas(); + + this.eventCanvas._elem.before(this.plugins.dragable.dragCanvas.createElement(this._gridPadding, 'jqplot-dragable-canvas', this._plotDimensions, this)); + var dctx = this.plugins.dragable.dragCanvas.setContext(); + }; + + //$.jqplot.preInitHooks.push($.jqplot.Dragable.init); + $.jqplot.preParseSeriesOptionsHooks.push($.jqplot.Dragable.parseOptions); + $.jqplot.postDrawHooks.push($.jqplot.Dragable.postPlotDraw); + $.jqplot.eventListenerHooks.push(['jqplotMouseMove', handleMove]); + $.jqplot.eventListenerHooks.push(['jqplotMouseDown', handleDown]); + $.jqplot.eventListenerHooks.push(['jqplotMouseUp', handleUp]); + + + function initDragPoint(plot, neighbor) { + var s = plot.series[neighbor.seriesIndex]; + var drag = s.plugins.dragable; + + // first, init the mark renderer for the dragged point + var smr = s.markerRenderer; + var mr = drag.markerRenderer; + mr.style = smr.style; + mr.lineWidth = smr.lineWidth + 2.5; + mr.size = smr.size + 5; + if (!drag.color) { + var rgba = $.jqplot.getColorComponents(smr.color); + var newrgb = [rgba[0], rgba[1], rgba[2]]; + var alpha = (rgba[3] >= 0.6) ? rgba[3]*0.6 : rgba[3]*(2-rgba[3]); + drag.color = 'rgba('+newrgb[0]+','+newrgb[1]+','+newrgb[2]+','+alpha+')'; + } + mr.color = drag.color; + mr.init(); + + var start = (neighbor.pointIndex > 0) ? neighbor.pointIndex - 1 : 0; + var end = neighbor.pointIndex+2; + drag._gridData = s.gridData.slice(start, end); + } + + function handleMove(ev, gridpos, datapos, neighbor, plot) { + if (plot.plugins.dragable.dragCanvas.isDragging) { + var dc = plot.plugins.dragable.dragCanvas; + var dp = dc._neighbor; + var s = plot.series[dp.seriesIndex]; + var drag = s.plugins.dragable; + var gd = s.gridData; + + // compute the new grid position with any constraints. + var x = (drag.constrainTo == 'y') ? dp.gridData[0] : gridpos.x; + var y = (drag.constrainTo == 'x') ? dp.gridData[1] : gridpos.y; + + // compute data values for any listeners. + var xu = s._xaxis.series_p2u(x); + var yu = s._yaxis.series_p2u(y); + + // clear the canvas then redraw effect at new position. + var ctx = dc._ctx; + ctx.clearRect(0, 0, ctx.canvas.width, ctx.canvas.height); + + // adjust our gridData for the new mouse position + if (dp.pointIndex > 0) { + drag._gridData[1] = [x, y]; + } + else { + drag._gridData[0] = [x, y]; + } + plot.series[dp.seriesIndex].draw(dc._ctx, {gridData:drag._gridData, shadow:false, preventJqPlotSeriesDrawTrigger:true, color:drag.color, markerOptions:{color:drag.color, shadow:false}, trendline:{show:false}}); + plot.target.trigger('jqplotSeriesPointChange', [dp.seriesIndex, dp.pointIndex, [xu,yu], [x,y]]); + } + else if (neighbor != null) { + var series = plot.series[neighbor.seriesIndex]; + if (series.isDragable) { + var dc = plot.plugins.dragable.dragCanvas; + if (!dc.isOver) { + dc._cursors.push(ev.target.style.cursor); + ev.target.style.cursor = "pointer"; + } + dc.isOver = true; + } + } + else if (neighbor == null) { + var dc = plot.plugins.dragable.dragCanvas; + if (dc.isOver) { + ev.target.style.cursor = dc._cursors.pop(); + dc.isOver = false; + } + } + } + + function handleDown(ev, gridpos, datapos, neighbor, plot) { + var dc = plot.plugins.dragable.dragCanvas; + dc._cursors.push(ev.target.style.cursor); + if (neighbor != null) { + var s = plot.series[neighbor.seriesIndex]; + var drag = s.plugins.dragable; + if (s.isDragable && !dc.isDragging) { + dc._neighbor = neighbor; + dc.isDragging = true; + initDragPoint(plot, neighbor); + drag.markerRenderer.draw(s.gridData[neighbor.pointIndex][0], s.gridData[neighbor.pointIndex][1], dc._ctx); + ev.target.style.cursor = "move"; + plot.target.trigger('jqplotDragStart', [neighbor.seriesIndex, neighbor.pointIndex, gridpos, datapos]); + } + } + // Just in case of a hickup, we'll clear the drag canvas and reset. + else { + var ctx = dc._ctx; + ctx.clearRect(0, 0, ctx.canvas.width, ctx.canvas.height); + dc.isDragging = false; + } + } + + function handleUp(ev, gridpos, datapos, neighbor, plot) { + if (plot.plugins.dragable.dragCanvas.isDragging) { + var dc = plot.plugins.dragable.dragCanvas; + // clear the canvas + var ctx = dc._ctx; + ctx.clearRect(0, 0, ctx.canvas.width, ctx.canvas.height); + dc.isDragging = false; + // redraw the series canvas at the new point. + var dp = dc._neighbor; + var s = plot.series[dp.seriesIndex]; + var drag = s.plugins.dragable; + // compute the new grid position with any constraints. + var x = (drag.constrainTo == 'y') ? dp.data[0] : datapos[s.xaxis]; + var y = (drag.constrainTo == 'x') ? dp.data[1] : datapos[s.yaxis]; + // var x = datapos[s.xaxis]; + // var y = datapos[s.yaxis]; + s.data[dp.pointIndex][0] = x; + s.data[dp.pointIndex][1] = y; + plot.drawSeries({preventJqPlotSeriesDrawTrigger:true}, dp.seriesIndex); + dc._neighbor = null; + ev.target.style.cursor = dc._cursors.pop(); + plot.target.trigger('jqplotDragStop', [gridpos, datapos]); + } + } +})(jQuery); \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/plugins/jqplot.dragable.min.js b/libreplan-webapp/src/main/webapp/jqplot/plugins/jqplot.dragable.min.js new file mode 100644 index 000000000..75dba07d6 --- /dev/null +++ b/libreplan-webapp/src/main/webapp/jqplot/plugins/jqplot.dragable.min.js @@ -0,0 +1,57 @@ +/** + * jqPlot + * Pure JavaScript plotting plugin using jQuery + * + * Version: 1.0.0b2_r1012 + * + * Copyright (c) 2009-2011 Chris Leonello + * jqPlot is currently available for use in all personal or commercial projects + * under both the MIT (http://www.opensource.org/licenses/mit-license.php) and GPL + * version 2.0 (http://www.gnu.org/licenses/gpl-2.0.html) licenses. This means that you can + * choose the license that best suits your project and use it accordingly. + * + * Although not required, the author would appreciate an email letting him + * know of any substantial use of jqPlot. You can reach the author at: + * chris at jqplot dot com or see http://www.jqplot.com/info.php . + * + * If you are feeling kind and generous, consider supporting the project by + * making a donation at: http://www.jqplot.com/donate.php . + * + * sprintf functions contained in jqplot.sprintf.js by Ash Searle: + * + * version 2007.04.27 + * author Ash Searle + * http://hexmen.com/blog/2007/03/printf-sprintf/ + * http://hexmen.com/js/sprintf.js + * The author (Ash Searle) has placed this code in the public domain: + * "This code is unrestricted: you are free to use it however you like." + * + * included jsDate library by Chris Leonello: + * + * Copyright (c) 2010-2011 Chris Leonello + * + * jsDate is currently available for use in all personal or commercial projects + * under both the MIT and GPL version 2.0 licenses. This means that you can + * choose the license that best suits your project and use it accordingly. + * + * jsDate borrows many concepts and ideas from the Date Instance + * Methods by Ken Snyder along with some parts of Ken's actual code. + * + * Ken's origianl Date Instance Methods and copyright notice: + * + * Ken Snyder (ken d snyder at gmail dot com) + * 2008-09-10 + * version 2.0.2 (http://kendsnyder.com/sandbox/date/) + * Creative Commons Attribution License 3.0 (http://creativecommons.org/licenses/by/3.0/) + * + * jqplotToImage function based on Larry Siden's export-jqplot-to-png.js. + * Larry has generously given permission to adapt his code for inclusion + * into jqPlot. + * + * Larry's original code can be found here: + * + * https://github.com/lsiden/export-jqplot-to-png + * + * + */ +(function(d){d.jqplot.Dragable=function(g){this.markerRenderer=new d.jqplot.MarkerRenderer({shadow:false});this.shapeRenderer=new d.jqplot.ShapeRenderer();this.isDragging=false;this.isOver=false;this._ctx;this._elem;this._point;this._gridData;this.color;this.constrainTo="none";d.extend(true,this,g)};function b(){d.jqplot.GenericCanvas.call(this);this.isDragging=false;this.isOver=false;this._neighbor;this._cursors=[]}b.prototype=new d.jqplot.GenericCanvas();b.prototype.constructor=b;d.jqplot.Dragable.parseOptions=function(i,h){var g=h||{};this.plugins.dragable=new d.jqplot.Dragable(g.dragable);this.isDragable=d.jqplot.config.enablePlugins};d.jqplot.Dragable.postPlotDraw=function(){if(this.plugins.dragable&&this.plugins.dragable.highlightCanvas){this.plugins.dragable.highlightCanvas.resetCanvas();this.plugins.dragable.highlightCanvas=null}this.plugins.dragable={previousCursor:"auto",isOver:false};this.plugins.dragable.dragCanvas=new b();this.eventCanvas._elem.before(this.plugins.dragable.dragCanvas.createElement(this._gridPadding,"jqplot-dragable-canvas",this._plotDimensions,this));var g=this.plugins.dragable.dragCanvas.setContext()};d.jqplot.preParseSeriesOptionsHooks.push(d.jqplot.Dragable.parseOptions);d.jqplot.postDrawHooks.push(d.jqplot.Dragable.postPlotDraw);d.jqplot.eventListenerHooks.push(["jqplotMouseMove",e]);d.jqplot.eventListenerHooks.push(["jqplotMouseDown",c]);d.jqplot.eventListenerHooks.push(["jqplotMouseUp",a]);function f(n,p){var q=n.series[p.seriesIndex];var m=q.plugins.dragable;var h=q.markerRenderer;var i=m.markerRenderer;i.style=h.style;i.lineWidth=h.lineWidth+2.5;i.size=h.size+5;if(!m.color){var l=d.jqplot.getColorComponents(h.color);var o=[l[0],l[1],l[2]];var k=(l[3]>=0.6)?l[3]*0.6:l[3]*(2-l[3]);m.color="rgba("+o[0]+","+o[1]+","+o[2]+","+k+")"}i.color=m.color;i.init();var g=(p.pointIndex>0)?p.pointIndex-1:0;var j=p.pointIndex+2;m._gridData=q.gridData.slice(g,j)}function e(o,l,h,t,m){if(m.plugins.dragable.dragCanvas.isDragging){var u=m.plugins.dragable.dragCanvas;var i=u._neighbor;var w=m.series[i.seriesIndex];var k=w.plugins.dragable;var r=w.gridData;var p=(k.constrainTo=="y")?i.gridData[0]:l.x;var n=(k.constrainTo=="x")?i.gridData[1]:l.y;var g=w._xaxis.series_p2u(p);var q=w._yaxis.series_p2u(n);var v=u._ctx;v.clearRect(0,0,v.canvas.width,v.canvas.height);if(i.pointIndex>0){k._gridData[1]=[p,n]}else{k._gridData[0]=[p,n]}m.series[i.seriesIndex].draw(u._ctx,{gridData:k._gridData,shadow:false,preventJqPlotSeriesDrawTrigger:true,color:k.color,markerOptions:{color:k.color,shadow:false},trendline:{show:false}});m.target.trigger("jqplotSeriesPointChange",[i.seriesIndex,i.pointIndex,[g,q],[p,n]])}else{if(t!=null){var j=m.series[t.seriesIndex];if(j.isDragable){var u=m.plugins.dragable.dragCanvas;if(!u.isOver){u._cursors.push(o.target.style.cursor);o.target.style.cursor="pointer"}u.isOver=true}}else{if(t==null){var u=m.plugins.dragable.dragCanvas;if(u.isOver){o.target.style.cursor=u._cursors.pop();u.isOver=false}}}}}function c(k,i,g,l,j){var m=j.plugins.dragable.dragCanvas;m._cursors.push(k.target.style.cursor);if(l!=null){var o=j.series[l.seriesIndex];var h=o.plugins.dragable;if(o.isDragable&&!m.isDragging){m._neighbor=l;m.isDragging=true;f(j,l);h.markerRenderer.draw(o.gridData[l.pointIndex][0],o.gridData[l.pointIndex][1],m._ctx);k.target.style.cursor="move";j.target.trigger("jqplotDragStart",[l.seriesIndex,l.pointIndex,i,g])}}else{var n=m._ctx;n.clearRect(0,0,n.canvas.width,n.canvas.height);m.isDragging=false}}function a(m,j,g,o,k){if(k.plugins.dragable.dragCanvas.isDragging){var p=k.plugins.dragable.dragCanvas;var q=p._ctx;q.clearRect(0,0,q.canvas.width,q.canvas.height);p.isDragging=false;var h=p._neighbor;var r=k.series[h.seriesIndex];var i=r.plugins.dragable;var n=(i.constrainTo=="y")?h.data[0]:g[r.xaxis];var l=(i.constrainTo=="x")?h.data[1]:g[r.yaxis];r.data[h.pointIndex][0]=n;r.data[h.pointIndex][1]=l;k.drawSeries({preventJqPlotSeriesDrawTrigger:true},h.seriesIndex);p._neighbor=null;m.target.style.cursor=p._cursors.pop();k.target.trigger("jqplotDragStop",[j,g])}}})(jQuery); \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/plugins/jqplot.enhancedLegendRenderer.js b/libreplan-webapp/src/main/webapp/jqplot/plugins/jqplot.enhancedLegendRenderer.js new file mode 100644 index 000000000..898f4b95a --- /dev/null +++ b/libreplan-webapp/src/main/webapp/jqplot/plugins/jqplot.enhancedLegendRenderer.js @@ -0,0 +1,241 @@ +/** + * jqPlot + * Pure JavaScript plotting plugin using jQuery + * + * Version: 1.0.0b2_r1012 + * + * Copyright (c) 2009-2011 Chris Leonello + * jqPlot is currently available for use in all personal or commercial projects + * under both the MIT (http://www.opensource.org/licenses/mit-license.php) and GPL + * version 2.0 (http://www.gnu.org/licenses/gpl-2.0.html) licenses. This means that you can + * choose the license that best suits your project and use it accordingly. + * + * Although not required, the author would appreciate an email letting him + * know of any substantial use of jqPlot. You can reach the author at: + * chris at jqplot dot com or see http://www.jqplot.com/info.php . + * + * If you are feeling kind and generous, consider supporting the project by + * making a donation at: http://www.jqplot.com/donate.php . + * + * sprintf functions contained in jqplot.sprintf.js by Ash Searle: + * + * version 2007.04.27 + * author Ash Searle + * http://hexmen.com/blog/2007/03/printf-sprintf/ + * http://hexmen.com/js/sprintf.js + * The author (Ash Searle) has placed this code in the public domain: + * "This code is unrestricted: you are free to use it however you like." + * + */ +(function($) { + // class $.jqplot.EnhancedLegendRenderer + // Legend renderer which can specify the number of rows and/or columns in the legend. + $.jqplot.EnhancedLegendRenderer = function(){ + $.jqplot.TableLegendRenderer.call(this); + }; + + $.jqplot.EnhancedLegendRenderer.prototype = new $.jqplot.TableLegendRenderer(); + $.jqplot.EnhancedLegendRenderer.prototype.constructor = $.jqplot.EnhancedLegendRenderer; + + // called with scope of legend. + $.jqplot.EnhancedLegendRenderer.prototype.init = function(options) { + // prop: numberRows + // Maximum number of rows in the legend. 0 or null for unlimited. + this.numberRows = null; + // prop: numberColumns + // Maximum number of columns in the legend. 0 or null for unlimited. + this.numberColumns = null; + // prop: seriesToggle + // false to not enable series on/off toggling on the legend. + // true or a fadein/fadeout speed (number of milliseconds or 'fast', 'normal', 'slow') + // to enable show/hide of series on click of legend item. + this.seriesToggle = 'normal'; + // prop: disableIEFading + // true to toggle series with a show/hide method only and not allow fading in/out. + // This is to overcome poor performance of fade in some versions of IE. + this.disableIEFading = true; + $.extend(true, this, options); + + if (this.seriesToggle) { + $.jqplot.postDrawHooks.push(postDraw); + } + }; + + // called with scope of legend + $.jqplot.EnhancedLegendRenderer.prototype.draw = function() { + var legend = this; + if (this.show) { + var series = this._series; + var s; + var ss = 'position:absolute;'; + ss += (this.background) ? 'background:'+this.background+';' : ''; + ss += (this.border) ? 'border:'+this.border+';' : ''; + ss += (this.fontSize) ? 'font-size:'+this.fontSize+';' : ''; + ss += (this.fontFamily) ? 'font-family:'+this.fontFamily+';' : ''; + ss += (this.textColor) ? 'color:'+this.textColor+';' : ''; + ss += (this.marginTop != null) ? 'margin-top:'+this.marginTop+';' : ''; + ss += (this.marginBottom != null) ? 'margin-bottom:'+this.marginBottom+';' : ''; + ss += (this.marginLeft != null) ? 'margin-left:'+this.marginLeft+';' : ''; + ss += (this.marginRight != null) ? 'margin-right:'+this.marginRight+';' : ''; + this._elem = $('<table class="jqplot-table-legend" style="'+ss+'"></table>'); + if (this.seriesToggle) { + this._elem.css('z-index', '3'); + } + + var pad = false, + reverse = false, + nr, nc; + if (this.numberRows) { + nr = this.numberRows; + if (!this.numberColumns){ + nc = Math.ceil(series.length/nr); + } + else{ + nc = this.numberColumns; + } + } + else if (this.numberColumns) { + nc = this.numberColumns; + nr = Math.ceil(series.length/this.numberColumns); + } + else { + nr = series.length; + nc = 1; + } + + var i, j, tr, td1, td2, lt, rs, div, div0, div1; + var idx = 0; + // check to see if we need to reverse + for (i=series.length-1; i>=0; i--) { + if (nc == 1 && series[i]._stack || series[i].renderer.constructor == $.jqplot.BezierCurveRenderer){ + reverse = true; + } + } + + for (i=0; i<nr; i++) { + tr = $(document.createElement('tr')); + tr.addClass('jqplot-table-legend'); + if (reverse){ + tr.prependTo(this._elem); + } + else{ + tr.appendTo(this._elem); + } + for (j=0; j<nc; j++) { + if (idx < series.length && series[idx].show && series[idx].showLabel){ + s = series[idx]; + lt = this.labels[idx] || s.label.toString(); + if (lt) { + var color = s.color; + if (!reverse){ + if (i>0){ + pad = true; + } + else{ + pad = false; + } + } + else{ + if (i == nr -1){ + pad = false; + } + else{ + pad = true; + } + } + rs = (pad) ? this.rowSpacing : '0'; + + td1 = $(document.createElement('td')); + td1.addClass('jqplot-table-legend jqplot-table-legend-swatch'); + td1.css({textAlign: 'center', paddingTop: rs}); + + div0 = $(document.createElement('div')); + div0.addClass('jqplot-table-legend-swatch-outline'); + div1 = $(document.createElement('div')); + div1.addClass('jqplot-table-legend-swatch'); + div1.css({backgroundColor: color, borderColor: color}); + + td1.append(div0.append(div1)); + + td2 = $(document.createElement('td')); + td2.addClass('jqplot-table-legend jqplot-table-legend-label'); + td2.css('paddingTop', rs); + + // td1 = $('<td class="jqplot-table-legend" style="text-align:center;padding-top:'+rs+';">'+ + // '<div><div class="jqplot-table-legend-swatch" style="background-color:'+color+';border-color:'+color+';"></div>'+ + // '</div></td>'); + // td2 = $('<td class="jqplot-table-legend" style="padding-top:'+rs+';"></td>'); + if (this.escapeHtml){ + td2.text(lt); + } + else { + td2.html(lt); + } + if (reverse) { + if (this.showLabels) {td2.prependTo(tr);} + if (this.showSwatches) {td1.prependTo(tr);} + } + else { + if (this.showSwatches) {td1.appendTo(tr);} + if (this.showLabels) {td2.appendTo(tr);} + } + + if (this.seriesToggle) { + + // add an overlay for clicking series on/off + // div0 = $(document.createElement('div')); + // div0.addClass('jqplot-table-legend-overlay'); + // div0.css({position:'relative', left:0, top:0, height:'100%', width:'100%'}); + // tr.append(div0); + + var speed; + if (typeof(this.seriesToggle) == 'string' || typeof(this.seriesToggle) == 'number') { + if (!$.jqplot.use_excanvas || !this.disableIEFading) { + speed = this.seriesToggle; + } + } + if (this.showSwatches) { + td1.bind('click', {series:s, speed:speed}, handleToggle); + td1.addClass('jqplot-seriesToggle'); + } + if (this.showLabels) { + td2.bind('click', {series:s, speed:speed}, handleToggle); + td2.addClass('jqplot-seriesToggle'); + } + } + + pad = true; + } + } + idx++; + } + + td1 = td2 = div0 = div1 = null; + } + } + return this._elem; + }; + + var handleToggle = function (ev) { + ev.data.series.toggleDisplay(ev); + if (ev.data.series.canvas._elem.hasClass('jqplot-series-hidden')) { + $(this).addClass('jqplot-series-hidden'); + $(this).next('.jqplot-table-legend-label').addClass('jqplot-series-hidden'); + $(this).prev('.jqplot-table-legend-swatch').addClass('jqplot-series-hidden'); + + } + else { + $(this).removeClass('jqplot-series-hidden'); + $(this).next('.jqplot-table-legend-label').removeClass('jqplot-series-hidden'); + $(this).prev('.jqplot-table-legend-swatch').removeClass('jqplot-series-hidden'); + } + }; + + // called with scope of plot. + var postDraw = function () { + if (this.legend.renderer.constructor == $.jqplot.EnhancedLegendRenderer && this.legend.seriesToggle){ + var e = this.legend._elem.detach(); + this.eventCanvas._elem.after(e); + } + }; +})(jQuery); \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/plugins/jqplot.enhancedLegendRenderer.min.js b/libreplan-webapp/src/main/webapp/jqplot/plugins/jqplot.enhancedLegendRenderer.min.js new file mode 100644 index 000000000..1655c67f2 --- /dev/null +++ b/libreplan-webapp/src/main/webapp/jqplot/plugins/jqplot.enhancedLegendRenderer.min.js @@ -0,0 +1,57 @@ +/** + * jqPlot + * Pure JavaScript plotting plugin using jQuery + * + * Version: 1.0.0b2_r1012 + * + * Copyright (c) 2009-2011 Chris Leonello + * jqPlot is currently available for use in all personal or commercial projects + * under both the MIT (http://www.opensource.org/licenses/mit-license.php) and GPL + * version 2.0 (http://www.gnu.org/licenses/gpl-2.0.html) licenses. This means that you can + * choose the license that best suits your project and use it accordingly. + * + * Although not required, the author would appreciate an email letting him + * know of any substantial use of jqPlot. You can reach the author at: + * chris at jqplot dot com or see http://www.jqplot.com/info.php . + * + * If you are feeling kind and generous, consider supporting the project by + * making a donation at: http://www.jqplot.com/donate.php . + * + * sprintf functions contained in jqplot.sprintf.js by Ash Searle: + * + * version 2007.04.27 + * author Ash Searle + * http://hexmen.com/blog/2007/03/printf-sprintf/ + * http://hexmen.com/js/sprintf.js + * The author (Ash Searle) has placed this code in the public domain: + * "This code is unrestricted: you are free to use it however you like." + * + * included jsDate library by Chris Leonello: + * + * Copyright (c) 2010-2011 Chris Leonello + * + * jsDate is currently available for use in all personal or commercial projects + * under both the MIT and GPL version 2.0 licenses. This means that you can + * choose the license that best suits your project and use it accordingly. + * + * jsDate borrows many concepts and ideas from the Date Instance + * Methods by Ken Snyder along with some parts of Ken's actual code. + * + * Ken's origianl Date Instance Methods and copyright notice: + * + * Ken Snyder (ken d snyder at gmail dot com) + * 2008-09-10 + * version 2.0.2 (http://kendsnyder.com/sandbox/date/) + * Creative Commons Attribution License 3.0 (http://creativecommons.org/licenses/by/3.0/) + * + * jqplotToImage function based on Larry Siden's export-jqplot-to-png.js. + * Larry has generously given permission to adapt his code for inclusion + * into jqPlot. + * + * Larry's original code can be found here: + * + * https://github.com/lsiden/export-jqplot-to-png + * + * + */ +(function(c){c.jqplot.EnhancedLegendRenderer=function(){c.jqplot.TableLegendRenderer.call(this)};c.jqplot.EnhancedLegendRenderer.prototype=new c.jqplot.TableLegendRenderer();c.jqplot.EnhancedLegendRenderer.prototype.constructor=c.jqplot.EnhancedLegendRenderer;c.jqplot.EnhancedLegendRenderer.prototype.init=function(d){this.numberRows=null;this.numberColumns=null;this.seriesToggle="normal";this.disableIEFading=true;c.extend(true,this,d);if(this.seriesToggle){c.jqplot.postDrawHooks.push(b)}};c.jqplot.EnhancedLegendRenderer.prototype.draw=function(){var f=this;if(this.show){var q=this._series;var r;var v="position:absolute;";v+=(this.background)?"background:"+this.background+";":"";v+=(this.border)?"border:"+this.border+";":"";v+=(this.fontSize)?"font-size:"+this.fontSize+";":"";v+=(this.fontFamily)?"font-family:"+this.fontFamily+";":"";v+=(this.textColor)?"color:"+this.textColor+";":"";v+=(this.marginTop!=null)?"margin-top:"+this.marginTop+";":"";v+=(this.marginBottom!=null)?"margin-bottom:"+this.marginBottom+";":"";v+=(this.marginLeft!=null)?"margin-left:"+this.marginLeft+";":"";v+=(this.marginRight!=null)?"margin-right:"+this.marginRight+";":"";this._elem=c('<table class="jqplot-table-legend" style="'+v+'"></table>');if(this.seriesToggle){this._elem.css("z-index","3")}var A=false,p=false,d,n;if(this.numberRows){d=this.numberRows;if(!this.numberColumns){n=Math.ceil(q.length/d)}else{n=this.numberColumns}}else{if(this.numberColumns){n=this.numberColumns;d=Math.ceil(q.length/this.numberColumns)}else{d=q.length;n=1}}var z,x,e,l,k,m,o,t,h,g;var u=0;for(z=q.length-1;z>=0;z--){if(n==1&&q[z]._stack||q[z].renderer.constructor==c.jqplot.BezierCurveRenderer){p=true}}for(z=0;z<d;z++){e=c(document.createElement("tr"));e.addClass("jqplot-table-legend");if(p){e.prependTo(this._elem)}else{e.appendTo(this._elem)}for(x=0;x<n;x++){if(u<q.length&&q[u].show&&q[u].showLabel){r=q[u];m=this.labels[u]||r.label.toString();if(m){var w=r.color;if(!p){if(z>0){A=true}else{A=false}}else{if(z==d-1){A=false}else{A=true}}o=(A)?this.rowSpacing:"0";l=c(document.createElement("td"));l.addClass("jqplot-table-legend jqplot-table-legend-swatch");l.css({textAlign:"center",paddingTop:o});h=c(document.createElement("div"));h.addClass("jqplot-table-legend-swatch-outline");g=c(document.createElement("div"));g.addClass("jqplot-table-legend-swatch");g.css({backgroundColor:w,borderColor:w});l.append(h.append(g));k=c(document.createElement("td"));k.addClass("jqplot-table-legend jqplot-table-legend-label");k.css("paddingTop",o);if(this.escapeHtml){k.text(m)}else{k.html(m)}if(p){if(this.showLabels){k.prependTo(e)}if(this.showSwatches){l.prependTo(e)}}else{if(this.showSwatches){l.appendTo(e)}if(this.showLabels){k.appendTo(e)}}if(this.seriesToggle){var y;if(typeof(this.seriesToggle)=="string"||typeof(this.seriesToggle)=="number"){if(!c.jqplot.use_excanvas||!this.disableIEFading){y=this.seriesToggle}}if(this.showSwatches){l.bind("click",{series:r,speed:y},a);l.addClass("jqplot-seriesToggle")}if(this.showLabels){k.bind("click",{series:r,speed:y},a);k.addClass("jqplot-seriesToggle")}}A=true}}u++}l=k=h=g=null}}return this._elem};var a=function(d){d.data.series.toggleDisplay(d);if(d.data.series.canvas._elem.hasClass("jqplot-series-hidden")){c(this).addClass("jqplot-series-hidden");c(this).next(".jqplot-table-legend-label").addClass("jqplot-series-hidden");c(this).prev(".jqplot-table-legend-swatch").addClass("jqplot-series-hidden")}else{c(this).removeClass("jqplot-series-hidden");c(this).next(".jqplot-table-legend-label").removeClass("jqplot-series-hidden");c(this).prev(".jqplot-table-legend-swatch").removeClass("jqplot-series-hidden")}};var b=function(){if(this.legend.renderer.constructor==c.jqplot.EnhancedLegendRenderer&&this.legend.seriesToggle){var d=this.legend._elem.detach();this.eventCanvas._elem.after(d)}}})(jQuery); \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/plugins/jqplot.funnelRenderer.js b/libreplan-webapp/src/main/webapp/jqplot/plugins/jqplot.funnelRenderer.js new file mode 100644 index 000000000..401e1bd68 --- /dev/null +++ b/libreplan-webapp/src/main/webapp/jqplot/plugins/jqplot.funnelRenderer.js @@ -0,0 +1,938 @@ +/** + * jqPlot + * Pure JavaScript plotting plugin using jQuery + * + * Version: 1.0.0b2_r1012 + * + * Copyright (c) 2009-2011 Chris Leonello + * jqPlot is currently available for use in all personal or commercial projects + * under both the MIT (http://www.opensource.org/licenses/mit-license.php) and GPL + * version 2.0 (http://www.gnu.org/licenses/gpl-2.0.html) licenses. This means that you can + * choose the license that best suits your project and use it accordingly. + * + * Although not required, the author would appreciate an email letting him + * know of any substantial use of jqPlot. You can reach the author at: + * chris at jqplot dot com or see http://www.jqplot.com/info.php . + * + * If you are feeling kind and generous, consider supporting the project by + * making a donation at: http://www.jqplot.com/donate.php . + * + * sprintf functions contained in jqplot.sprintf.js by Ash Searle: + * + * version 2007.04.27 + * author Ash Searle + * http://hexmen.com/blog/2007/03/printf-sprintf/ + * http://hexmen.com/js/sprintf.js + * The author (Ash Searle) has placed this code in the public domain: + * "This code is unrestricted: you are free to use it however you like." + * + */ +(function($) { + /** + * Class: $.jqplot.FunnelRenderer + * Plugin renderer to draw a funnel chart. + * x values, if present, will be used as labels. + * y values give area size. + * + * Funnel charts will draw a single series + * only. + * + * To use this renderer, you need to include the + * funnel renderer plugin, for example: + * + * > <script type="text/javascript" src="plugins/jqplot.funnelRenderer.js"></script> + * + * Properties described here are passed into the $.jqplot function + * as options on the series renderer. For example: + * + * > plot2 = $.jqplot('chart2', [s1, s2], { + * > seriesDefaults: { + * > renderer:$.jqplot.FunnelRenderer, + * > rendererOptions:{ + * > sectionMargin: 12, + * > widthRatio: 0.3 + * > } + * > } + * > }); + * + * IMPORTANT + * + * *The funnel renderer will reorder data in descending order* so the largest value in + * the data set is first and displayed on top of the funnel. Data will then + * be displayed in descending order down the funnel. The area of each funnel + * section will correspond to the value of each data point relative to the sum + * of all values. That is section area is proportional to section value divided by + * sum of all section values. + * + * If your data is not in descending order when passed into the plot, *it will be + * reordered* when stored in the series.data property. A copy of the unordered + * data is kept in the series._unorderedData property. + * + * A funnel plot will trigger events on the plot target + * according to user interaction. All events return the event object, + * the series index, the point (section) index, and the point data for + * the appropriate section. *Note* the point index will referr to the ordered + * data, not the original unordered data. + * + * 'jqplotDataMouseOver' - triggered when mousing over a section. + * 'jqplotDataHighlight' - triggered the first time user mouses over a section, + * if highlighting is enabled. + * 'jqplotDataUnhighlight' - triggered when a user moves the mouse out of + * a highlighted section. + * 'jqplotDataClick' - triggered when the user clicks on a section. + * 'jqplotDataRightClick' - tiggered when the user right clicks on a section if + * the "captureRightClick" option is set to true on the plot. + */ + $.jqplot.FunnelRenderer = function(){ + $.jqplot.LineRenderer.call(this); + }; + + $.jqplot.FunnelRenderer.prototype = new $.jqplot.LineRenderer(); + $.jqplot.FunnelRenderer.prototype.constructor = $.jqplot.FunnelRenderer; + + // called with scope of a series + $.jqplot.FunnelRenderer.prototype.init = function(options, plot) { + // Group: Properties + // + // prop: padding + // padding between the funnel and plot edges, legend, etc. + this.padding = {top: 20, right: 20, bottom: 20, left: 20}; + // prop: sectionMargin + // spacing between funnel sections in pixels. + this.sectionMargin = 6; + // prop: fill + // true or false, wether to fill the areas. + this.fill = true; + // prop: shadowOffset + // offset of the shadow from the area and offset of + // each succesive stroke of the shadow from the last. + this.shadowOffset = 2; + // prop: shadowAlpha + // transparency of the shadow (0 = transparent, 1 = opaque) + this.shadowAlpha = 0.07; + // prop: shadowDepth + // number of strokes to apply to the shadow, + // each stroke offset shadowOffset from the last. + this.shadowDepth = 5; + // prop: highlightMouseOver + // True to highlight area when moused over. + // This must be false to enable highlightMouseDown to highlight when clicking on a area. + this.highlightMouseOver = true; + // prop: highlightMouseDown + // True to highlight when a mouse button is pressed over a area. + // This will be disabled if highlightMouseOver is true. + this.highlightMouseDown = false; + // prop: highlightColors + // array of colors to use when highlighting an area. + this.highlightColors = []; + // prop: widthRatio + // The ratio of the width of the top of the funnel to the bottom. + // a ratio of 0 will make an upside down pyramid. + this.widthRatio = 0.2; + // prop: lineWidth + // width of line if areas are stroked and not filled. + this.lineWidth = 2; + // prop: dataLabels + // Either 'label', 'value', 'percent' or an array of labels to place on the pie slices. + // Defaults to percentage of each pie slice. + this.dataLabels = 'percent'; + // prop: showDataLabels + // true to show data labels on slices. + this.showDataLabels = false; + // prop: dataLabelFormatString + // Format string for data labels. If none, '%s' is used for "label" and for arrays, '%d' for value and '%d%%' for percentage. + this.dataLabelFormatString = null; + // prop: dataLabelThreshold + // 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. + this.dataLabelThreshold = 3; + this._type = 'funnel'; + + this.tickRenderer = $.jqplot.FunnelTickRenderer; + + // if user has passed in highlightMouseDown option and not set highlightMouseOver, disable highlightMouseOver + if (options.highlightMouseDown && options.highlightMouseOver == null) { + options.highlightMouseOver = false; + } + + $.extend(true, this, options); + + // index of the currenty highlighted point, if any + this._highlightedPoint = null; + + // lengths of bases, or horizontal sides of areas of trapezoid. + this._bases = []; + // total area + this._atot; + // areas of segments. + this._areas = []; + // vertical lengths of segments. + this._lengths = []; + // angle of the funnel to vertical. + this._angle; + this._dataIndices = []; + + // sort data + this._unorderedData = $.extend(true, [], this.data); + var idxs = $.extend(true, [], this.data); + for (var i=0; i<idxs.length; i++) { + idxs[i].push(i); + } + this.data.sort( function (a, b) { return b[1] - a[1]; } ); + idxs.sort( function (a, b) { return b[1] - a[1]; }); + for (var i=0; i<idxs.length; i++) { + this._dataIndices.push(idxs[i][2]); + } + + // set highlight colors if none provided + if (this.highlightColors.length == 0) { + for (var i=0; i<this.seriesColors.length; i++){ + var rgba = $.jqplot.getColorComponents(this.seriesColors[i]); + var newrgb = [rgba[0], rgba[1], rgba[2]]; + var sum = newrgb[0] + newrgb[1] + newrgb[2]; + for (var j=0; j<3; j++) { + // when darkening, lowest color component can be is 60. + newrgb[j] = (sum > 570) ? newrgb[j] * 0.8 : newrgb[j] + 0.4 * (255 - newrgb[j]); + newrgb[j] = parseInt(newrgb[j], 10); + } + this.highlightColors.push('rgb('+newrgb[0]+','+newrgb[1]+','+newrgb[2]+')'); + } + } + + plot.postParseOptionsHooks.addOnce(postParseOptions); + plot.postInitHooks.addOnce(postInit); + plot.eventListenerHooks.addOnce('jqplotMouseMove', handleMove); + plot.eventListenerHooks.addOnce('jqplotMouseDown', handleMouseDown); + plot.eventListenerHooks.addOnce('jqplotMouseUp', handleMouseUp); + plot.eventListenerHooks.addOnce('jqplotClick', handleClick); + plot.eventListenerHooks.addOnce('jqplotRightClick', handleRightClick); + plot.postDrawHooks.addOnce(postPlotDraw); + + }; + + // gridData will be of form [label, percentage of total] + $.jqplot.FunnelRenderer.prototype.setGridData = function(plot) { + // set gridData property. This will hold angle in radians of each data point. + var sum = 0; + var td = []; + for (var i=0; i<this.data.length; i++){ + sum += this.data[i][1]; + td.push([this.data[i][0], this.data[i][1]]); + } + + // normalize y values, so areas are proportional. + for (var i=0; i<td.length; i++) { + td[i][1] = td[i][1]/sum; + } + + this._bases = new Array(td.length + 1); + this._lengths = new Array(td.length); + + this.gridData = td; + }; + + $.jqplot.FunnelRenderer.prototype.makeGridData = function(data, plot) { + // set gridData property. This will hold angle in radians of each data point. + var sum = 0; + var td = []; + for (var i=0; i<this.data.length; i++){ + sum += this.data[i][1]; + td.push([this.data[i][0], this.data[i][1]]); + } + + // normalize y values, so areas are proportional. + for (var i=0; i<td.length; i++) { + td[i][1] = td[i][1]/sum; + } + + this._bases = new Array(td.length + 1); + this._lengths = new Array(td.length); + + return td; + }; + + $.jqplot.FunnelRenderer.prototype.drawSection = function (ctx, vertices, color, isShadow) { + var fill = this.fill; + var lineWidth = this.lineWidth; + ctx.save(); + + if (isShadow) { + for (var i=0; i<this.shadowDepth; i++) { + ctx.save(); + ctx.translate(this.shadowOffset*Math.cos(this.shadowAngle/180*Math.PI), this.shadowOffset*Math.sin(this.shadowAngle/180*Math.PI)); + doDraw(); + } + } + + else { + doDraw(); + } + + function doDraw () { + ctx.beginPath(); + ctx.fillStyle = color; + ctx.strokeStyle = color; + ctx.lineWidth = lineWidth; + ctx.moveTo(vertices[0][0], vertices[0][1]); + for (var i=1; i<4; i++) { + ctx.lineTo(vertices[i][0], vertices[i][1]); + } + ctx.closePath(); + if (fill) { + ctx.fill(); + } + else { + ctx.stroke(); + } + } + + if (isShadow) { + for (var i=0; i<this.shadowDepth; i++) { + ctx.restore(); + } + } + + ctx.restore(); + }; + + // called with scope of series + $.jqplot.FunnelRenderer.prototype.draw = function (ctx, gd, options, plot) { + var i; + var opts = (options != undefined) ? options : {}; + // offset and direction of offset due to legend placement + var offx = 0; + var offy = 0; + var trans = 1; + this._areas = []; + // var colorGenerator = new this.colorGenerator(this.seriesColors); + if (options.legendInfo && options.legendInfo.placement == 'insideGrid') { + var li = options.legendInfo; + switch (li.location) { + case 'nw': + offx = li.width + li.xoffset; + break; + case 'w': + offx = li.width + li.xoffset; + break; + case 'sw': + offx = li.width + li.xoffset; + break; + case 'ne': + offx = li.width + li.xoffset; + trans = -1; + break; + case 'e': + offx = li.width + li.xoffset; + trans = -1; + break; + case 'se': + offx = li.width + li.xoffset; + trans = -1; + break; + case 'n': + offy = li.height + li.yoffset; + break; + case 's': + offy = li.height + li.yoffset; + trans = -1; + break; + default: + break; + } + } + + var loff = (trans==1) ? this.padding.left + offx : this.padding.left; + var toff = (trans==1) ? this.padding.top + offy : this.padding.top; + var roff = (trans==-1) ? this.padding.right + offx : this.padding.right; + var boff = (trans==-1) ? this.padding.bottom + offy : this.padding.bottom; + + var shadow = (opts.shadow != undefined) ? opts.shadow : this.shadow; + var showLine = (opts.showLine != undefined) ? opts.showLine : this.showLine; + var fill = (opts.fill != undefined) ? opts.fill : this.fill; + var cw = ctx.canvas.width; + var ch = ctx.canvas.height; + this._bases[0] = cw - loff - roff; + var ltot = this._length = ch - toff - boff; + + var hend = this._bases[0]*this.widthRatio; + this._atot = ltot/2 * (this._bases[0] + this._bases[0]*this.widthRatio); + + this._angle = Math.atan((this._bases[0] - hend)/2/ltot); + + for (i=0; i<gd.length; i++) { + this._areas.push(gd[i][1] * this._atot); + } + + + var guess, err, count, lsum=0; + var tolerance = 0.0001; + + for (i=0; i<this._areas.length; i++) { + guess = this._areas[i]/this._bases[i]; + err = 999999; + this._lengths[i] = guess; + count = 0; + while (err > this._lengths[i]*tolerance && count < 100) { + this._lengths[i] = this._areas[i]/(this._bases[i] - this._lengths[i] * Math.tan(this._angle)); + err = Math.abs(this._lengths[i] - guess); + this._bases[i+1] = this._bases[i] - (2*this._lengths[i]*Math.tan(this._angle)); + guess = this._lengths[i]; + count++; + } + lsum += this._lengths[i]; + } + + // figure out vertices of each section + this._vertices = new Array(gd.length); + + // these are 4 coners of entire trapezoid + var p0 = [loff, toff], + p1 = [loff+this._bases[0], toff], + p2 = [loff + (this._bases[0] - this._bases[this._bases.length-1])/2, toff + this._length], + p3 = [p2[0] + this._bases[this._bases.length-1], p2[1]]; + + // equations of right and left sides, returns x, y values given height of section (y value) + function findleft (l) { + var m = (p0[1] - p2[1])/(p0[0] - p2[0]); + var b = p0[1] - m*p0[0]; + var y = l + p0[1]; + + return [(y - b)/m, y]; + } + + function findright (l) { + var m = (p1[1] - p3[1])/(p1[0] - p3[0]); + var b = p1[1] - m*p1[0]; + var y = l + p1[1]; + + return [(y - b)/m, y]; + } + + var x = offx, y = offy; + var h=0, adj=0; + + for (i=0; i<gd.length; i++) { + this._vertices[i] = new Array(); + var v = this._vertices[i]; + var sm = this.sectionMargin; + if (i == 0) { + adj = 0; + } + if (i == 1) { + adj = sm/3; + } + else if (i > 0 && i < gd.length-1) { + adj = sm/2; + } + else if (i == gd.length -1) { + adj = 2*sm/3; + } + v.push(findleft(h+adj)); + v.push(findright(h+adj)); + h += this._lengths[i]; + if (i == 0) { + adj = -2*sm/3; + } + else if (i > 0 && i < gd.length-1) { + adj = -sm/2; + } + else if (i == gd.length - 1) { + adj = 0; + } + v.push(findright(h+adj)); + v.push(findleft(h+adj)); + + } + + if (this.shadow) { + var shadowColor = 'rgba(0,0,0,'+this.shadowAlpha+')'; + for (var i=0; i<gd.length; i++) { + this.renderer.drawSection.call (this, ctx, this._vertices[i], shadowColor, true); + } + + } + for (var i=0; i<gd.length; i++) { + var v = this._vertices[i]; + this.renderer.drawSection.call (this, ctx, v, this.seriesColors[i]); + + if (this.showDataLabels && gd[i][1]*100 >= this.dataLabelThreshold) { + var fstr, label; + + if (this.dataLabels == 'label') { + fstr = this.dataLabelFormatString || '%s'; + label = $.jqplot.sprintf(fstr, gd[i][0]); + } + else if (this.dataLabels == 'value') { + fstr = this.dataLabelFormatString || '%d'; + label = $.jqplot.sprintf(fstr, this.data[i][1]); + } + else if (this.dataLabels == 'percent') { + fstr = this.dataLabelFormatString || '%d%%'; + label = $.jqplot.sprintf(fstr, gd[i][1]*100); + } + else if (this.dataLabels.constructor == Array) { + fstr = this.dataLabelFormatString || '%s'; + label = $.jqplot.sprintf(fstr, this.dataLabels[this._dataIndices[i]]); + } + + var fact = (this._radius ) * this.dataLabelPositionFactor + this.sliceMargin + this.dataLabelNudge; + + var x = (v[0][0] + v[1][0])/2 + this.canvas._offsets.left; + var y = (v[1][1] + v[2][1])/2 + this.canvas._offsets.top; + + var labelelem = $('<span class="jqplot-funnel-series jqplot-data-label" style="position:absolute;">' + label + '</span>').insertBefore(plot.eventCanvas._elem); + x -= labelelem.width()/2; + y -= labelelem.height()/2; + x = Math.round(x); + y = Math.round(y); + labelelem.css({left: x, top: y}); + } + + } + + }; + + $.jqplot.FunnelAxisRenderer = function() { + $.jqplot.LinearAxisRenderer.call(this); + }; + + $.jqplot.FunnelAxisRenderer.prototype = new $.jqplot.LinearAxisRenderer(); + $.jqplot.FunnelAxisRenderer.prototype.constructor = $.jqplot.FunnelAxisRenderer; + + + // There are no traditional axes on a funnel chart. We just need to provide + // dummy objects with properties so the plot will render. + // called with scope of axis object. + $.jqplot.FunnelAxisRenderer.prototype.init = function(options){ + // + this.tickRenderer = $.jqplot.FunnelTickRenderer; + $.extend(true, this, options); + // I don't think I'm going to need _dataBounds here. + // have to go Axis scaling in a way to fit chart onto plot area + // and provide u2p and p2u functionality for mouse cursor, etc. + // for convienence set _dataBounds to 0 and 100 and + // set min/max to 0 and 100. + this._dataBounds = {min:0, max:100}; + this.min = 0; + this.max = 100; + this.showTicks = false; + this.ticks = []; + this.showMark = false; + this.show = false; + }; + + + + /** + * Class: $.jqplot.FunnelLegendRenderer + * Legend Renderer specific to funnel plots. Set by default + * when the user creates a funnel plot. + */ + $.jqplot.FunnelLegendRenderer = function(){ + $.jqplot.TableLegendRenderer.call(this); + }; + + $.jqplot.FunnelLegendRenderer.prototype = new $.jqplot.TableLegendRenderer(); + $.jqplot.FunnelLegendRenderer.prototype.constructor = $.jqplot.FunnelLegendRenderer; + + $.jqplot.FunnelLegendRenderer.prototype.init = function(options) { + // Group: Properties + // + // prop: numberRows + // Maximum number of rows in the legend. 0 or null for unlimited. + this.numberRows = null; + // prop: numberColumns + // Maximum number of columns in the legend. 0 or null for unlimited. + this.numberColumns = null; + $.extend(true, this, options); + }; + + // called with context of legend + $.jqplot.FunnelLegendRenderer.prototype.draw = function() { + var legend = this; + if (this.show) { + var series = this._series; + var ss = 'position:absolute;'; + ss += (this.background) ? 'background:'+this.background+';' : ''; + ss += (this.border) ? 'border:'+this.border+';' : ''; + ss += (this.fontSize) ? 'font-size:'+this.fontSize+';' : ''; + ss += (this.fontFamily) ? 'font-family:'+this.fontFamily+';' : ''; + ss += (this.textColor) ? 'color:'+this.textColor+';' : ''; + ss += (this.marginTop != null) ? 'margin-top:'+this.marginTop+';' : ''; + ss += (this.marginBottom != null) ? 'margin-bottom:'+this.marginBottom+';' : ''; + ss += (this.marginLeft != null) ? 'margin-left:'+this.marginLeft+';' : ''; + ss += (this.marginRight != null) ? 'margin-right:'+this.marginRight+';' : ''; + this._elem = $('<table class="jqplot-table-legend" style="'+ss+'"></table>'); + // Funnel charts legends don't go by number of series, but by number of data points + // in the series. Refactor things here for that. + + var pad = false, + reverse = false, + nr, nc; + var s = series[0]; + var colorGenerator = new $.jqplot.ColorGenerator(s.seriesColors); + + if (s.show) { + var pd = s.data; + if (this.numberRows) { + nr = this.numberRows; + if (!this.numberColumns){ + nc = Math.ceil(pd.length/nr); + } + else{ + nc = this.numberColumns; + } + } + else if (this.numberColumns) { + nc = this.numberColumns; + nr = Math.ceil(pd.length/this.numberColumns); + } + else { + nr = pd.length; + nc = 1; + } + + var i, j, tr, td1, td2, lt, rs, color; + var idx = 0; + + for (i=0; i<nr; i++) { + if (reverse){ + tr = $('<tr class="jqplot-table-legend"></tr>').prependTo(this._elem); + } + else{ + tr = $('<tr class="jqplot-table-legend"></tr>').appendTo(this._elem); + } + for (j=0; j<nc; j++) { + if (idx < pd.length){ + lt = this.labels[idx] || pd[idx][0].toString(); + color = colorGenerator.next(); + if (!reverse){ + if (i>0){ + pad = true; + } + else{ + pad = false; + } + } + else{ + if (i == nr -1){ + pad = false; + } + else{ + pad = true; + } + } + rs = (pad) ? this.rowSpacing : '0'; + + td1 = $('<td class="jqplot-table-legend" style="text-align:center;padding-top:'+rs+';">'+ + '<div><div class="jqplot-table-legend-swatch" style="border-color:'+color+';"></div>'+ + '</div></td>'); + td2 = $('<td class="jqplot-table-legend" style="padding-top:'+rs+';"></td>'); + if (this.escapeHtml){ + td2.text(lt); + } + else { + td2.html(lt); + } + if (reverse) { + td2.prependTo(tr); + td1.prependTo(tr); + } + else { + td1.appendTo(tr); + td2.appendTo(tr); + } + pad = true; + } + idx++; + } + } + } + } + return this._elem; + }; + + // $.jqplot.FunnelLegendRenderer.prototype.pack = function(offsets) { + // if (this.show) { + // // fake a grid for positioning + // var grid = {_top:offsets.top, _left:offsets.left, _right:offsets.right, _bottom:this._plotDimensions.height - offsets.bottom}; + // if (this.placement == 'insideGrid') { + // switch (this.location) { + // case 'nw': + // var a = grid._left + this.xoffset; + // var b = grid._top + this.yoffset; + // this._elem.css('left', a); + // this._elem.css('top', b); + // break; + // case 'n': + // var a = (offsets.left + (this._plotDimensions.width - offsets.right))/2 - this.getWidth()/2; + // var b = grid._top + this.yoffset; + // this._elem.css('left', a); + // this._elem.css('top', b); + // break; + // case 'ne': + // var a = offsets.right + this.xoffset; + // var b = grid._top + this.yoffset; + // this._elem.css({right:a, top:b}); + // break; + // case 'e': + // var a = offsets.right + this.xoffset; + // var b = (offsets.top + (this._plotDimensions.height - offsets.bottom))/2 - this.getHeight()/2; + // this._elem.css({right:a, top:b}); + // break; + // case 'se': + // var a = offsets.right + this.xoffset; + // var b = offsets.bottom + this.yoffset; + // this._elem.css({right:a, bottom:b}); + // break; + // case 's': + // var a = (offsets.left + (this._plotDimensions.width - offsets.right))/2 - this.getWidth()/2; + // var b = offsets.bottom + this.yoffset; + // this._elem.css({left:a, bottom:b}); + // break; + // case 'sw': + // var a = grid._left + this.xoffset; + // var b = offsets.bottom + this.yoffset; + // this._elem.css({left:a, bottom:b}); + // break; + // case 'w': + // var a = grid._left + this.xoffset; + // var b = (offsets.top + (this._plotDimensions.height - offsets.bottom))/2 - this.getHeight()/2; + // this._elem.css({left:a, top:b}); + // break; + // default: // same as 'se' + // var a = grid._right - this.xoffset; + // var b = grid._bottom + this.yoffset; + // this._elem.css({right:a, bottom:b}); + // break; + // } + // + // } + // else { + // switch (this.location) { + // case 'nw': + // var a = this._plotDimensions.width - grid._left + this.xoffset; + // var b = grid._top + this.yoffset; + // this._elem.css('right', a); + // this._elem.css('top', b); + // break; + // case 'n': + // var a = (offsets.left + (this._plotDimensions.width - offsets.right))/2 - this.getWidth()/2; + // var b = this._plotDimensions.height - grid._top + this.yoffset; + // this._elem.css('left', a); + // this._elem.css('bottom', b); + // break; + // case 'ne': + // var a = this._plotDimensions.width - offsets.right + this.xoffset; + // var b = grid._top + this.yoffset; + // this._elem.css({left:a, top:b}); + // break; + // case 'e': + // var a = this._plotDimensions.width - offsets.right + this.xoffset; + // var b = (offsets.top + (this._plotDimensions.height - offsets.bottom))/2 - this.getHeight()/2; + // this._elem.css({left:a, top:b}); + // break; + // case 'se': + // var a = this._plotDimensions.width - offsets.right + this.xoffset; + // var b = offsets.bottom + this.yoffset; + // this._elem.css({left:a, bottom:b}); + // break; + // case 's': + // var a = (offsets.left + (this._plotDimensions.width - offsets.right))/2 - this.getWidth()/2; + // var b = this._plotDimensions.height - offsets.bottom + this.yoffset; + // this._elem.css({left:a, top:b}); + // break; + // case 'sw': + // var a = this._plotDimensions.width - grid._left + this.xoffset; + // var b = offsets.bottom + this.yoffset; + // this._elem.css({right:a, bottom:b}); + // break; + // case 'w': + // var a = this._plotDimensions.width - grid._left + this.xoffset; + // var b = (offsets.top + (this._plotDimensions.height - offsets.bottom))/2 - this.getHeight()/2; + // this._elem.css({right:a, top:b}); + // break; + // default: // same as 'se' + // var a = grid._right - this.xoffset; + // var b = grid._bottom + this.yoffset; + // this._elem.css({right:a, bottom:b}); + // break; + // } + // } + // } + // }; + + // setup default renderers for axes and legend so user doesn't have to + // called with scope of plot + function preInit(target, data, options) { + options = options || {}; + options.axesDefaults = options.axesDefaults || {}; + options.legend = options.legend || {}; + options.seriesDefaults = options.seriesDefaults || {}; + // only set these if there is a funnel series + var setopts = false; + if (options.seriesDefaults.renderer == $.jqplot.FunnelRenderer) { + setopts = true; + } + else if (options.series) { + for (var i=0; i < options.series.length; i++) { + if (options.series[i].renderer == $.jqplot.FunnelRenderer) { + setopts = true; + } + } + } + + if (setopts) { + options.axesDefaults.renderer = $.jqplot.FunnelAxisRenderer; + options.legend.renderer = $.jqplot.FunnelLegendRenderer; + options.legend.preDraw = true; + options.sortData = false; + options.seriesDefaults.pointLabels = {show: false}; + } + } + + function postInit(target, data, options) { + // if multiple series, add a reference to the previous one so that + // funnel rings can nest. + for (var i=0; i<this.series.length; i++) { + if (this.series[i].renderer.constructor == $.jqplot.FunnelRenderer) { + // don't allow mouseover and mousedown at same time. + if (this.series[i].highlightMouseOver) { + this.series[i].highlightMouseDown = false; + } + } + } + } + + // called with scope of plot + function postParseOptions(options) { + for (var i=0; i<this.series.length; i++) { + this.series[i].seriesColors = this.seriesColors; + this.series[i].colorGenerator = $.jqplot.colorGenerator; + } + } + + function highlight (plot, sidx, pidx) { + var s = plot.series[sidx]; + var canvas = plot.plugins.funnelRenderer.highlightCanvas; + canvas._ctx.clearRect(0,0,canvas._ctx.canvas.width, canvas._ctx.canvas.height); + s._highlightedPoint = pidx; + plot.plugins.funnelRenderer.highlightedSeriesIndex = sidx; + s.renderer.drawSection.call(s, canvas._ctx, s._vertices[pidx], s.highlightColors[pidx], false); + } + + function unhighlight (plot) { + var canvas = plot.plugins.funnelRenderer.highlightCanvas; + canvas._ctx.clearRect(0,0, canvas._ctx.canvas.width, canvas._ctx.canvas.height); + for (var i=0; i<plot.series.length; i++) { + plot.series[i]._highlightedPoint = null; + } + plot.plugins.funnelRenderer.highlightedSeriesIndex = null; + plot.target.trigger('jqplotDataUnhighlight'); + } + + function handleMove(ev, gridpos, datapos, neighbor, plot) { + if (neighbor) { + var ins = [neighbor.seriesIndex, neighbor.pointIndex, neighbor.data]; + var evt1 = jQuery.Event('jqplotDataMouseOver'); + evt1.pageX = ev.pageX; + evt1.pageY = ev.pageY; + plot.target.trigger(evt1, ins); + if (plot.series[ins[0]].highlightMouseOver && !(ins[0] == plot.plugins.funnelRenderer.highlightedSeriesIndex && ins[1] == plot.series[ins[0]]._highlightedPoint)) { + var evt = jQuery.Event('jqplotDataHighlight'); + evt.pageX = ev.pageX; + evt.pageY = ev.pageY; + plot.target.trigger(evt, ins); + highlight (plot, ins[0], ins[1]); + } + } + else if (neighbor == null) { + unhighlight (plot); + } + } + + function handleMouseDown(ev, gridpos, datapos, neighbor, plot) { + if (neighbor) { + var ins = [neighbor.seriesIndex, neighbor.pointIndex, neighbor.data]; + if (plot.series[ins[0]].highlightMouseDown && !(ins[0] == plot.plugins.funnelRenderer.highlightedSeriesIndex && ins[1] == plot.series[ins[0]]._highlightedPoint)) { + var evt = jQuery.Event('jqplotDataHighlight'); + evt.pageX = ev.pageX; + evt.pageY = ev.pageY; + plot.target.trigger(evt, ins); + highlight (plot, ins[0], ins[1]); + } + } + else if (neighbor == null) { + unhighlight (plot); + } + } + + function handleMouseUp(ev, gridpos, datapos, neighbor, plot) { + var idx = plot.plugins.funnelRenderer.highlightedSeriesIndex; + if (idx != null && plot.series[idx].highlightMouseDown) { + unhighlight(plot); + } + } + + function handleClick(ev, gridpos, datapos, neighbor, plot) { + if (neighbor) { + var ins = [neighbor.seriesIndex, neighbor.pointIndex, neighbor.data]; + var evt = jQuery.Event('jqplotDataClick'); + evt.pageX = ev.pageX; + evt.pageY = ev.pageY; + plot.target.trigger(evt, ins); + } + } + + function handleRightClick(ev, gridpos, datapos, neighbor, plot) { + if (neighbor) { + var ins = [neighbor.seriesIndex, neighbor.pointIndex, neighbor.data]; + var idx = plot.plugins.funnelRenderer.highlightedSeriesIndex; + if (idx != null && plot.series[idx].highlightMouseDown) { + unhighlight(plot); + } + var evt = jQuery.Event('jqplotDataRightClick'); + evt.pageX = ev.pageX; + evt.pageY = ev.pageY; + plot.target.trigger(evt, ins); + } + } + + // called within context of plot + // create a canvas which we can draw on. + // insert it before the eventCanvas, so eventCanvas will still capture events. + function postPlotDraw() { + // Memory Leaks patch + if (this.plugins.funnelRenderer && this.plugins.funnelRenderer.highlightCanvas) { + this.plugins.funnelRenderer.highlightCanvas.resetCanvas(); + this.plugins.funnelRenderer.highlightCanvas = null; + } + + this.plugins.funnelRenderer = {}; + this.plugins.funnelRenderer.highlightCanvas = new $.jqplot.GenericCanvas(); + + // do we have any data labels? if so, put highlight canvas before those + var labels = $(this.targetId+' .jqplot-data-label'); + if (labels.length) { + $(labels[0]).before(this.plugins.funnelRenderer.highlightCanvas.createElement(this._gridPadding, 'jqplot-funnelRenderer-highlight-canvas', this._plotDimensions, this)); + } + // else put highlight canvas before event canvas. + else { + this.eventCanvas._elem.before(this.plugins.funnelRenderer.highlightCanvas.createElement(this._gridPadding, 'jqplot-funnelRenderer-highlight-canvas', this._plotDimensions, this)); + } + var hctx = this.plugins.funnelRenderer.highlightCanvas.setContext(); + this.eventCanvas._elem.bind('mouseleave', {plot:this}, function (ev) { unhighlight(ev.data.plot); }); + } + + $.jqplot.preInitHooks.push(preInit); + + $.jqplot.FunnelTickRenderer = function() { + $.jqplot.AxisTickRenderer.call(this); + }; + + $.jqplot.FunnelTickRenderer.prototype = new $.jqplot.AxisTickRenderer(); + $.jqplot.FunnelTickRenderer.prototype.constructor = $.jqplot.FunnelTickRenderer; + +})(jQuery); + + \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/plugins/jqplot.funnelRenderer.min.js b/libreplan-webapp/src/main/webapp/jqplot/plugins/jqplot.funnelRenderer.min.js new file mode 100644 index 000000000..b18a31e6c --- /dev/null +++ b/libreplan-webapp/src/main/webapp/jqplot/plugins/jqplot.funnelRenderer.min.js @@ -0,0 +1,57 @@ +/** + * jqPlot + * Pure JavaScript plotting plugin using jQuery + * + * Version: 1.0.0b2_r1012 + * + * Copyright (c) 2009-2011 Chris Leonello + * jqPlot is currently available for use in all personal or commercial projects + * under both the MIT (http://www.opensource.org/licenses/mit-license.php) and GPL + * version 2.0 (http://www.gnu.org/licenses/gpl-2.0.html) licenses. This means that you can + * choose the license that best suits your project and use it accordingly. + * + * Although not required, the author would appreciate an email letting him + * know of any substantial use of jqPlot. You can reach the author at: + * chris at jqplot dot com or see http://www.jqplot.com/info.php . + * + * If you are feeling kind and generous, consider supporting the project by + * making a donation at: http://www.jqplot.com/donate.php . + * + * sprintf functions contained in jqplot.sprintf.js by Ash Searle: + * + * version 2007.04.27 + * author Ash Searle + * http://hexmen.com/blog/2007/03/printf-sprintf/ + * http://hexmen.com/js/sprintf.js + * The author (Ash Searle) has placed this code in the public domain: + * "This code is unrestricted: you are free to use it however you like." + * + * included jsDate library by Chris Leonello: + * + * Copyright (c) 2010-2011 Chris Leonello + * + * jsDate is currently available for use in all personal or commercial projects + * under both the MIT and GPL version 2.0 licenses. This means that you can + * choose the license that best suits your project and use it accordingly. + * + * jsDate borrows many concepts and ideas from the Date Instance + * Methods by Ken Snyder along with some parts of Ken's actual code. + * + * Ken's origianl Date Instance Methods and copyright notice: + * + * Ken Snyder (ken d snyder at gmail dot com) + * 2008-09-10 + * version 2.0.2 (http://kendsnyder.com/sandbox/date/) + * Creative Commons Attribution License 3.0 (http://creativecommons.org/licenses/by/3.0/) + * + * jqplotToImage function based on Larry Siden's export-jqplot-to-png.js. + * Larry has generously given permission to adapt his code for inclusion + * into jqPlot. + * + * Larry's original code can be found here: + * + * https://github.com/lsiden/export-jqplot-to-png + * + * + */ +(function(e){e.jqplot.FunnelRenderer=function(){e.jqplot.LineRenderer.call(this)};e.jqplot.FunnelRenderer.prototype=new e.jqplot.LineRenderer();e.jqplot.FunnelRenderer.prototype.constructor=e.jqplot.FunnelRenderer;e.jqplot.FunnelRenderer.prototype.init=function(p,t){this.padding={top:20,right:20,bottom:20,left:20};this.sectionMargin=6;this.fill=true;this.shadowOffset=2;this.shadowAlpha=0.07;this.shadowDepth=5;this.highlightMouseOver=true;this.highlightMouseDown=false;this.highlightColors=[];this.widthRatio=0.2;this.lineWidth=2;this.dataLabels="percent";this.showDataLabels=false;this.dataLabelFormatString=null;this.dataLabelThreshold=3;this._type="funnel";this.tickRenderer=e.jqplot.FunnelTickRenderer;if(p.highlightMouseDown&&p.highlightMouseOver==null){p.highlightMouseOver=false}e.extend(true,this,p);this._highlightedPoint=null;this._bases=[];this._atot;this._areas=[];this._lengths=[];this._angle;this._dataIndices=[];this._unorderedData=e.extend(true,[],this.data);var o=e.extend(true,[],this.data);for(var r=0;r<o.length;r++){o[r].push(r)}this.data.sort(function(v,u){return u[1]-v[1]});o.sort(function(v,u){return u[1]-v[1]});for(var r=0;r<o.length;r++){this._dataIndices.push(o[r][2])}if(this.highlightColors.length==0){for(var r=0;r<this.seriesColors.length;r++){var q=e.jqplot.getColorComponents(this.seriesColors[r]);var m=[q[0],q[1],q[2]];var s=m[0]+m[1]+m[2];for(var n=0;n<3;n++){m[n]=(s>570)?m[n]*0.8:m[n]+0.4*(255-m[n]);m[n]=parseInt(m[n],10)}this.highlightColors.push("rgb("+m[0]+","+m[1]+","+m[2]+")")}}t.postParseOptionsHooks.addOnce(k);t.postInitHooks.addOnce(g);t.eventListenerHooks.addOnce("jqplotMouseMove",a);t.eventListenerHooks.addOnce("jqplotMouseDown",b);t.eventListenerHooks.addOnce("jqplotMouseUp",j);t.eventListenerHooks.addOnce("jqplotClick",f);t.eventListenerHooks.addOnce("jqplotRightClick",l);t.postDrawHooks.addOnce(h)};e.jqplot.FunnelRenderer.prototype.setGridData=function(o){var n=0;var p=[];for(var m=0;m<this.data.length;m++){n+=this.data[m][1];p.push([this.data[m][0],this.data[m][1]])}for(var m=0;m<p.length;m++){p[m][1]=p[m][1]/n}this._bases=new Array(p.length+1);this._lengths=new Array(p.length);this.gridData=p};e.jqplot.FunnelRenderer.prototype.makeGridData=function(o,p){var n=0;var q=[];for(var m=0;m<this.data.length;m++){n+=this.data[m][1];q.push([this.data[m][0],this.data[m][1]])}for(var m=0;m<q.length;m++){q[m][1]=q[m][1]/n}this._bases=new Array(q.length+1);this._lengths=new Array(q.length);return q};e.jqplot.FunnelRenderer.prototype.drawSection=function(n,p,o,s){var t=this.fill;var m=this.lineWidth;n.save();if(s){for(var r=0;r<this.shadowDepth;r++){n.save();n.translate(this.shadowOffset*Math.cos(this.shadowAngle/180*Math.PI),this.shadowOffset*Math.sin(this.shadowAngle/180*Math.PI));q()}}else{q()}function q(){n.beginPath();n.fillStyle=o;n.strokeStyle=o;n.lineWidth=m;n.moveTo(p[0][0],p[0][1]);for(var u=1;u<4;u++){n.lineTo(p[u][0],p[u][1])}n.closePath();if(t){n.fill()}else{n.stroke()}}if(s){for(var r=0;r<this.shadowDepth;r++){n.restore()}}n.restore()};e.jqplot.FunnelRenderer.prototype.draw=function(G,B,J,p){var Y;var L=(J!=undefined)?J:{};var w=0;var u=0;var R=1;this._areas=[];if(J.legendInfo&&J.legendInfo.placement=="insideGrid"){var O=J.legendInfo;switch(O.location){case"nw":w=O.width+O.xoffset;break;case"w":w=O.width+O.xoffset;break;case"sw":w=O.width+O.xoffset;break;case"ne":w=O.width+O.xoffset;R=-1;break;case"e":w=O.width+O.xoffset;R=-1;break;case"se":w=O.width+O.xoffset;R=-1;break;case"n":u=O.height+O.yoffset;break;case"s":u=O.height+O.yoffset;R=-1;break;default:break}}var t=(R==1)?this.padding.left+w:this.padding.left;var F=(R==1)?this.padding.top+u:this.padding.top;var M=(R==-1)?this.padding.right+w:this.padding.right;var o=(R==-1)?this.padding.bottom+u:this.padding.bottom;var P=(L.shadow!=undefined)?L.shadow:this.shadow;var q=(L.showLine!=undefined)?L.showLine:this.showLine;var C=(L.fill!=undefined)?L.fill:this.fill;var H=G.canvas.width;var N=G.canvas.height;this._bases[0]=H-t-M;var I=this._length=N-F-o;var r=this._bases[0]*this.widthRatio;this._atot=I/2*(this._bases[0]+this._bases[0]*this.widthRatio);this._angle=Math.atan((this._bases[0]-r)/2/I);for(Y=0;Y<B.length;Y++){this._areas.push(B[Y][1]*this._atot)}var E,aa,W,Q=0;var n=0.0001;for(Y=0;Y<this._areas.length;Y++){E=this._areas[Y]/this._bases[Y];aa=999999;this._lengths[Y]=E;W=0;while(aa>this._lengths[Y]*n&&W<100){this._lengths[Y]=this._areas[Y]/(this._bases[Y]-this._lengths[Y]*Math.tan(this._angle));aa=Math.abs(this._lengths[Y]-E);this._bases[Y+1]=this._bases[Y]-(2*this._lengths[Y]*Math.tan(this._angle));E=this._lengths[Y];W++}Q+=this._lengths[Y]}this._vertices=new Array(B.length);var ae=[t,F],ad=[t+this._bases[0],F],ac=[t+(this._bases[0]-this._bases[this._bases.length-1])/2,F+this._length],ab=[ac[0]+this._bases[this._bases.length-1],ac[1]];function V(ag){var x=(ae[1]-ac[1])/(ae[0]-ac[0]);var v=ae[1]-x*ae[0];var ah=ag+ae[1];return[(ah-v)/x,ah]}function D(ag){var x=(ad[1]-ab[1])/(ad[0]-ab[0]);var v=ad[1]-x*ad[0];var ah=ag+ad[1];return[(ah-v)/x,ah]}var T=w,S=u;var Z=0,m=0;for(Y=0;Y<B.length;Y++){this._vertices[Y]=new Array();var U=this._vertices[Y];var A=this.sectionMargin;if(Y==0){m=0}if(Y==1){m=A/3}else{if(Y>0&&Y<B.length-1){m=A/2}else{if(Y==B.length-1){m=2*A/3}}}U.push(V(Z+m));U.push(D(Z+m));Z+=this._lengths[Y];if(Y==0){m=-2*A/3}else{if(Y>0&&Y<B.length-1){m=-A/2}else{if(Y==B.length-1){m=0}}}U.push(D(Z+m));U.push(V(Z+m))}if(this.shadow){var af="rgba(0,0,0,"+this.shadowAlpha+")";for(var Y=0;Y<B.length;Y++){this.renderer.drawSection.call(this,G,this._vertices[Y],af,true)}}for(var Y=0;Y<B.length;Y++){var U=this._vertices[Y];this.renderer.drawSection.call(this,G,U,this.seriesColors[Y]);if(this.showDataLabels&&B[Y][1]*100>=this.dataLabelThreshold){var K,X;if(this.dataLabels=="label"){K=this.dataLabelFormatString||"%s";X=e.jqplot.sprintf(K,B[Y][0])}else{if(this.dataLabels=="value"){K=this.dataLabelFormatString||"%d";X=e.jqplot.sprintf(K,this.data[Y][1])}else{if(this.dataLabels=="percent"){K=this.dataLabelFormatString||"%d%%";X=e.jqplot.sprintf(K,B[Y][1]*100)}else{if(this.dataLabels.constructor==Array){K=this.dataLabelFormatString||"%s";X=e.jqplot.sprintf(K,this.dataLabels[this._dataIndices[Y]])}}}}var s=(this._radius)*this.dataLabelPositionFactor+this.sliceMargin+this.dataLabelNudge;var T=(U[0][0]+U[1][0])/2+this.canvas._offsets.left;var S=(U[1][1]+U[2][1])/2+this.canvas._offsets.top;var z=e('<span class="jqplot-funnel-series jqplot-data-label" style="position:absolute;">'+X+"</span>").insertBefore(p.eventCanvas._elem);T-=z.width()/2;S-=z.height()/2;T=Math.round(T);S=Math.round(S);z.css({left:T,top:S})}}};e.jqplot.FunnelAxisRenderer=function(){e.jqplot.LinearAxisRenderer.call(this)};e.jqplot.FunnelAxisRenderer.prototype=new e.jqplot.LinearAxisRenderer();e.jqplot.FunnelAxisRenderer.prototype.constructor=e.jqplot.FunnelAxisRenderer;e.jqplot.FunnelAxisRenderer.prototype.init=function(m){this.tickRenderer=e.jqplot.FunnelTickRenderer;e.extend(true,this,m);this._dataBounds={min:0,max:100};this.min=0;this.max=100;this.showTicks=false;this.ticks=[];this.showMark=false;this.show=false};e.jqplot.FunnelLegendRenderer=function(){e.jqplot.TableLegendRenderer.call(this)};e.jqplot.FunnelLegendRenderer.prototype=new e.jqplot.TableLegendRenderer();e.jqplot.FunnelLegendRenderer.prototype.constructor=e.jqplot.FunnelLegendRenderer;e.jqplot.FunnelLegendRenderer.prototype.init=function(m){this.numberRows=null;this.numberColumns=null;e.extend(true,this,m)};e.jqplot.FunnelLegendRenderer.prototype.draw=function(){var p=this;if(this.show){var x=this._series;var A="position:absolute;";A+=(this.background)?"background:"+this.background+";":"";A+=(this.border)?"border:"+this.border+";":"";A+=(this.fontSize)?"font-size:"+this.fontSize+";":"";A+=(this.fontFamily)?"font-family:"+this.fontFamily+";":"";A+=(this.textColor)?"color:"+this.textColor+";":"";A+=(this.marginTop!=null)?"margin-top:"+this.marginTop+";":"";A+=(this.marginBottom!=null)?"margin-bottom:"+this.marginBottom+";":"";A+=(this.marginLeft!=null)?"margin-left:"+this.marginLeft+";":"";A+=(this.marginRight!=null)?"margin-right:"+this.marginRight+";":"";this._elem=e('<table class="jqplot-table-legend" style="'+A+'"></table>');var E=false,w=false,m,u;var y=x[0];var n=new e.jqplot.ColorGenerator(y.seriesColors);if(y.show){var F=y.data;if(this.numberRows){m=this.numberRows;if(!this.numberColumns){u=Math.ceil(F.length/m)}else{u=this.numberColumns}}else{if(this.numberColumns){u=this.numberColumns;m=Math.ceil(F.length/this.numberColumns)}else{m=F.length;u=1}}var D,C,o,r,q,t,v,B;var z=0;for(D=0;D<m;D++){if(w){o=e('<tr class="jqplot-table-legend"></tr>').prependTo(this._elem)}else{o=e('<tr class="jqplot-table-legend"></tr>').appendTo(this._elem)}for(C=0;C<u;C++){if(z<F.length){t=this.labels[z]||F[z][0].toString();B=n.next();if(!w){if(D>0){E=true}else{E=false}}else{if(D==m-1){E=false}else{E=true}}v=(E)?this.rowSpacing:"0";r=e('<td class="jqplot-table-legend" style="text-align:center;padding-top:'+v+';"><div><div class="jqplot-table-legend-swatch" style="border-color:'+B+';"></div></div></td>');q=e('<td class="jqplot-table-legend" style="padding-top:'+v+';"></td>');if(this.escapeHtml){q.text(t)}else{q.html(t)}if(w){q.prependTo(o);r.prependTo(o)}else{r.appendTo(o);q.appendTo(o)}E=true}z++}}}}return this._elem};function c(q,p,n){n=n||{};n.axesDefaults=n.axesDefaults||{};n.legend=n.legend||{};n.seriesDefaults=n.seriesDefaults||{};var m=false;if(n.seriesDefaults.renderer==e.jqplot.FunnelRenderer){m=true}else{if(n.series){for(var o=0;o<n.series.length;o++){if(n.series[o].renderer==e.jqplot.FunnelRenderer){m=true}}}}if(m){n.axesDefaults.renderer=e.jqplot.FunnelAxisRenderer;n.legend.renderer=e.jqplot.FunnelLegendRenderer;n.legend.preDraw=true;n.sortData=false;n.seriesDefaults.pointLabels={show:false}}}function g(p,o,m){for(var n=0;n<this.series.length;n++){if(this.series[n].renderer.constructor==e.jqplot.FunnelRenderer){if(this.series[n].highlightMouseOver){this.series[n].highlightMouseDown=false}}}}function k(m){for(var n=0;n<this.series.length;n++){this.series[n].seriesColors=this.seriesColors;this.series[n].colorGenerator=e.jqplot.colorGenerator}}function d(q,p,o){var n=q.series[p];var m=q.plugins.funnelRenderer.highlightCanvas;m._ctx.clearRect(0,0,m._ctx.canvas.width,m._ctx.canvas.height);n._highlightedPoint=o;q.plugins.funnelRenderer.highlightedSeriesIndex=p;n.renderer.drawSection.call(n,m._ctx,n._vertices[o],n.highlightColors[o],false)}function i(o){var m=o.plugins.funnelRenderer.highlightCanvas;m._ctx.clearRect(0,0,m._ctx.canvas.width,m._ctx.canvas.height);for(var n=0;n<o.series.length;n++){o.series[n]._highlightedPoint=null}o.plugins.funnelRenderer.highlightedSeriesIndex=null;o.target.trigger("jqplotDataUnhighlight")}function a(q,p,t,s,r){if(s){var o=[s.seriesIndex,s.pointIndex,s.data];var n=jQuery.Event("jqplotDataMouseOver");n.pageX=q.pageX;n.pageY=q.pageY;r.target.trigger(n,o);if(r.series[o[0]].highlightMouseOver&&!(o[0]==r.plugins.funnelRenderer.highlightedSeriesIndex&&o[1]==r.series[o[0]]._highlightedPoint)){var m=jQuery.Event("jqplotDataHighlight");m.pageX=q.pageX;m.pageY=q.pageY;r.target.trigger(m,o);d(r,o[0],o[1])}}else{if(s==null){i(r)}}}function b(p,o,s,r,q){if(r){var n=[r.seriesIndex,r.pointIndex,r.data];if(q.series[n[0]].highlightMouseDown&&!(n[0]==q.plugins.funnelRenderer.highlightedSeriesIndex&&n[1]==q.series[n[0]]._highlightedPoint)){var m=jQuery.Event("jqplotDataHighlight");m.pageX=p.pageX;m.pageY=p.pageY;q.target.trigger(m,n);d(q,n[0],n[1])}}else{if(r==null){i(q)}}}function j(o,n,r,q,p){var m=p.plugins.funnelRenderer.highlightedSeriesIndex;if(m!=null&&p.series[m].highlightMouseDown){i(p)}}function f(p,o,s,r,q){if(r){var n=[r.seriesIndex,r.pointIndex,r.data];var m=jQuery.Event("jqplotDataClick");m.pageX=p.pageX;m.pageY=p.pageY;q.target.trigger(m,n)}}function l(q,p,t,s,r){if(s){var o=[s.seriesIndex,s.pointIndex,s.data];var m=r.plugins.funnelRenderer.highlightedSeriesIndex;if(m!=null&&r.series[m].highlightMouseDown){i(r)}var n=jQuery.Event("jqplotDataRightClick");n.pageX=q.pageX;n.pageY=q.pageY;r.target.trigger(n,o)}}function h(){if(this.plugins.funnelRenderer&&this.plugins.funnelRenderer.highlightCanvas){this.plugins.funnelRenderer.highlightCanvas.resetCanvas();this.plugins.funnelRenderer.highlightCanvas=null}this.plugins.funnelRenderer={};this.plugins.funnelRenderer.highlightCanvas=new e.jqplot.GenericCanvas();var n=e(this.targetId+" .jqplot-data-label");if(n.length){e(n[0]).before(this.plugins.funnelRenderer.highlightCanvas.createElement(this._gridPadding,"jqplot-funnelRenderer-highlight-canvas",this._plotDimensions,this))}else{this.eventCanvas._elem.before(this.plugins.funnelRenderer.highlightCanvas.createElement(this._gridPadding,"jqplot-funnelRenderer-highlight-canvas",this._plotDimensions,this))}var m=this.plugins.funnelRenderer.highlightCanvas.setContext();this.eventCanvas._elem.bind("mouseleave",{plot:this},function(o){i(o.data.plot)})}e.jqplot.preInitHooks.push(c);e.jqplot.FunnelTickRenderer=function(){e.jqplot.AxisTickRenderer.call(this)};e.jqplot.FunnelTickRenderer.prototype=new e.jqplot.AxisTickRenderer();e.jqplot.FunnelTickRenderer.prototype.constructor=e.jqplot.FunnelTickRenderer})(jQuery); \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/plugins/jqplot.highlighter.js b/libreplan-webapp/src/main/webapp/jqplot/plugins/jqplot.highlighter.js new file mode 100644 index 000000000..d0b06e893 --- /dev/null +++ b/libreplan-webapp/src/main/webapp/jqplot/plugins/jqplot.highlighter.js @@ -0,0 +1,454 @@ +/** + * jqPlot + * Pure JavaScript plotting plugin using jQuery + * + * Version: 1.0.0b2_r1012 + * + * Copyright (c) 2009-2011 Chris Leonello + * jqPlot is currently available for use in all personal or commercial projects + * under both the MIT (http://www.opensource.org/licenses/mit-license.php) and GPL + * version 2.0 (http://www.gnu.org/licenses/gpl-2.0.html) licenses. This means that you can + * choose the license that best suits your project and use it accordingly. + * + * Although not required, the author would appreciate an email letting him + * know of any substantial use of jqPlot. You can reach the author at: + * chris at jqplot dot com or see http://www.jqplot.com/info.php . + * + * If you are feeling kind and generous, consider supporting the project by + * making a donation at: http://www.jqplot.com/donate.php . + * + * sprintf functions contained in jqplot.sprintf.js by Ash Searle: + * + * version 2007.04.27 + * author Ash Searle + * http://hexmen.com/blog/2007/03/printf-sprintf/ + * http://hexmen.com/js/sprintf.js + * The author (Ash Searle) has placed this code in the public domain: + * "This code is unrestricted: you are free to use it however you like." + * + */ +(function($) { + $.jqplot.eventListenerHooks.push(['jqplotMouseMove', handleMove]); + + /** + * Class: $.jqplot.Highlighter + * Plugin which will highlight data points when they are moused over. + * + * To use this plugin, include the js + * file in your source: + * + * > <script type="text/javascript" src="plugins/jqplot.highlighter.js"></script> + * + * A tooltip providing information about the data point is enabled by default. + * To disable the tooltip, set "showTooltip" to false. + * + * You can control what data is displayed in the tooltip with various + * options. The "tooltipAxes" option controls wether the x, y or both + * data values are displayed. + * + * Some chart types (e.g. hi-low-close) have more than one y value per + * data point. To display the additional values in the tooltip, set the + * "yvalues" option to the desired number of y values present (3 for a hlc chart). + * + * By default, data values will be formatted with the same formatting + * specifiers as used to format the axis ticks. A custom format code + * can be supplied with the tooltipFormatString option. This will apply + * to all values in the tooltip. + * + * For more complete control, the "formatString" option can be set. This + * Allows conplete control over tooltip formatting. Values are passed to + * the format string in an order determined by the "tooltipAxes" and "yvalues" + * options. So, if you have a hi-low-close chart and you just want to display + * the hi-low-close values in the tooltip, you could set a formatString like: + * + * > highlighter: { + * > tooltipAxes: 'y', + * > yvalues: 3, + * > formatString:'<table class="jqplot-highlighter"> + * > <tr><td>hi:</td><td>%s</td></tr> + * > <tr><td>low:</td><td>%s</td></tr> + * > <tr><td>close:</td><td>%s</td></tr></table>' + * > } + * + */ + $.jqplot.Highlighter = function(options) { + // Group: Properties + // + //prop: show + // true to show the highlight. + this.show = $.jqplot.config.enablePlugins; + // prop: markerRenderer + // Renderer used to draw the marker of the highlighted point. + // Renderer will assimilate attributes from the data point being highlighted, + // so no attributes need set on the renderer directly. + // Default is to turn off shadow drawing on the highlighted point. + this.markerRenderer = new $.jqplot.MarkerRenderer({shadow:false}); + // prop: showMarker + // true to show the marker + this.showMarker = true; + // prop: lineWidthAdjust + // Pixels to add to the lineWidth of the highlight. + this.lineWidthAdjust = 2.5; + // prop: sizeAdjust + // Pixels to add to the overall size of the highlight. + this.sizeAdjust = 5; + // prop: showTooltip + // Show a tooltip with data point values. + this.showTooltip = true; + // prop: tooltipLocation + // Where to position tooltip, 'n', 'ne', 'e', 'se', 's', 'sw', 'w', 'nw' + this.tooltipLocation = 'nw'; + // prop: fadeTooltip + // true = fade in/out tooltip, flase = show/hide tooltip + this.fadeTooltip = true; + // prop: tooltipFadeSpeed + // 'slow', 'def', 'fast', or number of milliseconds. + this.tooltipFadeSpeed = "fast"; + // prop: tooltipOffset + // Pixel offset of tooltip from the highlight. + this.tooltipOffset = 2; + // prop: tooltipAxes + // Which axes to display in tooltip, 'x', 'y' or 'both', 'xy' or 'yx' + // 'both' and 'xy' are equivalent, 'yx' reverses order of labels. + this.tooltipAxes = 'both'; + // prop; tooltipSeparator + // String to use to separate x and y axes in tooltip. + this.tooltipSeparator = ', '; + // prop; tooltipContentEditor + // Function used to edit/augment/replace the formatted tooltip contents. + // Called as str = tooltipContentEditor(str, seriesIndex, pointIndex) + // where str is the generated tooltip html and seriesIndex and pointIndex identify + // the data point being highlighted. Should return the html for the tooltip contents. + this.tooltipContentEditor = null; + // prop: useAxesFormatters + // Use the x and y axes formatters to format the text in the tooltip. + this.useAxesFormatters = true; + // prop: tooltipFormatString + // sprintf format string for the tooltip. + // Uses Ash Searle's javascript sprintf implementation + // found here: http://hexmen.com/blog/2007/03/printf-sprintf/ + // See http://perldoc.perl.org/functions/sprintf.html for reference. + // Additional "p" and "P" format specifiers added by Chris Leonello. + this.tooltipFormatString = '%.5P'; + // prop: formatString + // alternative to tooltipFormatString + // will format the whole tooltip text, populating with x, y values as + // indicated by tooltipAxes option. So, you could have a tooltip like: + // 'Date: %s, number of cats: %d' to format the whole tooltip at one go. + // If useAxesFormatters is true, values will be formatted according to + // Axes formatters and you can populate your tooltip string with + // %s placeholders. + this.formatString = null; + // prop: yvalues + // Number of y values to expect in the data point array. + // Typically this is 1. Certain plots, like OHLC, will + // have more y values in each data point array. + this.yvalues = 1; + // prop: bringSeriesToFront + // This option requires jQuery 1.4+ + // True to bring the series of the highlighted point to the front + // of other series. + this.bringSeriesToFront = false; + this._tooltipElem; + this.isHighlighting = false; + this.currentNeighbor = null; + + $.extend(true, this, options); + }; + + var locations = ['nw', 'n', 'ne', 'e', 'se', 's', 'sw', 'w']; + var locationIndicies = {'nw':0, 'n':1, 'ne':2, 'e':3, 'se':4, 's':5, 'sw':6, 'w':7}; + var oppositeLocations = ['se', 's', 'sw', 'w', 'nw', 'n', 'ne', 'e']; + + // axis.renderer.tickrenderer.formatter + + // called with scope of plot + $.jqplot.Highlighter.init = function (target, data, opts){ + var options = opts || {}; + // add a highlighter attribute to the plot + this.plugins.highlighter = new $.jqplot.Highlighter(options.highlighter); + }; + + // called within scope of series + $.jqplot.Highlighter.parseOptions = function (defaults, options) { + // Add a showHighlight option to the series + // and set it to true by default. + this.showHighlight = true; + }; + + // called within context of plot + // create a canvas which we can draw on. + // insert it before the eventCanvas, so eventCanvas will still capture events. + $.jqplot.Highlighter.postPlotDraw = function() { + // Memory Leaks patch + if (this.plugins.highlighter && this.plugins.highlighter.highlightCanvas) { + this.plugins.highlighter.highlightCanvas.resetCanvas(); + this.plugins.highlighter.highlightCanvas = null; + } + + if (this.plugins.highlighter && this.plugins.highlighter._tooltipElem) { + this.plugins.highlighter._tooltipElem.emptyForce(); + this.plugins.highlighter._tooltipElem = null; + } + + this.plugins.highlighter.highlightCanvas = new $.jqplot.GenericCanvas(); + + this.eventCanvas._elem.before(this.plugins.highlighter.highlightCanvas.createElement(this._gridPadding, 'jqplot-highlight-canvas', this._plotDimensions, this)); + this.plugins.highlighter.highlightCanvas.setContext(); + + var elem = document.createElement('div'); + this.plugins.highlighter._tooltipElem = $(elem); + elem = null; + this.plugins.highlighter._tooltipElem.addClass('jqplot-highlighter-tooltip'); + this.plugins.highlighter._tooltipElem.css({position:'absolute', display:'none'}); + + this.eventCanvas._elem.before(this.plugins.highlighter._tooltipElem); + }; + + $.jqplot.preInitHooks.push($.jqplot.Highlighter.init); + $.jqplot.preParseSeriesOptionsHooks.push($.jqplot.Highlighter.parseOptions); + $.jqplot.postDrawHooks.push($.jqplot.Highlighter.postPlotDraw); + + function draw(plot, neighbor) { + var hl = plot.plugins.highlighter; + var s = plot.series[neighbor.seriesIndex]; + var smr = s.markerRenderer; + var mr = hl.markerRenderer; + mr.style = smr.style; + mr.lineWidth = smr.lineWidth + hl.lineWidthAdjust; + mr.size = smr.size + hl.sizeAdjust; + var rgba = $.jqplot.getColorComponents(smr.color); + var newrgb = [rgba[0], rgba[1], rgba[2]]; + var alpha = (rgba[3] >= 0.6) ? rgba[3]*0.6 : rgba[3]*(2-rgba[3]); + mr.color = 'rgba('+newrgb[0]+','+newrgb[1]+','+newrgb[2]+','+alpha+')'; + mr.init(); + mr.draw(s.gridData[neighbor.pointIndex][0], s.gridData[neighbor.pointIndex][1], hl.highlightCanvas._ctx); + } + + function showTooltip(plot, series, neighbor) { + // neighbor looks like: {seriesIndex: i, pointIndex:j, gridData:p, data:s.data[j]} + // gridData should be x,y pixel coords on the grid. + // add the plot._gridPadding to that to get x,y in the target. + var hl = plot.plugins.highlighter; + var elem = hl._tooltipElem; + var serieshl = series.highlighter || {}; + + var opts = $.extend(true, {}, hl, serieshl); + + if (opts.useAxesFormatters) { + var xf = series._xaxis._ticks[0].formatter; + var yf = series._yaxis._ticks[0].formatter; + var xfstr = series._xaxis._ticks[0].formatString; + var yfstr = series._yaxis._ticks[0].formatString; + var str; + var xstr = xf(xfstr, neighbor.data[0]); + var ystrs = []; + for (var i=1; i<opts.yvalues+1; i++) { + ystrs.push(yf(yfstr, neighbor.data[i])); + } + if (typeof opts.formatString === 'string') { + switch (opts.tooltipAxes) { + case 'both': + case 'xy': + ystrs.unshift(xstr); + ystrs.unshift(opts.formatString); + str = $.jqplot.sprintf.apply($.jqplot.sprintf, ystrs); + break; + case 'yx': + ystrs.push(xstr); + ystrs.unshift(opts.formatString); + str = $.jqplot.sprintf.apply($.jqplot.sprintf, ystrs); + break; + case 'x': + str = $.jqplot.sprintf.apply($.jqplot.sprintf, [opts.formatString, xstr]); + break; + case 'y': + ystrs.unshift(opts.formatString); + str = $.jqplot.sprintf.apply($.jqplot.sprintf, ystrs); + break; + default: // same as xy + ystrs.unshift(xstr); + ystrs.unshift(opts.formatString); + str = $.jqplot.sprintf.apply($.jqplot.sprintf, ystrs); + break; + } + } + else { + switch (opts.tooltipAxes) { + case 'both': + case 'xy': + str = xstr; + for (var i=0; i<ystrs.length; i++) { + str += opts.tooltipSeparator + ystrs[i]; + } + break; + case 'yx': + str = ''; + for (var i=0; i<ystrs.length; i++) { + str += ystrs[i] + opts.tooltipSeparator; + } + str += xstr; + break; + case 'x': + str = xstr; + break; + case 'y': + str = ystrs.join(opts.tooltipSeparator); + break; + default: // same as 'xy' + str = xstr; + for (var i=0; i<ystrs.length; i++) { + str += opts.tooltipSeparator + ystrs[i]; + } + break; + + } + } + } + else { + var str; + if (typeof opts.formatString === 'string') { + str = $.jqplot.sprintf.apply($.jqplot.sprintf, [opts.formatString].concat(neighbor.data)); + } + + else { + if (opts.tooltipAxes == 'both' || opts.tooltipAxes == 'xy') { + str = $.jqplot.sprintf(opts.tooltipFormatString, neighbor.data[0]) + opts.tooltipSeparator + $.jqplot.sprintf(opts.tooltipFormatString, neighbor.data[1]); + } + else if (opts.tooltipAxes == 'yx') { + str = $.jqplot.sprintf(opts.tooltipFormatString, neighbor.data[1]) + opts.tooltipSeparator + $.jqplot.sprintf(opts.tooltipFormatString, neighbor.data[0]); + } + else if (opts.tooltipAxes == 'x') { + str = $.jqplot.sprintf(opts.tooltipFormatString, neighbor.data[0]); + } + else if (opts.tooltipAxes == 'y') { + str = $.jqplot.sprintf(opts.tooltipFormatString, neighbor.data[1]); + } + } + } + if ($.isFunction(opts.tooltipContentEditor)) { + // args str, seriesIndex, pointIndex are essential so the hook can look up + // extra data for the point. + str = opts.tooltipContentEditor(str, neighbor.seriesIndex, neighbor.pointIndex, plot); + } + elem.html(str); + var gridpos = {x:neighbor.gridData[0], y:neighbor.gridData[1]}; + var ms = 0; + var fact = 0.707; + if (series.markerRenderer.show == true) { + ms = (series.markerRenderer.size + opts.sizeAdjust)/2; + } + + var loc = locations; + if (series.fillToZero && series.fill && neighbor.data[1] < 0) { + loc = oppositeLocations; + } + + switch (loc[locationIndicies[opts.tooltipLocation]]) { + case 'nw': + var x = gridpos.x + plot._gridPadding.left - elem.outerWidth(true) - opts.tooltipOffset - fact * ms; + var y = gridpos.y + plot._gridPadding.top - opts.tooltipOffset - elem.outerHeight(true) - fact * ms; + break; + case 'n': + var x = gridpos.x + plot._gridPadding.left - elem.outerWidth(true)/2; + var y = gridpos.y + plot._gridPadding.top - opts.tooltipOffset - elem.outerHeight(true) - ms; + break; + case 'ne': + var x = gridpos.x + plot._gridPadding.left + opts.tooltipOffset + fact * ms; + var y = gridpos.y + plot._gridPadding.top - opts.tooltipOffset - elem.outerHeight(true) - fact * ms; + break; + case 'e': + var x = gridpos.x + plot._gridPadding.left + opts.tooltipOffset + ms; + var y = gridpos.y + plot._gridPadding.top - elem.outerHeight(true)/2; + break; + case 'se': + var x = gridpos.x + plot._gridPadding.left + opts.tooltipOffset + fact * ms; + var y = gridpos.y + plot._gridPadding.top + opts.tooltipOffset + fact * ms; + break; + case 's': + var x = gridpos.x + plot._gridPadding.left - elem.outerWidth(true)/2; + var y = gridpos.y + plot._gridPadding.top + opts.tooltipOffset + ms; + break; + case 'sw': + var x = gridpos.x + plot._gridPadding.left - elem.outerWidth(true) - opts.tooltipOffset - fact * ms; + var y = gridpos.y + plot._gridPadding.top + opts.tooltipOffset + fact * ms; + break; + case 'w': + var x = gridpos.x + plot._gridPadding.left - elem.outerWidth(true) - opts.tooltipOffset - ms; + var y = gridpos.y + plot._gridPadding.top - elem.outerHeight(true)/2; + break; + default: // same as 'nw' + var x = gridpos.x + plot._gridPadding.left - elem.outerWidth(true) - opts.tooltipOffset - fact * ms; + var y = gridpos.y + plot._gridPadding.top - opts.tooltipOffset - elem.outerHeight(true) - fact * ms; + break; + } + elem.css('left', x); + elem.css('top', y); + if (opts.fadeTooltip) { + // Fix for stacked up animations. Thnanks Trevor! + elem.stop(true,true).fadeIn(opts.tooltipFadeSpeed); + } + else { + elem.show(); + } + elem = null; + + } + + function handleMove(ev, gridpos, datapos, neighbor, plot) { + var hl = plot.plugins.highlighter; + var c = plot.plugins.cursor; + if (hl.show) { + if (neighbor == null && hl.isHighlighting) { + var ctx = hl.highlightCanvas._ctx; + ctx.clearRect(0, 0, ctx.canvas.width, ctx.canvas.height); + if (hl.fadeTooltip) { + hl._tooltipElem.fadeOut(hl.tooltipFadeSpeed); + } + else { + hl._tooltipElem.hide(); + } + if (hl.bringSeriesToFront) { + plot.restorePreviousSeriesOrder(); + } + hl.isHighlighting = false; + hl.currentNeighbor = null; + ctx = null; + } + else if (neighbor != null && plot.series[neighbor.seriesIndex].showHighlight && !hl.isHighlighting) { + hl.isHighlighting = true; + hl.currentNeighbor = neighbor; + if (hl.showMarker) { + draw(plot, neighbor); + } + if (hl.showTooltip && (!c || !c._zoom.started)) { + showTooltip(plot, plot.series[neighbor.seriesIndex], neighbor); + } + if (hl.bringSeriesToFront) { + plot.moveSeriesToFront(neighbor.seriesIndex); + } + } + // check to see if we're highlighting the wrong point. + else if (neighbor != null && hl.isHighlighting && hl.currentNeighbor != neighbor) { + // highlighting the wrong point. + + // if new series allows highlighting, highlight new point. + if (plot.series[neighbor.seriesIndex].showHighlight) { + var ctx = hl.highlightCanvas._ctx; + ctx.clearRect(0, 0, ctx.canvas.width, ctx.canvas.height); + hl.isHighlighting = true; + hl.currentNeighbor = neighbor; + if (hl.showMarker) { + draw(plot, neighbor); + } + if (hl.showTooltip && (!c || !c._zoom.started)) { + showTooltip(plot, plot.series[neighbor.seriesIndex], neighbor); + } + if (hl.bringSeriesToFront) { + plot.moveSeriesToFront(neighbor.seriesIndex); + } + } + } + } + } +})(jQuery); \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/plugins/jqplot.highlighter.min.js b/libreplan-webapp/src/main/webapp/jqplot/plugins/jqplot.highlighter.min.js new file mode 100644 index 000000000..f256e25f9 --- /dev/null +++ b/libreplan-webapp/src/main/webapp/jqplot/plugins/jqplot.highlighter.min.js @@ -0,0 +1,57 @@ +/** + * jqPlot + * Pure JavaScript plotting plugin using jQuery + * + * Version: 1.0.0b2_r1012 + * + * Copyright (c) 2009-2011 Chris Leonello + * jqPlot is currently available for use in all personal or commercial projects + * under both the MIT (http://www.opensource.org/licenses/mit-license.php) and GPL + * version 2.0 (http://www.gnu.org/licenses/gpl-2.0.html) licenses. This means that you can + * choose the license that best suits your project and use it accordingly. + * + * Although not required, the author would appreciate an email letting him + * know of any substantial use of jqPlot. You can reach the author at: + * chris at jqplot dot com or see http://www.jqplot.com/info.php . + * + * If you are feeling kind and generous, consider supporting the project by + * making a donation at: http://www.jqplot.com/donate.php . + * + * sprintf functions contained in jqplot.sprintf.js by Ash Searle: + * + * version 2007.04.27 + * author Ash Searle + * http://hexmen.com/blog/2007/03/printf-sprintf/ + * http://hexmen.com/js/sprintf.js + * The author (Ash Searle) has placed this code in the public domain: + * "This code is unrestricted: you are free to use it however you like." + * + * included jsDate library by Chris Leonello: + * + * Copyright (c) 2010-2011 Chris Leonello + * + * jsDate is currently available for use in all personal or commercial projects + * under both the MIT and GPL version 2.0 licenses. This means that you can + * choose the license that best suits your project and use it accordingly. + * + * jsDate borrows many concepts and ideas from the Date Instance + * Methods by Ken Snyder along with some parts of Ken's actual code. + * + * Ken's origianl Date Instance Methods and copyright notice: + * + * Ken Snyder (ken d snyder at gmail dot com) + * 2008-09-10 + * version 2.0.2 (http://kendsnyder.com/sandbox/date/) + * Creative Commons Attribution License 3.0 (http://creativecommons.org/licenses/by/3.0/) + * + * jqplotToImage function based on Larry Siden's export-jqplot-to-png.js. + * Larry has generously given permission to adapt his code for inclusion + * into jqPlot. + * + * Larry's original code can be found here: + * + * https://github.com/lsiden/export-jqplot-to-png + * + * + */ +(function(d){d.jqplot.eventListenerHooks.push(["jqplotMouseMove",f]);d.jqplot.Highlighter=function(h){this.show=d.jqplot.config.enablePlugins;this.markerRenderer=new d.jqplot.MarkerRenderer({shadow:false});this.showMarker=true;this.lineWidthAdjust=2.5;this.sizeAdjust=5;this.showTooltip=true;this.tooltipLocation="nw";this.fadeTooltip=true;this.tooltipFadeSpeed="fast";this.tooltipOffset=2;this.tooltipAxes="both";this.tooltipSeparator=", ";this.tooltipContentEditor=null;this.useAxesFormatters=true;this.tooltipFormatString="%.5P";this.formatString=null;this.yvalues=1;this.bringSeriesToFront=false;this._tooltipElem;this.isHighlighting=false;this.currentNeighbor=null;d.extend(true,this,h)};var b=["nw","n","ne","e","se","s","sw","w"];var e={nw:0,n:1,ne:2,e:3,se:4,s:5,sw:6,w:7};var c=["se","s","sw","w","nw","n","ne","e"];d.jqplot.Highlighter.init=function(k,j,i){var h=i||{};this.plugins.highlighter=new d.jqplot.Highlighter(h.highlighter)};d.jqplot.Highlighter.parseOptions=function(i,h){this.showHighlight=true};d.jqplot.Highlighter.postPlotDraw=function(){if(this.plugins.highlighter&&this.plugins.highlighter.highlightCanvas){this.plugins.highlighter.highlightCanvas.resetCanvas();this.plugins.highlighter.highlightCanvas=null}if(this.plugins.highlighter&&this.plugins.highlighter._tooltipElem){this.plugins.highlighter._tooltipElem.emptyForce();this.plugins.highlighter._tooltipElem=null}this.plugins.highlighter.highlightCanvas=new d.jqplot.GenericCanvas();this.eventCanvas._elem.before(this.plugins.highlighter.highlightCanvas.createElement(this._gridPadding,"jqplot-highlight-canvas",this._plotDimensions,this));this.plugins.highlighter.highlightCanvas.setContext();var h=document.createElement("div");this.plugins.highlighter._tooltipElem=d(h);h=null;this.plugins.highlighter._tooltipElem.addClass("jqplot-highlighter-tooltip");this.plugins.highlighter._tooltipElem.css({position:"absolute",display:"none"});this.eventCanvas._elem.before(this.plugins.highlighter._tooltipElem)};d.jqplot.preInitHooks.push(d.jqplot.Highlighter.init);d.jqplot.preParseSeriesOptionsHooks.push(d.jqplot.Highlighter.parseOptions);d.jqplot.postDrawHooks.push(d.jqplot.Highlighter.postPlotDraw);function a(m,o){var j=m.plugins.highlighter;var p=m.series[o.seriesIndex];var h=p.markerRenderer;var i=j.markerRenderer;i.style=h.style;i.lineWidth=h.lineWidth+j.lineWidthAdjust;i.size=h.size+j.sizeAdjust;var l=d.jqplot.getColorComponents(h.color);var n=[l[0],l[1],l[2]];var k=(l[3]>=0.6)?l[3]*0.6:l[3]*(2-l[3]);i.color="rgba("+n[0]+","+n[1]+","+n[2]+","+k+")";i.init();i.draw(p.gridData[o.pointIndex][0],p.gridData[o.pointIndex][1],j.highlightCanvas._ctx)}function g(A,q,m){var k=A.plugins.highlighter;var D=k._tooltipElem;var r=q.highlighter||{};var t=d.extend(true,{},k,r);if(t.useAxesFormatters){var w=q._xaxis._ticks[0].formatter;var h=q._yaxis._ticks[0].formatter;var E=q._xaxis._ticks[0].formatString;var s=q._yaxis._ticks[0].formatString;var z;var u=w(E,m.data[0]);var l=[];for(var B=1;B<t.yvalues+1;B++){l.push(h(s,m.data[B]))}if(typeof t.formatString==="string"){switch(t.tooltipAxes){case"both":case"xy":l.unshift(u);l.unshift(t.formatString);z=d.jqplot.sprintf.apply(d.jqplot.sprintf,l);break;case"yx":l.push(u);l.unshift(t.formatString);z=d.jqplot.sprintf.apply(d.jqplot.sprintf,l);break;case"x":z=d.jqplot.sprintf.apply(d.jqplot.sprintf,[t.formatString,u]);break;case"y":l.unshift(t.formatString);z=d.jqplot.sprintf.apply(d.jqplot.sprintf,l);break;default:l.unshift(u);l.unshift(t.formatString);z=d.jqplot.sprintf.apply(d.jqplot.sprintf,l);break}}else{switch(t.tooltipAxes){case"both":case"xy":z=u;for(var B=0;B<l.length;B++){z+=t.tooltipSeparator+l[B]}break;case"yx":z="";for(var B=0;B<l.length;B++){z+=l[B]+t.tooltipSeparator}z+=u;break;case"x":z=u;break;case"y":z=l.join(t.tooltipSeparator);break;default:z=u;for(var B=0;B<l.length;B++){z+=t.tooltipSeparator+l[B]}break}}}else{var z;if(typeof t.formatString==="string"){z=d.jqplot.sprintf.apply(d.jqplot.sprintf,[t.formatString].concat(m.data))}else{if(t.tooltipAxes=="both"||t.tooltipAxes=="xy"){z=d.jqplot.sprintf(t.tooltipFormatString,m.data[0])+t.tooltipSeparator+d.jqplot.sprintf(t.tooltipFormatString,m.data[1])}else{if(t.tooltipAxes=="yx"){z=d.jqplot.sprintf(t.tooltipFormatString,m.data[1])+t.tooltipSeparator+d.jqplot.sprintf(t.tooltipFormatString,m.data[0])}else{if(t.tooltipAxes=="x"){z=d.jqplot.sprintf(t.tooltipFormatString,m.data[0])}else{if(t.tooltipAxes=="y"){z=d.jqplot.sprintf(t.tooltipFormatString,m.data[1])}}}}}}if(d.isFunction(t.tooltipContentEditor)){z=t.tooltipContentEditor(z,m.seriesIndex,m.pointIndex,A)}D.html(z);var C={x:m.gridData[0],y:m.gridData[1]};var v=0;var j=0.707;if(q.markerRenderer.show==true){v=(q.markerRenderer.size+t.sizeAdjust)/2}var o=b;if(q.fillToZero&&q.fill&&m.data[1]<0){o=c}switch(o[e[t.tooltipLocation]]){case"nw":var p=C.x+A._gridPadding.left-D.outerWidth(true)-t.tooltipOffset-j*v;var n=C.y+A._gridPadding.top-t.tooltipOffset-D.outerHeight(true)-j*v;break;case"n":var p=C.x+A._gridPadding.left-D.outerWidth(true)/2;var n=C.y+A._gridPadding.top-t.tooltipOffset-D.outerHeight(true)-v;break;case"ne":var p=C.x+A._gridPadding.left+t.tooltipOffset+j*v;var n=C.y+A._gridPadding.top-t.tooltipOffset-D.outerHeight(true)-j*v;break;case"e":var p=C.x+A._gridPadding.left+t.tooltipOffset+v;var n=C.y+A._gridPadding.top-D.outerHeight(true)/2;break;case"se":var p=C.x+A._gridPadding.left+t.tooltipOffset+j*v;var n=C.y+A._gridPadding.top+t.tooltipOffset+j*v;break;case"s":var p=C.x+A._gridPadding.left-D.outerWidth(true)/2;var n=C.y+A._gridPadding.top+t.tooltipOffset+v;break;case"sw":var p=C.x+A._gridPadding.left-D.outerWidth(true)-t.tooltipOffset-j*v;var n=C.y+A._gridPadding.top+t.tooltipOffset+j*v;break;case"w":var p=C.x+A._gridPadding.left-D.outerWidth(true)-t.tooltipOffset-v;var n=C.y+A._gridPadding.top-D.outerHeight(true)/2;break;default:var p=C.x+A._gridPadding.left-D.outerWidth(true)-t.tooltipOffset-j*v;var n=C.y+A._gridPadding.top-t.tooltipOffset-D.outerHeight(true)-j*v;break}D.css("left",p);D.css("top",n);if(t.fadeTooltip){D.stop(true,true).fadeIn(t.tooltipFadeSpeed)}else{D.show()}D=null}function f(k,j,n,m,l){var h=l.plugins.highlighter;var o=l.plugins.cursor;if(h.show){if(m==null&&h.isHighlighting){var i=h.highlightCanvas._ctx;i.clearRect(0,0,i.canvas.width,i.canvas.height);if(h.fadeTooltip){h._tooltipElem.fadeOut(h.tooltipFadeSpeed)}else{h._tooltipElem.hide()}if(h.bringSeriesToFront){l.restorePreviousSeriesOrder()}h.isHighlighting=false;h.currentNeighbor=null;i=null}else{if(m!=null&&l.series[m.seriesIndex].showHighlight&&!h.isHighlighting){h.isHighlighting=true;h.currentNeighbor=m;if(h.showMarker){a(l,m)}if(h.showTooltip&&(!o||!o._zoom.started)){g(l,l.series[m.seriesIndex],m)}if(h.bringSeriesToFront){l.moveSeriesToFront(m.seriesIndex)}}else{if(m!=null&&h.isHighlighting&&h.currentNeighbor!=m){if(l.series[m.seriesIndex].showHighlight){var i=h.highlightCanvas._ctx;i.clearRect(0,0,i.canvas.width,i.canvas.height);h.isHighlighting=true;h.currentNeighbor=m;if(h.showMarker){a(l,m)}if(h.showTooltip&&(!o||!o._zoom.started)){g(l,l.series[m.seriesIndex],m)}if(h.bringSeriesToFront){l.moveSeriesToFront(m.seriesIndex)}}}}}}}})(jQuery); \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/plugins/jqplot.json2.js b/libreplan-webapp/src/main/webapp/jqplot/plugins/jqplot.json2.js new file mode 100644 index 000000000..46fb942ba --- /dev/null +++ b/libreplan-webapp/src/main/webapp/jqplot/plugins/jqplot.json2.js @@ -0,0 +1,475 @@ +/* + 2010-11-01 Chris Leonello + + Slightly modified version of the original json2.js to put JSON + functions under the $.jqplot namespace. + + licensing and orignal comments follow: + + http://www.JSON.org/json2.js + 2010-08-25 + + Public Domain. + + NO WARRANTY EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK. + + See http://www.JSON.org/js.html + + + This code should be minified before deployment. + See http://javascript.crockford.com/jsmin.html + + USE YOUR OWN COPY. IT IS EXTREMELY UNWISE TO LOAD CODE FROM SERVERS YOU DO + NOT CONTROL. + + + This file creates a global JSON object containing two methods: stringify + and parse. + + $.jqplot.JSON.stringify(value, replacer, space) + value any JavaScript value, usually an object or array. + + replacer an optional parameter that determines how object + values are stringified for objects. It can be a + function or an array of strings. + + space an optional parameter that specifies the indentation + of nested structures. If it is omitted, the text will + be packed without extra whitespace. If it is a number, + it will specify the number of spaces to indent at each + level. If it is a string (such as '\t' or ' '), + it contains the characters used to indent at each level. + + This method produces a JSON text from a JavaScript value. + + When an object value is found, if the object contains a toJSON + method, its toJSON method will be called and the result will be + stringified. A toJSON method does not serialize: it returns the + value represented by the name/value pair that should be serialized, + or undefined if nothing should be serialized. The toJSON method + will be passed the key associated with the value, and this will be + bound to the value + + For example, this would serialize Dates as ISO strings. + + Date.prototype.toJSON = function (key) { + function f(n) { + // Format integers to have at least two digits. + return n < 10 ? '0' + n : n; + } + + return this.getUTCFullYear() + '-' + + f(this.getUTCMonth() + 1) + '-' + + f(this.getUTCDate()) + 'T' + + f(this.getUTCHours()) + ':' + + f(this.getUTCMinutes()) + ':' + + f(this.getUTCSeconds()) + 'Z'; + }; + + You can provide an optional replacer method. It will be passed the + key and value of each member, with this bound to the containing + object. The value that is returned from your method will be + serialized. If your method returns undefined, then the member will + be excluded from the serialization. + + If the replacer parameter is an array of strings, then it will be + used to select the members to be serialized. It filters the results + such that only members with keys listed in the replacer array are + stringified. + + Values that do not have JSON representations, such as undefined or + functions, will not be serialized. Such values in objects will be + dropped; in arrays they will be replaced with null. You can use + a replacer function to replace those with JSON values. + $.jqplot.JSON.stringify(undefined) returns undefined. + + The optional space parameter produces a stringification of the + value that is filled with line breaks and indentation to make it + easier to read. + + If the space parameter is a non-empty string, then that string will + be used for indentation. If the space parameter is a number, then + the indentation will be that many spaces. + + Example: + + text = $.jqplot.JSON.stringify(['e', {pluribus: 'unum'}]); + // text is '["e",{"pluribus":"unum"}]' + + + text = $.jqplot.JSON.stringify(['e', {pluribus: 'unum'}], null, '\t'); + // text is '[\n\t"e",\n\t{\n\t\t"pluribus": "unum"\n\t}\n]' + + text = $.jqplot.JSON.stringify([new Date()], function (key, value) { + return this[key] instanceof Date ? + 'Date(' + this[key] + ')' : value; + }); + // text is '["Date(---current time---)"]' + + + $.jqplot.JSON.parse(text, reviver) + This method parses a JSON text to produce an object or array. + It can throw a SyntaxError exception. + + The optional reviver parameter is a function that can filter and + transform the results. It receives each of the keys and values, + and its return value is used instead of the original value. + If it returns what it received, then the structure is not modified. + If it returns undefined then the member is deleted. + + Example: + + // Parse the text. Values that look like ISO date strings will + // be converted to Date objects. + + myData = $.jqplot.JSON.parse(text, function (key, value) { + var a; + if (typeof value === 'string') { + a = +/^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2}(?:\.\d*)?)Z$/.exec(value); + if (a) { + return new Date(Date.UTC(+a[1], +a[2] - 1, +a[3], +a[4], + +a[5], +a[6])); + } + } + return value; + }); + + myData = $.jqplot.JSON.parse('["Date(09/09/2001)"]', function (key, value) { + var d; + if (typeof value === 'string' && + value.slice(0, 5) === 'Date(' && + value.slice(-1) === ')') { + d = new Date(value.slice(5, -1)); + if (d) { + return d; + } + } + return value; + }); + + + This is a reference implementation. You are free to copy, modify, or + redistribute. +*/ + +(function($) { + + $.jqplot.JSON = window.JSON; + + if (!window.JSON) { + $.jqplot.JSON = {}; + } + + function f(n) { + // Format integers to have at least two digits. + return n < 10 ? '0' + n : n; + } + + if (typeof Date.prototype.toJSON !== 'function') { + + Date.prototype.toJSON = function (key) { + + return isFinite(this.valueOf()) ? + this.getUTCFullYear() + '-' + + f(this.getUTCMonth() + 1) + '-' + + f(this.getUTCDate()) + 'T' + + f(this.getUTCHours()) + ':' + + f(this.getUTCMinutes()) + ':' + + f(this.getUTCSeconds()) + 'Z' : null; + }; + + String.prototype.toJSON = + Number.prototype.toJSON = + Boolean.prototype.toJSON = function (key) { + return this.valueOf(); + }; + } + + var cx = /[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g, + escapable = /[\\\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g, + gap, + indent, + meta = { // table of character substitutions + '\b': '\\b', + '\t': '\\t', + '\n': '\\n', + '\f': '\\f', + '\r': '\\r', + '"' : '\\"', + '\\': '\\\\' + }, + rep; + + + function quote(string) { + +// If the string contains no control characters, no quote characters, and no +// backslash characters, then we can safely slap some quotes around it. +// Otherwise we must also replace the offending characters with safe escape +// sequences. + + escapable.lastIndex = 0; + return escapable.test(string) ? + '"' + string.replace(escapable, function (a) { + var c = meta[a]; + return typeof c === 'string' ? c : + '\\u' + ('0000' + a.charCodeAt(0).toString(16)).slice(-4); + }) + '"' : + '"' + string + '"'; + } + + + function str(key, holder) { + +// Produce a string from holder[key]. + + var i, // The loop counter. + k, // The member key. + v, // The member value. + length, + mind = gap, + partial, + value = holder[key]; + +// If the value has a toJSON method, call it to obtain a replacement value. + + if (value && typeof value === 'object' && + typeof value.toJSON === 'function') { + value = value.toJSON(key); + } + +// If we were called with a replacer function, then call the replacer to +// obtain a replacement value. + + if (typeof rep === 'function') { + value = rep.call(holder, key, value); + } + +// What happens next depends on the value's type. + + switch (typeof value) { + case 'string': + return quote(value); + + case 'number': + +// JSON numbers must be finite. Encode non-finite numbers as null. + + return isFinite(value) ? String(value) : 'null'; + + case 'boolean': + case 'null': + +// If the value is a boolean or null, convert it to a string. Note: +// typeof null does not produce 'null'. The case is included here in +// the remote chance that this gets fixed someday. + + return String(value); + +// If the type is 'object', we might be dealing with an object or an array or +// null. + + case 'object': + +// Due to a specification blunder in ECMAScript, typeof null is 'object', +// so watch out for that case. + + if (!value) { + return 'null'; + } + +// Make an array to hold the partial results of stringifying this object value. + + gap += indent; + partial = []; + +// Is the value an array? + + if (Object.prototype.toString.apply(value) === '[object Array]') { + +// The value is an array. Stringify every element. Use null as a placeholder +// for non-JSON values. + + length = value.length; + for (i = 0; i < length; i += 1) { + partial[i] = str(i, value) || 'null'; + } + +// Join all of the elements together, separated with commas, and wrap them in +// brackets. + + v = partial.length === 0 ? '[]' : + gap ? '[\n' + gap + + partial.join(',\n' + gap) + '\n' + + mind + ']' : + '[' + partial.join(',') + ']'; + gap = mind; + return v; + } + +// If the replacer is an array, use it to select the members to be stringified. + + if (rep && typeof rep === 'object') { + length = rep.length; + for (i = 0; i < length; i += 1) { + k = rep[i]; + if (typeof k === 'string') { + v = str(k, value); + if (v) { + partial.push(quote(k) + (gap ? ': ' : ':') + v); + } + } + } + } else { + +// Otherwise, iterate through all of the keys in the object. + + for (k in value) { + if (Object.hasOwnProperty.call(value, k)) { + v = str(k, value); + if (v) { + partial.push(quote(k) + (gap ? ': ' : ':') + v); + } + } + } + } + +// Join all of the member texts together, separated with commas, +// and wrap them in braces. + + v = partial.length === 0 ? '{}' : + gap ? '{\n' + gap + partial.join(',\n' + gap) + '\n' + + mind + '}' : '{' + partial.join(',') + '}'; + gap = mind; + return v; + } + } + +// If the JSON object does not yet have a stringify method, give it one. + + if (typeof $.jqplot.JSON.stringify !== 'function') { + $.jqplot.JSON.stringify = function (value, replacer, space) { + +// The stringify method takes a value and an optional replacer, and an optional +// space parameter, and returns a JSON text. The replacer can be a function +// that can replace values, or an array of strings that will select the keys. +// A default replacer method can be provided. Use of the space parameter can +// produce text that is more easily readable. + + var i; + gap = ''; + indent = ''; + +// If the space parameter is a number, make an indent string containing that +// many spaces. + + if (typeof space === 'number') { + for (i = 0; i < space; i += 1) { + indent += ' '; + } + +// If the space parameter is a string, it will be used as the indent string. + + } else if (typeof space === 'string') { + indent = space; + } + +// If there is a replacer, it must be a function or an array. +// Otherwise, throw an error. + + rep = replacer; + if (replacer && typeof replacer !== 'function' && + (typeof replacer !== 'object' || + typeof replacer.length !== 'number')) { + throw new Error('$.jqplot.JSON.stringify'); + } + +// Make a fake root object containing our value under the key of ''. +// Return the result of stringifying the value. + + return str('', {'': value}); + }; + } + + +// If the JSON object does not yet have a parse method, give it one. + + if (typeof $.jqplot.JSON.parse !== 'function') { + $.jqplot.JSON.parse = function (text, reviver) { + +// The parse method takes a text and an optional reviver function, and returns +// a JavaScript value if the text is a valid JSON text. + + var j; + + function walk(holder, key) { + +// The walk method is used to recursively walk the resulting structure so +// that modifications can be made. + + var k, v, value = holder[key]; + if (value && typeof value === 'object') { + for (k in value) { + if (Object.hasOwnProperty.call(value, k)) { + v = walk(value, k); + if (v !== undefined) { + value[k] = v; + } else { + delete value[k]; + } + } + } + } + return reviver.call(holder, key, value); + } + + +// Parsing happens in four stages. In the first stage, we replace certain +// Unicode characters with escape sequences. JavaScript handles many characters +// incorrectly, either silently deleting them, or treating them as line endings. + + text = String(text); + cx.lastIndex = 0; + if (cx.test(text)) { + text = text.replace(cx, function (a) { + return '\\u' + + ('0000' + a.charCodeAt(0).toString(16)).slice(-4); + }); + } + +// In the second stage, we run the text against regular expressions that look +// for non-JSON patterns. We are especially concerned with '()' and 'new' +// because they can cause invocation, and '=' because it can cause mutation. +// But just to be safe, we want to reject all unexpected forms. + +// We split the second stage into 4 regexp operations in order to work around +// crippling inefficiencies in IE's and Safari's regexp engines. First we +// replace the JSON backslash pairs with '@' (a non-JSON character). Second, we +// replace all simple value tokens with ']' characters. Third, we delete all +// open brackets that follow a colon or comma or that begin the text. Finally, +// we look to see that the remaining characters are only whitespace or ']' or +// ',' or ':' or '{' or '}'. If that is so, then the text is safe for eval. + + if (/^[\],:{}\s]*$/.test(text.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, '@').replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, ']').replace(/(?:^|:|,)(?:\s*\[)+/g, ''))) { + +// In the third stage we use the eval function to compile the text into a +// JavaScript structure. The '{' operator is subject to a syntactic ambiguity +// in JavaScript: it can begin a block or an object literal. We wrap the text +// in parens to eliminate the ambiguity. + + j = eval('(' + text + ')'); + +// In the optional fourth stage, we recursively walk the new structure, passing +// each name/value pair to a reviver function for possible transformation. + + return typeof reviver === 'function' ? + walk({'': j}, '') : j; + } + +// If the text is not JSON parseable, then a SyntaxError is thrown. + + throw new SyntaxError('$.jqplot.JSON.parse'); + }; + } +})(jQuery); diff --git a/libreplan-webapp/src/main/webapp/jqplot/plugins/jqplot.json2.min.js b/libreplan-webapp/src/main/webapp/jqplot/plugins/jqplot.json2.min.js new file mode 100644 index 000000000..83a74adb7 --- /dev/null +++ b/libreplan-webapp/src/main/webapp/jqplot/plugins/jqplot.json2.min.js @@ -0,0 +1,57 @@ +/** + * jqPlot + * Pure JavaScript plotting plugin using jQuery + * + * Version: 1.0.0b2_r1012 + * + * Copyright (c) 2009-2011 Chris Leonello + * jqPlot is currently available for use in all personal or commercial projects + * under both the MIT (http://www.opensource.org/licenses/mit-license.php) and GPL + * version 2.0 (http://www.gnu.org/licenses/gpl-2.0.html) licenses. This means that you can + * choose the license that best suits your project and use it accordingly. + * + * Although not required, the author would appreciate an email letting him + * know of any substantial use of jqPlot. You can reach the author at: + * chris at jqplot dot com or see http://www.jqplot.com/info.php . + * + * If you are feeling kind and generous, consider supporting the project by + * making a donation at: http://www.jqplot.com/donate.php . + * + * sprintf functions contained in jqplot.sprintf.js by Ash Searle: + * + * version 2007.04.27 + * author Ash Searle + * http://hexmen.com/blog/2007/03/printf-sprintf/ + * http://hexmen.com/js/sprintf.js + * The author (Ash Searle) has placed this code in the public domain: + * "This code is unrestricted: you are free to use it however you like." + * + * included jsDate library by Chris Leonello: + * + * Copyright (c) 2010-2011 Chris Leonello + * + * jsDate is currently available for use in all personal or commercial projects + * under both the MIT and GPL version 2.0 licenses. This means that you can + * choose the license that best suits your project and use it accordingly. + * + * jsDate borrows many concepts and ideas from the Date Instance + * Methods by Ken Snyder along with some parts of Ken's actual code. + * + * Ken's origianl Date Instance Methods and copyright notice: + * + * Ken Snyder (ken d snyder at gmail dot com) + * 2008-09-10 + * version 2.0.2 (http://kendsnyder.com/sandbox/date/) + * Creative Commons Attribution License 3.0 (http://creativecommons.org/licenses/by/3.0/) + * + * jqplotToImage function based on Larry Siden's export-jqplot-to-png.js. + * Larry has generously given permission to adapt his code for inclusion + * into jqPlot. + * + * Larry's original code can be found here: + * + * https://github.com/lsiden/export-jqplot-to-png + * + * + */ +(function($){$.jqplot.JSON=window.JSON;if(!window.JSON){$.jqplot.JSON={}}function f(n){return n<10?"0"+n:n}if(typeof Date.prototype.toJSON!=="function"){Date.prototype.toJSON=function(key){return isFinite(this.valueOf())?this.getUTCFullYear()+"-"+f(this.getUTCMonth()+1)+"-"+f(this.getUTCDate())+"T"+f(this.getUTCHours())+":"+f(this.getUTCMinutes())+":"+f(this.getUTCSeconds())+"Z":null};String.prototype.toJSON=Number.prototype.toJSON=Boolean.prototype.toJSON=function(key){return this.valueOf()}}var cx=/[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,escapable=/[\\\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,gap,indent,meta={"\b":"\\b","\t":"\\t","\n":"\\n","\f":"\\f","\r":"\\r",'"':'\\"',"\\":"\\\\"},rep;function quote(string){escapable.lastIndex=0;return escapable.test(string)?'"'+string.replace(escapable,function(a){var c=meta[a];return typeof c==="string"?c:"\\u"+("0000"+a.charCodeAt(0).toString(16)).slice(-4)})+'"':'"'+string+'"'}function str(key,holder){var i,k,v,length,mind=gap,partial,value=holder[key];if(value&&typeof value==="object"&&typeof value.toJSON==="function"){value=value.toJSON(key)}if(typeof rep==="function"){value=rep.call(holder,key,value)}switch(typeof value){case"string":return quote(value);case"number":return isFinite(value)?String(value):"null";case"boolean":case"null":return String(value);case"object":if(!value){return"null"}gap+=indent;partial=[];if(Object.prototype.toString.apply(value)==="[object Array]"){length=value.length;for(i=0;i<length;i+=1){partial[i]=str(i,value)||"null"}v=partial.length===0?"[]":gap?"[\n"+gap+partial.join(",\n"+gap)+"\n"+mind+"]":"["+partial.join(",")+"]";gap=mind;return v}if(rep&&typeof rep==="object"){length=rep.length;for(i=0;i<length;i+=1){k=rep[i];if(typeof k==="string"){v=str(k,value);if(v){partial.push(quote(k)+(gap?": ":":")+v)}}}}else{for(k in value){if(Object.hasOwnProperty.call(value,k)){v=str(k,value);if(v){partial.push(quote(k)+(gap?": ":":")+v)}}}}v=partial.length===0?"{}":gap?"{\n"+gap+partial.join(",\n"+gap)+"\n"+mind+"}":"{"+partial.join(",")+"}";gap=mind;return v}}if(typeof $.jqplot.JSON.stringify!=="function"){$.jqplot.JSON.stringify=function(value,replacer,space){var i;gap="";indent="";if(typeof space==="number"){for(i=0;i<space;i+=1){indent+=" "}}else{if(typeof space==="string"){indent=space}}rep=replacer;if(replacer&&typeof replacer!=="function"&&(typeof replacer!=="object"||typeof replacer.length!=="number")){throw new Error("$.jqplot.JSON.stringify")}return str("",{"":value})}}if(typeof $.jqplot.JSON.parse!=="function"){$.jqplot.JSON.parse=function(text,reviver){var j;function walk(holder,key){var k,v,value=holder[key];if(value&&typeof value==="object"){for(k in value){if(Object.hasOwnProperty.call(value,k)){v=walk(value,k);if(v!==undefined){value[k]=v}else{delete value[k]}}}}return reviver.call(holder,key,value)}text=String(text);cx.lastIndex=0;if(cx.test(text)){text=text.replace(cx,function(a){return"\\u"+("0000"+a.charCodeAt(0).toString(16)).slice(-4)})}if(/^[\],:{}\s]*$/.test(text.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,"@").replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,"]").replace(/(?:^|:|,)(?:\s*\[)+/g,""))){j=eval("("+text+")");return typeof reviver==="function"?walk({"":j},""):j}throw new SyntaxError("$.jqplot.JSON.parse")}}})(jQuery); \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/plugins/jqplot.logAxisRenderer.js b/libreplan-webapp/src/main/webapp/jqplot/plugins/jqplot.logAxisRenderer.js new file mode 100644 index 000000000..1effb058f --- /dev/null +++ b/libreplan-webapp/src/main/webapp/jqplot/plugins/jqplot.logAxisRenderer.js @@ -0,0 +1,528 @@ +/** + * jqPlot + * Pure JavaScript plotting plugin using jQuery + * + * Version: 1.0.0b2_r1012 + * + * Copyright (c) 2009-2011 Chris Leonello + * jqPlot is currently available for use in all personal or commercial projects + * under both the MIT (http://www.opensource.org/licenses/mit-license.php) and GPL + * version 2.0 (http://www.gnu.org/licenses/gpl-2.0.html) licenses. This means that you can + * choose the license that best suits your project and use it accordingly. + * + * Although not required, the author would appreciate an email letting him + * know of any substantial use of jqPlot. You can reach the author at: + * chris at jqplot dot com or see http://www.jqplot.com/info.php . + * + * If you are feeling kind and generous, consider supporting the project by + * making a donation at: http://www.jqplot.com/donate.php . + * + * sprintf functions contained in jqplot.sprintf.js by Ash Searle: + * + * version 2007.04.27 + * author Ash Searle + * http://hexmen.com/blog/2007/03/printf-sprintf/ + * http://hexmen.com/js/sprintf.js + * The author (Ash Searle) has placed this code in the public domain: + * "This code is unrestricted: you are free to use it however you like." + * + */ +(function($) { + /** + * class: $.jqplot.LogAxisRenderer + * A plugin for a jqPlot to render a logarithmic axis. + * + * To use this renderer, include the plugin in your source + * > <script type="text/javascript" language="javascript" src="plugins/jqplot.logAxisRenderer.js"></script> + * + * and supply the appropriate options to your plot + * + * > {axes:{xaxis:{renderer:$.jqplot.LogAxisRenderer}}} + **/ + $.jqplot.LogAxisRenderer = function() { + $.jqplot.LinearAxisRenderer.call(this); + // prop: axisDefaults + // Default properties which will be applied directly to the series. + // + // Group: Properties + // + // Properties + // + // base - the logarithmic base, commonly 2, 10 or Math.E + // tickDistribution - Deprecated. "power" distribution of ticks + // always used. Option has no effect. + this.axisDefaults = { + base : 10, + tickDistribution :'power' + }; + }; + + $.jqplot.LogAxisRenderer.prototype = new $.jqplot.LinearAxisRenderer(); + $.jqplot.LogAxisRenderer.prototype.constructor = $.jqplot.LogAxisRenderer; + + $.jqplot.LogAxisRenderer.prototype.init = function(options) { + // prop: drawBaseline + // True to draw the axis baseline. + this.drawBaseline = true; + // prop: minorTicks + // Number of ticks to add between "major" ticks. + // Major ticks are ticks supplied by user or auto computed. + // Minor ticks cannot be created by user. + this.minorTicks = 'auto'; + this._scalefact = 1.0; + + $.extend(true, this, options); + + this._autoFormatString = '%d'; + this._overrideFormatString = false; + + for (var d in this.renderer.axisDefaults) { + if (this[d] == null) { + this[d] = this.renderer.axisDefaults[d]; + } + } + + this.resetDataBounds(); + }; + + $.jqplot.LogAxisRenderer.prototype.createTicks = function(plot) { + // we're are operating on an axis here + var ticks = this._ticks; + var userTicks = this.ticks; + var name = this.name; + var db = this._dataBounds; + var dim = (this.name.charAt(0) === 'x') ? this._plotDimensions.width : this._plotDimensions.height; + var interval; + var min, max; + var pos1, pos2; + var tt, i; + + var threshold = 30; + // For some reason scalefactor is screwing up ticks. + this._scalefact = (Math.max(dim, threshold+1) - threshold)/300; + + // if we already have ticks, use them. + // ticks must be in order of increasing value. + if (userTicks.length) { + // ticks could be 1D or 2D array of [val, val, ,,,] or [[val, label], [val, label], ...] or mixed + for (i=0; i<userTicks.length; i++){ + var ut = userTicks[i]; + var t = new this.tickRenderer(this.tickOptions); + if (ut.constructor == Array) { + t.value = ut[0]; + t.label = ut[1]; + if (!this.showTicks) { + t.showLabel = false; + t.showMark = false; + } + else if (!this.showTickMarks) { + t.showMark = false; + } + t.setTick(ut[0], this.name); + this._ticks.push(t); + } + + else if ($.isPlainObject(ut)) { + $.extend(true, t, ut); + t.axis = this.name; + this._ticks.push(t); + } + + else { + t.value = ut; + if (!this.showTicks) { + t.showLabel = false; + t.showMark = false; + } + else if (!this.showTickMarks) { + t.showMark = false; + } + t.setTick(ut, this.name); + this._ticks.push(t); + } + } + this.numberTicks = userTicks.length; + this.min = this._ticks[0].value; + this.max = this._ticks[this.numberTicks-1].value; + } + + // we don't have any ticks yet, let's make some! + else if (this.min == null && this.max == null) { + min = db.min * (2 - this.padMin); + max = db.max * this.padMax; + + // if min and max are same, space them out a bit + if (min == max) { + var adj = 0.05; + min = min*(1-adj); + max = max*(1+adj); + } + + // perform some checks + if (this.min != null && this.min <= 0) { + throw('log axis minimum must be greater than 0'); + } + if (this.max != null && this.max <= 0) { + throw('log axis maximum must be greater than 0'); + } + + function findCeil (val) { + var order = Math.pow(10, Math.floor(Math.log(val)/Math.LN10)); + return Math.ceil(val/order) * order; + } + + function findFloor(val) { + var order = Math.pow(10, Math.floor(Math.log(val)/Math.LN10)); + return Math.floor(val/order) * order; + } + + // var range = max - min; + var rmin, rmax; + + // for power distribution, open up range to get a nice power of axis.renderer.base. + // power distribution won't respect the user's min/max settings. + rmin = Math.pow(this.base, Math.floor(Math.log(min)/Math.log(this.base))); + rmax = Math.pow(this.base, Math.ceil(Math.log(max)/Math.log(this.base))); + + // // if min and max are same, space them out a bit + // if (rmin === rmax) { + // var adj = 0.05; + // rmin = rmin*(1-adj); + // rmax = rmax*(1+adj); + // } + + var order = Math.round(Math.log(rmin)/Math.LN10); + + if (this.tickOptions == null || !this.tickOptions.formatString) { + this._overrideFormatString = true; + } + + this.min = rmin; + this.max = rmax; + var range = this.max - this.min; + + var minorTicks = (this.minorTicks === 'auto') ? 0 : this.minorTicks; + var numberTicks; + if (this.numberTicks == null){ + if (dim > 140) { + numberTicks = Math.round(Math.log(this.max/this.min)/Math.log(this.base) + 1); + if (numberTicks < 2) { + numberTicks = 2; + } + if (minorTicks === 0) { + var temp = dim/(numberTicks - 1); + if (temp < 100) { + minorTicks = 0; + } + else if (temp < 190) { + minorTicks = 1; + } + else if (temp < 250) { + minorTicks = 3; + } + else if (temp < 600) { + minorTicks = 4; + } + else { + minorTicks = 9; + } + } + } + else { + numberTicks = 2; + if (minorTicks === 0) { + minorTicks = 1; + } + minorTicks = 0; + } + } + else { + numberTicks = this.numberTicks; + } + + if (order >= 0 && minorTicks !== 3) { + this._autoFormatString = '%d'; + } + // Adjust format string for case with 3 ticks where we'll have like 1, 2.5, 5, 7.5, 10 + else if (order <= 0 && minorTicks === 3) { + var temp = -(order - 1); + this._autoFormatString = '%.'+ Math.abs(order-1) + 'f'; + } + + // Adjust format string for values less than 1. + else if (order < 0) { + var temp = -order; + this._autoFormatString = '%.'+ Math.abs(order) + 'f'; + } + + else { + this._autoFormatString = '%d'; + } + + var to, t, val, tt1, spread, interval; + for (var i=0; i<numberTicks; i++){ + tt = Math.pow(this.base, i - numberTicks + 1) * this.max; + + t = new this.tickRenderer(this.tickOptions); + + if (this._overrideFormatString) { + t.formatString = this._autoFormatString; + } + + if (!this.showTicks) { + t.showLabel = false; + t.showMark = false; + } + else if (!this.showTickMarks) { + t.showMark = false; + } + t.setTick(tt, this.name); + this._ticks.push(t); + + if (minorTicks && i<numberTicks-1) { + tt1 = Math.pow(this.base, i - numberTicks + 2) * this.max; + spread = tt1 - tt; + interval = tt1 / (minorTicks+1); + for (var j=minorTicks-1; j>=0; j--) { + val = tt1-interval*(j+1); + t = new this.tickRenderer(this.tickOptions); + + if (this._overrideFormatString && this._autoFormatString != '') { + t.formatString = this._autoFormatString; + } + if (!this.showTicks) { + t.showLabel = false; + t.showMark = false; + } + else if (!this.showTickMarks) { + t.showMark = false; + } + t.setTick(val, this.name); + this._ticks.push(t); + } + } + } + } + + // min and max are set as would be the case with zooming + else if (this.min != null && this.max != null) { + var opts = $.extend(true, {}, this.tickOptions, {name: this.name, value: null}); + var nt, ti; + // don't have an interval yet, pick one that gives the most + // "round" ticks we can get. + if (this.numberTicks == null && this.tickInterval == null) { + // var threshold = 30; + var tdim = Math.max(dim, threshold+1); + var nttarget = Math.ceil((tdim-threshold)/35 + 1); + + var ret = $.jqplot.LinearTickGenerator.bestConstrainedInterval(this.min, this.max, nttarget); + + this._autoFormatString = ret[3]; + nt = ret[2]; + ti = ret[4]; + + for (var i=0; i<nt; i++) { + opts.value = this.min + i * ti; + t = new this.tickRenderer(opts); + + if (this._overrideFormatString && this._autoFormatString != '') { + t.formatString = this._autoFormatString; + } + if (!this.showTicks) { + t.showLabel = false; + t.showMark = false; + } + else if (!this.showTickMarks) { + t.showMark = false; + } + this._ticks.push(t); + } + } + + // for loose zoom, number ticks and interval are also set. + else if (this.numberTicks != null && this.tickInterval != null) { + nt = this.numberTicks; + for (var i=0; i<nt; i++) { + opts.value = this.min + i * this.tickInterval; + t = new this.tickRenderer(opts); + + if (this._overrideFormatString && this._autoFormatString != '') { + t.formatString = this._autoFormatString; + } + if (!this.showTicks) { + t.showLabel = false; + t.showMark = false; + } + else if (!this.showTickMarks) { + t.showMark = false; + } + this._ticks.push(t); + } + } + } + }; + + $.jqplot.LogAxisRenderer.prototype.pack = function(pos, offsets) { + var lb = parseInt(this.base, 10); + var ticks = this._ticks; + var trans = function (v) { return Math.log(v)/Math.log(lb); }; + var invtrans = function (v) { return Math.pow(Math.E, (Math.log(lb)*v)); }; + var max = trans(this.max); + var min = trans(this.min); + var offmax = offsets.max; + var offmin = offsets.min; + var lshow = (this._label == null) ? false : this._label.show; + + for (var p in pos) { + this._elem.css(p, pos[p]); + } + + this._offsets = offsets; + // pixellength will be + for x axes and - for y axes becasue pixels always measured from top left. + var pixellength = offmax - offmin; + var unitlength = max - min; + + // point to unit and unit to point conversions references to Plot DOM element top left corner. + this.p2u = function(p){ + return invtrans((p - offmin) * unitlength / pixellength + min); + }; + + this.u2p = function(u){ + return (trans(u) - min) * pixellength / unitlength + offmin; + }; + + if (this.name == 'xaxis' || this.name == 'x2axis'){ + this.series_u2p = function(u){ + return (trans(u) - min) * pixellength / unitlength; + }; + this.series_p2u = function(p){ + return invtrans(p * unitlength / pixellength + min); + }; + } + // yaxis is max at top of canvas. + else { + this.series_u2p = function(u){ + return (trans(u) - max) * pixellength / unitlength; + }; + this.series_p2u = function(p){ + return invtrans(p * unitlength / pixellength + max); + }; + } + + if (this.show) { + if (this.name == 'xaxis' || this.name == 'x2axis') { + for (var i=0; i<ticks.length; i++) { + var t = ticks[i]; + if (t.show && t.showLabel) { + var shim; + + if (t.constructor == $.jqplot.CanvasAxisTickRenderer && t.angle) { + switch (t.labelPosition) { + case 'auto': + // position at end + if (t.angle < 0) { + shim = -t.getWidth() + t._textRenderer.height * Math.sin(-t._textRenderer.angle) / 2; + } + // position at start + else { + shim = -t._textRenderer.height * Math.sin(t._textRenderer.angle) / 2; + } + break; + case 'end': + shim = -t.getWidth() + t._textRenderer.height * Math.sin(-t._textRenderer.angle) / 2; + break; + case 'start': + shim = -t._textRenderer.height * Math.sin(t._textRenderer.angle) / 2; + break; + case 'middle': + shim = -t.getWidth()/2 + t._textRenderer.height * Math.sin(-t._textRenderer.angle) / 2; + break; + default: + shim = -t.getWidth()/2 + t._textRenderer.height * Math.sin(-t._textRenderer.angle) / 2; + break; + } + } + else { + shim = -t.getWidth()/2; + } + // var shim = t.getWidth()/2; + var val = this.u2p(t.value) + shim + 'px'; + t._elem.css('left', val); + t.pack(); + } + } + if (lshow) { + var w = this._label._elem.outerWidth(true); + this._label._elem.css('left', offmin + pixellength/2 - w/2 + 'px'); + if (this.name == 'xaxis') { + this._label._elem.css('bottom', '0px'); + } + else { + this._label._elem.css('top', '0px'); + } + this._label.pack(); + } + } + else { + for (var i=0; i<ticks.length; i++) { + var t = ticks[i]; + if (t.show && t.showLabel) { + var shim; + if (t.constructor == $.jqplot.CanvasAxisTickRenderer && t.angle) { + switch (t.labelPosition) { + case 'auto': + // position at end + case 'end': + if (t.angle < 0) { + shim = -t._textRenderer.height * Math.cos(-t._textRenderer.angle) / 2; + } + else { + shim = -t.getHeight() + t._textRenderer.height * Math.cos(t._textRenderer.angle) / 2; + } + break; + case 'start': + if (t.angle > 0) { + shim = -t._textRenderer.height * Math.cos(-t._textRenderer.angle) / 2; + } + else { + shim = -t.getHeight() + t._textRenderer.height * Math.cos(t._textRenderer.angle) / 2; + } + break; + case 'middle': + // if (t.angle > 0) { + // shim = -t.getHeight()/2 + t._textRenderer.height * Math.sin(-t._textRenderer.angle) / 2; + // } + // else { + // shim = -t.getHeight()/2 - t._textRenderer.height * Math.sin(t._textRenderer.angle) / 2; + // } + shim = -t.getHeight()/2; + break; + default: + shim = -t.getHeight()/2; + break; + } + } + else { + shim = -t.getHeight()/2; + } + + var val = this.u2p(t.value) + shim + 'px'; + t._elem.css('top', val); + t.pack(); + } + } + if (lshow) { + var h = this._label._elem.outerHeight(true); + this._label._elem.css('top', offmax - pixellength/2 - h/2 + 'px'); + if (this.name == 'yaxis') { + this._label._elem.css('left', '0px'); + } + else { + this._label._elem.css('right', '0px'); + } + this._label.pack(); + } + } + } + }; +})(jQuery); \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/plugins/jqplot.logAxisRenderer.min.js b/libreplan-webapp/src/main/webapp/jqplot/plugins/jqplot.logAxisRenderer.min.js new file mode 100644 index 000000000..0f254dace --- /dev/null +++ b/libreplan-webapp/src/main/webapp/jqplot/plugins/jqplot.logAxisRenderer.min.js @@ -0,0 +1,57 @@ +/** + * jqPlot + * Pure JavaScript plotting plugin using jQuery + * + * Version: 1.0.0b2_r1012 + * + * Copyright (c) 2009-2011 Chris Leonello + * jqPlot is currently available for use in all personal or commercial projects + * under both the MIT (http://www.opensource.org/licenses/mit-license.php) and GPL + * version 2.0 (http://www.gnu.org/licenses/gpl-2.0.html) licenses. This means that you can + * choose the license that best suits your project and use it accordingly. + * + * Although not required, the author would appreciate an email letting him + * know of any substantial use of jqPlot. You can reach the author at: + * chris at jqplot dot com or see http://www.jqplot.com/info.php . + * + * If you are feeling kind and generous, consider supporting the project by + * making a donation at: http://www.jqplot.com/donate.php . + * + * sprintf functions contained in jqplot.sprintf.js by Ash Searle: + * + * version 2007.04.27 + * author Ash Searle + * http://hexmen.com/blog/2007/03/printf-sprintf/ + * http://hexmen.com/js/sprintf.js + * The author (Ash Searle) has placed this code in the public domain: + * "This code is unrestricted: you are free to use it however you like." + * + * included jsDate library by Chris Leonello: + * + * Copyright (c) 2010-2011 Chris Leonello + * + * jsDate is currently available for use in all personal or commercial projects + * under both the MIT and GPL version 2.0 licenses. This means that you can + * choose the license that best suits your project and use it accordingly. + * + * jsDate borrows many concepts and ideas from the Date Instance + * Methods by Ken Snyder along with some parts of Ken's actual code. + * + * Ken's origianl Date Instance Methods and copyright notice: + * + * Ken Snyder (ken d snyder at gmail dot com) + * 2008-09-10 + * version 2.0.2 (http://kendsnyder.com/sandbox/date/) + * Creative Commons Attribution License 3.0 (http://creativecommons.org/licenses/by/3.0/) + * + * jqplotToImage function based on Larry Siden's export-jqplot-to-png.js. + * Larry has generously given permission to adapt his code for inclusion + * into jqPlot. + * + * Larry's original code can be found here: + * + * https://github.com/lsiden/export-jqplot-to-png + * + * + */ +(function(a){a.jqplot.LogAxisRenderer=function(){a.jqplot.LinearAxisRenderer.call(this);this.axisDefaults={base:10,tickDistribution:"power"}};a.jqplot.LogAxisRenderer.prototype=new a.jqplot.LinearAxisRenderer();a.jqplot.LogAxisRenderer.prototype.constructor=a.jqplot.LogAxisRenderer;a.jqplot.LogAxisRenderer.prototype.init=function(b){this.drawBaseline=true;this.minorTicks="auto";this._scalefact=1;a.extend(true,this,b);this._autoFormatString="%d";this._overrideFormatString=false;for(var c in this.renderer.axisDefaults){if(this[c]==null){this[c]=this.renderer.axisDefaults[c]}}this.resetDataBounds()};a.jqplot.LogAxisRenderer.prototype.createTicks=function(d){var G=this._ticks;var w=this.ticks;var s=this.name;var u=this._dataBounds;var b=(this.name.charAt(0)==="x")?this._plotDimensions.width:this._plotDimensions.height;var k;var N,v;var m,l;var M,K;var g=30;this._scalefact=(Math.max(b,g+1)-g)/300;if(w.length){for(K=0;K<w.length;K++){var A=w[K];var H=new this.tickRenderer(this.tickOptions);if(A.constructor==Array){H.value=A[0];H.label=A[1];if(!this.showTicks){H.showLabel=false;H.showMark=false}else{if(!this.showTickMarks){H.showMark=false}}H.setTick(A[0],this.name);this._ticks.push(H)}else{if(a.isPlainObject(A)){a.extend(true,H,A);H.axis=this.name;this._ticks.push(H)}else{H.value=A;if(!this.showTicks){H.showLabel=false;H.showMark=false}else{if(!this.showTickMarks){H.showMark=false}}H.setTick(A,this.name);this._ticks.push(H)}}}this.numberTicks=w.length;this.min=this._ticks[0].value;this.max=this._ticks[this.numberTicks-1].value}else{if(this.min==null&&this.max==null){N=u.min*(2-this.padMin);v=u.max*this.padMax;if(N==v){var c=0.05;N=N*(1-c);v=v*(1+c)}if(this.min!=null&&this.min<=0){throw ("log axis minimum must be greater than 0")}if(this.max!=null&&this.max<=0){throw ("log axis maximum must be greater than 0")}function f(j){var i=Math.pow(10,Math.floor(Math.log(j)/Math.LN10));return Math.ceil(j/i)*i}function x(j){var i=Math.pow(10,Math.floor(Math.log(j)/Math.LN10));return Math.floor(j/i)*i}var F,r;F=Math.pow(this.base,Math.floor(Math.log(N)/Math.log(this.base)));r=Math.pow(this.base,Math.ceil(Math.log(v)/Math.log(this.base)));var E=Math.round(Math.log(F)/Math.LN10);if(this.tickOptions==null||!this.tickOptions.formatString){this._overrideFormatString=true}this.min=F;this.max=r;var q=this.max-this.min;var C=(this.minorTicks==="auto")?0:this.minorTicks;var h;if(this.numberTicks==null){if(b>140){h=Math.round(Math.log(this.max/this.min)/Math.log(this.base)+1);if(h<2){h=2}if(C===0){var o=b/(h-1);if(o<100){C=0}else{if(o<190){C=1}else{if(o<250){C=3}else{if(o<600){C=4}else{C=9}}}}}}else{h=2;if(C===0){C=1}C=0}}else{h=this.numberTicks}if(E>=0&&C!==3){this._autoFormatString="%d"}else{if(E<=0&&C===3){var o=-(E-1);this._autoFormatString="%."+Math.abs(E-1)+"f"}else{if(E<0){var o=-E;this._autoFormatString="%."+Math.abs(E)+"f"}else{this._autoFormatString="%d"}}}var O,H,z,p,n,k;for(var K=0;K<h;K++){M=Math.pow(this.base,K-h+1)*this.max;H=new this.tickRenderer(this.tickOptions);if(this._overrideFormatString){H.formatString=this._autoFormatString}if(!this.showTicks){H.showLabel=false;H.showMark=false}else{if(!this.showTickMarks){H.showMark=false}}H.setTick(M,this.name);this._ticks.push(H);if(C&&K<h-1){p=Math.pow(this.base,K-h+2)*this.max;n=p-M;k=p/(C+1);for(var J=C-1;J>=0;J--){z=p-k*(J+1);H=new this.tickRenderer(this.tickOptions);if(this._overrideFormatString&&this._autoFormatString!=""){H.formatString=this._autoFormatString}if(!this.showTicks){H.showLabel=false;H.showMark=false}else{if(!this.showTickMarks){H.showMark=false}}H.setTick(z,this.name);this._ticks.push(H)}}}}else{if(this.min!=null&&this.max!=null){var y=a.extend(true,{},this.tickOptions,{name:this.name,value:null});var I,e;if(this.numberTicks==null&&this.tickInterval==null){var D=Math.max(b,g+1);var L=Math.ceil((D-g)/35+1);var B=a.jqplot.LinearTickGenerator.bestConstrainedInterval(this.min,this.max,L);this._autoFormatString=B[3];I=B[2];e=B[4];for(var K=0;K<I;K++){y.value=this.min+K*e;H=new this.tickRenderer(y);if(this._overrideFormatString&&this._autoFormatString!=""){H.formatString=this._autoFormatString}if(!this.showTicks){H.showLabel=false;H.showMark=false}else{if(!this.showTickMarks){H.showMark=false}}this._ticks.push(H)}}else{if(this.numberTicks!=null&&this.tickInterval!=null){I=this.numberTicks;for(var K=0;K<I;K++){y.value=this.min+K*this.tickInterval;H=new this.tickRenderer(y);if(this._overrideFormatString&&this._autoFormatString!=""){H.formatString=this._autoFormatString}if(!this.showTicks){H.showLabel=false;H.showMark=false}else{if(!this.showTickMarks){H.showMark=false}}this._ticks.push(H)}}}}}}};a.jqplot.LogAxisRenderer.prototype.pack=function(f,e){var r=parseInt(this.base,10);var y=this._ticks;var d=function(h){return Math.log(h)/Math.log(r)};var b=function(h){return Math.pow(Math.E,(Math.log(r)*h))};var u=d(this.max);var s=d(this.min);var m=e.max;var k=e.min;var o=(this._label==null)?false:this._label.show;for(var q in f){this._elem.css(q,f[q])}this._offsets=e;var g=m-k;var j=u-s;this.p2u=function(h){return b((h-k)*j/g+s)};this.u2p=function(h){return(d(h)-s)*g/j+k};if(this.name=="xaxis"||this.name=="x2axis"){this.series_u2p=function(h){return(d(h)-s)*g/j};this.series_p2u=function(h){return b(h*j/g+s)}}else{this.series_u2p=function(h){return(d(h)-u)*g/j};this.series_p2u=function(h){return b(h*j/g+u)}}if(this.show){if(this.name=="xaxis"||this.name=="x2axis"){for(var v=0;v<y.length;v++){var n=y[v];if(n.show&&n.showLabel){var c;if(n.constructor==a.jqplot.CanvasAxisTickRenderer&&n.angle){switch(n.labelPosition){case"auto":if(n.angle<0){c=-n.getWidth()+n._textRenderer.height*Math.sin(-n._textRenderer.angle)/2}else{c=-n._textRenderer.height*Math.sin(n._textRenderer.angle)/2}break;case"end":c=-n.getWidth()+n._textRenderer.height*Math.sin(-n._textRenderer.angle)/2;break;case"start":c=-n._textRenderer.height*Math.sin(n._textRenderer.angle)/2;break;case"middle":c=-n.getWidth()/2+n._textRenderer.height*Math.sin(-n._textRenderer.angle)/2;break;default:c=-n.getWidth()/2+n._textRenderer.height*Math.sin(-n._textRenderer.angle)/2;break}}else{c=-n.getWidth()/2}var z=this.u2p(n.value)+c+"px";n._elem.css("left",z);n.pack()}}if(o){var l=this._label._elem.outerWidth(true);this._label._elem.css("left",k+g/2-l/2+"px");if(this.name=="xaxis"){this._label._elem.css("bottom","0px")}else{this._label._elem.css("top","0px")}this._label.pack()}}else{for(var v=0;v<y.length;v++){var n=y[v];if(n.show&&n.showLabel){var c;if(n.constructor==a.jqplot.CanvasAxisTickRenderer&&n.angle){switch(n.labelPosition){case"auto":case"end":if(n.angle<0){c=-n._textRenderer.height*Math.cos(-n._textRenderer.angle)/2}else{c=-n.getHeight()+n._textRenderer.height*Math.cos(n._textRenderer.angle)/2}break;case"start":if(n.angle>0){c=-n._textRenderer.height*Math.cos(-n._textRenderer.angle)/2}else{c=-n.getHeight()+n._textRenderer.height*Math.cos(n._textRenderer.angle)/2}break;case"middle":c=-n.getHeight()/2;break;default:c=-n.getHeight()/2;break}}else{c=-n.getHeight()/2}var z=this.u2p(n.value)+c+"px";n._elem.css("top",z);n.pack()}}if(o){var x=this._label._elem.outerHeight(true);this._label._elem.css("top",m-g/2-x/2+"px");if(this.name=="yaxis"){this._label._elem.css("left","0px")}else{this._label._elem.css("right","0px")}this._label.pack()}}}}})(jQuery); \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/plugins/jqplot.mekkoAxisRenderer.js b/libreplan-webapp/src/main/webapp/jqplot/plugins/jqplot.mekkoAxisRenderer.js new file mode 100644 index 000000000..292256efa --- /dev/null +++ b/libreplan-webapp/src/main/webapp/jqplot/plugins/jqplot.mekkoAxisRenderer.js @@ -0,0 +1,610 @@ +/** + * jqPlot + * Pure JavaScript plotting plugin using jQuery + * + * Version: 1.0.0b2_r1012 + * + * Copyright (c) 2009-2011 Chris Leonello + * jqPlot is currently available for use in all personal or commercial projects + * under both the MIT (http://www.opensource.org/licenses/mit-license.php) and GPL + * version 2.0 (http://www.gnu.org/licenses/gpl-2.0.html) licenses. This means that you can + * choose the license that best suits your project and use it accordingly. + * + * Although not required, the author would appreciate an email letting him + * know of any substantial use of jqPlot. You can reach the author at: + * chris at jqplot dot com or see http://www.jqplot.com/info.php . + * + * If you are feeling kind and generous, consider supporting the project by + * making a donation at: http://www.jqplot.com/donate.php . + * + * sprintf functions contained in jqplot.sprintf.js by Ash Searle: + * + * version 2007.04.27 + * author Ash Searle + * http://hexmen.com/blog/2007/03/printf-sprintf/ + * http://hexmen.com/js/sprintf.js + * The author (Ash Searle) has placed this code in the public domain: + * "This code is unrestricted: you are free to use it however you like." + * + */ +(function($) { + // class: $.jqplot.MekkoAxisRenderer + // An axis renderer for a Mekko chart. + // Should be used with a Mekko chart where the mekkoRenderer is used on the series. + // Displays the Y axis as a range from 0 to 1 (0 to 100%) and the x axis with a tick + // for each series scaled to the sum of all the y values. + $.jqplot.MekkoAxisRenderer = function() { + }; + + // called with scope of axis object. + $.jqplot.MekkoAxisRenderer.prototype.init = function(options){ + // prop: tickMode + // How to space the ticks on the axis. + // 'bar' will place a tick at the width of each bar. + // This is the default for the x axis. + // 'even' will place ticks at even intervals. This is + // the default for x2 axis and y axis. y axis cannot be changed. + this.tickMode; + // prop: barLabelRenderer + // renderer to use to draw labels under each bar. + this.barLabelRenderer = $.jqplot.AxisLabelRenderer; + // prop: barLabels + // array of labels to put under each bar. + this.barLabels = this.barLabels || []; + // prop: barLabelOptions + // options object to pass to the bar label renderer. + this.barLabelOptions = {}; + this.tickOptions = $.extend(true, {showGridline:false}, this.tickOptions); + this._barLabels = []; + $.extend(true, this, options); + if (this.name == 'yaxis') { + this.tickOptions.formatString = this.tickOptions.formatString || "%d\%"; + } + var db = this._dataBounds; + db.min = 0; + // for y axes, scale always go from 0 to 1 (0 to 100%) + if (this.name == 'yaxis' || this.name == 'y2axis') { + db.max = 100; + this.tickMode = 'even'; + } + // For x axes, scale goes from 0 to sum of all y values. + else if (this.name == 'xaxis'){ + this.tickMode = (this.tickMode == null) ? 'bar' : this.tickMode; + for (var i=0; i<this._series.length; i++) { + db.max += this._series[i]._sumy; + } + } + else if (this.name == 'x2axis'){ + this.tickMode = (this.tickMode == null) ? 'even' : this.tickMode; + for (var i=0; i<this._series.length; i++) { + db.max += this._series[i]._sumy; + } + } + }; + + // called with scope of axis + $.jqplot.MekkoAxisRenderer.prototype.draw = function(ctx, plot) { + if (this.show) { + // populate the axis label and value properties. + // createTicks is a method on the renderer, but + // call it within the scope of the axis. + this.renderer.createTicks.call(this); + // fill a div with axes labels in the right direction. + // Need to pregenerate each axis to get it's bounds and + // position it and the labels correctly on the plot. + var dim=0; + var temp; + + var elem = document.createElement('div'); + this._elem = $(elem); + this._elem.addClass('jqplot-axis jqplot-'+this.name); + this._elem.css('position', 'absolute'); + elem = null; + + if (this.name == 'xaxis' || this.name == 'x2axis') { + this._elem.width(this._plotDimensions.width); + } + else { + this._elem.height(this._plotDimensions.height); + } + + // draw the axis label + // create a _label object. + this.labelOptions.axis = this.name; + this._label = new this.labelRenderer(this.labelOptions); + if (this._label.show) { + this._elem.append(this._label.draw(ctx)); + } + + var t, tick, elem; + if (this.showTicks) { + t = this._ticks; + for (var i=0; i<t.length; i++) { + tick = t[i]; + if (tick.showLabel && (!tick.isMinorTick || this.showMinorTicks)) { + this._elem.append(tick.draw(ctx)); + } + } + } + + // draw the series labels + for (i=0; i<this.barLabels.length; i++) { + this.barLabelOptions.axis = this.name; + this.barLabelOptions.label = this.barLabels[i]; + this._barLabels.push(new this.barLabelRenderer(this.barLabelOptions)); + if (this.tickMode != 'bar') { + this._barLabels[i].show = false; + } + if (this._barLabels[i].show) { + var elem = this._barLabels[i].draw(ctx, plot); + elem.removeClass('jqplot-'+this.name+'-label'); + elem.addClass('jqplot-'+this.name+'-tick'); + elem.addClass('jqplot-mekko-barLabel'); + elem.appendTo(this._elem); + elem = null; + } + } + + } + return this._elem; + }; + + // called with scope of an axis + $.jqplot.MekkoAxisRenderer.prototype.reset = function() { + this.min = this._min; + this.max = this._max; + this.tickInterval = this._tickInterval; + this.numberTicks = this._numberTicks; + // this._ticks = this.__ticks; + }; + + // called with scope of axis + $.jqplot.MekkoAxisRenderer.prototype.set = function() { + var dim = 0; + var temp; + var w = 0; + var h = 0; + var lshow = (this._label == null) ? false : this._label.show; + if (this.show && this.showTicks) { + var t = this._ticks; + for (var i=0; i<t.length; i++) { + var tick = t[i]; + if (tick.showLabel && (!tick.isMinorTick || this.showMinorTicks)) { + if (this.name == 'xaxis' || this.name == 'x2axis') { + temp = tick._elem.outerHeight(true); + } + else { + temp = tick._elem.outerWidth(true); + } + if (temp > dim) { + dim = temp; + } + } + } + + if (lshow) { + w = this._label._elem.outerWidth(true); + h = this._label._elem.outerHeight(true); + } + if (this.name == 'xaxis') { + dim = dim + h; + this._elem.css({'height':dim+'px', left:'0px', bottom:'0px'}); + } + else if (this.name == 'x2axis') { + dim = dim + h; + this._elem.css({'height':dim+'px', left:'0px', top:'0px'}); + } + else if (this.name == 'yaxis') { + dim = dim + w; + this._elem.css({'width':dim+'px', left:'0px', top:'0px'}); + if (lshow && this._label.constructor == $.jqplot.AxisLabelRenderer) { + this._label._elem.css('width', w+'px'); + } + } + else { + dim = dim + w; + this._elem.css({'width':dim+'px', right:'0px', top:'0px'}); + if (lshow && this._label.constructor == $.jqplot.AxisLabelRenderer) { + this._label._elem.css('width', w+'px'); + } + } + } + }; + + // called with scope of axis + $.jqplot.MekkoAxisRenderer.prototype.createTicks = function() { + // we're are operating on an axis here + var ticks = this._ticks; + var userTicks = this.ticks; + var name = this.name; + // databounds were set on axis initialization. + var db = this._dataBounds; + var dim, interval; + var min, max; + var pos1, pos2; + var t, tt, i, j; + + // if we already have ticks, use them. + // ticks must be in order of increasing value. + + if (userTicks.length) { + // ticks could be 1D or 2D array of [val, val, ,,,] or [[val, label], [val, label], ...] or mixed + for (i=0; i<userTicks.length; i++){ + var ut = userTicks[i]; + var t = new this.tickRenderer(this.tickOptions); + if (ut.constructor == Array) { + t.value = ut[0]; + t.label = ut[1]; + if (!this.showTicks) { + t.showLabel = false; + t.showMark = false; + } + else if (!this.showTickMarks) { + t.showMark = false; + } + t.setTick(ut[0], this.name); + this._ticks.push(t); + } + + else { + t.value = ut; + if (!this.showTicks) { + t.showLabel = false; + t.showMark = false; + } + else if (!this.showTickMarks) { + t.showMark = false; + } + t.setTick(ut, this.name); + this._ticks.push(t); + } + } + this.numberTicks = userTicks.length; + this.min = this._ticks[0].value; + this.max = this._ticks[this.numberTicks-1].value; + this.tickInterval = (this.max - this.min) / (this.numberTicks - 1); + } + + // we don't have any ticks yet, let's make some! + else { + if (name == 'xaxis' || name == 'x2axis') { + dim = this._plotDimensions.width; + } + else { + dim = this._plotDimensions.height; + } + + // if min, max and number of ticks specified, user can't specify interval. + if (this.min != null && this.max != null && this.numberTicks != null) { + this.tickInterval = null; + } + + min = (this.min != null) ? this.min : db.min; + max = (this.max != null) ? this.max : db.max; + + // if min and max are same, space them out a bit.+ + if (min == max) { + var adj = 0.05; + if (min > 0) { + adj = Math.max(Math.log(min)/Math.LN10, 0.05); + } + min -= adj; + max += adj; + } + + var range = max - min; + var rmin, rmax; + var temp, prev, curr; + var ynumticks = [3,5,6,11,21]; + + // yaxis divide ticks in nice intervals from 0 to 1. + if (this.name == 'yaxis' || this.name == 'y2axis') { + this.min = 0; + this.max = 100; + // user didn't specify number of ticks. + if (!this.numberTicks){ + if (this.tickInterval) { + this.numberTicks = 3 + Math.ceil(range / this.tickInterval); + } + else { + temp = 2 + Math.ceil((dim-(this.tickSpacing-1))/this.tickSpacing); + for (i=0; i<ynumticks.length; i++) { + curr = temp/ynumticks[i]; + if (curr == 1) { + this.numberTicks = ynumticks[i]; + break; + } + else if (curr > 1) { + prev = curr; + continue; + } + else if (curr < 1) { + // was prev or is curr closer to one? + if (Math.abs(prev - 1) < Math.abs(curr - 1)) { + this.numberTicks = ynumticks[i-1]; + break; + } + else { + this.numberTicks = ynumticks[i]; + break; + } + } + else if (i == ynumticks.length -1) { + this.numberTicks = ynumticks[i]; + } + } + this.tickInterval = range / (this.numberTicks - 1); + } + } + + // user did specify number of ticks. + else { + this.tickInterval = range / (this.numberTicks - 1); + } + + for (var i=0; i<this.numberTicks; i++){ + tt = this.min + i * this.tickInterval; + t = new this.tickRenderer(this.tickOptions); + // var t = new $.jqplot.AxisTickRenderer(this.tickOptions); + if (!this.showTicks) { + t.showLabel = false; + t.showMark = false; + } + else if (!this.showTickMarks) { + t.showMark = false; + } + t.setTick(tt, this.name); + this._ticks.push(t); + } + } + + // for x axes, have number ot ticks equal to number of series and ticks placed + // at sum of y values for each series. + else if (this.tickMode == 'bar') { + this.min = 0; + this.numberTicks = this._series.length + 1; + t = new this.tickRenderer(this.tickOptions); + if (!this.showTicks) { + t.showLabel = false; + t.showMark = false; + } + else if (!this.showTickMarks) { + t.showMark = false; + } + t.setTick(0, this.name); + this._ticks.push(t); + + temp = 0; + + for (i=1; i<this.numberTicks; i++){ + temp += this._series[i-1]._sumy; + t = new this.tickRenderer(this.tickOptions); + if (!this.showTicks) { + t.showLabel = false; + t.showMark = false; + } + else if (!this.showTickMarks) { + t.showMark = false; + } + t.setTick(temp, this.name); + this._ticks.push(t); + } + this.max = this.max || temp; + + // if user specified a max and it is greater than sum, add a tick + if (this.max > temp) { + t = new this.tickRenderer(this.tickOptions); + if (!this.showTicks) { + t.showLabel = false; + t.showMark = false; + } + else if (!this.showTickMarks) { + t.showMark = false; + } + t.setTick(this.max, this.name); + this._ticks.push(t); + + } + } + + else if (this.tickMode == 'even') { + this.min = 0; + this.max = this.max || db.max; + // get a desired number of ticks + var nt = 2 + Math.ceil((dim-(this.tickSpacing-1))/this.tickSpacing); + range = this.max - this.min; + this.numberTicks = nt; + this.tickInterval = range / (this.numberTicks - 1); + + for (i=0; i<this.numberTicks; i++){ + tt = this.min + i * this.tickInterval; + t = new this.tickRenderer(this.tickOptions); + // var t = new $.jqplot.AxisTickRenderer(this.tickOptions); + if (!this.showTicks) { + t.showLabel = false; + t.showMark = false; + } + else if (!this.showTickMarks) { + t.showMark = false; + } + t.setTick(tt, this.name); + this._ticks.push(t); + } + + } + } + }; + + // called with scope of axis + $.jqplot.MekkoAxisRenderer.prototype.pack = function(pos, offsets) { + var ticks = this._ticks; + var max = this.max; + var min = this.min; + var offmax = offsets.max; + var offmin = offsets.min; + var lshow = (this._label == null) ? false : this._label.show; + + for (var p in pos) { + this._elem.css(p, pos[p]); + } + + this._offsets = offsets; + // pixellength will be + for x axes and - for y axes becasue pixels always measured from top left. + var pixellength = offmax - offmin; + var unitlength = max - min; + + // point to unit and unit to point conversions references to Plot DOM element top left corner. + this.p2u = function(p){ + return (p - offmin) * unitlength / pixellength + min; + }; + + this.u2p = function(u){ + return (u - min) * pixellength / unitlength + offmin; + }; + + if (this.name == 'xaxis' || this.name == 'x2axis'){ + this.series_u2p = function(u){ + return (u - min) * pixellength / unitlength; + }; + this.series_p2u = function(p){ + return p * unitlength / pixellength + min; + }; + } + + else { + this.series_u2p = function(u){ + return (u - max) * pixellength / unitlength; + }; + this.series_p2u = function(p){ + return p * unitlength / pixellength + max; + }; + } + + if (this.show) { + if (this.name == 'xaxis' || this.name == 'x2axis') { + for (var i=0; i<ticks.length; i++) { + var t = ticks[i]; + if (t.show && t.showLabel) { + var shim; + + if (t.constructor == $.jqplot.CanvasAxisTickRenderer && t.angle) { + // will need to adjust auto positioning based on which axis this is. + var temp = (this.name == 'xaxis') ? 1 : -1; + switch (t.labelPosition) { + case 'auto': + // position at end + if (temp * t.angle < 0) { + shim = -t.getWidth() + t._textRenderer.height * Math.sin(-t._textRenderer.angle) / 2; + } + // position at start + else { + shim = -t._textRenderer.height * Math.sin(t._textRenderer.angle) / 2; + } + break; + case 'end': + shim = -t.getWidth() + t._textRenderer.height * Math.sin(-t._textRenderer.angle) / 2; + break; + case 'start': + shim = -t._textRenderer.height * Math.sin(t._textRenderer.angle) / 2; + break; + case 'middle': + shim = -t.getWidth()/2 + t._textRenderer.height * Math.sin(-t._textRenderer.angle) / 2; + break; + default: + shim = -t.getWidth()/2 + t._textRenderer.height * Math.sin(-t._textRenderer.angle) / 2; + break; + } + } + else { + shim = -t.getWidth()/2; + } + var val = this.u2p(t.value) + shim + 'px'; + t._elem.css('left', val); + t.pack(); + } + } + var w; + if (lshow) { + w = this._label._elem.outerWidth(true); + this._label._elem.css('left', offmin + pixellength/2 - w/2 + 'px'); + if (this.name == 'xaxis') { + this._label._elem.css('bottom', '0px'); + } + else { + this._label._elem.css('top', '0px'); + } + this._label.pack(); + } + // now show the labels under the bars. + var b, l, r; + for (var i=0; i<this.barLabels.length; i++) { + b = this._barLabels[i]; + if (b.show) { + w = b.getWidth(); + l = this._ticks[i].getLeft() + this._ticks[i].getWidth(); + r = this._ticks[i+1].getLeft(); + b._elem.css('left', (r+l-w)/2+'px'); + b._elem.css('top', this._ticks[i]._elem.css('top')); + b.pack(); + } + } + } + else { + for (var i=0; i<ticks.length; i++) { + var t = ticks[i]; + if (t.show && t.showLabel) { + var shim; + if (t.constructor == $.jqplot.CanvasAxisTickRenderer && t.angle) { + // will need to adjust auto positioning based on which axis this is. + var temp = (this.name == 'yaxis') ? 1 : -1; + switch (t.labelPosition) { + case 'auto': + // position at end + case 'end': + if (temp * t.angle < 0) { + shim = -t._textRenderer.height * Math.cos(-t._textRenderer.angle) / 2; + } + else { + shim = -t.getHeight() + t._textRenderer.height * Math.cos(t._textRenderer.angle) / 2; + } + break; + case 'start': + if (t.angle > 0) { + shim = -t._textRenderer.height * Math.cos(-t._textRenderer.angle) / 2; + } + else { + shim = -t.getHeight() + t._textRenderer.height * Math.cos(t._textRenderer.angle) / 2; + } + break; + case 'middle': + shim = -t.getHeight()/2; + break; + default: + shim = -t.getHeight()/2; + break; + } + } + else { + shim = -t.getHeight()/2; + } + + var val = this.u2p(t.value) + shim + 'px'; + t._elem.css('top', val); + t.pack(); + } + } + if (lshow) { + var h = this._label._elem.outerHeight(true); + this._label._elem.css('top', offmax - pixellength/2 - h/2 + 'px'); + if (this.name == 'yaxis') { + this._label._elem.css('left', '0px'); + } + else { + this._label._elem.css('right', '0px'); + } + this._label.pack(); + } + } + } + }; +})(jQuery); diff --git a/libreplan-webapp/src/main/webapp/jqplot/plugins/jqplot.mekkoAxisRenderer.min.js b/libreplan-webapp/src/main/webapp/jqplot/plugins/jqplot.mekkoAxisRenderer.min.js new file mode 100644 index 000000000..8eac794d9 --- /dev/null +++ b/libreplan-webapp/src/main/webapp/jqplot/plugins/jqplot.mekkoAxisRenderer.min.js @@ -0,0 +1,57 @@ +/** + * jqPlot + * Pure JavaScript plotting plugin using jQuery + * + * Version: 1.0.0b2_r1012 + * + * Copyright (c) 2009-2011 Chris Leonello + * jqPlot is currently available for use in all personal or commercial projects + * under both the MIT (http://www.opensource.org/licenses/mit-license.php) and GPL + * version 2.0 (http://www.gnu.org/licenses/gpl-2.0.html) licenses. This means that you can + * choose the license that best suits your project and use it accordingly. + * + * Although not required, the author would appreciate an email letting him + * know of any substantial use of jqPlot. You can reach the author at: + * chris at jqplot dot com or see http://www.jqplot.com/info.php . + * + * If you are feeling kind and generous, consider supporting the project by + * making a donation at: http://www.jqplot.com/donate.php . + * + * sprintf functions contained in jqplot.sprintf.js by Ash Searle: + * + * version 2007.04.27 + * author Ash Searle + * http://hexmen.com/blog/2007/03/printf-sprintf/ + * http://hexmen.com/js/sprintf.js + * The author (Ash Searle) has placed this code in the public domain: + * "This code is unrestricted: you are free to use it however you like." + * + * included jsDate library by Chris Leonello: + * + * Copyright (c) 2010-2011 Chris Leonello + * + * jsDate is currently available for use in all personal or commercial projects + * under both the MIT and GPL version 2.0 licenses. This means that you can + * choose the license that best suits your project and use it accordingly. + * + * jsDate borrows many concepts and ideas from the Date Instance + * Methods by Ken Snyder along with some parts of Ken's actual code. + * + * Ken's origianl Date Instance Methods and copyright notice: + * + * Ken Snyder (ken d snyder at gmail dot com) + * 2008-09-10 + * version 2.0.2 (http://kendsnyder.com/sandbox/date/) + * Creative Commons Attribution License 3.0 (http://creativecommons.org/licenses/by/3.0/) + * + * jqplotToImage function based on Larry Siden's export-jqplot-to-png.js. + * Larry has generously given permission to adapt his code for inclusion + * into jqPlot. + * + * Larry's original code can be found here: + * + * https://github.com/lsiden/export-jqplot-to-png + * + * + */ +(function(a){a.jqplot.MekkoAxisRenderer=function(){};a.jqplot.MekkoAxisRenderer.prototype.init=function(c){this.tickMode;this.barLabelRenderer=a.jqplot.AxisLabelRenderer;this.barLabels=this.barLabels||[];this.barLabelOptions={};this.tickOptions=a.extend(true,{showGridline:false},this.tickOptions);this._barLabels=[];a.extend(true,this,c);if(this.name=="yaxis"){this.tickOptions.formatString=this.tickOptions.formatString||"%d%"}var b=this._dataBounds;b.min=0;if(this.name=="yaxis"||this.name=="y2axis"){b.max=100;this.tickMode="even"}else{if(this.name=="xaxis"){this.tickMode=(this.tickMode==null)?"bar":this.tickMode;for(var d=0;d<this._series.length;d++){b.max+=this._series[d]._sumy}}else{if(this.name=="x2axis"){this.tickMode=(this.tickMode==null)?"even":this.tickMode;for(var d=0;d<this._series.length;d++){b.max+=this._series[d]._sumy}}}}};a.jqplot.MekkoAxisRenderer.prototype.draw=function(b,j){if(this.show){this.renderer.createTicks.call(this);var h=0;var c;var g=document.createElement("div");this._elem=a(g);this._elem.addClass("jqplot-axis jqplot-"+this.name);this._elem.css("position","absolute");g=null;if(this.name=="xaxis"||this.name=="x2axis"){this._elem.width(this._plotDimensions.width)}else{this._elem.height(this._plotDimensions.height)}this.labelOptions.axis=this.name;this._label=new this.labelRenderer(this.labelOptions);if(this._label.show){this._elem.append(this._label.draw(b))}var f,e,g;if(this.showTicks){f=this._ticks;for(var d=0;d<f.length;d++){e=f[d];if(e.showLabel&&(!e.isMinorTick||this.showMinorTicks)){this._elem.append(e.draw(b))}}}for(d=0;d<this.barLabels.length;d++){this.barLabelOptions.axis=this.name;this.barLabelOptions.label=this.barLabels[d];this._barLabels.push(new this.barLabelRenderer(this.barLabelOptions));if(this.tickMode!="bar"){this._barLabels[d].show=false}if(this._barLabels[d].show){var g=this._barLabels[d].draw(b,j);g.removeClass("jqplot-"+this.name+"-label");g.addClass("jqplot-"+this.name+"-tick");g.addClass("jqplot-mekko-barLabel");g.appendTo(this._elem);g=null}}}return this._elem};a.jqplot.MekkoAxisRenderer.prototype.reset=function(){this.min=this._min;this.max=this._max;this.tickInterval=this._tickInterval;this.numberTicks=this._numberTicks};a.jqplot.MekkoAxisRenderer.prototype.set=function(){var k=0;var d;var c=0;var j=0;var b=(this._label==null)?false:this._label.show;if(this.show&&this.showTicks){var g=this._ticks;for(var f=0;f<g.length;f++){var e=g[f];if(e.showLabel&&(!e.isMinorTick||this.showMinorTicks)){if(this.name=="xaxis"||this.name=="x2axis"){d=e._elem.outerHeight(true)}else{d=e._elem.outerWidth(true)}if(d>k){k=d}}}if(b){c=this._label._elem.outerWidth(true);j=this._label._elem.outerHeight(true)}if(this.name=="xaxis"){k=k+j;this._elem.css({height:k+"px",left:"0px",bottom:"0px"})}else{if(this.name=="x2axis"){k=k+j;this._elem.css({height:k+"px",left:"0px",top:"0px"})}else{if(this.name=="yaxis"){k=k+c;this._elem.css({width:k+"px",left:"0px",top:"0px"});if(b&&this._label.constructor==a.jqplot.AxisLabelRenderer){this._label._elem.css("width",c+"px")}}else{k=k+c;this._elem.css({width:k+"px",right:"0px",top:"0px"});if(b&&this._label.constructor==a.jqplot.AxisLabelRenderer){this._label._elem.css("width",c+"px")}}}}}};a.jqplot.MekkoAxisRenderer.prototype.createTicks=function(){var z=this._ticks;var w=this.ticks;var B=this.name;var y=this._dataBounds;var p,x;var n,r;var d,c;var h,b,s,q;if(w.length){for(s=0;s<w.length;s++){var e=w[s];var h=new this.tickRenderer(this.tickOptions);if(e.constructor==Array){h.value=e[0];h.label=e[1];if(!this.showTicks){h.showLabel=false;h.showMark=false}else{if(!this.showTickMarks){h.showMark=false}}h.setTick(e[0],this.name);this._ticks.push(h)}else{h.value=e;if(!this.showTicks){h.showLabel=false;h.showMark=false}else{if(!this.showTickMarks){h.showMark=false}}h.setTick(e,this.name);this._ticks.push(h)}}this.numberTicks=w.length;this.min=this._ticks[0].value;this.max=this._ticks[this.numberTicks-1].value;this.tickInterval=(this.max-this.min)/(this.numberTicks-1)}else{if(B=="xaxis"||B=="x2axis"){p=this._plotDimensions.width}else{p=this._plotDimensions.height}if(this.min!=null&&this.max!=null&&this.numberTicks!=null){this.tickInterval=null}n=(this.min!=null)?this.min:y.min;r=(this.max!=null)?this.max:y.max;if(n==r){var g=0.05;if(n>0){g=Math.max(Math.log(n)/Math.LN10,0.05)}n-=g;r+=g}var k=r-n;var m,o;var v,l,u;var f=[3,5,6,11,21];if(this.name=="yaxis"||this.name=="y2axis"){this.min=0;this.max=100;if(!this.numberTicks){if(this.tickInterval){this.numberTicks=3+Math.ceil(k/this.tickInterval)}else{v=2+Math.ceil((p-(this.tickSpacing-1))/this.tickSpacing);for(s=0;s<f.length;s++){u=v/f[s];if(u==1){this.numberTicks=f[s];break}else{if(u>1){l=u;continue}else{if(u<1){if(Math.abs(l-1)<Math.abs(u-1)){this.numberTicks=f[s-1];break}else{this.numberTicks=f[s];break}}else{if(s==f.length-1){this.numberTicks=f[s]}}}}}this.tickInterval=k/(this.numberTicks-1)}}else{this.tickInterval=k/(this.numberTicks-1)}for(var s=0;s<this.numberTicks;s++){b=this.min+s*this.tickInterval;h=new this.tickRenderer(this.tickOptions);if(!this.showTicks){h.showLabel=false;h.showMark=false}else{if(!this.showTickMarks){h.showMark=false}}h.setTick(b,this.name);this._ticks.push(h)}}else{if(this.tickMode=="bar"){this.min=0;this.numberTicks=this._series.length+1;h=new this.tickRenderer(this.tickOptions);if(!this.showTicks){h.showLabel=false;h.showMark=false}else{if(!this.showTickMarks){h.showMark=false}}h.setTick(0,this.name);this._ticks.push(h);v=0;for(s=1;s<this.numberTicks;s++){v+=this._series[s-1]._sumy;h=new this.tickRenderer(this.tickOptions);if(!this.showTicks){h.showLabel=false;h.showMark=false}else{if(!this.showTickMarks){h.showMark=false}}h.setTick(v,this.name);this._ticks.push(h)}this.max=this.max||v;if(this.max>v){h=new this.tickRenderer(this.tickOptions);if(!this.showTicks){h.showLabel=false;h.showMark=false}else{if(!this.showTickMarks){h.showMark=false}}h.setTick(this.max,this.name);this._ticks.push(h)}}else{if(this.tickMode=="even"){this.min=0;this.max=this.max||y.max;var A=2+Math.ceil((p-(this.tickSpacing-1))/this.tickSpacing);k=this.max-this.min;this.numberTicks=A;this.tickInterval=k/(this.numberTicks-1);for(s=0;s<this.numberTicks;s++){b=this.min+s*this.tickInterval;h=new this.tickRenderer(this.tickOptions);if(!this.showTicks){h.showLabel=false;h.showMark=false}else{if(!this.showTickMarks){h.showMark=false}}h.setTick(b,this.name);this._ticks.push(h)}}}}}};a.jqplot.MekkoAxisRenderer.prototype.pack=function(e,d){var C=this._ticks;var x=this.max;var v=this.min;var m=d.max;var j=d.min;var o=(this._label==null)?false:this._label.show;for(var s in e){this._elem.css(s,e[s])}this._offsets=d;var f=m-j;var g=x-v;this.p2u=function(b){return(b-j)*g/f+v};this.u2p=function(b){return(b-v)*f/g+j};if(this.name=="xaxis"||this.name=="x2axis"){this.series_u2p=function(b){return(b-v)*f/g};this.series_p2u=function(b){return b*g/f+v}}else{this.series_u2p=function(b){return(b-x)*f/g};this.series_p2u=function(b){return b*g/f+x}}if(this.show){if(this.name=="xaxis"||this.name=="x2axis"){for(var y=0;y<C.length;y++){var n=C[y];if(n.show&&n.showLabel){var c;if(n.constructor==a.jqplot.CanvasAxisTickRenderer&&n.angle){var A=(this.name=="xaxis")?1:-1;switch(n.labelPosition){case"auto":if(A*n.angle<0){c=-n.getWidth()+n._textRenderer.height*Math.sin(-n._textRenderer.angle)/2}else{c=-n._textRenderer.height*Math.sin(n._textRenderer.angle)/2}break;case"end":c=-n.getWidth()+n._textRenderer.height*Math.sin(-n._textRenderer.angle)/2;break;case"start":c=-n._textRenderer.height*Math.sin(n._textRenderer.angle)/2;break;case"middle":c=-n.getWidth()/2+n._textRenderer.height*Math.sin(-n._textRenderer.angle)/2;break;default:c=-n.getWidth()/2+n._textRenderer.height*Math.sin(-n._textRenderer.angle)/2;break}}else{c=-n.getWidth()/2}var D=this.u2p(n.value)+c+"px";n._elem.css("left",D);n.pack()}}var k;if(o){k=this._label._elem.outerWidth(true);this._label._elem.css("left",j+f/2-k/2+"px");if(this.name=="xaxis"){this._label._elem.css("bottom","0px")}else{this._label._elem.css("top","0px")}this._label.pack()}var B,u,q;for(var y=0;y<this.barLabels.length;y++){B=this._barLabels[y];if(B.show){k=B.getWidth();u=this._ticks[y].getLeft()+this._ticks[y].getWidth();q=this._ticks[y+1].getLeft();B._elem.css("left",(q+u-k)/2+"px");B._elem.css("top",this._ticks[y]._elem.css("top"));B.pack()}}}else{for(var y=0;y<C.length;y++){var n=C[y];if(n.show&&n.showLabel){var c;if(n.constructor==a.jqplot.CanvasAxisTickRenderer&&n.angle){var A=(this.name=="yaxis")?1:-1;switch(n.labelPosition){case"auto":case"end":if(A*n.angle<0){c=-n._textRenderer.height*Math.cos(-n._textRenderer.angle)/2}else{c=-n.getHeight()+n._textRenderer.height*Math.cos(n._textRenderer.angle)/2}break;case"start":if(n.angle>0){c=-n._textRenderer.height*Math.cos(-n._textRenderer.angle)/2}else{c=-n.getHeight()+n._textRenderer.height*Math.cos(n._textRenderer.angle)/2}break;case"middle":c=-n.getHeight()/2;break;default:c=-n.getHeight()/2;break}}else{c=-n.getHeight()/2}var D=this.u2p(n.value)+c+"px";n._elem.css("top",D);n.pack()}}if(o){var z=this._label._elem.outerHeight(true);this._label._elem.css("top",m-f/2-z/2+"px");if(this.name=="yaxis"){this._label._elem.css("left","0px")}else{this._label._elem.css("right","0px")}this._label.pack()}}}}})(jQuery); \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/plugins/jqplot.mekkoRenderer.js b/libreplan-webapp/src/main/webapp/jqplot/plugins/jqplot.mekkoRenderer.js new file mode 100644 index 000000000..9f1a76de2 --- /dev/null +++ b/libreplan-webapp/src/main/webapp/jqplot/plugins/jqplot.mekkoRenderer.js @@ -0,0 +1,436 @@ +/** + * jqPlot + * Pure JavaScript plotting plugin using jQuery + * + * Version: 1.0.0b2_r1012 + * + * Copyright (c) 2009-2011 Chris Leonello + * jqPlot is currently available for use in all personal or commercial projects + * under both the MIT (http://www.opensource.org/licenses/mit-license.php) and GPL + * version 2.0 (http://www.gnu.org/licenses/gpl-2.0.html) licenses. This means that you can + * choose the license that best suits your project and use it accordingly. + * + * Although not required, the author would appreciate an email letting him + * know of any substantial use of jqPlot. You can reach the author at: + * chris at jqplot dot com or see http://www.jqplot.com/info.php . + * + * If you are feeling kind and generous, consider supporting the project by + * making a donation at: http://www.jqplot.com/donate.php . + * + * sprintf functions contained in jqplot.sprintf.js by Ash Searle: + * + * version 2007.04.27 + * author Ash Searle + * http://hexmen.com/blog/2007/03/printf-sprintf/ + * http://hexmen.com/js/sprintf.js + * The author (Ash Searle) has placed this code in the public domain: + * "This code is unrestricted: you are free to use it however you like." + * + */ +(function($) { + /** + * Class: $.jqplot.MekkoRenderer + * Draws a Mekko style chart which shows 3 dimensional data on a 2 dimensional graph. + * the <$.jqplot.MekkoAxisRenderer> should be used with mekko charts. The mekko renderer + * overrides the default legend renderer with it's own $.jqplot.MekkoLegendRenderer + * which allows more flexibility to specify number of rows and columns in the legend. + * + * Data is specified per bar in the chart. You can specify data as an array of y values, or as + * an array of [label, value] pairs. Note that labels are used only on the first series. + * Labels on subsequent series are ignored: + * + * > bar1 = [['shirts', 8],['hats', 14],['shoes', 6],['gloves', 16],['dolls', 12]]; + * > bar2 = [15,6,9,13,6]; + * > bar3 = [['grumpy',4],['sneezy',2],['happy',7],['sleepy',9],['doc',7]]; + * + * If you want to place labels for each bar under the axis, you use the barLabels option on + * the axes. The bar labels can be styled with the ".jqplot-mekko-barLabel" css class. + * + * > barLabels = ['Mickey Mouse', 'Donald Duck', 'Goofy']; + * > axes:{xaxis:{barLabels:barLabels}} + * + */ + + + $.jqplot.MekkoRenderer = function(){ + this.shapeRenderer = new $.jqplot.ShapeRenderer(); + // prop: borderColor + // color of the borders between areas on the chart + this.borderColor = null; + // prop: showBorders + // True to draw borders lines between areas on the chart. + // False will draw borders lines with the same color as the area. + this.showBorders = true; + }; + + // called with scope of series. + $.jqplot.MekkoRenderer.prototype.init = function(options, plot) { + this.fill = false; + this.fillRect = true; + this.strokeRect = true; + this.shadow = false; + // width of bar on x axis. + this._xwidth = 0; + this._xstart = 0; + $.extend(true, this.renderer, options); + // set the shape renderer options + var opts = {lineJoin:'miter', lineCap:'butt', isarc:false, fillRect:this.fillRect, strokeRect:this.strokeRect}; + this.renderer.shapeRenderer.init(opts); + plot.axes.x2axis._series.push(this); + this._type = 'mekko'; + }; + + // Method: setGridData + // converts the user data values to grid coordinates and stores them + // in the gridData array. Will convert user data into appropriate + // rectangles. + // Called with scope of a series. + $.jqplot.MekkoRenderer.prototype.setGridData = function(plot) { + // recalculate the grid data + var xp = this._xaxis.series_u2p; + var yp = this._yaxis.series_u2p; + var data = this._plotData; + this.gridData = []; + // figure out width on x axis. + // this._xwidth = this._sumy / plot._sumy * this.canvas.getWidth(); + this._xwidth = xp(this._sumy) - xp(0); + if (this.index>0) { + this._xstart = plot.series[this.index-1]._xstart + plot.series[this.index-1]._xwidth; + } + var totheight = this.canvas.getHeight(); + var sumy = 0; + var cury; + var curheight; + for (var i=0; i<data.length; i++) { + if (data[i] != null) { + sumy += data[i][1]; + cury = totheight - (sumy / this._sumy * totheight); + curheight = data[i][1] / this._sumy * totheight; + this.gridData.push([this._xstart, cury, this._xwidth, curheight]); + } + } + }; + + // Method: makeGridData + // converts any arbitrary data values to grid coordinates and + // returns them. This method exists so that plugins can use a series' + // linerenderer to generate grid data points without overwriting the + // grid data associated with that series. + // Called with scope of a series. + $.jqplot.MekkoRenderer.prototype.makeGridData = function(data, plot) { + // recalculate the grid data + // figure out width on x axis. + var xp = this._xaxis.series_u2p; + var totheight = this.canvas.getHeight(); + var sumy = 0; + var cury; + var curheight; + var gd = []; + for (var i=0; i<data.length; i++) { + if (data[i] != null) { + sumy += data[i][1]; + cury = totheight - (sumy / this._sumy * totheight); + curheight = data[i][1] / this._sumy * totheight; + gd.push([this._xstart, cury, this._xwidth, curheight]); + } + } + return gd; + }; + + + // called within scope of series. + $.jqplot.MekkoRenderer.prototype.draw = function(ctx, gd, options) { + var i; + var opts = (options != undefined) ? options : {}; + var showLine = (opts.showLine != undefined) ? opts.showLine : this.showLine; + var colorGenerator = new $.jqplot.ColorGenerator(this.seriesColors); + ctx.save(); + if (gd.length) { + if (showLine) { + for (i=0; i<gd.length; i++){ + opts.fillStyle = colorGenerator.next(); + if (this.renderer.showBorders) { + opts.strokeStyle = this.renderer.borderColor; + } + else { + opts.strokeStyle = opts.fillStyle; + } + this.renderer.shapeRenderer.draw(ctx, gd[i], opts); + } + } + } + + ctx.restore(); + }; + + $.jqplot.MekkoRenderer.prototype.drawShadow = function(ctx, gd, options) { + // This is a no-op, no shadows on mekko charts. + }; + + /** + * Class: $.jqplot.MekkoLegendRenderer + * Legend renderer used by mekko charts with options for + * controlling number or rows and columns as well as placement + * outside of plot area. + * + */ + $.jqplot.MekkoLegendRenderer = function(){ + // + }; + + $.jqplot.MekkoLegendRenderer.prototype.init = function(options) { + // prop: numberRows + // Maximum number of rows in the legend. 0 or null for unlimited. + this.numberRows = null; + // prop: numberColumns + // Maximum number of columns in the legend. 0 or null for unlimited. + this.numberColumns = null; + // this will override the placement option on the Legend object + this.placement = "outside"; + $.extend(true, this, options); + }; + + // called with scope of legend + $.jqplot.MekkoLegendRenderer.prototype.draw = function() { + var legend = this; + if (this.show) { + var series = this._series; + var ss = 'position:absolute;'; + ss += (this.background) ? 'background:'+this.background+';' : ''; + ss += (this.border) ? 'border:'+this.border+';' : ''; + ss += (this.fontSize) ? 'font-size:'+this.fontSize+';' : ''; + ss += (this.fontFamily) ? 'font-family:'+this.fontFamily+';' : ''; + ss += (this.textColor) ? 'color:'+this.textColor+';' : ''; + this._elem = $('<table class="jqplot-table-legend" style="'+ss+'"></table>'); + // Mekko charts legends don't go by number of series, but by number of data points + // in the series. Refactor things here for that. + + var pad = false, + reverse = true, // mekko charts are always stacked, so reverse + nr, nc; + var s = series[0]; + var colorGenerator = new $.jqplot.ColorGenerator(s.seriesColors); + + if (s.show) { + var pd = s.data; + if (this.numberRows) { + nr = this.numberRows; + if (!this.numberColumns){ + nc = Math.ceil(pd.length/nr); + } + else{ + nc = this.numberColumns; + } + } + else if (this.numberColumns) { + nc = this.numberColumns; + nr = Math.ceil(pd.length/this.numberColumns); + } + else { + nr = pd.length; + nc = 1; + } + + var i, j, tr, td1, td2, lt, rs, color; + var idx = 0; + + for (i=0; i<nr; i++) { + if (reverse){ + tr = $('<tr class="jqplot-table-legend"></tr>').prependTo(this._elem); + } + else{ + tr = $('<tr class="jqplot-table-legend"></tr>').appendTo(this._elem); + } + for (j=0; j<nc; j++) { + if (idx < pd.length) { + lt = this.labels[idx] || pd[idx][0].toString(); + color = colorGenerator.next(); + if (!reverse){ + if (i>0){ + pad = true; + } + else{ + pad = false; + } + } + else{ + if (i == nr -1){ + pad = false; + } + else{ + pad = true; + } + } + rs = (pad) ? this.rowSpacing : '0'; + + td1 = $('<td class="jqplot-table-legend" style="text-align:center;padding-top:'+rs+';">'+ + '<div><div class="jqplot-table-legend-swatch" style="border-color:'+color+';"></div>'+ + '</div></td>'); + td2 = $('<td class="jqplot-table-legend" style="padding-top:'+rs+';"></td>'); + if (this.escapeHtml){ + td2.text(lt); + } + else { + td2.html(lt); + } + if (reverse) { + td2.prependTo(tr); + td1.prependTo(tr); + } + else { + td1.appendTo(tr); + td2.appendTo(tr); + } + pad = true; + } + idx++; + } + } + + tr = null; + td1 = null; + td2 = null; + } + } + return this._elem; + }; + + $.jqplot.MekkoLegendRenderer.prototype.pack = function(offsets) { + if (this.show) { + // fake a grid for positioning + var grid = {_top:offsets.top, _left:offsets.left, _right:offsets.right, _bottom:this._plotDimensions.height - offsets.bottom}; + if (this.placement == 'insideGrid') { + switch (this.location) { + case 'nw': + var a = grid._left + this.xoffset; + var b = grid._top + this.yoffset; + this._elem.css('left', a); + this._elem.css('top', b); + break; + case 'n': + var a = (offsets.left + (this._plotDimensions.width - offsets.right))/2 - this.getWidth()/2; + var b = grid._top + this.yoffset; + this._elem.css('left', a); + this._elem.css('top', b); + break; + case 'ne': + var a = offsets.right + this.xoffset; + var b = grid._top + this.yoffset; + this._elem.css({right:a, top:b}); + break; + case 'e': + var a = offsets.right + this.xoffset; + var b = (offsets.top + (this._plotDimensions.height - offsets.bottom))/2 - this.getHeight()/2; + this._elem.css({right:a, top:b}); + break; + case 'se': + var a = offsets.right + this.xoffset; + var b = offsets.bottom + this.yoffset; + this._elem.css({right:a, bottom:b}); + break; + case 's': + var a = (offsets.left + (this._plotDimensions.width - offsets.right))/2 - this.getWidth()/2; + var b = offsets.bottom + this.yoffset; + this._elem.css({left:a, bottom:b}); + break; + case 'sw': + var a = grid._left + this.xoffset; + var b = offsets.bottom + this.yoffset; + this._elem.css({left:a, bottom:b}); + break; + case 'w': + var a = grid._left + this.xoffset; + var b = (offsets.top + (this._plotDimensions.height - offsets.bottom))/2 - this.getHeight()/2; + this._elem.css({left:a, top:b}); + break; + default: // same as 'se' + var a = grid._right - this.xoffset; + var b = grid._bottom + this.yoffset; + this._elem.css({right:a, bottom:b}); + break; + } + + } + else { + switch (this.location) { + case 'nw': + var a = this._plotDimensions.width - grid._left + this.xoffset; + var b = grid._top + this.yoffset; + this._elem.css('right', a); + this._elem.css('top', b); + break; + case 'n': + var a = (offsets.left + (this._plotDimensions.width - offsets.right))/2 - this.getWidth()/2; + var b = this._plotDimensions.height - grid._top + this.yoffset; + this._elem.css('left', a); + this._elem.css('bottom', b); + break; + case 'ne': + var a = this._plotDimensions.width - offsets.right + this.xoffset; + var b = grid._top + this.yoffset; + this._elem.css({left:a, top:b}); + break; + case 'e': + var a = this._plotDimensions.width - offsets.right + this.xoffset; + var b = (offsets.top + (this._plotDimensions.height - offsets.bottom))/2 - this.getHeight()/2; + this._elem.css({left:a, top:b}); + break; + case 'se': + var a = this._plotDimensions.width - offsets.right + this.xoffset; + var b = offsets.bottom + this.yoffset; + this._elem.css({left:a, bottom:b}); + break; + case 's': + var a = (offsets.left + (this._plotDimensions.width - offsets.right))/2 - this.getWidth()/2; + var b = this._plotDimensions.height - offsets.bottom + this.yoffset; + this._elem.css({left:a, top:b}); + break; + case 'sw': + var a = this._plotDimensions.width - grid._left + this.xoffset; + var b = offsets.bottom + this.yoffset; + this._elem.css({right:a, bottom:b}); + break; + case 'w': + var a = this._plotDimensions.width - grid._left + this.xoffset; + var b = (offsets.top + (this._plotDimensions.height - offsets.bottom))/2 - this.getHeight()/2; + this._elem.css({right:a, top:b}); + break; + default: // same as 'se' + var a = grid._right - this.xoffset; + var b = grid._bottom + this.yoffset; + this._elem.css({right:a, bottom:b}); + break; + } + } + } + }; + + // setup default renderers for axes and legend so user doesn't have to + // called with scope of plot + function preInit(target, data, options) { + options = options || {}; + options.axesDefaults = options.axesDefaults || {}; + options.legend = options.legend || {}; + options.seriesDefaults = options.seriesDefaults || {}; + var setopts = false; + if (options.seriesDefaults.renderer == $.jqplot.MekkoRenderer) { + setopts = true; + } + else if (options.series) { + for (var i=0; i < options.series.length; i++) { + if (options.series[i].renderer == $.jqplot.MekkoRenderer) { + setopts = true; + } + } + } + + if (setopts) { + options.axesDefaults.renderer = $.jqplot.MekkoAxisRenderer; + options.legend.renderer = $.jqplot.MekkoLegendRenderer; + options.legend.preDraw = true; + } + } + + $.jqplot.preInitHooks.push(preInit); + +})(jQuery); \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/plugins/jqplot.mekkoRenderer.min.js b/libreplan-webapp/src/main/webapp/jqplot/plugins/jqplot.mekkoRenderer.min.js new file mode 100644 index 000000000..e014e77e9 --- /dev/null +++ b/libreplan-webapp/src/main/webapp/jqplot/plugins/jqplot.mekkoRenderer.min.js @@ -0,0 +1,57 @@ +/** + * jqPlot + * Pure JavaScript plotting plugin using jQuery + * + * Version: 1.0.0b2_r1012 + * + * Copyright (c) 2009-2011 Chris Leonello + * jqPlot is currently available for use in all personal or commercial projects + * under both the MIT (http://www.opensource.org/licenses/mit-license.php) and GPL + * version 2.0 (http://www.gnu.org/licenses/gpl-2.0.html) licenses. This means that you can + * choose the license that best suits your project and use it accordingly. + * + * Although not required, the author would appreciate an email letting him + * know of any substantial use of jqPlot. You can reach the author at: + * chris at jqplot dot com or see http://www.jqplot.com/info.php . + * + * If you are feeling kind and generous, consider supporting the project by + * making a donation at: http://www.jqplot.com/donate.php . + * + * sprintf functions contained in jqplot.sprintf.js by Ash Searle: + * + * version 2007.04.27 + * author Ash Searle + * http://hexmen.com/blog/2007/03/printf-sprintf/ + * http://hexmen.com/js/sprintf.js + * The author (Ash Searle) has placed this code in the public domain: + * "This code is unrestricted: you are free to use it however you like." + * + * included jsDate library by Chris Leonello: + * + * Copyright (c) 2010-2011 Chris Leonello + * + * jsDate is currently available for use in all personal or commercial projects + * under both the MIT and GPL version 2.0 licenses. This means that you can + * choose the license that best suits your project and use it accordingly. + * + * jsDate borrows many concepts and ideas from the Date Instance + * Methods by Ken Snyder along with some parts of Ken's actual code. + * + * Ken's origianl Date Instance Methods and copyright notice: + * + * Ken Snyder (ken d snyder at gmail dot com) + * 2008-09-10 + * version 2.0.2 (http://kendsnyder.com/sandbox/date/) + * Creative Commons Attribution License 3.0 (http://creativecommons.org/licenses/by/3.0/) + * + * jqplotToImage function based on Larry Siden's export-jqplot-to-png.js. + * Larry has generously given permission to adapt his code for inclusion + * into jqPlot. + * + * Larry's original code can be found here: + * + * https://github.com/lsiden/export-jqplot-to-png + * + * + */ +(function(b){b.jqplot.MekkoRenderer=function(){this.shapeRenderer=new b.jqplot.ShapeRenderer();this.borderColor=null;this.showBorders=true};b.jqplot.MekkoRenderer.prototype.init=function(c,e){this.fill=false;this.fillRect=true;this.strokeRect=true;this.shadow=false;this._xwidth=0;this._xstart=0;b.extend(true,this.renderer,c);var d={lineJoin:"miter",lineCap:"butt",isarc:false,fillRect:this.fillRect,strokeRect:this.strokeRect};this.renderer.shapeRenderer.init(d);e.axes.x2axis._series.push(this);this._type="mekko"};b.jqplot.MekkoRenderer.prototype.setGridData=function(h){var e=this._xaxis.series_u2p;var c=this._yaxis.series_u2p;var g=this._plotData;this.gridData=[];this._xwidth=e(this._sumy)-e(0);if(this.index>0){this._xstart=h.series[this.index-1]._xstart+h.series[this.index-1]._xwidth}var l=this.canvas.getHeight();var d=0;var k;var j;for(var f=0;f<g.length;f++){if(g[f]!=null){d+=g[f][1];k=l-(d/this._sumy*l);j=g[f][1]/this._sumy*l;this.gridData.push([this._xstart,k,this._xwidth,j])}}};b.jqplot.MekkoRenderer.prototype.makeGridData=function(f,g){var d=this._xaxis.series_u2p;var l=this.canvas.getHeight();var c=0;var j;var h;var k=[];for(var e=0;e<f.length;e++){if(f[e]!=null){c+=f[e][1];j=l-(c/this._sumy*l);h=f[e][1]/this._sumy*l;k.push([this._xstart,j,this._xwidth,h])}}return k};b.jqplot.MekkoRenderer.prototype.draw=function(c,h,d){var e;var g=(d!=undefined)?d:{};var f=(g.showLine!=undefined)?g.showLine:this.showLine;var j=new b.jqplot.ColorGenerator(this.seriesColors);c.save();if(h.length){if(f){for(e=0;e<h.length;e++){g.fillStyle=j.next();if(this.renderer.showBorders){g.strokeStyle=this.renderer.borderColor}else{g.strokeStyle=g.fillStyle}this.renderer.shapeRenderer.draw(c,h[e],g)}}}c.restore()};b.jqplot.MekkoRenderer.prototype.drawShadow=function(c,e,d){};b.jqplot.MekkoLegendRenderer=function(){};b.jqplot.MekkoLegendRenderer.prototype.init=function(c){this.numberRows=null;this.numberColumns=null;this.placement="outside";b.extend(true,this,c)};b.jqplot.MekkoLegendRenderer.prototype.draw=function(){var f=this;if(this.show){var o=this._series;var r="position:absolute;";r+=(this.background)?"background:"+this.background+";":"";r+=(this.border)?"border:"+this.border+";":"";r+=(this.fontSize)?"font-size:"+this.fontSize+";":"";r+=(this.fontFamily)?"font-family:"+this.fontFamily+";":"";r+=(this.textColor)?"color:"+this.textColor+";":"";this._elem=b('<table class="jqplot-table-legend" style="'+r+'"></table>');var w=false,n=true,c,l;var p=o[0];var d=new b.jqplot.ColorGenerator(p.seriesColors);if(p.show){var x=p.data;if(this.numberRows){c=this.numberRows;if(!this.numberColumns){l=Math.ceil(x.length/c)}else{l=this.numberColumns}}else{if(this.numberColumns){l=this.numberColumns;c=Math.ceil(x.length/this.numberColumns)}else{c=x.length;l=1}}var v,u,e,h,g,k,m,t;var q=0;for(v=0;v<c;v++){if(n){e=b('<tr class="jqplot-table-legend"></tr>').prependTo(this._elem)}else{e=b('<tr class="jqplot-table-legend"></tr>').appendTo(this._elem)}for(u=0;u<l;u++){if(q<x.length){k=this.labels[q]||x[q][0].toString();t=d.next();if(!n){if(v>0){w=true}else{w=false}}else{if(v==c-1){w=false}else{w=true}}m=(w)?this.rowSpacing:"0";h=b('<td class="jqplot-table-legend" style="text-align:center;padding-top:'+m+';"><div><div class="jqplot-table-legend-swatch" style="border-color:'+t+';"></div></div></td>');g=b('<td class="jqplot-table-legend" style="padding-top:'+m+';"></td>');if(this.escapeHtml){g.text(k)}else{g.html(k)}if(n){g.prependTo(e);h.prependTo(e)}else{h.appendTo(e);g.appendTo(e)}w=true}q++}}e=null;h=null;g=null}}return this._elem};b.jqplot.MekkoLegendRenderer.prototype.pack=function(f){if(this.show){var e={_top:f.top,_left:f.left,_right:f.right,_bottom:this._plotDimensions.height-f.bottom};if(this.placement=="insideGrid"){switch(this.location){case"nw":var d=e._left+this.xoffset;var c=e._top+this.yoffset;this._elem.css("left",d);this._elem.css("top",c);break;case"n":var d=(f.left+(this._plotDimensions.width-f.right))/2-this.getWidth()/2;var c=e._top+this.yoffset;this._elem.css("left",d);this._elem.css("top",c);break;case"ne":var d=f.right+this.xoffset;var c=e._top+this.yoffset;this._elem.css({right:d,top:c});break;case"e":var d=f.right+this.xoffset;var c=(f.top+(this._plotDimensions.height-f.bottom))/2-this.getHeight()/2;this._elem.css({right:d,top:c});break;case"se":var d=f.right+this.xoffset;var c=f.bottom+this.yoffset;this._elem.css({right:d,bottom:c});break;case"s":var d=(f.left+(this._plotDimensions.width-f.right))/2-this.getWidth()/2;var c=f.bottom+this.yoffset;this._elem.css({left:d,bottom:c});break;case"sw":var d=e._left+this.xoffset;var c=f.bottom+this.yoffset;this._elem.css({left:d,bottom:c});break;case"w":var d=e._left+this.xoffset;var c=(f.top+(this._plotDimensions.height-f.bottom))/2-this.getHeight()/2;this._elem.css({left:d,top:c});break;default:var d=e._right-this.xoffset;var c=e._bottom+this.yoffset;this._elem.css({right:d,bottom:c});break}}else{switch(this.location){case"nw":var d=this._plotDimensions.width-e._left+this.xoffset;var c=e._top+this.yoffset;this._elem.css("right",d);this._elem.css("top",c);break;case"n":var d=(f.left+(this._plotDimensions.width-f.right))/2-this.getWidth()/2;var c=this._plotDimensions.height-e._top+this.yoffset;this._elem.css("left",d);this._elem.css("bottom",c);break;case"ne":var d=this._plotDimensions.width-f.right+this.xoffset;var c=e._top+this.yoffset;this._elem.css({left:d,top:c});break;case"e":var d=this._plotDimensions.width-f.right+this.xoffset;var c=(f.top+(this._plotDimensions.height-f.bottom))/2-this.getHeight()/2;this._elem.css({left:d,top:c});break;case"se":var d=this._plotDimensions.width-f.right+this.xoffset;var c=f.bottom+this.yoffset;this._elem.css({left:d,bottom:c});break;case"s":var d=(f.left+(this._plotDimensions.width-f.right))/2-this.getWidth()/2;var c=this._plotDimensions.height-f.bottom+this.yoffset;this._elem.css({left:d,top:c});break;case"sw":var d=this._plotDimensions.width-e._left+this.xoffset;var c=f.bottom+this.yoffset;this._elem.css({right:d,bottom:c});break;case"w":var d=this._plotDimensions.width-e._left+this.xoffset;var c=(f.top+(this._plotDimensions.height-f.bottom))/2-this.getHeight()/2;this._elem.css({right:d,top:c});break;default:var d=e._right-this.xoffset;var c=e._bottom+this.yoffset;this._elem.css({right:d,bottom:c});break}}}};function a(g,f,d){d=d||{};d.axesDefaults=d.axesDefaults||{};d.legend=d.legend||{};d.seriesDefaults=d.seriesDefaults||{};var c=false;if(d.seriesDefaults.renderer==b.jqplot.MekkoRenderer){c=true}else{if(d.series){for(var e=0;e<d.series.length;e++){if(d.series[e].renderer==b.jqplot.MekkoRenderer){c=true}}}}if(c){d.axesDefaults.renderer=b.jqplot.MekkoAxisRenderer;d.legend.renderer=b.jqplot.MekkoLegendRenderer;d.legend.preDraw=true}}b.jqplot.preInitHooks.push(a)})(jQuery); \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/plugins/jqplot.meterGaugeRenderer.js b/libreplan-webapp/src/main/webapp/jqplot/plugins/jqplot.meterGaugeRenderer.js new file mode 100644 index 000000000..1836cee9d --- /dev/null +++ b/libreplan-webapp/src/main/webapp/jqplot/plugins/jqplot.meterGaugeRenderer.js @@ -0,0 +1,1029 @@ +/** + * jqPlot + * Pure JavaScript plotting plugin using jQuery + * + * Version: 1.0.0b2_r1012 + * + * Copyright (c) 2009-2011 Chris Leonello + * jqPlot is currently available for use in all personal or commercial projects + * under both the MIT (http://www.opensource.org/licenses/mit-license.php) and GPL + * version 2.0 (http://www.gnu.org/licenses/gpl-2.0.html) licenses. This means that you can + * choose the license that best suits your project and use it accordingly. + * + * Although not required, the author would appreciate an email letting him + * know of any substantial use of jqPlot. You can reach the author at: + * chris at jqplot dot com or see http://www.jqplot.com/info.php . + * + * If you are feeling kind and generous, consider supporting the project by + * making a donation at: http://www.jqplot.com/donate.php . + * + * sprintf functions contained in jqplot.sprintf.js by Ash Searle: + * + * version 2007.04.27 + * author Ash Searle + * http://hexmen.com/blog/2007/03/printf-sprintf/ + * http://hexmen.com/js/sprintf.js + * The author (Ash Searle) has placed this code in the public domain: + * "This code is unrestricted: you are free to use it however you like." + * + */ +(function($) { + /** + * Class: $.jqplot.MeterGaugeRenderer + * Plugin renderer to draw a meter gauge chart. + * + * Data consists of a single series with 1 data point to position the gauge needle. + * + * To use this renderer, you need to include the + * meter gauge renderer plugin, for example: + * + * > <script type="text/javascript" src="plugins/jqplot.meterGaugeRenderer.js"></script> + * + * Properties described here are passed into the $.jqplot function + * as options on the series renderer. For example: + * + * > plot0 = $.jqplot('chart0',[[18]],{ + * > title: 'Network Speed', + * > seriesDefaults: { + * > renderer: $.jqplot.MeterGaugeRenderer, + * > rendererOptions: { + * > label: 'MB/s' + * > } + * > } + * > }); + * + * A meterGauge plot does not support events. + */ + $.jqplot.MeterGaugeRenderer = function(){ + $.jqplot.LineRenderer.call(this); + }; + + $.jqplot.MeterGaugeRenderer.prototype = new $.jqplot.LineRenderer(); + $.jqplot.MeterGaugeRenderer.prototype.constructor = $.jqplot.MeterGaugeRenderer; + + // called with scope of a series + $.jqplot.MeterGaugeRenderer.prototype.init = function(options) { + // Group: Properties + // + // prop: diameter + // Outer diameter of the meterGauge, auto computed by default + this.diameter = null; + // prop: padding + // padding between the meterGauge and plot edges, auto + // calculated by default. + this.padding = null; + // prop: shadowOffset + // offset of the shadow from the gauge ring and offset of + // each succesive stroke of the shadow from the last. + this.shadowOffset = 2; + // prop: shadowAlpha + // transparency of the shadow (0 = transparent, 1 = opaque) + this.shadowAlpha = 0.07; + // prop: shadowDepth + // number of strokes to apply to the shadow, + // each stroke offset shadowOffset from the last. + this.shadowDepth = 4; + // prop: background + // background color of the inside of the gauge. + this.background = "#efefef"; + // prop: ringColor + // color of the outer ring, hub, and needle of the gauge. + this.ringColor = "#BBC6D0"; + // needle color not implemented yet. + this.needleColor = "#C3D3E5"; + // prop: tickColor + // color of the tick marks around the gauge. + this.tickColor = "989898"; + // prop: ringWidth + // width of the ring around the gauge. Auto computed by default. + this.ringWidth = null; + // prop: min + // Minimum value on the gauge. Auto computed by default + this.min; + // prop: max + // Maximum value on the gauge. Auto computed by default + this.max; + // prop: ticks + // Array of tick values. Auto computed by default. + this.ticks = []; + // prop: showTicks + // true to show ticks around gauge. + this.showTicks = true; + // prop: showTickLabels + // true to show tick labels next to ticks. + this.showTickLabels = true; + // prop: label + // A gauge label like 'kph' or 'Volts' + this.label = null; + // prop: labelHeightAdjust + // Number of Pixels to offset the label up (-) or down (+) from its default position. + this.labelHeightAdjust = 0; + // prop: labelPosition + // Where to position the label, either 'inside' or 'bottom'. + this.labelPosition = 'inside'; + // prop: intervals + // Array of ranges to be drawn around the gauge. + // Array of form: + // > [value1, value2, ...] + // indicating the values for the first, second, ... intervals. + this.intervals = []; + // prop: intervalColors + // Array of colors to use for the intervals. + this.intervalColors = [ "#4bb2c5", "#EAA228", "#c5b47f", "#579575", "#839557", "#958c12", "#953579", "#4b5de4", "#d8b83f", "#ff5800", "#0085cc", "#c747a3", "#cddf54", "#FBD178", "#26B4E3", "#bd70c7"]; + // prop: intervalInnerRadius + // Radius of the inner circle of the interval ring. + this.intervalInnerRadius = null; + // prop: intervalOuterRadius + // Radius of the outer circle of the interval ring. + this.intervalOuterRadius = null; + this.tickRenderer = $.jqplot.MeterGaugeTickRenderer; + // ticks spaced every 1, 2, 2.5, 5, 10, 20, .1, .2, .25, .5, etc. + this.tickPositions = [1, 2, 2.5, 5, 10]; + // prop: tickSpacing + // Degrees between ticks. This is a target number, if + // incompatible span and ticks are supplied, a suitable + // spacing close to this value will be computed. + this.tickSpacing = 30; + this.numberMinorTicks = null; + // prop: hubRadius + // Radius of the hub at the bottom center of gauge which the needle attaches to. + // Auto computed by default + this.hubRadius = null; + // prop: tickPadding + // padding of the tick marks to the outer ring and the tick labels to marks. + // Auto computed by default. + this.tickPadding = null; + // prop: needleThickness + // Maximum thickness the needle. Auto computed by default. + this.needleThickness = null; + // prop: needlePad + // Padding between needle and inner edge of the ring when the needle is at the min or max gauge value. + this.needlePad = 6; + // prop: pegNeedle + // True will stop needle just below/above the min/max values if data is below/above min/max, + // as if the meter is "pegged". + this.pegNeedle = true; + this._type = 'meterGauge'; + + $.extend(true, this, options); + this.type = null; + this.numberTicks = null; + this.tickInterval = null; + // span, the sweep (in degrees) from min to max. This gauge is + // a semi-circle. + this.span = 180; + // get rid of this nonsense + // this.innerSpan = this.span; + if (this.type == 'circular') { + this.semiCircular = false; + } + else if (this.type != 'circular') { + this.semiCircular = true; + } + else { + this.semiCircular = (this.span <= 180) ? true : false; + } + this._tickPoints = []; + // reference to label element. + this._labelElem = null; + + // start the gauge at the beginning of the span + this.startAngle = (90 + (360 - this.span)/2) * Math.PI/180; + this.endAngle = (90 - (360 - this.span)/2) * Math.PI/180; + + this.setmin = !!(this.min == null); + this.setmax = !!(this.max == null); + + // if given intervals and is an array of values, create labels and colors. + if (this.intervals.length) { + if (this.intervals[0].length == null || this.intervals.length == 1) { + for (var i=0; i<this.intervals.length; i++) { + this.intervals[i] = [this.intervals[i], this.intervals[i], this.intervalColors[i]]; + } + } + else if (this.intervals[0].length == 2) { + for (i=0; i<this.intervals.length; i++) { + this.intervals[i] = [this.intervals[i][0], this.intervals[i][1], this.intervalColors[i]]; + } + } + } + + // compute min, max and ticks if not supplied: + if (this.ticks.length) { + if (this.ticks[0].length == null || this.ticks[0].length == 1) { + for (var i=0; i<this.ticks.length; i++) { + this.ticks[i] = [this.ticks[i], this.ticks[i]]; + } + } + this.min = (this.min == null) ? this.ticks[0][0] : this.min; + this.max = (this.max == null) ? this.ticks[this.ticks.length-1][0] : this.max; + this.setmin = false; + this.setmax = false; + this.numberTicks = this.ticks.length; + this.tickInterval = this.ticks[1][0] - this.ticks[0][0]; + this.tickFactor = Math.floor(parseFloat((Math.log(this.tickInterval)/Math.log(10)).toFixed(11))); + // use the first interal to calculate minor ticks; + this.numberMinorTicks = getnmt(this.tickPositions, this.tickInterval, this.tickFactor); + if (!this.numberMinorTicks) { + this.numberMinorTicks = getnmt(this.tickPositions, this.tickInterval, this.tickFactor-1); + } + if (!this.numberMinorTicks) { + this.numberMinorTicks = 1; + } + } + + else if (this.intervals.length) { + this.min = (this.min == null) ? 0 : this.min; + this.setmin = false; + if (this.max == null) { + if (this.intervals[this.intervals.length-1][0] >= this.data[0][1]) { + this.max = this.intervals[this.intervals.length-1][0]; + this.setmax = false; + } + } + else { + this.setmax = false; + } + } + + else { + // no ticks and no intervals supplied, put needle in middle + this.min = (this.min == null) ? 0 : this.min; + this.setmin = false; + if (this.max == null) { + this.max = this.data[0][1] * 1.25; + this.setmax = true; + } + else { + this.setmax = false; + } + } + }; + + $.jqplot.MeterGaugeRenderer.prototype.setGridData = function(plot) { + // set gridData property. This will hold angle in radians of each data point. + var stack = []; + var td = []; + var sa = this.startAngle; + for (var i=0; i<this.data.length; i++){ + stack.push(this.data[i][1]); + td.push([this.data[i][0]]); + if (i>0) { + stack[i] += stack[i-1]; + } + } + var fact = Math.PI*2/stack[stack.length - 1]; + + for (var i=0; i<stack.length; i++) { + td[i][1] = stack[i] * fact; + } + this.gridData = td; + }; + + $.jqplot.MeterGaugeRenderer.prototype.makeGridData = function(data, plot) { + var stack = []; + var td = []; + var sa = this.startAngle; + for (var i=0; i<data.length; i++){ + stack.push(data[i][1]); + td.push([data[i][0]]); + if (i>0) { + stack[i] += stack[i-1]; + } + } + var fact = Math.PI*2/stack[stack.length - 1]; + + for (var i=0; i<stack.length; i++) { + td[i][1] = stack[i] * fact; + } + return td; + }; + + + function getnmt(pos, interval, fact) { + var temp; + for (var i=pos.length-1; i>=0; i--) { + temp = interval/(pos[i] * Math.pow(10, fact)); + if (temp == 4 || temp == 5) { + return temp - 1; + } + } + return null; + } + + // called with scope of series + $.jqplot.MeterGaugeRenderer.prototype.draw = function (ctx, gd, options) { + var i; + var opts = (options != undefined) ? options : {}; + // offset and direction of offset due to legend placement + var offx = 0; + var offy = 0; + var trans = 1; + if (options.legendInfo && options.legendInfo.placement == 'inside') { + var li = options.legendInfo; + switch (li.location) { + case 'nw': + offx = li.width + li.xoffset; + break; + case 'w': + offx = li.width + li.xoffset; + break; + case 'sw': + offx = li.width + li.xoffset; + break; + case 'ne': + offx = li.width + li.xoffset; + trans = -1; + break; + case 'e': + offx = li.width + li.xoffset; + trans = -1; + break; + case 'se': + offx = li.width + li.xoffset; + trans = -1; + break; + case 'n': + offy = li.height + li.yoffset; + break; + case 's': + offy = li.height + li.yoffset; + trans = -1; + break; + default: + break; + } + } + + + + // pre-draw so can get it's dimensions. + if (this.label) { + this._labelElem = $('<div class="jqplot-meterGauge-label" style="position:absolute;">'+this.label+'</div>'); + this.canvas._elem.after(this._labelElem); + } + + var shadow = (opts.shadow != undefined) ? opts.shadow : this.shadow; + var showLine = (opts.showLine != undefined) ? opts.showLine : this.showLine; + var fill = (opts.fill != undefined) ? opts.fill : this.fill; + var cw = ctx.canvas.width; + var ch = ctx.canvas.height; + if (this.padding == null) { + this.padding = Math.round(Math.min(cw, ch)/30); + } + var w = cw - offx - 2 * this.padding; + var h = ch - offy - 2 * this.padding; + if (this.labelPosition == 'bottom' && this.label) { + h -= this._labelElem.outerHeight(true); + } + var mindim = Math.min(w,h); + var d = mindim; + + if (!this.diameter) { + if (this.semiCircular) { + if ( w >= 2*h) { + if (!this.ringWidth) { + this.ringWidth = 2*h/35; + } + this.needleThickness = this.needleThickness || 2+Math.pow(this.ringWidth, 0.8); + this.innerPad = this.ringWidth/2 + this.needleThickness/2 + this.needlePad; + this.diameter = 2 * (h - 2*this.innerPad); + } + else { + if (!this.ringWidth) { + this.ringWidth = w/35; + } + this.needleThickness = this.needleThickness || 2+Math.pow(this.ringWidth, 0.8); + this.innerPad = this.ringWidth/2 + this.needleThickness/2 + this.needlePad; + this.diameter = w - 2*this.innerPad - this.ringWidth - this.padding; + } + // center taking into account legend and over draw for gauge bottom below hub. + // this will be center of hub. + this._center = [(cw - trans * offx)/2 + trans * offx, (ch + trans*offy - this.padding - this.ringWidth - this.innerPad)]; + } + else { + if (!this.ringWidth) { + this.ringWidth = d/35; + } + this.needleThickness = this.needleThickness || 2+Math.pow(this.ringWidth, 0.8); + this.innerPad = 0; + this.diameter = d - this.ringWidth; + // center in middle of canvas taking into account legend. + // will be center of hub. + this._center = [(cw-trans*offx)/2 + trans * offx, (ch-trans*offy)/2 + trans * offy]; + } + } + + + if (this._labelElem && this.labelPosition == 'bottom') { + this._center[1] -= this._labelElem.outerHeight(true); + } + + this._radius = this.diameter/2; + + this.tickSpacing = 6000/this.diameter; + + if (!this.hubRadius) { + this.hubRadius = this.diameter/18; + } + + this.shadowOffset = 0.5 + this.ringWidth/9; + this.shadowWidth = this.ringWidth*1; + + this.tickPadding = 3 + Math.pow(this.diameter/20, 0.7); + this.tickOuterRadius = this._radius - this.ringWidth/2 - this.tickPadding; + this.tickLength = (this.showTicks) ? this._radius/13 : 0; + + if (this.ticks.length == 0) { + // no ticks, lets make some. + var max = this.max, + min = this.min, + setmax = this.setmax, + setmin = this.setmin, + ti = (max - min) * this.tickSpacing / this.span; + var tf = Math.floor(parseFloat((Math.log(ti)/Math.log(10)).toFixed(11))); + var tp = (ti/Math.pow(10, tf)); + (tp > 2 && tp <= 2.5) ? tp = 2.5 : tp = Math.ceil(tp); + var t = this.tickPositions; + var tpindex, nt; + + for (i=0; i<t.length; i++) { + if (tp == t[i] || i && t[i-1] < tp && tp < t[i]) { + ti = t[i]*Math.pow(10, tf); + tpindex = i; + } + } + + for (i=0; i<t.length; i++) { + if (tp == t[i] || i && t[i-1] < tp && tp < t[i]) { + ti = t[i]*Math.pow(10, tf); + nt = Math.ceil((max - min) / ti); + } + } + + // both max and min are free + if (setmax && setmin) { + var tmin = (min > 0) ? min - min % ti : min - min % ti - ti; + if (!this.forceZero) { + var diff = Math.min(min - tmin, 0.8*ti); + var ntp = Math.floor(diff/t[tpindex]); + if (ntp > 1) { + tmin = tmin + t[tpindex] * (ntp-1); + if (parseInt(tmin, 10) != tmin && parseInt(tmin-t[tpindex], 10) == tmin-t[tpindex]) { + tmin = tmin - t[tpindex]; + } + } + } + if (min == tmin) { + min -= ti; + } + else { + // tmin should always be lower than dataMin + if (min - tmin > 0.23*ti) { + min = tmin; + } + else { + min = tmin -ti; + nt += 1; + } + } + nt += 1; + var tmax = min + (nt - 1) * ti; + if (max >= tmax) { + tmax += ti; + nt += 1; + } + // now tmax should always be mroe than dataMax + if (tmax - max < 0.23*ti) { + tmax += ti; + nt += 1; + } + this.max = max = tmax; + this.min = min; + + this.tickInterval = ti; + this.numberTicks = nt; + var it; + for (i=0; i<nt; i++) { + it = parseFloat((min+i*ti).toFixed(11)); + this.ticks.push([it, it]); + } + this.max = this.ticks[nt-1][1]; + + this.tickFactor = tf; + // determine number of minor ticks + + this.numberMinorTicks = getnmt(this.tickPositions, this.tickInterval, this.tickFactor); + + if (!this.numberMinorTicks) { + this.numberMinorTicks = getnmt(this.tickPositions, this.tickInterval, this.tickFactor-1); + } + } + // max is free, min is fixed + else if (setmax) { + var tmax = min + (nt - 1) * ti; + if (max >= tmax) { + max = tmax + ti; + nt += 1; + } + else { + max = tmax; + } + + this.tickInterval = this.tickInterval || ti; + this.numberTicks = this.numberTicks || nt; + var it; + for (i=0; i<this.numberTicks; i++) { + it = parseFloat((min+i*this.tickInterval).toFixed(11)); + this.ticks.push([it, it]); + } + this.max = this.ticks[this.numberTicks-1][1]; + + this.tickFactor = tf; + // determine number of minor ticks + this.numberMinorTicks = getnmt(this.tickPositions, this.tickInterval, this.tickFactor); + + if (!this.numberMinorTicks) { + this.numberMinorTicks = getnmt(this.tickPositions, this.tickInterval, this.tickFactor-1); + } + } + + // not setting max or min + if (!setmax && !setmin) { + var range = this.max - this.min; + tf = Math.floor(parseFloat((Math.log(range)/Math.log(10)).toFixed(11))) - 1; + var nticks = [5,6,4,7,3,8,9,10,2], res, numticks, nonSigDigits=0, sigRange; + // check to see how many zeros are at the end of the range + if (range > 1) { + var rstr = String(range); + if (rstr.search(/\./) == -1) { + var pos = rstr.search(/0+$/); + nonSigDigits = (pos > 0) ? rstr.length - pos - 1 : 0; + } + } + sigRange = range/Math.pow(10, nonSigDigits); + for (i=0; i<nticks.length; i++) { + res = sigRange/(nticks[i]-1); + if (res == parseInt(res, 10)) { + this.numberTicks = nticks[i]; + this.tickInterval = range/(this.numberTicks-1); + this.tickFactor = tf+1; + break; + } + } + var it; + for (i=0; i<this.numberTicks; i++) { + it = parseFloat((this.min+i*this.tickInterval).toFixed(11)); + this.ticks.push([it, it]); + } + // determine number of minor ticks + this.numberMinorTicks = getnmt(this.tickPositions, this.tickInterval, this.tickFactor); + + if (!this.numberMinorTicks) { + this.numberMinorTicks = getnmt(this.tickPositions, this.tickInterval, this.tickFactor-1); + } + + if (!this.numberMinorTicks) { + this.numberMinorTicks = 1; + var nums = [4, 5, 3, 6, 2]; + for (i=0; i<5; i++) { + var temp = this.tickInterval/nums[i]; + if (temp == parseInt(temp, 10)) { + this.numberMinorTicks = nums[i]-1; + break; + } + } + } + } + } + + + var r = this._radius, + sa = this.startAngle, + ea = this.endAngle, + pi = Math.PI, + hpi = Math.PI/2; + + if (this.semiCircular) { + var overAngle = Math.atan(this.innerPad/r), + outersa = this.outerStartAngle = sa - overAngle, + outerea = this.outerEndAngle = ea + overAngle, + hubsa = this.hubStartAngle = sa - Math.atan(this.innerPad/this.hubRadius*2), + hubea = this.hubEndAngle = ea + Math.atan(this.innerPad/this.hubRadius*2); + + ctx.save(); + + ctx.translate(this._center[0], this._center[1]); + ctx.lineJoin = "round"; + ctx.lineCap = "round"; + + // draw the innerbackground + ctx.save(); + ctx.beginPath(); + ctx.fillStyle = this.background; + ctx.arc(0, 0, r, outersa, outerea, false); + ctx.closePath(); + ctx.fill(); + ctx.restore(); + + // draw the shadow + // the outer ring. + var shadowColor = 'rgba(0,0,0,'+this.shadowAlpha+')'; + ctx.save(); + for (var i=0; i<this.shadowDepth; i++) { + ctx.translate(this.shadowOffset*Math.cos(this.shadowAngle/180*Math.PI), this.shadowOffset*Math.sin(this.shadowAngle/180*Math.PI)); + ctx.beginPath(); + ctx.strokeStyle = shadowColor; + ctx.lineWidth = this.shadowWidth; + ctx.arc(0 ,0, r, outersa, outerea, false); + ctx.closePath(); + ctx.stroke(); + } + ctx.restore(); + + // the inner hub. + ctx.save(); + var tempd = parseInt((this.shadowDepth+1)/2, 10); + for (var i=0; i<tempd; i++) { + ctx.translate(this.shadowOffset*Math.cos(this.shadowAngle/180*Math.PI), this.shadowOffset*Math.sin(this.shadowAngle/180*Math.PI)); + ctx.beginPath(); + ctx.fillStyle = shadowColor; + ctx.arc(0 ,0, this.hubRadius, hubsa, hubea, false); + ctx.closePath(); + ctx.fill(); + } + ctx.restore(); + + // draw the outer ring. + ctx.save(); + ctx.beginPath(); + ctx.strokeStyle = this.ringColor; + ctx.lineWidth = this.ringWidth; + ctx.arc(0 ,0, r, outersa, outerea, false); + ctx.closePath(); + ctx.stroke(); + ctx.restore(); + + // draw the hub + + ctx.save(); + ctx.beginPath(); + ctx.fillStyle = this.ringColor; + ctx.arc(0 ,0, this.hubRadius,hubsa, hubea, false); + ctx.closePath(); + ctx.fill(); + ctx.restore(); + + // draw the ticks + if (this.showTicks) { + ctx.save(); + var orad = this.tickOuterRadius, + tl = this.tickLength, + mtl = tl/2, + nmt = this.numberMinorTicks, + ts = this.span * Math.PI / 180 / (this.ticks.length-1), + mts = ts/(nmt + 1); + + for (i = 0; i<this.ticks.length; i++) { + ctx.beginPath(); + ctx.lineWidth = 1.5 + this.diameter/360; + ctx.strokeStyle = this.ringColor; + var wps = ts*i+sa; + ctx.moveTo(-orad * Math.cos(ts*i+sa), orad * Math.sin(ts*i+sa)); + ctx.lineTo(-(orad-tl) * Math.cos(ts*i+sa), (orad - tl) * Math.sin(ts*i+sa)); + this._tickPoints.push([(orad-tl) * Math.cos(ts*i+sa) + this._center[0] + this.canvas._offsets.left, (orad - tl) * Math.sin(ts*i+sa) + this._center[1] + this.canvas._offsets.top, ts*i+sa]); + ctx.stroke(); + ctx.lineWidth = 1.0 + this.diameter/440; + if (i<this.ticks.length-1) { + for (var j=1; j<=nmt; j++) { + ctx.beginPath(); + ctx.moveTo(-orad * Math.cos(ts*i+mts*j+sa), orad * Math.sin(ts*i+mts*j+sa)); + ctx.lineTo(-(orad-mtl) * Math.cos(ts*i+mts*j+sa), (orad-mtl) * Math.sin(ts*i+mts*j+sa)); + ctx.stroke(); + } + } + } + ctx.restore(); + } + + // draw the tick labels + if (this.showTickLabels) { + var elem, l, t, ew, eh, dim, maxdim=0; + var tp = this.tickPadding * (1 - 1/(this.diameter/80+1)); + for (i=0; i<this.ticks.length; i++) { + elem = $('<div class="jqplot-meterGauge-tick" style="position:absolute;">'+this.ticks[i][1]+'</div>'); + this.canvas._elem.after(elem); + ew = elem.outerWidth(true); + eh = elem.outerHeight(true); + l = this._tickPoints[i][0] - ew * (this._tickPoints[i][2]-Math.PI)/Math.PI - tp * Math.cos(this._tickPoints[i][2]); + t = this._tickPoints[i][1] - eh/2 + eh/2 * Math.pow(Math.abs((Math.sin(this._tickPoints[i][2]))), 0.5) + tp/3 * Math.pow(Math.abs((Math.sin(this._tickPoints[i][2]))), 0.5) ; + // t = this._tickPoints[i][1] - eh/2 - eh/2 * Math.sin(this._tickPoints[i][2]) - tp/2 * Math.sin(this._tickPoints[i][2]); + elem.css({left:l, top:t}); + dim = ew*Math.cos(this._tickPoints[i][2]) + eh*Math.sin(Math.PI/2+this._tickPoints[i][2]/2); + maxdim = (dim > maxdim) ? dim : maxdim; + } + } + + // draw the gauge label + if (this.label && this.labelPosition == 'inside') { + var l = this._center[0] + this.canvas._offsets.left; + var tp = this.tickPadding * (1 - 1/(this.diameter/80+1)); + var t = 0.5*(this._center[1] + this.canvas._offsets.top - this.hubRadius) + 0.5*(this._center[1] + this.canvas._offsets.top - this.tickOuterRadius + this.tickLength + tp) + this.labelHeightAdjust; + // this._labelElem = $('<div class="jqplot-meterGauge-label" style="position:absolute;">'+this.label+'</div>'); + // this.canvas._elem.after(this._labelElem); + l -= this._labelElem.outerWidth(true)/2; + t -= this._labelElem.outerHeight(true)/2; + this._labelElem.css({left:l, top:t}); + } + + else if (this.label && this.labelPosition == 'bottom') { + var l = this._center[0] + this.canvas._offsets.left - this._labelElem.outerWidth(true)/2; + var t = this._center[1] + this.canvas._offsets.top + this.innerPad + + this.ringWidth + this.padding + this.labelHeightAdjust; + this._labelElem.css({left:l, top:t}); + + } + + // draw the intervals + + ctx.save(); + var inner = this.intervalInnerRadius || this.hubRadius * 1.5; + if (this.intervalOuterRadius == null) { + if (this.showTickLabels) { + var outer = (this.tickOuterRadius - this.tickLength - this.tickPadding - this.diameter/8); + } + else { + var outer = (this.tickOuterRadius - this.tickLength - this.diameter/16); + } + } + else { + var outer = this.intervalOuterRadius; + } + var range = this.max - this.min; + var intrange = this.intervals[this.intervals.length-1] - this.min; + var start, end, span = this.span*Math.PI/180; + for (i=0; i<this.intervals.length; i++) { + start = (i == 0) ? sa : sa + (this.intervals[i-1][0] - this.min)*span/range; + if (start < 0) { + start = 0; + } + end = sa + (this.intervals[i][0] - this.min)*span/range; + if (end < 0) { + end = 0; + } + ctx.beginPath(); + ctx.fillStyle = this.intervals[i][2]; + ctx.arc(0, 0, inner, start, end, false); + ctx.lineTo(outer*Math.cos(end), outer*Math.sin(end)); + ctx.arc(0, 0, outer, end, start, true); + ctx.lineTo(inner*Math.cos(start), inner*Math.sin(start)); + ctx.closePath(); + ctx.fill(); + } + ctx.restore(); + + // draw the needle + var datapoint = this.data[0][1]; + var dataspan = this.max - this.min; + if (this.pegNeedle) { + if (this.data[0][1] > this.max + dataspan*3/this.span) { + datapoint = this.max + dataspan*3/this.span; + } + if (this.data[0][1] < this.min - dataspan*3/this.span) { + datapoint = this.min - dataspan*3/this.span; + } + } + var dataang = (datapoint - this.min)/dataspan * this.span * Math.PI/180 + this.startAngle; + + + ctx.save(); + ctx.beginPath(); + ctx.fillStyle = this.ringColor; + ctx.strokeStyle = this.ringColor; + this.needleLength = (this.tickOuterRadius - this.tickLength) * 0.85; + this.needleThickness = (this.needleThickness < 2) ? 2 : this.needleThickness; + var endwidth = this.needleThickness * 0.4; + + + var dl = this.needleLength/10; + var dt = (this.needleThickness - endwidth)/10; + var templ; + for (var i=0; i<10; i++) { + templ = this.needleThickness - i*dt; + ctx.moveTo(dl*i*Math.cos(dataang), dl*i*Math.sin(dataang)); + ctx.lineWidth = templ; + ctx.lineTo(dl*(i+1)*Math.cos(dataang), dl*(i+1)*Math.sin(dataang)); + ctx.stroke(); + } + + ctx.restore(); + } + else { + this._center = [(cw - trans * offx)/2 + trans * offx, (ch - trans*offy)/2 + trans * offy]; + } + }; + + $.jqplot.MeterGaugeAxisRenderer = function() { + $.jqplot.LinearAxisRenderer.call(this); + }; + + $.jqplot.MeterGaugeAxisRenderer.prototype = new $.jqplot.LinearAxisRenderer(); + $.jqplot.MeterGaugeAxisRenderer.prototype.constructor = $.jqplot.MeterGaugeAxisRenderer; + + + // There are no traditional axes on a gauge chart. We just need to provide + // dummy objects with properties so the plot will render. + // called with scope of axis object. + $.jqplot.MeterGaugeAxisRenderer.prototype.init = function(options){ + // + this.tickRenderer = $.jqplot.MeterGaugeTickRenderer; + $.extend(true, this, options); + // I don't think I'm going to need _dataBounds here. + // have to go Axis scaling in a way to fit chart onto plot area + // and provide u2p and p2u functionality for mouse cursor, etc. + // for convienence set _dataBounds to 0 and 100 and + // set min/max to 0 and 100. + this._dataBounds = {min:0, max:100}; + this.min = 0; + this.max = 100; + this.showTicks = false; + this.ticks = []; + this.showMark = false; + this.show = false; + }; + + $.jqplot.MeterGaugeLegendRenderer = function(){ + $.jqplot.TableLegendRenderer.call(this); + }; + + $.jqplot.MeterGaugeLegendRenderer.prototype = new $.jqplot.TableLegendRenderer(); + $.jqplot.MeterGaugeLegendRenderer.prototype.constructor = $.jqplot.MeterGaugeLegendRenderer; + + /** + * Class: $.jqplot.MeterGaugeLegendRenderer + *Meter gauges don't typically have a legend, this overrides the default legend renderer. + */ + $.jqplot.MeterGaugeLegendRenderer.prototype.init = function(options) { + // Maximum number of rows in the legend. 0 or null for unlimited. + this.numberRows = null; + // Maximum number of columns in the legend. 0 or null for unlimited. + this.numberColumns = null; + $.extend(true, this, options); + }; + + // called with context of legend + $.jqplot.MeterGaugeLegendRenderer.prototype.draw = function() { + if (this.show) { + var series = this._series; + var ss = 'position:absolute;'; + ss += (this.background) ? 'background:'+this.background+';' : ''; + ss += (this.border) ? 'border:'+this.border+';' : ''; + ss += (this.fontSize) ? 'font-size:'+this.fontSize+';' : ''; + ss += (this.fontFamily) ? 'font-family:'+this.fontFamily+';' : ''; + ss += (this.textColor) ? 'color:'+this.textColor+';' : ''; + ss += (this.marginTop != null) ? 'margin-top:'+this.marginTop+';' : ''; + ss += (this.marginBottom != null) ? 'margin-bottom:'+this.marginBottom+';' : ''; + ss += (this.marginLeft != null) ? 'margin-left:'+this.marginLeft+';' : ''; + ss += (this.marginRight != null) ? 'margin-right:'+this.marginRight+';' : ''; + this._elem = $('<table class="jqplot-table-legend" style="'+ss+'"></table>'); + // MeterGauge charts legends don't go by number of series, but by number of data points + // in the series. Refactor things here for that. + + var pad = false, + reverse = false, + nr, nc; + var s = series[0]; + + if (s.show) { + var pd = s.data; + if (this.numberRows) { + nr = this.numberRows; + if (!this.numberColumns){ + nc = Math.ceil(pd.length/nr); + } + else{ + nc = this.numberColumns; + } + } + else if (this.numberColumns) { + nc = this.numberColumns; + nr = Math.ceil(pd.length/this.numberColumns); + } + else { + nr = pd.length; + nc = 1; + } + + var i, j, tr, td1, td2, lt, rs, color; + var idx = 0; + + for (i=0; i<nr; i++) { + if (reverse){ + tr = $('<tr class="jqplot-table-legend"></tr>').prependTo(this._elem); + } + else{ + tr = $('<tr class="jqplot-table-legend"></tr>').appendTo(this._elem); + } + for (j=0; j<nc; j++) { + if (idx < pd.length){ + // debugger + lt = this.labels[idx] || pd[idx][0].toString(); + color = s.color; + if (!reverse){ + if (i>0){ + pad = true; + } + else{ + pad = false; + } + } + else{ + if (i == nr -1){ + pad = false; + } + else{ + pad = true; + } + } + rs = (pad) ? this.rowSpacing : '0'; + + td1 = $('<td class="jqplot-table-legend" style="text-align:center;padding-top:'+rs+';">'+ + '<div><div class="jqplot-table-legend-swatch" style="border-color:'+color+';"></div>'+ + '</div></td>'); + td2 = $('<td class="jqplot-table-legend" style="padding-top:'+rs+';"></td>'); + if (this.escapeHtml){ + td2.text(lt); + } + else { + td2.html(lt); + } + if (reverse) { + td2.prependTo(tr); + td1.prependTo(tr); + } + else { + td1.appendTo(tr); + td2.appendTo(tr); + } + pad = true; + } + idx++; + } + } + } + } + return this._elem; + }; + + + // setup default renderers for axes and legend so user doesn't have to + // called with scope of plot + function preInit(target, data, options) { + // debugger + options = options || {}; + options.axesDefaults = options.axesDefaults || {}; + options.legend = options.legend || {}; + options.seriesDefaults = options.seriesDefaults || {}; + options.grid = options.grid || {}; + + // only set these if there is a gauge series + var setopts = false; + if (options.seriesDefaults.renderer == $.jqplot.MeterGaugeRenderer) { + setopts = true; + } + else if (options.series) { + for (var i=0; i < options.series.length; i++) { + if (options.series[i].renderer == $.jqplot.MeterGaugeRenderer) { + setopts = true; + } + } + } + + if (setopts) { + options.axesDefaults.renderer = $.jqplot.MeterGaugeAxisRenderer; + options.legend.renderer = $.jqplot.MeterGaugeLegendRenderer; + options.legend.preDraw = true; + options.grid.background = options.grid.background || 'white'; + options.grid.drawGridlines = false; + options.grid.borderWidth = (options.grid.borderWidth != null) ? options.grid.borderWidth : 0; + options.grid.shadow = (options.grid.shadow != null) ? options.grid.shadow : false; + } + } + + // called with scope of plot + function postParseOptions(options) { + // + } + + $.jqplot.preInitHooks.push(preInit); + $.jqplot.postParseOptionsHooks.push(postParseOptions); + + $.jqplot.MeterGaugeTickRenderer = function() { + $.jqplot.AxisTickRenderer.call(this); + }; + + $.jqplot.MeterGaugeTickRenderer.prototype = new $.jqplot.AxisTickRenderer(); + $.jqplot.MeterGaugeTickRenderer.prototype.constructor = $.jqplot.MeterGaugeTickRenderer; + +})(jQuery); + + \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/plugins/jqplot.meterGaugeRenderer.min.js b/libreplan-webapp/src/main/webapp/jqplot/plugins/jqplot.meterGaugeRenderer.min.js new file mode 100644 index 000000000..52f7bdc2c --- /dev/null +++ b/libreplan-webapp/src/main/webapp/jqplot/plugins/jqplot.meterGaugeRenderer.min.js @@ -0,0 +1,57 @@ +/** + * jqPlot + * Pure JavaScript plotting plugin using jQuery + * + * Version: 1.0.0b2_r1012 + * + * Copyright (c) 2009-2011 Chris Leonello + * jqPlot is currently available for use in all personal or commercial projects + * under both the MIT (http://www.opensource.org/licenses/mit-license.php) and GPL + * version 2.0 (http://www.gnu.org/licenses/gpl-2.0.html) licenses. This means that you can + * choose the license that best suits your project and use it accordingly. + * + * Although not required, the author would appreciate an email letting him + * know of any substantial use of jqPlot. You can reach the author at: + * chris at jqplot dot com or see http://www.jqplot.com/info.php . + * + * If you are feeling kind and generous, consider supporting the project by + * making a donation at: http://www.jqplot.com/donate.php . + * + * sprintf functions contained in jqplot.sprintf.js by Ash Searle: + * + * version 2007.04.27 + * author Ash Searle + * http://hexmen.com/blog/2007/03/printf-sprintf/ + * http://hexmen.com/js/sprintf.js + * The author (Ash Searle) has placed this code in the public domain: + * "This code is unrestricted: you are free to use it however you like." + * + * included jsDate library by Chris Leonello: + * + * Copyright (c) 2010-2011 Chris Leonello + * + * jsDate is currently available for use in all personal or commercial projects + * under both the MIT and GPL version 2.0 licenses. This means that you can + * choose the license that best suits your project and use it accordingly. + * + * jsDate borrows many concepts and ideas from the Date Instance + * Methods by Ken Snyder along with some parts of Ken's actual code. + * + * Ken's origianl Date Instance Methods and copyright notice: + * + * Ken Snyder (ken d snyder at gmail dot com) + * 2008-09-10 + * version 2.0.2 (http://kendsnyder.com/sandbox/date/) + * Creative Commons Attribution License 3.0 (http://creativecommons.org/licenses/by/3.0/) + * + * jqplotToImage function based on Larry Siden's export-jqplot-to-png.js. + * Larry has generously given permission to adapt his code for inclusion + * into jqPlot. + * + * Larry's original code can be found here: + * + * https://github.com/lsiden/export-jqplot-to-png + * + * + */ +(function(c){c.jqplot.MeterGaugeRenderer=function(){c.jqplot.LineRenderer.call(this)};c.jqplot.MeterGaugeRenderer.prototype=new c.jqplot.LineRenderer();c.jqplot.MeterGaugeRenderer.prototype.constructor=c.jqplot.MeterGaugeRenderer;c.jqplot.MeterGaugeRenderer.prototype.init=function(e){this.diameter=null;this.padding=null;this.shadowOffset=2;this.shadowAlpha=0.07;this.shadowDepth=4;this.background="#efefef";this.ringColor="#BBC6D0";this.needleColor="#C3D3E5";this.tickColor="989898";this.ringWidth=null;this.min;this.max;this.ticks=[];this.showTicks=true;this.showTickLabels=true;this.label=null;this.labelHeightAdjust=0;this.labelPosition="inside";this.intervals=[];this.intervalColors=["#4bb2c5","#EAA228","#c5b47f","#579575","#839557","#958c12","#953579","#4b5de4","#d8b83f","#ff5800","#0085cc","#c747a3","#cddf54","#FBD178","#26B4E3","#bd70c7"];this.intervalInnerRadius=null;this.intervalOuterRadius=null;this.tickRenderer=c.jqplot.MeterGaugeTickRenderer;this.tickPositions=[1,2,2.5,5,10];this.tickSpacing=30;this.numberMinorTicks=null;this.hubRadius=null;this.tickPadding=null;this.needleThickness=null;this.needlePad=6;this.pegNeedle=true;this._type="meterGauge";c.extend(true,this,e);this.type=null;this.numberTicks=null;this.tickInterval=null;this.span=180;if(this.type=="circular"){this.semiCircular=false}else{if(this.type!="circular"){this.semiCircular=true}else{this.semiCircular=(this.span<=180)?true:false}}this._tickPoints=[];this._labelElem=null;this.startAngle=(90+(360-this.span)/2)*Math.PI/180;this.endAngle=(90-(360-this.span)/2)*Math.PI/180;this.setmin=!!(this.min==null);this.setmax=!!(this.max==null);if(this.intervals.length){if(this.intervals[0].length==null||this.intervals.length==1){for(var f=0;f<this.intervals.length;f++){this.intervals[f]=[this.intervals[f],this.intervals[f],this.intervalColors[f]]}}else{if(this.intervals[0].length==2){for(f=0;f<this.intervals.length;f++){this.intervals[f]=[this.intervals[f][0],this.intervals[f][1],this.intervalColors[f]]}}}}if(this.ticks.length){if(this.ticks[0].length==null||this.ticks[0].length==1){for(var f=0;f<this.ticks.length;f++){this.ticks[f]=[this.ticks[f],this.ticks[f]]}}this.min=(this.min==null)?this.ticks[0][0]:this.min;this.max=(this.max==null)?this.ticks[this.ticks.length-1][0]:this.max;this.setmin=false;this.setmax=false;this.numberTicks=this.ticks.length;this.tickInterval=this.ticks[1][0]-this.ticks[0][0];this.tickFactor=Math.floor(parseFloat((Math.log(this.tickInterval)/Math.log(10)).toFixed(11)));this.numberMinorTicks=b(this.tickPositions,this.tickInterval,this.tickFactor);if(!this.numberMinorTicks){this.numberMinorTicks=b(this.tickPositions,this.tickInterval,this.tickFactor-1)}if(!this.numberMinorTicks){this.numberMinorTicks=1}}else{if(this.intervals.length){this.min=(this.min==null)?0:this.min;this.setmin=false;if(this.max==null){if(this.intervals[this.intervals.length-1][0]>=this.data[0][1]){this.max=this.intervals[this.intervals.length-1][0];this.setmax=false}}else{this.setmax=false}}else{this.min=(this.min==null)?0:this.min;this.setmin=false;if(this.max==null){this.max=this.data[0][1]*1.25;this.setmax=true}else{this.setmax=false}}}};c.jqplot.MeterGaugeRenderer.prototype.setGridData=function(j){var f=[];var k=[];var e=this.startAngle;for(var h=0;h<this.data.length;h++){f.push(this.data[h][1]);k.push([this.data[h][0]]);if(h>0){f[h]+=f[h-1]}}var g=Math.PI*2/f[f.length-1];for(var h=0;h<f.length;h++){k[h][1]=f[h]*g}this.gridData=k};c.jqplot.MeterGaugeRenderer.prototype.makeGridData=function(j,k){var f=[];var l=[];var e=this.startAngle;for(var h=0;h<j.length;h++){f.push(j[h][1]);l.push([j[h][0]]);if(h>0){f[h]+=f[h-1]}}var g=Math.PI*2/f[f.length-1];for(var h=0;h<f.length;h++){l[h][1]=f[h]*g}return l};function b(j,f,g){var e;for(var h=j.length-1;h>=0;h--){e=f/(j[h]*Math.pow(10,g));if(e==4||e==5){return e-1}}return null}c.jqplot.MeterGaugeRenderer.prototype.draw=function(X,aC,ap){var aa;var aM=(ap!=undefined)?ap:{};var ai=0;var ah=0;var at=1;if(ap.legendInfo&&ap.legendInfo.placement=="inside"){var aI=ap.legendInfo;switch(aI.location){case"nw":ai=aI.width+aI.xoffset;break;case"w":ai=aI.width+aI.xoffset;break;case"sw":ai=aI.width+aI.xoffset;break;case"ne":ai=aI.width+aI.xoffset;at=-1;break;case"e":ai=aI.width+aI.xoffset;at=-1;break;case"se":ai=aI.width+aI.xoffset;at=-1;break;case"n":ah=aI.height+aI.yoffset;break;case"s":ah=aI.height+aI.yoffset;at=-1;break;default:break}}if(this.label){this._labelElem=c('<div class="jqplot-meterGauge-label" style="position:absolute;">'+this.label+"</div>");this.canvas._elem.after(this._labelElem)}var m=(aM.shadow!=undefined)?aM.shadow:this.shadow;var N=(aM.showLine!=undefined)?aM.showLine:this.showLine;var I=(aM.fill!=undefined)?aM.fill:this.fill;var K=X.canvas.width;var S=X.canvas.height;if(this.padding==null){this.padding=Math.round(Math.min(K,S)/30)}var Q=K-ai-2*this.padding;var ab=S-ah-2*this.padding;if(this.labelPosition=="bottom"&&this.label){ab-=this._labelElem.outerHeight(true)}var L=Math.min(Q,ab);var ad=L;if(!this.diameter){if(this.semiCircular){if(Q>=2*ab){if(!this.ringWidth){this.ringWidth=2*ab/35}this.needleThickness=this.needleThickness||2+Math.pow(this.ringWidth,0.8);this.innerPad=this.ringWidth/2+this.needleThickness/2+this.needlePad;this.diameter=2*(ab-2*this.innerPad)}else{if(!this.ringWidth){this.ringWidth=Q/35}this.needleThickness=this.needleThickness||2+Math.pow(this.ringWidth,0.8);this.innerPad=this.ringWidth/2+this.needleThickness/2+this.needlePad;this.diameter=Q-2*this.innerPad-this.ringWidth-this.padding}this._center=[(K-at*ai)/2+at*ai,(S+at*ah-this.padding-this.ringWidth-this.innerPad)]}else{if(!this.ringWidth){this.ringWidth=ad/35}this.needleThickness=this.needleThickness||2+Math.pow(this.ringWidth,0.8);this.innerPad=0;this.diameter=ad-this.ringWidth;this._center=[(K-at*ai)/2+at*ai,(S-at*ah)/2+at*ah]}}if(this._labelElem&&this.labelPosition=="bottom"){this._center[1]-=this._labelElem.outerHeight(true)}this._radius=this.diameter/2;this.tickSpacing=6000/this.diameter;if(!this.hubRadius){this.hubRadius=this.diameter/18}this.shadowOffset=0.5+this.ringWidth/9;this.shadowWidth=this.ringWidth*1;this.tickPadding=3+Math.pow(this.diameter/20,0.7);this.tickOuterRadius=this._radius-this.ringWidth/2-this.tickPadding;this.tickLength=(this.showTicks)?this._radius/13:0;if(this.ticks.length==0){var A=this.max,aL=this.min,q=this.setmax,aG=this.setmin,au=(A-aL)*this.tickSpacing/this.span;var aw=Math.floor(parseFloat((Math.log(au)/Math.log(10)).toFixed(11)));var an=(au/Math.pow(10,aw));(an>2&&an<=2.5)?an=2.5:an=Math.ceil(an);var T=this.tickPositions;var aA,ak;for(aa=0;aa<T.length;aa++){if(an==T[aa]||aa&&T[aa-1]<an&&an<T[aa]){au=T[aa]*Math.pow(10,aw);aA=aa}}for(aa=0;aa<T.length;aa++){if(an==T[aa]||aa&&T[aa-1]<an&&an<T[aa]){au=T[aa]*Math.pow(10,aw);ak=Math.ceil((A-aL)/au)}}if(q&&aG){var aP=(aL>0)?aL-aL%au:aL-aL%au-au;if(!this.forceZero){var D=Math.min(aL-aP,0.8*au);var o=Math.floor(D/T[aA]);if(o>1){aP=aP+T[aA]*(o-1);if(parseInt(aP,10)!=aP&&parseInt(aP-T[aA],10)==aP-T[aA]){aP=aP-T[aA]}}}if(aL==aP){aL-=au}else{if(aL-aP>0.23*au){aL=aP}else{aL=aP-au;ak+=1}}ak+=1;var E=aL+(ak-1)*au;if(A>=E){E+=au;ak+=1}if(E-A<0.23*au){E+=au;ak+=1}this.max=A=E;this.min=aL;this.tickInterval=au;this.numberTicks=ak;var O;for(aa=0;aa<ak;aa++){O=parseFloat((aL+aa*au).toFixed(11));this.ticks.push([O,O])}this.max=this.ticks[ak-1][1];this.tickFactor=aw;this.numberMinorTicks=b(this.tickPositions,this.tickInterval,this.tickFactor);if(!this.numberMinorTicks){this.numberMinorTicks=b(this.tickPositions,this.tickInterval,this.tickFactor-1)}}else{if(q){var E=aL+(ak-1)*au;if(A>=E){A=E+au;ak+=1}else{A=E}this.tickInterval=this.tickInterval||au;this.numberTicks=this.numberTicks||ak;var O;for(aa=0;aa<this.numberTicks;aa++){O=parseFloat((aL+aa*this.tickInterval).toFixed(11));this.ticks.push([O,O])}this.max=this.ticks[this.numberTicks-1][1];this.tickFactor=aw;this.numberMinorTicks=b(this.tickPositions,this.tickInterval,this.tickFactor);if(!this.numberMinorTicks){this.numberMinorTicks=b(this.tickPositions,this.tickInterval,this.tickFactor-1)}}}if(!q&&!aG){var P=this.max-this.min;aw=Math.floor(parseFloat((Math.log(P)/Math.log(10)).toFixed(11)))-1;var aN=[5,6,4,7,3,8,9,10,2],V,C,av=0,M;if(P>1){var aJ=String(P);if(aJ.search(/\./)==-1){var aF=aJ.search(/0+$/);av=(aF>0)?aJ.length-aF-1:0}}M=P/Math.pow(10,av);for(aa=0;aa<aN.length;aa++){V=M/(aN[aa]-1);if(V==parseInt(V,10)){this.numberTicks=aN[aa];this.tickInterval=P/(this.numberTicks-1);this.tickFactor=aw+1;break}}var O;for(aa=0;aa<this.numberTicks;aa++){O=parseFloat((this.min+aa*this.tickInterval).toFixed(11));this.ticks.push([O,O])}this.numberMinorTicks=b(this.tickPositions,this.tickInterval,this.tickFactor);if(!this.numberMinorTicks){this.numberMinorTicks=b(this.tickPositions,this.tickInterval,this.tickFactor-1)}if(!this.numberMinorTicks){this.numberMinorTicks=1;var aH=[4,5,3,6,2];for(aa=0;aa<5;aa++){var ao=this.tickInterval/aH[aa];if(ao==parseInt(ao,10)){this.numberMinorTicks=aH[aa]-1;break}}}}}var U=this._radius,aE=this.startAngle,k=this.endAngle,H=Math.PI,e=Math.PI/2;if(this.semiCircular){var z=Math.atan(this.innerPad/U),ac=this.outerStartAngle=aE-z,aB=this.outerEndAngle=k+z,B=this.hubStartAngle=aE-Math.atan(this.innerPad/this.hubRadius*2),af=this.hubEndAngle=k+Math.atan(this.innerPad/this.hubRadius*2);X.save();X.translate(this._center[0],this._center[1]);X.lineJoin="round";X.lineCap="round";X.save();X.beginPath();X.fillStyle=this.background;X.arc(0,0,U,ac,aB,false);X.closePath();X.fill();X.restore();var aj="rgba(0,0,0,"+this.shadowAlpha+")";X.save();for(var aa=0;aa<this.shadowDepth;aa++){X.translate(this.shadowOffset*Math.cos(this.shadowAngle/180*Math.PI),this.shadowOffset*Math.sin(this.shadowAngle/180*Math.PI));X.beginPath();X.strokeStyle=aj;X.lineWidth=this.shadowWidth;X.arc(0,0,U,ac,aB,false);X.closePath();X.stroke()}X.restore();X.save();var az=parseInt((this.shadowDepth+1)/2,10);for(var aa=0;aa<az;aa++){X.translate(this.shadowOffset*Math.cos(this.shadowAngle/180*Math.PI),this.shadowOffset*Math.sin(this.shadowAngle/180*Math.PI));X.beginPath();X.fillStyle=aj;X.arc(0,0,this.hubRadius,B,af,false);X.closePath();X.fill()}X.restore();X.save();X.beginPath();X.strokeStyle=this.ringColor;X.lineWidth=this.ringWidth;X.arc(0,0,U,ac,aB,false);X.closePath();X.stroke();X.restore();X.save();X.beginPath();X.fillStyle=this.ringColor;X.arc(0,0,this.hubRadius,B,af,false);X.closePath();X.fill();X.restore();if(this.showTicks){X.save();var f=this.tickOuterRadius,aq=this.tickLength,v=aq/2,F=this.numberMinorTicks,am=this.span*Math.PI/180/(this.ticks.length-1),p=am/(F+1);for(aa=0;aa<this.ticks.length;aa++){X.beginPath();X.lineWidth=1.5+this.diameter/360;X.strokeStyle=this.ringColor;var ae=am*aa+aE;X.moveTo(-f*Math.cos(am*aa+aE),f*Math.sin(am*aa+aE));X.lineTo(-(f-aq)*Math.cos(am*aa+aE),(f-aq)*Math.sin(am*aa+aE));this._tickPoints.push([(f-aq)*Math.cos(am*aa+aE)+this._center[0]+this.canvas._offsets.left,(f-aq)*Math.sin(am*aa+aE)+this._center[1]+this.canvas._offsets.top,am*aa+aE]);X.stroke();X.lineWidth=1+this.diameter/440;if(aa<this.ticks.length-1){for(var Y=1;Y<=F;Y++){X.beginPath();X.moveTo(-f*Math.cos(am*aa+p*Y+aE),f*Math.sin(am*aa+p*Y+aE));X.lineTo(-(f-v)*Math.cos(am*aa+p*Y+aE),(f-v)*Math.sin(am*aa+p*Y+aE));X.stroke()}}}X.restore()}if(this.showTickLabels){var J,W,T,aO,g,G,n=0;var an=this.tickPadding*(1-1/(this.diameter/80+1));for(aa=0;aa<this.ticks.length;aa++){J=c('<div class="jqplot-meterGauge-tick" style="position:absolute;">'+this.ticks[aa][1]+"</div>");this.canvas._elem.after(J);aO=J.outerWidth(true);g=J.outerHeight(true);W=this._tickPoints[aa][0]-aO*(this._tickPoints[aa][2]-Math.PI)/Math.PI-an*Math.cos(this._tickPoints[aa][2]);T=this._tickPoints[aa][1]-g/2+g/2*Math.pow(Math.abs((Math.sin(this._tickPoints[aa][2]))),0.5)+an/3*Math.pow(Math.abs((Math.sin(this._tickPoints[aa][2]))),0.5);J.css({left:W,top:T});G=aO*Math.cos(this._tickPoints[aa][2])+g*Math.sin(Math.PI/2+this._tickPoints[aa][2]/2);n=(G>n)?G:n}}if(this.label&&this.labelPosition=="inside"){var W=this._center[0]+this.canvas._offsets.left;var an=this.tickPadding*(1-1/(this.diameter/80+1));var T=0.5*(this._center[1]+this.canvas._offsets.top-this.hubRadius)+0.5*(this._center[1]+this.canvas._offsets.top-this.tickOuterRadius+this.tickLength+an)+this.labelHeightAdjust;W-=this._labelElem.outerWidth(true)/2;T-=this._labelElem.outerHeight(true)/2;this._labelElem.css({left:W,top:T})}else{if(this.label&&this.labelPosition=="bottom"){var W=this._center[0]+this.canvas._offsets.left-this._labelElem.outerWidth(true)/2;var T=this._center[1]+this.canvas._offsets.top+this.innerPad+ +this.ringWidth+this.padding+this.labelHeightAdjust;this._labelElem.css({left:W,top:T})}}X.save();var ax=this.intervalInnerRadius||this.hubRadius*1.5;if(this.intervalOuterRadius==null){if(this.showTickLabels){var ag=(this.tickOuterRadius-this.tickLength-this.tickPadding-this.diameter/8)}else{var ag=(this.tickOuterRadius-this.tickLength-this.diameter/16)}}else{var ag=this.intervalOuterRadius}var P=this.max-this.min;var aD=this.intervals[this.intervals.length-1]-this.min;var y,Z,u=this.span*Math.PI/180;for(aa=0;aa<this.intervals.length;aa++){y=(aa==0)?aE:aE+(this.intervals[aa-1][0]-this.min)*u/P;if(y<0){y=0}Z=aE+(this.intervals[aa][0]-this.min)*u/P;if(Z<0){Z=0}X.beginPath();X.fillStyle=this.intervals[aa][2];X.arc(0,0,ax,y,Z,false);X.lineTo(ag*Math.cos(Z),ag*Math.sin(Z));X.arc(0,0,ag,Z,y,true);X.lineTo(ax*Math.cos(y),ax*Math.sin(y));X.closePath();X.fill()}X.restore();var ay=this.data[0][1];var R=this.max-this.min;if(this.pegNeedle){if(this.data[0][1]>this.max+R*3/this.span){ay=this.max+R*3/this.span}if(this.data[0][1]<this.min-R*3/this.span){ay=this.min-R*3/this.span}}var al=(ay-this.min)/R*this.span*Math.PI/180+this.startAngle;X.save();X.beginPath();X.fillStyle=this.ringColor;X.strokeStyle=this.ringColor;this.needleLength=(this.tickOuterRadius-this.tickLength)*0.85;this.needleThickness=(this.needleThickness<2)?2:this.needleThickness;var aK=this.needleThickness*0.4;var x=this.needleLength/10;var s=(this.needleThickness-aK)/10;var ar;for(var aa=0;aa<10;aa++){ar=this.needleThickness-aa*s;X.moveTo(x*aa*Math.cos(al),x*aa*Math.sin(al));X.lineWidth=ar;X.lineTo(x*(aa+1)*Math.cos(al),x*(aa+1)*Math.sin(al));X.stroke()}X.restore()}else{this._center=[(K-at*ai)/2+at*ai,(S-at*ah)/2+at*ah]}};c.jqplot.MeterGaugeAxisRenderer=function(){c.jqplot.LinearAxisRenderer.call(this)};c.jqplot.MeterGaugeAxisRenderer.prototype=new c.jqplot.LinearAxisRenderer();c.jqplot.MeterGaugeAxisRenderer.prototype.constructor=c.jqplot.MeterGaugeAxisRenderer;c.jqplot.MeterGaugeAxisRenderer.prototype.init=function(e){this.tickRenderer=c.jqplot.MeterGaugeTickRenderer;c.extend(true,this,e);this._dataBounds={min:0,max:100};this.min=0;this.max=100;this.showTicks=false;this.ticks=[];this.showMark=false;this.show=false};c.jqplot.MeterGaugeLegendRenderer=function(){c.jqplot.TableLegendRenderer.call(this)};c.jqplot.MeterGaugeLegendRenderer.prototype=new c.jqplot.TableLegendRenderer();c.jqplot.MeterGaugeLegendRenderer.prototype.constructor=c.jqplot.MeterGaugeLegendRenderer;c.jqplot.MeterGaugeLegendRenderer.prototype.init=function(e){this.numberRows=null;this.numberColumns=null;c.extend(true,this,e)};c.jqplot.MeterGaugeLegendRenderer.prototype.draw=function(){if(this.show){var p=this._series;var x="position:absolute;";x+=(this.background)?"background:"+this.background+";":"";x+=(this.border)?"border:"+this.border+";":"";x+=(this.fontSize)?"font-size:"+this.fontSize+";":"";x+=(this.fontFamily)?"font-family:"+this.fontFamily+";":"";x+=(this.textColor)?"color:"+this.textColor+";":"";x+=(this.marginTop!=null)?"margin-top:"+this.marginTop+";":"";x+=(this.marginBottom!=null)?"margin-bottom:"+this.marginBottom+";":"";x+=(this.marginLeft!=null)?"margin-left:"+this.marginLeft+";":"";x+=(this.marginRight!=null)?"margin-right:"+this.marginRight+";":"";this._elem=c('<table class="jqplot-table-legend" style="'+x+'"></table>');var f=false,q=false,u,o;var w=p[0];if(w.show){var t=w.data;if(this.numberRows){u=this.numberRows;if(!this.numberColumns){o=Math.ceil(t.length/u)}else{o=this.numberColumns}}else{if(this.numberColumns){o=this.numberColumns;u=Math.ceil(t.length/this.numberColumns)}else{u=t.length;o=1}}var n,m,r,g,e,l,k,h;var v=0;for(n=0;n<u;n++){if(q){r=c('<tr class="jqplot-table-legend"></tr>').prependTo(this._elem)}else{r=c('<tr class="jqplot-table-legend"></tr>').appendTo(this._elem)}for(m=0;m<o;m++){if(v<t.length){l=this.labels[v]||t[v][0].toString();h=w.color;if(!q){if(n>0){f=true}else{f=false}}else{if(n==u-1){f=false}else{f=true}}k=(f)?this.rowSpacing:"0";g=c('<td class="jqplot-table-legend" style="text-align:center;padding-top:'+k+';"><div><div class="jqplot-table-legend-swatch" style="border-color:'+h+';"></div></div></td>');e=c('<td class="jqplot-table-legend" style="padding-top:'+k+';"></td>');if(this.escapeHtml){e.text(l)}else{e.html(l)}if(q){e.prependTo(r);g.prependTo(r)}else{g.appendTo(r);e.appendTo(r)}f=true}v++}}}}return this._elem};function a(j,h,f){f=f||{};f.axesDefaults=f.axesDefaults||{};f.legend=f.legend||{};f.seriesDefaults=f.seriesDefaults||{};f.grid=f.grid||{};var e=false;if(f.seriesDefaults.renderer==c.jqplot.MeterGaugeRenderer){e=true}else{if(f.series){for(var g=0;g<f.series.length;g++){if(f.series[g].renderer==c.jqplot.MeterGaugeRenderer){e=true}}}}if(e){f.axesDefaults.renderer=c.jqplot.MeterGaugeAxisRenderer;f.legend.renderer=c.jqplot.MeterGaugeLegendRenderer;f.legend.preDraw=true;f.grid.background=f.grid.background||"white";f.grid.drawGridlines=false;f.grid.borderWidth=(f.grid.borderWidth!=null)?f.grid.borderWidth:0;f.grid.shadow=(f.grid.shadow!=null)?f.grid.shadow:false}}function d(e){}c.jqplot.preInitHooks.push(a);c.jqplot.postParseOptionsHooks.push(d);c.jqplot.MeterGaugeTickRenderer=function(){c.jqplot.AxisTickRenderer.call(this)};c.jqplot.MeterGaugeTickRenderer.prototype=new c.jqplot.AxisTickRenderer();c.jqplot.MeterGaugeTickRenderer.prototype.constructor=c.jqplot.MeterGaugeTickRenderer})(jQuery); \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/plugins/jqplot.ohlcRenderer.js b/libreplan-webapp/src/main/webapp/jqplot/plugins/jqplot.ohlcRenderer.js new file mode 100644 index 000000000..671e43164 --- /dev/null +++ b/libreplan-webapp/src/main/webapp/jqplot/plugins/jqplot.ohlcRenderer.js @@ -0,0 +1,372 @@ +/** + * jqPlot + * Pure JavaScript plotting plugin using jQuery + * + * Version: 1.0.0b2_r1012 + * + * Copyright (c) 2009-2011 Chris Leonello + * jqPlot is currently available for use in all personal or commercial projects + * under both the MIT (http://www.opensource.org/licenses/mit-license.php) and GPL + * version 2.0 (http://www.gnu.org/licenses/gpl-2.0.html) licenses. This means that you can + * choose the license that best suits your project and use it accordingly. + * + * Although not required, the author would appreciate an email letting him + * know of any substantial use of jqPlot. You can reach the author at: + * chris at jqplot dot com or see http://www.jqplot.com/info.php . + * + * If you are feeling kind and generous, consider supporting the project by + * making a donation at: http://www.jqplot.com/donate.php . + * + * sprintf functions contained in jqplot.sprintf.js by Ash Searle: + * + * version 2007.04.27 + * author Ash Searle + * http://hexmen.com/blog/2007/03/printf-sprintf/ + * http://hexmen.com/js/sprintf.js + * The author (Ash Searle) has placed this code in the public domain: + * "This code is unrestricted: you are free to use it however you like." + * + */ +(function($) { + /** + * Class: $.jqplot.OHLCRenderer + * jqPlot Plugin to draw Open Hi Low Close, Candlestick and Hi Low Close charts. + * + * To use this plugin, include the renderer js file in + * your source: + * + * > <script type="text/javascript" src="plugins/jqplot.ohlcRenderer.js"></script> + * + * You will most likely want to use a date axis renderer + * for the x axis also, so include the date axis render js file also: + * + * > <script type="text/javascript" src="plugins/jqplot.dateAxisRenderer.js"></script> + * + * Then you set the renderer in the series options on your plot: + * + * > series: [{renderer:$.jqplot.OHLCRenderer}] + * + * For OHLC and candlestick charts, data should be specified + * like so: + * + * > dat = [['07/06/2009',138.7,139.68,135.18,135.4], ['06/29/2009',143.46,144.66,139.79,140.02], ...] + * + * If the data array has only 4 values per point instead of 5, + * the renderer will create a Hi Low Close chart instead. In that case, + * data should be supplied like: + * + * > dat = [['07/06/2009',139.68,135.18,135.4], ['06/29/2009',144.66,139.79,140.02], ...] + * + * To generate a candlestick chart instead of an OHLC chart, + * set the "candlestick" option to true: + * + * > series: [{renderer:$.jqplot.OHLCRenderer, rendererOptions:{candleStick:true}}], + * + */ + $.jqplot.OHLCRenderer = function(){ + // subclass line renderer to make use of some of it's methods. + $.jqplot.LineRenderer.call(this); + // prop: candleStick + // true to render chart as candleStick. + // Must have an open price, cannot be a hlc chart. + this.candleStick = false; + // prop: tickLength + // length of the line in pixels indicating open and close price. + // Default will auto calculate based on plot width and + // number of points displayed. + this.tickLength = 'auto'; + // prop: bodyWidth + // width of the candlestick body in pixels. Default will auto calculate + // based on plot width and number of candlesticks displayed. + this.bodyWidth = 'auto'; + // prop: openColor + // color of the open price tick mark. Default is series color. + this.openColor = null; + // prop: closeColor + // color of the close price tick mark. Default is series color. + this.closeColor = null; + // prop: wickColor + // color of the hi-lo line thorugh the candlestick body. + // Default is the series color. + this.wickColor = null; + // prop: fillUpBody + // true to render an "up" day (close price greater than open price) + // with a filled candlestick body. + this.fillUpBody = false; + // prop: fillDownBody + // true to render a "down" day (close price lower than open price) + // with a filled candlestick body. + this.fillDownBody = true; + // prop: upBodyColor + // Color of candlestick body of an "up" day. Default is series color. + this.upBodyColor = null; + // prop: downBodyColor + // Color of candlestick body on a "down" day. Default is series color. + this.downBodyColor = null; + // prop: hlc + // true if is a hi-low-close chart (no open price). + // This is determined automatically from the series data. + this.hlc = false; + // prop: lineWidth + // Width of the hi-low line and open/close ticks. + // Must be set in the rendererOptions for the series. + this.lineWidth = 1.5; + this._tickLength; + this._bodyWidth; + }; + + $.jqplot.OHLCRenderer.prototype = new $.jqplot.LineRenderer(); + $.jqplot.OHLCRenderer.prototype.constructor = $.jqplot.OHLCRenderer; + + // called with scope of series. + $.jqplot.OHLCRenderer.prototype.init = function(options) { + options = options || {}; + // lineWidth has to be set on the series, changes in renderer + // constructor have no effect. set the default here + // if no renderer option for lineWidth is specified. + this.lineWidth = options.lineWidth || 1.5; + $.jqplot.LineRenderer.prototype.init.call(this, options); + this._type = 'ohlc'; + // set the yaxis data bounds here to account for hi and low values + var db = this._yaxis._dataBounds; + var d = this._plotData; + // if data points have less than 5 values, force a hlc chart. + if (d[0].length < 5) { + this.renderer.hlc = true; + + for (var j=0; j<d.length; j++) { + if (d[j][2] < db.min || db.min == null) { + db.min = d[j][2]; + } + if (d[j][1] > db.max || db.max == null) { + db.max = d[j][1]; + } + } + } + else { + for (var j=0; j<d.length; j++) { + if (d[j][3] < db.min || db.min == null) { + db.min = d[j][3]; + } + if (d[j][2] > db.max || db.max == null) { + db.max = d[j][2]; + } + } + } + + }; + + // called within scope of series. + $.jqplot.OHLCRenderer.prototype.draw = function(ctx, gd, options) { + var d = this.data; + var xmin = this._xaxis.min; + var xmax = this._xaxis.max; + // index of last value below range of plot. + var xminidx = 0; + // index of first value above range of plot. + var xmaxidx = d.length; + var xp = this._xaxis.series_u2p; + var yp = this._yaxis.series_u2p; + var i, prevColor, ops, b, h, w, a, points; + var o; + var r = this.renderer; + var opts = (options != undefined) ? options : {}; + var shadow = (opts.shadow != undefined) ? opts.shadow : this.shadow; + var fill = (opts.fill != undefined) ? opts.fill : this.fill; + var fillAndStroke = (opts.fillAndStroke != undefined) ? opts.fillAndStroke : this.fillAndStroke; + r.bodyWidth = (opts.bodyWidth != undefined) ? opts.bodyWidth : r.bodyWidth; + r.tickLength = (opts.tickLength != undefined) ? opts.tickLength : r.tickLength; + ctx.save(); + if (this.show) { + var x, open, hi, low, close; + // need to get widths based on number of points shown, + // not on total number of points. Use the results + // to speed up drawing in next step. + for (var i=0; i<d.length; i++) { + if (d[i][0] < xmin) { + xminidx = i; + } + else if (d[i][0] < xmax) { + xmaxidx = i+1; + } + } + + var dwidth = this.gridData[xmaxidx-1][0] - this.gridData[xminidx][0]; + var nvisiblePoints = xmaxidx - xminidx; + try { + var dinterval = Math.abs(this._xaxis.series_u2p(parseInt(this._xaxis._intervalStats[0].sortedIntervals[0].interval, 10)) - this._xaxis.series_u2p(0)); + } + + catch (e) { + var dinterval = dwidth / nvisiblePoints; + } + + if (r.candleStick) { + if (typeof(r.bodyWidth) == 'number') { + r._bodyWidth = r.bodyWidth; + } + else { + r._bodyWidth = Math.min(20, dinterval/1.65); + } + } + else { + if (typeof(r.tickLength) == 'number') { + r._tickLength = r.tickLength; + } + else { + r._tickLength = Math.min(10, dinterval/3.5); + } + } + + for (var i=xminidx; i<xmaxidx; i++) { + x = xp(d[i][0]); + if (r.hlc) { + open = null; + hi = yp(d[i][1]); + low = yp(d[i][2]); + close = yp(d[i][3]); + } + else { + open = yp(d[i][1]); + hi = yp(d[i][2]); + low = yp(d[i][3]); + close = yp(d[i][4]); + } + o = {}; + if (r.candleStick && !r.hlc) { + w = r._bodyWidth; + a = x - w/2; + // draw candle + // determine if candle up or down + // up, remember grid coordinates increase downward + if (close < open) { + // draw wick + if (r.wickColor) { + o.color = r.wickColor; + } + else if (r.downBodyColor) { + o.color = r.upBodyColor; + } + ops = $.extend(true, {}, opts, o); + r.shapeRenderer.draw(ctx, [[x, hi], [x, close]], ops); + r.shapeRenderer.draw(ctx, [[x, open], [x, low]], ops); + o = {}; + b = close; + h = open - close; + // if color specified, use it + if (r.fillUpBody) { + o.fillRect = true; + } + else { + o.strokeRect = true; + w = w - this.lineWidth; + a = x - w/2; + } + if (r.upBodyColor) { + o.color = r.upBodyColor; + o.fillStyle = r.upBodyColor; + } + points = [a, b, w, h]; + } + // down + else if (close > open) { + // draw wick + if (r.wickColor) { + o.color = r.wickColor; + } + else if (r.downBodyColor) { + o.color = r.downBodyColor; + } + ops = $.extend(true, {}, opts, o); + r.shapeRenderer.draw(ctx, [[x, hi], [x, open]], ops); + r.shapeRenderer.draw(ctx, [[x, close], [x, low]], ops); + + o = {}; + + b = open; + h = close - open; + // if color specified, use it + if (r.fillDownBody) { + o.fillRect = true; + } + else { + o.strokeRect = true; + w = w - this.lineWidth; + a = x - w/2; + } + if (r.downBodyColor) { + o.color = r.downBodyColor; + o.fillStyle = r.downBodyColor; + } + points = [a, b, w, h]; + } + // even, open = close + else { + // draw wick + if (r.wickColor) { + o.color = r.wickColor; + } + ops = $.extend(true, {}, opts, o); + r.shapeRenderer.draw(ctx, [[x, hi], [x, low]], ops); + o = {}; + o.fillRect = false; + o.strokeRect = false; + a = [x - w/2, open]; + b = [x + w/2, close]; + w = null; + h = null; + points = [a, b]; + } + ops = $.extend(true, {}, opts, o); + r.shapeRenderer.draw(ctx, points, ops); + } + else { + prevColor = opts.color; + if (r.openColor) { + opts.color = r.openColor; + } + // draw open tick + if (!r.hlc) { + r.shapeRenderer.draw(ctx, [[x-r._tickLength, open], [x, open]], opts); + } + opts.color = prevColor; + // draw wick + if (r.wickColor) { + opts.color = r.wickColor; + } + r.shapeRenderer.draw(ctx, [[x, hi], [x, low]], opts); + opts.color = prevColor; + // draw close tick + if (r.closeColor) { + opts.color = r.closeColor; + } + r.shapeRenderer.draw(ctx, [[x, close], [x+r._tickLength, close]], opts); + opts.color = prevColor; + } + } + } + + ctx.restore(); + }; + + $.jqplot.OHLCRenderer.prototype.drawShadow = function(ctx, gd, options) { + // This is a no-op, shadows drawn with lines. + }; + + // called with scope of plot. + $.jqplot.OHLCRenderer.checkOptions = function(target, data, options) { + // provide some sensible highlighter options by default + // These aren't good for hlc, only for ohlc or candlestick + if (!options.highlighter) { + options.highlighter = { + showMarker:false, + tooltipAxes: 'y', + yvalues: 4, + formatString:'<table class="jqplot-highlighter"><tr><td>date:</td><td>%s</td></tr><tr><td>open:</td><td>%s</td></tr><tr><td>hi:</td><td>%s</td></tr><tr><td>low:</td><td>%s</td></tr><tr><td>close:</td><td>%s</td></tr></table>' + }; + } + }; + + //$.jqplot.preInitHooks.push($.jqplot.OHLCRenderer.checkOptions); + +})(jQuery); \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/plugins/jqplot.ohlcRenderer.min.js b/libreplan-webapp/src/main/webapp/jqplot/plugins/jqplot.ohlcRenderer.min.js new file mode 100644 index 000000000..0d8f89a74 --- /dev/null +++ b/libreplan-webapp/src/main/webapp/jqplot/plugins/jqplot.ohlcRenderer.min.js @@ -0,0 +1,57 @@ +/** + * jqPlot + * Pure JavaScript plotting plugin using jQuery + * + * Version: 1.0.0b2_r1012 + * + * Copyright (c) 2009-2011 Chris Leonello + * jqPlot is currently available for use in all personal or commercial projects + * under both the MIT (http://www.opensource.org/licenses/mit-license.php) and GPL + * version 2.0 (http://www.gnu.org/licenses/gpl-2.0.html) licenses. This means that you can + * choose the license that best suits your project and use it accordingly. + * + * Although not required, the author would appreciate an email letting him + * know of any substantial use of jqPlot. You can reach the author at: + * chris at jqplot dot com or see http://www.jqplot.com/info.php . + * + * If you are feeling kind and generous, consider supporting the project by + * making a donation at: http://www.jqplot.com/donate.php . + * + * sprintf functions contained in jqplot.sprintf.js by Ash Searle: + * + * version 2007.04.27 + * author Ash Searle + * http://hexmen.com/blog/2007/03/printf-sprintf/ + * http://hexmen.com/js/sprintf.js + * The author (Ash Searle) has placed this code in the public domain: + * "This code is unrestricted: you are free to use it however you like." + * + * included jsDate library by Chris Leonello: + * + * Copyright (c) 2010-2011 Chris Leonello + * + * jsDate is currently available for use in all personal or commercial projects + * under both the MIT and GPL version 2.0 licenses. This means that you can + * choose the license that best suits your project and use it accordingly. + * + * jsDate borrows many concepts and ideas from the Date Instance + * Methods by Ken Snyder along with some parts of Ken's actual code. + * + * Ken's origianl Date Instance Methods and copyright notice: + * + * Ken Snyder (ken d snyder at gmail dot com) + * 2008-09-10 + * version 2.0.2 (http://kendsnyder.com/sandbox/date/) + * Creative Commons Attribution License 3.0 (http://creativecommons.org/licenses/by/3.0/) + * + * jqplotToImage function based on Larry Siden's export-jqplot-to-png.js. + * Larry has generously given permission to adapt his code for inclusion + * into jqPlot. + * + * Larry's original code can be found here: + * + * https://github.com/lsiden/export-jqplot-to-png + * + * + */ +(function(a){a.jqplot.OHLCRenderer=function(){a.jqplot.LineRenderer.call(this);this.candleStick=false;this.tickLength="auto";this.bodyWidth="auto";this.openColor=null;this.closeColor=null;this.wickColor=null;this.fillUpBody=false;this.fillDownBody=true;this.upBodyColor=null;this.downBodyColor=null;this.hlc=false;this.lineWidth=1.5;this._tickLength;this._bodyWidth};a.jqplot.OHLCRenderer.prototype=new a.jqplot.LineRenderer();a.jqplot.OHLCRenderer.prototype.constructor=a.jqplot.OHLCRenderer;a.jqplot.OHLCRenderer.prototype.init=function(e){e=e||{};this.lineWidth=e.lineWidth||1.5;a.jqplot.LineRenderer.prototype.init.call(this,e);this._type="ohlc";var b=this._yaxis._dataBounds;var f=this._plotData;if(f[0].length<5){this.renderer.hlc=true;for(var c=0;c<f.length;c++){if(f[c][2]<b.min||b.min==null){b.min=f[c][2]}if(f[c][1]>b.max||b.max==null){b.max=f[c][1]}}}else{for(var c=0;c<f.length;c++){if(f[c][3]<b.min||b.min==null){b.min=f[c][3]}if(f[c][2]>b.max||b.max==null){b.max=f[c][2]}}}};a.jqplot.OHLCRenderer.prototype.draw=function(A,N,j){var J=this.data;var v=this._xaxis.min;var z=this._xaxis.max;var l=0;var K=J.length;var p=this._xaxis.series_u2p;var G=this._yaxis.series_u2p;var D,E,f,M,F,n,O,C;var y;var u=this.renderer;var s=(j!=undefined)?j:{};var k=(s.shadow!=undefined)?s.shadow:this.shadow;var B=(s.fill!=undefined)?s.fill:this.fill;var c=(s.fillAndStroke!=undefined)?s.fillAndStroke:this.fillAndStroke;u.bodyWidth=(s.bodyWidth!=undefined)?s.bodyWidth:u.bodyWidth;u.tickLength=(s.tickLength!=undefined)?s.tickLength:u.tickLength;A.save();if(this.show){var m,q,g,Q,t;for(var D=0;D<J.length;D++){if(J[D][0]<v){l=D}else{if(J[D][0]<z){K=D+1}}}var I=this.gridData[K-1][0]-this.gridData[l][0];var L=K-l;try{var P=Math.abs(this._xaxis.series_u2p(parseInt(this._xaxis._intervalStats[0].sortedIntervals[0].interval,10))-this._xaxis.series_u2p(0))}catch(H){var P=I/L}if(u.candleStick){if(typeof(u.bodyWidth)=="number"){u._bodyWidth=u.bodyWidth}else{u._bodyWidth=Math.min(20,P/1.65)}}else{if(typeof(u.tickLength)=="number"){u._tickLength=u.tickLength}else{u._tickLength=Math.min(10,P/3.5)}}for(var D=l;D<K;D++){m=p(J[D][0]);if(u.hlc){q=null;g=G(J[D][1]);Q=G(J[D][2]);t=G(J[D][3])}else{q=G(J[D][1]);g=G(J[D][2]);Q=G(J[D][3]);t=G(J[D][4])}y={};if(u.candleStick&&!u.hlc){n=u._bodyWidth;O=m-n/2;if(t<q){if(u.wickColor){y.color=u.wickColor}else{if(u.downBodyColor){y.color=u.upBodyColor}}f=a.extend(true,{},s,y);u.shapeRenderer.draw(A,[[m,g],[m,t]],f);u.shapeRenderer.draw(A,[[m,q],[m,Q]],f);y={};M=t;F=q-t;if(u.fillUpBody){y.fillRect=true}else{y.strokeRect=true;n=n-this.lineWidth;O=m-n/2}if(u.upBodyColor){y.color=u.upBodyColor;y.fillStyle=u.upBodyColor}C=[O,M,n,F]}else{if(t>q){if(u.wickColor){y.color=u.wickColor}else{if(u.downBodyColor){y.color=u.downBodyColor}}f=a.extend(true,{},s,y);u.shapeRenderer.draw(A,[[m,g],[m,q]],f);u.shapeRenderer.draw(A,[[m,t],[m,Q]],f);y={};M=q;F=t-q;if(u.fillDownBody){y.fillRect=true}else{y.strokeRect=true;n=n-this.lineWidth;O=m-n/2}if(u.downBodyColor){y.color=u.downBodyColor;y.fillStyle=u.downBodyColor}C=[O,M,n,F]}else{if(u.wickColor){y.color=u.wickColor}f=a.extend(true,{},s,y);u.shapeRenderer.draw(A,[[m,g],[m,Q]],f);y={};y.fillRect=false;y.strokeRect=false;O=[m-n/2,q];M=[m+n/2,t];n=null;F=null;C=[O,M]}}f=a.extend(true,{},s,y);u.shapeRenderer.draw(A,C,f)}else{E=s.color;if(u.openColor){s.color=u.openColor}if(!u.hlc){u.shapeRenderer.draw(A,[[m-u._tickLength,q],[m,q]],s)}s.color=E;if(u.wickColor){s.color=u.wickColor}u.shapeRenderer.draw(A,[[m,g],[m,Q]],s);s.color=E;if(u.closeColor){s.color=u.closeColor}u.shapeRenderer.draw(A,[[m,t],[m+u._tickLength,t]],s);s.color=E}}}A.restore()};a.jqplot.OHLCRenderer.prototype.drawShadow=function(b,d,c){};a.jqplot.OHLCRenderer.checkOptions=function(d,c,b){if(!b.highlighter){b.highlighter={showMarker:false,tooltipAxes:"y",yvalues:4,formatString:'<table class="jqplot-highlighter"><tr><td>date:</td><td>%s</td></tr><tr><td>open:</td><td>%s</td></tr><tr><td>hi:</td><td>%s</td></tr><tr><td>low:</td><td>%s</td></tr><tr><td>close:</td><td>%s</td></tr></table>'}}}})(jQuery); \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/plugins/jqplot.pieRenderer.js b/libreplan-webapp/src/main/webapp/jqplot/plugins/jqplot.pieRenderer.js new file mode 100644 index 000000000..e399483d3 --- /dev/null +++ b/libreplan-webapp/src/main/webapp/jqplot/plugins/jqplot.pieRenderer.js @@ -0,0 +1,899 @@ +/** + * jqPlot + * Pure JavaScript plotting plugin using jQuery + * + * Version: 1.0.0b2_r1012 + * + * Copyright (c) 2009-2011 Chris Leonello + * jqPlot is currently available for use in all personal or commercial projects + * under both the MIT (http://www.opensource.org/licenses/mit-license.php) and GPL + * version 2.0 (http://www.gnu.org/licenses/gpl-2.0.html) licenses. This means that you can + * choose the license that best suits your project and use it accordingly. + * + * Although not required, the author would appreciate an email letting him + * know of any substantial use of jqPlot. You can reach the author at: + * chris at jqplot dot com or see http://www.jqplot.com/info.php . + * + * If you are feeling kind and generous, consider supporting the project by + * making a donation at: http://www.jqplot.com/donate.php . + * + * sprintf functions contained in jqplot.sprintf.js by Ash Searle: + * + * version 2007.04.27 + * author Ash Searle + * http://hexmen.com/blog/2007/03/printf-sprintf/ + * http://hexmen.com/js/sprintf.js + * The author (Ash Searle) has placed this code in the public domain: + * "This code is unrestricted: you are free to use it however you like." + * + */ +(function($) { + /** + * Class: $.jqplot.PieRenderer + * Plugin renderer to draw a pie chart. + * x values, if present, will be used as slice labels. + * y values give slice size. + * + * To use this renderer, you need to include the + * pie renderer plugin, for example: + * + * > <script type="text/javascript" src="plugins/jqplot.pieRenderer.js"></script> + * + * Properties described here are passed into the $.jqplot function + * as options on the series renderer. For example: + * + * > plot2 = $.jqplot('chart2', [s1, s2], { + * > seriesDefaults: { + * > renderer:$.jqplot.PieRenderer, + * > rendererOptions:{ + * > sliceMargin: 2, + * > startAngle: -90 + * > } + * > } + * > }); + * + * A pie plot will trigger events on the plot target + * according to user interaction. All events return the event object, + * the series index, the point (slice) index, and the point data for + * the appropriate slice. + * + * 'jqplotDataMouseOver' - triggered when user mouseing over a slice. + * 'jqplotDataHighlight' - triggered the first time user mouses over a slice, + * if highlighting is enabled. + * 'jqplotDataUnhighlight' - triggered when a user moves the mouse out of + * a highlighted slice. + * 'jqplotDataClick' - triggered when the user clicks on a slice. + * 'jqplotDataRightClick' - tiggered when the user right clicks on a slice if + * the "captureRightClick" option is set to true on the plot. + */ + $.jqplot.PieRenderer = function(){ + $.jqplot.LineRenderer.call(this); + }; + + $.jqplot.PieRenderer.prototype = new $.jqplot.LineRenderer(); + $.jqplot.PieRenderer.prototype.constructor = $.jqplot.PieRenderer; + + // called with scope of a series + $.jqplot.PieRenderer.prototype.init = function(options, plot) { + // Group: Properties + // + // prop: diameter + // Outer diameter of the pie, auto computed by default + this.diameter = null; + // prop: padding + // padding between the pie and plot edges, legend, etc. + this.padding = 20; + // prop: sliceMargin + // angular spacing between pie slices in degrees. + this.sliceMargin = 0; + // prop: fill + // true or false, wether to fil the slices. + this.fill = true; + // prop: shadowOffset + // offset of the shadow from the slice and offset of + // each succesive stroke of the shadow from the last. + this.shadowOffset = 2; + // prop: shadowAlpha + // transparency of the shadow (0 = transparent, 1 = opaque) + this.shadowAlpha = 0.07; + // prop: shadowDepth + // number of strokes to apply to the shadow, + // each stroke offset shadowOffset from the last. + this.shadowDepth = 5; + // prop: highlightMouseOver + // True to highlight slice when moused over. + // This must be false to enable highlightMouseDown to highlight when clicking on a slice. + this.highlightMouseOver = true; + // prop: highlightMouseDown + // True to highlight when a mouse button is pressed over a slice. + // This will be disabled if highlightMouseOver is true. + this.highlightMouseDown = false; + // prop: highlightColors + // an array of colors to use when highlighting a slice. + this.highlightColors = []; + // prop: dataLabels + // Either 'label', 'value', 'percent' or an array of labels to place on the pie slices. + // Defaults to percentage of each pie slice. + this.dataLabels = 'percent'; + // prop: showDataLabels + // true to show data labels on slices. + this.showDataLabels = false; + // prop: dataLabelFormatString + // Format string for data labels. If none, '%s' is used for "label" and for arrays, '%d' for value and '%d%%' for percentage. + this.dataLabelFormatString = null; + // prop: dataLabelThreshold + // 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. + this.dataLabelThreshold = 3; + // prop: dataLabelPositionFactor + // A Multiplier (0-1) of the pie radius which controls position of label on slice. + // Increasing will slide label toward edge of pie, decreasing will slide label toward center of pie. + this.dataLabelPositionFactor = 0.52; + // prop: dataLabelNudge + // Number of pixels to slide the label away from (+) or toward (-) the center of the pie. + this.dataLabelNudge = 2; + // prop: dataLabelCenterOn + // True to center the data label at its position. + // False to set the inside facing edge of the label at its position. + this.dataLabelCenterOn = true; + // prop: startAngle + // Angle to start drawing pie in degrees. + // According to orientation of canvas coordinate system: + // 0 = on the positive x axis + // -90 = on the positive y axis. + // 90 = on the negaive y axis. + // 180 or - 180 = on the negative x axis. + this.startAngle = 0; + this.tickRenderer = $.jqplot.PieTickRenderer; + // Used as check for conditions where pie shouldn't be drawn. + this._drawData = true; + this._type = 'pie'; + + // if user has passed in highlightMouseDown option and not set highlightMouseOver, disable highlightMouseOver + if (options.highlightMouseDown && options.highlightMouseOver == null) { + options.highlightMouseOver = false; + } + + $.extend(true, this, options); + + if (this.sliceMargin < 0) { + this.sliceMargin = 0; + } + + this._diameter = null; + this._radius = null; + // array of [start,end] angles arrays, one for each slice. In radians. + this._sliceAngles = []; + // index of the currenty highlighted point, if any + this._highlightedPoint = null; + + // set highlight colors if none provided + if (this.highlightColors.length == 0) { + for (var i=0; i<this.seriesColors.length; i++){ + var rgba = $.jqplot.getColorComponents(this.seriesColors[i]); + var newrgb = [rgba[0], rgba[1], rgba[2]]; + var sum = newrgb[0] + newrgb[1] + newrgb[2]; + for (var j=0; j<3; j++) { + // when darkening, lowest color component can be is 60. + newrgb[j] = (sum > 570) ? newrgb[j] * 0.8 : newrgb[j] + 0.3 * (255 - newrgb[j]); + newrgb[j] = parseInt(newrgb[j], 10); + } + this.highlightColors.push('rgb('+newrgb[0]+','+newrgb[1]+','+newrgb[2]+')'); + } + } + + this.highlightColorGenerator = new $.jqplot.ColorGenerator(this.highlightColors); + + plot.postParseOptionsHooks.addOnce(postParseOptions); + plot.postInitHooks.addOnce(postInit); + plot.eventListenerHooks.addOnce('jqplotMouseMove', handleMove); + plot.eventListenerHooks.addOnce('jqplotMouseDown', handleMouseDown); + plot.eventListenerHooks.addOnce('jqplotMouseUp', handleMouseUp); + plot.eventListenerHooks.addOnce('jqplotClick', handleClick); + plot.eventListenerHooks.addOnce('jqplotRightClick', handleRightClick); + plot.postDrawHooks.addOnce(postPlotDraw); + }; + + $.jqplot.PieRenderer.prototype.setGridData = function(plot) { + // set gridData property. This will hold angle in radians of each data point. + var stack = []; + var td = []; + var sa = this.startAngle/180*Math.PI; + var tot = 0; + // don't know if we have any valid data yet, so set plot to not draw. + this._drawData = false; + for (var i=0; i<this.data.length; i++){ + if (this.data[i][1] != 0) { + // we have data, O.K. to draw. + this._drawData = true; + } + stack.push(this.data[i][1]); + td.push([this.data[i][0]]); + if (i>0) { + stack[i] += stack[i-1]; + } + tot += this.data[i][1]; + } + var fact = Math.PI*2/stack[stack.length - 1]; + + for (var i=0; i<stack.length; i++) { + td[i][1] = stack[i] * fact; + td[i][2] = this.data[i][1]/tot; + } + this.gridData = td; + }; + + $.jqplot.PieRenderer.prototype.makeGridData = function(data, plot) { + var stack = []; + var td = []; + var tot = 0; + var sa = this.startAngle/180*Math.PI; + // don't know if we have any valid data yet, so set plot to not draw. + this._drawData = false; + for (var i=0; i<data.length; i++){ + if (this.data[i][1] != 0) { + // we have data, O.K. to draw. + this._drawData = true; + } + stack.push(data[i][1]); + td.push([data[i][0]]); + if (i>0) { + stack[i] += stack[i-1]; + } + tot += data[i][1]; + } + var fact = Math.PI*2/stack[stack.length - 1]; + + for (var i=0; i<stack.length; i++) { + td[i][1] = stack[i] * fact; + td[i][2] = data[i][1]/tot; + } + return td; + }; + + function calcRadiusAdjustment(ang) { + return Math.sin((ang - (ang-Math.PI) / 8 / Math.PI )/2.0); + } + + function calcRPrime(ang1, ang2, sliceMargin, fill, lineWidth) { + var rprime = 0; + var ang = ang2 - ang1; + var absang = Math.abs(ang); + var sm = sliceMargin; + if (fill == false) { + sm += lineWidth; + } + + if (sm > 0 && absang > 0.01 && absang < 6.282) { + rprime = parseFloat(sm) / 2.0 / calcRadiusAdjustment(ang); + } + + return rprime; + } + + $.jqplot.PieRenderer.prototype.drawSlice = function (ctx, ang1, ang2, color, isShadow) { + if (this._drawData) { + var r = this._radius; + var fill = this.fill; + var lineWidth = this.lineWidth; + var sm = this.sliceMargin; + if (this.fill == false) { + sm += this.lineWidth; + } + ctx.save(); + ctx.translate(this._center[0], this._center[1]); + + var rprime = calcRPrime(ang1, ang2, this.sliceMargin, this.fill, this.lineWidth); + + var transx = rprime * Math.cos((ang1 + ang2) / 2.0); + var transy = rprime * Math.sin((ang1 + ang2) / 2.0); + + if ((ang2 - ang1) <= Math.PI) { + r -= rprime; + } + else { + r += rprime; + } + + ctx.translate(transx, transy); + + if (isShadow) { + for (var i=0, l=this.shadowDepth; i<l; i++) { + ctx.save(); + ctx.translate(this.shadowOffset*Math.cos(this.shadowAngle/180*Math.PI), this.shadowOffset*Math.sin(this.shadowAngle/180*Math.PI)); + doDraw(r); + } + for (var i=0, l=this.shadowDepth; i<l; i++) { + ctx.restore(); + } + } + + else { + doDraw(r); + } + ctx.restore(); + } + + function doDraw (rad) { + // Fix for IE and Chrome that can't seem to draw circles correctly. + // ang2 should always be <= 2 pi since that is the way the data is converted. + // 2Pi = 6.2831853, Pi = 3.1415927 + if (ang2 > 6.282 + this.startAngle) { + ang2 = 6.282 + this.startAngle; + if (ang1 > ang2) { + ang1 = 6.281 + this.startAngle; + } + } + // Fix for IE, where it can't seem to handle 0 degree angles. Also avoids + // ugly line on unfilled pies. + if (ang1 >= ang2) { + return; + } + + ctx.beginPath(); + ctx.fillStyle = color; + ctx.strokeStyle = color; + ctx.lineWidth = lineWidth; + ctx.arc(0, 0, rad, ang1, ang2, false); + ctx.lineTo(0,0); + ctx.closePath(); + + if (fill) { + ctx.fill(); + } + else { + ctx.stroke(); + } + } + }; + + // called with scope of series + $.jqplot.PieRenderer.prototype.draw = function (ctx, gd, options, plot) { + var i; + var opts = (options != undefined) ? options : {}; + // offset and direction of offset due to legend placement + var offx = 0; + var offy = 0; + var trans = 1; + var colorGenerator = new $.jqplot.ColorGenerator(this.seriesColors); + if (options.legendInfo && options.legendInfo.placement == 'insideGrid') { + var li = options.legendInfo; + switch (li.location) { + case 'nw': + offx = li.width + li.xoffset; + break; + case 'w': + offx = li.width + li.xoffset; + break; + case 'sw': + offx = li.width + li.xoffset; + break; + case 'ne': + offx = li.width + li.xoffset; + trans = -1; + break; + case 'e': + offx = li.width + li.xoffset; + trans = -1; + break; + case 'se': + offx = li.width + li.xoffset; + trans = -1; + break; + case 'n': + offy = li.height + li.yoffset; + break; + case 's': + offy = li.height + li.yoffset; + trans = -1; + break; + default: + break; + } + } + + var shadow = (opts.shadow != undefined) ? opts.shadow : this.shadow; + var fill = (opts.fill != undefined) ? opts.fill : this.fill; + var cw = ctx.canvas.width; + var ch = ctx.canvas.height; + var w = cw - offx - 2 * this.padding; + var h = ch - offy - 2 * this.padding; + var mindim = Math.min(w,h); + var d = mindim; + + // Fixes issue #272. Thanks hugwijst! + // reset slice angles array. + this._sliceAngles = []; + + var sm = this.sliceMargin; + if (this.fill == false) { + sm += this.lineWidth; + } + + var rprime; + var maxrprime = 0; + + var ang, ang1, ang2, shadowColor; + var sa = this.startAngle / 180 * Math.PI; + + // have to pre-draw shadows, so loop throgh here and calculate some values also. + for (var i=0, l=gd.length; i<l; i++) { + ang1 = (i == 0) ? sa : gd[i-1][1] + sa; + ang2 = gd[i][1] + sa; + + this._sliceAngles.push([ang1, ang2]); + + rprime = calcRPrime(ang1, ang2, this.sliceMargin, this.fill, this.lineWidth); + + if (Math.abs(ang2-ang1) > Math.PI) { + maxrprime = Math.max(rprime, maxrprime); + } + } + + if (this.diameter != null && this.diameter > 0) { + this._diameter = this.diameter - 2*maxrprime; + } + else { + this._diameter = d - 2*maxrprime; + } + + // Need to check for undersized pie. This can happen if + // plot area too small and legend is too big. + if (this._diameter < 6) { + $.jqplot.log('Diameter of pie too small, not rendering.'); + return; + } + + var r = this._radius = this._diameter/2; + + this._center = [(cw - trans * offx)/2 + trans * offx + maxrprime * Math.cos(sa), (ch - trans*offy)/2 + trans * offy + maxrprime * Math.sin(sa)]; + + if (this.shadow) { + for (var i=0, l=gd.length; i<l; i++) { + shadowColor = 'rgba(0,0,0,'+this.shadowAlpha+')'; + this.renderer.drawSlice.call (this, ctx, this._sliceAngles[i][0], this._sliceAngles[i][1], shadowColor, true); + } + } + + for (var i=0; i<gd.length; i++) { + + this.renderer.drawSlice.call (this, ctx, this._sliceAngles[i][0], this._sliceAngles[i][1], colorGenerator.next(), false); + + if (this.showDataLabels && gd[i][2]*100 >= this.dataLabelThreshold) { + var fstr, avgang = (this._sliceAngles[i][0] + this._sliceAngles[i][1])/2, label; + + if (this.dataLabels == 'label') { + fstr = this.dataLabelFormatString || '%s'; + label = $.jqplot.sprintf(fstr, gd[i][0]); + } + else if (this.dataLabels == 'value') { + fstr = this.dataLabelFormatString || '%d'; + label = $.jqplot.sprintf(fstr, this.data[i][1]); + } + else if (this.dataLabels == 'percent') { + fstr = this.dataLabelFormatString || '%d%%'; + label = $.jqplot.sprintf(fstr, gd[i][2]*100); + } + else if (this.dataLabels.constructor == Array) { + fstr = this.dataLabelFormatString || '%s'; + label = $.jqplot.sprintf(fstr, this.dataLabels[i]); + } + + var fact = (this._radius ) * this.dataLabelPositionFactor + this.sliceMargin + this.dataLabelNudge; + + var x = this._center[0] + Math.cos(avgang) * fact + this.canvas._offsets.left; + var y = this._center[1] + Math.sin(avgang) * fact + this.canvas._offsets.top; + + var labelelem = $('<div class="jqplot-pie-series jqplot-data-label" style="position:absolute;">' + label + '</div>').insertBefore(plot.eventCanvas._elem); + if (this.dataLabelCenterOn) { + x -= labelelem.width()/2; + y -= labelelem.height()/2; + } + else { + x -= labelelem.width() * Math.sin(avgang/2); + y -= labelelem.height()/2; + } + x = Math.round(x); + y = Math.round(y); + labelelem.css({left: x, top: y}); + } + } + }; + + $.jqplot.PieAxisRenderer = function() { + $.jqplot.LinearAxisRenderer.call(this); + }; + + $.jqplot.PieAxisRenderer.prototype = new $.jqplot.LinearAxisRenderer(); + $.jqplot.PieAxisRenderer.prototype.constructor = $.jqplot.PieAxisRenderer; + + + // There are no traditional axes on a pie chart. We just need to provide + // dummy objects with properties so the plot will render. + // called with scope of axis object. + $.jqplot.PieAxisRenderer.prototype.init = function(options){ + // + this.tickRenderer = $.jqplot.PieTickRenderer; + $.extend(true, this, options); + // I don't think I'm going to need _dataBounds here. + // have to go Axis scaling in a way to fit chart onto plot area + // and provide u2p and p2u functionality for mouse cursor, etc. + // for convienence set _dataBounds to 0 and 100 and + // set min/max to 0 and 100. + this._dataBounds = {min:0, max:100}; + this.min = 0; + this.max = 100; + this.showTicks = false; + this.ticks = []; + this.showMark = false; + this.show = false; + }; + + + + + $.jqplot.PieLegendRenderer = function(){ + $.jqplot.TableLegendRenderer.call(this); + }; + + $.jqplot.PieLegendRenderer.prototype = new $.jqplot.TableLegendRenderer(); + $.jqplot.PieLegendRenderer.prototype.constructor = $.jqplot.PieLegendRenderer; + + /** + * Class: $.jqplot.PieLegendRenderer + * Legend Renderer specific to pie plots. Set by default + * when user creates a pie plot. + */ + $.jqplot.PieLegendRenderer.prototype.init = function(options) { + // Group: Properties + // + // prop: numberRows + // Maximum number of rows in the legend. 0 or null for unlimited. + this.numberRows = null; + // prop: numberColumns + // Maximum number of columns in the legend. 0 or null for unlimited. + this.numberColumns = null; + $.extend(true, this, options); + }; + + // called with context of legend + $.jqplot.PieLegendRenderer.prototype.draw = function() { + var legend = this; + if (this.show) { + var series = this._series; + + + this._elem = $(document.createElement('table')); + this._elem.addClass('jqplot-table-legend'); + + var ss = {position:'absolute'}; + if (this.background) { + ss['background'] = this.background; + } + if (this.border) { + ss['border'] = this.border; + } + if (this.fontSize) { + ss['fontSize'] = this.fontSize; + } + if (this.fontFamily) { + ss['fontFamily'] = this.fontFamily; + } + if (this.textColor) { + ss['textColor'] = this.textColor; + } + if (this.marginTop != null) { + ss['marginTop'] = this.marginTop; + } + if (this.marginBottom != null) { + ss['marginBottom'] = this.marginBottom; + } + if (this.marginLeft != null) { + ss['marginLeft'] = this.marginLeft; + } + if (this.marginRight != null) { + ss['marginRight'] = this.marginRight; + } + + this._elem.css(ss); + + // Pie charts legends don't go by number of series, but by number of data points + // in the series. Refactor things here for that. + + var pad = false, + reverse = false, + nr, + nc; + var s = series[0]; + var colorGenerator = new $.jqplot.ColorGenerator(s.seriesColors); + + if (s.show) { + var pd = s.data; + if (this.numberRows) { + nr = this.numberRows; + if (!this.numberColumns){ + nc = Math.ceil(pd.length/nr); + } + else{ + nc = this.numberColumns; + } + } + else if (this.numberColumns) { + nc = this.numberColumns; + nr = Math.ceil(pd.length/this.numberColumns); + } + else { + nr = pd.length; + nc = 1; + } + + var i, j; + var tr, td1, td2; + var lt, rs, color; + var idx = 0; + var div0, div1; + + for (i=0; i<nr; i++) { + tr = $(document.createElement('tr')); + tr.addClass('jqplot-table-legend'); + + if (reverse){ + tr.prependTo(this._elem); + } + + else{ + tr.appendTo(this._elem); + } + + for (j=0; j<nc; j++) { + if (idx < pd.length){ + lt = this.labels[idx] || pd[idx][0].toString(); + color = colorGenerator.next(); + if (!reverse){ + if (i>0){ + pad = true; + } + else{ + pad = false; + } + } + else{ + if (i == nr -1){ + pad = false; + } + else{ + pad = true; + } + } + rs = (pad) ? this.rowSpacing : '0'; + + + + td1 = $(document.createElement('td')); + td1.addClass('jqplot-table-legend jqplot-table-legend-swatch'); + td1.css({textAlign: 'center', paddingTop: rs}); + + div0 = $(document.createElement('div')); + div0.addClass('jqplot-table-legend-swatch-outline'); + div1 = $(document.createElement('div')); + div1.addClass('jqplot-table-legend-swatch'); + div1.css({backgroundColor: color, borderColor: color}); + td1.append(div0.append(div1)); + + td2 = $(document.createElement('td')); + td2.addClass('jqplot-table-legend jqplot-table-legend-label'); + td2.css('paddingTop', rs); + + if (this.escapeHtml){ + td2.text(lt); + } + else { + td2.html(lt); + } + if (reverse) { + td2.prependTo(tr); + td1.prependTo(tr); + } + else { + td1.appendTo(tr); + td2.appendTo(tr); + } + pad = true; + } + idx++; + } + } + } + } + return this._elem; + }; + + $.jqplot.PieRenderer.prototype.handleMove = function(ev, gridpos, datapos, neighbor, plot) { + if (neighbor) { + var ins = [neighbor.seriesIndex, neighbor.pointIndex, neighbor.data]; + plot.target.trigger('jqplotDataMouseOver', ins); + if (plot.series[ins[0]].highlightMouseOver && !(ins[0] == plot.plugins.pieRenderer.highlightedSeriesIndex && ins[1] == plot.series[ins[0]]._highlightedPoint)) { + plot.target.trigger('jqplotDataHighlight', ins); + highlight (plot, ins[0], ins[1]); + } + } + else if (neighbor == null) { + unhighlight (plot); + } + }; + + + // this.eventCanvas._elem.bind($.jqplot.eventListenerHooks[i][0], {plot:this}, $.jqplot.eventListenerHooks[i][1]); + + // setup default renderers for axes and legend so user doesn't have to + // called with scope of plot + function preInit(target, data, options) { + options = options || {}; + options.axesDefaults = options.axesDefaults || {}; + options.legend = options.legend || {}; + options.seriesDefaults = options.seriesDefaults || {}; + // only set these if there is a pie series + var setopts = false; + if (options.seriesDefaults.renderer == $.jqplot.PieRenderer) { + setopts = true; + } + else if (options.series) { + for (var i=0; i < options.series.length; i++) { + if (options.series[i].renderer == $.jqplot.PieRenderer) { + setopts = true; + } + } + } + + if (setopts) { + options.axesDefaults.renderer = $.jqplot.PieAxisRenderer; + options.legend.renderer = $.jqplot.PieLegendRenderer; + options.legend.preDraw = true; + options.seriesDefaults.pointLabels = {show: false}; + } + } + + function postInit(target, data, options) { + for (var i=0; i<this.series.length; i++) { + if (this.series[i].renderer.constructor == $.jqplot.PieRenderer) { + // don't allow mouseover and mousedown at same time. + if (this.series[i].highlightMouseOver) { + this.series[i].highlightMouseDown = false; + } + } + } + } + + // called with scope of plot + function postParseOptions(options) { + for (var i=0; i<this.series.length; i++) { + this.series[i].seriesColors = this.seriesColors; + this.series[i].colorGenerator = $.jqplot.colorGenerator; + } + } + + function highlight (plot, sidx, pidx) { + var s = plot.series[sidx]; + var canvas = plot.plugins.pieRenderer.highlightCanvas; + canvas._ctx.clearRect(0,0,canvas._ctx.canvas.width, canvas._ctx.canvas.height); + s._highlightedPoint = pidx; + plot.plugins.pieRenderer.highlightedSeriesIndex = sidx; + s.renderer.drawSlice.call(s, canvas._ctx, s._sliceAngles[pidx][0], s._sliceAngles[pidx][1], s.highlightColorGenerator.get(pidx), false); + } + + function unhighlight (plot) { + var canvas = plot.plugins.pieRenderer.highlightCanvas; + canvas._ctx.clearRect(0,0, canvas._ctx.canvas.width, canvas._ctx.canvas.height); + for (var i=0; i<plot.series.length; i++) { + plot.series[i]._highlightedPoint = null; + } + plot.plugins.pieRenderer.highlightedSeriesIndex = null; + plot.target.trigger('jqplotDataUnhighlight'); + } + + function handleMove(ev, gridpos, datapos, neighbor, plot) { + if (neighbor) { + var ins = [neighbor.seriesIndex, neighbor.pointIndex, neighbor.data]; + var evt1 = jQuery.Event('jqplotDataMouseOver'); + evt1.pageX = ev.pageX; + evt1.pageY = ev.pageY; + plot.target.trigger(evt1, ins); + if (plot.series[ins[0]].highlightMouseOver && !(ins[0] == plot.plugins.pieRenderer.highlightedSeriesIndex && ins[1] == plot.series[ins[0]]._highlightedPoint)) { + var evt = jQuery.Event('jqplotDataHighlight'); + evt.pageX = ev.pageX; + evt.pageY = ev.pageY; + plot.target.trigger(evt, ins); + highlight (plot, ins[0], ins[1]); + } + } + else if (neighbor == null) { + unhighlight (plot); + } + } + + function handleMouseDown(ev, gridpos, datapos, neighbor, plot) { + if (neighbor) { + var ins = [neighbor.seriesIndex, neighbor.pointIndex, neighbor.data]; + if (plot.series[ins[0]].highlightMouseDown && !(ins[0] == plot.plugins.pieRenderer.highlightedSeriesIndex && ins[1] == plot.series[ins[0]]._highlightedPoint)) { + var evt = jQuery.Event('jqplotDataHighlight'); + evt.pageX = ev.pageX; + evt.pageY = ev.pageY; + plot.target.trigger(evt, ins); + highlight (plot, ins[0], ins[1]); + } + } + else if (neighbor == null) { + unhighlight (plot); + } + } + + function handleMouseUp(ev, gridpos, datapos, neighbor, plot) { + var idx = plot.plugins.pieRenderer.highlightedSeriesIndex; + if (idx != null && plot.series[idx].highlightMouseDown) { + unhighlight(plot); + } + } + + function handleClick(ev, gridpos, datapos, neighbor, plot) { + if (neighbor) { + var ins = [neighbor.seriesIndex, neighbor.pointIndex, neighbor.data]; + var evt = jQuery.Event('jqplotDataClick'); + evt.pageX = ev.pageX; + evt.pageY = ev.pageY; + plot.target.trigger(evt, ins); + } + } + + function handleRightClick(ev, gridpos, datapos, neighbor, plot) { + if (neighbor) { + var ins = [neighbor.seriesIndex, neighbor.pointIndex, neighbor.data]; + var idx = plot.plugins.pieRenderer.highlightedSeriesIndex; + if (idx != null && plot.series[idx].highlightMouseDown) { + unhighlight(plot); + } + var evt = jQuery.Event('jqplotDataRightClick'); + evt.pageX = ev.pageX; + evt.pageY = ev.pageY; + plot.target.trigger(evt, ins); + } + } + + // called within context of plot + // create a canvas which we can draw on. + // insert it before the eventCanvas, so eventCanvas will still capture events. + function postPlotDraw() { + // Memory Leaks patch + if (this.plugins.pieRenderer && this.plugins.pieRenderer.highlightCanvas) { + this.plugins.pieRenderer.highlightCanvas.resetCanvas(); + this.plugins.pieRenderer.highlightCanvas = null; + } + + this.plugins.pieRenderer = {highlightedSeriesIndex:null}; + this.plugins.pieRenderer.highlightCanvas = new $.jqplot.GenericCanvas(); + + // do we have any data labels? if so, put highlight canvas before those + var labels = $(this.targetId+' .jqplot-data-label'); + if (labels.length) { + $(labels[0]).before(this.plugins.pieRenderer.highlightCanvas.createElement(this._gridPadding, 'jqplot-pieRenderer-highlight-canvas', this._plotDimensions, this)); + } + // else put highlight canvas before event canvas. + else { + this.eventCanvas._elem.before(this.plugins.pieRenderer.highlightCanvas.createElement(this._gridPadding, 'jqplot-pieRenderer-highlight-canvas', this._plotDimensions, this)); + } + + var hctx = this.plugins.pieRenderer.highlightCanvas.setContext(); + this.eventCanvas._elem.bind('mouseleave', {plot:this}, function (ev) { unhighlight(ev.data.plot); }); + } + + $.jqplot.preInitHooks.push(preInit); + + $.jqplot.PieTickRenderer = function() { + $.jqplot.AxisTickRenderer.call(this); + }; + + $.jqplot.PieTickRenderer.prototype = new $.jqplot.AxisTickRenderer(); + $.jqplot.PieTickRenderer.prototype.constructor = $.jqplot.PieTickRenderer; + +})(jQuery); + + \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/plugins/jqplot.pieRenderer.min.js b/libreplan-webapp/src/main/webapp/jqplot/plugins/jqplot.pieRenderer.min.js new file mode 100644 index 000000000..f8718bcec --- /dev/null +++ b/libreplan-webapp/src/main/webapp/jqplot/plugins/jqplot.pieRenderer.min.js @@ -0,0 +1,57 @@ +/** + * jqPlot + * Pure JavaScript plotting plugin using jQuery + * + * Version: 1.0.0b2_r1012 + * + * Copyright (c) 2009-2011 Chris Leonello + * jqPlot is currently available for use in all personal or commercial projects + * under both the MIT (http://www.opensource.org/licenses/mit-license.php) and GPL + * version 2.0 (http://www.gnu.org/licenses/gpl-2.0.html) licenses. This means that you can + * choose the license that best suits your project and use it accordingly. + * + * Although not required, the author would appreciate an email letting him + * know of any substantial use of jqPlot. You can reach the author at: + * chris at jqplot dot com or see http://www.jqplot.com/info.php . + * + * If you are feeling kind and generous, consider supporting the project by + * making a donation at: http://www.jqplot.com/donate.php . + * + * sprintf functions contained in jqplot.sprintf.js by Ash Searle: + * + * version 2007.04.27 + * author Ash Searle + * http://hexmen.com/blog/2007/03/printf-sprintf/ + * http://hexmen.com/js/sprintf.js + * The author (Ash Searle) has placed this code in the public domain: + * "This code is unrestricted: you are free to use it however you like." + * + * included jsDate library by Chris Leonello: + * + * Copyright (c) 2010-2011 Chris Leonello + * + * jsDate is currently available for use in all personal or commercial projects + * under both the MIT and GPL version 2.0 licenses. This means that you can + * choose the license that best suits your project and use it accordingly. + * + * jsDate borrows many concepts and ideas from the Date Instance + * Methods by Ken Snyder along with some parts of Ken's actual code. + * + * Ken's origianl Date Instance Methods and copyright notice: + * + * Ken Snyder (ken d snyder at gmail dot com) + * 2008-09-10 + * version 2.0.2 (http://kendsnyder.com/sandbox/date/) + * Creative Commons Attribution License 3.0 (http://creativecommons.org/licenses/by/3.0/) + * + * jqplotToImage function based on Larry Siden's export-jqplot-to-png.js. + * Larry has generously given permission to adapt his code for inclusion + * into jqPlot. + * + * Larry's original code can be found here: + * + * https://github.com/lsiden/export-jqplot-to-png + * + * + */ +(function(e){e.jqplot.PieRenderer=function(){e.jqplot.LineRenderer.call(this)};e.jqplot.PieRenderer.prototype=new e.jqplot.LineRenderer();e.jqplot.PieRenderer.prototype.constructor=e.jqplot.PieRenderer;e.jqplot.PieRenderer.prototype.init=function(q,u){this.diameter=null;this.padding=20;this.sliceMargin=0;this.fill=true;this.shadowOffset=2;this.shadowAlpha=0.07;this.shadowDepth=5;this.highlightMouseOver=true;this.highlightMouseDown=false;this.highlightColors=[];this.dataLabels="percent";this.showDataLabels=false;this.dataLabelFormatString=null;this.dataLabelThreshold=3;this.dataLabelPositionFactor=0.52;this.dataLabelNudge=2;this.dataLabelCenterOn=true;this.startAngle=0;this.tickRenderer=e.jqplot.PieTickRenderer;this._drawData=true;this._type="pie";if(q.highlightMouseDown&&q.highlightMouseOver==null){q.highlightMouseOver=false}e.extend(true,this,q);if(this.sliceMargin<0){this.sliceMargin=0}this._diameter=null;this._radius=null;this._sliceAngles=[];this._highlightedPoint=null;if(this.highlightColors.length==0){for(var s=0;s<this.seriesColors.length;s++){var r=e.jqplot.getColorComponents(this.seriesColors[s]);var o=[r[0],r[1],r[2]];var t=o[0]+o[1]+o[2];for(var p=0;p<3;p++){o[p]=(t>570)?o[p]*0.8:o[p]+0.3*(255-o[p]);o[p]=parseInt(o[p],10)}this.highlightColors.push("rgb("+o[0]+","+o[1]+","+o[2]+")")}}this.highlightColorGenerator=new e.jqplot.ColorGenerator(this.highlightColors);u.postParseOptionsHooks.addOnce(m);u.postInitHooks.addOnce(g);u.eventListenerHooks.addOnce("jqplotMouseMove",b);u.eventListenerHooks.addOnce("jqplotMouseDown",a);u.eventListenerHooks.addOnce("jqplotMouseUp",l);u.eventListenerHooks.addOnce("jqplotClick",f);u.eventListenerHooks.addOnce("jqplotRightClick",n);u.postDrawHooks.addOnce(i)};e.jqplot.PieRenderer.prototype.setGridData=function(t){var p=[];var u=[];var o=this.startAngle/180*Math.PI;var s=0;this._drawData=false;for(var r=0;r<this.data.length;r++){if(this.data[r][1]!=0){this._drawData=true}p.push(this.data[r][1]);u.push([this.data[r][0]]);if(r>0){p[r]+=p[r-1]}s+=this.data[r][1]}var q=Math.PI*2/p[p.length-1];for(var r=0;r<p.length;r++){u[r][1]=p[r]*q;u[r][2]=this.data[r][1]/s}this.gridData=u};e.jqplot.PieRenderer.prototype.makeGridData=function(t,u){var p=[];var v=[];var s=0;var o=this.startAngle/180*Math.PI;this._drawData=false;for(var r=0;r<t.length;r++){if(this.data[r][1]!=0){this._drawData=true}p.push(t[r][1]);v.push([t[r][0]]);if(r>0){p[r]+=p[r-1]}s+=t[r][1]}var q=Math.PI*2/p[p.length-1];for(var r=0;r<p.length;r++){v[r][1]=p[r]*q;v[r][2]=t[r][1]/s}return v};function h(o){return Math.sin((o-(o-Math.PI)/8/Math.PI)/2)}function j(u,t,o,v,r){var w=0;var q=t-u;var s=Math.abs(q);var p=o;if(v==false){p+=r}if(p>0&&s>0.01&&s<6.282){w=parseFloat(p)/2/h(q)}return w}e.jqplot.PieRenderer.prototype.drawSlice=function(B,z,y,u,w){if(this._drawData){var p=this._radius;var A=this.fill;var x=this.lineWidth;var s=this.sliceMargin;if(this.fill==false){s+=this.lineWidth}B.save();B.translate(this._center[0],this._center[1]);var D=j(z,y,this.sliceMargin,this.fill,this.lineWidth);var o=D*Math.cos((z+y)/2);var C=D*Math.sin((z+y)/2);if((y-z)<=Math.PI){p-=D}else{p+=D}B.translate(o,C);if(w){for(var v=0,t=this.shadowDepth;v<t;v++){B.save();B.translate(this.shadowOffset*Math.cos(this.shadowAngle/180*Math.PI),this.shadowOffset*Math.sin(this.shadowAngle/180*Math.PI));q(p)}for(var v=0,t=this.shadowDepth;v<t;v++){B.restore()}}else{q(p)}B.restore()}function q(r){if(y>6.282+this.startAngle){y=6.282+this.startAngle;if(z>y){z=6.281+this.startAngle}}if(z>=y){return}B.beginPath();B.fillStyle=u;B.strokeStyle=u;B.lineWidth=x;B.arc(0,0,r,z,y,false);B.lineTo(0,0);B.closePath();if(A){B.fill()}else{B.stroke()}}};e.jqplot.PieRenderer.prototype.draw=function(B,z,E,o){var W;var H=(E!=undefined)?E:{};var t=0;var s=0;var N=1;var L=new e.jqplot.ColorGenerator(this.seriesColors);if(E.legendInfo&&E.legendInfo.placement=="insideGrid"){var J=E.legendInfo;switch(J.location){case"nw":t=J.width+J.xoffset;break;case"w":t=J.width+J.xoffset;break;case"sw":t=J.width+J.xoffset;break;case"ne":t=J.width+J.xoffset;N=-1;break;case"e":t=J.width+J.xoffset;N=-1;break;case"se":t=J.width+J.xoffset;N=-1;break;case"n":s=J.height+J.yoffset;break;case"s":s=J.height+J.yoffset;N=-1;break;default:break}}var K=(H.shadow!=undefined)?H.shadow:this.shadow;var A=(H.fill!=undefined)?H.fill:this.fill;var C=B.canvas.width;var I=B.canvas.height;var Q=C-t-2*this.padding;var X=I-s-2*this.padding;var M=Math.min(Q,X);var Y=M;this._sliceAngles=[];var v=this.sliceMargin;if(this.fill==false){v+=this.lineWidth}var q;var G=0;var R,aa,Z,ab;var D=this.startAngle/180*Math.PI;for(var W=0,V=z.length;W<V;W++){aa=(W==0)?D:z[W-1][1]+D;Z=z[W][1]+D;this._sliceAngles.push([aa,Z]);q=j(aa,Z,this.sliceMargin,this.fill,this.lineWidth);if(Math.abs(Z-aa)>Math.PI){G=Math.max(q,G)}}if(this.diameter!=null&&this.diameter>0){this._diameter=this.diameter-2*G}else{this._diameter=Y-2*G}if(this._diameter<6){e.jqplot.log("Diameter of pie too small, not rendering.");return}var S=this._radius=this._diameter/2;this._center=[(C-N*t)/2+N*t+G*Math.cos(D),(I-N*s)/2+N*s+G*Math.sin(D)];if(this.shadow){for(var W=0,V=z.length;W<V;W++){ab="rgba(0,0,0,"+this.shadowAlpha+")";this.renderer.drawSlice.call(this,B,this._sliceAngles[W][0],this._sliceAngles[W][1],ab,true)}}for(var W=0;W<z.length;W++){this.renderer.drawSlice.call(this,B,this._sliceAngles[W][0],this._sliceAngles[W][1],L.next(),false);if(this.showDataLabels&&z[W][2]*100>=this.dataLabelThreshold){var F,U=(this._sliceAngles[W][0]+this._sliceAngles[W][1])/2,T;if(this.dataLabels=="label"){F=this.dataLabelFormatString||"%s";T=e.jqplot.sprintf(F,z[W][0])}else{if(this.dataLabels=="value"){F=this.dataLabelFormatString||"%d";T=e.jqplot.sprintf(F,this.data[W][1])}else{if(this.dataLabels=="percent"){F=this.dataLabelFormatString||"%d%%";T=e.jqplot.sprintf(F,z[W][2]*100)}else{if(this.dataLabels.constructor==Array){F=this.dataLabelFormatString||"%s";T=e.jqplot.sprintf(F,this.dataLabels[W])}}}}var p=(this._radius)*this.dataLabelPositionFactor+this.sliceMargin+this.dataLabelNudge;var P=this._center[0]+Math.cos(U)*p+this.canvas._offsets.left;var O=this._center[1]+Math.sin(U)*p+this.canvas._offsets.top;var u=e('<div class="jqplot-pie-series jqplot-data-label" style="position:absolute;">'+T+"</div>").insertBefore(o.eventCanvas._elem);if(this.dataLabelCenterOn){P-=u.width()/2;O-=u.height()/2}else{P-=u.width()*Math.sin(U/2);O-=u.height()/2}P=Math.round(P);O=Math.round(O);u.css({left:P,top:O})}}};e.jqplot.PieAxisRenderer=function(){e.jqplot.LinearAxisRenderer.call(this)};e.jqplot.PieAxisRenderer.prototype=new e.jqplot.LinearAxisRenderer();e.jqplot.PieAxisRenderer.prototype.constructor=e.jqplot.PieAxisRenderer;e.jqplot.PieAxisRenderer.prototype.init=function(o){this.tickRenderer=e.jqplot.PieTickRenderer;e.extend(true,this,o);this._dataBounds={min:0,max:100};this.min=0;this.max=100;this.showTicks=false;this.ticks=[];this.showMark=false;this.show=false};e.jqplot.PieLegendRenderer=function(){e.jqplot.TableLegendRenderer.call(this)};e.jqplot.PieLegendRenderer.prototype=new e.jqplot.TableLegendRenderer();e.jqplot.PieLegendRenderer.prototype.constructor=e.jqplot.PieLegendRenderer;e.jqplot.PieLegendRenderer.prototype.init=function(o){this.numberRows=null;this.numberColumns=null;e.extend(true,this,o)};e.jqplot.PieLegendRenderer.prototype.draw=function(){var r=this;if(this.show){var B=this._series;this._elem=e(document.createElement("table"));this._elem.addClass("jqplot-table-legend");var E={position:"absolute"};if(this.background){E.background=this.background}if(this.border){E.border=this.border}if(this.fontSize){E.fontSize=this.fontSize}if(this.fontFamily){E.fontFamily=this.fontFamily}if(this.textColor){E.textColor=this.textColor}if(this.marginTop!=null){E.marginTop=this.marginTop}if(this.marginBottom!=null){E.marginBottom=this.marginBottom}if(this.marginLeft!=null){E.marginLeft=this.marginLeft}if(this.marginRight!=null){E.marginRight=this.marginRight}this._elem.css(E);var I=false,A=false,o,y;var C=B[0];var p=new e.jqplot.ColorGenerator(C.seriesColors);if(C.show){var J=C.data;if(this.numberRows){o=this.numberRows;if(!this.numberColumns){y=Math.ceil(J.length/o)}else{y=this.numberColumns}}else{if(this.numberColumns){y=this.numberColumns;o=Math.ceil(J.length/this.numberColumns)}else{o=J.length;y=1}}var H,G;var q,w,v;var x,z,F;var D=0;var u,t;for(H=0;H<o;H++){q=e(document.createElement("tr"));q.addClass("jqplot-table-legend");if(A){q.prependTo(this._elem)}else{q.appendTo(this._elem)}for(G=0;G<y;G++){if(D<J.length){x=this.labels[D]||J[D][0].toString();F=p.next();if(!A){if(H>0){I=true}else{I=false}}else{if(H==o-1){I=false}else{I=true}}z=(I)?this.rowSpacing:"0";w=e(document.createElement("td"));w.addClass("jqplot-table-legend jqplot-table-legend-swatch");w.css({textAlign:"center",paddingTop:z});u=e(document.createElement("div"));u.addClass("jqplot-table-legend-swatch-outline");t=e(document.createElement("div"));t.addClass("jqplot-table-legend-swatch");t.css({backgroundColor:F,borderColor:F});w.append(u.append(t));v=e(document.createElement("td"));v.addClass("jqplot-table-legend jqplot-table-legend-label");v.css("paddingTop",z);if(this.escapeHtml){v.text(x)}else{v.html(x)}if(A){v.prependTo(q);w.prependTo(q)}else{w.appendTo(q);v.appendTo(q)}I=true}D++}}}}return this._elem};e.jqplot.PieRenderer.prototype.handleMove=function(q,p,t,s,r){if(s){var o=[s.seriesIndex,s.pointIndex,s.data];r.target.trigger("jqplotDataMouseOver",o);if(r.series[o[0]].highlightMouseOver&&!(o[0]==r.plugins.pieRenderer.highlightedSeriesIndex&&o[1]==r.series[o[0]]._highlightedPoint)){r.target.trigger("jqplotDataHighlight",o);d(r,o[0],o[1])}}else{if(s==null){k(r)}}};function c(s,r,p){p=p||{};p.axesDefaults=p.axesDefaults||{};p.legend=p.legend||{};p.seriesDefaults=p.seriesDefaults||{};var o=false;if(p.seriesDefaults.renderer==e.jqplot.PieRenderer){o=true}else{if(p.series){for(var q=0;q<p.series.length;q++){if(p.series[q].renderer==e.jqplot.PieRenderer){o=true}}}}if(o){p.axesDefaults.renderer=e.jqplot.PieAxisRenderer;p.legend.renderer=e.jqplot.PieLegendRenderer;p.legend.preDraw=true;p.seriesDefaults.pointLabels={show:false}}}function g(r,q,o){for(var p=0;p<this.series.length;p++){if(this.series[p].renderer.constructor==e.jqplot.PieRenderer){if(this.series[p].highlightMouseOver){this.series[p].highlightMouseDown=false}}}}function m(o){for(var p=0;p<this.series.length;p++){this.series[p].seriesColors=this.seriesColors;this.series[p].colorGenerator=e.jqplot.colorGenerator}}function d(t,r,q){var p=t.series[r];var o=t.plugins.pieRenderer.highlightCanvas;o._ctx.clearRect(0,0,o._ctx.canvas.width,o._ctx.canvas.height);p._highlightedPoint=q;t.plugins.pieRenderer.highlightedSeriesIndex=r;p.renderer.drawSlice.call(p,o._ctx,p._sliceAngles[q][0],p._sliceAngles[q][1],p.highlightColorGenerator.get(q),false)}function k(q){var o=q.plugins.pieRenderer.highlightCanvas;o._ctx.clearRect(0,0,o._ctx.canvas.width,o._ctx.canvas.height);for(var p=0;p<q.series.length;p++){q.series[p]._highlightedPoint=null}q.plugins.pieRenderer.highlightedSeriesIndex=null;q.target.trigger("jqplotDataUnhighlight")}function b(s,r,v,u,t){if(u){var q=[u.seriesIndex,u.pointIndex,u.data];var p=jQuery.Event("jqplotDataMouseOver");p.pageX=s.pageX;p.pageY=s.pageY;t.target.trigger(p,q);if(t.series[q[0]].highlightMouseOver&&!(q[0]==t.plugins.pieRenderer.highlightedSeriesIndex&&q[1]==t.series[q[0]]._highlightedPoint)){var o=jQuery.Event("jqplotDataHighlight");o.pageX=s.pageX;o.pageY=s.pageY;t.target.trigger(o,q);d(t,q[0],q[1])}}else{if(u==null){k(t)}}}function a(r,q,u,t,s){if(t){var p=[t.seriesIndex,t.pointIndex,t.data];if(s.series[p[0]].highlightMouseDown&&!(p[0]==s.plugins.pieRenderer.highlightedSeriesIndex&&p[1]==s.series[p[0]]._highlightedPoint)){var o=jQuery.Event("jqplotDataHighlight");o.pageX=r.pageX;o.pageY=r.pageY;s.target.trigger(o,p);d(s,p[0],p[1])}}else{if(t==null){k(s)}}}function l(q,p,t,s,r){var o=r.plugins.pieRenderer.highlightedSeriesIndex;if(o!=null&&r.series[o].highlightMouseDown){k(r)}}function f(r,q,u,t,s){if(t){var p=[t.seriesIndex,t.pointIndex,t.data];var o=jQuery.Event("jqplotDataClick");o.pageX=r.pageX;o.pageY=r.pageY;s.target.trigger(o,p)}}function n(s,r,v,u,t){if(u){var q=[u.seriesIndex,u.pointIndex,u.data];var o=t.plugins.pieRenderer.highlightedSeriesIndex;if(o!=null&&t.series[o].highlightMouseDown){k(t)}var p=jQuery.Event("jqplotDataRightClick");p.pageX=s.pageX;p.pageY=s.pageY;t.target.trigger(p,q)}}function i(){if(this.plugins.pieRenderer&&this.plugins.pieRenderer.highlightCanvas){this.plugins.pieRenderer.highlightCanvas.resetCanvas();this.plugins.pieRenderer.highlightCanvas=null}this.plugins.pieRenderer={highlightedSeriesIndex:null};this.plugins.pieRenderer.highlightCanvas=new e.jqplot.GenericCanvas();var p=e(this.targetId+" .jqplot-data-label");if(p.length){e(p[0]).before(this.plugins.pieRenderer.highlightCanvas.createElement(this._gridPadding,"jqplot-pieRenderer-highlight-canvas",this._plotDimensions,this))}else{this.eventCanvas._elem.before(this.plugins.pieRenderer.highlightCanvas.createElement(this._gridPadding,"jqplot-pieRenderer-highlight-canvas",this._plotDimensions,this))}var o=this.plugins.pieRenderer.highlightCanvas.setContext();this.eventCanvas._elem.bind("mouseleave",{plot:this},function(q){k(q.data.plot)})}e.jqplot.preInitHooks.push(c);e.jqplot.PieTickRenderer=function(){e.jqplot.AxisTickRenderer.call(this)};e.jqplot.PieTickRenderer.prototype=new e.jqplot.AxisTickRenderer();e.jqplot.PieTickRenderer.prototype.constructor=e.jqplot.PieTickRenderer})(jQuery); \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/plugins/jqplot.pointLabels.js b/libreplan-webapp/src/main/webapp/jqplot/plugins/jqplot.pointLabels.js new file mode 100644 index 000000000..15f72936c --- /dev/null +++ b/libreplan-webapp/src/main/webapp/jqplot/plugins/jqplot.pointLabels.js @@ -0,0 +1,362 @@ +/** + * jqPlot + * Pure JavaScript plotting plugin using jQuery + * + * Version: 1.0.0b2_r1012 + * + * Copyright (c) 2009-2011 Chris Leonello + * jqPlot is currently available for use in all personal or commercial projects + * under both the MIT (http://www.opensource.org/licenses/mit-license.php) and GPL + * version 2.0 (http://www.gnu.org/licenses/gpl-2.0.html) licenses. This means that you can + * choose the license that best suits your project and use it accordingly. + * + * Although not required, the author would appreciate an email letting him + * know of any substantial use of jqPlot. You can reach the author at: + * chris at jqplot dot com or see http://www.jqplot.com/info.php . + * + * If you are feeling kind and generous, consider supporting the project by + * making a donation at: http://www.jqplot.com/donate.php . + * + * sprintf functions contained in jqplot.sprintf.js by Ash Searle: + * + * version 2007.04.27 + * author Ash Searle + * http://hexmen.com/blog/2007/03/printf-sprintf/ + * http://hexmen.com/js/sprintf.js + * The author (Ash Searle) has placed this code in the public domain: + * "This code is unrestricted: you are free to use it however you like." + * + */ +(function($) { + + /** + * Class: $.jqplot.PointLabels + * Plugin for putting labels at the data points. + * + * To use this plugin, include the js + * file in your source: + * + * > <script type="text/javascript" src="plugins/jqplot.pointLabels.js"></script> + * + * By default, the last value in the data ponit array in the data series is used + * for the label. For most series renderers, extra data can be added to the + * data point arrays and the last value will be used as the label. + * + * For instance, + * this series: + * + * > [[1,4], [3,5], [7,2]] + * + * Would, by default, use the y values in the labels. + * Extra data can be added to the series like so: + * + * > [[1,4,'mid'], [3 5,'hi'], [7,2,'low']] + * + * And now the point labels would be 'mid', 'low', and 'hi'. + * + * Options to the point labels and a custom labels array can be passed into the + * "pointLabels" option on the series option like so: + * + * > series:[{pointLabels:{ + * > labels:['mid', 'hi', 'low'], + * > location:'se', + * > ypadding: 12 + * > } + * > }] + * + * A custom labels array in the options takes precendence over any labels + * in the series data. If you have a custom labels array in the options, + * but still want to use values from the series array as labels, set the + * "labelsFromSeries" option to true. + * + * By default, html entities (<, >, etc.) are escaped in point labels. + * If you want to include actual html markup in the labels, + * set the "escapeHTML" option to false. + * + */ + $.jqplot.PointLabels = function(options) { + // Group: Properties + // + // prop: show + // show the labels or not. + this.show = $.jqplot.config.enablePlugins; + // prop: location + // compass location where to position the label around the point. + // 'n', 'ne', 'e', 'se', 's', 'sw', 'w', 'nw' + this.location = 'n'; + // prop: labelsFromSeries + // true to use labels within data point arrays. + this.labelsFromSeries = false; + // prop: seriesLabelIndex + // array index for location of labels within data point arrays. + // if null, will use the last element of the data point array. + this.seriesLabelIndex = null; + // prop: labels + // array of arrays of labels, one array for each series. + this.labels = []; + // actual labels that will get displayed. + // needed to preserve user specified labels in labels array. + this._labels = []; + // prop: stackedValue + // true to display value as stacked in a stacked plot. + // no effect if labels is specified. + this.stackedValue = false; + // prop: ypadding + // vertical padding in pixels between point and label + this.ypadding = 6; + // prop: xpadding + // horizontal padding in pixels between point and label + this.xpadding = 6; + // prop: escapeHTML + // true to escape html entities in the labels. + // If you want to include markup in the labels, set to false. + this.escapeHTML = true; + // prop: edgeTolerance + // Number of pixels that the label must be away from an axis + // boundary in order to be drawn. Negative values will allow overlap + // with the grid boundaries. + this.edgeTolerance = -5; + // prop: formatter + // A class of a formatter for the tick text. sprintf by default. + this.formatter = $.jqplot.DefaultTickFormatter; + // prop: formatString + // string passed to the formatter. + this.formatString = ''; + // prop: hideZeros + // true to not show a label for a value which is 0. + this.hideZeros = false; + this._elems = []; + + $.extend(true, this, options); + }; + + var locations = ['nw', 'n', 'ne', 'e', 'se', 's', 'sw', 'w']; + var locationIndicies = {'nw':0, 'n':1, 'ne':2, 'e':3, 'se':4, 's':5, 'sw':6, 'w':7}; + var oppositeLocations = ['se', 's', 'sw', 'w', 'nw', 'n', 'ne', 'e']; + + // called with scope of a series + $.jqplot.PointLabels.init = function (target, data, seriesDefaults, opts, plot){ + var options = $.extend(true, {}, seriesDefaults, opts); + options.pointLabels = options.pointLabels || {}; + if (this.renderer.constructor === $.jqplot.BarRenderer && this.barDirection === 'horizontal' && !options.pointLabels.location) { + options.pointLabels.location = 'e'; + } + // add a pointLabels attribute to the series plugins + this.plugins.pointLabels = new $.jqplot.PointLabels(options.pointLabels); + this.plugins.pointLabels.setLabels.call(this); + }; + + // called with scope of series + $.jqplot.PointLabels.prototype.setLabels = function() { + var p = this.plugins.pointLabels; + var labelIdx; + if (p.seriesLabelIndex != null) { + labelIdx = p.seriesLabelIndex; + } + else if (this.renderer.constructor === $.jqplot.BarRenderer && this.barDirection === 'horizontal') { + labelIdx = 0; + } + else { + labelIdx = (this._plotData.length === 0) ? 0 : this._plotData[0].length -1; + } + p._labels = []; + if (p.labels.length === 0 || p.labelsFromSeries) { + if (p.stackedValue) { + if (this._plotData.length && this._plotData[0].length){ + // var idx = p.seriesLabelIndex || this._plotData[0].length -1; + for (var i=0; i<this._plotData.length; i++) { + p._labels.push(this._plotData[i][labelIdx]); + } + } + } + else { + var d = this._plotData; + if (this.renderer.constructor === $.jqplot.BarRenderer && this.waterfall) { + d = this._data; + } + if (d.length && d[0].length) { + // var idx = p.seriesLabelIndex || d[0].length -1; + for (var i=0; i<d.length; i++) { + p._labels.push(d[i][labelIdx]); + } + } + d = null; + } + } + else if (p.labels.length){ + p._labels = p.labels; + } + }; + + $.jqplot.PointLabels.prototype.xOffset = function(elem, location, padding) { + location = location || this.location; + padding = padding || this.xpadding; + var offset; + + switch (location) { + case 'nw': + offset = -elem.outerWidth(true) - this.xpadding; + break; + case 'n': + offset = -elem.outerWidth(true)/2; + break; + case 'ne': + offset = this.xpadding; + break; + case 'e': + offset = this.xpadding; + break; + case 'se': + offset = this.xpadding; + break; + case 's': + offset = -elem.outerWidth(true)/2; + break; + case 'sw': + offset = -elem.outerWidth(true) - this.xpadding; + break; + case 'w': + offset = -elem.outerWidth(true) - this.xpadding; + break; + default: // same as 'nw' + offset = -elem.outerWidth(true) - this.xpadding; + break; + } + return offset; + }; + + $.jqplot.PointLabels.prototype.yOffset = function(elem, location, padding) { + location = location || this.location; + padding = padding || this.xpadding; + var offset; + + switch (location) { + case 'nw': + offset = -elem.outerHeight(true) - this.ypadding; + break; + case 'n': + offset = -elem.outerHeight(true) - this.ypadding; + break; + case 'ne': + offset = -elem.outerHeight(true) - this.ypadding; + break; + case 'e': + offset = -elem.outerHeight(true)/2; + break; + case 'se': + offset = this.ypadding; + break; + case 's': + offset = this.ypadding; + break; + case 'sw': + offset = this.ypadding; + break; + case 'w': + offset = -elem.outerHeight(true)/2; + break; + default: // same as 'nw' + offset = -elem.outerHeight(true) - this.ypadding; + break; + } + return offset; + }; + + // called with scope of series + $.jqplot.PointLabels.draw = function (sctx, options, plot) { + var p = this.plugins.pointLabels; + // set labels again in case they have changed. + p.setLabels.call(this); + // remove any previous labels + for (var i=0; i<p._elems.length; i++) { + // Memory Leaks patch + // p._elems[i].remove(); + p._elems[i].emptyForce(); + } + p._elems.splice(0, p._elems.length); + + if (p.show) { + var ax = '_'+this._stackAxis+'axis'; + + if (!p.formatString) { + p.formatString = this[ax]._ticks[0].formatString; + p.formatter = this[ax]._ticks[0].formatter; + } + + var pd = this._plotData; + var xax = this._xaxis; + var yax = this._yaxis; + var elem, helem; + + for (var i=0, l=p._labels.length; i < l; i++) { + var label = p._labels[i]; + + if (p.hideZeros && parseInt(p._labels[i], 10) == 0) { + label = ''; + } + + if (label != null) { + label = p.formatter(p.formatString, label); + } + + helem = document.createElement('div'); + p._elems[i] = $(helem); + + elem = p._elems[i]; + + + elem.addClass('jqplot-point-label jqplot-series-'+this.index+' jqplot-point-'+i); + elem.css('position', 'absolute'); + elem.insertAfter(sctx.canvas); + + if (p.escapeHTML) { + elem.text(label); + } + else { + elem.html(label); + } + var location = p.location; + if ((this.fillToZero && pd[i][1] < 0) || (this.fillToZero && this._type === 'bar' && this.barDirection === 'horizontal' && pd[i][0] < 0) || (this.waterfall && parseInt(label, 10)) < 0) { + location = oppositeLocations[locationIndicies[location]]; + } + var ell = xax.u2p(pd[i][0]) + p.xOffset(elem, location); + var elt = yax.u2p(pd[i][1]) + p.yOffset(elem, location); + if (this.renderer.constructor == $.jqplot.BarRenderer) { + if (this.barDirection == "vertical") { + ell += this._barNudge; + } + else { + elt -= this._barNudge; + } + } + elem.css('left', ell); + elem.css('top', elt); + var elr = ell + elem.width(); + var elb = elt + elem.height(); + var et = p.edgeTolerance; + var scl = $(sctx.canvas).position().left; + var sct = $(sctx.canvas).position().top; + var scr = sctx.canvas.width + scl; + var scb = sctx.canvas.height + sct; + // if label is outside of allowed area, remove it + if (ell - et < scl || elt - et < sct || elr + et > scr || elb + et > scb) { + elem.remove(); + } + + elem = null; + helem = null; + } + + // finally, animate them if the series is animated + // if (this.renderer.animation && this.renderer.animation._supported && this.renderer.animation.show && plot._drawCount < 2) { + // var sel = '.jqplot-point-label.jqplot-series-'+this.index; + // $(sel).hide(); + // $(sel).fadeIn(1000); + // } + + } + }; + + $.jqplot.postSeriesInitHooks.push($.jqplot.PointLabels.init); + $.jqplot.postDrawSeriesHooks.push($.jqplot.PointLabels.draw); +})(jQuery); \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/plugins/jqplot.pointLabels.min.js b/libreplan-webapp/src/main/webapp/jqplot/plugins/jqplot.pointLabels.min.js new file mode 100644 index 000000000..7cf02ea9f --- /dev/null +++ b/libreplan-webapp/src/main/webapp/jqplot/plugins/jqplot.pointLabels.min.js @@ -0,0 +1,57 @@ +/** + * jqPlot + * Pure JavaScript plotting plugin using jQuery + * + * Version: 1.0.0b2_r1012 + * + * Copyright (c) 2009-2011 Chris Leonello + * jqPlot is currently available for use in all personal or commercial projects + * under both the MIT (http://www.opensource.org/licenses/mit-license.php) and GPL + * version 2.0 (http://www.gnu.org/licenses/gpl-2.0.html) licenses. This means that you can + * choose the license that best suits your project and use it accordingly. + * + * Although not required, the author would appreciate an email letting him + * know of any substantial use of jqPlot. You can reach the author at: + * chris at jqplot dot com or see http://www.jqplot.com/info.php . + * + * If you are feeling kind and generous, consider supporting the project by + * making a donation at: http://www.jqplot.com/donate.php . + * + * sprintf functions contained in jqplot.sprintf.js by Ash Searle: + * + * version 2007.04.27 + * author Ash Searle + * http://hexmen.com/blog/2007/03/printf-sprintf/ + * http://hexmen.com/js/sprintf.js + * The author (Ash Searle) has placed this code in the public domain: + * "This code is unrestricted: you are free to use it however you like." + * + * included jsDate library by Chris Leonello: + * + * Copyright (c) 2010-2011 Chris Leonello + * + * jsDate is currently available for use in all personal or commercial projects + * under both the MIT and GPL version 2.0 licenses. This means that you can + * choose the license that best suits your project and use it accordingly. + * + * jsDate borrows many concepts and ideas from the Date Instance + * Methods by Ken Snyder along with some parts of Ken's actual code. + * + * Ken's origianl Date Instance Methods and copyright notice: + * + * Ken Snyder (ken d snyder at gmail dot com) + * 2008-09-10 + * version 2.0.2 (http://kendsnyder.com/sandbox/date/) + * Creative Commons Attribution License 3.0 (http://creativecommons.org/licenses/by/3.0/) + * + * jqplotToImage function based on Larry Siden's export-jqplot-to-png.js. + * Larry has generously given permission to adapt his code for inclusion + * into jqPlot. + * + * Larry's original code can be found here: + * + * https://github.com/lsiden/export-jqplot-to-png + * + * + */ +(function(c){c.jqplot.PointLabels=function(e){this.show=c.jqplot.config.enablePlugins;this.location="n";this.labelsFromSeries=false;this.seriesLabelIndex=null;this.labels=[];this._labels=[];this.stackedValue=false;this.ypadding=6;this.xpadding=6;this.escapeHTML=true;this.edgeTolerance=-5;this.formatter=c.jqplot.DefaultTickFormatter;this.formatString="";this.hideZeros=false;this._elems=[];c.extend(true,this,e)};var a=["nw","n","ne","e","se","s","sw","w"];var d={nw:0,n:1,ne:2,e:3,se:4,s:5,sw:6,w:7};var b=["se","s","sw","w","nw","n","ne","e"];c.jqplot.PointLabels.init=function(j,h,f,g,i){var e=c.extend(true,{},f,g);e.pointLabels=e.pointLabels||{};if(this.renderer.constructor===c.jqplot.BarRenderer&&this.barDirection==="horizontal"&&!e.pointLabels.location){e.pointLabels.location="e"}this.plugins.pointLabels=new c.jqplot.PointLabels(e.pointLabels);this.plugins.pointLabels.setLabels.call(this)};c.jqplot.PointLabels.prototype.setLabels=function(){var f=this.plugins.pointLabels;var h;if(f.seriesLabelIndex!=null){h=f.seriesLabelIndex}else{if(this.renderer.constructor===c.jqplot.BarRenderer&&this.barDirection==="horizontal"){h=0}else{h=(this._plotData.length===0)?0:this._plotData[0].length-1}}f._labels=[];if(f.labels.length===0||f.labelsFromSeries){if(f.stackedValue){if(this._plotData.length&&this._plotData[0].length){for(var e=0;e<this._plotData.length;e++){f._labels.push(this._plotData[e][h])}}}else{var g=this._plotData;if(this.renderer.constructor===c.jqplot.BarRenderer&&this.waterfall){g=this._data}if(g.length&&g[0].length){for(var e=0;e<g.length;e++){f._labels.push(g[e][h])}}g=null}}else{if(f.labels.length){f._labels=f.labels}}};c.jqplot.PointLabels.prototype.xOffset=function(f,e,g){e=e||this.location;g=g||this.xpadding;var h;switch(e){case"nw":h=-f.outerWidth(true)-this.xpadding;break;case"n":h=-f.outerWidth(true)/2;break;case"ne":h=this.xpadding;break;case"e":h=this.xpadding;break;case"se":h=this.xpadding;break;case"s":h=-f.outerWidth(true)/2;break;case"sw":h=-f.outerWidth(true)-this.xpadding;break;case"w":h=-f.outerWidth(true)-this.xpadding;break;default:h=-f.outerWidth(true)-this.xpadding;break}return h};c.jqplot.PointLabels.prototype.yOffset=function(f,e,g){e=e||this.location;g=g||this.xpadding;var h;switch(e){case"nw":h=-f.outerHeight(true)-this.ypadding;break;case"n":h=-f.outerHeight(true)-this.ypadding;break;case"ne":h=-f.outerHeight(true)-this.ypadding;break;case"e":h=-f.outerHeight(true)/2;break;case"se":h=this.ypadding;break;case"s":h=this.ypadding;break;case"sw":h=this.ypadding;break;case"w":h=-f.outerHeight(true)/2;break;default:h=-f.outerHeight(true)-this.ypadding;break}return h};c.jqplot.PointLabels.draw=function(x,j,v){var t=this.plugins.pointLabels;t.setLabels.call(this);for(var w=0;w<t._elems.length;w++){t._elems[w].emptyForce()}t._elems.splice(0,t._elems.length);if(t.show){var r="_"+this._stackAxis+"axis";if(!t.formatString){t.formatString=this[r]._ticks[0].formatString;t.formatter=this[r]._ticks[0].formatter}var D=this._plotData;var A=this._xaxis;var q=this._yaxis;var z,f;for(var w=0,u=t._labels.length;w<u;w++){var o=t._labels[w];if(t.hideZeros&&parseInt(t._labels[w],10)==0){o=""}if(o!=null){o=t.formatter(t.formatString,o)}f=document.createElement("div");t._elems[w]=c(f);z=t._elems[w];z.addClass("jqplot-point-label jqplot-series-"+this.index+" jqplot-point-"+w);z.css("position","absolute");z.insertAfter(x.canvas);if(t.escapeHTML){z.text(o)}else{z.html(o)}var g=t.location;if((this.fillToZero&&D[w][1]<0)||(this.fillToZero&&this._type==="bar"&&this.barDirection==="horizontal"&&D[w][0]<0)||(this.waterfall&&parseInt(o,10))<0){g=b[d[g]]}var n=A.u2p(D[w][0])+t.xOffset(z,g);var h=q.u2p(D[w][1])+t.yOffset(z,g);if(this.renderer.constructor==c.jqplot.BarRenderer){if(this.barDirection=="vertical"){n+=this._barNudge}else{h-=this._barNudge}}z.css("left",n);z.css("top",h);var k=n+z.width();var s=h+z.height();var C=t.edgeTolerance;var e=c(x.canvas).position().left;var y=c(x.canvas).position().top;var B=x.canvas.width+e;var m=x.canvas.height+y;if(n-C<e||h-C<y||k+C>B||s+C>m){z.remove()}z=null;f=null}}};c.jqplot.postSeriesInitHooks.push(c.jqplot.PointLabels.init);c.jqplot.postDrawSeriesHooks.push(c.jqplot.PointLabels.draw)})(jQuery); \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/plugins/jqplot.pyramidAxisRenderer.js b/libreplan-webapp/src/main/webapp/jqplot/plugins/jqplot.pyramidAxisRenderer.js new file mode 100644 index 000000000..d4eb93bd7 --- /dev/null +++ b/libreplan-webapp/src/main/webapp/jqplot/plugins/jqplot.pyramidAxisRenderer.js @@ -0,0 +1,730 @@ +/** + * jqPlot + * Pure JavaScript plotting plugin using jQuery + * + * Version: 1.0.0b2_r1012 + * + * Copyright (c) 2009-2011 Chris Leonello + * jqPlot is currently available for use in all personal or commercial projects + * under both the MIT (http://www.opensource.org/licenses/mit-license.php) and GPL + * version 2.0 (http://www.gnu.org/licenses/gpl-2.0.html) licenses. This means that you can + * choose the license that best suits your project and use it accordingly. + * + * Although not required, the author would appreciate an email letting him + * know of any substantial use of jqPlot. You can reach the author at: + * chris at jqplot dot com or see http://www.jqplot.com/info.php . + * + * If you are feeling kind and generous, consider supporting the project by + * making a donation at: http://www.jqplot.com/donate.php . + * + * sprintf functions contained in jqplot.sprintf.js by Ash Searle: + * + * version 2007.04.27 + * author Ash Searle + * http://hexmen.com/blog/2007/03/printf-sprintf/ + * http://hexmen.com/js/sprintf.js + * The author (Ash Searle) has placed this code in the public domain: + * "This code is unrestricted: you are free to use it however you like." + * + */ +(function($) { + $.jqplot.PyramidAxisRenderer = function() { + $.jqplot.LinearAxisRenderer.call(this); + }; + + $.jqplot.PyramidAxisRenderer.prototype = new $.jqplot.LinearAxisRenderer(); + $.jqplot.PyramidAxisRenderer.prototype.constructor = $.jqplot.PyramidAxisRenderer; + + // called with scope of axis + $.jqplot.PyramidAxisRenderer.prototype.init = function(options){ + // Group: Properties + // + // prop: position + // Position of axis. Values are: top, bottom , left, center, right. + // By default, x and x2 axes are bottom, y axis is center. + this.position = null; + // prop: drawBaseline + // True to draw the axis baseline. + this.drawBaseline = true; + // prop: baselineWidth + // width of the baseline in pixels. + this.baselineWidth = null; + // prop: baselineColor + // CSS color spec for the baseline. + this.baselineColor = null; + this.tickSpacingFactor = 25; + this._type = 'pyramid'; + this._splitAxis = false; + this._splitLength = null; + this.category = false; + this._autoFormatString = ''; + this._overrideFormatString = false; + + $.extend(true, this, options); + this.renderer.options = options; + + this.resetDataBounds = this.renderer.resetDataBounds; + this.resetDataBounds(); + + }; + + $.jqplot.PyramidAxisRenderer.prototype.resetDataBounds = function() { + // Go through all the series attached to this axis and find + // the min/max bounds for this axis. + var db = this._dataBounds; + db.min = null; + db.max = null; + var temp; + for (var i=0; i<this._series.length; i++) { + var s = this._series[i]; + var d = s._plotData; + + for (var j=0, l=d.length; j<l; j++) { + if (this.name.charAt(0) === 'x') { + temp = d[j][1]; + if ((temp !== null && temp < db.min) || db.min === null) { + db.min = temp; + } + if ((temp !== null && temp > db.max) || db.max === null) { + db.max = temp; + } + } + else { + temp = d[j][0]; + if ((temp !== null && temp < db.min) || db.min === null) { + db.min = temp; + } + if ((temp !== null && temp > db.max) || db.max === null) { + db.max = temp; + } + } + } + } + }; + + // called with scope of axis + $.jqplot.PyramidAxisRenderer.prototype.draw = function(ctx, plot) { + if (this.show) { + // populate the axis label and value properties. + // createTicks is a method on the renderer, but + // call it within the scope of the axis. + this.renderer.createTicks.call(this, plot); + // fill a div with axes labels in the right direction. + // Need to pregenerate each axis to get it's bounds and + // position it and the labels correctly on the plot. + var dim=0; + var temp; + // Added for theming. + if (this._elem) { + // Memory Leaks patch + //this._elem.empty(); + this._elem.emptyForce(); + this._elem = null; + } + + this._elem = $(document.createElement('div')); + this._elem.addClass('jqplot-axis jqplot-'+this.name); + this._elem.css('position', 'absolute'); + + + if (this.name == 'xaxis' || this.name == 'x2axis') { + this._elem.width(this._plotDimensions.width); + } + else { + this._elem.height(this._plotDimensions.height); + } + + // create a _label object. + this.labelOptions.axis = this.name; + this._label = new this.labelRenderer(this.labelOptions); + if (this._label.show) { + var elem = this._label.draw(ctx, plot); + elem.appendTo(this._elem); + elem = null; + } + + var t = this._ticks; + var tick; + for (var i=0; i<t.length; i++) { + tick = t[i]; + if (tick.show && tick.showLabel && (!tick.isMinorTick)) { + this._elem.append(tick.draw(ctx, plot)); + } + } + tick = null; + t = null; + } + return this._elem; + }; + + // Note, primes can be found on http://primes.utm.edu/ + var _primes = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127, 131, 137, 139, 149, 151, 157, 163, 167, 173, 179, 181, 191, 193, 197, 199, 211, 223, 227, 229, 233, 239, 241, 251, 257, 263, 269, 271, 277, 281, 283, 293, 307, 311, 313, 317, 331, 337, 347, 349, 353, 359, 367, 373, 379, 383, 389, 397, 401, 409, 419, 421, 431, 433, 439, 443, 449, 457, 461, 463, 467, 479, 487, 491, 499, 503, 509, 521, 523, 541, 547, 557, 563, 569, 571, 577, 587, 593, 599, 601, 607, 613, 617, 619, 631, 641, 643, 647, 653, 659, 661, 673, 677, 683, 691, 701, 709, 719, 727, 733, 739, 743, 751, 757, 761, 769, 773, 787, 797, 809, 811, 821, 823, 827, 829, 839, 853, 857, 859, 863, 877, 881, 883, 887, 907, 911, 919, 929, 937, 941, 947, 953, 967, 971, 977, 983, 991, 997]; + + + var _primesHash = {}; + + for (var i =0, l = _primes.length; i < l; i++) { + _primesHash[_primes[i]] = _primes[i]; + } + + // called with scope of axis + $.jqplot.PyramidAxisRenderer.prototype.createTicks = function(plot) { + // we're are operating on an axis here + var userTicks = this.ticks; + // databounds were set on axis initialization. + var db = this._dataBounds; + var dim; + var interval; + var min; + var max; + var range; + var pos1; + var pos2; + var tt; + var i; + var l; + var s; + // get a copy of user's settings for min/max. + var userMin = this.min; + var userMax = this.max; + var ut; + var t; + var threshold; + var tdim; + var scalefact; + var ret; + var tumin; + var tumax; + var maxVisibleTicks; + var val; + var skip = null; + var temp; + + // if we already have ticks, use them. + // ticks must be in order of increasing value. + + if (userTicks.length) { + // ticks could be 1D or 2D array of [val, val, ,,,] or [[val, label], [val, label], ...] or mixed + for (i=0, l=userTicks.length; i<l; i++){ + ut = userTicks[i]; + t = new this.tickRenderer(this.tickOptions); + if ($.isArray(ut)) { + t.value = ut[0]; + t.label = ut[1]; + t.setTick(ut[0], this.name); + this._ticks.push(t); + } + + else if ($.isPlainObject(ut)) { + $.extend(true, t, ut); + t.axis = this.name; + this._ticks.push(t); + } + + else { + if (typeof ut === 'string') { + val = i + plot.defaultAxisStart; + } + else { + val = ut; + } + t.value = val; + t.label = ut; + t.axis = this.name; + this._ticks.push(t); + } + } + this.numberTicks = userTicks.length; + this.min = this._ticks[0].value; + this.max = this._ticks[this.numberTicks-1].value; + this.tickInterval = (this.max - this.min) / (this.numberTicks - 1); + + // use user specified tickInterval if there is one + if (this._options.tickInterval) { + // hide every tick except for ticks on interval + var ti = this._options.tickInterval; + for (i=0; i<this.numberTicks; i++) { + if (i%ti !== 0) { + // this._ticks[i].show = false; + this._ticks[i].isMinorTick = true; + } + } + } + + else { + // check if we have too many ticks + dim = (this.name.charAt(0) === 'x') ? this._plotDimensions.width : this._plotDimensions.height; + maxVisibleTicks = Math.round(2.0 + dim/this.tickSpacingFactor); + + if (this.numberTicks > maxVisibleTicks) { + // check for number of ticks we can skip + temp = this.numberTicks - 1; + for (i=2; i<temp; i++) { + if (temp % i === 0 && temp/i < maxVisibleTicks) { + skip = i-1; + break; + } + } + + if (skip !== null) { + var count = 1; + for (i=1, l=this._ticks.length; i<l; i++) { + if (count <= skip) { + this._ticks[i].show = false; + count += 1; + } + else { + count = 1; + } + } + } + } + } + + // if category style, add minor ticks in between + temp = []; + if (this.category) { + // turn off gridline and mark on first tick + this._ticks[0].showGridline = false; + this._ticks[0].showMark = false; + + for (i=this._ticks.length-1; i>0; i--) { + t = new this.tickRenderer(this.tickOptions); + t.value = this._ticks[i-1].value + this.tickInterval/2.0; + t.label = ''; + t.showLabel = false; + t.axis = this.name; + this._ticks[i].showGridline = false; + this._ticks[i].showMark = false; + this._ticks.splice(i, 0, t); + // temp.push(t); + } + + // merge in the new ticks + // for (i=1, l=temp.length; i<l; i++) { + // this._ticks.splice(i, 0, temp[i]); + // } + + // now add a tick at beginning and end + t = new this.tickRenderer(this.tickOptions); + t.value = this._ticks[0].value - this.tickInterval/2.0; + t.label = ''; + t.showLabel = false; + t.axis = this.name; + this._ticks.unshift(t); + + t = new this.tickRenderer(this.tickOptions); + t.value = this._ticks[this._ticks.length-1].value + this.tickInterval/2.0; + t.label = ''; + t.showLabel = false; + t.axis = this.name; + this._ticks.push(t); + + this.tickInterval = this.tickInterval / 2.0; + this.numberTicks = this._ticks.length; + this.min = this._ticks[0].value; + this.max = this._ticks[this._ticks.length-1].value; + } + } + + // we don't have any ticks yet, let's make some! + else { + if (this.name.charAt(0) === 'x') { + dim = this._plotDimensions.width; + // make sure x axis is symetric about 0. + var tempmax = Math.max(db.max, Math.abs(db.min)); + var tempmin = Math.min(db.min, -tempmax); + // min = ((this.min != null) ? this.min : tempmin); + // max = ((this.max != null) ? this.max : tempmax); + min = tempmin; + max = tempmax; + range = max - min; + + if (this.tickOptions == null || !this.tickOptions.formatString) { + this._overrideFormatString = true; + } + + threshold = 30; + tdim = Math.max(dim, threshold+1); + scalefact = (tdim-threshold)/300.0; + ret = $.jqplot.LinearTickGenerator(min, max, scalefact); + console.log(min, max, scalefact, ret); + console.log(ret[0].toString(), ret[1].toString()); + // calculate a padded max and min, points should be less than these + // so that they aren't too close to the edges of the plot. + // User can adjust how much padding is allowed with pad, padMin and PadMax options. + tumin = min + range*(this.padMin - 1); + tumax = max - range*(this.padMax - 1); + + if (min < tumin || max > tumax) { + tumin = min - range*(this.padMin - 1); + tumax = max + range*(this.padMax - 1); + ret = $.jqplot.LinearTickGenerator(tumin, tumax, scalefact); + console.log(tumin, tumax, scalefact, ret); + } + + this.min = ret[0]; + this.max = ret[1]; + this.numberTicks = ret[2]; + this._autoFormatString = ret[3]; + this.tickInterval = ret[4]; + } + else { + dim = this._plotDimensions.height; + + // ticks will be on whole integers like 1, 2, 3, ... or 1, 4, 7, ... + min = db.min; + max = db.max; + s = this._series[0]; + this._ticks = []; + + range = max - min; + + // if range is a prime, will get only 2 ticks, expand range in that case. + if (_primesHash[range]) { + range += 1; + max += 1; + } + + this.max = max; + this.min = min; + + maxVisibleTicks = Math.round(2.0 + dim/this.tickSpacingFactor); + + if (range + 1 <= maxVisibleTicks) { + this.numberTicks = range + 1; + this.tickInterval = 1.0; + } + + else { + // figure out a round number of ticks to skip in every interval + // range / ti + 1 = nt + // ti = range / (nt - 1) + for (var i=maxVisibleTicks; i>1; i--) { + if (range/(i - 1) === Math.round(range/(i - 1))) { + this.numberTicks = i; + this.tickInterval = range/(i - 1); + break; + } + + } + } + } + + if (this._overrideFormatString && this._autoFormatString != '') { + this.tickOptions = this.tickOptions || {}; + this.tickOptions.formatString = this._autoFormatString; + } + + var labelval; + for (i=0; i<this.numberTicks; i++) { + this.tickOptions.axis = this.name; + labelval = this.min + this.tickInterval * i; + if (this.name.charAt(0) === 'x') { + labelval = Math.abs(labelval); + } + // this.tickOptions.label = String (labelval); + this.tickOptions.value = this.min + this.tickInterval * i; + t = new this.tickRenderer(this.tickOptions); + + t.label = t.prefix + t.formatter(t.formatString, labelval); + + this._ticks.push(t); + // for x axis, if y axis is in middle, add a symetrical 0 tick + if (this.name.charAt(0) === 'x' && plot.axes.yMidAxis.show && this.tickOptions.value === 0) { + this._splitAxis = true; + this._splitLength = plot.axes.yMidAxis.getWidth(); + // t.value = -this.max/2000.0; + t = new this.tickRenderer(this.tickOptions); + this._ticks.push(t); + t.value = this.max/2000.0; + } + } + t = null; + } + }; + + // called with scope of axis + $.jqplot.PyramidAxisRenderer.prototype.set = function() { + var dim = 0; + var temp; + var w = 0; + var h = 0; + var i; + var t; + var tick; + var lshow = (this._label == null) ? false : this._label.show; + if (this.show) { + t = this._ticks; + l = t.length; + for (i=0; i<l; i++) { + tick = t[i]; + if (!tick._breakTick && tick.show && tick.showLabel && !tick.isMinorTick) { + if (this.name.charAt(0) === 'x') { + temp = tick._elem.outerHeight(true); + } + else { + temp = tick._elem.outerWidth(true); + } + if (temp > dim) { + dim = temp; + } + } + } + + if (this.name === 'yMidAxis') { + for (i=0; i<l; i++) { + tick = t[i]; + if (tick._elem) { + temp = (dim - tick._elem.outerWidth(true))/2.0; + tick._elem.css('left', temp); + } + } + } + tick = null; + t = null; + + if (lshow) { + w = this._label._elem.outerWidth(true); + h = this._label._elem.outerHeight(true); + } + if (this.name === 'xaxis') { + dim = dim + h; + this._elem.css({'height':dim+'px', left:'0px', bottom:'0px'}); + } + else if (this.name === 'x2axis') { + dim = dim + h; + this._elem.css({'height':dim+'px', left:'0px', top:'0px'}); + } + else if (this.name === 'yaxis') { + dim = dim + w; + this._elem.css({'width':dim+'px', left:'0px', top:'0px'}); + if (lshow && this._label.constructor == $.jqplot.AxisLabelRenderer) { + this._label._elem.css('width', w+'px'); + } + } + else if (this.name === 'yMidAxis') { + // don't include width of label at all in width of axis? + // dim = (dim > w) ? dim : w; + var temp = dim/2.0 - w/2.0; + this._elem.css({'width':dim+'px', top:'0px'}); + if (lshow && this._label.constructor == $.jqplot.AxisLabelRenderer) { + this._label._elem.css({width: w, left: temp, top: 0}); + } + } + else { + dim = dim + w; + this._elem.css({'width':dim+'px', right:'0px', top:'0px'}); + if (lshow && this._label.constructor == $.jqplot.AxisLabelRenderer) { + this._label._elem.css('width', w+'px'); + } + } + } + }; + + $.jqplot.PyramidAxisRenderer.prototype.pack = function(pos, offsets) { + // Add defaults for repacking from resetTickValues function. + pos = pos || {}; + offsets = offsets || this._offsets; + + var ticks = this._ticks; + var max = this.max; + var min = this.min; + var offmax = offsets.max; + var offmin = offsets.min; + var lshow = (this._label == null) ? false : this._label.show; + + for (var p in pos) { + this._elem.css(p, pos[p]); + } + + this._offsets = offsets; + // pixellength will be + for x axes and - for y axes becasue pixels always measured from top left. + var pixellength = offmax - offmin; + var unitlength = max - min; + var sl = this._splitLength; + + // point to unit and unit to point conversions references to Plot DOM element top left corner. + if (this._splitAxis) { + pixellength -= this._splitLength; + + // don't know that this one is correct. + this.p2u = function(p){ + return (p - offmin) * unitlength / pixellength + min; + }; + + this.u2p = function(u){ + if (u <= 0) { + return (u - min) * pixellength / unitlength + offmin; + } + else { + return (u - min) * pixellength / unitlength + offmin + sl; + } + }; + + this.series_u2p = function(u){ + if (u <= 0) { + return (u - min) * pixellength / unitlength; + } + else { + return (u - min) * pixellength / unitlength + sl; + } + }; + + // don't know that this one is correct. + this.series_p2u = function(p){ + return p * unitlength / pixellength + min; + }; + } + else { + this.p2u = function(p){ + return (p - offmin) * unitlength / pixellength + min; + }; + + this.u2p = function(u){ + return (u - min) * pixellength / unitlength + offmin; + }; + + if (this.name.charAt(0) === 'x'){ + this.series_u2p = function(u){ + return (u - min) * pixellength / unitlength; + }; + this.series_p2u = function(p){ + return p * unitlength / pixellength + min; + }; + } + + else { + this.series_u2p = function(u){ + return (u - max) * pixellength / unitlength; + }; + this.series_p2u = function(p){ + return p * unitlength / pixellength + max; + }; + } + } + + if (this.show) { + if (this.name.charAt(0) === 'x') { + for (var i=0; i<ticks.length; i++) { + var t = ticks[i]; + if (t.show && t.showLabel) { + var shim; + + if (t.constructor == $.jqplot.CanvasAxisTickRenderer && t.angle) { + // will need to adjust auto positioning based on which axis this is. + var temp = (this.name == 'xaxis') ? 1 : -1; + switch (t.labelPosition) { + case 'auto': + // position at end + if (temp * t.angle < 0) { + shim = -t.getWidth() + t._textRenderer.height * Math.sin(-t._textRenderer.angle) / 2; + } + // position at start + else { + shim = -t._textRenderer.height * Math.sin(t._textRenderer.angle) / 2; + } + break; + case 'end': + shim = -t.getWidth() + t._textRenderer.height * Math.sin(-t._textRenderer.angle) / 2; + break; + case 'start': + shim = -t._textRenderer.height * Math.sin(t._textRenderer.angle) / 2; + break; + case 'middle': + shim = -t.getWidth()/2 + t._textRenderer.height * Math.sin(-t._textRenderer.angle) / 2; + break; + default: + shim = -t.getWidth()/2 + t._textRenderer.height * Math.sin(-t._textRenderer.angle) / 2; + break; + } + } + else { + shim = -t.getWidth()/2; + } + var val = this.u2p(t.value) + shim + 'px'; + t._elem.css('left', val); + t.pack(); + } + } + if (lshow) { + var w = this._label._elem.outerWidth(true); + this._label._elem.css('left', offmin + pixellength/2 - w/2 + 'px'); + if (this.name == 'xaxis') { + this._label._elem.css('bottom', '0px'); + } + else { + this._label._elem.css('top', '0px'); + } + this._label.pack(); + } + } + else { + for (var i=0; i<ticks.length; i++) { + var t = ticks[i]; + if (t.show && t.showLabel && !t.isMinorTick) { + var shim; + if (t.constructor == $.jqplot.CanvasAxisTickRenderer && t.angle) { + // will need to adjust auto positioning based on which axis this is. + var temp = (this.name == 'yaxis') ? 1 : -1; + switch (t.labelPosition) { + case 'auto': + // position at end + case 'end': + if (temp * t.angle < 0) { + shim = -t._textRenderer.height * Math.cos(-t._textRenderer.angle) / 2; + } + else { + shim = -t.getHeight() + t._textRenderer.height * Math.cos(t._textRenderer.angle) / 2; + } + break; + case 'start': + if (t.angle > 0) { + shim = -t._textRenderer.height * Math.cos(-t._textRenderer.angle) / 2; + } + else { + shim = -t.getHeight() + t._textRenderer.height * Math.cos(t._textRenderer.angle) / 2; + } + break; + case 'middle': + // if (t.angle > 0) { + // shim = -t.getHeight()/2 + t._textRenderer.height * Math.sin(-t._textRenderer.angle) / 2; + // } + // else { + // shim = -t.getHeight()/2 - t._textRenderer.height * Math.sin(t._textRenderer.angle) / 2; + // } + shim = -t.getHeight()/2; + break; + default: + shim = -t.getHeight()/2; + break; + } + } + else { + shim = -t.getHeight()/2; + } + + var val = this.u2p(t.value) + shim + 'px'; + t._elem.css('top', val); + t.pack(); + } + } + if (lshow) { + var h = this._label._elem.outerHeight(true); + if (this.name !== 'yMidAxis') { + this._label._elem.css('top', offmax - pixellength/2 - h/2 + 'px'); + } + if (this.name == 'yaxis') { + this._label._elem.css('left', '0px'); + } + else if (this.name !== 'yMidAxis') { + this._label._elem.css('right', '0px'); + } + this._label.pack(); + } + } + } + + ticks = null; + }; +})(jQuery); \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/plugins/jqplot.pyramidAxisRenderer.min.js b/libreplan-webapp/src/main/webapp/jqplot/plugins/jqplot.pyramidAxisRenderer.min.js new file mode 100644 index 000000000..c71dee2b5 --- /dev/null +++ b/libreplan-webapp/src/main/webapp/jqplot/plugins/jqplot.pyramidAxisRenderer.min.js @@ -0,0 +1,57 @@ +/** + * jqPlot + * Pure JavaScript plotting plugin using jQuery + * + * Version: 1.0.0b2_r1012 + * + * Copyright (c) 2009-2011 Chris Leonello + * jqPlot is currently available for use in all personal or commercial projects + * under both the MIT (http://www.opensource.org/licenses/mit-license.php) and GPL + * version 2.0 (http://www.gnu.org/licenses/gpl-2.0.html) licenses. This means that you can + * choose the license that best suits your project and use it accordingly. + * + * Although not required, the author would appreciate an email letting him + * know of any substantial use of jqPlot. You can reach the author at: + * chris at jqplot dot com or see http://www.jqplot.com/info.php . + * + * If you are feeling kind and generous, consider supporting the project by + * making a donation at: http://www.jqplot.com/donate.php . + * + * sprintf functions contained in jqplot.sprintf.js by Ash Searle: + * + * version 2007.04.27 + * author Ash Searle + * http://hexmen.com/blog/2007/03/printf-sprintf/ + * http://hexmen.com/js/sprintf.js + * The author (Ash Searle) has placed this code in the public domain: + * "This code is unrestricted: you are free to use it however you like." + * + * included jsDate library by Chris Leonello: + * + * Copyright (c) 2010-2011 Chris Leonello + * + * jsDate is currently available for use in all personal or commercial projects + * under both the MIT and GPL version 2.0 licenses. This means that you can + * choose the license that best suits your project and use it accordingly. + * + * jsDate borrows many concepts and ideas from the Date Instance + * Methods by Ken Snyder along with some parts of Ken's actual code. + * + * Ken's origianl Date Instance Methods and copyright notice: + * + * Ken Snyder (ken d snyder at gmail dot com) + * 2008-09-10 + * version 2.0.2 (http://kendsnyder.com/sandbox/date/) + * Creative Commons Attribution License 3.0 (http://creativecommons.org/licenses/by/3.0/) + * + * jqplotToImage function based on Larry Siden's export-jqplot-to-png.js. + * Larry has generously given permission to adapt his code for inclusion + * into jqPlot. + * + * Larry's original code can be found here: + * + * https://github.com/lsiden/export-jqplot-to-png + * + * + */ +(function(e){e.jqplot.PyramidAxisRenderer=function(){e.jqplot.LinearAxisRenderer.call(this)};e.jqplot.PyramidAxisRenderer.prototype=new e.jqplot.LinearAxisRenderer();e.jqplot.PyramidAxisRenderer.prototype.constructor=e.jqplot.PyramidAxisRenderer;e.jqplot.PyramidAxisRenderer.prototype.init=function(f){this.position=null;this.drawBaseline=true;this.baselineWidth=null;this.baselineColor=null;this.tickSpacingFactor=25;this._type="pyramid";this._splitAxis=false;this._splitLength=null;this.category=false;this._autoFormatString="";this._overrideFormatString=false;e.extend(true,this,f);this.renderer.options=f;this.resetDataBounds=this.renderer.resetDataBounds;this.resetDataBounds()};e.jqplot.PyramidAxisRenderer.prototype.resetDataBounds=function(){var h=this._dataBounds;h.min=null;h.max=null;var g;for(var m=0;m<this._series.length;m++){var n=this._series[m];var o=n._plotData;for(var k=0,f=o.length;k<f;k++){if(this.name.charAt(0)==="x"){g=o[k][1];if((g!==null&&g<h.min)||h.min===null){h.min=g}if((g!==null&&g>h.max)||h.max===null){h.max=g}}else{g=o[k][0];if((g!==null&&g<h.min)||h.min===null){h.min=g}if((g!==null&&g>h.max)||h.max===null){h.max=g}}}}};e.jqplot.PyramidAxisRenderer.prototype.draw=function(f,n){if(this.show){this.renderer.createTicks.call(this,n);var m=0;var g;if(this._elem){this._elem.emptyForce();this._elem=null}this._elem=e(document.createElement("div"));this._elem.addClass("jqplot-axis jqplot-"+this.name);this._elem.css("position","absolute");if(this.name=="xaxis"||this.name=="x2axis"){this._elem.width(this._plotDimensions.width)}else{this._elem.height(this._plotDimensions.height)}this.labelOptions.axis=this.name;this._label=new this.labelRenderer(this.labelOptions);if(this._label.show){var l=this._label.draw(f,n);l.appendTo(this._elem);l=null}var k=this._ticks;var j;for(var h=0;h<k.length;h++){j=k[h];if(j.show&&j.showLabel&&(!j.isMinorTick)){this._elem.append(j.draw(f,n))}}j=null;k=null}return this._elem};var b=[2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,101,103,107,109,113,127,131,137,139,149,151,157,163,167,173,179,181,191,193,197,199,211,223,227,229,233,239,241,251,257,263,269,271,277,281,283,293,307,311,313,317,331,337,347,349,353,359,367,373,379,383,389,397,401,409,419,421,431,433,439,443,449,457,461,463,467,479,487,491,499,503,509,521,523,541,547,557,563,569,571,577,587,593,599,601,607,613,617,619,631,641,643,647,653,659,661,673,677,683,691,701,709,719,727,733,739,743,751,757,761,769,773,787,797,809,811,821,823,827,829,839,853,857,859,863,877,881,883,887,907,911,919,929,937,941,947,953,967,971,977,983,991,997];var d={};for(var c=0,a=b.length;c<a;c++){d[b[c]]=b[c]}e.jqplot.PyramidAxisRenderer.prototype.createTicks=function(D){var J=this.ticks;var M=this._dataBounds;var E;var K;var B;var G;var y;var n;var k;var h;var H;var C;var x;var L=this.min;var N=this.max;var q;var v;var m;var g;var j;var O;var A;var F;var r;var P;var z=null;var I;if(J.length){for(H=0,C=J.length;H<C;H++){q=J[H];v=new this.tickRenderer(this.tickOptions);if(e.isArray(q)){v.value=q[0];v.label=q[1];v.setTick(q[0],this.name);this._ticks.push(v)}else{if(e.isPlainObject(q)){e.extend(true,v,q);v.axis=this.name;this._ticks.push(v)}else{if(typeof q==="string"){P=H+D.defaultAxisStart}else{P=q}v.value=P;v.label=q;v.axis=this.name;this._ticks.push(v)}}}this.numberTicks=J.length;this.min=this._ticks[0].value;this.max=this._ticks[this.numberTicks-1].value;this.tickInterval=(this.max-this.min)/(this.numberTicks-1);if(this._options.tickInterval){var o=this._options.tickInterval;for(H=0;H<this.numberTicks;H++){if(H%o!==0){this._ticks[H].isMinorTick=true}}}else{E=(this.name.charAt(0)==="x")?this._plotDimensions.width:this._plotDimensions.height;r=Math.round(2+E/this.tickSpacingFactor);if(this.numberTicks>r){I=this.numberTicks-1;for(H=2;H<I;H++){if(I%H===0&&I/H<r){z=H-1;break}}if(z!==null){var p=1;for(H=1,C=this._ticks.length;H<C;H++){if(p<=z){this._ticks[H].show=false;p+=1}else{p=1}}}}}I=[];if(this.category){this._ticks[0].showGridline=false;this._ticks[0].showMark=false;for(H=this._ticks.length-1;H>0;H--){v=new this.tickRenderer(this.tickOptions);v.value=this._ticks[H-1].value+this.tickInterval/2;v.label="";v.showLabel=false;v.axis=this.name;this._ticks[H].showGridline=false;this._ticks[H].showMark=false;this._ticks.splice(H,0,v)}v=new this.tickRenderer(this.tickOptions);v.value=this._ticks[0].value-this.tickInterval/2;v.label="";v.showLabel=false;v.axis=this.name;this._ticks.unshift(v);v=new this.tickRenderer(this.tickOptions);v.value=this._ticks[this._ticks.length-1].value+this.tickInterval/2;v.label="";v.showLabel=false;v.axis=this.name;this._ticks.push(v);this.tickInterval=this.tickInterval/2;this.numberTicks=this._ticks.length;this.min=this._ticks[0].value;this.max=this._ticks[this._ticks.length-1].value}}else{if(this.name.charAt(0)==="x"){E=this._plotDimensions.width;var w=Math.max(M.max,Math.abs(M.min));var u=Math.min(M.min,-w);B=u;G=w;y=G-B;if(this.tickOptions==null||!this.tickOptions.formatString){this._overrideFormatString=true}m=30;g=Math.max(E,m+1);j=(g-m)/300;O=e.jqplot.LinearTickGenerator(B,G,j);console.log(B,G,j,O);console.log(O[0].toString(),O[1].toString());A=B+y*(this.padMin-1);F=G-y*(this.padMax-1);if(B<A||G>F){A=B-y*(this.padMin-1);F=G+y*(this.padMax-1);O=e.jqplot.LinearTickGenerator(A,F,j);console.log(A,F,j,O)}this.min=O[0];this.max=O[1];this.numberTicks=O[2];this._autoFormatString=O[3];this.tickInterval=O[4]}else{E=this._plotDimensions.height;B=M.min;G=M.max;x=this._series[0];this._ticks=[];y=G-B;if(d[y]){y+=1;G+=1}this.max=G;this.min=B;r=Math.round(2+E/this.tickSpacingFactor);if(y+1<=r){this.numberTicks=y+1;this.tickInterval=1}else{for(var H=r;H>1;H--){if(y/(H-1)===Math.round(y/(H-1))){this.numberTicks=H;this.tickInterval=y/(H-1);break}}}}if(this._overrideFormatString&&this._autoFormatString!=""){this.tickOptions=this.tickOptions||{};this.tickOptions.formatString=this._autoFormatString}var f;for(H=0;H<this.numberTicks;H++){this.tickOptions.axis=this.name;f=this.min+this.tickInterval*H;if(this.name.charAt(0)==="x"){f=Math.abs(f)}this.tickOptions.value=this.min+this.tickInterval*H;v=new this.tickRenderer(this.tickOptions);v.label=v.prefix+v.formatter(v.formatString,f);this._ticks.push(v);if(this.name.charAt(0)==="x"&&D.axes.yMidAxis.show&&this.tickOptions.value===0){this._splitAxis=true;this._splitLength=D.axes.yMidAxis.getWidth();v=new this.tickRenderer(this.tickOptions);this._ticks.push(v);v.value=this.max/2000}}v=null}};e.jqplot.PyramidAxisRenderer.prototype.set=function(){var o=0;var j;var g=0;var n=0;var m;var l;var k;var f=(this._label==null)?false:this._label.show;if(this.show){l=this._ticks;a=l.length;for(m=0;m<a;m++){k=l[m];if(!k._breakTick&&k.show&&k.showLabel&&!k.isMinorTick){if(this.name.charAt(0)==="x"){j=k._elem.outerHeight(true)}else{j=k._elem.outerWidth(true)}if(j>o){o=j}}}if(this.name==="yMidAxis"){for(m=0;m<a;m++){k=l[m];if(k._elem){j=(o-k._elem.outerWidth(true))/2;k._elem.css("left",j)}}}k=null;l=null;if(f){g=this._label._elem.outerWidth(true);n=this._label._elem.outerHeight(true)}if(this.name==="xaxis"){o=o+n;this._elem.css({height:o+"px",left:"0px",bottom:"0px"})}else{if(this.name==="x2axis"){o=o+n;this._elem.css({height:o+"px",left:"0px",top:"0px"})}else{if(this.name==="yaxis"){o=o+g;this._elem.css({width:o+"px",left:"0px",top:"0px"});if(f&&this._label.constructor==e.jqplot.AxisLabelRenderer){this._label._elem.css("width",g+"px")}}else{if(this.name==="yMidAxis"){var j=o/2-g/2;this._elem.css({width:o+"px",top:"0px"});if(f&&this._label.constructor==e.jqplot.AxisLabelRenderer){this._label._elem.css({width:g,left:j,top:0})}}else{o=o+g;this._elem.css({width:o+"px",right:"0px",top:"0px"});if(f&&this._label.constructor==e.jqplot.AxisLabelRenderer){this._label._elem.css("width",g+"px")}}}}}}};e.jqplot.PyramidAxisRenderer.prototype.pack=function(j,g){j=j||{};g=g||this._offsets;var B=this._ticks;var v=this.max;var u=this.min;var o=g.max;var m=g.min;var r=(this._label==null)?false:this._label.show;for(var s in j){this._elem.css(s,j[s])}this._offsets=g;var k=o-m;var l=v-u;var z=this._splitLength;if(this._splitAxis){k-=this._splitLength;this.p2u=function(h){return(h-m)*l/k+u};this.u2p=function(h){if(h<=0){return(h-u)*k/l+m}else{return(h-u)*k/l+m+z}};this.series_u2p=function(h){if(h<=0){return(h-u)*k/l}else{return(h-u)*k/l+z}};this.series_p2u=function(h){return h*l/k+u}}else{this.p2u=function(h){return(h-m)*l/k+u};this.u2p=function(h){return(h-u)*k/l+m};if(this.name.charAt(0)==="x"){this.series_u2p=function(h){return(h-u)*k/l};this.series_p2u=function(h){return h*l/k+u}}else{this.series_u2p=function(h){return(h-v)*k/l};this.series_p2u=function(h){return h*l/k+v}}}if(this.show){if(this.name.charAt(0)==="x"){for(var x=0;x<B.length;x++){var q=B[x];if(q.show&&q.showLabel){var f;if(q.constructor==e.jqplot.CanvasAxisTickRenderer&&q.angle){var A=(this.name=="xaxis")?1:-1;switch(q.labelPosition){case"auto":if(A*q.angle<0){f=-q.getWidth()+q._textRenderer.height*Math.sin(-q._textRenderer.angle)/2}else{f=-q._textRenderer.height*Math.sin(q._textRenderer.angle)/2}break;case"end":f=-q.getWidth()+q._textRenderer.height*Math.sin(-q._textRenderer.angle)/2;break;case"start":f=-q._textRenderer.height*Math.sin(q._textRenderer.angle)/2;break;case"middle":f=-q.getWidth()/2+q._textRenderer.height*Math.sin(-q._textRenderer.angle)/2;break;default:f=-q.getWidth()/2+q._textRenderer.height*Math.sin(-q._textRenderer.angle)/2;break}}else{f=-q.getWidth()/2}var C=this.u2p(q.value)+f+"px";q._elem.css("left",C);q.pack()}}if(r){var n=this._label._elem.outerWidth(true);this._label._elem.css("left",m+k/2-n/2+"px");if(this.name=="xaxis"){this._label._elem.css("bottom","0px")}else{this._label._elem.css("top","0px")}this._label.pack()}}else{for(var x=0;x<B.length;x++){var q=B[x];if(q.show&&q.showLabel&&!q.isMinorTick){var f;if(q.constructor==e.jqplot.CanvasAxisTickRenderer&&q.angle){var A=(this.name=="yaxis")?1:-1;switch(q.labelPosition){case"auto":case"end":if(A*q.angle<0){f=-q._textRenderer.height*Math.cos(-q._textRenderer.angle)/2}else{f=-q.getHeight()+q._textRenderer.height*Math.cos(q._textRenderer.angle)/2}break;case"start":if(q.angle>0){f=-q._textRenderer.height*Math.cos(-q._textRenderer.angle)/2}else{f=-q.getHeight()+q._textRenderer.height*Math.cos(q._textRenderer.angle)/2}break;case"middle":f=-q.getHeight()/2;break;default:f=-q.getHeight()/2;break}}else{f=-q.getHeight()/2}var C=this.u2p(q.value)+f+"px";q._elem.css("top",C);q.pack()}}if(r){var y=this._label._elem.outerHeight(true);if(this.name!=="yMidAxis"){this._label._elem.css("top",o-k/2-y/2+"px")}if(this.name=="yaxis"){this._label._elem.css("left","0px")}else{if(this.name!=="yMidAxis"){this._label._elem.css("right","0px")}}this._label.pack()}}}B=null}})(jQuery); \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/plugins/jqplot.pyramidGridRenderer.js b/libreplan-webapp/src/main/webapp/jqplot/plugins/jqplot.pyramidGridRenderer.js new file mode 100644 index 000000000..ce44ede60 --- /dev/null +++ b/libreplan-webapp/src/main/webapp/jqplot/plugins/jqplot.pyramidGridRenderer.js @@ -0,0 +1,423 @@ +/** + * jqPlot + * Pure JavaScript plotting plugin using jQuery + * + * Version: 1.0.0b2_r1012 + * + * Copyright (c) 2009-2011 Chris Leonello + * jqPlot is currently available for use in all personal or commercial projects + * under both the MIT (http://www.opensource.org/licenses/mit-license.php) and GPL + * version 2.0 (http://www.gnu.org/licenses/gpl-2.0.html) licenses. This means that you can + * choose the license that best suits your project and use it accordingly. + * + * Although not required, the author would appreciate an email letting him + * know of any substantial use of jqPlot. You can reach the author at: + * chris at jqplot dot com or see http://www.jqplot.com/info.php . + * + * If you are feeling kind and generous, consider supporting the project by + * making a donation at: http://www.jqplot.com/donate.php . + * + * sprintf functions contained in jqplot.sprintf.js by Ash Searle: + * + * version 2007.04.27 + * author Ash Searle + * http://hexmen.com/blog/2007/03/printf-sprintf/ + * http://hexmen.com/js/sprintf.js + * The author (Ash Searle) has placed this code in the public domain: + * "This code is unrestricted: you are free to use it however you like." + * + */ +(function($) { + // Class: $.jqplot.CanvasGridRenderer + // The default jqPlot grid renderer, creating a grid on a canvas element. + // The renderer has no additional options beyond the <Grid> class. + $.jqplot.PyramidGridRenderer = function(){ + $.jqplot.CanvasGridRenderer.call(this); + }; + + $.jqplot.PyramidGridRenderer.prototype = new $.jqplot.CanvasGridRenderer(); + $.jqplot.PyramidGridRenderer.prototype.constructor = $.jqplot.PyramidGridRenderer; + + // called with context of Grid object + $.jqplot.CanvasGridRenderer.prototype.init = function(options) { + this._ctx; + this.plotBands = { + show: false, + color: 'rgb(230, 219, 179)', + axis: 'y', + start: null, + interval: 10 + }; + $.extend(true, this, options); + // set the shadow renderer options + var sopts = {lineJoin:'miter', lineCap:'round', fill:false, isarc:false, angle:this.shadowAngle, offset:this.shadowOffset, alpha:this.shadowAlpha, depth:this.shadowDepth, lineWidth:this.shadowWidth, closePath:false, strokeStyle:this.shadowColor}; + this.renderer.shadowRenderer.init(sopts); + }; + + $.jqplot.PyramidGridRenderer.prototype.draw = function() { + this._ctx = this._elem.get(0).getContext("2d"); + var ctx = this._ctx; + var axes = this._axes; + var xp = axes.xaxis.u2p; + var yp = axes.yMidAxis.u2p; + var xnudge = axes.xaxis.max/1000.0; + var xp0 = xp(0); + var xpn = xp(xnudge); + var ax = ['xaxis', 'yaxis', 'x2axis', 'y2axis','yMidAxis']; + // Add the grid onto the grid canvas. This is the bottom most layer. + ctx.save(); + ctx.clearRect(0, 0, this._plotDimensions.width, this._plotDimensions.height); + ctx.fillStyle = this.backgroundColor || this.background; + + ctx.fillRect(this._left, this._top, this._width, this._height); + + if (this.plotBands.show) { + ctx.save(); + var pb = this.plotBands; + ctx.fillStyle = pb.color; + var axis; + var x, y, w, h; + // find axis to work with + if (pb.axis.charAt(0) === 'x') { + if (axes.xaxis.show) { + axis = axes.xaxis; + } + } + else if (pb.axis.charAt(0) === 'y') { + if (axes.yaxis.show) { + axis = axes.yaxis; + } + else if (axes.y2axis.show) { + axis = axes.y2axis; + } + else if (axes.yMidAxis.show) { + axis = axes.yMidAxis; + } + } + + if (axis !== undefined) { + // draw some rectangles + var start = pb.start; + if (start === null) { + start = axis.min; + } + for (var i = start; i < axis.max; i += 2 * pb.interval) { + if (axis.name.charAt(0) === 'y') { + x = this._left; + y = axis.series_u2p(i + pb.interval) + this._top; + w = this._right - this._left; + h = axis.series_u2p(start) - axis.series_u2p(start + pb.interval); + ctx.fillRect(x, y, w, h); + } + // else { + // y = 0; + // x = axis.series_u2p(i); + // h = this._height; + // w = axis.series_u2p(start + pb.interval) - axis.series_u2p(start); + // } + + } + } + ctx.restore(); + } + + ctx.save(); + ctx.lineJoin = 'miter'; + ctx.lineCap = 'butt'; + ctx.lineWidth = this.gridLineWidth; + ctx.strokeStyle = this.gridLineColor; + var b, e, s, m; + for (var i=5; i>0; i--) { + var name = ax[i-1]; + var axis = axes[name]; + var ticks = axis._ticks; + var numticks = ticks.length; + if (axis.show) { + if (axis.drawBaseline) { + var bopts = {}; + if (axis.baselineWidth !== null) { + bopts.lineWidth = axis.baselineWidth; + } + if (axis.baselineColor !== null) { + bopts.strokeStyle = axis.baselineColor; + } + switch (name) { + case 'xaxis': + if (axes.yMidAxis.show) { + drawLine (this._left, this._bottom, xp0, this._bottom, bopts); + drawLine (xpn, this._bottom, this._right, this._bottom, bopts); + } + else { + drawLine (this._left, this._bottom, this._right, this._bottom, bopts); + } + break; + case 'yaxis': + drawLine (this._left, this._bottom, this._left, this._top, bopts); + break; + case 'yMidAxis': + drawLine(xp0, this._bottom, xp0, this._top, bopts); + drawLine(xpn, this._bottom, xpn, this._top, bopts); + break; + case 'x2axis': + if (axes.yMidAxis.show) { + drawLine (this._left, this._top, xp0, this._top, bopts); + drawLine (xpn, this._top, this._right, this._top, bopts); + } + else { + drawLine (this._left, this._bottom, this._right, this._bottom, bopts); + } + break; + case 'y2axis': + drawLine (this._right, this._bottom, this._right, this._top, bopts); + break; + + } + } + for (var j=numticks; j>0; j--) { + var t = ticks[j-1]; + if (t.show) { + var pos = Math.round(axis.u2p(t.value)) + 0.5; + switch (name) { + case 'xaxis': + // draw the grid line if we should + if (t.showGridline && this.drawGridlines && (!t.isMinorTick || axis.showMinorTicks)) { + drawLine(pos, this._top, pos, this._bottom); + } + + // draw the mark + if (t.showMark && t.mark && (!t.isMinorTick || axis.showMinorTicks)) { + s = t.markSize; + m = t.mark; + var pos = Math.round(axis.u2p(t.value)) + 0.5; + switch (m) { + case 'outside': + b = this._bottom; + e = this._bottom+s; + break; + case 'inside': + b = this._bottom-s; + e = this._bottom; + break; + case 'cross': + b = this._bottom-s; + e = this._bottom+s; + break; + default: + b = this._bottom; + e = this._bottom+s; + break; + } + // draw the shadow + if (this.shadow) { + this.renderer.shadowRenderer.draw(ctx, [[pos,b],[pos,e]], {lineCap:'butt', lineWidth:this.gridLineWidth, offset:this.gridLineWidth*0.75, depth:2, fill:false, closePath:false}); + } + // draw the line + drawLine(pos, b, pos, e); + } + break; + case 'yaxis': + // draw the grid line + if (t.showGridline && this.drawGridlines && (!t.isMinorTick || axis.showMinorTicks)) { + drawLine(this._right, pos, this._left, pos); + } + + // draw the mark + if (t.showMark && t.mark && (!t.isMinorTick || axis.showMinorTicks)) { + s = t.markSize; + m = t.mark; + var pos = Math.round(axis.u2p(t.value)) + 0.5; + switch (m) { + case 'outside': + b = this._left-s; + e = this._left; + break; + case 'inside': + b = this._left; + e = this._left+s; + break; + case 'cross': + b = this._left-s; + e = this._left+s; + break; + default: + b = this._left-s; + e = this._left; + break; + } + // draw the shadow + if (this.shadow) { + this.renderer.shadowRenderer.draw(ctx, [[b, pos], [e, pos]], {lineCap:'butt', lineWidth:this.gridLineWidth*1.5, offset:this.gridLineWidth*0.75, fill:false, closePath:false}); + } + drawLine(b, pos, e, pos, {strokeStyle:axis.borderColor}); + } + break; + case 'yMidAxis': + // draw the grid line + if (t.showGridline && this.drawGridlines && (!t.isMinorTick || axis.showMinorTicks)) { + drawLine(this._left, pos, xp0, pos); + drawLine(xpn, pos, this._right, pos); + } + // draw the mark + if (t.showMark && t.mark && (!t.isMinorTick || axis.showMinorTicks)) { + s = t.markSize; + m = t.mark; + var pos = Math.round(axis.u2p(t.value)) + 0.5; + + b = xp0; + e = xp0 + s; + // draw the shadow + if (this.shadow) { + this.renderer.shadowRenderer.draw(ctx, [[b, pos], [e, pos]], {lineCap:'butt', lineWidth:this.gridLineWidth*1.5, offset:this.gridLineWidth*0.75, fill:false, closePath:false}); + } + drawLine(b, pos, e, pos, {strokeStyle:axis.borderColor}); + + b = xpn - s; + e = xpn; + // draw the shadow + if (this.shadow) { + this.renderer.shadowRenderer.draw(ctx, [[b, pos], [e, pos]], {lineCap:'butt', lineWidth:this.gridLineWidth*1.5, offset:this.gridLineWidth*0.75, fill:false, closePath:false}); + } + drawLine(b, pos, e, pos, {strokeStyle:axis.borderColor}); + } + break; + case 'x2axis': + // draw the grid line + if (t.showGridline && this.drawGridlines && (!t.isMinorTick || axis.showMinorTicks)) { + drawLine(pos, this._bottom, pos, this._top); + } + + // draw the mark + if (t.showMark && t.mark && (!t.isMinorTick || axis.showMinorTicks)) { + s = t.markSize; + m = t.mark; + var pos = Math.round(axis.u2p(t.value)) + 0.5; + switch (m) { + case 'outside': + b = this._top-s; + e = this._top; + break; + case 'inside': + b = this._top; + e = this._top+s; + break; + case 'cross': + b = this._top-s; + e = this._top+s; + break; + default: + b = this._top-s; + e = this._top; + break; + } + // draw the shadow + if (this.shadow) { + this.renderer.shadowRenderer.draw(ctx, [[pos,b],[pos,e]], {lineCap:'butt', lineWidth:this.gridLineWidth, offset:this.gridLineWidth*0.75, depth:2, fill:false, closePath:false}); + } + drawLine(pos, b, pos, e); + } + break; + case 'y2axis': + // draw the grid line + if (t.showGridline && this.drawGridlines && (!t.isMinorTick || axis.showMinorTicks)) { + drawLine(this._left, pos, this._right, pos); + } + + // draw the mark + if (t.showMark && t.mark && (!t.isMinorTick || axis.showMinorTicks)) { + s = t.markSize; + m = t.mark; + var pos = Math.round(axis.u2p(t.value)) + 0.5; + switch (m) { + case 'outside': + b = this._right; + e = this._right+s; + break; + case 'inside': + b = this._right-s; + e = this._right; + break; + case 'cross': + b = this._right-s; + e = this._right+s; + break; + default: + b = this._right; + e = this._right+s; + break; + } + // draw the shadow + if (this.shadow) { + this.renderer.shadowRenderer.draw(ctx, [[b, pos], [e, pos]], {lineCap:'butt', lineWidth:this.gridLineWidth*1.5, offset:this.gridLineWidth*0.75, fill:false, closePath:false}); + } + drawLine(b, pos, e, pos, {strokeStyle:axis.borderColor}); + } + break; + default: + break; + } + } + } + t = null; + } + axis = null; + ticks = null; + } + + ctx.restore(); + + function drawLine(bx, by, ex, ey, opts) { + ctx.save(); + opts = opts || {}; + if (opts.lineWidth == null || opts.lineWidth != 0){ + $.extend(true, ctx, opts); + ctx.beginPath(); + ctx.moveTo(bx, by); + ctx.lineTo(ex, ey); + ctx.stroke(); + } + ctx.restore(); + } + + if (this.shadow) { + if (axes.yMidAxis.show) { + var points = [[this._left, this._bottom], [xp0, this._bottom]]; + this.renderer.shadowRenderer.draw(ctx, points); + var points = [[xpn, this._bottom], [this._right, this._bottom], [this._right, this._top]]; + this.renderer.shadowRenderer.draw(ctx, points); + var points = [[xp0, this._bottom], [xp0, this._top]]; + this.renderer.shadowRenderer.draw(ctx, points); + } + else { + var points = [[this._left, this._bottom], [this._right, this._bottom], [this._right, this._top]]; + this.renderer.shadowRenderer.draw(ctx, points); + } + } + // Now draw border around grid. Use axis border definitions. start at + // upper left and go clockwise. + if (this.borderWidth != 0 && this.drawBorder) { + if (axes.yMidAxis.show) { + drawLine (this._left, this._top, xp0, this._top, {lineCap:'round', strokeStyle:axes.x2axis.borderColor, lineWidth:axes.x2axis.borderWidth}); + drawLine (xpn, this._top, this._right, this._top, {lineCap:'round', strokeStyle:axes.x2axis.borderColor, lineWidth:axes.x2axis.borderWidth}); + drawLine (this._right, this._top, this._right, this._bottom, {lineCap:'round', strokeStyle:axes.y2axis.borderColor, lineWidth:axes.y2axis.borderWidth}); + drawLine (this._right, this._bottom, xpn, this._bottom, {lineCap:'round', strokeStyle:axes.xaxis.borderColor, lineWidth:axes.xaxis.borderWidth}); + drawLine (xp0, this._bottom, this._left, this._bottom, {lineCap:'round', strokeStyle:axes.xaxis.borderColor, lineWidth:axes.xaxis.borderWidth}); + drawLine (this._left, this._bottom, this._left, this._top, {lineCap:'round', strokeStyle:axes.yaxis.borderColor, lineWidth:axes.yaxis.borderWidth}); + drawLine (xp0, this._bottom, xp0, this._top, {lineCap:'round', strokeStyle:axes.yaxis.borderColor, lineWidth:axes.yaxis.borderWidth}); + drawLine (xpn, this._bottom, xpn, this._top, {lineCap:'round', strokeStyle:axes.yaxis.borderColor, lineWidth:axes.yaxis.borderWidth}); + } + else { + drawLine (this._left, this._top, this._right, this._top, {lineCap:'round', strokeStyle:axes.x2axis.borderColor, lineWidth:axes.x2axis.borderWidth}); + drawLine (this._right, this._top, this._right, this._bottom, {lineCap:'round', strokeStyle:axes.y2axis.borderColor, lineWidth:axes.y2axis.borderWidth}); + drawLine (this._right, this._bottom, this._left, this._bottom, {lineCap:'round', strokeStyle:axes.xaxis.borderColor, lineWidth:axes.xaxis.borderWidth}); + drawLine (this._left, this._bottom, this._left, this._top, {lineCap:'round', strokeStyle:axes.yaxis.borderColor, lineWidth:axes.yaxis.borderWidth}); + } + } + // ctx.lineWidth = this.borderWidth; + // ctx.strokeStyle = this.borderColor; + // ctx.strokeRect(this._left, this._top, this._width, this._height); + + ctx.restore(); + ctx = null; + axes = null; + }; +})(jQuery); \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/plugins/jqplot.pyramidGridRenderer.min.js b/libreplan-webapp/src/main/webapp/jqplot/plugins/jqplot.pyramidGridRenderer.min.js new file mode 100644 index 000000000..26d8276b6 --- /dev/null +++ b/libreplan-webapp/src/main/webapp/jqplot/plugins/jqplot.pyramidGridRenderer.min.js @@ -0,0 +1,57 @@ +/** + * jqPlot + * Pure JavaScript plotting plugin using jQuery + * + * Version: 1.0.0b2_r1012 + * + * Copyright (c) 2009-2011 Chris Leonello + * jqPlot is currently available for use in all personal or commercial projects + * under both the MIT (http://www.opensource.org/licenses/mit-license.php) and GPL + * version 2.0 (http://www.gnu.org/licenses/gpl-2.0.html) licenses. This means that you can + * choose the license that best suits your project and use it accordingly. + * + * Although not required, the author would appreciate an email letting him + * know of any substantial use of jqPlot. You can reach the author at: + * chris at jqplot dot com or see http://www.jqplot.com/info.php . + * + * If you are feeling kind and generous, consider supporting the project by + * making a donation at: http://www.jqplot.com/donate.php . + * + * sprintf functions contained in jqplot.sprintf.js by Ash Searle: + * + * version 2007.04.27 + * author Ash Searle + * http://hexmen.com/blog/2007/03/printf-sprintf/ + * http://hexmen.com/js/sprintf.js + * The author (Ash Searle) has placed this code in the public domain: + * "This code is unrestricted: you are free to use it however you like." + * + * included jsDate library by Chris Leonello: + * + * Copyright (c) 2010-2011 Chris Leonello + * + * jsDate is currently available for use in all personal or commercial projects + * under both the MIT and GPL version 2.0 licenses. This means that you can + * choose the license that best suits your project and use it accordingly. + * + * jsDate borrows many concepts and ideas from the Date Instance + * Methods by Ken Snyder along with some parts of Ken's actual code. + * + * Ken's origianl Date Instance Methods and copyright notice: + * + * Ken Snyder (ken d snyder at gmail dot com) + * 2008-09-10 + * version 2.0.2 (http://kendsnyder.com/sandbox/date/) + * Creative Commons Attribution License 3.0 (http://creativecommons.org/licenses/by/3.0/) + * + * jqplotToImage function based on Larry Siden's export-jqplot-to-png.js. + * Larry has generously given permission to adapt his code for inclusion + * into jqPlot. + * + * Larry's original code can be found here: + * + * https://github.com/lsiden/export-jqplot-to-png + * + * + */ +(function(a){a.jqplot.PyramidGridRenderer=function(){a.jqplot.CanvasGridRenderer.call(this)};a.jqplot.PyramidGridRenderer.prototype=new a.jqplot.CanvasGridRenderer();a.jqplot.PyramidGridRenderer.prototype.constructor=a.jqplot.PyramidGridRenderer;a.jqplot.CanvasGridRenderer.prototype.init=function(c){this._ctx;this.plotBands={show:false,color:"rgb(230, 219, 179)",axis:"y",start:null,interval:10};a.extend(true,this,c);var b={lineJoin:"miter",lineCap:"round",fill:false,isarc:false,angle:this.shadowAngle,offset:this.shadowOffset,alpha:this.shadowAlpha,depth:this.shadowDepth,lineWidth:this.shadowWidth,closePath:false,strokeStyle:this.shadowColor};this.renderer.shadowRenderer.init(b)};a.jqplot.PyramidGridRenderer.prototype.draw=function(){this._ctx=this._elem.get(0).getContext("2d");var D=this._ctx;var G=this._axes;var q=G.xaxis.u2p;var J=G.yMidAxis.u2p;var l=G.xaxis.max/1000;var u=q(0);var f=q(l);var r=["xaxis","yaxis","x2axis","y2axis","yMidAxis"];D.save();D.clearRect(0,0,this._plotDimensions.width,this._plotDimensions.height);D.fillStyle=this.backgroundColor||this.background;D.fillRect(this._left,this._top,this._width,this._height);if(this.plotBands.show){D.save();var c=this.plotBands;D.fillStyle=c.color;var d;var o,n,p,I;if(c.axis.charAt(0)==="x"){if(G.xaxis.show){d=G.xaxis}}else{if(c.axis.charAt(0)==="y"){if(G.yaxis.show){d=G.yaxis}else{if(G.y2axis.show){d=G.y2axis}else{if(G.yMidAxis.show){d=G.yMidAxis}}}}}if(d!==undefined){var g=c.start;if(g===null){g=d.min}for(var H=g;H<d.max;H+=2*c.interval){if(d.name.charAt(0)==="y"){o=this._left;n=d.series_u2p(H+c.interval)+this._top;p=this._right-this._left;I=d.series_u2p(g)-d.series_u2p(g+c.interval);D.fillRect(o,n,p,I)}}}D.restore()}D.save();D.lineJoin="miter";D.lineCap="butt";D.lineWidth=this.gridLineWidth;D.strokeStyle=this.gridLineColor;var L,K,A,C;for(var H=5;H>0;H--){var O=r[H-1];var d=G[O];var M=d._ticks;var B=M.length;if(d.show){if(d.drawBaseline){var N={};if(d.baselineWidth!==null){N.lineWidth=d.baselineWidth}if(d.baselineColor!==null){N.strokeStyle=d.baselineColor}switch(O){case"xaxis":if(G.yMidAxis.show){z(this._left,this._bottom,u,this._bottom,N);z(f,this._bottom,this._right,this._bottom,N)}else{z(this._left,this._bottom,this._right,this._bottom,N)}break;case"yaxis":z(this._left,this._bottom,this._left,this._top,N);break;case"yMidAxis":z(u,this._bottom,u,this._top,N);z(f,this._bottom,f,this._top,N);break;case"x2axis":if(G.yMidAxis.show){z(this._left,this._top,u,this._top,N);z(f,this._top,this._right,this._top,N)}else{z(this._left,this._bottom,this._right,this._bottom,N)}break;case"y2axis":z(this._right,this._bottom,this._right,this._top,N);break}}for(var E=B;E>0;E--){var v=M[E-1];if(v.show){var k=Math.round(d.u2p(v.value))+0.5;switch(O){case"xaxis":if(v.showGridline&&this.drawGridlines&&(!v.isMinorTick||d.showMinorTicks)){z(k,this._top,k,this._bottom)}if(v.showMark&&v.mark&&(!v.isMinorTick||d.showMinorTicks)){A=v.markSize;C=v.mark;var k=Math.round(d.u2p(v.value))+0.5;switch(C){case"outside":L=this._bottom;K=this._bottom+A;break;case"inside":L=this._bottom-A;K=this._bottom;break;case"cross":L=this._bottom-A;K=this._bottom+A;break;default:L=this._bottom;K=this._bottom+A;break}if(this.shadow){this.renderer.shadowRenderer.draw(D,[[k,L],[k,K]],{lineCap:"butt",lineWidth:this.gridLineWidth,offset:this.gridLineWidth*0.75,depth:2,fill:false,closePath:false})}z(k,L,k,K)}break;case"yaxis":if(v.showGridline&&this.drawGridlines&&(!v.isMinorTick||d.showMinorTicks)){z(this._right,k,this._left,k)}if(v.showMark&&v.mark&&(!v.isMinorTick||d.showMinorTicks)){A=v.markSize;C=v.mark;var k=Math.round(d.u2p(v.value))+0.5;switch(C){case"outside":L=this._left-A;K=this._left;break;case"inside":L=this._left;K=this._left+A;break;case"cross":L=this._left-A;K=this._left+A;break;default:L=this._left-A;K=this._left;break}if(this.shadow){this.renderer.shadowRenderer.draw(D,[[L,k],[K,k]],{lineCap:"butt",lineWidth:this.gridLineWidth*1.5,offset:this.gridLineWidth*0.75,fill:false,closePath:false})}z(L,k,K,k,{strokeStyle:d.borderColor})}break;case"yMidAxis":if(v.showGridline&&this.drawGridlines&&(!v.isMinorTick||d.showMinorTicks)){z(this._left,k,u,k);z(f,k,this._right,k)}if(v.showMark&&v.mark&&(!v.isMinorTick||d.showMinorTicks)){A=v.markSize;C=v.mark;var k=Math.round(d.u2p(v.value))+0.5;L=u;K=u+A;if(this.shadow){this.renderer.shadowRenderer.draw(D,[[L,k],[K,k]],{lineCap:"butt",lineWidth:this.gridLineWidth*1.5,offset:this.gridLineWidth*0.75,fill:false,closePath:false})}z(L,k,K,k,{strokeStyle:d.borderColor});L=f-A;K=f;if(this.shadow){this.renderer.shadowRenderer.draw(D,[[L,k],[K,k]],{lineCap:"butt",lineWidth:this.gridLineWidth*1.5,offset:this.gridLineWidth*0.75,fill:false,closePath:false})}z(L,k,K,k,{strokeStyle:d.borderColor})}break;case"x2axis":if(v.showGridline&&this.drawGridlines&&(!v.isMinorTick||d.showMinorTicks)){z(k,this._bottom,k,this._top)}if(v.showMark&&v.mark&&(!v.isMinorTick||d.showMinorTicks)){A=v.markSize;C=v.mark;var k=Math.round(d.u2p(v.value))+0.5;switch(C){case"outside":L=this._top-A;K=this._top;break;case"inside":L=this._top;K=this._top+A;break;case"cross":L=this._top-A;K=this._top+A;break;default:L=this._top-A;K=this._top;break}if(this.shadow){this.renderer.shadowRenderer.draw(D,[[k,L],[k,K]],{lineCap:"butt",lineWidth:this.gridLineWidth,offset:this.gridLineWidth*0.75,depth:2,fill:false,closePath:false})}z(k,L,k,K)}break;case"y2axis":if(v.showGridline&&this.drawGridlines&&(!v.isMinorTick||d.showMinorTicks)){z(this._left,k,this._right,k)}if(v.showMark&&v.mark&&(!v.isMinorTick||d.showMinorTicks)){A=v.markSize;C=v.mark;var k=Math.round(d.u2p(v.value))+0.5;switch(C){case"outside":L=this._right;K=this._right+A;break;case"inside":L=this._right-A;K=this._right;break;case"cross":L=this._right-A;K=this._right+A;break;default:L=this._right;K=this._right+A;break}if(this.shadow){this.renderer.shadowRenderer.draw(D,[[L,k],[K,k]],{lineCap:"butt",lineWidth:this.gridLineWidth*1.5,offset:this.gridLineWidth*0.75,fill:false,closePath:false})}z(L,k,K,k,{strokeStyle:d.borderColor})}break;default:break}}}v=null}d=null;M=null}D.restore();function z(j,i,e,b,h){D.save();h=h||{};if(h.lineWidth==null||h.lineWidth!=0){a.extend(true,D,h);D.beginPath();D.moveTo(j,i);D.lineTo(e,b);D.stroke()}D.restore()}if(this.shadow){if(G.yMidAxis.show){var F=[[this._left,this._bottom],[u,this._bottom]];this.renderer.shadowRenderer.draw(D,F);var F=[[f,this._bottom],[this._right,this._bottom],[this._right,this._top]];this.renderer.shadowRenderer.draw(D,F);var F=[[u,this._bottom],[u,this._top]];this.renderer.shadowRenderer.draw(D,F)}else{var F=[[this._left,this._bottom],[this._right,this._bottom],[this._right,this._top]];this.renderer.shadowRenderer.draw(D,F)}}if(this.borderWidth!=0&&this.drawBorder){if(G.yMidAxis.show){z(this._left,this._top,u,this._top,{lineCap:"round",strokeStyle:G.x2axis.borderColor,lineWidth:G.x2axis.borderWidth});z(f,this._top,this._right,this._top,{lineCap:"round",strokeStyle:G.x2axis.borderColor,lineWidth:G.x2axis.borderWidth});z(this._right,this._top,this._right,this._bottom,{lineCap:"round",strokeStyle:G.y2axis.borderColor,lineWidth:G.y2axis.borderWidth});z(this._right,this._bottom,f,this._bottom,{lineCap:"round",strokeStyle:G.xaxis.borderColor,lineWidth:G.xaxis.borderWidth});z(u,this._bottom,this._left,this._bottom,{lineCap:"round",strokeStyle:G.xaxis.borderColor,lineWidth:G.xaxis.borderWidth});z(this._left,this._bottom,this._left,this._top,{lineCap:"round",strokeStyle:G.yaxis.borderColor,lineWidth:G.yaxis.borderWidth});z(u,this._bottom,u,this._top,{lineCap:"round",strokeStyle:G.yaxis.borderColor,lineWidth:G.yaxis.borderWidth});z(f,this._bottom,f,this._top,{lineCap:"round",strokeStyle:G.yaxis.borderColor,lineWidth:G.yaxis.borderWidth})}else{z(this._left,this._top,this._right,this._top,{lineCap:"round",strokeStyle:G.x2axis.borderColor,lineWidth:G.x2axis.borderWidth});z(this._right,this._top,this._right,this._bottom,{lineCap:"round",strokeStyle:G.y2axis.borderColor,lineWidth:G.y2axis.borderWidth});z(this._right,this._bottom,this._left,this._bottom,{lineCap:"round",strokeStyle:G.xaxis.borderColor,lineWidth:G.xaxis.borderWidth});z(this._left,this._bottom,this._left,this._top,{lineCap:"round",strokeStyle:G.yaxis.borderColor,lineWidth:G.yaxis.borderWidth})}}D.restore();D=null;G=null}})(jQuery); \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/plugins/jqplot.pyramidRenderer.js b/libreplan-webapp/src/main/webapp/jqplot/plugins/jqplot.pyramidRenderer.js new file mode 100644 index 000000000..f64fb2e96 --- /dev/null +++ b/libreplan-webapp/src/main/webapp/jqplot/plugins/jqplot.pyramidRenderer.js @@ -0,0 +1,490 @@ +/** + * jqPlot + * Pure JavaScript plotting plugin using jQuery + * + * Version: 1.0.0b2_r1012 + * + * Copyright (c) 2009-2011 Chris Leonello + * jqPlot is currently available for use in all personal or commercial projects + * under both the MIT (http://www.opensource.org/licenses/mit-license.php) and GPL + * version 2.0 (http://www.gnu.org/licenses/gpl-2.0.html) licenses. This means that you can + * choose the license that best suits your project and use it accordingly. + * + * Although not required, the author would appreciate an email letting him + * know of any substantial use of jqPlot. You can reach the author at: + * chris at jqplot dot com or see http://www.jqplot.com/info.php . + * + * If you are feeling kind and generous, consider supporting the project by + * making a donation at: http://www.jqplot.com/donate.php . + * + * sprintf functions contained in jqplot.sprintf.js by Ash Searle: + * + * version 2007.04.27 + * author Ash Searle + * http://hexmen.com/blog/2007/03/printf-sprintf/ + * http://hexmen.com/js/sprintf.js + * The author (Ash Searle) has placed this code in the public domain: + * "This code is unrestricted: you are free to use it however you like." + * + */ +(function($) { + + // Need to ensure pyramid axis and grid renderers are loaded. + // You should load these with script tags in the html head, that is more efficient + // as the browser will cache the request. + // Note, have to block with synchronous request in order to execute bar renderer code. + if ($.jqplot.PyramidAxisRenderer === undefined) { + $.ajax({ + url: $.jqplot.pluginLocation + 'jqplot.pyramidAxisRenderer.js', + dataType: "script", + async: false + }); + } + + if ($.jqplot.PyramidGridRenderer === undefined) { + $.ajax({ + url: $.jqplot.pluginLocation + 'jqplot.pyramidGridRenderer.js', + dataType: "script", + async: false + }); + } + + $.jqplot.PyramidRenderer = function(){ + $.jqplot.LineRenderer.call(this); + }; + + $.jqplot.PyramidRenderer.prototype = new $.jqplot.LineRenderer(); + $.jqplot.PyramidRenderer.prototype.constructor = $.jqplot.PyramidRenderer; + + // called with scope of a series + $.jqplot.PyramidRenderer.prototype.init = function(options, plot) { + options = options || {}; + this._type = 'pyramid'; + // Group: Properties + // + // prop: barPadding + this.barPadding = 10; + this.barWidth = null; + // prop: fill + // True to fill the bars. + this.fill = true; + // prop: highlightMouseOver + // True to highlight slice when moused over. + // This must be false to enable highlightMouseDown to highlight when clicking on a slice. + this.highlightMouseOver = true; + // prop: highlightMouseDown + // True to highlight when a mouse button is pressed over a slice. + // This will be disabled if highlightMouseOver is true. + this.highlightMouseDown = false; + // prop: highlightColors + // an array of colors to use when highlighting a slice. + this.highlightColors = []; + // prop: offsetBars + // False will center bars on their y value. + // True will push bars up by 1/2 bar width to fill between their y values. + // If true, there needs to be 1 more tick than there are bars. + this.offsetBars = false; + + // if user has passed in highlightMouseDown option and not set highlightMouseOver, disable highlightMouseOver + if (options.highlightMouseDown && options.highlightMouseOver == null) { + options.highlightMouseOver = false; + } + + this.side = 'right'; + + $.extend(true, this, options); + + // if (this.fill === false) { + // this.shadow = false; + // } + + this.renderer.options = options; + // index of the currenty highlighted point, if any + this._highlightedPoint = null; + // Array of actual data colors used for each data point. + this._dataColors = []; + this._barPoints = []; + this.fillAxis = 'y'; + this._primaryAxis = '_yaxis'; + this._xnudge = 0; + + // set the shape renderer options + var opts = {lineJoin:'miter', lineCap:'butt', fill:this.fill, fillRect:this.fill, isarc:false, strokeStyle:this.color, fillStyle:this.color, closePath:this.fill, lineWidth: this.lineWidth}; + this.renderer.shapeRenderer.init(opts); + // set the shadow renderer options + var shadow_offset = options.shadowOffset; + // set the shadow renderer options + if (shadow_offset == null) { + // scale the shadowOffset to the width of the line. + if (this.lineWidth > 2.5) { + shadow_offset = 1.25 * (1 + (Math.atan((this.lineWidth/2.5))/0.785398163 - 1)*0.6); + // var shadow_offset = this.shadowOffset; + } + // for skinny lines, don't make such a big shadow. + else { + shadow_offset = 1.25 * Math.atan((this.lineWidth/2.5))/0.785398163; + } + } + var sopts = {lineJoin:'miter', lineCap:'butt', fill:this.fill, fillRect:this.fill, isarc:false, angle:this.shadowAngle, offset:shadow_offset, alpha:this.shadowAlpha, depth:this.shadowDepth, closePath:this.fill, lineWidth: this.lineWidth}; + this.renderer.shadowRenderer.init(sopts); + + plot.postDrawHooks.addOnce(postPlotDraw); + plot.eventListenerHooks.addOnce('jqplotMouseMove', handleMove); + + // if this is the left side of pyramid, set y values to negative. + if (this.side === 'left') { + for (var i=0, l=this.data.length; i<l; i++) { + this.data[i][1] = -Math.abs(this.data[i][1]); + } + } + }; + + // setGridData + // converts the user data values to grid coordinates and stores them + // in the gridData array. + // Called with scope of a series. + $.jqplot.PyramidRenderer.prototype.setGridData = function(plot) { + // recalculate the grid data + var xp = this._xaxis.series_u2p; + var yp = this._yaxis.series_u2p; + var data = this._plotData; + var pdata = this._prevPlotData; + this.gridData = []; + this._prevGridData = []; + var l = data.length; + var adjust = false; + var i; + + // if any data values are < 0, consider this a negative series + for (i = 0; i < l; i++) { + if (data[i][1] < 0) { + this.side = 'left'; + } + } + + if (this._yaxis.name === 'yMidAxis' && this.side === 'right') { + this._xnudge = this._xaxis.max/2000.0; + adjust = true; + } + + for (i = 0; i < l; i++) { + // if not a line series or if no nulls in data, push the converted point onto the array. + if (data[i][0] != null && data[i][1] != null) { + this.gridData.push([xp(data[i][1]), yp(data[i][0])]); + } + // else if there is a null, preserve it. + else if (data[i][0] == null) { + this.gridData.push([xp(data[i][1]), null]); + } + else if (data[i][1] == null) { + this.gridData.push(null, [yp(data[i][0])]); + } + // finally, adjust x grid data if have to + if (data[i][1] === 0 && adjust) { + this.gridData[i][0] = xp(this._xnudge); + } + } + }; + + // makeGridData + // converts any arbitrary data values to grid coordinates and + // returns them. This method exists so that plugins can use a series' + // linerenderer to generate grid data points without overwriting the + // grid data associated with that series. + // Called with scope of a series. + $.jqplot.PyramidRenderer.prototype.makeGridData = function(data, plot) { + // recalculate the grid data + var xp = this._xaxis.series_u2p; + var yp = this._yaxis.series_u2p; + var gd = []; + var l = data.length; + var adjust = false; + var i; + + // if any data values are < 0, consider this a negative series + for (i = 0; i < l; i++) { + if (data[i][1] < 0) { + this.side = 'left'; + } + } + + if (this._yaxis.name === 'yMidAxis' && this.side === 'right') { + this._xnudge = this._xaxis.max/2000.0; + adjust = true; + } + + for (i = 0; i < l; i++) { + // if not a line series or if no nulls in data, push the converted point onto the array. + if (data[i][0] != null && data[i][1] != null) { + gd.push([xp(data[i][1]), yp(data[i][0])]); + } + // else if there is a null, preserve it. + else if (data[i][0] == null) { + gd.push([xp(data[i][1]), null]); + } + else if (data[i][1] == null) { + gd.push([null, yp(data[i][0])]); + } + // finally, adjust x grid data if have to + if (data[i][1] === 0 && adjust) { + gd[i][0] = xp(this._xnudge); + } + } + + return gd; + }; + + $.jqplot.PyramidRenderer.prototype.setBarWidth = function() { + // need to know how many data values we have on the approprate axis and figure it out. + var i; + var nvals = 0; + var nseries = 0; + var paxis = this[this._primaryAxis]; + var s, series, pos; + nvals = paxis.max - paxis.min; + var nticks = paxis.numberTicks; + var nbins = (nticks-1)/2; + // so, now we have total number of axis values. + var temp = (this.barPadding === 0) ? 1.0 : 0; + if (paxis.name == 'xaxis' || paxis.name == 'x2axis') { + this.barWidth = (paxis._offsets.max - paxis._offsets.min) / nvals - this.barPadding + temp; + } + else { + if (this.fill) { + this.barWidth = (paxis._offsets.min - paxis._offsets.max) / nvals - this.barPadding + temp; + } + else { + this.barWidth = (paxis._offsets.min - paxis._offsets.max) / nvals; + } + } + }; + + $.jqplot.PyramidRenderer.prototype.draw = function(ctx, gridData, options) { + var i; + // Ughhh, have to make a copy of options b/c it may be modified later. + var opts = $.extend({}, options); + var shadow = (opts.shadow != undefined) ? opts.shadow : this.shadow; + var showLine = (opts.showLine != undefined) ? opts.showLine : this.showLine; + var fill = (opts.fill != undefined) ? opts.fill : this.fill; + var xp = this._xaxis.series_u2p; + var yp = this._yaxis.series_u2p; + var pointx, pointy; + // clear out data colors. + this._dataColors = []; + this._barPoints = []; + + if (this.renderer.options.barWidth == null) { + this.renderer.setBarWidth.call(this); + } + + // var temp = this._plotSeriesInfo = this.renderer.calcSeriesNumbers.call(this); + // var nvals = temp[0]; + // var nseries = temp[1]; + // var pos = temp[2]; + var points = [], + w, + h; + + // this._barNudge = 0; + + if (showLine) { + var negativeColors = new $.jqplot.ColorGenerator(this.negativeSeriesColors); + var positiveColors = new $.jqplot.ColorGenerator(this.seriesColors); + var negativeColor = negativeColors.get(this.index); + if (! this.useNegativeColors) { + negativeColor = opts.fillStyle; + } + var positiveColor = opts.fillStyle; + var base; + var xstart = this._xaxis.series_u2p(this._xnudge); + var ystart = this._yaxis.series_u2p(this._yaxis.min); + var yend = this._yaxis.series_u2p(this._yaxis.max); + var bw = this.barWidth; + var bw2 = bw/2.0; + var points = []; + var yadj = this.offsetBars ? bw2 : 0; + + for (var i=0, l=gridData.length; i<l; i++) { + if (this.data[i][0] == null) { + continue; + } + base = gridData[i][1]; + // not stacked and first series in stack + + if (this._plotData[i][1] < 0) { + if (this.varyBarColor && !this._stack) { + if (this.useNegativeColors) { + opts.fillStyle = negativeColors.next(); + } + else { + opts.fillStyle = positiveColors.next(); + } + } + } + else { + if (this.varyBarColor && !this._stack) { + opts.fillStyle = positiveColors.next(); + } + else { + opts.fillStyle = positiveColor; + } + } + + if (this.fill) { + + if (this._plotData[i][1] >= 0) { + // xstart = this._xaxis.series_u2p(this._xnudge); + w = gridData[i][0] - xstart; + h = this.barWidth; + points = [xstart, base - bw2 - yadj, w, h]; + } + else { + // xstart = this._xaxis.series_u2p(0); + w = xstart - gridData[i][0]; + h = this.barWidth; + points = [gridData[i][0], base - bw2 - yadj, w, h]; + } + + this._barPoints.push([[points[0], points[1] + h], [points[0], points[1]], [points[0] + w, points[1]], [points[0] + w, points[1] + h]]); + + if (shadow) { + this.renderer.shadowRenderer.draw(ctx, points); + } + var clr = opts.fillStyle || this.color; + this._dataColors.push(clr); + this.renderer.shapeRenderer.draw(ctx, points, opts); + } + + else { + if (i === 0) { + points =[[xstart, ystart], [gridData[i][0], ystart], [gridData[i][0], gridData[i][1] - bw2 - yadj]]; + } + + else if (i < l-1) { + points = points.concat([[gridData[i-1][0], gridData[i-1][1] - bw2 - yadj], [gridData[i][0], gridData[i][1] + bw2 - yadj], [gridData[i][0], gridData[i][1] - bw2 - yadj]]); + } + + // finally, draw the line + else { + points = points.concat([[gridData[i-1][0], gridData[i-1][1] - bw2 - yadj], [gridData[i][0], gridData[i][1] + bw2 - yadj], [gridData[i][0], yend], [xstart, yend]]); + + if (shadow) { + this.renderer.shadowRenderer.draw(ctx, points); + } + var clr = opts.fillStyle || this.color; + this._dataColors.push(clr); + this.renderer.shapeRenderer.draw(ctx, points, opts); + } + } + } + } + + if (this.highlightColors.length == 0) { + this.highlightColors = $.jqplot.computeHighlightColors(this._dataColors); + } + + else if (typeof(this.highlightColors) == 'string') { + this.highlightColors = []; + for (var i=0; i<this._dataColors.length; i++) { + this.highlightColors.push(this.highlightColors); + } + } + + }; + + + // setup default renderers for axes and legend so user doesn't have to + // called with scope of plot + function preInit(target, data, options) { + options = options || {}; + options.axesDefaults = options.axesDefaults || {}; + options.grid = options.grid || {}; + options.legend = options.legend || {}; + options.seriesDefaults = options.seriesDefaults || {}; + // only set these if there is a pie series + var setopts = false; + if (options.seriesDefaults.renderer === $.jqplot.PyramidRenderer) { + setopts = true; + } + else if (options.series) { + for (var i=0; i < options.series.length; i++) { + if (options.series[i].renderer === $.jqplot.PyramidRenderer) { + setopts = true; + } + } + } + + if (setopts) { + options.axesDefaults.renderer = $.jqplot.PyramidAxisRenderer; + options.grid.renderer = $.jqplot.PyramidGridRenderer; + options.seriesDefaults.pointLabels = {show: false}; + } + } + + // called within context of plot + // create a canvas which we can draw on. + // insert it before the eventCanvas, so eventCanvas will still capture events. + function postPlotDraw() { + // Memory Leaks patch + if (this.plugins.pyramidRenderer && this.plugins.pyramidRenderer.highlightCanvas) { + + this.plugins.pyramidRenderer.highlightCanvas.resetCanvas(); + this.plugins.pyramidRenderer.highlightCanvas = null; + } + + this.plugins.pyramidRenderer = {highlightedSeriesIndex:null}; + this.plugins.pyramidRenderer.highlightCanvas = new $.jqplot.GenericCanvas(); + + this.eventCanvas._elem.before(this.plugins.pyramidRenderer.highlightCanvas.createElement(this._gridPadding, 'jqplot-pyramidRenderer-highlight-canvas', this._plotDimensions, this)); + this.plugins.pyramidRenderer.highlightCanvas.setContext(); + this.eventCanvas._elem.bind('mouseleave', {plot:this}, function (ev) { unhighlight(ev.data.plot); }); + } + + function highlight (plot, sidx, pidx, points) { + var s = plot.series[sidx]; + var canvas = plot.plugins.pyramidRenderer.highlightCanvas; + canvas._ctx.clearRect(0,0,canvas._ctx.canvas.width, canvas._ctx.canvas.height); + s._highlightedPoint = pidx; + plot.plugins.pyramidRenderer.highlightedSeriesIndex = sidx; + var opts = {fillStyle: s.highlightColors[pidx], fillRect: false}; + s.renderer.shapeRenderer.draw(canvas._ctx, points, opts); + canvas = null; + } + + function unhighlight (plot) { + var canvas = plot.plugins.pyramidRenderer.highlightCanvas; + canvas._ctx.clearRect(0,0, canvas._ctx.canvas.width, canvas._ctx.canvas.height); + for (var i=0; i<plot.series.length; i++) { + plot.series[i]._highlightedPoint = null; + } + plot.plugins.pyramidRenderer.highlightedSeriesIndex = null; + plot.target.trigger('jqplotDataUnhighlight'); + canvas = null; + } + + + function handleMove(ev, gridpos, datapos, neighbor, plot) { + if (neighbor) { + var ins = [neighbor.seriesIndex, neighbor.pointIndex, neighbor.data]; + var evt1 = jQuery.Event('jqplotDataMouseOver'); + evt1.pageX = ev.pageX; + evt1.pageY = ev.pageY; + plot.target.trigger(evt1, ins); + if (plot.series[ins[0]].highlightMouseOver && !(ins[0] == plot.plugins.pyramidRenderer.highlightedSeriesIndex && ins[1] == plot.series[ins[0]]._highlightedPoint)) { + var evt = jQuery.Event('jqplotDataHighlight'); + evt.pageX = ev.pageX; + evt.pageY = ev.pageY; + plot.target.trigger(evt, ins); + highlight (plot, neighbor.seriesIndex, neighbor.pointIndex, neighbor.points); + } + } + else if (neighbor == null) { + unhighlight (plot); + } + } + + // Have to add hook here, becuase it needs called before series is inited. + $.jqplot.preInitHooks.push(preInit); + + +})(jQuery); \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/plugins/jqplot.pyramidRenderer.min.js b/libreplan-webapp/src/main/webapp/jqplot/plugins/jqplot.pyramidRenderer.min.js new file mode 100644 index 000000000..f9d47bbc8 --- /dev/null +++ b/libreplan-webapp/src/main/webapp/jqplot/plugins/jqplot.pyramidRenderer.min.js @@ -0,0 +1,57 @@ +/** + * jqPlot + * Pure JavaScript plotting plugin using jQuery + * + * Version: 1.0.0b2_r1012 + * + * Copyright (c) 2009-2011 Chris Leonello + * jqPlot is currently available for use in all personal or commercial projects + * under both the MIT (http://www.opensource.org/licenses/mit-license.php) and GPL + * version 2.0 (http://www.gnu.org/licenses/gpl-2.0.html) licenses. This means that you can + * choose the license that best suits your project and use it accordingly. + * + * Although not required, the author would appreciate an email letting him + * know of any substantial use of jqPlot. You can reach the author at: + * chris at jqplot dot com or see http://www.jqplot.com/info.php . + * + * If you are feeling kind and generous, consider supporting the project by + * making a donation at: http://www.jqplot.com/donate.php . + * + * sprintf functions contained in jqplot.sprintf.js by Ash Searle: + * + * version 2007.04.27 + * author Ash Searle + * http://hexmen.com/blog/2007/03/printf-sprintf/ + * http://hexmen.com/js/sprintf.js + * The author (Ash Searle) has placed this code in the public domain: + * "This code is unrestricted: you are free to use it however you like." + * + * included jsDate library by Chris Leonello: + * + * Copyright (c) 2010-2011 Chris Leonello + * + * jsDate is currently available for use in all personal or commercial projects + * under both the MIT and GPL version 2.0 licenses. This means that you can + * choose the license that best suits your project and use it accordingly. + * + * jsDate borrows many concepts and ideas from the Date Instance + * Methods by Ken Snyder along with some parts of Ken's actual code. + * + * Ken's origianl Date Instance Methods and copyright notice: + * + * Ken Snyder (ken d snyder at gmail dot com) + * 2008-09-10 + * version 2.0.2 (http://kendsnyder.com/sandbox/date/) + * Creative Commons Attribution License 3.0 (http://creativecommons.org/licenses/by/3.0/) + * + * jqplotToImage function based on Larry Siden's export-jqplot-to-png.js. + * Larry has generously given permission to adapt his code for inclusion + * into jqPlot. + * + * Larry's original code can be found here: + * + * https://github.com/lsiden/export-jqplot-to-png + * + * + */ +(function(c){if(c.jqplot.PyramidAxisRenderer===undefined){c.ajax({url:c.jqplot.pluginLocation+"jqplot.pyramidAxisRenderer.js",dataType:"script",async:false})}if(c.jqplot.PyramidGridRenderer===undefined){c.ajax({url:c.jqplot.pluginLocation+"jqplot.pyramidGridRenderer.js",dataType:"script",async:false})}c.jqplot.PyramidRenderer=function(){c.jqplot.LineRenderer.call(this)};c.jqplot.PyramidRenderer.prototype=new c.jqplot.LineRenderer();c.jqplot.PyramidRenderer.prototype.constructor=c.jqplot.PyramidRenderer;c.jqplot.PyramidRenderer.prototype.init=function(j,o){j=j||{};this._type="pyramid";this.barPadding=10;this.barWidth=null;this.fill=true;this.highlightMouseOver=true;this.highlightMouseDown=false;this.highlightColors=[];this.offsetBars=false;if(j.highlightMouseDown&&j.highlightMouseOver==null){j.highlightMouseOver=false}this.side="right";c.extend(true,this,j);this.renderer.options=j;this._highlightedPoint=null;this._dataColors=[];this._barPoints=[];this.fillAxis="y";this._primaryAxis="_yaxis";this._xnudge=0;var n={lineJoin:"miter",lineCap:"butt",fill:this.fill,fillRect:this.fill,isarc:false,strokeStyle:this.color,fillStyle:this.color,closePath:this.fill,lineWidth:this.lineWidth};this.renderer.shapeRenderer.init(n);var m=j.shadowOffset;if(m==null){if(this.lineWidth>2.5){m=1.25*(1+(Math.atan((this.lineWidth/2.5))/0.785398163-1)*0.6)}else{m=1.25*Math.atan((this.lineWidth/2.5))/0.785398163}}var h={lineJoin:"miter",lineCap:"butt",fill:this.fill,fillRect:this.fill,isarc:false,angle:this.shadowAngle,offset:m,alpha:this.shadowAlpha,depth:this.shadowDepth,closePath:this.fill,lineWidth:this.lineWidth};this.renderer.shadowRenderer.init(h);o.postDrawHooks.addOnce(f);o.eventListenerHooks.addOnce("jqplotMouseMove",e);if(this.side==="left"){for(var k=0,g=this.data.length;k<g;k++){this.data[k][1]=-Math.abs(this.data[k][1])}}};c.jqplot.PyramidRenderer.prototype.setGridData=function(p){var j=this._xaxis.series_u2p;var o=this._yaxis.series_u2p;var k=this._plotData;var n=this._prevPlotData;this.gridData=[];this._prevGridData=[];var g=k.length;var m=false;var h;for(h=0;h<g;h++){if(k[h][1]<0){this.side="left"}}if(this._yaxis.name==="yMidAxis"&&this.side==="right"){this._xnudge=this._xaxis.max/2000;m=true}for(h=0;h<g;h++){if(k[h][0]!=null&&k[h][1]!=null){this.gridData.push([j(k[h][1]),o(k[h][0])])}else{if(k[h][0]==null){this.gridData.push([j(k[h][1]),null])}else{if(k[h][1]==null){this.gridData.push(null,[o(k[h][0])])}}}if(k[h][1]===0&&m){this.gridData[h][0]=j(this._xnudge)}}};c.jqplot.PyramidRenderer.prototype.makeGridData=function(m,p){var k=this._xaxis.series_u2p;var o=this._yaxis.series_u2p;var j=[];var g=m.length;var n=false;var h;for(h=0;h<g;h++){if(m[h][1]<0){this.side="left"}}if(this._yaxis.name==="yMidAxis"&&this.side==="right"){this._xnudge=this._xaxis.max/2000;n=true}for(h=0;h<g;h++){if(m[h][0]!=null&&m[h][1]!=null){j.push([k(m[h][1]),o(m[h][0])])}else{if(m[h][0]==null){j.push([k(m[h][1]),null])}else{if(m[h][1]==null){j.push([null,o(m[h][0])])}}}if(m[h][1]===0&&n){j[h][0]=k(this._xnudge)}}return j};c.jqplot.PyramidRenderer.prototype.setBarWidth=function(){var k;var g=0;var h=0;var m=this[this._primaryAxis];var q,l,o;g=m.max-m.min;var n=m.numberTicks;var j=(n-1)/2;var p=(this.barPadding===0)?1:0;if(m.name=="xaxis"||m.name=="x2axis"){this.barWidth=(m._offsets.max-m._offsets.min)/g-this.barPadding+p}else{if(this.fill){this.barWidth=(m._offsets.min-m._offsets.max)/g-this.barPadding+p}else{this.barWidth=(m._offsets.min-m._offsets.max)/g}}};c.jqplot.PyramidRenderer.prototype.draw=function(B,I,k){var E;var u=c.extend({},k);var p=(u.shadow!=undefined)?u.shadow:this.shadow;var K=(u.showLine!=undefined)?u.showLine:this.showLine;var C=(u.fill!=undefined)?u.fill:this.fill;var t=this._xaxis.series_u2p;var G=this._yaxis.series_u2p;var z,x;this._dataColors=[];this._barPoints=[];if(this.renderer.options.barWidth==null){this.renderer.setBarWidth.call(this)}var D=[],s,F;if(K){var q=new c.jqplot.ColorGenerator(this.negativeSeriesColors);var v=new c.jqplot.ColorGenerator(this.seriesColors);var J=q.get(this.index);if(!this.useNegativeColors){J=u.fillStyle}var o=u.fillStyle;var n;var L=this._xaxis.series_u2p(this._xnudge);var j=this._yaxis.series_u2p(this._yaxis.min);var m=this._yaxis.series_u2p(this._yaxis.max);var H=this.barWidth;var y=H/2;var D=[];var r=this.offsetBars?y:0;for(var E=0,A=I.length;E<A;E++){if(this.data[E][0]==null){continue}n=I[E][1];if(this._plotData[E][1]<0){if(this.varyBarColor&&!this._stack){if(this.useNegativeColors){u.fillStyle=q.next()}else{u.fillStyle=v.next()}}}else{if(this.varyBarColor&&!this._stack){u.fillStyle=v.next()}else{u.fillStyle=o}}if(this.fill){if(this._plotData[E][1]>=0){s=I[E][0]-L;F=this.barWidth;D=[L,n-y-r,s,F]}else{s=L-I[E][0];F=this.barWidth;D=[I[E][0],n-y-r,s,F]}this._barPoints.push([[D[0],D[1]+F],[D[0],D[1]],[D[0]+s,D[1]],[D[0]+s,D[1]+F]]);if(p){this.renderer.shadowRenderer.draw(B,D)}var g=u.fillStyle||this.color;this._dataColors.push(g);this.renderer.shapeRenderer.draw(B,D,u)}else{if(E===0){D=[[L,j],[I[E][0],j],[I[E][0],I[E][1]-y-r]]}else{if(E<A-1){D=D.concat([[I[E-1][0],I[E-1][1]-y-r],[I[E][0],I[E][1]+y-r],[I[E][0],I[E][1]-y-r]])}else{D=D.concat([[I[E-1][0],I[E-1][1]-y-r],[I[E][0],I[E][1]+y-r],[I[E][0],m],[L,m]]);if(p){this.renderer.shadowRenderer.draw(B,D)}var g=u.fillStyle||this.color;this._dataColors.push(g);this.renderer.shapeRenderer.draw(B,D,u)}}}}}if(this.highlightColors.length==0){this.highlightColors=c.jqplot.computeHighlightColors(this._dataColors)}else{if(typeof(this.highlightColors)=="string"){this.highlightColors=[];for(var E=0;E<this._dataColors.length;E++){this.highlightColors.push(this.highlightColors)}}}};function b(l,k,h){h=h||{};h.axesDefaults=h.axesDefaults||{};h.grid=h.grid||{};h.legend=h.legend||{};h.seriesDefaults=h.seriesDefaults||{};var g=false;if(h.seriesDefaults.renderer===c.jqplot.PyramidRenderer){g=true}else{if(h.series){for(var j=0;j<h.series.length;j++){if(h.series[j].renderer===c.jqplot.PyramidRenderer){g=true}}}}if(g){h.axesDefaults.renderer=c.jqplot.PyramidAxisRenderer;h.grid.renderer=c.jqplot.PyramidGridRenderer;h.seriesDefaults.pointLabels={show:false}}}function f(){if(this.plugins.pyramidRenderer&&this.plugins.pyramidRenderer.highlightCanvas){this.plugins.pyramidRenderer.highlightCanvas.resetCanvas();this.plugins.pyramidRenderer.highlightCanvas=null}this.plugins.pyramidRenderer={highlightedSeriesIndex:null};this.plugins.pyramidRenderer.highlightCanvas=new c.jqplot.GenericCanvas();this.eventCanvas._elem.before(this.plugins.pyramidRenderer.highlightCanvas.createElement(this._gridPadding,"jqplot-pyramidRenderer-highlight-canvas",this._plotDimensions,this));this.plugins.pyramidRenderer.highlightCanvas.setContext();this.eventCanvas._elem.bind("mouseleave",{plot:this},function(g){d(g.data.plot)})}function a(m,l,j,i){var h=m.series[l];var g=m.plugins.pyramidRenderer.highlightCanvas;g._ctx.clearRect(0,0,g._ctx.canvas.width,g._ctx.canvas.height);h._highlightedPoint=j;m.plugins.pyramidRenderer.highlightedSeriesIndex=l;var k={fillStyle:h.highlightColors[j],fillRect:false};h.renderer.shapeRenderer.draw(g._ctx,i,k);g=null}function d(j){var g=j.plugins.pyramidRenderer.highlightCanvas;g._ctx.clearRect(0,0,g._ctx.canvas.width,g._ctx.canvas.height);for(var h=0;h<j.series.length;h++){j.series[h]._highlightedPoint=null}j.plugins.pyramidRenderer.highlightedSeriesIndex=null;j.target.trigger("jqplotDataUnhighlight");g=null}function e(k,j,n,m,l){if(m){var i=[m.seriesIndex,m.pointIndex,m.data];var h=jQuery.Event("jqplotDataMouseOver");h.pageX=k.pageX;h.pageY=k.pageY;l.target.trigger(h,i);if(l.series[i[0]].highlightMouseOver&&!(i[0]==l.plugins.pyramidRenderer.highlightedSeriesIndex&&i[1]==l.series[i[0]]._highlightedPoint)){var g=jQuery.Event("jqplotDataHighlight");g.pageX=k.pageX;g.pageY=k.pageY;l.target.trigger(g,i);a(l,m.seriesIndex,m.pointIndex,m.points)}}else{if(m==null){d(l)}}}c.jqplot.preInitHooks.push(b)})(jQuery); \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/plugins/jqplot.trendline.js b/libreplan-webapp/src/main/webapp/jqplot/plugins/jqplot.trendline.js new file mode 100644 index 000000000..bc5888068 --- /dev/null +++ b/libreplan-webapp/src/main/webapp/jqplot/plugins/jqplot.trendline.js @@ -0,0 +1,222 @@ +/** + * jqPlot + * Pure JavaScript plotting plugin using jQuery + * + * Version: 1.0.0b2_r1012 + * + * Copyright (c) 2009-2011 Chris Leonello + * jqPlot is currently available for use in all personal or commercial projects + * under both the MIT (http://www.opensource.org/licenses/mit-license.php) and GPL + * version 2.0 (http://www.gnu.org/licenses/gpl-2.0.html) licenses. This means that you can + * choose the license that best suits your project and use it accordingly. + * + * Although not required, the author would appreciate an email letting him + * know of any substantial use of jqPlot. You can reach the author at: + * chris at jqplot dot com or see http://www.jqplot.com/info.php . + * + * If you are feeling kind and generous, consider supporting the project by + * making a donation at: http://www.jqplot.com/donate.php . + * + * sprintf functions contained in jqplot.sprintf.js by Ash Searle: + * + * version 2007.04.27 + * author Ash Searle + * http://hexmen.com/blog/2007/03/printf-sprintf/ + * http://hexmen.com/js/sprintf.js + * The author (Ash Searle) has placed this code in the public domain: + * "This code is unrestricted: you are free to use it however you like." + * + */ +(function($) { + + /** + * Class: $.jqplot.Trendline + * Plugin which will automatically compute and draw trendlines for plotted data. + */ + $.jqplot.Trendline = function() { + // Group: Properties + + // prop: show + // Wether or not to show the trend line. + this.show = $.jqplot.config.enablePlugins; + // prop: color + // CSS color spec for the trend line. + // By default this wil be the same color as the primary line. + this.color = '#666666'; + // prop: renderer + // Renderer to use to draw the trend line. + // The data series that is plotted may not be rendered as a line. + // Therefore, we use our own line renderer here to draw a trend line. + this.renderer = new $.jqplot.LineRenderer(); + // prop: rendererOptions + // Options to pass to the line renderer. + // By default, markers are not shown on trend lines. + this.rendererOptions = {marker:{show:false}}; + // prop: label + // Label for the trend line to use in the legend. + this.label = ''; + // prop: type + // Either 'exponential', 'exp', or 'linear'. + this.type = 'linear'; + // prop: shadow + // true or false, wether or not to show the shadow. + this.shadow = true; + // prop: markerRenderer + // Renderer to use to draw markers on the line. + // I think this is wrong. + this.markerRenderer = {show:false}; + // prop: lineWidth + // Width of the trend line. + this.lineWidth = 1.5; + // prop: shadowAngle + // Angle of the shadow on the trend line. + this.shadowAngle = 45; + // prop: shadowOffset + // pixel offset for each stroke of the shadow. + this.shadowOffset = 1.0; + // prop: shadowAlpha + // Alpha transparency of the shadow. + this.shadowAlpha = 0.07; + // prop: shadowDepth + // number of strokes to make of the shadow. + this.shadowDepth = 3; + this.isTrendline = true; + + }; + + $.jqplot.postSeriesInitHooks.push(parseTrendLineOptions); + $.jqplot.postDrawSeriesHooks.push(drawTrendline); + $.jqplot.addLegendRowHooks.push(addTrendlineLegend); + + // called witin scope of the legend object + // current series passed in + // must return null or an object {label:label, color:color} + function addTrendlineLegend(series) { + var ret = null; + if (series.trendline && series.trendline.show) { + var lt = series.trendline.label.toString(); + if (lt) { + ret = {label:lt, color:series.trendline.color}; + } + } + return ret; + } + + // called within scope of a series + function parseTrendLineOptions (target, data, seriesDefaults, options, plot) { + if (this._type && (this._type === 'line' || this._type == 'bar')) { + this.trendline = new $.jqplot.Trendline(); + options = options || {}; + $.extend(true, this.trendline, {color:this.color}, seriesDefaults.trendline, options.trendline); + this.trendline.renderer.init.call(this.trendline, null); + } + } + + // called within scope of series object + function drawTrendline(sctx, options) { + // if we have options, merge trendline options in with precedence + options = $.extend(true, {}, this.trendline, options); + + if (this.trendline && options.show) { + var fit; + // this.renderer.setGridData.call(this); + var data = options.data || this.data; + fit = fitData(data, this.trendline.type); + var gridData = options.gridData || this.renderer.makeGridData.call(this, fit.data); + this.trendline.renderer.draw.call(this.trendline, sctx, gridData, {showLine:true, shadow:this.trendline.shadow}); + } + } + + function regression(x, y, typ) { + var type = (typ == null) ? 'linear' : typ; + var N = x.length; + var slope; + var intercept; + var SX = 0; + var SY = 0; + var SXX = 0; + var SXY = 0; + var SYY = 0; + var Y = []; + var X = []; + + if (type == 'linear') { + X = x; + Y = y; + } + else if (type == 'exp' || type == 'exponential') { + for ( var i=0; i<y.length; i++) { + // ignore points <= 0, log undefined. + if (y[i] <= 0) { + N--; + } + else { + X.push(x[i]); + Y.push(Math.log(y[i])); + } + } + } + + for ( var i = 0; i < N; i++) { + SX = SX + X[i]; + SY = SY + Y[i]; + SXY = SXY + X[i]* Y[i]; + SXX = SXX + X[i]* X[i]; + SYY = SYY + Y[i]* Y[i]; + } + + slope = (N*SXY - SX*SY)/(N*SXX - SX*SX); + intercept = (SY - slope*SX)/N; + + return [slope, intercept]; + } + + function linearRegression(X,Y) { + var ret; + ret = regression(X,Y,'linear'); + return [ret[0],ret[1]]; + } + + function expRegression(X,Y) { + var ret; + var x = X; + var y = Y; + ret = regression(x, y,'exp'); + var base = Math.exp(ret[0]); + var coeff = Math.exp(ret[1]); + return [base, coeff]; + } + + function fitData(data, typ) { + var type = (typ == null) ? 'linear' : typ; + var ret; + var res; + var x = []; + var y = []; + var ypred = []; + + for (i=0; i<data.length; i++){ + if (data[i] != null && data[i][0] != null && data[i][1] != null) { + x.push(data[i][0]); + y.push(data[i][1]); + } + } + + if (type == 'linear') { + ret = linearRegression(x,y); + for ( var i=0; i<x.length; i++){ + res = ret[0]*x[i] + ret[1]; + ypred.push([x[i], res]); + } + } + else if (type == 'exp' || type == 'exponential') { + ret = expRegression(x,y); + for ( var i=0; i<x.length; i++){ + res = ret[1]*Math.pow(ret[0],x[i]); + ypred.push([x[i], res]); + } + } + return {data: ypred, slope: ret[0], intercept: ret[1]}; + } + +})(jQuery); \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/plugins/jqplot.trendline.min.js b/libreplan-webapp/src/main/webapp/jqplot/plugins/jqplot.trendline.min.js new file mode 100644 index 000000000..ebdad67c6 --- /dev/null +++ b/libreplan-webapp/src/main/webapp/jqplot/plugins/jqplot.trendline.min.js @@ -0,0 +1,57 @@ +/** + * jqPlot + * Pure JavaScript plotting plugin using jQuery + * + * Version: 1.0.0b2_r1012 + * + * Copyright (c) 2009-2011 Chris Leonello + * jqPlot is currently available for use in all personal or commercial projects + * under both the MIT (http://www.opensource.org/licenses/mit-license.php) and GPL + * version 2.0 (http://www.gnu.org/licenses/gpl-2.0.html) licenses. This means that you can + * choose the license that best suits your project and use it accordingly. + * + * Although not required, the author would appreciate an email letting him + * know of any substantial use of jqPlot. You can reach the author at: + * chris at jqplot dot com or see http://www.jqplot.com/info.php . + * + * If you are feeling kind and generous, consider supporting the project by + * making a donation at: http://www.jqplot.com/donate.php . + * + * sprintf functions contained in jqplot.sprintf.js by Ash Searle: + * + * version 2007.04.27 + * author Ash Searle + * http://hexmen.com/blog/2007/03/printf-sprintf/ + * http://hexmen.com/js/sprintf.js + * The author (Ash Searle) has placed this code in the public domain: + * "This code is unrestricted: you are free to use it however you like." + * + * included jsDate library by Chris Leonello: + * + * Copyright (c) 2010-2011 Chris Leonello + * + * jsDate is currently available for use in all personal or commercial projects + * under both the MIT and GPL version 2.0 licenses. This means that you can + * choose the license that best suits your project and use it accordingly. + * + * jsDate borrows many concepts and ideas from the Date Instance + * Methods by Ken Snyder along with some parts of Ken's actual code. + * + * Ken's origianl Date Instance Methods and copyright notice: + * + * Ken Snyder (ken d snyder at gmail dot com) + * 2008-09-10 + * version 2.0.2 (http://kendsnyder.com/sandbox/date/) + * Creative Commons Attribution License 3.0 (http://creativecommons.org/licenses/by/3.0/) + * + * jqplotToImage function based on Larry Siden's export-jqplot-to-png.js. + * Larry has generously given permission to adapt his code for inclusion + * into jqPlot. + * + * Larry's original code can be found here: + * + * https://github.com/lsiden/export-jqplot-to-png + * + * + */ +(function(f){f.jqplot.Trendline=function(){this.show=f.jqplot.config.enablePlugins;this.color="#666666";this.renderer=new f.jqplot.LineRenderer();this.rendererOptions={marker:{show:false}};this.label="";this.type="linear";this.shadow=true;this.markerRenderer={show:false};this.lineWidth=1.5;this.shadowAngle=45;this.shadowOffset=1;this.shadowAlpha=0.07;this.shadowDepth=3;this.isTrendline=true};f.jqplot.postSeriesInitHooks.push(e);f.jqplot.postDrawSeriesHooks.push(g);f.jqplot.addLegendRowHooks.push(a);function a(k){var j=null;if(k.trendline&&k.trendline.show){var i=k.trendline.label.toString();if(i){j={label:i,color:k.trendline.color}}}return j}function e(m,k,j,i,l){if(this._type&&(this._type==="line"||this._type=="bar")){this.trendline=new f.jqplot.Trendline();i=i||{};f.extend(true,this.trendline,{color:this.color},j.trendline,i.trendline);this.trendline.renderer.init.call(this.trendline,null)}}function g(m,i){i=f.extend(true,{},this.trendline,i);if(this.trendline&&i.show){var k;var l=i.data||this.data;k=c(l,this.trendline.type);var j=i.gridData||this.renderer.makeGridData.call(this,k.data);this.trendline.renderer.draw.call(this.trendline,m,j,{showLine:true,shadow:this.trendline.shadow})}}function b(w,v,n){var u=(n==null)?"linear":n;var s=w.length;var t;var z;var o=0;var m=0;var r=0;var q=0;var l=0;var j=[];var k=[];if(u=="linear"){k=w;j=v}else{if(u=="exp"||u=="exponential"){for(var p=0;p<v.length;p++){if(v[p]<=0){s--}else{k.push(w[p]);j.push(Math.log(v[p]))}}}}for(var p=0;p<s;p++){o=o+k[p];m=m+j[p];q=q+k[p]*j[p];r=r+k[p]*k[p];l=l+j[p]*j[p]}t=(s*q-o*m)/(s*r-o*o);z=(m-t*o)/s;return[t,z]}function h(k,j){var i;i=b(k,j,"linear");return[i[0],i[1]]}function d(o,m){var k;var i=o;var n=m;k=b(i,n,"exp");var l=Math.exp(k[0]);var j=Math.exp(k[1]);return[l,j]}function c(l,j){var p=(j==null)?"linear":j;var n;var o;var r=[];var q=[];var m=[];for(k=0;k<l.length;k++){if(l[k]!=null&&l[k][0]!=null&&l[k][1]!=null){r.push(l[k][0]);q.push(l[k][1])}}if(p=="linear"){n=h(r,q);for(var k=0;k<r.length;k++){o=n[0]*r[k]+n[1];m.push([r[k],o])}}else{if(p=="exp"||p=="exponential"){n=d(r,q);for(var k=0;k<r.length;k++){o=n[1]*Math.pow(n[0],r[k]);m.push([r[k],o])}}}return{data:m,slope:n[0],intercept:n[1]}}})(jQuery); \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/usage.txt b/libreplan-webapp/src/main/webapp/jqplot/usage.txt new file mode 100644 index 000000000..01f82d277 --- /dev/null +++ b/libreplan-webapp/src/main/webapp/jqplot/usage.txt @@ -0,0 +1,126 @@ +Title: jqPlot Usage + +Usage Documentation: + +Introduction: + +jqPlot is a jQuery plugin to generate pure client-side javascript charts in your web pages. + +The jqPlot home page is at <http://www.jqplot.com/>. + +The project page and downloads are at <http://www.bitbucket.org/cleonello/jqplot/>. + +Below are a few examples to demonstrate jqPlot usage. These plots are shown as static images. +Many more examples of dynamically rendered plots can be seen on the test and examples pages here: <../../tests/>. + +Include the Files: + +jqPlot requires jQuery (1.4+ required for certain features). jQuery is included in the distribution. +To use jqPlot include jquery, the jqPlot jQuery plugin, jqPlot css file and optionally the excanvas +script for IE support in your web page. Note, excanvas is required only for IE versions below 9. IE 9 includes +native support for the canvas element and does not require excanvas: + +> <!--[if lt IE 9]><script language="javascript" type="text/javascript" src="excanvas.js"></script><![endif]--> +> <script language="javascript" type="text/javascript" src="jquery.min.js"></script> +> <script language="javascript" type="text/javascript" src="jquery.jqplot.min.js"></script> +> <link rel="stylesheet" type="text/css" href="jquery.jqplot.css" /> + +Add a plot container: + +Add a container (target) to your web page where you want your plot to show up. +Be sure to give your target a width and a height: + +> <div id="chartdiv" style="height:400px;width:300px; "></div> + +Create a plot: + +Then, create the actual plot by calling the +$.jqplot plugin with the id of your target and some data: + +> $.jqplot('chartdiv', [[[1, 2],[3,5.12],[5,13.1],[7,33.6],[9,85.9],[11,219.9]]]); + +Which will produce a +chart like: + +(see images/basicline.png) + +Plot Options: + +You can customize the plot by passing options to the $.jqplot function. Options are described in +<jqPlot Options> in the jqPlotOptions.txt file. An example of options usage: + +> $.jqplot('chartdiv', [[[1, 2],[3,5.12],[5,13.1],[7,33.6],[9,85.9],[11,219.9]]], +> { title:'Exponential Line', +> axes:{yaxis:{min:-10, max:240}}, +> series:[{color:'#5FAB78'}] +> }); + +Which will produce +a plot like: + +(see images/basicoptions.png) + +Using Plugins: + +You can use jqPlot plugins (that is, plugins to the jqPlot plugin) by including them in your html +after you include the jqPlot plugin. Here is how to include the log axis plugin: + +> <link rel="stylesheet" type="text/css" href="jquery.jqplot.css" /> +> <!--[if IE]><script language="javascript" type="text/javascript" src="excanvas.js"></script><![endif]--> +> <script language="javascript" type="text/javascript" src="jquery.min.js"></script> +> <script language="javascript" type="text/javascript" src="jquery.jqplot.min.js"></script> +> <script language="javascript" type="text/javascript" src="jqplot.logAxisRenderer.js"></script> + +Important note: For jqplot builds r529 and above (0.9.7r529 and higher), you must explicitly +enable plugins via either the { show: true } plugin option to the plot or by using +the $.jqplot.config.enablePlugins = true; config options set on the page before plot creation. +Only plugins that can be immediately active upon loading are affected. This includes +non-renderer plugins like cursor, dragable, highlighter, and trendline. + +Here is a the same $.jqplot call +but with a log y axis: + +> $.jqplot('chartdiv', [[[1, 2],[3,5.12],[5,13.1],[7,33.6],[9,85.9],[11,219.9]]], +> { title:'Exponential Line', +> axes:{yaxis:{renderer: $.jqplot.LogAxisRenderer}}, +> series:[{color:'#5FAB78'}] +> }); + +Which produces +a plot like: + +(see images/basiclogaxis.png) + +You can further customize with options specific +to the log axis plugin: + +> $.jqplot('chartdiv', [[[1, 2],[3,5.12],[5,13.1],[7,33.6],[9,85.9],[11,219.9]]], +> { title:'Exponential Line', +> axes:{yaxis:{renderer: $.jqplot.LogAxisRenderer, tickDistribution:'power'}}, +> series:[{color:'#5FAB78'}] +> }); + +Which makes a +plot like: + +(see images/basiclogoptions.png) + +For a full list of options, see <jqPlot Options> in the jqPlotOptions.txt file. + +You can add as many plugins as you wish. Order is generally not important. +Some plugins, like the highlighter plugin which highlights data points near the +mouse, don't need any extra options or setup to function. Highlighter does have +additional options which the user can set. + +Other plugins, the barRenderer for example, provide functionality the must be specified +in the chart options object. To render a series as a bar graph with the bar renderer, +you would first include the plugin after jqPlot: + +> <script language="javascript" type="text/javascript" src="plugins/jqplot.barRenderer.min.js"></script> + +Then you would create +a chart like: + +> $.jqplot('chartdiv', [[34.53, 56.32, 25.1, 18.6]], {series:[{renderer:$.jqplot.BarRenderer}]}); + +Here the default LineRenderer is replaced by a BarRenderer to generate a bar graph for the first (an only) series. \ No newline at end of file From 4dc7cb48e86b4a9ca5e7705dff0dd46bd666944d Mon Sep 17 00:00:00 2001 From: Diego Pino <dpino@igalia.com> Date: Sat, 21 Apr 2012 18:57:21 +0200 Subject: [PATCH 052/108] Recode 'Global Progress' and 'Task Status' using jqPlot FEA: ItEr76S15OrganizingPerProjectDashboard --- .../web/dashboard/DashboardController.java | 382 ++++++++++-------- .../web/dashboard/DashboardModel.java | 6 +- .../web/dashboard/IDashboardModel.java | 6 +- .../webapp/dashboard/_dashboardfororder.zul | 216 +++++----- 4 files changed, 345 insertions(+), 265 deletions(-) diff --git a/libreplan-webapp/src/main/java/org/libreplan/web/dashboard/DashboardController.java b/libreplan-webapp/src/main/java/org/libreplan/web/dashboard/DashboardController.java index 09a0e45e4..ebaf7c1e5 100644 --- a/libreplan-webapp/src/main/java/org/libreplan/web/dashboard/DashboardController.java +++ b/libreplan-webapp/src/main/java/org/libreplan/web/dashboard/DashboardController.java @@ -21,29 +21,33 @@ package org.libreplan.web.dashboard; import static org.libreplan.web.I18nHelper._; -import java.awt.Color; -import java.awt.Font; import java.math.BigDecimal; -import java.util.Iterator; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.HashMap; +import java.util.LinkedHashMap; import java.util.List; +import java.util.Map; +import java.util.TreeSet; +import org.apache.commons.lang.StringUtils; import org.libreplan.business.orders.entities.Order; import org.libreplan.web.common.Util; import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; +import org.zkoss.zk.ui.util.Clients; import org.zkoss.zk.ui.util.GenericForwardComposer; -import org.zkoss.zul.CategoryModel; -import org.zkoss.zul.Chart; import org.zkoss.zul.Div; -import org.zkoss.zul.PieModel; -import org.zkoss.zul.SimpleCategoryModel; -import org.zkoss.zul.SimplePieModel; import org.zkoss.zul.Window; + /** - * Controller for dashboardfororder view * @author Nacho Barrientos <nacho@igalia.com> + * @author Diego Pino García <dpino@igalia.com> + * + * Controller for dashboardfororder view */ @Component @Scope(BeanDefinition.SCOPE_PROTOTYPE) @@ -53,13 +57,6 @@ public class DashboardController extends GenericForwardComposer { private Window dashboardWindow; - private Chart progressKPIglobalProgressChart; - private Chart progressKPItaskStatusChart; - private Chart progressKPItaskDeadlineViolationStatusChart; - private Chart timeKPImarginWithDeadlineChart; - private Chart timeKPIEstimationAccuracyChart; - private Chart timeKPILagInTaskCompletionChart; - private Div projectDashboardChartsDiv; private Div projectDashboardNoTasksWarningDiv; @@ -70,170 +67,229 @@ public class DashboardController extends GenericForwardComposer { public void doAfterCompose(org.zkoss.zk.ui.Component comp) throws Exception { super.doAfterCompose(comp); this.dashboardWindow = (Window)comp; + self.setAttribute("controller", this); Util.createBindingsFor(this.dashboardWindow); } + + public void setCurrentOrder(Order order) { + dashboardModel.setCurrentOrder(order); + if (dashboardModel.tasksAvailable()) { + showCharts(); + } else { + hideCharts(); + } + if (this.dashboardWindow != null) { + renderGlobalProgress(); + renderTaskStatus(); + } + + } + + private void renderTaskStatus() { + TaskStatus taskStatus = TaskStatus.create(); + taskStatus.data(_("Finished"), + dashboardModel.getPercentageOfFinishedTasks()); + taskStatus.data(_("In progress"), + dashboardModel.getPercentageOfInProgressTasks()); + taskStatus.data(_("Ready to start"), + dashboardModel.getPercentageOfReadyToStartTasks()); + taskStatus.data(_("Blocked"), + dashboardModel.getPercentageOfBlockedTasks()); + taskStatus.render(); + } - public void setCurrentOrder(Order order) { - dashboardModel.setCurrentOrder(order); - if(dashboardModel.tasksAvailable()) { - this.reloadCharts(); - } else { - this.hideChartsAndShowWarningMessage(); - } - if (this.dashboardWindow != null) { - Util.reloadBindings(this.dashboardWindow); - } - } + private void renderGlobalProgress() { + GlobalProgress globalProgress = GlobalProgress.create(); - private void reloadCharts() { - generateProgressKPIglobalProgressChart(); - generateProgressKPItaskStatusChart(); - generateProgressKPItaskDeadlineViolationStatusChart(); - generateTimeKPImarginWithDeadlineChart(); - generateTimeKPIEstimationAccuracyChart(); - generateTimeKPILagInTaskCompletionChart(); - } - - private void hideChartsAndShowWarningMessage() { + // Current values + globalProgress.current(GlobalProgress.CRITICAL_PATH_DURATION, + dashboardModel.getCriticalPathProgressByDuration()); + globalProgress.current(GlobalProgress.CRITICAL_PATH_HOURS, + dashboardModel.getCriticalPathProgressByNumHours()); + globalProgress.current(GlobalProgress.ALL_TASKS_HOURS, + dashboardModel.getAdvancePercentageByHours()); + // Expected values + globalProgress.expected(GlobalProgress.CRITICAL_PATH_DURATION, + dashboardModel.getExpectedCriticalPathProgressByDuration()); + globalProgress.expected(GlobalProgress.CRITICAL_PATH_HOURS, + dashboardModel.getExpectedCriticalPathProgressByNumHours()); + globalProgress.expected(GlobalProgress.ALL_TASKS_HOURS, + dashboardModel.getExpectedAdvancePercentageByHours()); + + globalProgress.render(); + } + + private void showCharts() { + projectDashboardChartsDiv.setVisible(true); + projectDashboardNoTasksWarningDiv.setVisible(false); + } + + private void hideCharts() { projectDashboardChartsDiv.setVisible(false); projectDashboardNoTasksWarningDiv.setVisible(true); } + + /** + * + * @author Diego Pino García <dpino@igalia.com> + * + */ + static class GlobalProgress { - private void generateTimeKPILagInTaskCompletionChart() { - CategoryModel categoryModel; - categoryModel = refreshTimeKPILagInTaskCompletionCategoryModel(); - Font labelFont = new Font("serif", Font.PLAIN, 10); - timeKPILagInTaskCompletionChart.setXAxisTickFont(labelFont); - Color[] seriesColorMappings = {Color.BLUE}; - timeKPILagInTaskCompletionChart.setAttribute("series-color-mappings", - seriesColorMappings); - timeKPILagInTaskCompletionChart.setModel(categoryModel); - } + public static final String ALL_TASKS_HOURS = _("All tasks (hours)"); - private void generateTimeKPIEstimationAccuracyChart() { - CategoryModel categoryModel; - categoryModel = refreshTimeKPIEstimationAccuracyCategoryModel(); - Font labelFont = new Font("serif", Font.PLAIN, 10); - timeKPIEstimationAccuracyChart.setXAxisTickFont(labelFont); - Color[] seriesColorMappings = {Color.BLUE}; - timeKPIEstimationAccuracyChart.setAttribute("series-color-mappings", - seriesColorMappings); - timeKPIEstimationAccuracyChart.setModel(categoryModel); - } + public static final String CRITICAL_PATH_HOURS = _("Critical path (hours)"); - private void generateTimeKPImarginWithDeadlineChart() { - CategoryModel categoryModel; - categoryModel = refreshTimeKPImarginWithDeadlineCategoryModel(); - if (categoryModel == null) { // Project has no deadline set. - timeKPImarginWithDeadlineChart.setVisible(false); - return; - } - timeKPImarginWithDeadlineChart.setAttribute("range-axis-lower-bound", - new Double(-3.0)); - timeKPImarginWithDeadlineChart.setAttribute("range-axis-upper-bound", - new Double(3.0)); - Color[] seriesColorMappings = new Color[1]; - if(dashboardModel.getMarginWithDeadLine().compareTo(BigDecimal.ZERO) >= 0) { - seriesColorMappings[0] = Color.GREEN; - } else { - seriesColorMappings[0] = Color.RED; - } - timeKPImarginWithDeadlineChart.setAttribute("series-color-mappings", - seriesColorMappings); - timeKPImarginWithDeadlineChart.setModel(categoryModel); - } + public static final String CRITICAL_PATH_DURATION = _("Critical path (duration)"); - private void generateProgressKPItaskStatusChart() { - PieModel model = refreshProgressKPItaskStatusPieModel(); - progressKPItaskStatusChart.setModel(model); - } + private Map<String, BigDecimal> current = new LinkedHashMap<String, BigDecimal>(); - private void generateProgressKPItaskDeadlineViolationStatusChart() { - PieModel model = refreshProgressKPItaskDeadlieViolationStatusPieModel(); - progressKPItaskDeadlineViolationStatusChart.setModel(model); - } + private Map<String, BigDecimal> expected = new LinkedHashMap<String, BigDecimal>(); - private void generateProgressKPIglobalProgressChart() { - CategoryModel categoryModel; - categoryModel = refreshProgressKPIglobalProgressCategoryModel(); - progressKPIglobalProgressChart.setAttribute("range-axis-lower-bound", - new Double(0.0)); - progressKPIglobalProgressChart.setAttribute("range-axis-upper-bound", - new Double(100.0)); - progressKPIglobalProgressChart.setModel(categoryModel); - } + private static List<Series> series = new ArrayList<Series>() { + { + add(Series.create(_("Current"), "blue")); + add(Series.create(_("Expected"), "red")); + } + }; - private PieModel refreshProgressKPItaskStatusPieModel() { - PieModel model = new SimplePieModel(); - model.setValue(_("Finished"), dashboardModel.getPercentageOfFinishedTasks()); - model.setValue(_("In progress"), dashboardModel.getPercentageOfInProgressTasks()); - model.setValue(_("Ready to start"), dashboardModel.getPercentageOfReadyToStartTasks()); - model.setValue(_("Blocked"), dashboardModel.getPercentageOfBlockedTasks()); - return model; - } + private GlobalProgress() { - private PieModel refreshProgressKPItaskDeadlieViolationStatusPieModel() { - PieModel model = new SimplePieModel(); - model.setValue(_("On schedule"), dashboardModel.getPercentageOfOnScheduleTasks()); - model.setValue(_("Violated deadline"), dashboardModel.getPercentageOfTasksWithViolatedDeadline()); - model.setValue(_("No deadline"), dashboardModel.getPercentageOfTasksWithNoDeadline()); - return model; - } + } - private CategoryModel refreshProgressKPIglobalProgressCategoryModel() { - CategoryModel result = new SimpleCategoryModel(); - result.setValue(_("Current"), _("All tasks (hours)"), - dashboardModel.getAdvancePercentageByHours()); - result.setValue(_("Expected"), _("All tasks (hours)"), - dashboardModel.getTheoreticalAdvancePercentageByHoursUntilNow()); - result.setValue(_("Current"), _("Critical path (hours)"), - dashboardModel.getCriticalPathProgressByNumHours()); - result.setValue(_("Expected"), _("Critical path (hours)"), dashboardModel - .getTheoreticalProgressByNumHoursForCriticalPathUntilNow()); - result.setValue(_("Current"), _("Critical path (duration)"), - dashboardModel.getCriticalPathProgressByDuration()); - result.setValue(_("Expected"), _("Critical path (duration)"), - dashboardModel.getTheoreticalProgressByDurationForCriticalPathUntilNow()); - return result; - } + public void current(String key, BigDecimal value) { + current.put(key, value); + } - private CategoryModel refreshTimeKPImarginWithDeadlineCategoryModel() { - CategoryModel result = null; - BigDecimal marginWithDeadLine = dashboardModel.getMarginWithDeadLine(); - if (marginWithDeadLine != null) { - result = new SimpleCategoryModel(); - result.setValue(_("None"), _("Deviation"), marginWithDeadLine); - } - return result; - } + public void expected(String key, BigDecimal value) { + expected.put(key, value); + } - private CategoryModel refreshTimeKPIEstimationAccuracyCategoryModel() { - CategoryModel result = new SimpleCategoryModel(); - List<Double> values = dashboardModel.getFinishedTasksEstimationAccuracyHistogram(); - Iterator<Double> it = values.iterator(); - for(int ii= DashboardModel.EA_STRETCHES_MIN_VALUE; - ii < DashboardModel.EA_STRETCHES_MAX_VALUE; - ii += DashboardModel.EA_STRETCHES_PERCENTAGE_STEP) { - result.setValue(_("None"), _(String.valueOf(ii)), it.next()); - } - result.setValue(_("None"), - _(">"+DashboardModel.EA_STRETCHES_MAX_VALUE), - it.next()); - return result; - } + public static GlobalProgress create() { + return new GlobalProgress(); + } - private CategoryModel refreshTimeKPILagInTaskCompletionCategoryModel() { - CategoryModel result = new SimpleCategoryModel(); - List<Double> values = dashboardModel.getLagInTaskCompletionHistogram(); - Iterator<Double> it = values.iterator(); - for(double ii= DashboardModel.LTC_STRETCHES_MIN_VALUE; - ii < DashboardModel.LTC_STRETCHES_MAX_VALUE; - ii += DashboardModel.LTC_STRETCHES_STEP) { - result.setValue(_("None"), _(String.valueOf(ii)), it.next()); - } - result.setValue(_("None"), - _(">"+DashboardModel.LTC_STRETCHES_MAX_VALUE), - it.next()); - return result; + public String getPercentages() { + return String.format("'[%s, %s]'", + jsonifyPercentages(current.values()), + jsonifyPercentages(expected.values())); + } + + private String jsonifyPercentages(Collection<BigDecimal> array) { + List<String> result = new ArrayList<String>(); + + int i = 1; + for (BigDecimal each : array) { + result.add(String.format("[%.2f, %d]", each.doubleValue(), i++)); + } + return String.format("[%s]", StringUtils.join(result, ",")); + } + + private String jsonify(Collection<?> list) { + Collection<String> result = new ArrayList<String>(); + for (Object each : list) { + if (each.getClass() == String.class) { + result.add(String.format("\"%s\"", each.toString())); + } else { + result.add(String.format("%s", each.toString())); + } + } + return String.format("'[%s]'", StringUtils.join(result, ',')); + } + + public String getSeries() { + return jsonify(series); + } + + /** + * The order of the ticks is taken from the keys in current + * + * @return + */ + public String getTicks() { + return jsonify(current.keySet()); + } + + public void render() { + String command = String.format( + "global_progress.render(%s, %s, %s);", getPercentages(), + getTicks(), getSeries()); + Clients.evalJavaScript(command); + } + + } + + /** + * + * @author Diego Pino García <dpino@igalia.com> + * + */ + static class Series { + + private String label; + + private String color; + + private Series() { + + } + + public static Series create(String label) { + Series series = new Series(); + series.label = label; + return series; + } + + public static Series create(String label, String color) { + Series series = new Series(); + series.label = label; + series.color = color; + return series; + } + + public String toString() { + return String.format("{\"label\": \"%s\", \"color\": \"%s\"}", label, color); + } + } -} + + /** + * + * @author Diego Pino García <dpino@igalia.com> + * + */ + static class TaskStatus { + + private Map<String, BigDecimal> data = new LinkedHashMap<String, BigDecimal>(); + + private TaskStatus() { + + } + + public static TaskStatus create() { + return new TaskStatus(); + } + + private String getData() { + List<String> result = new ArrayList<String>(); + + TreeSet<String> keys = new TreeSet<String>(data.keySet()); + for (String key : keys) { + BigDecimal value = data.get(key); + result.add(String.format("[\"%s\", %.2f]", key, value)); + } + return String.format("'[%s]'", StringUtils.join(result, ",")); + } + + public void data(String key, BigDecimal value) { + data.put(key, value); + } + + public void render() { + String command = String.format("task_status.render(%s);", getData()); + Clients.evalJavaScript(command); + } + + } + +} \ No newline at end of file diff --git a/libreplan-webapp/src/main/java/org/libreplan/web/dashboard/DashboardModel.java b/libreplan-webapp/src/main/java/org/libreplan/web/dashboard/DashboardModel.java index 2e53c3f5a..c7bd15ee1 100644 --- a/libreplan-webapp/src/main/java/org/libreplan/web/dashboard/DashboardModel.java +++ b/libreplan-webapp/src/main/java/org/libreplan/web/dashboard/DashboardModel.java @@ -133,7 +133,7 @@ public class DashboardModel implements IDashboardModel { return ratio.multiply(BigDecimal.TEN).multiply(BigDecimal.TEN); } - public BigDecimal getTheoreticalAdvancePercentageByHoursUntilNow(){ + public BigDecimal getExpectedAdvancePercentageByHours(){ TaskGroup rootAsTaskGroup = (TaskGroup)getRootTask(); if (this.getRootTask() == null) { throw new RuntimeException("Root task is null"); @@ -151,7 +151,7 @@ public class DashboardModel implements IDashboardModel { return ratio.multiply(BigDecimal.TEN).multiply(BigDecimal.TEN); } - public BigDecimal getTheoreticalProgressByNumHoursForCriticalPathUntilNow() { + public BigDecimal getExpectedCriticalPathProgressByNumHours() { TaskGroup rootAsTaskGroup = (TaskGroup)getRootTask(); if (this.getRootTask() == null) { throw new RuntimeException("Root task is null"); @@ -169,7 +169,7 @@ public class DashboardModel implements IDashboardModel { return ratio.multiply(BigDecimal.TEN).multiply(BigDecimal.TEN); } - public BigDecimal getTheoreticalProgressByDurationForCriticalPathUntilNow() { + public BigDecimal getExpectedCriticalPathProgressByDuration() { TaskGroup rootAsTaskGroup = (TaskGroup)getRootTask(); if (this.getRootTask() == null) { throw new RuntimeException("Root task is null"); diff --git a/libreplan-webapp/src/main/java/org/libreplan/web/dashboard/IDashboardModel.java b/libreplan-webapp/src/main/java/org/libreplan/web/dashboard/IDashboardModel.java index ce86cff33..5e4622473 100644 --- a/libreplan-webapp/src/main/java/org/libreplan/web/dashboard/IDashboardModel.java +++ b/libreplan-webapp/src/main/java/org/libreplan/web/dashboard/IDashboardModel.java @@ -49,15 +49,15 @@ interface IDashboardModel { /* Progress KPI: "Global Progress of the Project" */ BigDecimal getAdvancePercentageByHours(); - BigDecimal getTheoreticalAdvancePercentageByHoursUntilNow(); + BigDecimal getExpectedAdvancePercentageByHours(); BigDecimal getCriticalPathProgressByNumHours(); - BigDecimal getTheoreticalProgressByNumHoursForCriticalPathUntilNow(); + BigDecimal getExpectedCriticalPathProgressByNumHours(); BigDecimal getCriticalPathProgressByDuration(); - BigDecimal getTheoreticalProgressByDurationForCriticalPathUntilNow(); + BigDecimal getExpectedCriticalPathProgressByDuration(); /* Time KPI: "Margin with deadline" */ BigDecimal getMarginWithDeadLine(); diff --git a/libreplan-webapp/src/main/webapp/dashboard/_dashboardfororder.zul b/libreplan-webapp/src/main/webapp/dashboard/_dashboardfororder.zul index 453b12264..5c1ab6447 100644 --- a/libreplan-webapp/src/main/webapp/dashboard/_dashboardfororder.zul +++ b/libreplan-webapp/src/main/webapp/dashboard/_dashboardfororder.zul @@ -16,113 +16,137 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see <http://www.gnu.org/licenses/>. --> + <zk xmlns:n="http://www.zkoss.org/2005/zk/native"> - <zscript><![CDATA[ - dsController = arg.get("dashboardController"); -]]> - import java.awt.Font; - String fontname = "Verdana"; - Font tfont = new Font(fontname, Font.BOLD, 14); //for title - Font lbfont = new Font(fontname, Font.PLAIN, 12); //for label + <zscript> + <![CDATA[ + dsController = arg.get("dashboardController"); + ]]> </zscript> + + <!-- VERY IMPORTANT!! + Don't include any HTML or Javascript code here because apparently this view, Dashboard view, will be rendered OK, + but it creates a side effect in the other views. If you include HTML here, go to Dashboard and later to other view, a big + chunk of space will appear on the top of the view + --> + <div self="@{define(content)}" height="100%" style="overflow:visible"> - <div height="30px" sclass="toolbar-box" /> + + <div height="30px" sclass="toolbar-box" /> + <window id="dashboardWindow" apply="${dsController}" vflex="1" style="margin:0;overflow:auto"> - <div id="projectDashboardChartsDiv" sclass="dashboards-container" visible="true" height="100%"> - - <groupbox closable="false"> - <caption label="${i18n:_('Progress')}" /> + <div id="projectDashboardChartsDiv" sclass="dashboards-container" height="100%"> + <groupbox closable="false"> + <caption label="${i18n:_('Progress')}" /> <hbox> - - <chart id="progressKPIglobalProgressChart" - height="200px" width="700px" type="bar" - threeD="true" yAxis="%" orient="horizontal" - titleFont="${tfont}" xAxisFont="${lbfont}" - xAxisTickFont="${lbfont}" yAxisFont="${lbfont}" - yAxisTickFont="${lbfont}" - title="${i18n:_('Global progress of the project')}" - paneColor="#FFFFFF" showLegend="true" /> - - <separator bar="false" spacing="40px" - orient="vertical" /> - - <chart id="progressKPItaskStatusChart" - height="200px" width="300px" type="pie" - threeD="true" title="${i18n:_('Task status')}" - titleFont="${tfont}" xAxisFont="${lbfont}" - xAxisTickFont="${lbfont}" yAxisFont="${lbfont}" - yAxisTickFont="${lbfont}" paneColor="#FFFFFF" - bgColor="#FFFFFF" showLegend="true" - showTooltiptext="true" /> - - </hbox> - </groupbox> - - <groupbox closable="false"> - <caption label="${i18n:_('Time')}" /> - <hbox> - - <chart id="timeKPILagInTaskCompletionChart" - height="200px" width="500px" type="bar" - xAxis="deviation class [i, i+1) (days)" - threeD="false" yAxis="probability" orient="vertical" - titleFont="${tfont}" xAxisFont="${lbfont}" - xAxisTickFont="${lbfont}" yAxisFont="${lbfont}" - yAxisTickFont="${lbfont}" - title="${i18n:_('Lead/Lag in task completion')}" - paneColor="#FFFFFF" showLegend="false" /> - - <separator bar="false" spacing="40px" - orient="vertical" /> - - <chart - id="progressKPItaskDeadlineViolationStatusChart" - height="200px" width="300px" type="pie" - threeD="true" title="${i18n:_('Deadline violation')}" - titleFont="${tfont}" xAxisFont="${lbfont}" - xAxisTickFont="${lbfont}" yAxisFont="${lbfont}" - yAxisTickFont="${lbfont}" paneColor="#FFFFFF" - bgColor="#FFFFFF" showLegend="true" - showTooltiptext="true" /> - - <chart id="timeKPImarginWithDeadlineChart" - height="400px" width="250px" type="bar" - threeD="true" yAxis="x D days" orient="vertical" - titleFont="${tfont}" xAxisFont="${lbfont}" - xAxisTickFont="${lbfont}" yAxisFont="${lbfont}" - yAxisTickFont="${lbfont}" - title="${i18n:_('Margin with deadline')}" - paneColor="#FFFFFF" showLegend="false" /> - - </hbox> - </groupbox> - - <groupbox closable="false"> - <caption label="Resources" /> - <hbox> - - <chart id="timeKPIEstimationAccuracyChart" - height="200px" width="500px" type="bar" - xAxis="deviation class [i, i+1) (%)" threeD="false" - yAxis="probability" orient="vertical" - titleFont="${tfont}" xAxisFont="${lbfont}" - xAxisTickFont="${lbfont}" yAxisFont="${lbfont}" - yAxisTickFont="${lbfont}" - title="${i18n:_('Estimation Accuracy')}" - paneColor="#FFFFFF" showLegend="false" /> - - </hbox> - </groupbox> - - + <n:div id="global-progress" style="height:200px; width:500px;"></n:div> + <n:div id="task-status" style="height:200px; width:400px; margin-left: 100px;"></n:div> + </hbox> + </groupbox> </div> + <div id="projectDashboardNoTasksWarningDiv" visible="false"> <n:h4 class="message_WARNING"> - <label id="noTasksWarningLabel" - value="${i18n:_('No tasks available yet')}" /> + <label id="noTasksWarningLabel" value="${i18n:_('No tasks available yet')}" /> </n:h4> </div> + </window> + </div> + + <!-- The variable for containing the 'global progress' has to be global and created before defer --> + <script type="text/javascript"> + var global_progress = { + title: 'Titulo', + }; + var task_status = { }; + </script> + + <!-- Configure the parameters for the 'global progress' chart. The object contains a method 'render' that + is called from the Java file once all objects in the view have been created --> + <script type="text/javascript" defer="true"> + <![CDATA[ + + global_progress = { + id: 'global-progress', + data: [], + title: 'Project global progress', + seriesDefaults: { + renderer:$.jqplot.BarRenderer, + pointLabels: { show: true, location: 'e', edgeTolerance: -15 }, + shadowAngle: 135, + rendererOptions: { + barDirection: 'horizontal' + }, + }, + axes: { + xaxis: { + label: "Progress percentage per progress type" + }, + yaxis: { + renderer: $.jqplot.CategoryAxisRenderer, + ticks: ['1','2','3'], + tickOptions: { + showGridline: false, + markSize: 0 + } + } + }, + series:[ + {label:'Expected', color: 'blue'}, + {label:'Actual', color: 'red'}, + ], + legend: { + show: true, + location: 'e', + placement: 'outside', + }, + render: function(data, ticks, series) { + if (ticks !== undefined) { + this.axes.yaxis.ticks = jQuery.parseJSON(ticks); + } + if (series !== undefined) { + this.series = jQuery.parseJSON(series); + } + this.plot = $.jqplot(this.id, jQuery.parseJSON(data), this); + } + }; + + task_status = { + id: 'task-status', + title: 'Task status', + data: [['Completed', 14], ['In Progress', 36], ['Ready to Start', 30], ['Blocked', 20]], + seriesDefaults: { + renderer: jQuery.jqplot.PieRenderer, + rendererOptions: { + showDataLabels: true + } + }, + legend: { + show: true, + location: 'e' + }, + render: function(data) { + this.plot = jQuery.jqplot('task-status', [jQuery.parseJSON(data)], this); + } + }; + + ]]> + </script> + + <!-- Include jqPlot styles --> + <n:link class="include" rel="stylesheet" type="text/css" href="/libreplan-webapp/jqplot/jquery.jqplot.min.css" /> + + <!-- Include jqPlot library and additional plugins --> + <n:script type="text/javascript" src="/libreplan-webapp/jqplot/jquery.js"></n:script> + <n:script type="text/javascript" src="/libreplan-webapp/jqplot/jquery.jqplot.js"></n:script> + <n:script type="text/javascript" src="/libreplan-webapp/jqPlot/plugins/jqplot.canvasTextRenderer.min.js"></n:script> + <n:script type="text/javascript" src="/libreplan-webapp/jqPlot/plugins/jqplot.canvasAxisLabelRenderer.min.js"></n:script> + <n:script type="text/javascript" src="/libreplan-webapp/jqplot/plugins/jqplot.barRenderer.min.js"></n:script> + <n:script type="text/javascript" src="/libreplan-webapp/jqplot/plugins/jqplot.categoryAxisRenderer.min.js"></n:script> + <n:script type="text/javascript" src="/libreplan-webapp/jqplot/plugins/jqplot.pointLabels.min.js"></n:script> + <n:script type="text/javascript" src="/libreplan-webapp/jqplot/plugins/jqplot.pieRenderer.min.js"></n:script> + <n:script type="text/javascript" src="/libreplan-webapp/jqplot/plugins/jqplot.donutRenderer.min.js"></n:script> </zk> From 3d8b044b17314e9280bd3f467cfa19eeb821890d Mon Sep 17 00:00:00 2001 From: Diego Pino <dpino@igalia.com> Date: Mon, 23 Apr 2012 16:48:38 +0200 Subject: [PATCH 053/108] Add table with summary of the status of tasks --- .../web/dashboard/DashboardController.java | 27 ++++++++++++++--- .../web/dashboard/DashboardModel.java | 11 +++++++ .../web/dashboard/IDashboardModel.java | 5 ++++ .../webapp/dashboard/_dashboardfororder.zul | 29 +++++++++++++++++++ 4 files changed, 68 insertions(+), 4 deletions(-) diff --git a/libreplan-webapp/src/main/java/org/libreplan/web/dashboard/DashboardController.java b/libreplan-webapp/src/main/java/org/libreplan/web/dashboard/DashboardController.java index ebaf7c1e5..393599732 100644 --- a/libreplan-webapp/src/main/java/org/libreplan/web/dashboard/DashboardController.java +++ b/libreplan-webapp/src/main/java/org/libreplan/web/dashboard/DashboardController.java @@ -23,9 +23,7 @@ import static org.libreplan.web.I18nHelper._; import java.math.BigDecimal; import java.util.ArrayList; -import java.util.Arrays; import java.util.Collection; -import java.util.HashMap; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; @@ -33,6 +31,7 @@ import java.util.TreeSet; import org.apache.commons.lang.StringUtils; import org.libreplan.business.orders.entities.Order; +import org.libreplan.business.planner.entities.TaskStatusEnum; import org.libreplan.web.common.Util; import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.context.annotation.Scope; @@ -40,6 +39,8 @@ import org.springframework.stereotype.Component; import org.zkoss.zk.ui.util.Clients; import org.zkoss.zk.ui.util.GenericForwardComposer; import org.zkoss.zul.Div; +import org.zkoss.zul.Grid; +import org.zkoss.zul.Label; import org.zkoss.zul.Window; @@ -57,6 +58,8 @@ public class DashboardController extends GenericForwardComposer { private Window dashboardWindow; + private Grid gridTasksSummary; + private Div projectDashboardChartsDiv; private Div projectDashboardNoTasksWarningDiv; @@ -81,10 +84,26 @@ public class DashboardController extends GenericForwardComposer { if (this.dashboardWindow != null) { renderGlobalProgress(); renderTaskStatus(); - } - + renderTasksSummary(); + } } + private void renderTasksSummary() { + Map<TaskStatusEnum, Integer> taskStatus = dashboardModel.calculateTaskStatus(); + + taskStatus("lblTasksFinished", taskStatus.get(TaskStatusEnum.FINISHED)); + taskStatus("lblTasksBlocked", taskStatus.get(TaskStatusEnum.BLOCKED)); + taskStatus("lblTasksInProgress", taskStatus.get(TaskStatusEnum.IN_PROGRESS)); + taskStatus("lblTasksReadyToStart", taskStatus.get(TaskStatusEnum.READY_TO_START)); + } + + private void taskStatus(String key, Integer value) { + Label label = (Label) gridTasksSummary.getFellowIfAny(key); + if (label != null) { + label.setValue(String.format(_("%d tasks"), value)); + } + } + private void renderTaskStatus() { TaskStatus taskStatus = TaskStatus.create(); taskStatus.data(_("Finished"), diff --git a/libreplan-webapp/src/main/java/org/libreplan/web/dashboard/DashboardModel.java b/libreplan-webapp/src/main/java/org/libreplan/web/dashboard/DashboardModel.java index c7bd15ee1..552bcf180 100644 --- a/libreplan-webapp/src/main/java/org/libreplan/web/dashboard/DashboardModel.java +++ b/libreplan-webapp/src/main/java/org/libreplan/web/dashboard/DashboardModel.java @@ -291,6 +291,17 @@ public class DashboardModel implements IDashboardModel { } return histogram; } + + public Map<TaskStatusEnum, Integer> calculateTaskStatus() { + AccumulateTasksStatusVisitor visitor = new AccumulateTasksStatusVisitor(); + TaskElement rootTask = getRootTask(); + if (this.getRootTask() == null) { + throw new RuntimeException("Root task is null"); + } + resetTasksStatusInGraph(); + rootTask.acceptVisitor(visitor); + return visitor.getTaskStatusData(); + } private void calculateTaskStatusStatistics() { AccumulateTasksStatusVisitor visitor = new AccumulateTasksStatusVisitor(); diff --git a/libreplan-webapp/src/main/java/org/libreplan/web/dashboard/IDashboardModel.java b/libreplan-webapp/src/main/java/org/libreplan/web/dashboard/IDashboardModel.java index 5e4622473..d37899688 100644 --- a/libreplan-webapp/src/main/java/org/libreplan/web/dashboard/IDashboardModel.java +++ b/libreplan-webapp/src/main/java/org/libreplan/web/dashboard/IDashboardModel.java @@ -21,8 +21,10 @@ package org.libreplan.web.dashboard; import java.math.BigDecimal; import java.util.List; +import java.util.Map; import org.libreplan.business.orders.entities.Order; +import org.libreplan.business.planner.entities.TaskStatusEnum; interface IDashboardModel { @@ -67,4 +69,7 @@ interface IDashboardModel { /* Time KPI: "Lead/Lag in task completion" */ List<Double> getLagInTaskCompletionHistogram(); + + Map<TaskStatusEnum, Integer> calculateTaskStatus(); + } diff --git a/libreplan-webapp/src/main/webapp/dashboard/_dashboardfororder.zul b/libreplan-webapp/src/main/webapp/dashboard/_dashboardfororder.zul index 5c1ab6447..8fb93554a 100644 --- a/libreplan-webapp/src/main/webapp/dashboard/_dashboardfororder.zul +++ b/libreplan-webapp/src/main/webapp/dashboard/_dashboardfororder.zul @@ -42,6 +42,35 @@ <hbox> <n:div id="global-progress" style="height:200px; width:500px;"></n:div> <n:div id="task-status" style="height:200px; width:400px; margin-left: 100px;"></n:div> + + <!-- Tasks summary --> + <grid id="gridTasksSummary" style="margin-top: 50px" visible="false"> + <auxhead> + <auxheader label="${i18n:_('Tasks summary')}" colspan="2"/> + </auxhead> + <columns sizable="false"> + <column width="100px"/> + <column /> + </columns> + <rows> + <row> + <label value="${i18n:_('Finished')}:"/> + <label id="lblTasksFinished" /> + </row> + <row> + <label value="${i18n:_('Blocked')}:"/> + <label id="lblTasksBlocked" /> + </row> + <row> + <label value="${i18n:_('In Progress')}:"/> + <label id="lblTasksInProgress" /> + </row> + <row> + <label value="${i18n:_('Ready to start')}:"/> + <label id="lblTasksReadyToStart" /> + </row> + </rows> + </grid> </hbox> </groupbox> </div> From 8b861476428cb2c7029195acd1783155e986196b Mon Sep 17 00:00:00 2001 From: Diego Pino <dpino@igalia.com> Date: Thu, 26 Apr 2012 16:45:36 +0200 Subject: [PATCH 054/108] Recode 'Task Completation Lead/Lag' using jqPlot --- .../web/dashboard/DashboardController.java | 471 ++++++++++-------- .../web/dashboard/DashboardModel.java | 204 ++++++-- .../web/dashboard/IDashboardModel.java | 7 +- .../webapp/dashboard/_dashboardfororder.zul | 97 +++- 4 files changed, 529 insertions(+), 250 deletions(-) diff --git a/libreplan-webapp/src/main/java/org/libreplan/web/dashboard/DashboardController.java b/libreplan-webapp/src/main/java/org/libreplan/web/dashboard/DashboardController.java index 393599732..352dfadd0 100644 --- a/libreplan-webapp/src/main/java/org/libreplan/web/dashboard/DashboardController.java +++ b/libreplan-webapp/src/main/java/org/libreplan/web/dashboard/DashboardController.java @@ -33,6 +33,7 @@ import org.apache.commons.lang.StringUtils; import org.libreplan.business.orders.entities.Order; import org.libreplan.business.planner.entities.TaskStatusEnum; import org.libreplan.web.common.Util; +import org.libreplan.web.dashboard.DashboardModel.Interval; import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; @@ -43,7 +44,6 @@ import org.zkoss.zul.Grid; import org.zkoss.zul.Label; import org.zkoss.zul.Window; - /** * @author Nacho Barrientos <nacho@igalia.com> * @author Diego Pino García <dpino@igalia.com> @@ -59,7 +59,7 @@ public class DashboardController extends GenericForwardComposer { private Window dashboardWindow; private Grid gridTasksSummary; - + private Div projectDashboardChartsDiv; private Div projectDashboardNoTasksWarningDiv; @@ -69,246 +69,321 @@ public class DashboardController extends GenericForwardComposer { @Override public void doAfterCompose(org.zkoss.zk.ui.Component comp) throws Exception { super.doAfterCompose(comp); - this.dashboardWindow = (Window)comp; + this.dashboardWindow = (Window) comp; self.setAttribute("controller", this); Util.createBindingsFor(this.dashboardWindow); } - - public void setCurrentOrder(Order order) { - dashboardModel.setCurrentOrder(order); - if (dashboardModel.tasksAvailable()) { - showCharts(); - } else { - hideCharts(); - } - if (this.dashboardWindow != null) { - renderGlobalProgress(); - renderTaskStatus(); - renderTasksSummary(); - } - } - - private void renderTasksSummary() { - Map<TaskStatusEnum, Integer> taskStatus = dashboardModel.calculateTaskStatus(); - - taskStatus("lblTasksFinished", taskStatus.get(TaskStatusEnum.FINISHED)); - taskStatus("lblTasksBlocked", taskStatus.get(TaskStatusEnum.BLOCKED)); - taskStatus("lblTasksInProgress", taskStatus.get(TaskStatusEnum.IN_PROGRESS)); - taskStatus("lblTasksReadyToStart", taskStatus.get(TaskStatusEnum.READY_TO_START)); - } - - private void taskStatus(String key, Integer value) { - Label label = (Label) gridTasksSummary.getFellowIfAny(key); - if (label != null) { - label.setValue(String.format(_("%d tasks"), value)); - } - } - private void renderTaskStatus() { - TaskStatus taskStatus = TaskStatus.create(); - taskStatus.data(_("Finished"), - dashboardModel.getPercentageOfFinishedTasks()); - taskStatus.data(_("In progress"), - dashboardModel.getPercentageOfInProgressTasks()); - taskStatus.data(_("Ready to start"), - dashboardModel.getPercentageOfReadyToStartTasks()); - taskStatus.data(_("Blocked"), - dashboardModel.getPercentageOfBlockedTasks()); - taskStatus.render(); - } + public void setCurrentOrder(Order order) { + dashboardModel.setCurrentOrder(order); + if (dashboardModel.tasksAvailable()) { + showCharts(); + } else { + hideCharts(); + } + if (this.dashboardWindow != null) { + renderGlobalProgress(); + renderTaskStatus(); + renderTaskCompletationLag(); + renderTasksSummary(); + } + } - private void renderGlobalProgress() { - GlobalProgress globalProgress = GlobalProgress.create(); + private void renderTaskCompletationLag() { + Map<Interval, Integer> taskCompletationData = dashboardModel + .calculateTaskCompletation(); + TaskCompletationLag taskCompletation = TaskCompletationLag.create(); + for (Interval each : taskCompletationData.keySet()) { + Integer value = taskCompletationData.get(each); + taskCompletation.data(each.toString(), value); + } + taskCompletation.render(); + } + + private void renderTasksSummary() { + Map<TaskStatusEnum, Integer> taskStatus = dashboardModel + .calculateTaskStatus(); + + taskStatus("lblTasksFinished", taskStatus.get(TaskStatusEnum.FINISHED)); + taskStatus("lblTasksBlocked", taskStatus.get(TaskStatusEnum.BLOCKED)); + taskStatus("lblTasksInProgress", + taskStatus.get(TaskStatusEnum.IN_PROGRESS)); + taskStatus("lblTasksReadyToStart", + taskStatus.get(TaskStatusEnum.READY_TO_START)); + } + + private void taskStatus(String key, Integer value) { + Label label = (Label) gridTasksSummary.getFellowIfAny(key); + if (label != null) { + label.setValue(String.format(_("%d tasks"), value)); + } + } + + private void renderTaskStatus() { + TaskStatus taskStatus = TaskStatus.create(); + taskStatus.data(_("Finished"), + dashboardModel.getPercentageOfFinishedTasks()); + taskStatus.data(_("In progress"), + dashboardModel.getPercentageOfInProgressTasks()); + taskStatus.data(_("Ready to start"), + dashboardModel.getPercentageOfReadyToStartTasks()); + taskStatus.data(_("Blocked"), + dashboardModel.getPercentageOfBlockedTasks()); + taskStatus.render(); + } + + private void renderGlobalProgress() { + GlobalProgress globalProgress = GlobalProgress.create(); + + // Current values + globalProgress.current(GlobalProgress.CRITICAL_PATH_DURATION, + dashboardModel.getCriticalPathProgressByDuration()); + globalProgress.current(GlobalProgress.CRITICAL_PATH_HOURS, + dashboardModel.getCriticalPathProgressByNumHours()); + globalProgress.current(GlobalProgress.ALL_TASKS_HOURS, + dashboardModel.getAdvancePercentageByHours()); + // Expected values + globalProgress.expected(GlobalProgress.CRITICAL_PATH_DURATION, + dashboardModel.getExpectedCriticalPathProgressByDuration()); + globalProgress.expected(GlobalProgress.CRITICAL_PATH_HOURS, + dashboardModel.getExpectedCriticalPathProgressByNumHours()); + globalProgress.expected(GlobalProgress.ALL_TASKS_HOURS, + dashboardModel.getExpectedAdvancePercentageByHours()); + + globalProgress.render(); + } + + private void showCharts() { + projectDashboardChartsDiv.setVisible(true); + projectDashboardNoTasksWarningDiv.setVisible(false); + } - // Current values - globalProgress.current(GlobalProgress.CRITICAL_PATH_DURATION, - dashboardModel.getCriticalPathProgressByDuration()); - globalProgress.current(GlobalProgress.CRITICAL_PATH_HOURS, - dashboardModel.getCriticalPathProgressByNumHours()); - globalProgress.current(GlobalProgress.ALL_TASKS_HOURS, - dashboardModel.getAdvancePercentageByHours()); - // Expected values - globalProgress.expected(GlobalProgress.CRITICAL_PATH_DURATION, - dashboardModel.getExpectedCriticalPathProgressByDuration()); - globalProgress.expected(GlobalProgress.CRITICAL_PATH_HOURS, - dashboardModel.getExpectedCriticalPathProgressByNumHours()); - globalProgress.expected(GlobalProgress.ALL_TASKS_HOURS, - dashboardModel.getExpectedAdvancePercentageByHours()); - - globalProgress.render(); - } - - private void showCharts() { - projectDashboardChartsDiv.setVisible(true); - projectDashboardNoTasksWarningDiv.setVisible(false); - } - private void hideCharts() { projectDashboardChartsDiv.setVisible(false); projectDashboardNoTasksWarningDiv.setVisible(true); } - + /** * * @author Diego Pino García <dpino@igalia.com> - * + * */ - static class GlobalProgress { + static class GlobalProgress { - public static final String ALL_TASKS_HOURS = _("All tasks (hours)"); + public static final String ALL_TASKS_HOURS = _("All tasks (hours)"); - public static final String CRITICAL_PATH_HOURS = _("Critical path (hours)"); + public static final String CRITICAL_PATH_HOURS = _("Critical path (hours)"); - public static final String CRITICAL_PATH_DURATION = _("Critical path (duration)"); + public static final String CRITICAL_PATH_DURATION = _("Critical path (duration)"); - private Map<String, BigDecimal> current = new LinkedHashMap<String, BigDecimal>(); + private final Map<String, BigDecimal> current = new LinkedHashMap<String, BigDecimal>(); - private Map<String, BigDecimal> expected = new LinkedHashMap<String, BigDecimal>(); + private final Map<String, BigDecimal> expected = new LinkedHashMap<String, BigDecimal>(); - private static List<Series> series = new ArrayList<Series>() { - { - add(Series.create(_("Current"), "blue")); - add(Series.create(_("Expected"), "red")); - } - }; + private static List<Series> series = new ArrayList<Series>() { + { + add(Series.create(_("Current"), "#33c")); + add(Series.create(_("Expected"), "#c33")); + } + }; - private GlobalProgress() { + private GlobalProgress() { - } + } - public void current(String key, BigDecimal value) { - current.put(key, value); - } + public void current(String key, BigDecimal value) { + current.put(key, value); + } - public void expected(String key, BigDecimal value) { - expected.put(key, value); - } + public void expected(String key, BigDecimal value) { + expected.put(key, value); + } - public static GlobalProgress create() { - return new GlobalProgress(); - } + public static GlobalProgress create() { + return new GlobalProgress(); + } - public String getPercentages() { - return String.format("'[%s, %s]'", - jsonifyPercentages(current.values()), - jsonifyPercentages(expected.values())); - } + public String getPercentages() { + return String.format("'[%s, %s]'", + jsonifyPercentages(current.values()), + jsonifyPercentages(expected.values())); + } - private String jsonifyPercentages(Collection<BigDecimal> array) { - List<String> result = new ArrayList<String>(); + private String jsonifyPercentages(Collection<BigDecimal> array) { + List<String> result = new ArrayList<String>(); - int i = 1; - for (BigDecimal each : array) { - result.add(String.format("[%.2f, %d]", each.doubleValue(), i++)); - } - return String.format("[%s]", StringUtils.join(result, ",")); - } + int i = 1; + for (BigDecimal each : array) { + result.add(String.format("[%.2f, %d]", each.doubleValue(), i++)); + } + return String.format("[%s]", StringUtils.join(result, ",")); + } - private String jsonify(Collection<?> list) { - Collection<String> result = new ArrayList<String>(); - for (Object each : list) { - if (each.getClass() == String.class) { - result.add(String.format("\"%s\"", each.toString())); - } else { - result.add(String.format("%s", each.toString())); - } - } - return String.format("'[%s]'", StringUtils.join(result, ',')); - } + private String jsonify(Collection<?> list) { + Collection<String> result = new ArrayList<String>(); + for (Object each : list) { + if (each.getClass() == String.class) { + result.add(String.format("\"%s\"", each.toString())); + } else { + result.add(String.format("%s", each.toString())); + } + } + return String.format("'[%s]'", StringUtils.join(result, ',')); + } - public String getSeries() { - return jsonify(series); - } + public String getSeries() { + return jsonify(series); + } - /** - * The order of the ticks is taken from the keys in current - * - * @return - */ - public String getTicks() { - return jsonify(current.keySet()); - } + /** + * The order of the ticks is taken from the keys in current + * + * @return + */ + public String getTicks() { + return jsonify(current.keySet()); + } - public void render() { - String command = String.format( - "global_progress.render(%s, %s, %s);", getPercentages(), - getTicks(), getSeries()); - Clients.evalJavaScript(command); - } + public void render() { + String command = String.format( + "global_progress.render(%s, %s, %s);", getPercentages(), + getTicks(), getSeries()); + Clients.evalJavaScript(command); + } + + } - } - /** * * @author Diego Pino García <dpino@igalia.com> - * + * */ static class Series { - - private String label; - - private String color; - - private Series() { - - } - - public static Series create(String label) { - Series series = new Series(); - series.label = label; - return series; - } - - public static Series create(String label, String color) { - Series series = new Series(); - series.label = label; - series.color = color; - return series; - } - public String toString() { - return String.format("{\"label\": \"%s\", \"color\": \"%s\"}", label, color); - } - + private String label; + + private String color; + + private Series() { + + } + + public static Series create(String label) { + Series series = new Series(); + series.label = label; + return series; + } + + public static Series create(String label, String color) { + Series series = new Series(); + series.label = label; + series.color = color; + return series; + } + + @Override + public String toString() { + return String.format("{\"label\": \"%s\", \"color\": \"%s\"}", + label, color); + } + } - + /** * * @author Diego Pino García <dpino@igalia.com> - * + * */ static class TaskStatus { - - private Map<String, BigDecimal> data = new LinkedHashMap<String, BigDecimal>(); - - private TaskStatus() { - - } - - public static TaskStatus create() { - return new TaskStatus(); - } - - private String getData() { - List<String> result = new ArrayList<String>(); - - TreeSet<String> keys = new TreeSet<String>(data.keySet()); - for (String key : keys) { - BigDecimal value = data.get(key); - result.add(String.format("[\"%s\", %.2f]", key, value)); - } - return String.format("'[%s]'", StringUtils.join(result, ",")); - } - - public void data(String key, BigDecimal value) { - data.put(key, value); - } - - public void render() { - String command = String.format("task_status.render(%s);", getData()); - Clients.evalJavaScript(command); - } - + + private final Map<String, BigDecimal> data = new LinkedHashMap<String, BigDecimal>(); + + private TaskStatus() { + + } + + public static TaskStatus create() { + return new TaskStatus(); + } + + private String getData() { + List<String> result = new ArrayList<String>(); + + TreeSet<String> keys = new TreeSet<String>(data.keySet()); + for (String key : keys) { + BigDecimal value = data.get(key); + result.add(String.format("[\"%s\", %.2f]", key, value)); + } + return String.format("'[%s]'", StringUtils.join(result, ",")); + } + + public void data(String key, BigDecimal value) { + data.put(key, value); + } + + public void render() { + String command = String + .format("task_status.render(%s);", getData()); + Clients.evalJavaScript(command); + } + } - + + static class TaskCompletationLag { + + private final String id = "task_completation_lag"; + + private final Map<String, Integer> data = new LinkedHashMap<String, Integer>(); + + private TaskCompletationLag() { + + } + + public static TaskCompletationLag create() { + return new TaskCompletationLag(); + } + + public void data(String interval, Integer value) { + data.put(interval, value); + } + + public void render() { + String _data = JSONHelper.values(data); + String ticks = JSONHelper.keys(data); + String command = String.format("%s.render(%s, %s);", id, _data, + ticks); + Clients.evalJavaScript(command); + } + + } + + static class JSONHelper { + + public static String format(Map<String, Integer> data) { + List<String> result = new ArrayList<String>(); + for (String key : data.keySet()) { + Integer value = data.get(data); + result.add(String.format("[\"%s\", %d]", key, value)); + } + return String.format("'[%s]'", StringUtils.join(result, ',')); + } + + public static String keys(Map<String, ?> map) { + List<String> result = new ArrayList<String>(); + for (String each : map.keySet()) { + result.add(String.format("\"%s\"", each)); + } + return String.format("'[%s]'", StringUtils.join(result, ',')); + } + + public static String values(Map<?, Integer> map) { + List<String> result = new ArrayList<String>(); + for (Integer each : map.values()) { + result.add(each.toString()); + } + return String.format("'[%s]'", StringUtils.join(result, ',')); + } + + } + } \ No newline at end of file diff --git a/libreplan-webapp/src/main/java/org/libreplan/web/dashboard/DashboardModel.java b/libreplan-webapp/src/main/java/org/libreplan/web/dashboard/DashboardModel.java index 552bcf180..603c88f87 100644 --- a/libreplan-webapp/src/main/java/org/libreplan/web/dashboard/DashboardModel.java +++ b/libreplan-webapp/src/main/java/org/libreplan/web/dashboard/DashboardModel.java @@ -22,10 +22,13 @@ package org.libreplan.web.dashboard; import java.math.BigDecimal; import java.math.MathContext; import java.util.ArrayList; +import java.util.Collection; import java.util.Collections; import java.util.EnumMap; +import java.util.LinkedHashMap; import java.util.List; import java.util.Map; +import java.util.Set; import org.joda.time.Days; import org.joda.time.LocalDate; @@ -45,7 +48,7 @@ import org.springframework.stereotype.Component; /** * Model for UI operations related to Order Dashboard View - * + * * @author Nacho Barrientos <nacho@igalia.com> * @author Lorenzo Tilve Álvaro <ltilve@igalia.com> */ @@ -64,12 +67,11 @@ public class DashboardModel implements IDashboardModel { public static double LTC_STRETCHES_MIN_VALUE = 0; public static double LTC_STRETCHES_MAX_VALUE = 0; - private Order currentOrder; private Integer taskCount = null; - private Map<TaskStatusEnum, BigDecimal> taskStatusStats; - private Map<TaskDeadlineViolationStatusEnum, BigDecimal> taskDeadlineViolationStatusStats; + private final Map<TaskStatusEnum, BigDecimal> taskStatusStats; + private final Map<TaskDeadlineViolationStatusEnum, BigDecimal> taskDeadlineViolationStatusStats; private List<Double> taskEstimationAccuracyHistogram; private BigDecimal marginWithDeadLine; private List<Double> lagInTaskCompletionHistogram; @@ -81,10 +83,11 @@ public class DashboardModel implements IDashboardModel { TaskDeadlineViolationStatusEnum.class); } + @Override public void setCurrentOrder(Order order) { this.currentOrder = order; this.taskCount = null; - if(tasksAvailable()) { + if (tasksAvailable()) { this.calculateTaskStatusStatistics(); this.calculateTaskViolationStatusStatistics(); this.calculateMarginWithDeadLine(); @@ -94,38 +97,49 @@ public class DashboardModel implements IDashboardModel { } /* Progress KPI: "Number of tasks by status" */ + @Override public BigDecimal getPercentageOfFinishedTasks() { return taskStatusStats.get(TaskStatusEnum.FINISHED); } + @Override public BigDecimal getPercentageOfInProgressTasks() { return taskStatusStats.get(TaskStatusEnum.IN_PROGRESS); } + @Override public BigDecimal getPercentageOfReadyToStartTasks() { return taskStatusStats.get(TaskStatusEnum.READY_TO_START); } + @Override public BigDecimal getPercentageOfBlockedTasks() { return taskStatusStats.get(TaskStatusEnum.BLOCKED); } /* Progress KPI: "Deadline violation" */ + @Override public BigDecimal getPercentageOfOnScheduleTasks() { - return taskDeadlineViolationStatusStats.get(TaskDeadlineViolationStatusEnum.ON_SCHEDULE); + return taskDeadlineViolationStatusStats + .get(TaskDeadlineViolationStatusEnum.ON_SCHEDULE); } + @Override public BigDecimal getPercentageOfTasksWithViolatedDeadline() { - return taskDeadlineViolationStatusStats.get(TaskDeadlineViolationStatusEnum.DEADLINE_VIOLATED); + return taskDeadlineViolationStatusStats + .get(TaskDeadlineViolationStatusEnum.DEADLINE_VIOLATED); } + @Override public BigDecimal getPercentageOfTasksWithNoDeadline() { - return taskDeadlineViolationStatusStats.get(TaskDeadlineViolationStatusEnum.NO_DEADLINE); + return taskDeadlineViolationStatusStats + .get(TaskDeadlineViolationStatusEnum.NO_DEADLINE); } /* Progress KPI: "Global Progress of the Project" */ - public BigDecimal getAdvancePercentageByHours(){ - TaskGroup rootAsTaskGroup = (TaskGroup)getRootTask(); + @Override + public BigDecimal getAdvancePercentageByHours() { + TaskGroup rootAsTaskGroup = (TaskGroup) getRootTask(); if (this.getRootTask() == null) { throw new RuntimeException("Root task is null"); } @@ -133,17 +147,20 @@ public class DashboardModel implements IDashboardModel { return ratio.multiply(BigDecimal.TEN).multiply(BigDecimal.TEN); } - public BigDecimal getExpectedAdvancePercentageByHours(){ - TaskGroup rootAsTaskGroup = (TaskGroup)getRootTask(); + @Override + public BigDecimal getExpectedAdvancePercentageByHours() { + TaskGroup rootAsTaskGroup = (TaskGroup) getRootTask(); if (this.getRootTask() == null) { throw new RuntimeException("Root task is null"); } - BigDecimal ratio = rootAsTaskGroup.getTheoreticalProgressByNumHoursForAllTasksUntilNow(); + BigDecimal ratio = rootAsTaskGroup + .getTheoreticalProgressByNumHoursForAllTasksUntilNow(); return ratio.multiply(BigDecimal.TEN).multiply(BigDecimal.TEN); } + @Override public BigDecimal getCriticalPathProgressByNumHours() { - TaskGroup rootAsTaskGroup = (TaskGroup)getRootTask(); + TaskGroup rootAsTaskGroup = (TaskGroup) getRootTask(); if (this.getRootTask() == null) { throw new RuntimeException("Root task is null"); } @@ -151,17 +168,20 @@ public class DashboardModel implements IDashboardModel { return ratio.multiply(BigDecimal.TEN).multiply(BigDecimal.TEN); } + @Override public BigDecimal getExpectedCriticalPathProgressByNumHours() { - TaskGroup rootAsTaskGroup = (TaskGroup)getRootTask(); + TaskGroup rootAsTaskGroup = (TaskGroup) getRootTask(); if (this.getRootTask() == null) { throw new RuntimeException("Root task is null"); } - BigDecimal ratio = rootAsTaskGroup.getTheoreticalProgressByNumHoursForCriticalPathUntilNow(); + BigDecimal ratio = rootAsTaskGroup + .getTheoreticalProgressByNumHoursForCriticalPathUntilNow(); return ratio.multiply(BigDecimal.TEN).multiply(BigDecimal.TEN); } + @Override public BigDecimal getCriticalPathProgressByDuration() { - TaskGroup rootAsTaskGroup = (TaskGroup)getRootTask(); + TaskGroup rootAsTaskGroup = (TaskGroup) getRootTask(); if (this.getRootTask() == null) { throw new RuntimeException("Root task is null"); } @@ -169,16 +189,19 @@ public class DashboardModel implements IDashboardModel { return ratio.multiply(BigDecimal.TEN).multiply(BigDecimal.TEN); } + @Override public BigDecimal getExpectedCriticalPathProgressByDuration() { - TaskGroup rootAsTaskGroup = (TaskGroup)getRootTask(); + TaskGroup rootAsTaskGroup = (TaskGroup) getRootTask(); if (this.getRootTask() == null) { throw new RuntimeException("Root task is null"); } - BigDecimal ratio = rootAsTaskGroup.getTheoreticalProgressByDurationForCriticalPathUntilNow(); + BigDecimal ratio = rootAsTaskGroup + .getTheoreticalProgressByDurationForCriticalPathUntilNow(); return ratio.multiply(BigDecimal.TEN).multiply(BigDecimal.TEN); } /* Time KPI: Margin with deadline */ + @Override public BigDecimal getMarginWithDeadLine() { return this.marginWithDeadLine; } @@ -208,6 +231,7 @@ public class DashboardModel implements IDashboardModel { } /* Time KPI: Estimation accuracy */ + @Override public List<Double> getFinishedTasksEstimationAccuracyHistogram() { return this.taskEstimationAccuracyHistogram; } @@ -216,21 +240,19 @@ public class DashboardModel implements IDashboardModel { if (this.getRootTask() == null) { throw new RuntimeException("Root task is null"); } - CalculateFinishedTasksEstimationDeviationVisitor visitor = - new CalculateFinishedTasksEstimationDeviationVisitor(); + CalculateFinishedTasksEstimationDeviationVisitor visitor = new CalculateFinishedTasksEstimationDeviationVisitor(); TaskElement rootTask = getRootTask(); rootTask.acceptVisitor(visitor); List<Double> deviations = visitor.getDeviations(); // [-100, -90), [-90, -80), ..., [190, 200), [200, inf) this.taskEstimationAccuracyHistogram = createHistogram( - EA_STRETCHES_MIN_VALUE, - EA_STRETCHES_MAX_VALUE, - EA_STRETCHES_PERCENTAGE_STEP, - deviations); + EA_STRETCHES_MIN_VALUE, EA_STRETCHES_MAX_VALUE, + EA_STRETCHES_PERCENTAGE_STEP, deviations); } /* Time KPI: Lead/Lag in task completion */ + @Override public List<Double> getLagInTaskCompletionHistogram() { return this.lagInTaskCompletionHistogram; } @@ -239,8 +261,7 @@ public class DashboardModel implements IDashboardModel { if (this.getRootTask() == null) { throw new RuntimeException("Root task is null"); } - CalculateFinishedTasksLagInCompletionVisitor visitor = - new CalculateFinishedTasksLagInCompletionVisitor(); + CalculateFinishedTasksLagInCompletionVisitor visitor = new CalculateFinishedTasksLagInCompletionVisitor(); TaskElement rootTask = getRootTask(); rootTask.acceptVisitor(visitor); List<Double> deviations = visitor.getDeviations(); @@ -253,45 +274,137 @@ public class DashboardModel implements IDashboardModel { LTC_STRETCHES_MAX_VALUE = Collections.max(deviations); } LTC_STRETCHES_STEP = (LTC_STRETCHES_MAX_VALUE - LTC_STRETCHES_MIN_VALUE) - /LTC_NUMBER_OF_INTERVALS; + / LTC_NUMBER_OF_INTERVALS; this.lagInTaskCompletionHistogram = createHistogram( - LTC_STRETCHES_MIN_VALUE, - LTC_STRETCHES_MAX_VALUE, - LTC_STRETCHES_STEP, - deviations); + LTC_STRETCHES_MIN_VALUE, LTC_STRETCHES_MAX_VALUE, + LTC_STRETCHES_STEP, deviations); } private List<Double> createHistogram(double lowBound, double highBound, double intervalStep, List<Double> values) { double variableRange = highBound - lowBound; /* TODO: What if highBound == lowBound? */ - int numberOfClasses = (int)(variableRange/intervalStep); - int[] classes = new int[numberOfClasses+1]; + int numberOfClasses = (int) (variableRange / intervalStep); + int[] classes = new int[numberOfClasses + 1]; - for(Double value: values) { + for (Double value : values) { int index; if (value >= highBound) { index = numberOfClasses; } else { - index = (int)(numberOfClasses * - (((value.doubleValue() - lowBound))/variableRange)); + index = (int) (numberOfClasses * (((value.doubleValue() - lowBound)) / variableRange)); } classes[index]++; } List<Double> histogram = new ArrayList<Double>(); int numberOfConsideredTasks = values.size(); - for (int numberOfElementsInClass: classes) { + for (int numberOfElementsInClass : classes) { Double relativeCount = new Double(0.0); if (numberOfConsideredTasks > 0) { - relativeCount = new Double(1.0*numberOfElementsInClass/ - numberOfConsideredTasks); + relativeCount = new Double(1.0 * numberOfElementsInClass + / numberOfConsideredTasks); } histogram.add(relativeCount); } return histogram; } - + + @Override + public Map<Interval, Integer> calculateTaskCompletation() { + Map<Interval, Integer> result = new LinkedHashMap<Interval, Integer>(); + final Integer one = Integer.valueOf(1); + + // Get deviations of finished tasks, calculate max, min and delta + List<Double> deviations = getDeviations(); + if (deviations.isEmpty()) { + return result; + } + Double max = Collections.max(deviations); + Double min = Collections.min(deviations); + double delta = (max - min) / Interval.MAX_INTERVALS; + + // Create MAX_INTERVALS + double from = min; + for (int i = 0; i < Interval.MAX_INTERVALS; i++) { + result.put(Interval.create(from, from + delta), Integer.valueOf(0)); + from = from + delta; + } + + // Construct map with number of tasks for each interval + final Set<Interval> intervals = result.keySet(); + for (Double each : deviations) { + Interval interval = Interval.containingValue(intervals, each); + if (interval != null) { + Integer value = result.get(interval); + result.put(interval, value + one); + } + } + return result; + } + + /** + * + * @author Diego Pino García<dpino@igalia.com> + * + */ + static class Interval { + + public static final double MAX_INTERVALS = 6; + + private double min; + + private double max; + + private Interval() { + + } + + public static Interval create(double min, double max) { + return new Interval(min, max); + } + + private Interval(double min, double max) { + this.min = min; + this.max = max; + } + + public static Interval copy(Interval interval) { + return new Interval(interval.min, interval.max); + } + + public static Interval containingValue(Collection<Interval> intervals, + Double value) { + for (Interval each : intervals) { + if (each.includes(value)) { + return each; + } + } + return null; + } + + private boolean includes(double value) { + return (value >= min) && (value <= max); + } + + @Override + public String toString() { + return String.format("[%.2f, %.2f]", min, max); + } + + } + + private List<Double> getDeviations() { + if (this.getRootTask() == null) { + throw new RuntimeException("Root task is null"); + } + CalculateFinishedTasksEstimationDeviationVisitor visitor = new CalculateFinishedTasksEstimationDeviationVisitor(); + TaskElement rootTask = getRootTask(); + rootTask.acceptVisitor(visitor); + return visitor.getDeviations(); + } + + @Override public Map<TaskStatusEnum, Integer> calculateTaskStatus() { AccumulateTasksStatusVisitor visitor = new AccumulateTasksStatusVisitor(); TaskElement rootTask = getRootTask(); @@ -322,7 +435,8 @@ public class DashboardModel implements IDashboardModel { throw new RuntimeException("Root task is null"); } rootTask.acceptVisitor(visitor); - Map<TaskDeadlineViolationStatusEnum, Integer> count = visitor.getTaskDeadlineViolationStatusData(); + Map<TaskDeadlineViolationStatusEnum, Integer> count = visitor + .getTaskDeadlineViolationStatusData(); mapAbsoluteValuesToPercentages(count, taskDeadlineViolationStatusStats); } @@ -353,8 +467,9 @@ public class DashboardModel implements IDashboardModel { } private int countTasksInAResultMap(Map<? extends Object, Integer> map) { - /* It's only needed to count the number of tasks once - * each time setOrder is called. + /* + * It's only needed to count the number of tasks once each time setOrder + * is called. */ if (this.taskCount != null) { return this.taskCount.intValue(); @@ -367,6 +482,7 @@ public class DashboardModel implements IDashboardModel { return sum; } + @Override public boolean tasksAvailable() { return getRootTask() != null; } diff --git a/libreplan-webapp/src/main/java/org/libreplan/web/dashboard/IDashboardModel.java b/libreplan-webapp/src/main/java/org/libreplan/web/dashboard/IDashboardModel.java index d37899688..f6649f881 100644 --- a/libreplan-webapp/src/main/java/org/libreplan/web/dashboard/IDashboardModel.java +++ b/libreplan-webapp/src/main/java/org/libreplan/web/dashboard/IDashboardModel.java @@ -25,6 +25,7 @@ import java.util.Map; import org.libreplan.business.orders.entities.Order; import org.libreplan.business.planner.entities.TaskStatusEnum; +import org.libreplan.web.dashboard.DashboardModel.Interval; interface IDashboardModel { @@ -69,7 +70,9 @@ interface IDashboardModel { /* Time KPI: "Lead/Lag in task completion" */ List<Double> getLagInTaskCompletionHistogram(); - + Map<TaskStatusEnum, Integer> calculateTaskStatus(); - + + Map<Interval, Integer> calculateTaskCompletation(); + } diff --git a/libreplan-webapp/src/main/webapp/dashboard/_dashboardfororder.zul b/libreplan-webapp/src/main/webapp/dashboard/_dashboardfororder.zul index 8fb93554a..b28165bfc 100644 --- a/libreplan-webapp/src/main/webapp/dashboard/_dashboardfororder.zul +++ b/libreplan-webapp/src/main/webapp/dashboard/_dashboardfororder.zul @@ -34,9 +34,11 @@ <div height="30px" sclass="toolbar-box" /> - <window id="dashboardWindow" apply="${dsController}" vflex="1" style="margin:0;overflow:auto"> + <window id="dashboardWindow" apply="${dsController}" vflex="1" contentStyle="margin: 0; overflow: auto"> - <div id="projectDashboardChartsDiv" sclass="dashboards-container" height="100%"> + <div id="projectDashboardChartsDiv" sclass="dashboards-container" height="100%" width="100%"> + + <!-- Progress --> <groupbox closable="false"> <caption label="${i18n:_('Progress')}" /> <hbox> @@ -44,7 +46,7 @@ <n:div id="task-status" style="height:200px; width:400px; margin-left: 100px;"></n:div> <!-- Tasks summary --> - <grid id="gridTasksSummary" style="margin-top: 50px" visible="false"> + <grid id="gridTasksSummary" style="margin-top: 50px;" width="300px"> <auxhead> <auxheader label="${i18n:_('Tasks summary')}" colspan="2"/> </auxhead> @@ -72,7 +74,18 @@ </rows> </grid> </hbox> + </groupbox> + + <!-- Time --> + <groupbox closable="false"> + <caption label="${i18n:_('Time')}" /> + <hbox> + <n:div id="task-completation-lag" style="height:200px; width:560px;"></n:div> + <n:div id="deadline-violation" style="height:200px; width:400px; margin-left: 100px;"></n:div> + <n:div id="margin-with-deadline" style="height:200px; width:400px; margin-left: 100px;"></n:div> + </hbox> </groupbox> + </div> <div id="projectDashboardNoTasksWarningDiv" visible="false"> @@ -87,12 +100,24 @@ <!-- The variable for containing the 'global progress' has to be global and created before defer --> <script type="text/javascript"> - var global_progress = { - title: 'Titulo', - }; + var global_progress = { }; var task_status = { }; + var task_completation_lag = { }; </script> + <n:style type="text/css"> + .tooltip { + display:none; + position:absolute; + border:1px solid #333; + background-color:#161616; + border-radius:5px; + padding:10px; + color:#fff; + font-size:12px Arial; + } + </n:style> + <!-- Configure the parameters for the 'global progress' chart. The object contains a method 'render' that is called from the Java file once all objects in the view have been created --> <script type="text/javascript" defer="true"> @@ -161,6 +186,66 @@ this.plot = jQuery.jqplot('task-status', [jQuery.parseJSON(data)], this); } }; + + task_completation_lag = { + id: 'task-completation-lag', + title: 'Task completation lag', + data: [], + seriesDefaults:{ + renderer:$.jqplot.BarRenderer, + rendererOptions: { + fillToZero: true + } + }, + axesDefaults: { + tickRenderer: $.jqplot.CanvasAxisTickRenderer , + tickOptions: { + angle: -30, + fontSize: '10pt' + } + }, + axes: { + xaxis: { + label: 'Number of Days / Days Interval', + renderer: $.jqplot.CategoryAxisRenderer, + }, + }, + render: function(data, conf) { + if (conf.ticks !== undefined) { + this.axes.xaxis.ticks = jQuery.parseJSON(conf.ticks); + } + if (conf.titles !== undefined) { + this.axes.xaxis.ticks = jQuery.parseJSON(conf.ticks); + } + + this.plot = $.jqplot(this.id, [jQuery.parseJSON(data)], this); + this.attachTooltip(); + }, + attachTooltip: function() { + var node = $('#' + this.id); + node.bind('jqplotDataHighlight', + function (ev, seriesIndex, pointIndex, data) { + var x = ev.pageX - node.offset().left; + var y = ev.pageY - node.offset().top; + + var tooltip = $('<span class="tooltip"></span>'); + tooltip.text(data[1]).appendTo(node); + tooltip.css({'top': y, 'left': x, 'position': 'absolute'}); + tooltip.fadeIn('slow'); + } + ); + node.bind('jqplotDataUnhighlight', + function (ev) { + $('.tooltip').remove(); + } + ); + node.mousemove(function(ev) { + var x = ev.pageX - node.offset().left; + var y = ev.pageY - node.offset().top; + $('.tooltip').css({'top': y, 'left': x, 'position': 'absolute'}) + }); + } + }; ]]> </script> From f07ce4fccd02d1fde6b1b5821dcdf1f6d707921d Mon Sep 17 00:00:00 2001 From: Manuel Rego Casasnovas <rego@igalia.com> Date: Fri, 27 Apr 2012 12:03:19 +0200 Subject: [PATCH 055/108] Bug #1412: Avoid NPE if clockStart and clockFinish are not defined FEA: ItEr76S04BugFixing --- .../business/reports/dtos/HoursWorkedPerResourceDTO.java | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/libreplan-business/src/main/java/org/libreplan/business/reports/dtos/HoursWorkedPerResourceDTO.java b/libreplan-business/src/main/java/org/libreplan/business/reports/dtos/HoursWorkedPerResourceDTO.java index 9fce1dfc6..a77bae0d4 100644 --- a/libreplan-business/src/main/java/org/libreplan/business/reports/dtos/HoursWorkedPerResourceDTO.java +++ b/libreplan-business/src/main/java/org/libreplan/business/reports/dtos/HoursWorkedPerResourceDTO.java @@ -25,6 +25,7 @@ import java.util.Date; import java.util.Set; import org.joda.time.LocalDate; +import org.joda.time.LocalTime; import org.libreplan.business.labels.entities.Label; import org.libreplan.business.resources.entities.Resource; import org.libreplan.business.workingday.EffortDuration; @@ -58,8 +59,12 @@ public class HoursWorkedPerResourceDTO implements Comparable { this.workerName = resource.getName(); this.date = workReportLine.getDate(); - this.clockStart = workReportLine.getClockStart().toString("HH:mm"); - this.clockFinish = workReportLine.getClockFinish().toString("HH:mm"); + LocalTime clockStart = workReportLine.getClockStart(); + this.clockStart = (clockStart != null) ? clockStart.toString("HH:mm") + : ""; + LocalTime clockFinish = workReportLine.getClockFinish(); + this.clockFinish = (clockFinish != null) ? clockFinish + .toString("HH:mm") : ""; this.effort = workReportLine.getEffort(); this.orderElementCode = workReportLine.getOrderElement().getCode(); this.orderElementName = workReportLine.getOrderElement().getName(); From 0d52103791a9fae4d64d2be2f4a7334da81724c5 Mon Sep 17 00:00:00 2001 From: Manuel Rego Casasnovas <rego@igalia.com> Date: Fri, 27 Apr 2012 13:17:20 +0200 Subject: [PATCH 056/108] Bug #1424: Fix issue loading derived allocations FEA: ItEr76S04BugFixing --- .../libreplan/web/reports/SchedulingProgressPerOrderModel.java | 1 + 1 file changed, 1 insertion(+) diff --git a/libreplan-webapp/src/main/java/org/libreplan/web/reports/SchedulingProgressPerOrderModel.java b/libreplan-webapp/src/main/java/org/libreplan/web/reports/SchedulingProgressPerOrderModel.java index 6af4f8361..8083f5792 100644 --- a/libreplan-webapp/src/main/java/org/libreplan/web/reports/SchedulingProgressPerOrderModel.java +++ b/libreplan-webapp/src/main/java/org/libreplan/web/reports/SchedulingProgressPerOrderModel.java @@ -129,6 +129,7 @@ public class SchedulingProgressPerOrderModel implements ISchedulingProgressPerOr private void initializeResourceAllocations(Set<ResourceAllocation<?>> resourceAllocations) { for (ResourceAllocation<?> each: resourceAllocations) { each.getAssignedHours(); + each.getDerivedAllocations().size(); } } From a7e0e1b5ccf01cedc063bac101037bdb8856ff70 Mon Sep 17 00:00:00 2001 From: Manuel Rego Casasnovas <rego@igalia.com> Date: Fri, 27 Apr 2012 14:25:53 +0200 Subject: [PATCH 057/108] Bug #1423: Fix bug adding root task to graph FEA: ItEr76S04BugFixing --- .../org/libreplan/web/planner/tabs/MonteCarloTabCreator.java | 1 + 1 file changed, 1 insertion(+) diff --git a/libreplan-webapp/src/main/java/org/libreplan/web/planner/tabs/MonteCarloTabCreator.java b/libreplan-webapp/src/main/java/org/libreplan/web/planner/tabs/MonteCarloTabCreator.java index def10b900..344763e77 100644 --- a/libreplan-webapp/src/main/java/org/libreplan/web/planner/tabs/MonteCarloTabCreator.java +++ b/libreplan-webapp/src/main/java/org/libreplan/web/planner/tabs/MonteCarloTabCreator.java @@ -202,6 +202,7 @@ public class MonteCarloTabCreator { asLocalDate(order.getDeadline()), resourcesSearcher); GanttDiagramGraph<TaskElement, DependencyWithVisibility> graph = createFor( order, adapter); + graph.addTask(order.getAssociatedTaskElement()); graph.addTasks(order.getAllChildrenAssociatedTaskElements()); addDependencies(graph, order); return criticalPathCalculator.calculateCriticalPath(graph); From 88bc3f3f7799170ce3f861955ea687c8ec7d73b8 Mon Sep 17 00:00:00 2001 From: Diego Pino <dpino@igalia.com> Date: Fri, 27 Apr 2012 13:28:27 +0200 Subject: [PATCH 058/108] Remove dirs 'docs' and 'examples' from jqplot --- .../jqplot/docs/files/MIT-LICENSE-txt.html | 39 - .../webapp/jqplot/docs/files/changes-txt.html | 39 - .../webapp/jqplot/docs/files/gpl-2-0-txt.html | 39 - .../jqplot/docs/files/images/background.jpg | Bin 1101 -> 0 bytes .../jqplot/docs/files/images/basicline.png | Bin 17024 -> 0 bytes .../jqplot/docs/files/images/basiclogaxis.png | Bin 19902 -> 0 bytes .../docs/files/images/basiclogoptions.png | Bin 17207 -> 0 bytes .../jqplot/docs/files/images/basicoptions.png | Bin 19864 -> 0 bytes .../jqplot/docs/files/images/dualaxis.png | Bin 29672 -> 0 bytes .../webapp/jqplot/docs/files/images/logo.jpg | Bin 14632 -> 0 bytes .../jqplot/docs/files/images/navdocs.png | Bin 996 -> 0 bytes .../jqplot/docs/files/images/navdocsover.png | Bin 1006 -> 0 bytes .../jqplot/docs/files/images/navdownload.png | Bin 1236 -> 0 bytes .../docs/files/images/navdownloadover.png | Bin 1265 -> 0 bytes .../jqplot/docs/files/images/navexamples.png | Bin 1308 -> 0 bytes .../docs/files/images/navexamplesover.png | Bin 1332 -> 0 bytes .../jqplot/docs/files/images/navhome.png | Bin 858 -> 0 bytes .../jqplot/docs/files/images/navhomeover.png | Bin 886 -> 0 bytes .../webapp/jqplot/docs/files/images/new.png | Bin 13750 -> 0 bytes .../jqplot/docs/files/images/sample3.png | Bin 44781 -> 0 bytes .../jqplot/docs/files/images/samplesm.png | Bin 20874 -> 0 bytes .../docs/files/jqPlotCssStyling-txt.html | 39 - .../jqplot/docs/files/jqPlotOptions-txt.html | 292 --- .../files/jqplot-axisLabelRenderer-js.html | 47 - .../files/jqplot-axisTickRenderer-js.html | 71 - .../files/jqplot-canvasGridRenderer-js.html | 39 - .../jqplot/docs/files/jqplot-core-js.html | 385 ---- .../files/jqplot-divTitleRenderer-js.html | 39 - .../docs/files/jqplot-lineRenderer-js.html | 69 - .../files/jqplot-linearAxisRenderer-js.html | 61 - .../docs/files/jqplot-markerRenderer-js.html | 65 - .../docs/files/jqplot-shadowRenderer-js.html | 61 - .../docs/files/jqplot-shapeRenderer-js.html | 65 - .../docs/files/jqplot-themeEngine-js.html | 191 -- .../jqplot/docs/files/jqplot-toImage-js.html | 39 - .../docs/files/optionsTutorial-txt.html | 120 -- .../jqplot-BezierCurveRenderer-js.html | 45 - .../files/plugins/jqplot-barRenderer-js.html | 69 - .../plugins/jqplot-blockRenderer-js.html | 53 - .../plugins/jqplot-bubbleRenderer-js.html | 71 - .../jqplot-canvasAxisLabelRenderer-js.html | 63 - .../jqplot-canvasAxisTickRenderer-js.html | 79 - .../plugins/jqplot-canvasOverlay-js.html | 113 -- .../jqplot-categoryAxisRenderer-js.html | 46 - .../files/plugins/jqplot-ciParser-js.html | 39 - .../docs/files/plugins/jqplot-cursor-js.html | 93 - .../plugins/jqplot-dateAxisRenderer-js.html | 101 - .../plugins/jqplot-donutRenderer-js.html | 98 - .../files/plugins/jqplot-dragable-js.html | 45 - .../jqplot-enhancedLegendRenderer-js.html | 49 - .../plugins/jqplot-funnelRenderer-js.html | 87 - .../files/plugins/jqplot-highlighter-js.html | 80 - .../plugins/jqplot-logAxisRenderer-js.html | 47 - .../plugins/jqplot-mekkoAxisRenderer-js.html | 49 - .../plugins/jqplot-mekkoRenderer-js.html | 62 - .../plugins/jqplot-meterGaugeRenderer-js.html | 103 - .../files/plugins/jqplot-ohlcRenderer-js.html | 65 - .../files/plugins/jqplot-pieRenderer-js.html | 93 - .../files/plugins/jqplot-pointLabels-js.html | 72 - .../jqplot-pyramidAxisRenderer-js.html | 49 - .../jqplot-pyramidGridRenderer-js.html | 39 - .../plugins/jqplot-pyramidRenderer-js.html | 53 - .../files/plugins/jqplot-trendline-js.html | 67 - .../webapp/jqplot/docs/files/usage-txt.html | 58 - .../src/main/webapp/jqplot/docs/index.html | 1 - .../webapp/jqplot/docs/index/Classes.html | 70 - .../main/webapp/jqplot/docs/index/Files.html | 34 - .../webapp/jqplot/docs/index/Functions.html | 66 - .../webapp/jqplot/docs/index/General.html | 42 - .../webapp/jqplot/docs/index/General2.html | 42 - .../webapp/jqplot/docs/index/General3.html | 42 - .../webapp/jqplot/docs/index/General4.html | 46 - .../webapp/jqplot/docs/index/General5.html | 46 - .../webapp/jqplot/docs/index/General6.html | 34 - .../webapp/jqplot/docs/index/General7.html | 58 - .../main/webapp/jqplot/docs/index/Hooks.html | 46 - .../webapp/jqplot/docs/index/Properties.html | 42 - .../webapp/jqplot/docs/index/Properties2.html | 42 - .../webapp/jqplot/docs/index/Properties3.html | 46 - .../webapp/jqplot/docs/index/Properties4.html | 50 - .../webapp/jqplot/docs/index/Properties5.html | 34 - .../webapp/jqplot/docs/index/Properties6.html | 58 - .../webapp/jqplot/docs/javascript/main.js | 836 -------- .../jqplot/docs/javascript/searchdata.js | 182 -- .../webapp/jqplot/docs/search/ClassesA.html | 20 - .../webapp/jqplot/docs/search/ClassesD.html | 20 - .../webapp/jqplot/docs/search/ClassesG.html | 20 - .../webapp/jqplot/docs/search/ClassesH.html | 20 - .../webapp/jqplot/docs/search/ClassesJ.html | 20 - .../webapp/jqplot/docs/search/ClassesL.html | 20 - .../webapp/jqplot/docs/search/ClassesS.html | 20 - .../jqplot/docs/search/ClassesSymbols.html | 20 - .../webapp/jqplot/docs/search/ClassesT.html | 20 - .../webapp/jqplot/docs/search/ClassesV.html | 20 - .../webapp/jqplot/docs/search/FilesJ.html | 20 - .../webapp/jqplot/docs/search/FunctionsC.html | 20 - .../webapp/jqplot/docs/search/FunctionsD.html | 20 - .../webapp/jqplot/docs/search/FunctionsG.html | 20 - .../webapp/jqplot/docs/search/FunctionsI.html | 20 - .../webapp/jqplot/docs/search/FunctionsM.html | 20 - .../webapp/jqplot/docs/search/FunctionsN.html | 20 - .../webapp/jqplot/docs/search/FunctionsR.html | 20 - .../webapp/jqplot/docs/search/FunctionsS.html | 20 - .../webapp/jqplot/docs/search/FunctionsZ.html | 20 - .../webapp/jqplot/docs/search/GeneralA.html | 20 - .../webapp/jqplot/docs/search/GeneralB.html | 20 - .../webapp/jqplot/docs/search/GeneralC.html | 20 - .../webapp/jqplot/docs/search/GeneralD.html | 20 - .../webapp/jqplot/docs/search/GeneralE.html | 20 - .../webapp/jqplot/docs/search/GeneralF.html | 20 - .../webapp/jqplot/docs/search/GeneralG.html | 20 - .../webapp/jqplot/docs/search/GeneralH.html | 20 - .../webapp/jqplot/docs/search/GeneralI.html | 20 - .../webapp/jqplot/docs/search/GeneralJ.html | 20 - .../webapp/jqplot/docs/search/GeneralL.html | 20 - .../webapp/jqplot/docs/search/GeneralM.html | 20 - .../webapp/jqplot/docs/search/GeneralN.html | 20 - .../webapp/jqplot/docs/search/GeneralO.html | 20 - .../webapp/jqplot/docs/search/GeneralP.html | 20 - .../webapp/jqplot/docs/search/GeneralR.html | 20 - .../webapp/jqplot/docs/search/GeneralS.html | 20 - .../jqplot/docs/search/GeneralSymbols.html | 20 - .../webapp/jqplot/docs/search/GeneralT.html | 20 - .../webapp/jqplot/docs/search/GeneralU.html | 20 - .../webapp/jqplot/docs/search/GeneralV.html | 20 - .../webapp/jqplot/docs/search/GeneralW.html | 20 - .../webapp/jqplot/docs/search/GeneralX.html | 20 - .../webapp/jqplot/docs/search/GeneralY.html | 20 - .../webapp/jqplot/docs/search/GeneralZ.html | 20 - .../webapp/jqplot/docs/search/HooksA.html | 20 - .../webapp/jqplot/docs/search/HooksE.html | 20 - .../webapp/jqplot/docs/search/HooksJ.html | 20 - .../webapp/jqplot/docs/search/HooksP.html | 20 - .../webapp/jqplot/docs/search/NoResults.html | 15 - .../jqplot/docs/search/PropertiesA.html | 20 - .../jqplot/docs/search/PropertiesB.html | 20 - .../jqplot/docs/search/PropertiesC.html | 20 - .../jqplot/docs/search/PropertiesD.html | 20 - .../jqplot/docs/search/PropertiesE.html | 20 - .../jqplot/docs/search/PropertiesF.html | 20 - .../jqplot/docs/search/PropertiesG.html | 20 - .../jqplot/docs/search/PropertiesH.html | 20 - .../jqplot/docs/search/PropertiesI.html | 20 - .../jqplot/docs/search/PropertiesL.html | 20 - .../jqplot/docs/search/PropertiesM.html | 20 - .../jqplot/docs/search/PropertiesN.html | 20 - .../jqplot/docs/search/PropertiesO.html | 20 - .../jqplot/docs/search/PropertiesP.html | 20 - .../jqplot/docs/search/PropertiesR.html | 20 - .../jqplot/docs/search/PropertiesS.html | 20 - .../jqplot/docs/search/PropertiesT.html | 20 - .../jqplot/docs/search/PropertiesU.html | 20 - .../jqplot/docs/search/PropertiesV.html | 20 - .../jqplot/docs/search/PropertiesW.html | 20 - .../jqplot/docs/search/PropertiesX.html | 20 - .../jqplot/docs/search/PropertiesY.html | 20 - .../jqplot/docs/search/PropertiesZ.html | 20 - .../src/main/webapp/jqplot/docs/styles/1.css | 767 ------- .../src/main/webapp/jqplot/docs/styles/2.css | 174 -- .../main/webapp/jqplot/docs/styles/main.css | 2 - .../src/main/webapp/jqplot/examples/.htaccess | 7 - .../webapp/jqplot/examples/KCPsample4.csv | 25 - .../webapp/jqplot/examples/ajax-loader.gif | Bin 3208 -> 0 bytes .../src/main/webapp/jqplot/examples/area.html | 139 -- .../jqplot/examples/axisLabelTests.html | 157 -- .../examples/axisLabelsRotatedText.html | 229 --- .../examples/axisScalingForceTickAt.html | 242 --- .../webapp/jqplot/examples/bandedLine.html | 310 --- .../webapp/jqplot/examples/bar-charts.html | 219 -- .../jqplot/examples/barLineAnimated.html | 165 -- .../main/webapp/jqplot/examples/barTest.html | 299 --- .../webapp/jqplot/examples/bezierCurve.html | 125 -- .../webapp/jqplot/examples/blockPlot.html | 197 -- .../webapp/jqplot/examples/bubble-plots.html | 213 -- .../webapp/jqplot/examples/bubbleChart.html | 264 --- .../jqplot/examples/candlestick-charts.html | 209 -- .../webapp/jqplot/examples/candlestick.html | 322 --- .../jqplot/examples/cursor-highlighter.html | 137 -- .../customHighlighterCursorTrendline.html | 104 - .../jqplot/examples/dashboardWidget.html | 212 -- .../webapp/jqplot/examples/dashedLines.html | 227 --- .../jqplot/examples/data-renderers.html | 144 -- .../webapp/jqplot/examples/date-axes.html | 107 - .../examples/dateAxisLogAxisZooming.html | 105 - .../jqplot/examples/dateAxisRenderer.html | 292 --- .../main/webapp/jqplot/examples/example.js | 114 -- .../webapp/jqplot/examples/example.min.js | 1 - .../main/webapp/jqplot/examples/examples.css | 135 -- .../webapp/jqplot/examples/examples.min.css | 1 - .../jqplot/examples/fillBetweenLines.html | 134 -- .../jqplot/examples/hiddenPlotsInTabs.html | 225 -- .../webapp/jqplot/examples/images/logo.jpg | Bin 14632 -> 0 bytes .../main/webapp/jqplot/examples/index.html | 100 - .../images/ui-bg_flat_0_aaaaaa_40x100.png | Bin 180 -> 0 bytes .../images/ui-bg_flat_75_ffffff_40x100.png | Bin 178 -> 0 bytes .../images/ui-bg_glass_55_fbf9ee_1x400.png | Bin 120 -> 0 bytes .../images/ui-bg_glass_65_ffffff_1x400.png | Bin 105 -> 0 bytes .../images/ui-bg_glass_75_dadada_1x400.png | Bin 111 -> 0 bytes .../images/ui-bg_glass_75_e6e6e6_1x400.png | Bin 110 -> 0 bytes .../images/ui-bg_glass_95_fef1ec_1x400.png | Bin 119 -> 0 bytes .../ui-bg_highlight-soft_75_cccccc_1x100.png | Bin 101 -> 0 bytes .../images/ui-icons_222222_256x240.png | Bin 4369 -> 0 bytes .../images/ui-icons_2e83ff_256x240.png | Bin 4369 -> 0 bytes .../images/ui-icons_454545_256x240.png | Bin 4369 -> 0 bytes .../images/ui-icons_888888_256x240.png | Bin 4369 -> 0 bytes .../images/ui-icons_cd0a0a_256x240.png | Bin 4369 -> 0 bytes .../jquery-ui/css/ui-lightness/jquery-ui.css | 612 ------ .../css/ui-lightness/jquery-ui.min.css | 10 - .../examples/jquery-ui/js/jquery-ui.min.js | 473 ----- .../jquery-ui/js/jquery.effects.blind.js | 80 - .../jquery-ui/js/jquery.effects.blind.min.js | 14 - .../jquery-ui/js/jquery.effects.core.js | 890 -------- .../jquery-ui/js/jquery.effects.core.min.js | 32 - .../main/webapp/jqplot/examples/jsondata.txt | 1 - .../main/webapp/jqplot/examples/kcp_area.html | 250 --- .../main/webapp/jqplot/examples/kcp_cdf.html | 351 ---- .../webapp/jqplot/examples/kcp_engel.html | 244 --- .../webapp/jqplot/examples/kcp_lorenz.html | 510 ----- .../main/webapp/jqplot/examples/kcp_pdf.html | 387 ---- .../webapp/jqplot/examples/kcp_pyramid.html | 580 ------ .../webapp/jqplot/examples/kcp_pyramid2.html | 568 ------ .../webapp/jqplot/examples/line-charts.html | 193 -- .../webapp/jqplot/examples/mekkoCharts.html | 269 --- .../webapp/jqplot/examples/meterGauge.html | 179 -- .../src/main/webapp/jqplot/examples/nav.inc | 40 - .../jqplot/examples/pie-donut-charts.html | 160 -- .../main/webapp/jqplot/examples/pieTest.html | 187 -- .../main/webapp/jqplot/examples/pieTest2.js | 80 - .../main/webapp/jqplot/examples/pieTest4.html | 258 --- .../webapp/jqplot/examples/point-labels.html | 193 -- .../webapp/jqplot/examples/resizablePlot.html | 196 -- .../jqplot/examples/rotated-tick-labels.html | 216 -- .../examples/rotatedTickLabelsZoom.html | 118 -- .../webapp/jqplot/examples/smoothedLine.html | 137 -- .../examples/syntaxhighlighter/LGPL-LICENSE | 165 -- .../examples/syntaxhighlighter/MIT-LICENSE | 20 - .../syntaxhighlighter/scripts/shAutoloader.js | 17 - .../scripts/shAutoloader.min.js | 1 - .../scripts/shBrushJScript.js | 52 - .../scripts/shBrushJScript.min.js | 1 - .../syntaxhighlighter/scripts/shBrushXml.js | 69 - .../scripts/shBrushXml.min.js | 1 - .../syntaxhighlighter/scripts/shCore.js | 17 - .../syntaxhighlighter/scripts/shCore.min.js | 1 - .../syntaxhighlighter/styles/shCore.css | 226 --- .../syntaxhighlighter/styles/shCore.min.css | 1 - .../styles/shCoreDefault.css | 328 --- .../styles/shCoreDefault.min.css | 1 - .../styles/shThemeDefault.css | 117 -- .../styles/shThemeDefault.min.css | 1 - .../styles/shThemejqPlot.css | 138 -- .../styles/shThemejqPlot.min.css | 1 - .../main/webapp/jqplot/examples/theming.html | 519 ----- .../main/webapp/jqplot/examples/topbanner.inc | 9 - .../webapp/jqplot/examples/waterfall.html | 162 -- .../webapp/jqplot/examples/waterfall2.html | 231 --- .../main/webapp/jqplot/examples/yahooData.js | 1807 ----------------- .../webapp/jqplot/examples/yahooData.min.js | 1 - .../main/webapp/jqplot/examples/zoom1.html | 149 -- .../webapp/jqplot/examples/zoomOptions.html | 176 -- .../webapp/jqplot/examples/zoomProxy.html | 110 - .../main/webapp/jqplot/examples/zooming.html | 209 -- 262 files changed, 24721 deletions(-) delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/docs/files/MIT-LICENSE-txt.html delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/docs/files/changes-txt.html delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/docs/files/gpl-2-0-txt.html delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/docs/files/images/background.jpg delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/docs/files/images/basicline.png delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/docs/files/images/basiclogaxis.png delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/docs/files/images/basiclogoptions.png delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/docs/files/images/basicoptions.png delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/docs/files/images/dualaxis.png delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/docs/files/images/logo.jpg delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/docs/files/images/navdocs.png delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/docs/files/images/navdocsover.png delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/docs/files/images/navdownload.png delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/docs/files/images/navdownloadover.png delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/docs/files/images/navexamples.png delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/docs/files/images/navexamplesover.png delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/docs/files/images/navhome.png delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/docs/files/images/navhomeover.png delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/docs/files/images/new.png delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/docs/files/images/sample3.png delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/docs/files/images/samplesm.png delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/docs/files/jqPlotCssStyling-txt.html delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/docs/files/jqPlotOptions-txt.html delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/docs/files/jqplot-axisLabelRenderer-js.html delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/docs/files/jqplot-axisTickRenderer-js.html delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/docs/files/jqplot-canvasGridRenderer-js.html delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/docs/files/jqplot-core-js.html delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/docs/files/jqplot-divTitleRenderer-js.html delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/docs/files/jqplot-lineRenderer-js.html delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/docs/files/jqplot-linearAxisRenderer-js.html delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/docs/files/jqplot-markerRenderer-js.html delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/docs/files/jqplot-shadowRenderer-js.html delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/docs/files/jqplot-shapeRenderer-js.html delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/docs/files/jqplot-themeEngine-js.html delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/docs/files/jqplot-toImage-js.html delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/docs/files/optionsTutorial-txt.html delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/docs/files/plugins/jqplot-BezierCurveRenderer-js.html delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/docs/files/plugins/jqplot-barRenderer-js.html delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/docs/files/plugins/jqplot-blockRenderer-js.html delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/docs/files/plugins/jqplot-bubbleRenderer-js.html delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/docs/files/plugins/jqplot-canvasAxisLabelRenderer-js.html delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/docs/files/plugins/jqplot-canvasAxisTickRenderer-js.html delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/docs/files/plugins/jqplot-canvasOverlay-js.html delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/docs/files/plugins/jqplot-categoryAxisRenderer-js.html delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/docs/files/plugins/jqplot-ciParser-js.html delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/docs/files/plugins/jqplot-cursor-js.html delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/docs/files/plugins/jqplot-dateAxisRenderer-js.html delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/docs/files/plugins/jqplot-donutRenderer-js.html delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/docs/files/plugins/jqplot-dragable-js.html delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/docs/files/plugins/jqplot-enhancedLegendRenderer-js.html delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/docs/files/plugins/jqplot-funnelRenderer-js.html delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/docs/files/plugins/jqplot-highlighter-js.html delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/docs/files/plugins/jqplot-logAxisRenderer-js.html delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/docs/files/plugins/jqplot-mekkoAxisRenderer-js.html delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/docs/files/plugins/jqplot-mekkoRenderer-js.html delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/docs/files/plugins/jqplot-meterGaugeRenderer-js.html delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/docs/files/plugins/jqplot-ohlcRenderer-js.html delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/docs/files/plugins/jqplot-pieRenderer-js.html delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/docs/files/plugins/jqplot-pointLabels-js.html delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/docs/files/plugins/jqplot-pyramidAxisRenderer-js.html delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/docs/files/plugins/jqplot-pyramidGridRenderer-js.html delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/docs/files/plugins/jqplot-pyramidRenderer-js.html delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/docs/files/plugins/jqplot-trendline-js.html delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/docs/files/usage-txt.html delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/docs/index.html delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/docs/index/Classes.html delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/docs/index/Files.html delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/docs/index/Functions.html delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/docs/index/General.html delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/docs/index/General2.html delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/docs/index/General3.html delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/docs/index/General4.html delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/docs/index/General5.html delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/docs/index/General6.html delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/docs/index/General7.html delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/docs/index/Hooks.html delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/docs/index/Properties.html delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/docs/index/Properties2.html delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/docs/index/Properties3.html delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/docs/index/Properties4.html delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/docs/index/Properties5.html delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/docs/index/Properties6.html delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/docs/javascript/main.js delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/docs/javascript/searchdata.js delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/docs/search/ClassesA.html delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/docs/search/ClassesD.html delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/docs/search/ClassesG.html delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/docs/search/ClassesH.html delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/docs/search/ClassesJ.html delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/docs/search/ClassesL.html delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/docs/search/ClassesS.html delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/docs/search/ClassesSymbols.html delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/docs/search/ClassesT.html delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/docs/search/ClassesV.html delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/docs/search/FilesJ.html delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/docs/search/FunctionsC.html delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/docs/search/FunctionsD.html delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/docs/search/FunctionsG.html delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/docs/search/FunctionsI.html delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/docs/search/FunctionsM.html delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/docs/search/FunctionsN.html delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/docs/search/FunctionsR.html delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/docs/search/FunctionsS.html delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/docs/search/FunctionsZ.html delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/docs/search/GeneralA.html delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/docs/search/GeneralB.html delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/docs/search/GeneralC.html delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/docs/search/GeneralD.html delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/docs/search/GeneralE.html delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/docs/search/GeneralF.html delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/docs/search/GeneralG.html delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/docs/search/GeneralH.html delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/docs/search/GeneralI.html delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/docs/search/GeneralJ.html delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/docs/search/GeneralL.html delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/docs/search/GeneralM.html delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/docs/search/GeneralN.html delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/docs/search/GeneralO.html delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/docs/search/GeneralP.html delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/docs/search/GeneralR.html delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/docs/search/GeneralS.html delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/docs/search/GeneralSymbols.html delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/docs/search/GeneralT.html delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/docs/search/GeneralU.html delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/docs/search/GeneralV.html delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/docs/search/GeneralW.html delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/docs/search/GeneralX.html delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/docs/search/GeneralY.html delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/docs/search/GeneralZ.html delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/docs/search/HooksA.html delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/docs/search/HooksE.html delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/docs/search/HooksJ.html delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/docs/search/HooksP.html delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/docs/search/NoResults.html delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/docs/search/PropertiesA.html delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/docs/search/PropertiesB.html delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/docs/search/PropertiesC.html delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/docs/search/PropertiesD.html delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/docs/search/PropertiesE.html delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/docs/search/PropertiesF.html delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/docs/search/PropertiesG.html delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/docs/search/PropertiesH.html delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/docs/search/PropertiesI.html delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/docs/search/PropertiesL.html delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/docs/search/PropertiesM.html delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/docs/search/PropertiesN.html delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/docs/search/PropertiesO.html delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/docs/search/PropertiesP.html delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/docs/search/PropertiesR.html delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/docs/search/PropertiesS.html delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/docs/search/PropertiesT.html delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/docs/search/PropertiesU.html delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/docs/search/PropertiesV.html delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/docs/search/PropertiesW.html delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/docs/search/PropertiesX.html delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/docs/search/PropertiesY.html delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/docs/search/PropertiesZ.html delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/docs/styles/1.css delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/docs/styles/2.css delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/docs/styles/main.css delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/examples/.htaccess delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/examples/KCPsample4.csv delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/examples/ajax-loader.gif delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/examples/area.html delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/examples/axisLabelTests.html delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/examples/axisLabelsRotatedText.html delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/examples/axisScalingForceTickAt.html delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/examples/bandedLine.html delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/examples/bar-charts.html delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/examples/barLineAnimated.html delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/examples/barTest.html delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/examples/bezierCurve.html delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/examples/blockPlot.html delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/examples/bubble-plots.html delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/examples/bubbleChart.html delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/examples/candlestick-charts.html delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/examples/candlestick.html delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/examples/cursor-highlighter.html delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/examples/customHighlighterCursorTrendline.html delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/examples/dashboardWidget.html delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/examples/dashedLines.html delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/examples/data-renderers.html delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/examples/date-axes.html delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/examples/dateAxisLogAxisZooming.html delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/examples/dateAxisRenderer.html delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/examples/example.js delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/examples/example.min.js delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/examples/examples.css delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/examples/examples.min.css delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/examples/fillBetweenLines.html delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/examples/hiddenPlotsInTabs.html delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/examples/images/logo.jpg delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/examples/index.html delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/examples/jquery-ui/css/ui-lightness/images/ui-bg_flat_0_aaaaaa_40x100.png delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/examples/jquery-ui/css/ui-lightness/images/ui-bg_flat_75_ffffff_40x100.png delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/examples/jquery-ui/css/ui-lightness/images/ui-bg_glass_55_fbf9ee_1x400.png delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/examples/jquery-ui/css/ui-lightness/images/ui-bg_glass_65_ffffff_1x400.png delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/examples/jquery-ui/css/ui-lightness/images/ui-bg_glass_75_dadada_1x400.png delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/examples/jquery-ui/css/ui-lightness/images/ui-bg_glass_75_e6e6e6_1x400.png delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/examples/jquery-ui/css/ui-lightness/images/ui-bg_glass_95_fef1ec_1x400.png delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/examples/jquery-ui/css/ui-lightness/images/ui-bg_highlight-soft_75_cccccc_1x100.png delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/examples/jquery-ui/css/ui-lightness/images/ui-icons_222222_256x240.png delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/examples/jquery-ui/css/ui-lightness/images/ui-icons_2e83ff_256x240.png delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/examples/jquery-ui/css/ui-lightness/images/ui-icons_454545_256x240.png delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/examples/jquery-ui/css/ui-lightness/images/ui-icons_888888_256x240.png delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/examples/jquery-ui/css/ui-lightness/images/ui-icons_cd0a0a_256x240.png delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/examples/jquery-ui/css/ui-lightness/jquery-ui.css delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/examples/jquery-ui/css/ui-lightness/jquery-ui.min.css delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/examples/jquery-ui/js/jquery-ui.min.js delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/examples/jquery-ui/js/jquery.effects.blind.js delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/examples/jquery-ui/js/jquery.effects.blind.min.js delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/examples/jquery-ui/js/jquery.effects.core.js delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/examples/jquery-ui/js/jquery.effects.core.min.js delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/examples/jsondata.txt delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/examples/kcp_area.html delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/examples/kcp_cdf.html delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/examples/kcp_engel.html delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/examples/kcp_lorenz.html delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/examples/kcp_pdf.html delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/examples/kcp_pyramid.html delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/examples/kcp_pyramid2.html delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/examples/line-charts.html delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/examples/mekkoCharts.html delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/examples/meterGauge.html delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/examples/nav.inc delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/examples/pie-donut-charts.html delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/examples/pieTest.html delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/examples/pieTest2.js delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/examples/pieTest4.html delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/examples/point-labels.html delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/examples/resizablePlot.html delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/examples/rotated-tick-labels.html delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/examples/rotatedTickLabelsZoom.html delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/examples/smoothedLine.html delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/examples/syntaxhighlighter/LGPL-LICENSE delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/examples/syntaxhighlighter/MIT-LICENSE delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/examples/syntaxhighlighter/scripts/shAutoloader.js delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/examples/syntaxhighlighter/scripts/shAutoloader.min.js delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/examples/syntaxhighlighter/scripts/shBrushJScript.js delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/examples/syntaxhighlighter/scripts/shBrushJScript.min.js delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/examples/syntaxhighlighter/scripts/shBrushXml.js delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/examples/syntaxhighlighter/scripts/shBrushXml.min.js delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/examples/syntaxhighlighter/scripts/shCore.js delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/examples/syntaxhighlighter/scripts/shCore.min.js delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/examples/syntaxhighlighter/styles/shCore.css delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/examples/syntaxhighlighter/styles/shCore.min.css delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/examples/syntaxhighlighter/styles/shCoreDefault.css delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/examples/syntaxhighlighter/styles/shCoreDefault.min.css delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/examples/syntaxhighlighter/styles/shThemeDefault.css delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/examples/syntaxhighlighter/styles/shThemeDefault.min.css delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/examples/syntaxhighlighter/styles/shThemejqPlot.css delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/examples/syntaxhighlighter/styles/shThemejqPlot.min.css delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/examples/theming.html delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/examples/topbanner.inc delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/examples/waterfall.html delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/examples/waterfall2.html delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/examples/yahooData.js delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/examples/yahooData.min.js delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/examples/zoom1.html delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/examples/zoomOptions.html delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/examples/zoomProxy.html delete mode 100644 libreplan-webapp/src/main/webapp/jqplot/examples/zooming.html diff --git a/libreplan-webapp/src/main/webapp/jqplot/docs/files/MIT-LICENSE-txt.html b/libreplan-webapp/src/main/webapp/jqplot/docs/files/MIT-LICENSE-txt.html deleted file mode 100644 index c85ecee85..000000000 --- a/libreplan-webapp/src/main/webapp/jqplot/docs/files/MIT-LICENSE-txt.html +++ /dev/null @@ -1,39 +0,0 @@ -<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> - -<html><head><title>MIT License - - - - - - - - - -

    Copyright © 2009-2011 Chris Leonello

    Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

    The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

    THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

    - -
    - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/docs/files/changes-txt.html b/libreplan-webapp/src/main/webapp/jqplot/docs/files/changes-txt.html deleted file mode 100644 index b7bc13c03..000000000 --- a/libreplan-webapp/src/main/webapp/jqplot/docs/files/changes-txt.html +++ /dev/null @@ -1,39 +0,0 @@ - - -Change Log - - - - - - - - - -

    1.0.0b2

    • Major improvements in memory usage: ** Merged in changes from Timo Besenruether to reuse canvas elements and improve memory performance.  ** Fixed all identifiable DOM leaks.  ** Mergged in changes from cguillot for memory improvements in IE < 9.
    • Added vertical and dashed vertical line support for canvas overlay.
    • Fixed bug where initially hidden plots would not display.
    • Fixed bug with point labels and null data points.
    • Updated to jQuery 1.6.1.
    • Improved pie slice margin calculation and fixed slice margin and pie positioning with small slices.
    • Improved bar renderer so bars always start at 0 if: ** The axis is a linear axis (not log/date).  ** There are no other line types besides bars attached to the axis.  ** The data on the axis is all >= 0.  ** The user has not specified a pad, padMin or forceTickAt0 = true option.
    • Modified tick prefix behavious so prefix no added to all ticks, even if format string is specified.
    • Fix to ensure original tick formats are applied when zooming and resetting zoom.
    • Updated auto tick format string so format adjusted when zooming.
    • Modified auto tick computation to put less ticks on small plots and more ticks on large plots.
    • Update bubble render to support gradients in IE 9.

    1.0.0b1

    • Much improved tick generation algorithm to get precise rounded tick values (Thanks Scott Prahl!).
    • Auto compute tick format string if none is provided.
    • Much better “slicing” of pie charts when using “sliceMargin” option to set a gap between the slices.
    • Expanded canvasOverlay plugin to create arbitrary dashed and solid horizontal and vertical lines on top of plot.
    • Added defaultColors and defaultNegativeColors options to $.jqplot.config.
    • Fixed issue #318, highlighter & bar renderer incompatability.
    • Improve highlighter tooltip positioning with negative bars.
    • Fixed #305, mispelling of jqlotDragStart and jqlotDragStop.  MUST NOW BIND TO jqplotDragStart and jqplotDragStop.
    • Fixed #290, some variables left in global scope.
    • Fixed #289, OHLC line widths hard coded at 1.5.  Now set by lineWidth option.
    • Fixed #296 for determining databounds on log axes.
    • Updated to jQuery 1.5.1
    • Fixed waterfall plot to ensure first and last bars always fill to zero.
    • Added lineJoin and lineCap option to series lines.
    • Bar widths now based on width of grid, not plot target for better scaling.
    • Added looseZoom option to cursor so zooming can produce well rounded ticks.
    • Added forceTickAt0 and forceTickAt100 options to ensure there will always be a tick at 0 or 100 in the plot.
    • Fixed bug where cursor legend didn’t honor series showLabel option.

    1.0.0a

    • Series can now be moved forward or backward in stack to e.g. bring a line forward when mousing over a point.
    • Can now move outside of grid area while zooming.  Can have zoom constrained to grid area or allow zooming outside.
    • Fixed issue #142 with tooltip drawn on top of event canvas, hiding mouse events.
    • Fixed #147 where pie slices with 0 value not rendering properly in IE.
    • Fixed #130 where stack data not sorted properly.
    • Fixed bug with null values not handled properly in category axes.
    • Fixed #156 where pie charts not rendering on QTWebKit.
    • Now using feature detection for canvas and canvas text capability rather than browser version.
    • Added enahncedLegendRenderer plugin to allow multi row/column legends and clickable labels to show/hide series.
    • Added fillToValue option to allow filled line plot to fill to an arbitrary value.
    • Added block plot plugin.
    • Added funnel type charts.
    • Added meter gauge type charts.
    • Added plot theming support.
    • $.jqplot.config.enablePlugins now false by default.
    • Implemented highlighting on bar, pie, donut, funnel, etc. charts.
    • Fix to pointlabels plugin to align labels properly on multi series plots.
    • Added custom error handling to display error message in plot area.
    • Fixed issue where would call to draw grid border of 0 width would result in a default border being drawn.
    • Added options to place legend outside of grid and shrink grid so everything stays within plot div.
    • Fixed bug in color generator so now calls to get() continually cycle through colors just like next().
    • Added defaultAxisStart option.
    • Added gradient fills to bubbles.
    • Added bubble charts.
    • Added showLabels option to bubble charts.
    • Pass bubble radius to event callback in bubble charts.
    • Fixed #207, typo in docs.
    • Fixed #206 where “value” pie slice data labels were displaying wrong value.
    • Fixed #147 with 0 value slices in IE6.
    • Fixed issue #241, disabled varyBarColor option in stacked charts.
    • Added dataRenderer option to allow custom processors for JSON, AJAX and anywhere else you might want to get data.
    • Fixed null value handling so plot now properly skip or join over nulls.
    • Fixed showTicks and showTickMarks option conflicts.
    • Fixed issue #185 where pointLabels plugin incompatibility could crash pie, donut and other plots.
    • Fixed #23 and #143 to obey gridPadding option.
    • Fixed #233 with highlighter tooltip separator.
    • Fixed #224 where type checking failing on GWT.
    • Fixed #272 with pie highlighting not working on replot.
    • Memory performance improvements.
    • Changes to build script so everything should build when pulled from repo.
    • Fixed issue #275, IE 6/7 don’t support array indexing of strings.
    • Added event listener hooks for mouseUp, mouseDown, etc. to all line plots.
    • Fixed bug with highlighter not working when null in data.
    • Updated to jQuery 1.4.4
    • Fixed bug where donut plots showed value of radians of slice instead of actual data.
    • Reverted to excanvas r3 so IE8 no longer has to emulate IE7.
    • Added tooltipContentEditor option to highlighter, allowing callback to manipulate tooltip content at run time (thanks Tim Bunce!).
    • Fixed bug where axes scale not resetting.
    • Fixed bug with date axes where data bounds not properly set.
    • Fixed issue where tick marks disappear if grid lines turned off.
    • Updated replot method to allow passing in axes options for more control.
    • Added experimental support for “broken” axes.
    • Fixed bug with pies where pies with 0 valued slices did not draw correctly.
    • Added canvasOverlay plugin to allow drawing of arbitrary shapes on a canvas over the plot.
    • Added option to display arbitrary text/html (message, animated gif, etc.) if plot is constructed without data.  Allow a “data loading” indicator to be shown.
    • Added resetAxisValues method to manually update axis ticks without redrawing the plot.
    • Fix to labels on negative bars so label postiion of ‘n’ will be below a negative bar, just as it is above a positive bar (thanks guigod!).
    • Added thousands separator character (‘) to sprintf formatting (thanks yuichi1004!).
    • Re-factored date parsing/formatting to use new jsDate module which does not extend the Date prototype.

    0.9.7

    • Added Mekko chart plot type with enhanced legend and axes support.
    • Implemented vertical waterfall charts.  Can create waterfall plot as option to bar chart.  See examples folder of distribution.
    • Enhanced plot labels for waterfall style.
    • Enhanced bar plots so you can now color each bar of a series independently with the “varyBarColor” option.
    • Re-factored series drawing so that each series and series shadow drawn on it’s own canvas.  Allows series to be redrawn independently of each other.
    • Added additional default series colors.
    • Added useNegativeColors option to turn off negative color array and use only seriesColors array to define all bar/filled line colors.
    • Fix css for cursor legend.
    • Modified shape renderer so rectangles can be stroked and filled.
    • Re-factored date methods out of dateAxisRenderer so that date formatter and methods can be accesses outside of dateAxisRenderer plugin.
    • Fixed #132, now trigger series change event on plot target instead of drag canvas.
    • Fixes issue #116 where some source files had mix of tabs and spaces for indentation.  Should have been all spaces.
    • Fixed issue #126, some links broken in docs section of web site.
    • Fixed issue #90, trendline plugin incompatibility with pie renderer.
    • Updated samples in examples folder of distribution to include navigation links if web server is set up to process .html files with php.

    0.9.6

    • New, easier to use, replot() method for placing plots in tabs, accordions, resizable containers or for changing plot parameters programmatically.
    • Updated legend renderer for pie charts to draw swatches which will print correctly.
    • Fixed issue #118 with patch from taum so autoscale option will honor tickInterval and numberTicks options
    • Fix to plot diameter calculation for initially hidden plots.
    • Added examples for making plots in jQuery UI tabs and accordions.
    • Fixed issue #120 where pie chart with single slice not displaying correctly in IE and Chrome

    0.9.5.2

    • Fixed #102 where double clicking on plot that has zoom enabled, but has not been zoomed resulted in error.
    • Fixed bug where candlestick coloring options not working.
    • Added option to turn individual series labels off in the legend.

    0.9.5.1

    • Fixed bug where tooltip not working with OHLC and candlestick charts.
    • Added additional marker styles: plus, X and dash.

    0.9.5

    • Implemented “zoomProxy”.  zoomProxy allows zooming one plot from another such as an overview plot.
    • Zooming can now be constrained to just x or y axis.
    • Enhanced cursor plugin with vertical “dataTracking” line.  This is a line at the cursor location with a readout of data points at the line location which are displayed in the chart legend.
    • Changed cursor tooltip format string.  Now one format string is used for entire tooltip.
    • Added mechanisms to specify plot size when plot target is hidden or plot height/width otherwise cannot be determined from markup.
    • Added $.jqplot.config object to specify jqplot wide configuration options.  These include enablePlugins to globally set the default plugin state on/off and defaultHeight/defaultWidth to specify default plot height/width.
    • Added fillToZero option which forces filled charts to fill to zero as opposed to axis minimum.  Thus negative filled bar/line values will fill upwards to zero axis value.
    • Added option to disable stacking on individual lines.
    • Changed targetId property of the plot object so it now includes a “#” before the id string.
    • Improved tick and body sizing of Open Hi Low Close and candlestick charts.
    • Removed lots of web site related files from the repository.  This means that, if working from the sources, user’s won’t be able to build the jqplot web site and the docs/tests that are hosted on that site.  The minified and compressed distribution packages will build fine.
    • Lots of examples were added to a separate examples directory to better show functionality of jqPlot for local testing with the distribution.
    • Many various bug fixes and other minor enhancements.

    0.9.4

    • Implemented axis labels.  Labels can be rendered in div tags or as canvas elements supporting rotated text.
    • Improved rotated axis label positioning so labels will start or end at a tick position.
    • Fixed bug where an empty data series would hang plot rendering.
    • completed issue #66 for misc. improvements to documentation.
    • Fixed issue #64 where the same ID’s were assigned to cursor and highlighter elements.
    • Added option to legend to encode special HTML characters.
    • Fixed undesirable behavior where point labels for points off the plot were being rendered.
    • Added edgeTolerance option to point label renderer to control rendering of labels near plot edges.

    0.9.3

    • Preliminary support for axis labels.  Currently rendered into DIV tags, so no rotated label support.  This feature is currently experimental.
    • Fixed bug #52, needed space in tick div tag between style and class declarations or plot failed in certain application doctypes.
    • Fixed issue #54, miter style line join for chart lines causing spikes at steep changes in slope.  Changed miter style to round.
    • Added examples for new autoscaling algorithm.
    • Fixed bug #57, category axis labels disappear on redraw()
    • Improved algorithm which controlled maximum number of labels that would display on a category axis.
    • Fixed bug #45 where null values causing errors in plotData and gridData.
    • Fixed issue #60 where seriesColors option was not working.

    0.9.2

    • Fixed bug #45 where a plot could crash if series had different numbers of points.
    • Fixed issue #50, added option to turn off sorting of series data.
    • Fixed issue #31, implemented a better axis autoscaling algorithm and added an autoscale option.

    0.9.1

    • Fixed bug #40, when axis pad, padMax, padMin set to 0, graph would fail to render.
    • Fixed bug #41 where pie and bar charts not rendered correctly on redraw().
    • Fixed bug #11, filled stacked line plots not rendering correctly in IE.
    • Fixed bug #42 where stacked charts not rendering with string date axis ticks.
    • Fixed bug in redraw() method where axes ticks were not reset.
    • Fixed “jqplotPreRedrawEvent” that should have been named “jqplotPostRedraw” event.

    0.9.0

    • Added Open Hi Low Close charts, Candlestick charts and Hi Low Close charts.
    • Added support for arbitrary labels on the data points.
    • Enhanced highlighter plugin to allow custom formatting control of entire tooltip.
    • Enhanced highlighter to support multiple y values in a data point.
    • Fixed bug #38 where series with a single point with a negative value would fail.
    • Improvements to examples to show what plugins to include.
    • Expanded documentation for some of the plugins.

    0.8.5

    • Added zooming ability with double click or single click options to reset zoom.
    • Modified default tick spacing algorithm for date axes to give more space to ticks.
    • Fixed bug #2 where tickInterval wasn’t working properly.
    • Added neighborThreshold option to control how close mouse must be to point to trigger neighbor detection.
    • Added double click event handler on plot.

    0.8.0

    • Support for up to 9 y axes.
    • Added option to control padding at max/min bounds of axes separately.
    • Closed issue #21, added options to control grid line color and width.
    • Closed issue #20, added options to filled line charts to stoke above fill and customize fill color and transparency.
    • Improved structure of on line documentation to make usage and options docs default.
    • Added much documentation on options and css styling.

    0.7.1

    • Bug fix release
    • Fixed bug #6, missing semi-colons messing up some javascript compressors.
    • Fixed bug #13 where 2D ticks array of [values, labels] would fail to renderer with DateAxisRenderer.
    • Fixes bug #16 where pie renderer overwriting options for all plot types and crashing non pie plots.
    • Fixes bug #17 constrainTo dragable option mispelled as “contstrainTo”.  Fixed dragable color issue when used with trend lines.

    0.7.0

    • Pie chart support
    • Enabled tooltipLocation option in highlighter.
    • Highlighter Tooltip will account for mark size and highlight size when positioning itself.
    • Added ability to show just x, y or both axes in highlighter tooltip.
    • Added customization of separator between axes values in highlighter tooltip.
    • Modified how shadows are drawn for lines, bars and markers.  Now drawn first, so they are always behind the object.
    • Adjustments to shadow parameters on lines to account for new shadow positioning.
    • Added a ColorGenerator class to robustly return next available color for a plot with wrap around to first color at end.
    • Udates to docs about css file.
    • Fixed bug with String x values in series and IE error on sorting (Category Axis).
    • Added cursor changes in dragable plugin when cursor near dragable point.

    0.6.6b

    • Added excanvas.js and excanvas.min.js to compressed distributions.
    • Added example/test html pages I had locally into repository and to compressed distributions.

    0.6.6a

    • Removed absolute positioning from dom element and put back into css file.
    • Duplicate of 0.6.6 with a suffix to unambiguously differentiate between previously posted 0.6.6 release.

    0.6.6

    • Fixed bug #5, trend line plugin failing when no trend line options specified.
    • Added absolute position css spec to axis tick dom element.
    • Enhancement to category axes, more intuitive handling of series with missing data values.

    0.6.5

    • Fixed bug #4, series of unequal data length not rendering correctly.  This is a bugfix release only.

    0.6.4

    • Fixed bug (issue #1 in tracker) where flat line data series (all x and/or y values are euqal) or single value data series would crash.

    0.6.3

    • Support for stacked line (a.k.a. area) and stacked bar (horizontal and vertical) charts.
    • Refactored barRenderer to use default shape and shadow renderers.
    • Added info (contacts & support information) page to web site.

    0.6.2

    • This is a minor upgrade to docs and build only.  No functionality has changed.
    • Ant build script generates entire site, examples, tests and distribution.
    • Improvements to documentation.

    0.6.1

    • New sprintf implementation from Ash Searle that implements %g.
    • Fix to sprintf e/f formats.
    • Created new format specifier, %p and %P to preserve significance.
    • Modified p/P format to better display larger numbers.
    • Fixed and simplified significant digits calculation for sprintf.
    • Added option to have cursor tooltip follow the mouse or not.
    • Added options to change size of highlight.
    • Updates to handle dates like ‘6-May-09’.
    • Mods to improve look of web site.
    • Updates to documentation.
    • Added license and copyright statement to source files.

    0.6.0

    • Added rotated text support.  Uses native canvas text functionality in browsers that support it or draws text on canvas with Hershey font
    • metrics for non-supporting browsers.
    • Removed lots of lint in js code.
    • Moved tick css from js code into css file.
    • Fix to tick positioning css.  y axis ticks were positioned to wrong side of axis div.
    • Re-factored axis tick renderer instantiation into the axes renderers themselves.

    For changes prior to 0.6.0 release, please see change log at http://bitbucket.org/cleonello/jqplot/changesets/

    - -
    - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/docs/files/gpl-2-0-txt.html b/libreplan-webapp/src/main/webapp/jqplot/docs/files/gpl-2-0-txt.html deleted file mode 100644 index b6d79c039..000000000 --- a/libreplan-webapp/src/main/webapp/jqplot/docs/files/gpl-2-0-txt.html +++ /dev/null @@ -1,39 +0,0 @@ - - -GPL Version 2 - - - - - - - - - -

    GNU GENERAL PUBLIC LICENSE Version 2, June 1991

    Copyright © 1989, 1991 Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed.

    Preamble

    The licenses for most software are designed to take away your freedom to share and change it.  By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users.  This General Public License applies to most of the Free Software Foundation’s software and to any other program whose authors commit to using it.  (Some other Free Software Foundation software is covered by the GNU Lesser General Public License instead.)  You can apply it to your programs, too.

    When we speak of free software, we are referring to freedom, not price.  Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things.

    To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights.  These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it.

    For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have.  You must make sure that they, too, receive or can get the source code.  And you must show them these terms so they know their rights.

    We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software.

    Also, for each author’s protection and ours, we want to make certain that everyone understands that there is no warranty for this free software.  If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors’ reputations.

    Finally, any free program is threatened constantly by software patents.  We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary.  To prevent this, we have made it clear that any patent must be licensed for everyone’s free use or not licensed at all.

    The precise terms and conditions for copying, distribution and modification follow.

    GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION

    0.  This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License.  The “Program”, below, refers to any such program or work, and a “work based on the Program” means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language.  (Hereinafter, translation is included without limitation in the term “modification”.)  Each licensee is addressed as “you”.

    Activities other than copying, distribution and modification are not covered by this License; they are outside its scope.  The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program).  Whether that is true depends on what the Program does.

    1.  You may copy and distribute verbatim copies of the Program’s source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program.

    You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee.

    2.  You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions:

    a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change.

    b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License.

    c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License.  (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.)

    These requirements apply to the modified work as a whole.  If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works.  But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it.

    Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program.

    In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License.

    3.  You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following:

    a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or,

    b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or,

    c) Accompany it with the information you received as to the offer to distribute corresponding source code.  (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.)

    The source code for a work means the preferred form of the work for making modifications to it.  For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable.  However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable.

    If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code.

    4.  You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License.  Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License.  However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance.

    5.  You are not required to accept this License, since you have not signed it.  However, nothing else grants you permission to modify or distribute the Program or its derivative works.  These actions are prohibited by law if you do not accept this License.  Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it.

    6.  Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions.  You may not impose any further restrictions on the recipients’ exercise of the rights granted herein.  You are not responsible for enforcing compliance by third parties to this License.

    7.  If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License.  If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all.  For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program.

    If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances.

    It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices.  Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice.

    This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License.

    8.  If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded.  In such case, this License incorporates the limitation as if written in the body of this License.

    9.  The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time.  Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns.

    Each version is given a distinguishing version number.  If the Program specifies a version number of this License which applies to it and “any later version”, you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation.  If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation.

    10.  If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission.  For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this.  Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally.

    NO WARRANTY

    11.  BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.

    12.  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.

    - -
    - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/docs/files/images/background.jpg b/libreplan-webapp/src/main/webapp/jqplot/docs/files/images/background.jpg deleted file mode 100644 index c15505294720a0e1d83a5c039e05298d080e8a54..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1101 zcmex=%kxU@K!VDr=Sy-4^*jU-vz?hwr zgN>b&osEryn}d@J1b{3aZY~}W2V@9DD-$a-Gbv!^|O!0je; zaq`9Wk6&J#G%H|hY_`JIz233ax_R@YC$CNjvr;*EeCylenMUVtu&zB*xN?$W<>6c0 zHNRNbUU$0lC%nhvtw2hjW9H$x-7!wzzP?GFFUq?1r|zdMB?WipMl^yL?H^S>H>IW~3b+w*PF{l*G= z_nYV(d9`=H{9~gd6|8TMl)XD$_%ZITrXkN(>EGA5Rm_W696sw=Oh3C diff --git a/libreplan-webapp/src/main/webapp/jqplot/docs/files/images/basicline.png b/libreplan-webapp/src/main/webapp/jqplot/docs/files/images/basicline.png deleted file mode 100644 index 1cc6bc69136dcce4bea1206afac445ae996c0e8c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17024 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 Ghx{*hLh2m= diff --git a/libreplan-webapp/src/main/webapp/jqplot/docs/files/images/basiclogaxis.png b/libreplan-webapp/src/main/webapp/jqplot/docs/files/images/basiclogaxis.png deleted file mode 100644 index 7c169633ac6e387f51c1f88400439b490b45cb23..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19902 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%0Dc;I#BfBZmY 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 diff --git a/libreplan-webapp/src/main/webapp/jqplot/docs/files/images/basicoptions.png b/libreplan-webapp/src/main/webapp/jqplot/docs/files/images/basicoptions.png deleted file mode 100644 index 4ea441c89adac7b20bc38d2a16c7d042791b722c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19864 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 xg7W$JUlD1FscxxC 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 WF>N{^fi7VDA}y{URxM%_^nU;^0A3UT diff --git a/libreplan-webapp/src/main/webapp/jqplot/docs/files/images/logo.jpg b/libreplan-webapp/src/main/webapp/jqplot/docs/files/images/logo.jpg deleted file mode 100644 index a12fffcd5e43de9e69d5b2e42842837972123577..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14632 zcmb7rbyOWev*+asE*E!qcPF?@aCZytF2UX1gF6IwcL)%IyF>60Bmoj^$@kvA-LwB~ zO`m(uOwUwz*K}9cud3#C^>r5jm6w*22Ef3;0A$||!0QWuNW#_9)ZNm8%*)2znoLGc zNrlYGk<64#$<+LH10eD5-v2{DAPD%6z#tG11OY=J5HJ`FfrW#GK;U4(U|0lLIQV}A zfki+>fJgjy@{h?s2LGOVEAVem{pXhdubp5Uzp^nX_a0RJk%Ft6)?H%dEnQ2a5l41CumxE*-XkXK2T6c&XL9IJmRhclT2 zq6IP{uL&vP zx^8^I`Q-m1X`V?YJ4tBRz{UhX35t!{2XG?mdXedmIs^K9fR${8t=6KSqnq-X0nt&h zkV*uYtBl{5NC=PyL`V=)?fia_HBh0gp?HRYsaYX*AQTQk^1gR>i}>p^Q9#U#*0b6! zsPe_aeP`m}4(^Zmv(AgUoqC`w|BlZUE9Ea zxYcp;-a3c77lbZY(+u&o$ z^RrdB7L6TPWDeP0^IGGy8&+Ur8_-7_n1MF1<4>07jQe65Wc<)?z5?;Cb(y<`Ee5X@ z)=Nc!N!#%{qA?zvo0#G!q-w(?t!*9{#K)!zYI*0Hrbb}Jg58 z024dq)#K83JSGq~yBaCSViNQF1G07Q-2{Jlzw-uc;YzNhI%KtB?dbCwk5JEw=9*5l z!;pZ!Vix)+hh}ZmNE-HvJ{NVf;*=u}a$j4>HKF;4gEpaQf^;iuGYlf41Q|l1^uTCO zbI2)Md#OGWng%h_o~DtkVq@0Y&>TFcm}nQdHId1w4hUhFp*sk}a49Uq#T45>QI1vv zLv?W!+eOs{Pt-&#|Gvj3e1bb*Jc|{mnmo2((RKLXXF0e?MC!Z!@L1VneAab=ea-BFz~LA~>(lBx*ntR~E{f+o<)3u#@; z_U)PrEk9p?+P3E?~V zwecr7)isnr1G`D)sSO^E`DmVO&y|iZ+Stu!)rKc+npnO%v!@6B5_@rGrG_qZEANP% z|CsN^`Ln;3zbAYD!&V$`$`VdoM#jM1-Tfo2fyc140-+u4hp}FQg|7$wtey9jy`GEs zfy3s+fl_Bn-ClK?JinuUtug!it`iU(H22|6rhJD#Igdz4h#WQ$#v5b5dMnTFIV=P; zqa8j-SNBC{f7PI2c6<+i?2ms<8HkkUobrxA4SOPZj2MhqC59Bnl$s@dD#g)pJh^+>hPxB0xa=^Lq0cJ$>+%X9 zYO6{eQ4bm1`nnZLJQDtCiAuUCV^SCcLtyV;!vc4*cW;fCl$2_nmKk>&N&oKg=;qR@ z)31&>t*!|q`o$$8AwaNKhxZ^QT;7X<;ygRX9%qg>*%8pCj2W2n^!0`1iOIInwVOBJ zzer@f!-4QycORt*m(yi!9D^$x{k0>v5DOA<{rFDv+)b*pNTbBKdfJ8?K9aYA-bNc* ze{_Mg6>icCqtUe4rM4e_=CsA-L?BNLn97|T0fCs9*yX~Hm{gg2xw8CeDw}Z5OqF0O z5I4ZE-La$h| zWgyM-=GZynXoaTcQvDCSpSwKB5&g9IFF&xJ$l*_n65?w4+nUnV?{2i(_&j19yr;{y zGHPtM0$sN>)s;BPwx?wy5f>E&Tng6oE{oJH#>Uk@YXZ}v9AEZ zyY8>&8E&v7%K?bNW_fMm-6@`O8Vibk9OcF{JK?}-x>o?@{;Bp?5iVk6OO2v=&$)Y~ zOjXZonI-jh(WD3S@8smHv;K`man^5Sj`tAI!ou$Thu=Rek;p!|GCL|eF;XVM)Ax9M z*3D~imE$^<)z;1Gy)TK4d}Qc^LR*ht1EcpABYSdm;$kzVU5WH+&4kfXsr1<9^~<1b zch09=-vCmC54FS<7DOD}SA*iT3Lf?E<2 zx(_xV7%R? zqlHnvEvu59#WD7xICFeeRh2Ojy*(0&B@4p>Ut}otgE(3c4M9AyS?})gvS`I7?R@`(dIU053e}8f5r^rOZkK6vK7@o1< z@BdjdsZm-)Z{XYHK8Ks5-1uHY%n?s~JsJlX1mWTCa$F0|`R2gyi}7SjqKUu>l61{0P?3N!bbXQY~sR zDhW}Kj=tPgO=s;&o8`)5(Wgz^}Ep9m(5S+>C zDHZcQlWetoD<_4aSM{g02JNnd0iy2vl59FW&w(GwyhBIj%;ROfeX9 z=s6_c+1_p%<0w(1VE2vf%e-Hbh$~xdJ3mJlHIGC^@NFAsqEeW(LocLB1G3VOLxP(T zFrWCd;t#S1uu3|SyiwhxqsGB;OL_*1CUf% z8qLnRW1a;@I_cb4LMOKkV)2i|lF{75aPGMW)ovtGJS^epHJ|?cmJ!AU>Xr0G zE=f5~nEdFq!x~HmImK(~#^f3qCqYKn9abAkbq+q;vljpcL4$fpF-R zz=FOcXQnm@Y=uizo^)_wi+{k6&Qmh}UCg)RO0W0neGUqQIbx2LqiUhy72rUpO5*!D z$jeq6m&xZLWB#Dbf@pvM5z%SKScK7(ijlsj@n%`t+UPTC)v3DMBPK*Cn<${V^f;7qESWu~S*qPL58-m^evj?$zT`_QX#JwP&5772Crj@;K#OEcQx zrtkFz^_E;Q0QxElNnL_^hu#+)59=FrhqESg=!L*mZ^^hl|1b?nIaGW}jr6eQZ?*)h z`!3kd-qr7Fzr7wM=)c(y0>c7P!N_p`7QnyR4?u@tki%lKt3t6T#7tetIIt<%IK@@e zT-}3{8=L0fxI~L^sJMC5O*}$UQU|Xj%-quU_W$d}!2n=IfDe&f-CgQS8!UZwa9z0> zk8HE&ix&Ip_zuHY>YI$5j+x3qg}d)n4-9+}R9kg?Ti`D8UICSQ39&g_0`02%sj}(` zz0@{)J-l@tn{nqNFy`{80vx@YX)!zU83z(wV<8&tM9Q2}lIu+si-myaSam(Ls5>iQ zz7e!++9uNL!{nq=3wMj3SVVVX_MCa9{NoqZ>jFI)Lx?flvo?$D>Th?$q(Z+8t5X=X6H=H65#Z}dqDlp@{0 z%_Y)zLV-l0&W7^6Q8yJ?hA~OSsZOhW+Nfy^@bemy|NIRew*fgfZ4WiQ$a$#c7?| zZW@Icc!w66GrdFroPe#-oO#2Y!)V-)fbKae?XhPH%neO`c5}ytVX+>JwzfWDBo;qy zOQG_bswHvxP!jSWzbC9bqdiyl z6-KiM=n11`Rjk__t*IJ}# zKxRtPd@bl%YHm$iJ|if?u2S!X8?seAwlj7`O9Y>`u zgCKIMJO!`ZT1wsGWgLXve|~o0pDk_7sE#p-`6Ie%ZYuz+@$lexDJ}J@{fj{G<2kCw z5_U&9w2Z`xSvlfxJe|gMM0&z z$&RGm6{4>d}rFC1>G$u_fIs{gHa-WF|(*OPeI5 z%;rFvN&ix&wt6D$bm!nQ&*|E87+hNUNHw@{thMnG{&~OX2M$rvUzyeklUxMkeENPb zfY=d)IlJQs4Lvh=iUNm0ZRK9GpsBtxCq3$-$Klhbgeovk92*=~KgvmmxX<}-k~kiV zaS8OKVvUlmHSURET8_>Y!pMOJYcQAywLB??coL__}*@|K{2{!RDKO3n|%;4v3o zPXW}WGFO$>IF6+HtX1J)f*+A!Edn)^p5~YCcWg$?Zpbvv@qUs0z;i=_v-bPN z5S)9NB={9iMLvxEX9DV91>|_Rj@w@zb=>3oCprdfq4f74r6V5vctzYH3#EjVgE@kX z@CgUd9?rvhL)APGgh{AgySgJ<+x2YLn8%GQrIAIL-~3~M8fN4O_EJ;4y!o{lXA^E7?-O!`C@$A)%V$r&2z+0a4L z3mSJ-th%D`Na^P?KFG}x5sEo#SxZY4-8WkPHYEoq!F#o4B4*BE{g<-kj73 z{5D>Q5mW)S(HJS~hv$w%$^`jXQ5|mV2AdO}>R)WyR&Lx#{<&)TT&zl$Q0>nN5`Yo@}ccHQ?GwYq=Iq_2c{x6R`0I7j->;9b0CS${TtJ z&F6E|AjcKmWvJA+ozDK!SI~}!ijrMlm-S_hB52pfjnmhV!J3yC@*%Rb)h`C$jiY^p zFAEy&bmn%k(|i^Vh(wbxj&0LF{Tje9>N%vfY>Khh^pvTNUshAwwcm`gCe^Zdy{Aw4 zv2^e%lB{T%x|J-cC1g)U-3HWNR6k!_xSwo*`5w1pvOf?(*>>CTce9I*mx*2`dR;wv zkFBuTCwFz*pKzH1BUTN6sX5miSju{W2hxI_^DnW(;xtc`n%b9ptTF;y@;qp>~*S7qmF>;pDZd>Xi7g zYATPG_#YhuJ}$*e#<$3i5aA(BJ0az-^sA+=nh!N(5#DtjU&RP^*W5K(wEmd<&1(JK zfd!AEnOd2-u*@TFXYR0l>APCC;;PC~do(|1O-BvAHT?t8!^_z?##1PIXt>E8U5ZV?eV5ihZ0_BOU{LBR=6$*~g?$O!bud zMivt`)F5g{{OSgY#r|Z?$lxbFsC%fRWT+(nf9N0DRYY3spW>Wio zL9Oj*)muwb`c}A6*`Oz@GXJYb0xQK*K?P7fU@ch7MUso5qb0MUqK8JoAbINOWGPVG zj%~scP!}ytxbf+hG2z&P=xa^X%7SIacP=m4iTTAztOJ`vEU8mhB5FrWH@A^_BMGLm z0!%qCQGWrrKsl-)I084sA&oZY!;{;7#>p`2(S=hgv?f zI!PFxNmZ7M7pVDw6jU{e*S)Fg^0Yi$8m=lZvp=kBeW#rM6-UI^hW84H5^LnjY9!cd zE7;LdxRXv|IX-w3Qd@+DS; zB>2A$&N(|c@xQ4c8=$0_hhj6Z4ROkjp+!+hY+?;&<%SaRdcXV1Cz!ZjjjXDni}yZN zw{yIH|E~lxE;4@z5p>8ljJVLilu!k>G>NgVDsp{BSCmJ~&8KJI ziB76uRay?^dp@K(dm!Yd**aAteg@a1GkT#@{>HnpmHrY|GI$9Y+Z7-MyUZaOYz!!| z=xO|t#zW`BD*@w$V(L&hdLD1TyE3mI_oSsMBCmnXdk9DS{z)2G?msG^yzU;uVH!n< zwg^%wl)sd?K+{6M%?=*z*^v{(^Kln0*4)c(O{iT%dX|7K%o!?r)B*Pkjmp){NjLu8 zt44)}?0NxO>C@fzSdYqK>%1k$wk8?*ryHV#%@;=&-T*{p?=HA-UIQ$eauA7Z8}c+5 zhc}rBWDj8%COZg7=Df7nlG$PzV=yOfsN`gm*G7z^9uFD_Ws`QmZy|h>BYtS4&ZXz> z_|;O(^odN+eg)sO_PbW9X^*~rCjliorYhSgx{$=VS~6XGJY1*25wfV zi~eSy?KJ9OT$If-s?19UuRB1ZQTZi5%q5gO*oYiGT&)6+T7>&VeQUZx{4GJa_$r4y z<;BipIKdFq)6XPHlIWNTmL;<-F->?Mz56ejYro0Wn8Uh!o{n8`4EeDNF;3s7UZ>es zBlZ3`>cj;!MD3r$_v?;W%r@U=x*)mP|iAch}Z;(WScYT($BaUXXvu#lf0 zPBh~RLISNH6R>MCN<^jtI?6q})Nn-7p2sa*X+uQHztvGvK+OYO>*IsJyc<4)OQ80q zX1b@}l$~Gv@&eTJ(lRb)6#QEnoJP>r+l7NU9zAEmM~eI@pam}Z}T4%^Jol*zyW4m`);;DSC9D{G_Vgq z)U$o-ffrz=K_D27$e=Q%1dL7|0qM@`;k2c~Xk z$y+n$E=i3qdNJW(`;eX(*0$vxyaIT=p}6+)6)DE)jvV^(m#eHyikTs%ODP57uYl67 zUU^d&ZAI$hxoJOn{rzeN^m@Knvsl6WV&PrQ)uRPg82Jr;4PZg> z%8W$qbdaN!tF_0(oz$9EOpEIw|C>W%wAROnI04uUydLz9T#;eSr>Lb}QuMth91u4# zx^{Ym2rdTY9^?aeE5;o0YMbR^;i3!2nZ`#-QoPN6sPvqLsSveH1Qjw-Fqka>^Me!5 z{?Ev3B9Yw(X>bnR!zo{m$V++WNj{^ zaMnkm<+%KQezK?GrJ^Ym23?ULAlH`7gDOC#prt-rnU9v3p_8N9dh*ElFsi*YPNsQR z*dwTX&UVYmyt}4bZfRnI8G;$8k^n2R()t{g`FSlrWb?ZmT*6*~glGm~;vc zWcR^b0}JoF2n0uA^ilgeo4Qc`jYdD@LvdavG>LR}c{4FOURW#N=j~~Zmw)hhpeBV> zrLn309vQAA57y0O>dbFD`G%bUZxT1y`%#|jopm!~p8W@D3N^Zfm(FP9_8+WFZJ9u8 zj#m4T%D>#iM;bp|PFVDQvtu(auh`+~`Z`==8Zc*Es>o*Bmggj7WYA^Ra>`np-!F=XXSj9-lWC~Eq zC_0rvHkfI$c}V~n9M=50m;ydQAq-Y(B9lra7FjSEn;8588WH&0uKX16e=ThErF+w1Q4HLGmYc|MF7|k!41>M!LWRL zQG7#aWP@^8;=usUSUgNgG7y-q0fvYzUWft~K1mX<0S16Efh;Z#?*@nG5{Y~(2i^Tb z7Nq>&p(?7*{}UL2K1wXIxkpp(v5!tzz;FugrtcdB zv*(C$FpynFx#yA-)jnzmV@z{>n>Bk!PU6VGgo`9)9h#iAgGa@ng4n3Ut8J{qzOVHe z(e&n68NtqTP%JpezEyjR3A}p>rQBn?s<@VAVR~pnb(9~Y$ z%gI9#E&LU{DRdtg_8%nhZ=i3CI666iT}(yQ6zc5qKQRjEADJiaA^ulfGs2@#;TnFjUB-!8L1X*e2?KXc!h<9X<=~NGB)_{2O33Wl(%&lpvwR}YWfY_0fu}# zDXk=Op4`Vln*;GLZPsCOq2_4{!DWfhCt_DC%K-!w#dT8!+#;frP*C~OL{~0jt8}tDI-hj`4fuDZ^{s(>j zgM5;qMP!YGb9?_CocV`+pjyqY42G+>k1^++12Pu-jD56c`NOyTidxO}U&Oeos`vfL zMcBBw$it!J=@@$!852UN+Xrur$NF>zeuztTGkkz5Va{D9XY=!iz4a0;I``NHT17 z8E&)CVVZyqu)i_^reYr8lS-HgcG%#@Xn`Hf{NSir9QaZed6OG(;Q}u%L63dj-wfxM zIbw!g`W7)0O>vcF7kwyzL_y`8%6p$vMWiDR?NYEapm^v{>=paz{(-S1PnS=|1z77h z>e%{-og%d|Kb?mcUnriHyybx9RCTCRr3e)fTLwdvgXK(W4n~IC3xR?DK90dzZw6Y^ zXY?E8(sGtn*iqq`E9=PE5Ja)a%no}@34A5Cp|Zirp)%FRnL++KgOnyjooD%!m`6rQ zEf;J!^w5YxI%@J#F3}aI5xw()VB(Zt)tkZ;iuoz<;l9#sf=PtV&QmJ5zCPy^Tf_w3 zFi4^m5eNGv;6dq<;-b26ds0QAfnJ~JKS@cK(RRqM ztujYI-cocOD<3$?8sx z95SD|fnAXEc|A#ONk_Cwa~c%+=Fni`MPrknG-2*cG_!`$9hn;>n++c<=e`$!7WEsS z0cHaxORJp?7qxcP5oDB==Es~FclQPLj0GPPwu2E%Ekcet5A7((%=Z{qQJ4Z%}$GoUKnk65f~ghHYlWSV_sIIs#24wvL&b>VK1 zj=t3^r_K=x1>v~ofmJ#oc^Fxb&2Ep6DOXzJ#jAsmYb+Z@2{YVFRrdju)a=^Kf-_!( ze*PFEgDT?p#xEW8u2Jq}5(@revT0RrSw7@eHkzHC&Pm%IX!KtpH107`vzXr=$eO1e zCJjT1@R}j!VA%cWqWOpz3m|%El^z+4CJ<%;>{RPe&4a=NgLA^xR%ysnW5X|e=|IS6 zQYZ634KD(XNCdb`Pu!IainIloe&}8>E2P3glIm7a9Oqkx@rH$tWSj^bRRGKBt9n{< z!fb-Zi+wjvdkcb18H{9wr z8mN)T=2thl$#+u&Q5D3FC+b_2CYUqkb|#+stZ4)_&SZ9jtnTZ^jQZ>77P3}?l8Wi1sZtxiH;*W!Qo&Smx{(m`;ZXVl zBLohsZx_SM?B^uf84NfDK1xhN6u6{UnMLJ61{^Llmmbi?ipKfs;8TV@L&iLS)Tj`w zD&DdW_$#igfd6QCVSVzoS?)Wf#N4!IQCpDN)~x~x|S*lnfX>i{c>u>FAV#mo!6h{`z5Q4p^OQvBe2%wXtXSuDwkm8&dq$da@T zCu`ZM`r`IdX2e3dHJ;AVBRNMsU0m3wKuw*NZ&LCF6y7-nRpoJRwOCc<*D>r0I_@-2 zXWN5tTJ%*orAFTov+Gn)?Y;sc#LlCBws`&`eyWgxF1AEXMPlv_;+DnjMV-gyORr0}wm4r|cRTI2Pnk&HAa zjo>5+62Z+8J#&((k)*tDFh2`Z(!c zz_>3Y$vmuh8=}(&r=Cj61MeVi1WcUfw+dHjYhg`~B-9{h3Q}EqB=o4?{P96rJq&RV zxcRe=W<@!jPBDEpCfyxcC{IClsm1av3VOz9St>=m;S4eqUjZRiK$FX(LqB|#`-04$ zGBx)7fKk_Q63bFHQhSrDrn&#i$gPNm5MLf?YUu3~Vw#IH=tCLyz$s_|@%l;3S!6EC zq;i&d5TB>h8Par@{j~>?THK`?j;#$n@=Dtz3|55^mUy(ivm6klcbB|(E0CGbAYyO1 z!c}|{4jpU4pkgDJ8+GNAbA@YET+{lFk(W~zS;g{v@A=ygTYqt@*+L-+$#p+hL2C5# z`z5XY0g*jMF%>Qw%WbRJfeO3y_nQW^XllV(1F9-m2@OPDXIOP)l&GQT7B0R)+@Rlt z;-IP~MCVt)kq!za#9zeG{4VWd55S*?KZFg@om^%W&}hZ-DOuT8`>N*Pf~Acb@bMNU zoef6zc{1jy@EVm15>Zd1RY`;b8o9^)R(WYSgRT`M5tOC`v+EO5)=$+oN2=;<^l69; ztyjiU7}CV45a0-7I|rk{Vifck9YkfuvuJ%az5Q-dT?tBPci-`Ze-i0{ODE%#FdsgU z9(@seW-Lhe(68E#sysHrk_%Z4!;Hr_T7$qZ>WOY?&4(vV=(nog!;$ zcD$NkLbLA!g|uIRJTSK#O!AC{nX?PI;?Mh*@&(BnA$9zg?rDv%v=WcVAXIys9}XT3 zU)Tv5%Lg^uDA`r44gTa=k%nEL>m8aE*H90m+H6PYTW)BY>W-S6w+pIReDTgE-)jM zxJBO#x`DSpB!_f|2^sJ6=4}GepY>nu>STLfv1wJu> zYr3*Ow$v&~Sphl09@5RQj$kf%>XmejrxE zlyTP?;FJQz4NC8~CIB|fso6RNaZP41S%OOChQdQM1nBD81d;ed+y1&9LlzIFq2vPc z;o&xCxJIN(q`bgo0m`UDv056+s0ugJO|19&xN9>5A1eY)&-Fk5*84SN1R>7X+^q3T zAg;ZT_-;Qe7O;9;Qr4VqYZSe>C{Kw zclKLl>UTCCa`6vIe&VN`;uE3RxnZ`;_JclRtk}0X3&Mzs=+lSspeoCZ`~k--ut-hA zby>3OQ^6(q$T^Li1g(`(Cpb<@`MuAmK-4aIPg=+Ap^d)DJnT!!QVF{vhyT8knvN!TDDwgl9WkW9Stf==;CDkcVKXfrRS>zgTDs043pQ=K z0Co}5up{LFEq=e2v;DhkCjrX@OpfgwF7FhzFvP1hQy)g!aFjnCJQ>P+!U?is@rmNF zT2=x~)rJ}{jA^#4G5)F{v$I;o`&F%W2$t;f!%?f7VHBpglqX_e1k!a$;hp_y^ zThvf!+@HkpUK*pVd7KK_qyj;UUi^ou*;aS{i zC2d4`{irst8-ABUwZwazyZR9nbRNA?1DO4&>e;GT25M_9)cD}_CPqo9=pOkraIB^T zMgZ?QwlP79B6f;AzaWcQOeQ$yp?{iaEj6d*lBUSQ*NwUmDC1&}%0O(&pQuU?V&On6 z=ic%)-{#@&EEQEvtvw8xdw~byz)n=lYNgVgzRDr_)9O1kHB)v zQqY7)gn3KDKH4Sek^#}sZ|lTHjbCB0W=oR@oD3JE0r@KEk{UliqcLB-Yq z3TAu{=Ky??u;R6u8CX>*Jq1w$nhJD&RMRFG6cz4t0k&%DczY0HiKeE}rGTFv0_$UB z6cC2>!s5oN;38v!#XT9IBGmIzd?0oqZlG5PW4lv%g&Fp(!Drv9ie`N4o*j=*P?Djs z_=ca@z(K~t2wUz?mh`7$ly{JKWpq^x`sg?}IKhfBMJU<9 z6d)H9Jqn*iV~@rvcHsdVIjrp>eIBfuBhAG};)zbaELx@yBk(+Pf9Q`p!|x0b)F%Q} zM*e13Q$rKU`=_6YG!}sd}VSw{NF&T5e*j zC`M9Z?b|8dCstRjLw(q=t%0-B8Qr7!8@2kV{2?P2g)IrJ`AI>i?bLE0(RKS-A!G@t z9aP=#!i5<^$ZwZV!LYwdTHmh`zIYAo zaBcZlV4?mmN&jrsuvA&Z13d{Y1b diff --git a/libreplan-webapp/src/main/webapp/jqplot/docs/files/images/navdocs.png b/libreplan-webapp/src/main/webapp/jqplot/docs/files/images/navdocs.png deleted file mode 100644 index 318ab04ebf00b044ce63572fada1b32f4eb2f58f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 996 zcmVPx#32;bRa{vGf6951U69E94oEQKA00(qQO+^RU1_1*t5+BUqd;kCdB6LMqbVF}# zZDnqB07G(RVRU6=Aa`kWXdp*PO;8|jZXjVGO<`k)sCPpE00T%#L_t(o!|m2vh*nh; z2k_tIl!js1OK2rT=mcpmcA@AZQLT!eiXt*HgGlnFY-)n&Ay$K=-9(qqnp9cnE}I>?+=G{&VR4H&RTozwf3fsHri;TjiJ#o z(g~%MgM+Aj*oGxo6cGnUYV-fX3CF<3NtldHlaZf#= z%G?Fmg;Q}S9zj2*M#Q(rJ1{bHxs?`UlqLgj<7dn&rA%uvcV|TW7!m6tq6hD$y;;XQ zr~!0V?{DEr+@#6eOZnZ4>xW_M9o&v9YqFFwDHkp@nJsuQB6bYYyCn6d<9ED*`2#gv zN*Rym)4y@pjD-=gtd&EDYAz!7WB7=d%GE;#mv}h?nw~4YJo(;I%23Vcuau`%TsJ0R zD=xiGFKISDqFZ%)9m~vJw;4<{#npO^V4*KrPN3Qfg`F?UPME_BO zJ2*(nj6ruqtjR2OVfL`(O8@RJ)mh`V{(zc#$3#eh&{s%?mkWT zTb~a6ko?0Dv44onjZ3+!;?7O^WyO7wa!SRWm2&d{5fRS}vj4QE=I+gBE0&Z}o{NZm zM{?-URx72P=hH+Q*m1~HFP1iCwEcGO_koZT%0cK$i@Cpa~$<(`oP6F53_U5 z&3I4Kpk_M)I@3^xCR+zm&csB#9uaF>1T&$OGDcGe*I|yP-rlHmKFHt}l~R7q@!lL; zS?PV8!ObtF{DP}A4dlPx#32;bRa{vGf6951U69E94oEQKA00(qQO+^RU1_1*#Hlfs<^Z)<=B6LMqbVF}# zZDnqB07G(RVRU6=Aa`kWXdp*PO;8|jZXjVGO<`k)sCPpE00UA;NK{tzR1|^HW)Mlfl(V%#5X5E|b)q1sFtt0;zC}R= zDG@#tfstYss97x*(ZzDYalQ2LJ8Q$A{kOZYu`mBG3}@#2&N*`~zjJ;+I_RK-4mubc zT@zKP%Is(h>mc@EE!N~keRQHW|1TUj2{ul^e5}ILQyowfT~L)-7q(#m7UEK@!-l-5 z?`|qIDt7_);bh!_hj0Yv=SBVXR0l>>F1FG$m?l-=P5gx3s>~L)(cPOD_4j#EZ_SIk zA8&`f-l-011k)SuZ{TsR@o%&N@hMdB7qmHiM8|@;nc0zSe04ckn6_BxC|L)<1zF#?7xgVacUH00oGMzcJ-LS1zw1NdLq*sg1@>d zv$2NHpFvM)@cJ+hyKyJMxE{l}rkz96TfT?m z5t**y{lrMbk^czpXbTk;gTB0|H%FEFFo@f*GS(LbeIzgH?bu$GS%xj~-^0@Inh{C* z63ekXFX{v14enlP`fUpbz6<_?c~Ku4qjEEY?rZSQ3Ho`1_gT>H2Jg(EJ4YCKQ9spU z|4FIm?ulnN)>dU!=0$yQG>49DwW`dH_wQEe3j;H;DKF}Gjg66B`=-Gg9*15N)7mZM zMg5#qwb$`G&cYLTshv)Mn*+Y`xI zfT2kC`_ggLFU^6AaW0mI&dqp78c<7(g6UzXORCo4pi3|ZujEC&rA;uit1_D*^}%&m zCiUBE4Vm{MxHVOo{Sxb|V{Nb@_fZ5lP?g!wxJnuze}vuBu~E8o%)zUe8@hG7Y){7B zvWZo3ppVF&CJlwTEpp$YCok&#A$K;uk|t&okLE=^5HcHZ*C_ui^P=t>g+D2G%LCYo z`|xmcAusA*r9K(NU)V3*WEPDC7IM3!ZT*FG5#KAFb1NI>mPvQlAsoUF7-;=x2OV_K cK?f7XKL>mBqVIr&G5`Po07*qoM6N<$f?Ma)NB{r; diff --git a/libreplan-webapp/src/main/webapp/jqplot/docs/files/images/navdownload.png b/libreplan-webapp/src/main/webapp/jqplot/docs/files/images/navdownload.png deleted file mode 100644 index 41723e77d18ea25299c4d8cebce3fea7c5adff63..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1236 zcmV;_1S|WAP)Px#32;bRa{vGf6951U69E94oEQKA00(qQO+^RU1_1*M1rUI6SO5S3B6LMqbVF}# zZDnqB07G(RVRU6=Aa`kWXdp*PO;8|jZXjVGO<`k)sCPpE00cNmL_t(&-tCxsh*eb- z#(y)8qCI?|1{Mf5=u|dEY7fK0Khn=2ijpFlN(rryq{Qg~7DEt8&h)^F0*UEeI7FoW z(Sp)SEozd19G}JHNTT3KSyQCe-2T|>bT_wq=bnpGV{ksWeCMpa_TFoK`*|*8$dDmJ zh71`p3?!;5tzc%k0@HDz8(0IhNXk{(=0GEgalE9S!S1hm0QwjPOa@i~PyO2o{U1>S zU}jZ7Cr}5}12chFfL2L&m8g3Wa1+LNV?4(XL)I`s30#5+f5oYoW{@x7COVQTbz^%a5vC+&X z5(ZE}A7H>TNe8@q8!!zxPtqPUyB_!e*ePkM`@9C+3ETm^0UQCY1X_VhfGt3Sq{F3x zD;G!Pw}`MRCjq|!9|KDy9g2LG0!@UKys(@wfA7hXj=8V^Ex^m(iOg(H3Xyj^PmY2a z18fH717`puft!JiW_G%}edc_H^9<)YGds$}%5xBqy zuOg98_z%K}|LV^pD1Q^l6)=RE1JEdGtE4TSaGcO)uanH=>4brXu#F_M_|t;^R!Hgu zp7-~0{lu0g4kRrGCIBmZ5W2l+RMgg`&P{&6KUS&8_jrSyKpSwc+aHwlN13)pIvVUI=wJ!WL!j@1>VKYLU%sDEXz+2rPEtHc47nt|9V!@t(+bB1Jt2TSg7}LH!8$j{axzG3UM%?Wc;v z%pL{a0nP`W1#T$fmaNpOg7=b$N526$hj5^50`B(&mZuczTIa2it;=~vWJ{LY?#Pzx z%L|>i0qww4_wSapFJ&CXkT#C{l3XM`PFP`uIOsgdxvpI2@yAFb@TYSFa5nI&q>d7G zCz#oAU^pygg}7pld~4tsgCm$elUc{K0~VKuY^w*f=>=Pa%iY2!!^?VHSO zJ+Lwk+?w85yJJSjW9!d315b@CG{4xlg#F?ojV9C>!d}lAdW?Zt@60%G>`lN yd6~EMIdC`7L)eDqyU-ajWXO;qLxv3h5&i<_Ibnja1JdOH0000Px#32;bRa{vGf6951U69E94oEQKA00(qQO+^RU1_1*$DF^Yw!Tvup^e`z3C9U-lRC*v zo=q5N2-`?9i$5#qZ;dv-3wTc6Ckzl_sCQP?0p|kmi14!rTS76B4+{TO zB9|CtfE6O#7H#~dat)E+i}y#iQz_~} z*fMI!59%kt_Y6Ffy>Neu_EW{-ta=o98<-9}1Ke1|Em^5m1@9#hkA5R?KH)&w0^BbN zn3O_YC%hxFbqmjlY{_!l7uk}1d71D|paYmG{yp0GgDK-EhO}|qm*k?2f1I$w3UNeu zif~=I&f|}fCg4xuM&LZ)6>WTHiMo@VRU?6sz(T?-%mJ@OJ|BuutWKVLSL9T2NIwfj z+_i)QxQ}oN7)RKr*AouQ24D~Hv)IR%>U=Q%yZ9a0MY!5L5*KLWj}xvx?SvWHNBAkHs+pqH=>Ef%3OWXO;qLxv0) b{v-Sa+D>Gw2rhzl00000NkvXXu0mjfPwqB$ diff --git a/libreplan-webapp/src/main/webapp/jqplot/docs/files/images/navexamples.png b/libreplan-webapp/src/main/webapp/jqplot/docs/files/images/navexamples.png deleted file mode 100644 index 89d1fb4e2ff9113a1eb475fa6f9b2be803c63d71..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1308 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 diff --git a/libreplan-webapp/src/main/webapp/jqplot/docs/files/images/navhomeover.png b/libreplan-webapp/src/main/webapp/jqplot/docs/files/images/navhomeover.png deleted file mode 100644 index 63bbf7a3117740c50543c04bab97758e3fd36428..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 886 zcmV-+1Bv{JP)Px#32;bRa{vGf6951U69E94oEQKA00(qQO+^RU1_1*zFO%hyvH$=8B6LMqbVF}# zZDnqB07G(RVRU6=Aa`kWXdp*PO;8|jZXjVGO<`k)sCPpE00P=cL_t(o!|m2zsAf|b z$MMfQ^J-&Fq)f`xP-=8!#^g_8C>I)%+$hB)C35HAI#T3{8;(5}$iHH0qSWL@b3qfM zj55lfFqm`UZzF0%&DmH6$HiXnoMk(2(|PBN;Ke2471^k!vp{c7LKEat-i;M6awuG2&UTTqx#WDyn&0;f_ z;}N`w?{QO8S8JDA5YxUQW)?r- zay*Omcnde;96W~A*p6F5Ob3dw8?w#`?8V(7rq_q*>2<{2pA&p93;YJhV`GSEMLh%ag_ca?+z?Y!%r}DurxbC!bF#-4zRe+~SQK&(Ruu1l!}<`@ z-uaU4E>KV57o3-q-ID!NOLm;eqVC5O3ft zJd=IpKkS}7?&TcwcrHvF_GP;X9L(21K$Gu}v+$Ms+CkDGrnf^(yK({Gx_RR74KaPJ zZKnbEg_u6W^ZEJY;@!qb~Y1?65`km+7aH4i)-iEIRRSYrx(TN?l&ki^v+jk4! z?rhi0qh;`0P2ro)cF?EGi+87GyQ4GD=}ler=g~X&wVJv*#@yd)61U<6>Z zz=PP=)YUt~2J|^}s5rau?=iO$kIEEo(Dv@G!auFuJCBqpT#sw=HQ>o%1CH9+IK=d$ zcFWnOU0`PL5-tld%`C$FpW-UKkKeW1-|Zo$tw$@TF=NJz8M7Gt4at$yD`MIj6#xJL M07*qoM6N<$f*-1`IsgCw diff --git a/libreplan-webapp/src/main/webapp/jqplot/docs/files/images/new.png b/libreplan-webapp/src/main/webapp/jqplot/docs/files/images/new.png deleted file mode 100644 index 3eaba9c8c9348d6338104594c1ce868ec55927af..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13750 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 D%-5D` diff --git a/libreplan-webapp/src/main/webapp/jqplot/docs/files/images/sample3.png b/libreplan-webapp/src/main/webapp/jqplot/docs/files/images/sample3.png deleted file mode 100644 index 31e644dee30bac2d44714045568a69dffb864757..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 44781 zcmZsib97!^*Y2anP8!=yV;ha_G-hKPcWkFgW81cEqp@w<=g#xI@Ar*!#`$-TjkOo9 zdClKkD^y-q3;`Ag76b$YK|)+u5d;K`8UzH?4H^u1g)b|C2zUY4Oh`yxLP&^6-rmO8 z%+d%1#1*vs&!h#KAo^fuD$!ROmAZlO9uh^Kyc*$dNqVzcRl{Yh*vL-$)Fm0V6wCP~ z36?p3ldEIF{?sgX6k%a{KTH&1L8`O%_b*>i^2%(Sll!C&`y1QRC)?g8Qq$R)1?<ZhiW! zx3O1Xu?hQiJDt zAsQ+z`1%L?A`LJ!#D|&Z=XXHd{mG-89pJ1walx|22OU@kU*UoO;DPHsJ79T$yu89V zxz@=eufPAgSWH;SIf2-gp~4cj(;`d_?i%xjE*A3~TyD5f798pvj2y%mBXm$MZjd#P zp{j7^VKMA0bg=48XZhOkjE+b{^!koYxvTH8#Px+>Wld4jy4J||hVnqaZ58&P%323f zM*Zw%H}(n&1cRlj=r0CdS$2N?f*y0M^xqIJ5=z5toMFM+&uHM^2Q9wtwTE7_i>xb0 zz&>AgRe`~QLf~CKuEv0k&N^ajWRx1qdTIcs;$ysJI9viw54gNC*>NkT4i4uz&3G@W z(ad-au}m&8EBx}U8zk5IK|qK=B!mT(T|rMh;XIW0((kzw$E2Btf7#>5{ub~7Ax5qc z)&3^_B?eYIk&f2FqSNXqOuJ>ivOjE&B&T6f5!0%8Msgwgyk%ZZGJd{5QHWs`j0`zK z0Sv-EQ;XtHGAHxF*d1VkbC`j-nexvsikpl~#DnXMhwC=V1I~|+mrijW0;FtQ5g!r( zlq_g@2){5Nak|H^?0?s4SKcaFipHl$sKC%c!$5#{FmQln5lQm<_XRb!Q#AvKrv_~|9K-7Sgx1=x)0S`1c8JG_ww z;MFESh5z3N9U$7^_)SA4`3(`-t^V60cT$0)LUxK<`2Rc_!3li*0G`3}XOjd_LZl%) zRIGF$`b3CY?svWfod36Jmng`?1(WW@x3iQqw`Bi)7|$0}ZBX-DJ|R82BNTL##)*YR zs*JzE)^?NNsI(<08h`9O;~BYOQDt$tiPjFkd_i+VK}S6HN6?!le2n#@OBg{Q64>?S z5%rlFJw($nCc)ZImy1RE|a2fp|#3r0wa%PJqs4;htuH_ore)0W9<3EcNRx$FyXzeZ!v6Qtv9 zcsn}P8jq{jQk5%TUoxoIN)DWDWY6eEo8v~#U!ZRiF*E3mRaSJ|Id#`;YNf{k8!Ldi zgBr`#W)4S%j_jN_D2-1$4t6;ZkyNaDo$>V z+bogP*(HadcU*O7fo})+msmV;>n%qUi=|^`>+LAqY1#Xo4`;NqKhJnwuYX3b zvoZum=k;S}_g196q(Gr%X~8T>=V zxDs&H#dT#lzLgFLA0lmaIe7ld7(fAbf){Pr4C~p}U&kv0yr&MpqIEYR_Ha~h;r+Tj z0CJRDXvy$?R)`C(TCVl*_j_Y%T4)O6>4Fb_7A7SssP4HSKh>M`?k|W^t04hb!f$8} z4LsFn`w#agrC}vWt=D_?m1nDB=U%5V*5#NEr}dcpRh5fRhvuxaukTwuI|ro^ZPGck zY9I0AxC!uAo|`4~-@(4<8A?sgd%NLR{;-RGv!49$7%P7rF~t2so1Fc6*|CvGh53y!oOj`eKi*l!k%HqE8=yPFv#9!h_5+PUeE#h=5( z2-In*caPt12P_I|V6|rV%iMQYQo&UOf1G*oKT=^H1(&*=1^T8QmP_rHM7O^U0P;yn z!WX=bx+A}MR#|&*IwVytD0be?9bUUcU20RPj}pE{2dg?SY%<{ib{YeXSUDjYKcItBL68OB;I~w9DA1b(j`7qRKioQkmK!xIZJpM6 z-5xg=ycL6^4I74s=ATX5rR&`db73mUDvoYr6m5|lnW-#kxZOAVd*_5KPiL->1PDs! z=?BvXqrE9s$u(Uc&dL;Y9XA_Ui`JAoE(BuMi!^SY0tte9P5++UIr$L;y{xRaZxY1Q zeW#Slul&}!JS|09nBk_0Q7PPJF3^96N!+f_S3zK+Y4?+3O48gG1)Y{$L7XW%A*m8xn& z!p{H#kJrElK;t6)qwH8>_2K3_=~rz|H%_0%iraDBw!s?&;-E&a$Gk4y<+grKcV7ng zW&Fd9b147%zkjh$MxuNGj+|ZWHg*Xqx*{tM(5t!qmOhguVGn#ymgE^JjE6yu;fQei z@E>a|{`*korbT-076sf}fj;6QK+URD$E|Cuxjj`@B(LCy!ief=O(u0E|K>1ny%Nh^ zC@{s0J>tUWCg6P^Yi4Lon0XB9WXpPyh||rdyI56oXKJQ$boC5%!)zp+-0VIGj`@IB z?B@BQSv%hU$VR_-{pP2Pt^PLjeHM`)wj86=j%_QG-o_ht9;LjV^}1{wHPLWdjs@>wO%z)51m_~jC5Jle zGZ$x@v8~P*7!=)?lDlZ$THnN64ey7(Xvw>S3PxPWDq&>n( zRxH$9>obQ*ONb(^w`xKj-NS{~E+}5_z0wB0Mz>HZOt#L3POR&>gahZxS%?yPx3eeq z@9UhZ>E5043u=!3MGIEm{mnPix$Zsmns@v*@+)<<`@G1`#5Dlz}=D~Bp88qjQ^KoLG#e5q|%8p&*kFq`9 zJyYAyx9STC=}V~TcIMnP8_*qBa-V1zOaH_YC&e^Abcnw15nhapAJy6+9@Kpm_05f%rh9(_=jXd0usd+G&|38Fl6b_x-D9oC|B_>sE!( zD=Z=l{Wr<@^&!N-+K}S95M9nDPi%CKU-MQs`f;kyjbTtXKVfY|#@~?2X}7=NuXTEr zXGN=qTJFtj<99A9DJ$8T>h=?BcSlhMOuqW$gf_dFOV}-?LfPrGnpcPxbiBzbdgR%D z5T^}kAnv0z5c4+UsY&jVy6JL+u-?6J=TWp=M9E+j)mPMAChWqzVVC}fTYRizWOz(# z53Y>IzNr)bOAAY3eN~Jc+QOb;9NgYt+CDa>A$&c9iO;#M87&&gc!Q7CY7LQeaaj?Ogr+ zu8^?hJ6aI<#o6ma?)J;rlGX5AV?DPG}CV}Pi z0%Ba-ZPAc~7b~*S^1vB=Wd*(WO(GQatq1Ma-2W@mM%V;Cd)L4Tqm$_T;i( zIsN@WCY;(Ayix1NyH`~qA;{SaFLz{TXz|{P!Mfgd6lDG?nR;^i)2(zWCyNC=UeP?l zhJE9Q#G0)cPMy&pnb(eax>oR2@Ov}!vmW!#L!paJI2WgT9frXpsX@N3O6#kVJ6=uD z`PPHq_brR%HSWk{7o1@-G)C^Gx8Vj0VRnv36mKK~^eZ<5(1 zo3j@jBO$vZR1I_1`SSGkNPT}<5CUx#qFnshE7MWKsbPHq85f)RD z5EeBpY7ew)XNXW!be+W;F;NG~oe00jwgJzPA8aIjQtdnAbfXh0~lE=+DY>=i8 zeM|{mO=}lKSH9e>WaO$4rdbZlpB^9}UU%FK4M@-4rVJt}e?52eUY0tsxBeD!N&c}# zpUGdc@U=`^xMcELdwl4&eJm4&O?^M7e^)%ve913^V64O8%Qx!3bh@kUS!C!t8_!ye zR(1nrc#3)SURH$a=_}94Z<+5GL0RJP;B3|E6D#(=NdeAWjl9)c74-DptvSlNx4SNt zmF@J=EGl2)=XNdK-CxXocLEXN_}~05xEnP0staFN6A7pSv+&kf4yRJZ%oX7X)LOA} zh5&<=XgTk%>;$`Wn$NR6Jm z{3dby=$nssV6{a~9}bJ#1HTV(wG)=P$~a{@P3ZncF5kpEn9AeoI-v0(+~qe#P3Pr! zJ*P&*$6`L@Aw1#pQN^7bSI@kj;Fs0hnf+BZ+K!*h;69Vww>$kx`u)CaBPa;IfCK#*w*p$cjm>t83vBs95P4IYLbgD;w0&!; zWwaFwt&Wx{a?|^K8>?_t6CzP9UUUtK9e!q=C{a5NrooLVe}DdmtFDVJyh|y+2PkGQ z@*R=(HWu2!u|=6@JwuH{dukW<&>tN~UovJ_N=OiIAFpil!}HywQBYWf3&lytTQ9!n zN)z~&X*ok7@Y>AOqazp*kTH_j@TQ%Y6X#aD5M4=rG%k@kyMMEJY!u`tNYWc}0=o?< ze&r`NY?F+r(0?#M01q(o{O}4hh5GiH`*-~k_L-Udm8QZ)@z0aU*U<2hUcXoDyG|3D zmUsA&uSpB=^MLRG$OL?2NEjYhycjwz8&(rH^gh7cE!17qq-r}I z-o9Jus3zXXM0mVjv zrQ34QDf_%J`F580Qo7i`lCfTIHM_knG?{6culSq)$8E^J|I7?Fck!0Utk#txGP{Yon$Xd*0#Y%jlU9-o;|bh%t^ zl%n(Bp8l#71YUwI*Nq80U*X4!iy(QQWOq6D+&up1rgE z&6&hfgOI-ihat|Ap8(-0NYZk++^) z$&7mSfkF|}3wO&9ys`Un%78$Z)STDkFIB)V)&yP46&=%#yQrseU@ z~)oC=Kl~pWJPEJ5Y(5QU5APn>k;x3HtY2! zln)y(Tl}#R)%Tq@GwCNA*iz&NzG3_PnwqwnAa)v4zW3w#a?KA7i~jKr54%f_M}zmS zh^fR||Eb%xn5R&#gZFZaN+_O_+&>lzfoF#IPCk0*n9e!k|8 zM!zWf{k0(UD;)hv^?;p+Ah%$p?+WguV}KJJN3lAOTnm1GFxH7L6p>uGP1Ds8H@(b# z`xN7C(kZ@rXM^VTURU9|jvRPbS63S4Y;<(iA+^}@@PalTPXfE)NmyUv092d;eJ34x znLaJVyO&D_9up&R9b$Z#hjjm8hVbCNC+WKyl*xY%CuR_9(3v762OEp%AF_;M=!MU* zn@ELnGJQ+4e*UACAR>BA(3@Yh=jfiw)~pQ2(uNb5DEaiRyqmrTX+PQStyF=hI4Aw1 zIIbuH9g{b-v2rU~s^P=q8Z)~E`}-Ii+pciJJ&5_4;z>qaqChbu3P84P;wi)-V~3X= zSS8;ZgG0rN?}M2=@I`|Qm;&+p`?bUa4)u2(&cCV-0bz+ac_eDq`o-%NBYrfk)Cj$8 z65*9^j#?#p{0jLv8A1dIef%Wygg$X^4>%~=0p}7CBO}}Vh-rwCXqkGxyq{AS?EpPtqdCb6{4^-Nc8x8G0=CAA)mi$t;Sewa>XpE2sqC4r%SgZ$cMCRR8K{P(r5($Vf^$OiIGCMZ)lU4HxTE2$_)+){}#h07|DYB-jEMFQz6B zvOAutR8)#Y$hMwgxvIarL6*ZGNz%U%G=GmMsdR7kiKRpaGKulYMTlyUeHfXXF{&O%lrAtdpgi|U%M!|I_X8asU)B_cJ?{KVK3}LAC=O+V5 zyEukIxy&3eO;}S6R`;JYC`5@-oUG-W6wXlyqitio;PWkl-lZw&KC&u%Rs)4DFz6@M zl2h$Zs284JdR&$OCK$ggtkdz%GfJN>!zVH4%C)NO=^_WYv@T8EfKmKM*U+^ff;2-_ z0}~9YgEI~I0fBygu*-R9SXhd*KmNE{PpFqDv+PAXEbX-DQ?y3L)0>I&5E`=rZP*Q85rOP8K&`)Fx%Z2z7xFQJSgw<+n}(r%Tfi69Us3KrBpp1C{rEwyxotl z!iSTeOYdH7Rp1&sFKweznl!%Oe>~n%Gh$^qZ#58F4$IvdCJ)pO4qaFBn0}n3{-mIl zcGUZHDOu2~rzCsh1f_F5>d8mb5wiVHTo1x!zE0jvBFoEiHh3%#)-O2^G^p*zxCV`U zH>(v^C(5V!jr?UIOiLT59_`dld-sH$w=?H9^c0Erov(bE>ysvQ*pD1s|7ND=Bt~5}2k{89X?^3`?E^QC- zn>YK199?5e`959Ycp9cjXyVEjBiy23q$0E}$oV%Jew7YT?840E6ro*|MDSyFwSqy> zTnLx5zb^|A@L#bxZ;bPVRkfDi2?*RXfMP==+gMnpzHAyWW|+V=2FIeBKUTgU3GX_n zsMd-w#%o;>X~CT>txl}+yeK3BS%D(K4_W{PK2bM26L|8yquS7E*=O%i2NR;?#7Fz<$R|Zp{OC}R23^}z<{@ zzQE+T7v>=-Ft#u>Bbzb-CRnA)Y|pD1%@p>>uw;vc@zT%7c!kC?Hf!dq@ej_N*(KD7 zBWDCOaDaUXIcl4e8Tv)LIO-_TjiSM%&I#CjJv@}AbqTuT(D4y5htVkg*sr$dzM+CH zz~);_S|Zp~BO;A9ubF)}`0Xm2-^UiUlk`~7kZ!4+IRVv~y>-H&3!vKGkbMV^MeO_6>BKWikm9ahPxrgaG z*6}S`O3}2A0?-hk1p4&uajwvq1u1{rx>%?hvaxcHEZZ7j|i*-_l7GCIt}|gSN?7uGAn}p@1ZrEvJs}b0lhr zri{sl)XW9<32^_=uo{&v;pBsfS{slx#u&+M-V)l*BTj6^kZnK(;ub-b@}W>YZ(?WP zGONGKA98%=PFW;VdL#!aJZ!lBS&-_CW9VPtGLZdnF6}3WJRJ472iZPCYg^NWPojn~ zMF?LZ>v!~()Qe{2dB;EXt>W7$RQhvJacqu1v!}W!OxvNIp1TFaBnSkFtFpFazUKftAv94_st;1a<@6B;txm@LF6!v*}9S?BHP2mE=v_pYJ4m)vD6z7Qk zaAafgFM<%>sb;}L-{tZL+Fq_+HjE#)`e&%9E||iEwsL(H&mm2LXm9Wq1ux&mv^j3A zudd1%waH9o$$&Z#caUxZt{k=aWD@fS}z*PV6Tqq9VRi6=) z6K5#3!fbGne#z5iVCF}6$cs~0mo)r{x?HF|*3A*x#z+751(4a%(Hk~%V0vNy@g*&B zm4Ww895p{Q*c)+;Y-vSI3?~Y29M&VUj~{5%?#NRL{Uze~xmNsqePZs20Ddr#^Qshr z1`|<6aSD>%Ly-p=S$(8ctgjhPO(?tLw&oEm}L>D9ss^2|e%k9@;st(AS@j5I^OY1mYIMzCogg2mod=H#|OTpq7uC42a9M z1J2Qq6>B}sFyI77YZWf}3loD#Lf2&qLcx)zfb@@xz)YkfpJwl~_S|pQUYRdml(O+w zlM=tNaqiHGZ?S)g)^#^~XvF*@^`h&Qd9_Y-y8Axr0OW=u2?@ybw2zp`(Hs{NF=30R zgBfn_gJ?*F3txQ!*XJMelR92UM>ZAHiEr<7op7&WYO`@KnJ-5Uniu0N3GEKUAlICO z4s!D&`26p~vm08W&!_8L|Ne~!gtarVMcSYxBWcnKOCZcDcs4{h@8zlBexu&E!Nq~z zvb70|^}5X9WrSqkqC@}YoLeE(TH|B)3=Jr;y6@+ju?a~HdgJD_X7%>ccT2E8YK&zW zH;T&4ZGYvJhP?l+2YL66ijZ67jX+SYJ8s<=laU&okZsd(hRjiQMt!>dVU()%M?~Dy zAyNM4Yp2KEO>s&e`Di!GsZ)FL{-ds1?DOJ7XIgsEuvSao%9%ckboggd%nPk`M0AkK zt4a*$NmFwO>!F}tC3=V$Xf7;#KKJIO!(F-l8Nx@mXNk&-kb~5aMRf~?1KTQ8;?Wz& zX){dDVIRV?ZSRAIj6ssX?y^;p?*5U&&>R+#=Ekfjny##ATAf<8`@0z$aPAsYl&)lK zw9ZKi^R4^oULL|^M@hIK<_7zMiMh{S_QM*kJ(vH}Mam-!+y_XN$DTm4!#jRSUqT|A+_<`Yd5R6p#tlabW5$_h6Y$Y)E4xcW^w~0J4oMl%t>Yt?8pJdaK zRHdP=`_QLH=9qzgN-ds=J(Gu672#oK)82n@#~}3`A{@L>nlg0w%bUPc(1sv4Hp~|i zg(u@S9k1)ZN3pSJRNZuQXUeKS*P)6pho`t9a~4!GHj zX2ab*Yq#F%&8DMVPnY-tQa8QbYk@r-;PukIZo=QSR-$g9hS{A{nB{U(Axl#^q2B4K z^s?S_9@`|!pYuGJs*?>3L84a;kY$zR`f@rNZ7L8^=QX6th+*E3FE3g^Ia z+~{AvYO|GPZlzeXXA76d18uwmG9W9FGruXH=w~dG%ExF6^q9CI)#jNz=#zJG>k@O^ zk;lavw0ET0fxc%*femzHT-4hY{a>>Q9|9Fe#FcX1jY{g- z!=sIYm>3jnp1}vVHs?k6t$fb>Z5y-m(3V4Qr*O_({}i)tzKe#WIfT2T)0#bDo#zpO z@`y5IDk6(IKSlR}a8!m3VjpEWv71z%hWp1!0kkw1M9P@jMU2|ks-fXb&R8;InqsIC z!J=BJSQ@Xs{BLBV!GUIcYx3z;$Y!xPFUa=q_OJne6PR3%H zvGBik6A$&FYY4;-y2&KM&x>pPXA5|QxvIEZJB*DZLk*3fp|1qhU+m*sX323)Dgo)2 zPk%3s4kmxC>>^&W!dtev%FI52L%Gw%mE+55i7+q$+ckgLfUFlMK9eYPj?x&~L(H;* z;Peb5^VhWU(j8mO#2C4;Tvv&lZ8`vK%62KGxj~76i|EQl z5*;R|-Kole3Zm|7M=-FM>T+&63B)wMUMN7MVvSQ+E4Z+hFi@(ZD#?7N~u-cG@%J%RyE?R98TShn7>j1bvl zIWWf#)WX0=Fw(TGp@ipAZOk2=w})47US)hjokLf+#m+HW>tc=mP>I^v+@uTmdSc!7 zkc{$RF8{nWg7mR15VPr5soAj;8eH>cS&`H$=TR9l$fsos{$Z$SC&I?sT$dcsAojI{)Ts`+_;6 zsk;U^97jszuP1()UlXq1ltMDMB!lIPeV(e%~f#l6ZB>`_c{c~NgePLJ2g+i-}ntjlOA#DMP`b`T~t_9G$MrcY=Ea{r_w~H zjQ31`F(i+=!}z(Q_K9DR?zy&ig9IA@;rPa*)KVrG?7m`0}Gh|S+C z58x!$3o`jyG`hJ{5U=$Re(=}S?deVeZsfNr$^(n2OkUba7H&)aD!*$~+g&BphqhNt zp#h`FXI6&XWPYhN10cHPC`(9F6a9Vwal?j%O{DL9ipBW=5djA(Y8B}bhhIn**f$Zp zN@@+--*Z@1|Jttm-kB@hdaOe%!|cBP65+xTRAVSECsYFKT~*Jp*Wm57`?0!{nKY|e z1u&`lom){LSD9U8S~oo(wmRi$HRt`rD|LOYdyHGtTxpNyJ)z=IQk2&+-bwl|b-Kqq znC-OG6)T@B+;~32t!%#^02K0_;bwK5=N$Z#gAn;lo{p%(G(jl{<42fP44~2*c5{W0 zP(!j}5uSIeom!EnsUW!!N|4Y$cg>-1FDy1=eEHJu`+W;O(wz^!*8e25ZuKRi5%SGx zT~eUY^=;tp%iY2H(p%@=x|HWRJjokN;(K+(oYl+HxrfY&Cbzev=|(1I`{HPgPbsgK z<=^r*Rb$=m5jw3VwnhY{y+x6;U7Ey+@|HanimK;%N4rF&@M?% z+-9}~oTUa{EGHKJ8hoO&Kqw~uYgx(P@X}?MBb|a_QQYKu?(gvN+FMC?3>QkQ!ZGqg zsJmg3Le#@BvtH&@f-51kzq50G&{SuYU?zK{?l+cg^z3r}d5dacBP>@V)~f;B^NP2R zZ{E`Tg0+h#eo1MhMtnA+Vxp)a7W?%H(i7;!PgPZtdz|OcL!|GjWrx~K4tJzbu+%Pm z9UpU@tJMJT%C}?B0YG9JlCRd~A}MYbpLFDQ8WUwWsm>X0n0Et@0xcNG>B`h4po zRI}sgz4#06IfVFL=i9sQ2!+UX35>!IgFJr&TJz>{;#<(HhzzA)~X=3oL-^CEE_+5 z-BIA3UMnVBt!|ITn8)OKo52uV)t|snL0$tNrPz(cWk`v^OId$@|I<&SsQdBDq2g6e zj@OHkQ^~tNqf(;Y_5}{JD;x(~lWTEk_Z_ z??{|W;^H%j1w+xpgP7pOH%>63VYD7yh0u(X_A`at*;z$f#BEAvX#=lMT|?OmZ3S1v zRQ0@EX;o`Vv#U=y^Oow|vT)&~|9C2j`PEfUC|@5^D9MuC3}9K?|XyEz^bx6p`xv0`hLg?ylt#GV!q` zy9lN*IRjez$wyo+?&K4#1M(<`KLPQIZZvJ-UA#Mn7VM%*dybsTrBUZ@*Hp&~UoD^S zTP#f+l)A9B?5p6tM5e`)o6oDE%Cv;ZTTK<(F&!WG3zxn<38qo>DWY63Z!b%Ma1&Kz@p9$@!nm zgycHHQKg@Yq_1zJiWGL6m+6oNqcu$x4k=K2Z>kl*1wYq*kAQM298WB_K{W6 z=%5}`k=&7FQ)k49`_SGs9&HtrU}Eku!wDI!{gX* zCV(J9CR*Q7@|RrG-YPTk$tzt$ycKPKNi=tbK!JFQG^i-x0OMpQ!aGd*@=L;a@aDZx zkTAdDEtZU0J?~Ln@C;~SK3u=5hvA^PooC@BK>BOt`vp1E#rF@5-!lhJ?y*4s01XS4 z>GV5#CEygM%t^LPoz&j}$;OnZXl-D)x$r??all0__)m1rpB72A>#aGT_V8(DP-tP2 zH>}FUOrE)YM}aoG*rwAxH?O1+49In*X&%p1zx$?1D#7l%wRHN|#Y#=*S6UO(7wuwE1?Y3itwjJ8Qrm~mGRyNkBAkPv+OuD3ES{7xUJ%c0M^SyldZBl^=EHB zt05tzQ-&SL2@@UV6*~ZuVBvB+T{x~ z*Le#}J{^Zdbl07%y@H&jYVDf&@V@{%^xpV98TlY%Jqg%?-Q3eA1D@*eYDjWP{?GaN zMhrX>!vE{g?bB$1A^Z3`IR)pnXn$gKhn*xKy}n_a?!sxXCMMD0h`{7DWM#1-(~s9e z$(1LnO`{fewF4`#5|#;~dJ7nJNAi=7hIV#G`=o|9{s6kp{o3~t9jpaV$W0;DcKKz~#s`Eaxg1Jj$^ zP@mp@`g;~9&Td{NC}z3Qu4b`a0&)Ju=QfKUvMouemM?C6T}94;(%HVC1S~e$Rd}q# zrV&lk@_CskNI~o3z;^_E17iz5aQsu(zS2CHhC4~MTLUwe!N3sFFtAaJh(x$c>)F2x z&A@f(I(SH(pUDW8p!!)mg8vGN7JLem7hX*a@C#Bi?n_pI<#YBi)#Kfo;05iqb+9Vy zfT$?QXfm29`UOl&KG2as+hGTVB>A^EEb1oFeTV%8TI18q;*w&T2M6+o#%FV_hGzF! zt1^C{!hri*>>#YCIR~%&se#?M{zKH*)3t-&S_(XmgQ%&&{0Y^d!4N3yD?%qTy3~`U zZd}*2|f#>X;Nut@+Nh3-AHxMDYPm*sK(WT;F zSo3v)7bAF%>3f0%a8DiB*oy0Sa4fap0+iYTJJc(0WIg4aRx$b3Z>DkSDEt(0UZU{$ z?J=L35iywUdGjho`O#)AWs{n*bsMXyIi^}Ldle%7L59zk+iH}WSaG}qXTB2IaWk@~ z@DXJe7B3#j=W!)yblT5KE(8>4;)+AIh=z%yA0Q9$#1BH0-0m4iEjYx`>|)yf*^nSO z6qsCjWMb)|m-PHTv$}W>UdEQ>&t@a7;|F$LgwNU@=PcQDDzfw-jf>iT|4QE&P}I9i z(R1X65D8Fmb56S!m$#EXHb9nQhrBQ)=Sa3fBkvWr>c)%(- zRWCeN;>Ub5C5YoExz`$m!jjRTJ$RG;itPEr!IwJgfEXZtMER>Q$T@<9p%|H=23VO( z($ljtszber;1I>`53WLtIfd~z7-z#5^--A5{#}w7W{-4eGSzD83yPd|%M8MCiwYbz zWIPDVnng4xRLCVXwNhE*jDr1I$}U4l*v6)&CS*roUfGaa8g^Dzv$A$}PHq;a7Q&}T zMEwkr#j*;VIlUqg37=JEOKnd0$fWFd{+%KO2_9%tn6_oS7CW&1<6QcUe;S3hx^%8O$IwjNNDj-j zz%tUN7Lk3hd9~#$Y`DMZ5;j&vwr)IPI~DEco&sRQLwsftz%7pEoGA^@V;5!2dkYyA z5#RId>>feEi+lUE2dvnuX#0UqL6JU&+R64ITfsT#5guM6VrDW6dHSC{a+k=PX&Ez+ zX8tG>ycGGpOuB~g06d*@K}UbvEdqGWp(3l`eVG(jBuDGb40&f+oOK=OBPaz7OD7A)D)M8+Cs>%;*rpAmDn+_l&mj_5sn6hxww-j^8ZTssamNd0~#8z_s;vr**=nuXrURX&tMo}pW#WTY5Ow8CHaZ@ z1nU6kzEy%*OJgRZ4LzT0{X30PuG;|tqXW_*N+C+XeNC&uyaH=|o{4?OR2N zWXi0g$5{us(4vh4l?yO{f#O$mvq$9T`{x$ue;Qww-Z2 z@KA5xDa_X1>MVfE3c&`*1wzR@IU&idKONyH*U;L&*6$V(~=sD_5i8{y6Ob*%Rx+p-9pnq<( z**LA%z@8ZSRYIc_M-$**#a4xwB;Ig^#MTP@uEgQBV3TgYZSivNh{WM!2YJRJtz>owqdK7<-R-5fp$Jt_PxdpA1j!gV~3da>8dj3b9cM-}$)75`>6_Kq?@V0HD zsiKrY3E&GlFBb5Vjzlq=x3IWBtA+C|R4!l;ejL6&!M66=t<>}*eXOukKm{WC*meP} z1gOtcZx7h;EK;phlEjM`QGs^OhO|{Hw1KRLv&yb)YiwIkA}}~$2fg-&z>v&G0;rN!lG2R5N;M4g*25y zlAp9Ua-B5>x@-15_O~b+;m#f2i=DQztj21avRhhgto-kT{$rv-oP2y^KERKN6&^7Q zrJ?*ky+Gmr27y)2`W_QqBNR(seUt5m*63r9%gKVpCFkLI-507vQL9cyuzfX_&J8$< z6~V?fgEwSN9mk0@W|0Y4Xa^Eciw;v87`}ng6tZy&9h6;T?9#bqqefh=9KNXV%=8$l z7Q2-8mU%tbDVv4J&q6M`jPmL|83ozU{tc$DL84J!-~XGoIWgU^ zIJw+Il-){$0o`CzRirn>1IKDLnYBdpF7q--u5;_#>C(+qEh`I~+npu$k(t`j@Nn|C z!w2P@1bQ{vdxD=-nc25!Beg;=`@tYOA-@5eXCcbQSHJ+N<`MB7mF0?gW^epVo7L*x z7;a&yg53$bf_tL1nNp%Q69aBvS z!R9jI)~y&%t1Fx@7u#4<6EGY)6V1nkaHT~?z!U6tvrng8BVQ=>HLvuXp#a%)3S$D^ z%z)x2u_XT=3qHyVQ}f7O1GtYL0gZ+&v4YghuS;PW_m>vMl+?2czKTDjMM znVLvzBe+M>ebe^};^G!0NmP_DEkYVJ!Qb6s11gF|I-14&5Rkr-`eO;6v0xYIaH6M*-J;$yB zA#?W01vM2#_9mzx$W4L}z7BaL9qq?B;EtdMJGu#3o|H+E8^6iRoKqI|#;&r>zs0qx zsR-_DmJ0SyIe|BcG&)IXX%H#h``^!}F74LE{AZ#uVO!Abp&6X*TO?qGz=`uZjSzWc ze~DA}b|PP~^>J5EVv=-d>bJ+(466QjFF@E2?4$YB`zQVQ5`OT#knJcoom$5ulCrDKEn(iG@$cuG46%2Xo_s8EUe5u6 z8ELK%0aYV?27BdRJLJ;NX`Cq^h64*6^e^zwKl(Dc~G>*Q@Iey(Z6CpD`5zG*Lu`kU1bWjk%co_^F%M@RJ z`;^Evr4DOAI~8d&bI6F>^WNs}4($pbGQmSgfYsb=r^QCf?U~KzGoPTgZQv%fF*o*r zE8Pg5b|JxILUF$xA<|El{pN4o%dhd0($?DPOKT&Yl<;q7f2FD5nNKUz^Sbvnb<;;Y z@c`u7BaE2M5;0Ad&_7=u#6gO;B6uAc$b+Oxj^OO0lhe~3KS|*aAJwvS?JG|&%gR^e zm&oaUsh5b?rL^>gRXL(2g|<@4CZ{(TR|nl&t}2Ef7+<)hucrRJ`yl~vCa-V-KE`&> zDk>`(sj0bNd29|Zk==ow+Eh~+OyQZ5rQzsSQuzPFccfzowoX9YI@?o76 zF}VRDum4nOR*6j9-8hu*bPdIT*UlVt*6UBe2`3kWDGd;-eHH$iEL--ckiAktw z^t#zuytpR8l5j<#8{HdZvyHx9$KY9we*e_dGG@MK0s;RpH@_-7_ah_A2v(n0H@Wsr z)>h$Nd#m1d?kgW4{&ralDPtx3Wqx10i6pk3mB!axCylhNzdU1{r2#X51wo4eHM62o zy$&e7=P#aBesE!s1iVS5fkzl{%Xc_9F~_wyWFhMC{Z`}@6!M%InOf^sTJ2r{z=m`u zw^~{vpCG@Pgi(=(<;wr*WpCjG762LONA%tz4l@?{1lL^(zdYkN?5u$XF94!u$!~rc z6GT4Zo}9Dua~gVnu!$gfz?=-9v)K&jor#&5P+Olavb&HVsP`S&;)z$0ea>EkJ}}(@ zT2Naf?s;et8|(c1n9c6aqkMc=3ekWB(-wMUkNt~~1NswdJWe%#s-mCJhF+F__3_GI zH|JCx_hpVSZr|&y4^tYcLe2LxVana~#U%k~6U8C`g=Tasky^JqMnHI-O@*ln;_6oW zOH^R+X?TF2kem#T+dc^|(?~#OQhnpZteeA0SMt->257w0leoMjD_0h@tR$rib7lV5M+NnL z6a6fQi7wAiou_SP=+D#ImHaZhyLWFEtsOqC*D8{`qwrJ@dx}9z*1ccNAAtzxnMhHH zS4u@aP0Xd3l<%8D?$n^ZBnEZFgK)wg%vC~zs1J12s?ze2 z8A!BOKYcHr)HV*)BK?#GjR zvVf5LyH))^5QGXN#RLRFUr}cT`#&r<&KX_^L@OI545ROY0SYXtL*h~66^bTiz50< zrM7tG^ir3zmR9_d6K|&OeGXtebdDYw$UF7N4e^8S)6daLuHA3)9o0nq=^AYhC07xp zqwaDZ2$Gm-#m{FQH0 zUC-`WT8qi}A~3HV9rdl#qm}0HIWt5@J(_jCBjY88a*Fu_3n%&Ia8@iLO(zzpfray0 zD#9bY+ctm0y{2Ov(Tn}bGG$uq6RJsB*jSbKT_~Q8vyNSd*RU+5UN}%>`bZ7^zYYUP zK^lbm$p}_j0J`3FpG=Ft0mTMJ_#NuXQ~A(&`MHMI+vZ%$GosRFpS=*5RiL-WI|}FI zKQg@om~1nZ|Dr_DV^R$|%_V zn^)ZMSD(mgE?|3lJf#>j;qlP;OQ3I|cV#|o08LXQ$Fqa5A*$4_hIhF7`)Hk@f$H$v z>?$R)f#c-71FNg+p2b7!laCsfoI|C>WYY@qVJR(iKK<#i0$o0J4rQDwhsS3@gefb% zI9^2&UR1b(Z=X9er8-?T_3H(;M_|F@Me}c-?J_@4791A0DGQEQQTY88ogMNFtn;;= z8cWU6t)pJ9XofX)`+||+?D7#)Ie!^|H?{?6^Nn}<_uSAj`;hzE2MfBjUl4pQonVKN zTE%MBd8zy#8WvAlMQ3}U0=1ke%aEbGP+fe{N$!?$DS_9!beGxN_MCi<<-LEKSC*Bp6gN+U~L+$YEK!W6e4GMdAIbdL1V zH?#PqaVWT%-s48s>xM;k9jG z^tVN=0))FawB`rbV7Oqlg0A@i##p5~#n+J`e_VH-)z#X?1a7+_EQ|*}!OC_aO9?j_ zRVvtftPH_ZZf{a}5>W@=k#YzSa04Y+v%SI9C6_blI2EFW*9nT`1Ew$tr|1`(gfwi! z@{of@<>U^kn`)ai?cMIx);Z}Zx&>PJn3?UZ@T!_r3#^KLmxO4v`8mMhTD8oESYVt? z6m|=SA)81KpVrN}&XdXH^tOZ68qLYc$wAThJoLOdF2ezSuB-l0q#eTLh{>#8CJBb> zoMi9VZq<*FQ9^>yx9uic{8dx^k)D&u*~%~v9NSX__5**GKnslZXs?!+TdcjbtLLb- zEOB`jQ`SS)EFB+QlJV$U!PgUR!)&dr!WO8M ziHY#o2l30+O;AT-4yP}x#N>`)eKZ2RQPI!_i}53PiT{B=KfIuCmr{R*ynKWz-RRmW zgz7mhoDOfy4)xFWLaIv=+p!aN^3e4R7L=kITb35DIq|}?$L2Ikw9Xkx6v>N9x~TH^ zr&~Rgh>@335wq(96TntH6t?CXSU7A_+MWki(Tj$90Xi&B zMe^w$qQNLcaWCj5>|K3#$C=hln~Uy-nq^Z~R{<$*<|F0^Fs$>a$7kprt1zU*|JQLH zX@;Nb8DT(wC4tKye##o86h1-UJ)qR7%RuIHFmPx>wl1(S#&k{fw0XM7{l{CmJ}504 z4@TL*LY}ZVZ#FwkYN?U|I25<64+-x-GGUR4QpC5r_yj%nqFs%*1mW5w+xo2Yycbyr z>{ribVHY;GHEcLF?8D|o6b!#qOf6mmN)NbmB6M9Ul-3P_>h@sUlyehDs7};TuA{>> z_Ke}P9o$|S@pU%8_ckXU`y}j7#&JyG@DTi+$GAB0BpR<{MF(dG!ABbo_;|ZJ@yE=m zKE>`Y<40CeRNi!wLQqI>$YiD#7S&RMkQ_*Q5JabD4ca1hkI1zwjeihtm{izbx2@Y* zvv9{;Rht=`>pFh`TeJ}7905JGbtY;)h$Im#jR&d3N!9~{<-YK`pK}Cu9}#3H^BR(xhkPLb8uZIZ+(H1mg2aKv3vZgyz%=Idnj-Njp_oW>KINe?73>O6AjKC%QcPgyDlc``MDp+nW!f2n=OAtDCYO z9jV8pJS~}7lZvA1o969IN7p1GA^ryhAWO^*C)p!&ypiMH0rB!_*<5D`l2?wMCzE48 z?j8{(h~0L=p(>lFtX1Z*=|uCfA6wYru3diP2<4vW!08HCdDl&XI889-&7_AIDA z)NJiJwl!a;hx)+m`9ugvpe)c!3!<a@FIsd|A6_YJyxBwhRG!&S5URHw_^^@3E0Vo(_Z0)Fxy^rkZ4%q+AKQ(_8Pse9-Bh=a-5_$e~}Rn+VF=T)=5AW z$(C>N5guQ%wC?`p^-TY2oUtOh{{36$9zoLg1izI&U2q0BZoSfc0Bo5z?9cxwl!z5! zyjw9HED~{Tauyq^p~kl`kfB|i!BtP|-;iNGMOgGQ3Yti;p3#W0^{P_@xs(w@$x?_0 z@9oDiIyyMSr?k}T?Ig6E?7gRJMzlY@8+v#`*Kqs>#()G+naTwOA&ctT^PN=in0bV5-<;m;^kbg^yy zKsywUJdpTbF;9gVTPEW%szHOV-s%z5krMmXS6AyUHui-8XV0teL#OQqJOlulz6#kw z;jVeH*20SH`@d|--9G)JC42(qe^Q^U7?wL&801MNxtwlLLEu0prhQ~8*Bj$)Zn3>S zy$@DAtB39gu1eGVv@GY@2E4jfI#1F>P_jr#jYKz2&1<`gkyGM7T{M=}-CPwc@QnKXvZ5He_F_kDIpnN&I*CPDkby)xU_ zn>s|K(-D4Caz0<8Xs|LO_Z&4&U{c^S2A$h0FCbv(nj4JJ+b2vLJ0)psj)^8i^7jw% ztGSD%G-L#ogcxK<=CAVM&MlAs*`6^{%jc>R zUuchvTSNx1<942W!vMLd>`yJGGG^10kkZJSL^GaOYjuKyNI0!qy)8bYP7LakB;_O+ zoJMdeUIcw$Ki^vw|HHPhTLdkdo`RCB4Z>?xj)QEph$slRnWtayBif`codhiWV1~U4 z(31%XcA?v69os(DTc!=^8kIxH_<&YvbMszlUTIRG_JAWL4tFyg4M9joq40ClV_>Dd zw7nf-uS_9_=K?_zpFE9mawd3(Dkw0B27Ldn(HwWVt6t9E*hwBVvb!* zmXzPIvF%WNF&7^RTV-lp+QbD%@YvxIxaMX-^wSJ0Kw(3%AwqYL;Nb7B1S=bXDSpCE zV`c4XwazImL$*PyCZ!6C{W?QedWrQM{vV;jT6_Kc@B`U=p3ejOiO-0^zxWtR(Qr6U z*BTm2g^|&@_EVX0!Shj&Vr@P1OzE??NSC%qp_RLI1oqcO_U_Vse1Y`)?byXe^3cI^ zy7d<>geVx0B}O+6LrYB#&Ny_zO5PUmwD2RguHQw0m+$IwTU%*AH&G+dLmQu4G;r~3 zJl$CxC9+91!9y-@*>&Yt)?w*;d;h!n`bWR2+=xesqioD?eg?EZG)C@~3G@B%0|2no zMy{IJzfdX#*=lz#mqArEB6y+_LWp4%F|>@Mc4z3HT0eXg1B~S`C}^@uCM&{PeyRCmauE z%8-pn0Gj~aaag>?3T;bDVQ(JEMHmFL#?Ye=GlWbaSREDw`W>Y9`Rk*V+DB~);MGl@ zW9Jo2rvKGRULlmhi-P5BCSn*5h8MnNLh8JM4nsa5nOAy61NGCe6OWC}Bp_3v4XEuS!jn8*2G zl|BR@a5p!GMkx;gEX#LAr3!&nVXgi;I+(KXb;0y)UM&HEJX3k~IcZnWOck08DXvgh z#rnT~P=$^X7v~{oL?~W{0W+@yP|fJ@2-&iBU8=;6eeHT|PJl4T0xt7|jZ#|m8j%?_ zJ-<0lyeIrtMo}&+Af0RCM03?w#1--6LS!?r_JH~!q1h>x_{Dv?IcV#nR8Wn80bGfq z;xzN)uCRealWMqyXGCSDal<9aq7S4zlFFjNzr682hNB%8O-(WL&8;nL?$6g)<`?X= zTev9ADME0&9wDyVkNSdH4|@3-w9z)SU;$vL{^4Q?MECkswMlP%IG#|+ekAtO;Y|CG zXzjBk^(1vz)^ec*fl-0e;FXAmhR*CEcXK49V)@nTTvjF#>3M0LnR{`Dk;A< zoM~M_KU3iWYw&97o)1Y10vH2Ir0roAGbNFtT<1O^fMH3P?Wdl7M3bC5ec(xgu`Q`c zz$8rdbQ+aQ;VJ9%2PR!FX%PXicVw9p#VMJ%qF#|fcE=8bj3^7{TXSUL-IOXX==-yq z6%+anCyCG)q}gb;d&Gc>bO;aBMsBdy8WExxHa;k)r|-&r=T{=Ou4VcNLcE7juPG)Jv+7wsp43#se?+cfff&UR$QgWP#MmglLsIl7zX%85R z{z-JDt=O-GQ~)-(>y2K5@qaUHL(Fu+%q)`?Ju#fX_O;JqmgByke-J;kEbuIB^;>izxc?C zdAqtkK~DpJF?;J8K@x%1>U3?G1kZIg+`^u>Pg8sEIv51d?}R>8jqDOLQX~Qd(xBEF zzhOm#qpN}WAv<8Qxqibb6yB`RmEA9)g%UlP#xT$%-3_&)`TkyJL`L8~3^1ILd`K3- z+uq(tEYuqy_uJ$t0*$!9{34cP;}tQQiZ_=FwRLb~X?y52Ls1miMwLyCay^ARdrfo5 zJW`lUH*rM~cRjfPD%Coy#VF&U3{IHe>+_f(VzD#?Mz^^TA39^=y-ofsO2W zhl&Zn5E`IJR2&sRikpV3I>QN%S%-0#35`>TSaUZKR3ydYFU~^&#awR9;F`&hkfI!@ z2PTl}sdxoqm#2i*39vMRJ&4{zo=z=JpoDhcpS033vIX_`aN}^iTEyWnV-&c~f4p-v z$Z$jmxV3I!AI*J$MM!Q+s9|(lXQKdj(R6@!hMIO0PJeg6 z#l)0^l&o=#jg6*`d>`JctDkJ|IhbRm? z7cH2uFi_CN!O_vtP1QtXD)X;=<4X|($#$yqBH&%9<%UCbIU-4eJaaqv(sAzTSxQjNw-Bu>q(R6mRLWU7PatyYDC zACY;a#%XXgB)$5XS4BY)Kx^5B;yOMoAarb>ofhBTJfUfSNl7&zE;jmc#047gfx_Rf2ILuRuSocc%{k9|t>c#YwiV%985KfDf3TlBKM3PhD zN&_>gnTa~ed{EZ9+N5iEM`fR*oAu#yG)%AyBXqKDNvyu3b;bMwA3Kzf1K&KEHi)WT z9JBfA)xm|rbyEDIH84L_i14eD5IUjktMnfQem=7Dk38v0reD)^k3~EUB43&?X+3s7 zfl;>1Xgu-@8qJOY1EepaaX3}Zm#Z-Ba-tO=o200)<`|Py44DVOA!+jE7b+>=2M?GH zfH)rz{dSuqehbi7hqDHSl;%Woe5h<0;yQ8hqaH{HYh;7 z7C9SThfT7R6!;Y|8;>OPvQDb~UdEd9vpQ8GU)ZURhg~fEWwFGf_d!9N)K`4RHT{gQ zYQ-(se%Cm#+L$R^ac?N7ODWj2NC= z!Set00>HrTpZ#{}TkeAdP_mLD+}R*cv~&B0Uu9O~vt2mD!H0!WS6#jG$`S@s$zi1q zU^`Rc6Vikp_PK&Xf40S?2M?yocS6%(+gUNJLeZYnnOMW`jHPTMTM zoMIex)C}+(k;7k|B2f73;lz;8?Td`bl+A+P$tCy?T1%1Lp%jKQsQ-;tIz3+CHF57b zR7hcq>=KE?Vc{N$SGQ`?igSIXljM&Kiu0+gc|gl?>!o4pfY(>5yEd4IfNYG@*#+U3 zKBWYqT@DZmMil-Bf@>jk#ty;4BW5Aw6KK0eK+sc$9BUHph8~`gYt=m#0zvy!=L&D; z><}j|ppVQfiHB}?Wf2q{)W-exx@y{bdiu@$oM&gp1F#cxdixN8OTh?W_iFr=jmKVc zv#4)#SaP%bE13@!xSv@|4hBHGnG_o`c$wfpduQAlAA`U5;+OPxMrx{wBAP=m3S+3) zzj$;c{O$>VhzNev0`89fEUS!cghI0gWXjhm%om<FfBBdLqV<2k$M&zLbv#zO4unoms1hUX!quNIbZqwcGUccK`JzA)o&^;KMs-ZW+Q z+dM!o_IIFg5>SYrhKHxH+|jwtFP6JSsj|(^CV=wLieU7|jU&?Fo#P2#Ie6LP2ccT zotGk6S$2y}0+_k*ysjBMg2ba7m2s0Ah(%CjKaeRDC z8ji%yrq}ScMkI-#s+fh>j6wL5#O~pRr1QQ4%YYV%jR;X3**BaDno#|g4N`D_>2$M;rGQGm5!o`26}bcs@M?KXd+ zVC8HAtZ2*5;~6f3(%7VG^iL0rnBlGqr$yyWYmW5LNr?-dUzJ^4UtCzOyYhS5X_fr# z*iDu$UYb!e1l~<-z-{AO4qme_M7t@WHLbZq~fA5pF>K?>nh@$uP$vJ8T>{iYD2T0DP5X(f>2s4 zl~>)EP@195fb-=LOaZttnnetmdsPrINsBZ5gb;T?7(U5UyQV)#mX4i`CscROO61v~ z&S(B7FRJ~RX=&Jj1!L?>Ny>G7XP6(Tv{ZJ%Q>cQs%nJRdn_E3OD&ORRxq}o|>Of+m zdNY^~33Y~SgkA*g=1(cZd54oMr$f!&A|af;_ax&x#i&xAfG^~o4ZV7elOM;2oNR=G ztaOj_nbCATWW?pcnhq!IXPYn51P{1GeM^wMeLdL@N-&U!oYI7^E<^? zq8XCzH;s*YW}O9S41pN7$#|0*HNFPlrPdmBgT#!Tf3*8E^S4ATS3ecv*_m}~m|NXX z84YHPSWR9}BCN;K(JWgFC_%?r-OqBpucyI~Y_RN_g;Bk2%4DinZoou<(%4 z)MN_Csx;7fyFV6b(>1Fsj)(~Bg~V_L79y(2Rgz{GQA>ye}V*pbiTfSpZO zh)2spsWskVnfXj6brM2H$}U&R1Zg1Z`6A;akbmDPDI2Z}nmkIJ>MJ_R%y}5RgQP0e zkcV$Y1UT)azBuK2bljSa)Y`niF46xxP_x~vqqAK#c3Jwj&A_`lNT8tcaX{!xdvUBg zP-BABCN20x*xlV)?oVxs!;BH7e7W5Ph}2@hIb!3!{0YufT3VvwAPO;tQuVtc7Q=e} z2q*Fvv^A6j5(gtL|Ew|VV~!C9Y=`_Qf>%24ZKI*Z2$_7zAsk(S^H5(Eya0!`(2wUi zcUc3A5m%66X7Yuo9>0S7@5l3rG=-aN?-ACIv(6_k{=>38^I*K@shQNo>=2>z%}pDu z&@!{2s0|ApT)n!|s=W#d` z#NTFjF1F!*O{RaF43|V&*6l_*zVy7k~bU#P@z_eT|_naPb z-I|p&XMjDYBUbTt#4ir$hK$(cO*|zMX$_)eihf$7Bm7jaKT>h7T@ql9Zx@Lh3cA+T zYI>jE&YxY`K^wl?k?yXp&J#UzI0%w_B7yk^$M99byTD>u#f1uLCosdIu#KxbBFNMq zsYEEepR?RDC?eK-=Ws>!V!K|T@0IoVE6MOy3g6$ulu@2F>7FuCE zHm0D=F6#5l1UJi1$bBYFl}@+u{64q)Jwdr*=jA-NBgobIU}Br_?&H_XAL9dIq4LH> z7g!7$FwRm+VvVGqW8j*x1jtC+qFDUfjzL*XS5*vg`zqZfV9YkRAw=m@7QixloCSy$ z-&-h<==Dw2!iK_!u)b(>v=|Xz1s9PT{y6#9k(-Zw5W9Y*1jA}{fU48A(w(-~S=UGrz8YgWn3Lqt#_wYRYKYy7tB#LLyYEe-;~0 z(L!t6^Bvt!dUc$0qQ5^gm)|KDtf2K?5#jm#`O9N#`*mJb!N*(kQPDq*>Z~Ok_W5%C z-+f1S8^Z~d`w@?%J>7f3MQc|B=SyIkIwNyWQ+Q$oKDUBWyYod~VEC82Gjn&mk;Ls$ zj)3nvF;uBF1MncyoxEIz=+MGsVMpIWtnN4jW+uy&f^pg=y(Ob3zWmDmuvW+WyufKV z5~j)lx#qp$1tZaDc8|=IA4|C4($4Pzar$kbJL1n>q5^S@4hACz_Y)oO~ zdeYk8-N6HaORu6lfZyafjSP>Wfok;F$sOG-&eNgve;=S254 zs)t>IYMag2zj0`@F|8-R_{)pNAk%hNBnxK=FVpE4cdSesHdt41^ba-)26Ipy+wFdH zeO+r55>&y%%l_}@bAftPKa&%n)3ncpqfwwPr10OhtkNZS-AifWX)6I8fm3w(=e{YP z&=wQ?QuXQ55e2t$*yq#qndHmdg|_xxSLOF+`;`QxIR55m=^JB>TxUjpIlyOOTAJ^2 zQ_wBf&bElEK;nm z-T-kua1OI9I`6B1+TU(Nf4|7!r?wKl_odh*PImDOpPxUQxcC$2b(z&~0Sy~M>t&@o zL-M4$FU%}B(11_L2~T zXY5ka3~w(4Hi~gQ)T3q`(1qm@p1)uDlt!xy@VzOswA&m8>Etf+g^0$fwpLfV)yn6o zroSn849!HGh6fX!ju?Ezb9vRF1UEw8Ar%qLuSZEu$;q9WhX+)#BS!q*7Q=C+AE(X138Q8j`A(^5Vj3Ap4xiPA4LGn(ImvUfMp%?T_B~-F z5zi!}RS)dyD3kWc5g7F9oo3rugcU07uKl;O$V9-O7rZy5IeXfHr@T8Hor_#^s6_V^ z%HKa>gp!(AdGsHSo8T7TjJw!D&KsKw`9wUb1+M{HVq1*k%r{PVv ziZX?y-+KVTzp#7G*_gU2ey9asIN1@#-~8^Yho~%h`g{_iO!217cE->9d_NM*d#gS1 zds?betk;lWhWd80dA@(_LHeGP8e(+$YTzy<1>uz+bQZYh! zGSeuNaLGerz@~lPvBtj7GzkWfw3?etX6*w7+poAAi?C7W><^%m3vnpbTT@+7wKTH>Mc4un#`tdB`?03U`chS-arH#Ilb3$J-Go0*Z|M4MJje#69&?j`pX1Z zXUp$8%t;@cPu+Ylc!T(sc3Hu`x2%crw%^y^V=bNKy9T`1eRp-6OQ!a*&*)A*HsEz? zB2x&`<)*O&Nx4#ROJv}da|au^{MWvBbw>3)FW@9=%4Ze1kfdgj{X;*TN65wob(Cbd z)I5?L0sEV?h$BLyiQbLO9BfIQpl%Y(3gdW`5$LA*jw`vpTKaICq}$_9A5Y2XaXHY`XHAzn?ydNW0;N)AaOirf^A(kb?(3 z=rek6xtV@NmF~R3%3YK(X=06loat}X*_NMC5DxDA-FxzOf#$*p50l;k@mCPm4tn1ePFIt}Hd7`JpU{2u-0x&PNvO&!wUo8dqg@Xn z534CTg8oEG01&`Ejpc^Zrl0ZHvHSLrCD)xJS%iOWKvTj&*Z)q9A7sF>u)s5In5n5wFVr0pIriXUoKH54~I}rTTal`wgUWM z&2{V1*s(4d^!_;I-MM93hZ?G9VUZsJ&KC0xmzpCCxo@pC-!>{sxth_01dJ7b01_I) zs;aTwc4e!C#JVc?J`>0sLF_fJ~1EzoLSjohW zA83rcr+rR7rWN3?+(qU+$=*D%=IHAB(tod{>SQPA9*%cI%Rn3jc+}|F9(~xn!f{)@ zuHD}|fuM5)m=VrM^uy}>Sbk$S^F?w#P?2S451qz<9Qt9ni-)BzG7TqCJdOH(C+FIV zplFVvK^s_KlafD$Xj}-jB8{a}3bkEu=a9*)H5EvR+VQ|#GJwm2tt z?>Q}kMg`%q1AjwuN_b@G2f%#r1T>EnBnLeyuQdJnFY_N1wsZ)`iK^QM=m*wHGIcbG zfZ3Ulf~?(G957c2;?uTvwIJF2+^_@!=Fq3TTL^^Zj3OHh-4*2pPA8k>3UL}% zqe=st<>lPgjFR2?O(ybtbin$-=!lHOBi0*XJ19o6Dllprk-}n?{_I}|3J~V*|Koya zV)PEKw?OoG(9JWXv6=Ft&l959kgr)SsOQ4@=}7+~V>`=PoE}n!D%HL5Kj8yWUZ~!$ z1u2uqqyBCx&d%lBCEtwKf1e_z*7@RmG!%Y@M2R0>8*WD$)0z$^6^7Rfiky6`g@Pq>`7zc1UC*_Eq zlcI(%_U7gMP%hFiH<4&?rH4u4&3vFBRK@C1$6t@o++ zTSw1DR#sj8#r!Cbv`9{F0hzHEo*+SytCHw%TbTnJw-sY^R{0ASoALX&UCcXHXk^fB z24|$7Mb*+`FgcNo?CHqC5-i|EId4~lv-oIPnrT*pmRO`HI1iyV)s=zTjj~fMsNk=f z>Njj#xLHU^y1j;oc_evN*627}>v7cn$)XAVKdV%Usd4JBA6)kmZ4Vy&%>mcufuBFw}0v@CYbHvYN-yea41PKn^)$j)lxVP=NQqb{OYKTI7x-AbrvY8 zKNa6Z#|X|_EQQ7WogE)y(Tv;qxx&aQpINW3mX*Z8flNCRDb(Ney5CoT&3)y&L^B!(X=%tn0>bA7>VL&h6KQ7XE=Kb;ok(lTvX zxbGb6p=n2F@(}ZT7nbwk?cU|PY|dV$Q~nlkA~yZDjgRt0FyB&@Bf~#|{$qBDmlq%? zb2@^cx>+7J$J(X_x_mB$P=Hni%cIt<=oU(#7=#OjiaaLA`I&glQ@)JlD(o3F2*rK< zW5BTQxqOoU4`4Xxn(*Uo1_+HjJ==+Lo0^id?rf^Gew;%2a|>$!8ura#jpNK=H212^ ztoT;0yVbUL(bwrPzo#E=m@uOar=2{_do422{w4_7Ew3{=Lv?2#p zs7~oM6_QP8kKMKp2})qCjMbv{w{6nM*LXWlc{R`I^dK_Pl!s9p#HucE0Lle1bIO&- zZV<&x(iq2&Vv4z1w0*?RvLk|v>fc46FIa_Q*b1=0Bz^qQoB=bo6^;t}`a5$of2kM+ zOMaKP{UDH!(;~olI2wAW?r_V`CSGutAS1x-FMw$^pXww66^}7>KkB<-ENR`!8V`SA%=5 zbe3)OQ0$^j+0q=bBc!uN6eJ&1nGLy@WmSl^|*xZlYG4=|Q zq^Ur=VZCmzLuj$KlF7x$TDyq$#8tnJl-~J^6*0Xc+eaAsGX_lbLJQ`1I4a!WoI{&Z z1@4f>^H7HxsM^r62>k69e;m4Q&*H3lb=PZ$mi0VV5O}$Qa-zqDfdbcME_I=G{>p_y zHWx%+P>c17?VSzKs{0^)ET5Na{N&j{zyT7JZ?$~J5tTOua|r5aaom6M@B6JuqSl)C z!R`0HTf5Hnp_h|Y7jUuj=?#MZ^AZtcSYj-6(Rzn))dhAQhD|tudP$fy?aO}bbXls0 z&DBv?1@WeU^TPXnvt~5~Yih%FG&3pKqF=kt1Fs?BtJCC)U9KpHWfSpgK3{K+T7bO> zNh)OY$!sNMz7gQYcm1(I$-?5)ubCt?`|>mN)#? z`0_!t7?^oJ+q;*Cs1%}JJoymK)94-dF*o1-9Is%$LMGE)%5J+w(oL`|EL zb&Wh7s=;4-m_S(1Ka&IuIpFJ@3M&|Xbz~S5)QKhcU-zjCwn1fco*llW3rUV3#9aH_ z4N0wf)w$L|L=HK_!ZFzcA7pM!?iBVHF%dyxsad@CwpaBmq|OIUOS}!doRBRA+$7M~ zJfrN!U<-n-nf0CdaIY@FWvn=)L0eFu?ofYmtOY|cb@@v-B0yLXx2H{*`}7mVVz;0t zegZkQQ+>&{5K8NA9)~0qhU9Nhc#wCSZHVl@2V$W5|DQ;py%idrk2k%UAUQ5AeQY$Q zgub~w19^D2un>5Be`#-~^IiDnM8EZA>AV%x)&9~p*L#1`fup}&`kR%2knPYaisbQN z752U964bF9*joHbwMr6U@2i?SIBrJ8BeZ$hFj}rW=UnJU_~Wu5g&DE`wSc2GqKqU< z*a`RPmsWCSJR(mZpuD}cFoA+JO3BM>{nfQ!RRupN8*F(ADBHR)cLvQ9B9hMeHmWtU z{VQF~^}SIx7!*<@OSzJyGJsNNKg^l_v04>iJ3KHUAJ-NHQjn)j#a)$xZ1cRU1=E_# zV-vq*XyXxlEg)(w_rALp6k=Zpc5LFhdkvRvf7{Yx4V1HE!spHmt^>T85`*XPU)OA$ z77-sL!iA64!1ia8FW=(x=)a5SW}Vxev=8s|4oG_&AEctgw5yrjw373y#^y17m0BC|_<*S?KS)b|45`?hY{u2Ze%h{Yp3 zDSPF^K(liFny587mpyDIE$`X0e|c{}5W4U^0F}BBUPv&I$h7)54YNDc&v@V)omou( zrj&xhkPyy=sc}xW=wVsTz)@(U)X>cHwntlMZEfXV_w!)?;v^^|-{KA-a~HNY{i~40 z@RuHY*ZBAE(mY(N3G59m7#>@%bPk4J*6dzP<2PT;sM#ys&+GbU%illG$0;dZ)Wx!;L|R6>aI>l1sOa4 z{1SS*$vcgGTsps+yZbx15^zPgh8@=%F@;6Hwv%;to0v$NBxZ0vKQq;gT1UgtsU`wm zJQg(w>iF}u!@$AevxjrQ)-~r_P5&zg)u~V-gXw^}KrD{WAPPxOOV4$rhLh`mXzchl z0r3B`vG8^rLFT;0TDG64i ztX$ajtH&+J^sRw6!2oc|IOUbz+iMD^U0@frUN6fj>Hjs_5(}%U{ZFrhx7JnJ{~*M z2#OzSJVM@Ukh#~o6}m30>BM%+p(i%?5Z_E4{mJ$wOr6=K+$r!dsS>dx)mcDhW*=KnYs6MHk75OM_L9T`WUg}>p z)Zd|g*eorXUmlfVGNeOsTV>FJ_6FGi`+-Y?hcrebB}K96Ld?bQcY!dd4XYM$$}WUH zxbF%ag%gfHnf0ahBxlahvh?rmJVH5*+O))+I<%MvZNRM?zB*z<9y?>uHWW-Z%W7-+G{av{4+^sR}Z`d_P-g(ls^v}hljwA zc@&Fg%V4qn6VcBnUl|mLPWrLU$u7I@cJvlYqg6bIQ$8p;InQS@@Rw|>!){!u(h`Sw zF@i1tkG%*sDjF7O6zVI{QEc|suH#gR&U*8>kFBt_r5~^Se~SC6s5+Kt+XM*&5AG10 z;2}V82=4Cg?#{*u5Zv8@ySux)ySuyFYtB7qj62@X`+WO%cU5;)*XmkxuDNPGmHik2 z5bXS!@HC1wBoE^)1U1PB!xw0`#|^-<46i}1#yp&WfdhOX9Lm|MQi3C4#1MS*)ia^t zNBo%wjOjxB{y^1DMYYZ#ZII2fuchm7($xth&rPRaFujwh*%%N&#=zhUZS+c}G;pX{ z2{O9cRZa?M|MJI&ahH2-?nWbtL9=WX9gC5ZnRb@r^er4j21w%CTBF!I#Fi_hKot01?%E^WZ=kt^2^nHpogg|8qK6 z-BuVoD0J|;hjON$p7tP+(8Gitg6*_`osr&S7|Tw6s?j8@QPx#!>Y~TyVXUjeQ(N*8 zx&X0%_lc>`7?I7=RdntGMsp=bcd<7QE?E zI#`7*PBFHwpuaUsK}1^iRlg`F?s`Xm=T#c{R^9Q?eKl-Koe(@ly#0>6w|W7_g6hV-P9U!MvWrsx+7Jw2${ zw`UvO^e)&a(!}Q@v!9|nD3vSDPImSu+~B=lq3;tjQ(sp zJq|=mnSdgm_5s9SwLTv0+)3lcrKw$}R;61pVmBsBS;W)5Vf{U~#do{^`DWV71rfxt z$of8D3hu{lpl}-mR94@$MR{@V4$E~Y@jAX>f(R*R2xMjl=d3Y{hlomDZEeRgt4pP5 z-rUl5{ucpwZX7A#OV46PmlA8>PE)lNEC!$VL!%Gd?3K&zb+Enm;rQ!KyrFrzQRNsP zL@vb32Pb+Yt}%DDk4dxK6BeGnDfzQe6yj>+as2Jr;CJUju&}K)hlf?^v7VOES-p|< z^Oy|a>`z`&FC z-R0e6#qkS7a@(st`L$fqV^Np{f+y!-eSvLMaxxTAYXlq|9H1lhy<2b{G&N~A7bYiV zwV71i&6=aL()4r0FC8m>c&HxS#iX}pvV5acYDGh9g1qJ!_~GKgK9|r^iPX^AG(h3Qn$1V!#uTvE@ z+`w%!vH2qCZ$w0q!+F53kIx$(zC9us_~SY#D8T2QsW&W|Mh}RHihHG7JYJj6vnkr` z&0ga@rx58tZdo7&`f=}{<)0iMo;E%2)n;dg95-x9bkLRV88P0%?hBI%@c~?+aew_@ zy^Km(^EsoUq`a8UXM$i7$SKge-Bm^k#Xo?dea0|4OOQ~mV;Jind1WK3mA!Nr_9}@r z$ya>x5?+!>Bbxh*cJeU>SBawo3x>~2(hZWOcYSgk=Dn}b!~<2}V813FaI|aJ_m`cj zE84`b*ORj8ocmDfj3pljhiWagO5dH3x3A9dcp!cP)?u2vl@A7*Il)lQ@L|@yY+$q<3_jeD4_rxD$Q>OI53u!W~h`;Uqno z+%;^kEqvVms<(XYZMrNx%JwE<28|w-gCyJ7VkO!bS2-!$<7)<3I zlBZuR*738BX?dqpF?lOW$hWO4$USta^GZwcyTL1Pt9m+BI3g?mWM=-_m(k0lO6b)r z=OH_SZQg*9`f$V{VKRNZy!poEq+2JmfR2*<$$MFA*f=J$>8;}OF#9cZ)Hk9ZN>?G@MOCg+UA|wv0gzLyJ+UFmp5CpOe z7PF_YDCxqDLgFyi@avSt5B=v3POBm+XT@L(?q|Gu*rP1*@L1?gP(7HtS=*PrC5
      35w|LIja#TU73dE^cIO)euq>@x9r7W++F5(r^Qd{ zaA11l;gtvDMQXRVYU$GUYmWhEboQ7(l;l0j3y%NXxIGpcr76b|a3(I_Keb%v)E$iK zDY8!Biaqm{gMOZNpb{XuL;4zyrWQRFH*dOWaI&~V31x0aMr4hqGvJY7>=^+BG#uVG z6n9|B)`THCDi=-DcI0A^lQ>&Xj@*)gQw!WS=Ocd|`RR+{@hwpV#EQ39sq5O30aWsQ zHnJt?bOEYL&~9zKMoqKrdVV*y(uT_c?y2ws(V_=p?{bpQxJYD@39E*}8>n9Q}ntl9zbrvfZe*-@$_p6Zm zy>Np>*rNWA&Msz8%?oQ*QzXRRuN?f|TjsXjo(*n`EZ-NynOIUMmMPlYPPG_=&hCh} zTb4t>+nDaHKBFnDr%f{9oQfzuyAG9d23UbEUW+3|v*ue|givbSpcz8!SI+f-T=WCq zWU&&K#9ef0sHE!iN*TU1+VM&ZmZuuoh39+1t1@uXA zY-c@OJ;d(dg{81<(d4KkIfmg5D0HKsDy*x_b`q2pbA&U~Rim)V#@Ae)9`~}Vj8P&N-_3ss9=2jE8M;%UWZpP(^WVHE%TT?Re zXf1>r6~lSfWW){X(%v^?eQ}gOHp|B&*zJoI0_9;fMWNWj6CfdxuG~s@q-lV(H0v-H z23D-^pnXnno-|kFl*%nF+!mf5KW{IPJ~BAOSaD9Kd#q)N5OaH5S~Qw->d~`e3ZXhY zUYi6YOU|iV|J-cjmWe~!YWR6Vuwf_17*(_jWiQe4^{XoF=!k}4fM8ZZ834wLe7i;j zIo^+|OH8z}vC*!-#c4S&(NPZww&+^Ba0P)C%id39R%XfVep59|NGp^=G!GwpJcJNj zX;!4uH15@;3eGd*)`kK5Yief3pc>+WaXz)|@pQuXm$61m|H;9Pg#m6R=Up-a&%liu z%U*|%>%8yDf-&_(;cpu#=FicdqZR|IJI%kTX z2Ozx0#Kg>}^~=bJOo%UiXWh;)AfQCj1 zNx=P3zNQ8Dra7u%+{i8qmk9=0IJPsrGQpmk>FsDqgR>>$np}iIOJW39Yv@k31@qC2 zb1~#12~&OGqx6@0#KoAI1$TG;hsS$K_l- zhw96I-f@aJNV@E_lE+T2T|@J*q>?mn0@A{1J&-T7v8x^AWWi$l<9 z-DpeDzBtmnZgZj6?DQVC-y>B@#@hbYhv3^=i-^&v-V%Q)wT~_>-FiC$f3!p`nZop8GAD*Vb5715I?g_msP9A*KiDH? zrfo?Ls!uDVv7%N{%#Q?ZTaaMk@_My)GSsTHM_6hoBQ*g2>dlN-{zfR>=kt|p9?V@r z^&CpVT49Z8$*jJJb2l;v9w%%)6i$kE-8YjIP(&8j<3mN3P+R$cj2!w<2-XxYN7qjN z1tIbnv!qvxyNmH=RI$nsjw#nH{4`U_<5mh?ncbH4`ZlbuVKGOWj6_odmK2vB31m7k zA^H%-?z&dkh-TXA-G;a1Hys)J9CrPq=Pg*JQrhkBCZ-cg(;}^{oi?hY2?ChD9!Ur% zXZlmdiwzD`Pg;%FBXy^9-*ilFuu6EXL*hy~%Cl^_L8r9=%rR^%k@F;AI*dn+3VT}P zCb58rf6OwhWA~HN%zEs%Py!APUB{TBhI=n>nCoqE;&&AYbG(R9ep|B^8OWqp-t}F8)oc=^2^Gnd#CC>Y;jaoq2^c*m$ zIP_wmbewij#o4n3mTo(wEaz*;T@wiIaX_P?!93@L(wF`2O@C=cnzj5>!_L~9{Q@Uj z62q@)^C13~MEGwCD}ptbpQy;cwS@<%58EJi!jln_7tS5AvL3!O%^tNt_ERxSQgSl< z)+aZ^7uZ{@W#>s3R%X~s5Gn-3W_dB>7^2(rJJnpWKo;%^s!w;1QR8%;ZyA~Q#Ud4X zg7dzAVrjNKS?M`HP`3MGxc0Dgi5Az?cuccYW^)|E%T1g|f_B@Ztwx)^%4#%lw~U6yT7kRBqNmr5Y>Es7Bd`da9$>-3TAKLwxEplE|9Fty z3BR>0=`t76wf?%Box&DwjJ5w>m!q6h%*$cj)L!}p$e{rsV) zvphGxJ$~Lh6S9&<6}67a5BUE@v6dAH2e~x%N@%(F`@V+K7i&?*i+!ZzFsz4LeN?<0 zfU}2nPyht91`q=%&U8zs1SgQPmoOJo_kkx!PPV(eiyAO%AN6`nup2B?d3U=Dp+DT&xBoh-h z;NMx5VLrYC4IN+Hn`PFj@?$k~b2#Hq$rcqd3GA&m!}USX4VEd;5JIE`8^Ikt+>fZn#E&kbxe~4dEK#Fp@9y(g0=BBAxv6vX^}mtUuM zi?`#8vkAlDmii=+W#Hdnm(lt$rmMu4FgzwUX1E6v(G3q_7r_IWdx?Sxi7;S?bxpL% z<5~2|#o{S1evB?frdoH{3WFuit=kap)MhngCE;TfDsMYJ;7;Efhcu5>zooWT2E0SI z&y%ykK1AAo*K;5}LweDr`wH@Zesr$|@)^D`!sk{bvLEALRE37P|HVUt=0C{6d1{)y zEix9+P_f?}{=F@JhH6`FC|=*kejl9&Cj^YeTHGIZf|5%PKx>ZSvzWBP0V&2YGy6KE zQGzKhQ?rinQ%*=?7IZ@J?+PeDW!=HnJ;n@iRB*wEo0P<9wX%@a_8r?bsmPIk^@Z^V zxDB_kOBov)I0VKoE%6rrepZ)_+9D`BQ66Qj%%{ zd#FS_V3_j>#>KXrdV;i%80H8-Agn4S#o$j0EKvKdO3|>!b7I>1*OL45Wn$Y-eCegJ zo^=Zr6hvb-l7}xqRm&6&{w-FTc@r;T7+3Wsy!jkVl9;Rsb6Sz^lO_L+`|bHB5$xmR z6YFM0!pKzKo|iKKZQErP*A{7Nz?P3BoZj+#h{@f8cx(r%+}{;Zk7%Ku5#(sO`r9B1 zc3NgVM9x$aF(m7ERy?wUVN&TGZ2Xbe8}^Cm8=j=bxtq_7MTO}Zbt)<>GzCb#3`KgU zQFE3-neY^D+v%|{NFrOd=s=Offg#td$H4=DZB-*9Ok^PYRQh9!0p%+O5(LL@pzAMQ zObn@mS9FClqM^OUVQ&Ot!rn}5e`ZkpC;?n1jj*}!uFDz5d-ekk^ug%xXn{f-l;2n|Bp==~5pE(=<4YrHZEg+j}H0C5fGvG-mmQaEwzb{!trMOEvX z-Ai$%*u>nkXNgD;)`GyPDLoMDCLgA5`W~s_<5dJ$B$iK1k8l-NowwOL6tnbpql_#6 zbZ2jG?_twinY&vIU?WAvSq-OE1a2I2ywTl?SA(|@OjMR_k!>j64^&K|`U|k>3V6$Z zXUxhJtb#?HalXVxLm5^ZhDcGEM@yw=^B`Hn0)W}F!M8|p!LYp}>LC~G6gBf7 zi!|K}GA{1~oH#fKtl~FDF#UfT7If@?T}By~7-znY1rrR{1WC#7j2Bx-ks zU)8gz9;QkbEg&G!;8Z_f;n9Ca>E*>kGV;yc5)j!avlO-L(zuvgikmNY4~{VDDJDwC zPzgUXlQG*Z`%2|}mRsz${dGzN9TEuGB07=8(3xu~KAVk<;tcMZ6l`ekPzskCfK|zb z-2VrunwjIMz~~Hr5~Q{M?7g0^!rFtF#(j~-3uId_LVZ^ONCc9mVLHR(QkPlb2%V6_TxUqU){TUY`U@*6_LJ4L zp00e5=~Z`YbD>#PU|UBH+R}pXYeoGJOmg~+qz|6=^YNBh}o3SPo{jI=$M_7#Ww`AJ_-?ac3oaw(f6WY zV8G_uB((Br>Xp?DQQi}JOQ%$5>uKF(iPqF+-KOT>CzksDZMvXy7$W!^RKz40#F&OE z3VXuj`D^p-Sbu#LBga1lZ*72HoXD(3PAZWLZ)Y{Yc6T2X=v!GpH0oihK+BR z+`y-A+q+cQe}lrugBusgc*b6n-exiF#FD-!N$NHgYk$4cCm*_`oSyuZKjt+?0N0O# z#TwDg5}2@$5$ao15V`0t|EW#WV5yK`;aMxdS*zmx2N;QoiL)}d*YWuaI6%R>N*R4Mwt6s}>)QF2hIeO<8YQkA;2?EhL-7+j_UsSqj|GQ%^>dx5mKULR1s zS}&wkvek5@>nhsV>+``C%uL&nvAqT6T#Q+lv~%OmdP5t*2x zii4s5@FClxb2#jtkKG7LToqWzRJ3`~a6M~A?ZK0Q zk_tnDxcB#pu)?whc?^c*ADtfPU;-If!RVt}b&fNsQ)AtJPQm;>f3C|0kkQFVNprJF z^uALDN;$CKlXL`rMM`^|8Ga^}MxDNy`62&8;G>H>$#B#dv!^9p^!RsNC+sDc)gHm< zZvE_!`i?dGg9y?(IGDH9%W~Bwt+6~gIqB}UK4c)AKb6{zd>KD=4B0BN#B-23Z9o+m z4w2uzGyw@B#76}0Y*y~$R>i5MxizN)sgr`9g2XC|{seeYgB3y5na>8lo)!$amV&dZZJAHeC)`BJQcy(o*4>c;U-`brK?i0v4)P@&dMSTTV=Ec zi;==RGp>AtpJ_;Km{s_S)(9p0o2hv;oE&fOwjvH)jw+&wu?p8VlZ`iybYn@@nW|V-`8TNF444#%%!pw~y5FB*M}U)X1LN6fJw=lk z#)?Ap#~dKQ(mkr@ZYSmt%IQi-MG{_}t)Z*S*B$lten$^*ma?GQ=9D2t2x9D_d&*J# z4Iz^N#cS$`12}-+}MOX&pOuwEXN8#^G%wWd7CME^hSmB|l4V_X* z3CP#JjqOFj*5KR)s8JF=?fvi4nD4aP`JO~b_Zd*HDs&`s5FdR$@DjEIY5gecXyQRa zNQBUU8NF`|9<#6mXuMv8JV?;iz~>vn88UkF3j{P6#77Szp8bIIn_sp9|6C1*3+z)L zH9NAM|LM#t9oX?Vj9Mbp|GC=x1K?0fc`4CT;{VgxIytaW-vhT+`u}n3(ur`9fY5YE z!UiH>obQ8?`bw|3XT@oiG(Xj+c~YHq=^O8auOlZ_f6{t{sf;zK{C-Y`wWtsBW{gYJePe5hI9C8u#t9wyLpMhT9AFB;IWahyM zmt#E1daX;$Hrh76Sd%sgOS4jI=RFKvC4qw|(QvhR^x z>QYYSURnDkBfxqw%b#8FfNEf!v?@%VI)ym3(AgjS{UiY7gDd+vZi8A6lZk%g`e3S- zU0T~;=X_4LVjdw1@4t!U0^1KVGcy}8v~zZL=I8G|savy*52#@CtoZQF-SEQ)I2jRs zUU^K;wvKk2gnrh@c~W-$xd#m$MsyNfin2VVy{>gYNElRUl=<~@=xtVZcDJMH?eW6S z&d$QZ0>!!VvRPAL8+(2OkcRZSJGPSoDb6dcD~ldqv{HoeNxTI@oVPwc=kMPSEjIf4 z+3K_ei-f?74HcZn<@Mc#cF#%6M2DAX_tP3Z2>5<@0nHgNIp%j2W6#@|x;Nr?9iWbk zib@hG+^t(7%X-RN`1SL}7F6MgHfCGLK=|;|9+5VT&#%bJ`8jIOTku>>fHzwn^4a{W zhF_5y0-Siw)#0jSP0lfvW_ zoNhH;Or{z=7k0|%hiu)i5?>$6f}(K2mq30ZVo;kWPz(g2O8KRdAL#tA)L`cr87BP= zGCib?v&wpmtud>f<7-Y)x=H=xVyO}jg8V_!UR-zh6mABEHGQ1JY9vvMPC=dFv zSQrHSyDD5!ArIt#EWzhP*%!>JtGS748ESZ(UMOw!F!g%8r?&I^4f5AUAmPG4KtBwy zy?4uT_W#hw(jUWlVg1DXh^4nkIVQ?q$@kA+&|rWyWTby65SE4eXOXRI0bitxvPYr@ z(tm93|M|C<(E(KOG;4efEE4KVJ|>x?0|ohmfmC>g!2Y&nSz6LCo08^8J}e?m6}6t` zdMDq#ZD3941t}v50T+L}O=09x<)m8ENgn$lW;VH}c2_W!Z2&EQUXka`K}iVzSvm{XCp}Th zVlGSFs$8p=i?6xKDpJn7BO}Gxn zqImAR&F5eO^M$sZI>yz72qyca!l)>&^4CPHFENoiopSz4#eAGkm*oE?8h4lw*!fZTn9eS&DkPTVE<;7@U-O z#jiJdSlmMwsIgqB+&kH}$DbP_to<)@duRX2n7uJClgWLhSEzgM?sUGb>X3>wxQ|<5 zmHoy@zegizmfOh+!j&S+nWSVWES1|MCrU)?uBz!_lye$W5e`mu|}Pa zfuh@DP>tD+{M3M9z5(JIrb7BR4o+^7-ZjbO%$O(UlX1F6_{?8fL&1lGbryx%Z9Oi{ zfs^>2M@@t0~6nUZU|_7$ki#G4T_# zik5>b!Al!kZwR)xxzh72? zXE#axQMuoi?p*&Pu#Dt~;XiA-`*EWcWM10|ot`fHpn+KYBA~Ls&aIX%#_+~5JKToQ z5l1Y8+3IGW<&jVM&B>DU=lS>>mqrRn24n7|VRTrraioly!gCh^o z*6Xn44Fb2U<&CT^!PLwOG>s2gI!gF9%RUDEZC^si4QSN+P@5l?L{xHV>U}d!HD6b& z%DA4cJwlT9KPlZ`8s4hAqieM7#I`gbHaEM9;1}|D(h4){XQ|O;LQMV^R-P4?8v8>V z`IY7VROr`$XR*qgt%}M*FH?^ETV&AV*Tk6`&EM|i5)`U6m)_OhNvU-44)?T0qv;%u z|Jt!KkIyHW3fiDOuLug0g&<3C^*X&j<^3FF$~w+Tv$9Z??Pe)FsE% z?EK40#BW0Tuof)$ZbCNZ?25)(uftI?T(hcN9(6t$ikuDK7WY)}sK7f+hBWCwb_ySB zJde0vs$b@V_Oq!wRH!^ImKT>`^2l?`#gjaijwgl{)l9h-C)}^uaHO)EAElb%{>1#O zf0DA`)BN;!ZgnfyP_#PV?6PE6lwAU~Mzd#;Cn2y$t0|iRK{938#ObYZZT{!2x4-;# z)c}#Z*?b@*!E#!Q@qUx{-SjgAJ=mG82Cp%mipHPke99&Lt<@6vo z%S|ypJPL+Nr}7~L0)@3S8r>d{U8LpZAzE*;Wg^{P7jwB6TZ1FxxEj8D3R9YMyHa^p zwNdIEFb?%L#YEFUTAlsgG03ok4zZZ7?5`9hP;YYd;8^CqL=*FeR5{PRrVNhTGDx5b zhY1ei$<3~$fI{=c%(^sLaF+6^YHb#mtf_IlAUgxH)$$<&*ovtrLv_?rl?U0_yJhX2 zV*IgYc)z<&uKr|9D|T%H5`JDF^2R!;Dvz9=*j$&m=39fKXlX=|Wd;|O=1M>}Wi`~> zgNqhwT={3xKk%N;wYg)HzwCv&TCXv(aXsBMIvl;uWPa(vC{=H9-4VSVOL{Vro%Sg! zqv&4h87tYEKLt;XX{OK0Yprc;td$5nV}j@}Rl93RwK&ehdAVp}-xwa0V4R-Y^l`oA zkg8h^uYJjFF5sJxeb~s56g9;|sIb!J7`gqkfSo~I`^oX@liXCFnj@~sh{laGgJ;{c zPq0#Pbt@c|QkjbPsmp-pYVh4^D>Ww6DcxIsqr`;#YdrXiysGT<2-xLmTc+(@t$S?H zYHj%2xd%7th#2H)ohG`Bo8=dQmm@17R8fH*^7IXGkRY4X+EZke>09M}Da-A!v>(Mu zg%Q3pFx2>T?ms~)PgM%XR9*Bi&v@ExU&P_EOxY@Lc8KTu}Ft^QaFUe)> z$$Q8F`o|0|P z)ZShUn&JHjV7AtEqmGxf?<#+uuf6Ow-e1EH|m;XNB7eA|6>BoL^U6o8VyK%Ft%l>U`GGi!ugLV~r@D z-@@qa&~#|6WTe&6U{4+&4k3@?vRytJ#?YAWP=t+itHzV9xi&|CR*?#(W?Z|8b~(0x zGc{R~;d%vjD^FsPw#x~dWdYMu3R^2RTaGLSE*VbkY|>oi{-ZB$)uA+M-Cb{K@!gip zqYWOmE$Khth!7eA0jzX9T&ULr4CGD-oMU87 wTJWz&=_Ln1*Png?DZnYr|M-|=gy(PI1CD6f(IrYP|?z$4wgd+)W@UQHB4O&$xK6deu@4ogu%MiUMWJ_q;|Mg;*s;X;|hhJyo< z*-1-76s4u9As=0=?HsM(;Jo3hlO`PSB?$(*GN}pKb$$%Q^wMgI7S+r2C~?`%=vpoj ze~Ihj%3M?x$Z(unROI^|YIAlV*`Jvwh$|z*74jNaMw0os;~5DFx2Vd+GySLXUVl@2 z_C)*BcxJXBFZko?`I9aPyo}%O?`hiQzg;2T2&KQCaYL2oAi8xco_?b!w@|}xdp?t3 zm+lZ|tL+^!6BeAp*z=xlr|PfaXvyE@-q%GR7xx~MOXFe!L+GtW5U`W(`s+%lH&QPWKDfp^P2H6 zTVwU7kS!fSJ#FJ%WvhO{s*8^r8kB>Tx&#mJ0`oqE^h^5x=I3I;I!&pJcJV|<=s0G_ zd>(Wl-0p}v7nEJojzzzRb=QJ0;1S7Tw=0RDkr{WQ^_)s;wE#oE$>hW!RUxmiqg|1} zTtTvLle>F!!ggY(b@+B-mc%x&*WW^log0-_`{CfI;S^;gwY}kwJJ9?IbXvuYvx}0z z(~I~D)QG5UpTV^Cq3oPxbiejuUwa^1LtDm;lUr_P&c-P^5I76}Q1rabeLYE%MIwo- z4aWKK9v2ZFOR6^otN>cPxzzpr@KP=gaTm!h!Eb%5lid{fm@%VMdeFWr{9Ao(H|rv& z@S_kpIYk&84Hz|y2xO73Ls5YRe2)X71<5#FQsRKZz^Js~S)!0QB^_EsRQLh`Ulde$ zDQZMqYI}?xxnfpaP#ByBSqB1e3!D&CoQ6;4g__C0Uj&!MtpQ(gP$dyt<(xvO^{Z(j zK{`=5)QD1;@HMl#9jA4l4h{9=jMS;vcWyHUE>kUm33xrJJYGamt;~~! zk-nXiKzrzj39f;1j_DgtHiz+7l--L50&CkDX_u}sM%edCz$nAOwK&ZONiBq>Lr;XK z3RS)~n+NmDCgtLn!=L=bb~P#@8QL9D5>r5SxtNw#fQQNlHS$GMXmkP)h7J9J#}Fn@$%_K}ZEKaKBh$ZOZd=*{?3{ru_O-QBc@oZCnWN76Vm zE&O*A2b!QvLK|*sovg8FUi}Z$HD+C%WL^9d0Zwa_U(?!L1@uZ9yho(x|II(no(7_S zv4F!>Cn4LK@cJa=$Dg?3hnB3bo#af8Cf_u-zp)mlJBuxaX$t`_he}Su^_jp8+Nr^_J4ocMGQi3y z$p)9HmUGB^;)BA1Un52?wFgV50^H#!xEdA$r;+*Ebq^1C3^O5c*WyO< zMOENxQygmh3lO%+zmP5l;=5!vg{}<Mec3Y}2;DGYugZnIIavrUo^j;Akbbe7ZiCTI;jq@Iv zCeIvErJ?P1?p^hoVLrLhXN`r^`+-RB&olrIDqPz zQ~~RVh?0`iYOfqo!$_S*eH#xHE#J*Jd#PqJ4>b$<=t>B!+ypTW+`c@@Y_YTVcv@KB*$aUwo3af91%M*{IBru&H4R!E;iAh_8C@{aB~h6X;AMKr z*w%JbJ(I)+a3vz{9B#j6UdcFpbil2T!1>G%iVS=GBb6sLPPs)wh2oI>bzJZ0s}>T~ zS;i(J8b4I{J6dYF-qfy8G%6yUXfaPxGUDX?5oE-urN0lPiB@63D>yiGn^q{Il_XCaW_V4aAXbHIcFvKYQN4|d z8AU9YjN7{K#l93lD_#T&rniug_`B0y}eV7F8m1dHWzK(o%qibD-KN$_iWB`Kzvc3i`s^Gw_PrDk%y_`84|X$iEg;GC4vtwrlZqE( zepLI#BPBKNo#+$>K9%g&{;oA?f;-w+JNt>%Bi4~_Q>+oy$BEJ+KPe3CA`eHISr;PP zTe|eFBr?EpT$-gBND0Noztp6t%TR^rHZy-J+-mdS<+M1S$A;ZRVrXQ_>+jLiOjhE$ z%Js(h^&0hl7g7~xtgmZvL3@) z|AMm@hpKO=jv6;eBTMmN0pFD8|Mg1`R3UO~%k*ZZ_C=y0hOvl|aBgo|nO;9f)&hZq z+DS#Jym=aPXBqlO;buqU>E8<8m-RzV>fY-{pUTF(s+gH*aO(d}*Gsg5_ihdhJtpjC zfz_l?pfb4c;7szUD6MDNgR5!!Uz*2@>{>fAT}(4xT=*1?Nv>+eB8P8W~XMRzP5#I z_HC}~bEcHDLe?^EN+IP_U*XDgi(*SlVd{=(+tWB^)8SUO`@i9>;B3?YTO7y|rQ*T- zF&j0|`LBd%r?{GCXttx-5`UWIk#{Kr_1g-+lgz@7{^WjZKU7 z(8NS)XT4s}Rjj+>I9ggY`#+#zX!hUJ^gdth>NWh(SGD%*tu3~zlm4@{we{!Ec8MI+ zRnRscBZTk6Y*uN|P21auzuh)QjpkWK7K~YAWEkokzOw;r)^73>^Q~5SH9%3NW<#vH z$M8Qk1v1|I2wymi&813xf@UXo8eBFz| zH9I@&{^uIJvgKe#HcX@>@yqA^Q$3da%L|IUuxi~NPZdPp4!%Lwmhw4w)h}W!SJ;uC zlf&C{go<($JFMkWt?D}i_?Hb z5y*7slHk}duAmVPyiPJsBRjkOfjBZQvrb13N;hVG*skjpJbMqC<`pa1_gY?YKHCNF%aQ845KH9vE}Ch+63qX6&HmG;?sv$ zkUUhwG#<-=pHcYP*&cdc8sMciEXihHH&Y`V%p%%<@V5pv&0b=YJ#GP?G7)AhV`gKn z^A&h}@n_{!PN$_GKFFG!Y6nwZs!kWt^ge49bCx zb&3j`r`^7fJSlJ={_CReLR&VT9c z50P!%F=+A>5OL66*-O*6&rNg5C822I2ME+8!mO;UAbGd%$CoDar8leUB9U5HAWe)k z_HGDaKw_bZfeX5GVaMxS6L)In#iKl$GiYWeV79IdxZ6&Rot?}_)MNkDYvrO8}lt@DBvH87ynl-}F zXRB#toScIv^`xlza5va$nc9&OVHO7KdKhv84iqK=v4L-pqMi9~9f+CJB!W8mkPl{S zwj#&}z#UEa8kt`Hd#p4#=&1Tv4F1RBz~&<0{0M&kURFL8D^U}YM~r|}zS({G@b;wH z@)owKq><-*EHk@PoHzdgze((d^{l7`K0K^j{}d66m1LnOiHk~ z(Gz;w`QVJG2A$_dX06M7B>cZF{VWxHjON0(ICjl!r|#`aRECc3J{V7--y}VotA-@v zvL?z5*>xA>`4KGaux8USM8sYouqc2!Xf zP`3mu>84eplFn!MR22DB9_`@cg(`G@mHUbbSx=3URWa$rIknVA5Yi!YAYDCa?n z7Md(7qBqw30rGGVC=d_?@3H-d%WuMJr0CmOeI&i#WB%MfS#87R-zLZ-a)g19qGji# zr2p^L#zh1`#YoU#*em?h0lSi~Chd{V{3YO?4@pew;UL)v(k%X8>i)w)M9!(C;bqmz zt{T=-U>;Oh@+n3*fDG2FIuAFlkCT&=Kj*@L35$+uPFsfO#9%-=nB)H6xFEo(%{01Y z%QU)*N9Zq9GZA57ne;pD@R}{tU|?WC$~$!!ic zWWD)rrTYejRfI_+vmi4emI+Y?v7)jP7sb%ncys_f!`GT6>G5H4Wb4ZpN&E8haz~Su z&o{Hi>&OKHdVI{PsLYt~k~n$bu3HfLY^=p(TBpWL{m3+5wejQSUKkWMPc1t$JuUSS zbJkA_fWduo8ObrOp<{3`T0*fZq{1dcGEy(qoY3ukVti+%G-OtVJ9fGy%nLMC<@=EFYb>K z@zXBLVY0{gol@-ki4g?JYx6t~0r97+K=RTipxeKlTeefUlZQWU1|8WGmc}Qjb+L(S zV0sOTCQQooL>K~02oBGR2JtTxEGgNuGnSc|k&$JY*ZBDOn9gfcpRcZSC|+2oK}bTh z`qBgI{J_3N5%YSe4@OyAa5LAA(p^G}20ft-=8wz+PvnSUX!a#0Cc@ib73Mk;IsaI) zV0{r1d86W@{N16%e9e%{YY~oD!^mr$zcm2|6&-|=lN)%yzndF0PQdKX=Uy2{@m9B5 zmktZPue4$lAx71qUP#+6W;QVqV0ZOi@stWqQnQSbl4w$3Pt+`-4!Q%_?&r&WKhE}%ai_s<~><2WgW8MQ^zo^@W5$CB38aK97i*Z4nG!Q+#o9Bnq zT=9S<7O*T5x(!xn&IY@Xl{ufB#X`Wa>zS$~cgARZE%cR~kcqJIL32-;OMkc;XF=nn zopObuEp_lv6C}^?`Una_s)3e@utFeYWVE$sI{sH`M`$i_l$Ftx;iE#otokwmRf|*t zr9w86+V%XeqL2fyC=2jNA{M=fvCxoT-MX>gKM!d0v%HVy3W_;Ks~Nr*KYS;xwr?L9 zJY8*%)8K(2&>DpU69ipdT~Rj_6wsD{XJ%$Lt7zmZ3PH(AjR(-*Sw`Wp&tqR?uj=e5rj#DF^2s9z~HSpa^{@0YUr`I-B-=pls}qK2u}S z*2p}-d)^jMM0r7x41&m895oB^8WbUr5FAuIkn1EhxQ+ox8LrKF;K4YuLF-Lljl3@b zJNH~+jTj5~Yl%W;OZc7ha=ps6&5V&t##4EGG&rt^+>qeUESRL+NIoCWzhcw(S z!1bKk=iJiCki#4T!sB8NdqKrZyP$SA9REg+&Jynxy*DUHL-xb@D62u2#| zc(T$0oA=kt`_hkHIi-K*Wm=ojcmH;)r2bh5r{F6T5A&a%iH{2HriJ?#YRX>RNYMrq zP3wVvsRU(}0sh;5A$2-ndjBpIX1p~*k|w_YQ`=!=Abou-41cE~S%&H9#l^;ZuS_}3&afxU;=%y77O?@#Ch3q6{rL^A;gf!-riU*jl-Fk5 zoQSiL>oWl}8N#PfWJakjVr*|G(*dy9T+e{s`R_IyU8^|C(&%yPLKN?>gQMbJV?t&4Pts6AoTlytVhZuenGc1F8gu^y@1h_wKtV)$kiWc|K?! zhlIg3$Fe|Tp>O`H$yLjn72wSV$#l;N>dKRL$W1XZT1|R|W+`tf7670PU7BOcss(?% z`OQ;{YCZxQ?M)_N-a^j|&7XT`r_hBtYYWcMC<- zSjK`Y7zqQ*Bi1^-9ROEWR4fqh0ZbpH953wwJ1b1{oeQc)t5 zR#*|{S6Cz>b+PgWZ>QAz}6u>j@nZz7$%TCVtN7rHj9{<>VYsK-Uggw%{k`dg&uU%RQM?vDSP| z&T5qx_8PIb-T2VEyx4YzJlXzkZaO}7+{F;koE!#w@mu2!_AqJkL=l&kmev9vj^|DN zstXE0ZMzJNjN<3N=x)}7B#M}cImE>&5mP^ZhFj|yIbAljF`w7>1w z`w;K?x?LdO-9dAlPFUS(v7Nik5}wF}Vo=QQaz*_Q2W=l5WemUx>U=R07a%P@#eLkJlt^2qj zy`p6l-|=kjUYf8wHqa>W&Bb}GZ2ZFAm)C?E@oy+tQ4x(`FPTjbNQ3rz`l07LS>T(k;gI52gmM(3SC^RcN9o^l*8<)9o|5X7 zysAhWH-^;J*iCZe3uXyvltw7v+g3Y)Tz9sA76=i}eVB5)m%v#u^t+30Je1Fz7A zPcODkb!aKDuecK9k^2df`sCaL38$&+PS=G_6jVqKZ*$r=Nz9mnFmrEsIW!+1;;Xv^3cIqoRu$NH#RKyFj4`r z=}q`mTDqFAWVc=ohlt;Yo&lHh-Go5wS0g@+8?SEUT}8xp{0MXn!A`hY{iD^-{VTt_ zaJXs~AEwAr^+ZtNN$4PkhOKrpjH9}i<4cjabhQIb1bWn}r>G^E?m|cYcYw^sxzA~9 zvAgo6v*(B80LL8v4A7?$<##zdOp#^t5G_@l6>^zjUmTVgwLp=n`&HGJ>#3hJc}Cw!({khf zl`rP&;CAcrET6;bCJ}jzpJ;Uoh&Gr%3X8GZ7WJR?6g0lmtx>*BszEf&|}>{zTXdKn$yh``cUwTB-P7?*2 zsnbzQk03fRnRwK%$;pz?tt4TG#l=Np&fpPbQ|TL^J0RyOCjM+ID0rr0RC9v1esdsd zvA`&=l57bO?2k*)>{md}hj`ngyrO(x6pqdRnY2t*9DTNd)xRIvv34UiEGUw8(6U@qdGt7eb~QoL+0fVsp&ufx2M zcC2TB8Hu4@LURKm$dI zgn7ydXl=D(QLHj!AlABLZK30=#}gxbCLI8m{twmfk++Oc0U$+)6}y=WUsNJ&Gn8mD z2S!PAaIIL-=qxQScr6NwgzGnKjzmT(mxN+diV~v}K((j=%1hEVqy$weOV8|*qi-L2 zzl(S39>&ydPJX_R`1MHJHl$27A8USjEF9FIkr1 zD(~kQ9eCFBf_NG~1PbRl8VV9~-3Ts|;2>guh4zo-e=Pu;@ZeQQ5M6ozy1~#5kcrve z1ghXS+~KPD0v-2YkeKh~-dwd2@F8i>YIT4mpi`i!V zM&Oqehbtmto9QD2faEK;N@XIRpiiI<*G4{uof8!oins+Kmk4% z{UG4=H%Gi!rx2iPCjlo?qHqh>5ia8d4@#l*`;JOoh4;3}@)V>IBtp0c@Y0y-_+o?R zJOOqxmSrAD!c|iyDbNOze_we&4J@JL`GjJDz{`e$`WY8c=8PI06A76AGRc$`fj9Sq zXa9{i@q=71#26}O)jH7#vP-sK2m08=F9D%M9SB%08&=H$O9*R`2vQo zGK!0WAhAHo;ek3%N`xk1O32~d-#uFfKL1 zeD46RbyNL-K1+xjrgO$v$%_|=d%dB>Dc`26)M)ol@=-l~b98(52a@NyxKU+cL5m1g zOMla^1ASw!#mNjHhZ^9C%_Qu2IjTk)&T;RZg*7rq$(S$4D!+XjP?G8I?^l6J`EeTl zU=|i8QNs#+j9vY#TLAKK617}ha!7=&7b(6WwS}+yUyPwp`F9hPjam2UvZEr&>XC+& z)p{4nIIRYD`a2&rGl^zFV9nD{kUQ$5DZKyb)ZoHDGG@m%uFu{Ur@QbQ9ii?vE|4p1 zn9cO;ez&PnRwG-{skOJa=f=2MX>n75T3cJwVry&WnF}`ZD*t*s&rXD;!exu?ufb3O zo>qCPEO>$6;DO(a)2aHN@0i5xPoUOQAn!UmPsVSelRe(?#Lq6c?)TAgLO ze)wYV#0%h&S{>#&nITC-h)C$WNF$Z2A4fPGF$v57(knzj8JF9jCTB@5D=o;v!=a3N5ZB9%N`ehJ#E+YOCrtl}3uktnB_o#Has}m6)5G zlY-`m`4JU`)6vl(j2kK`p+CMBKpyrU8^I@7BG#mD=YJP0=7}fUi}IZ!YAGbDv3dj_hbnmI&~Co%B$5=Co+Tnk+t!ZM37T4|ozU)@aIE4n;$}4OEA1a% zEQqMYb9Vc=BO?oFrQ@mQja+)nat7Ts=nwmN7Q%y$Ms!@SCIl?oJqm&!pzK z*52|@r6DD-4Ga_~U>4=~R6w7-N`WXXt6~idS8pK~9$2t0;fwF7D$f$R|MDvXS8jgU zE0pvgtuQ7Tqs$&-P~Ex@nZjd`Lr8>{7S&{@XK`O{Rvr9F9S<534AAm_tgf4(w8?h% z@bEb8dU@WTDa{6HYXfq$s;VlWNY}Z}bUP?KOiRxjOr1-(RC%NHF%qDyYjMcV&T0KZ zDL2l{U!jlpIN?3yYU9r6qf8%TP;7+yj+18GZ1s3;lUkYX#k)FUbkzLra}C!{2i@E?e|H|g3?O$p8Y z##u!=Jv|)~MFGk4@$rG=!KOCyHud7vi!_u{bGQhLs>14yH~=#8I^_&bw)aM1`9I$W zly!DMFJx*o4n@W3HIGZ5W25k(2*q_7yZqzN+U9m{k2k-zcSyz>KvRl;lEPp1IufvT z8*Hm|>umm0^Pldo5DKp-kytI>P2~`g{)0w^HUKmd3vCNhZaCAiM#RixtF8{?Arg?Pf)yV(^M=1_+zQifRiMBTx zCSsGgD8JLqKGe|&a_D`W>3)OP12jiG0dXxBD!|9bjU+zm!>%4gAiW9%>(N zZ=dtUkeBK-fMn=Grt0~<@KvgN>1^L#ssuenOd;?8Sc2l)IW2O&YI#s{H{=M=fL9$Y zD`toi$NN_+qK96^sHHN;`q=ABA&lg17EuKmx=xBe9Pvg%Mjhd5^7DY^3W8;xf{ZNI zOc+-S1eTy6Z}NMH|7qIn*lE`K+j3tM0HorJ9(sE%Ve&{v$dB7sj91tWfZbwk+|wG-3j zKs}78tl%b6k@+;x@p_j80kinojO@O-;I(pirhxmBa`>ElhEWFDM3+gjfak{N_8dv> zy<+s=R3R4(08<)jaC-u?*A!x;PO0Pq3}HId7eqw-jB_h+_z`@H5^2J#WiM;%J&Y& z{!$YKq+!!F^1TtSTx}T>M~DzdJ6=lyEs$JllLn(7DJ9bSs=sD0vkg`lo=6KnG2~Ol z#f-f=eM|oi(PCp72ouEtKl_ZOw9=5m$ zmK;tq!!CRJR^P6mcXijFgfF)v@mDTLQniH2irqrEj~-!1vDEAbMw?aG53&4=Dkya(Va z3xtRMtr;DtFS{Wj5s&-Q2r8G;jGcqpi}1JgwAj%)O1JQCMazC5_oO(U$}y(n;pX{;8ZN7p9s|mB`{2F~i}VeV$CQt6=+{_k6Qd#^Kfa zwG4p3kPgZgbXf~S!#5^mF2nkI{;x-rYH zKL?hv|AWb2&@`cYRce+<$WcsUapkh%di26Kbdfr&{LRZ4r5Jg8$&~FvZQ-sT$cM;? z2#`TByh^};f)>LAfw5nRFE9x;E&CUt$B+v=y}Hj%*uM-v=;cSVD}2BrCi#VqbhYSz z=L`6hNO4m>QpJP~t_M3?5^B##cW@Up<~7!~+@)QQy7`60R2309WCd5RBJU@te`x8j8yn4{q$Pg<-08xxoL5Wi&)?br5o#EQOkZMP)Vb_ z6cb^q7f#7KA7u3bjL>fVripw$`;MyvXwzt0gg%cE@mG|3V;#y!K?Bc+n7)7jt(+Oc zO-i=fXVXMjCJ+9Dy!zI0rHO&bE3IL7oXQ~k?E^`%SF13&fMpAS>bT`ASn$>?D{uAy z-bvl#Vt1$Ob>Ae?@ynqCzN=n7A!>j5bt~7c2*GlrG*nkdhX+Xnz=pzZJKRXa-dIJR zyy!o8!Mu#3GloH}-|jUX?gp)FnBFIJ7)|w#8Q-K&>V_-aB0m(t1E|BG@@B=SpwZmi z#ZD|=>>^iW%Ir@w{EPkJ3~xK~zXtOh(7IGcCve!rCg$!wMW3ZBsetWS%$Nxr85Rh_ zey=~Va9YV2`Zf+`ol8V1cuNcK)B_FfpF|JMM-GRo!|Ug3mNXhh-OEeUzM6jb2H81+ z=d^%u6dPJP@Ys;&AuI_6TFkG}XKnfFc_7S?Ba@9(9>_XwY&4m`yWtx3ax z%|%mBxbFuVnYPV1Po1R-p6gcw_QSd+S=nS>nxJEmCoYVC=I+S$sL06py(7j-!m&8( z6xp%&=7@}9b}>0UMJT4OLT^&uz8gSEpWi5a+U5!p_Pqq8@1da~NFD+THfB8NxC-gb z`SbUNXXAj??G)wA5ly#!U@$s6rv?&Al^8v%#|F)9r=PIYUqq-~SvKP(UXfQGNcCDwFgZ z^WL%R3EE4(oBHi$e3}t;8O_1j5?dL1$4~9ta@C})hvD$v^Yade)M`@^Hyb;@kKc8V z1Krk#Ipjx1Fy{ZZKTH-h*fg<8b)9X^qlOy@EWb7?dc*UY~af?3EmyM zD=H3QaJ2_pKtg-qOv!lO{j9edac(;nAcoUSil@wi5+-w7U(Pc1^=S*Z(TS{@7p=2W zZJ>~_JrDn9gn1{HY~Hl-;)CkSA-#E)Z8w7L5%bIN{1Wf%=oRHgU|nY`mdO@pFE8yw zu~zAV*mtJ!9duRQ>tek?Lyz4bvM;%&H3&dBKFv}lO*{hP79RYkqU!47zE={D_lGs< zAlWDkBKBXSqharQPjQOrph+KZSr{<`gerG3m3OgWs_O()K@LYh2DiL{Uc{cU6KHrH@J`8MIjo<-1atm`j>r{>+kP0mX0_w$=qN< zH2wAAI}%;{8}%llj*HO|@}?(wd@G%yJQB;_skSlC6z$fCHCILllPW1Y+sN7xrtRJz zW=d33xy-CB^XTN`f1(47# z@fN-jfY3f5SRhFwv6+`|J4Z!tQ(fx3ylQ-1x7w3VH%K4V&Kz51EV|FN0NKJ$93)9@I5KVxMuvk{vxUc!^W+~frH}X{+f?}pvCy` zYK}Knx=EBu{wy+Z9$_;Yj>u>>=e{F;KIYkQDFNlDI#r<43S1Wy+^h`AL%}8w2K_#~ z0@@8@zl>Zu2)`kweLZ7gc9||x{N_2#eeC)-S$;Mp*`LBroXk?JKSDK4NCP;x)N)pt zQt+l@h%(22qU`Gs?9(C+FYNMM_ZNEoXNx1sO>W<*$W8pV7V@PBm5h9+z#!k$hEm-inxsS)o;BPTxIJhv;Ml4Ett?+dblCPk z2PyhLhy+j!66zYt;Jxkg6&G1-ewq;b`jVBln_M`iu6{shi6$W3(&+kWZOGwzw%_=1 zH26G2t@L59FroAQfUN|KkB3)F#XNw%Q3WJ2dh_6V>(Alx3~^a4=Rd!hrL%`rSZFEF zJpTO4cgFu^&;sx-HIjEY8lT_v(!NU{U}9lS7}%dhH!J55IXrQ~j>wz&V1G$o*T$#Z zc>c=mXt`{jB7XiY2g7@=h1k^PZigkt*oY;q=YCu+Y^7c;gqGV?Ge92ohHVT|1&tCg z|8f8trjWePxnDrCEw`I2xF_N)O>r5Q-wXN)f~To+X2h|o?IKK>jt zhZH6!qkgQZU(~a=%#(58JD!Z%`z@(MTa)dpS>wcqE?_kLsyS@Y`%k{Kq>IPdN%|8y>8s;-U|t;E!ybdNuo@W_6R$8 zRjhD}+OUuiC5@{j@!6?3*v2bvi2#yso^JbxE&DkmY5oh9Cc_$3P#ovU0XCHfenlbj zQvplNHWJ|z=#$sL52j(AEYQ`0606Sb=W?z_fk#N?i~v!W$#0jVZW_w)C9yTKyrhNu zdqet1u>6tC<34EVZ#@#K(~EdYS@m1*rQ3=|E%p87gUuQP{MY4pr(eCXj&``r5YP!? z0RiioKNk89G#E?5n+GnY0vOgOR!Bl~gnVf^%CmyWc}f4f=F2OL4~ju?G3u~1ULhuc z+So)U!W=IR44%?@;FZFQ0Ru{lhNFMO^{f_hb<#W@QN@>Cl#u!1;o&q8QhATr$oTkx zE4;A)jMQz8xaTfLt}Rxo+qqV5H#XyTZ@)08iIgomq5aKfypCA$vtx;`<+ePaW8zu_ z^ecFOTm;P>JqK}X7|nAxpfxP@mR>H2Ah)q0wDX9pEDGjsSOLFRmoLq#ocSt{L(0)r zGO@jJ^^5riOSo?|Oq}03{qyCd?=T)0!QJCdHbM&eP8Y>nwemM$JqWmWSHY9RJ@Wdb zz8w#}$Ns^}{%-F_s)uUKvinj-!AqPnSvF6Z^j^$q!lAAjpg?-QN`Nouywju?g`Ljz z?Uhi10TEhnl16>{lc0xxVbc7`rshcmJwb$2b|rMZ-3U6R&J5Xulz@34!POUlhoBy8 ze`~kuFWITvEPo;Ue-Ra4)BF4Wg|I7_X{cQyU_LVEH_)~~pv+UaHK#qTsgGRpm%_uq zIY8G-^Z6h;i|3WfYDM#hzw6dPzY-yb^nbcD8o|!|h{TtaNC$OTd?Xk3gA)42wf$9X z5dYhT_P4pO3|~5mt0A_xOMtC6i55885dWx-*Ra|gcT^(BvzB*-?mbr3LdSkA>8D7JSW{+-he0# z|1nL_8R;A~V6)|8RsdFCe~Ij0$LE&Ag8PKE$wJaI`2d+Q{KQH}|8MPn(B!E<=3(tT zL1$u`KBSOMFF?Wo>6=ttQCE^D*EyW%p5Y;^avb{|x3xWdiuzVz=zd{5h0Avv8T|47Pl z`e~>4n)OtQe}mFRM^mu+Ml8_hN!Vn@6L$rpJP*k@WxsP2Y_g3Btaf2}?Za{Hsk79V z==3_P4|z+#XmbO z*q>`iYVh_w^vw?^ZLi2wqwZ(Q!DmssDB~n&5JlN+%}?^LGOxc_%;O#H8wQ+THP0s6 z?Jow_Kp}Brn`B7rrn4^j_XjC30<=@Fw9w0cx=kJ~ZZ+GzSHJ~QDDLypkJ`&Y;!`kh zNI>fWJ3vn(ESV?g=5%4C=zSrH`gbWT5LbprP*Hj6QU{5Mf5QIt9}(YsLx&Xx#T zaAxw;CKW2&o*=NKzKvR1Y6x2`a630d^B$Y^s;GELNYg{Q-Vg86H86-$jjv+^+EhFi zaV!uydzDl7WX@%SmCR0hOjADhQNh>I;(`tTPt$mZ7jduG#lLhVqeMit)|kp zP5xB?Z}i6@TtF16tfoCToC+e&7#H?A7Wnq^#rcA?F>R^dN?BPMBa1)mlT@Hom=gL| zvAM2yO7Skb=8ouEgP6HzAu@U6BGk{^%QPy%3m-+bCg5Ma=UII8YX311Ri?V44xFxkF z**2#D10pO#!|R?z`i~tfgGIzF`I)zU?(=7%$*!G0xz3U}X(0a0F>3x5zX`FMSW2-B zj&KCcz8WMZMX0YoMw{;&i@mP*zy1C8SKvGEmbd=6#ARPMCyf2AqwYKc>S*^TAmDIm z8FG$}XLoAPT6rh-$S{ELhAO`ZU(7EwLlY#@00u4%6%Z5zlnN(4Ty!OLzPzr8(Wr^T zjA*h0hYY2)jujXGIhft*#U~D@Qg0jjb~*-yD?Jhz+B8H~@q`e4xf+BWLrzA&hYuue zwXf`vqj-_X1Yaw_YcY0NhLi^`BZiKi*jm#3rU#TCp!`#h9U-#3fE772>$dUwH=^w;_pf>NdCo4CMKx5U$LbVwj{XjkASo^JBw&DX8j#-S_m6o3sS`nD8$LA;+Q@c;VL7~ zXE$qq{JG#-bbA}lqZPOlQ!|F?2H56~fm2!G%4spwre|2F?~ej-;PPqd5q;?zgpaIO z7uQKi(Yqa_esUPM{&JvZH1n=5DM3cR{I3CtO)iAPhTFml8E`1FEfQqUL)*v_-oL4i zi^5owsc@X2C3MM|Ts`=+$J8THK~3eIHu#^? zU*60H(Vb`bVy2$eOa;8_c8EN@JgG@nVN}s)V`Y^BS>`o=BCv(6&&M_btMt^;6mTP?;Jj!R%rCAQL03A+HN6f!~cz7G|R9D%a z@?4`arROvDAes;o5;B%42naq#b>_;DN4y0|^dB}sZ~>Z(@fnvh0LUE+S8{LN9t*k( zA5Voe=m7Pg@?I=2p1`KA$Eq-XD#uCwC1ow9Y|Nr*Z$hl5<}K@WO}V^OgxpnB|GNFH z!$!lnb=L2>xz3m82b=LMD5(FRKN~6I%NLM&6$}gq_X_Xd{{_&rw9G34KRw8Kp4utW z1qsxaY<#qX0{XsUkDn!@*iNxJ99tVqZ|x7RE+J23Oh>1c$4zue+uta#OTGXKsC@jX zDgPw$mjf;x`F?`@)s*)xKW4zmQp4fJghT`Y6`{QYfU?*^!H3M+r)N-%PW5J6HsE4w zCuL{g!bPWK^@}iH7w=o2=&)1F3>=YlwldYf4HsR4vjN4t`l_3K+6X~}B*oC>Pai_Z z9~*$CqCcz$1q%y{8i2R}hQlOyyI)61vQwV_XEDYBM~W-zO$8ohwut}z1(UdmMIGr# zXCRHZk2Ij+%g@v)3YfKw0jP(S-5S%_r5(+7GG2H;wg4A3z`l>T>-mvY`dBh?zPDZ{ zUA-*3eP94fCB#Xd@q(9b6p^C?CB9nut90!b zGXDSiIPa*Ynstq1fJl`Np9v)vKm-Fw$MYn{Jm&)&0UX1_D*eV^y2@$~odbkV`$PNaQ% zjkm@3jjPdN2+Oy=<73=8Kx~^mV2>DMoPnQt_Hg9e^BwwsN*BQcb>H)V+$59*kh6|( zlZU9o{pcSn`t|2t$y1UUUF!>Eq$Ve2ulE^1<3rJyp zKCkH|)X!bo?1u4os~gE;i}~x?x|7|&oMJ}h=jG?~{rWB(5XnV@^J*Tvv@isxEsK5= zHpypELrPNo4PL9w^lg))692KbeH|iwiAO{Eey`c=KLzvPlzK|OZr}R|>#CH}R{n>8 zzihVf=jt$*T%7_?7~sEf2|%+-URA%gX(cdb^Tvi@ODWcbtc{ zhqC{Oz4E+CGyv}Uc8Ajgl zp>n#6$1k5u^&IW(*yXU=`!OS`4~4LI+msAOUPT@xym!rMbHj7Ut`7gx#)LqIhJsI22h!X>Yf%lLY)>YtyZ|x9 zM}0Q)ArChp9B>8rziX{saj$qwUend!kVye6IVhwqrYC#trVi|5ZkKJnfjv=Im}^nK zvFu2_wyr(`3j!qcHbB@|Hmf=OHExK#xPo49`@B?YQb5gvd)xR$O zz`y#Sn0QV5vI^7IJxWQ_Ilh_jD ze?ey=6?EIksOhF2V11kZ!s>Pd29+{NB_*D?%#Oz4S(;P1OPCq#R5awtxtz8UPEjeK z@N)3%%PYOq`S00xa8f+a`ekfYNH4JjRx|!j);O#j?&h*1lTP&5Wyf`#($u$K%&$Qi za5upyj#H3%codI6T7jJqX@BivCO3;3=*)HWUyLoSSuF1wA$ouOciHhE&I21g02NWD z3#=Quq| z(sufUect+nO93&xLR#of2L!%^3za4&)6A{L2aWvJ79G9)G%Kn5;Uf{oa z`udYyf5qMxwex33#_c}K{h5R(FBk-Wt}NWl$*D7e9xopMeca-Ue_K}>&|P&PCTsPZ zqEs!pJ(J7Ys)&zS{SlvG+Xfh|i(#Cfz17dzz4q4mW3c{8`eWy2V22xAZ4d8ud$Z+y@%S^RMPhl}%y8ALjDj^o{-Zt+(8Qe|eYM*V!dBu&oh zibWHvO>%)bvEb%-oMhXFdno#}{%~ii^+&IV^u_K|8!9B7HQv;x&0~_#2cGT9_<@yG z<>JzQkZXb{pTKu`$R?U;(F;5w7oO(U#L8kk^C4RtxpSxuh~()! z7p=3sa98$^;y)e(PH7m^K}1MN5IR`;l_;Ii5~ejnhXkp$nuCBbFo^)0DNEOw86Z#m zw+0s83da*hX(Q0yA$}pⅈc%nA3!N6+cGq^I^Z4*))9-AYPPl$g}JkH77g9-<)lJ zkiYsJDtQgH<>FNHqcF**6CpehP_=jJDX&t8X@o38}x{d8^i0eRsXHa1Ns=I+-riV;$RCb*7Bv z)}V!0V8GErGP@9eEhTzz@ay$RSgcE2=Kdo!nabQiwIs{jYn9Z=^!0GD$@_a7OM6_0 zv_jS6FaB@dPL?rR|GT&(*6qH#_K9fZV*Iv2GbIQuS~c*5h?SX@db5$DNh2=6X*XRy zhOKE)ls6^Xc^9HB5+c+QyUPvvk>hpT!zRCw*>1$;59}t8p|`d8`)6HFKl6C-TyT z=4z$8nQH<)?W_w0icggckub49A1VL!hdY|iD1VfqrT8Yi`X2fe))K4wHQcTAf+=>$ z8e|_L?mx`0K#(@J39+BAIOno|oisU^xp%)W8Z6XJaTaq*A}D1$;9}a#hs`VM$3mxf zy`k8JvBp#SojfR>ocvIz;0#yW8vLh-NrHHr#jba9Ii^XP-2sEGX_sf()0b#Jh3X_a z#j=O&yl|l<`8k9_2iq#{f>tZM(sze%ZwIN#n2k#AQE`C{zDfDnomGv4HQmT;qUeF9 z4&$9$uL^w$=e>UojK?K0Hph%3F#GQgJ}#+_r-XBQ9BlC%Py}(SGX@F-p}I zCc`k|c%T~$W4A$Y_)7$=f0@2?I*O*;5hQMD908kdI}fa?ts2&cpzUg7iB7luwLQ_$ zV_Ax@`CWS#_c8W%-1 z#f`7)Gz~Xq%(B39@9{Um6*xoGG(Ytbd~VZkX~T|twYPMWYA_^cWwzx|NdqT}wf#>? zN%d#ENZZq{MGg+cNMrYa>VigRV-uf=i^=kh|59nijP_v)%hmsro zPp5oZ6cDvR45I_@M2<7cZTW*<8Vn~5+uMfLcdNMR8= z!fX1Zzh4^1^gVZ)o=6xAKpzO2pK}rSewqJ^v`rqXv-l~bq!D9GNUsx7jdm|yD4s5I zl5LT$i4zo7f4b$Mef5ak4n-LaPUU2dc@~pMp8L{s>}6EpBjZjeD$iO5I@43)Q=PgE z9vz4?qQDU9G4|wgoBSDYQFGjCpSKcK;-uxPIiH8JBmPChhkbPx#h26uz#s?uyY5#?CQT>EZuG36OXS2#=HnLVAci5bMpHYvKoiQ*nll z+A7)Vy$+lTCK5n0x#O`?SsKu#7C>!L1VpQE059tRgyFYS*Yz#w051e^?Wk?k6#`B- ztyDU|t9-J}l}_J?2K;si|K+p5_b>2ak567*E6;a!fc*v-iwuU>jrEFk9A5kjfgPYY diff --git a/libreplan-webapp/src/main/webapp/jqplot/docs/files/jqPlotCssStyling-txt.html b/libreplan-webapp/src/main/webapp/jqplot/docs/files/jqPlotCssStyling-txt.html deleted file mode 100644 index f4e082b92..000000000 --- a/libreplan-webapp/src/main/webapp/jqplot/docs/files/jqPlotCssStyling-txt.html +++ /dev/null @@ -1,39 +0,0 @@ - - -jqPlot CSS Customization - - - - - - - - - -

      Much of the styling of jqPlot is done by css.  The jqPlot css file is, unremarkably, jquery.jqplot.css and resides in the same directory as jqPlot itself.

      There exist some styling related javascript properties on the plot objects themselves (like fontStyle, fontSize, etc.).  These can be set with the options object at plot creation.  Generally, setting these options is NOT the preferred way to customize the look of the plot.  Use the css file instead.  These options are deprecated and may disappear.  The exceptions are certain background and color options which control attributes of something renderered on a canvas.  This would be line color, grid background, etc.  These must be set by the options object.  For a list of available options, see jqPlot Options.

      Objects in the plot that can be customized by css are given a css class like “.jqplot-*”.  For example, the plot title will have a “.jqplot-title” class, the axes “.jqplot-axis”, etc.

      Currently assigned classes in jqPlot are as follows:

      .jqplot-targetStyles for the plot target div.  These will be cascaded down to all plot elements according to css rules.
      .jqplot-axisStyles for all axes
      .jqplot-xaxisStyles applied to the primary x axis only.
      .jqplot-yaxisStyles applied to the primary y axis only.
      .jqplot-x2axis, .jqplot-x3axis, ...Styles applied to the 2nd, 3rd, etc. x axis only.
      .jqplot-y2axis, .jqplot-y3axis, ...Styles applied to the 2nd, 3rd, etc.y axis only.
      .jqplot-axis-tickStyles applied to all axis ticks
      .jqplot-xaxis-tickStyles applied to primary x axis ticks only.
      .jqplot-x2axis-tickStyles applied to secondary x axis ticks only.
      .jqplot-yaxis-tickStyles applied to primary y axis ticks only.
      .jqplot-y2axis-tickStyles applied to secondary y axis ticks only.
      table.jqplot-table-legendStyles applied to the legend box table.
      .jqplot-titleStyles applied to the title.
      .jqplot-cursor-tooltipStyles applied to the cursor tooltip
      .jqplot-highlighter-tooltipStyles applied to the highlighter tooltip.
      div.jqplot-table-legend-swatchthe div element used for the colored swatch on the legend.

      Note that axes will be assigned 2 classes like: class=”.jqplot-axis .jqplot-xaxis”.

      - -
      - - - - - - - - - - -
      This document is out of date.
      - - - - - - - - \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/docs/files/jqPlotOptions-txt.html b/libreplan-webapp/src/main/webapp/jqplot/docs/files/jqPlotOptions-txt.html deleted file mode 100644 index a80dadb50..000000000 --- a/libreplan-webapp/src/main/webapp/jqplot/docs/files/jqPlotOptions-txt.html +++ /dev/null @@ -1,292 +0,0 @@ - - -jqPlot Options - - - - - - - - - -

      This document is out of date.  While the options described here should still be relavent and valid, it has not been updated for many new options.  Sorry for this inconvenience.

      This document describes the options available to jqPlot.  These are set with the third argument to the $.jqplot(‘target’, data, options) function.  Options are using the following convention:

      property: default, // notes

      This document is not complete!  Not all options are shown!  Also, Options marked with * in the notes are post 0.7.1 additions.  They will be available in the next release.  Further information about the options can be found in the online API documentation.  For details on how the options relate to the API documentation, see the Options Tutorial in the optionsTutorial.txt file.

      options =
      -{
      -    seriesColors: [ "#4bb2c5", "#c5b47f", "#EAA228", "#579575", "#839557", "#958c12",
      -        "#953579", "#4b5de4", "#d8b83f", "#ff5800", "#0085cc"],  // colors that will
      -         // be assigned to the series.  If there are more series than colors, colors
      -         // will wrap around and start at the beginning again.
      -
      -    stackSeries: false, // if true, will create a stack plot.
      -                        // Currently supported by line and bar graphs.
      -
      -    title: '',      // Title for the plot.  Can also be specified as an object like:
      -
      -    title: {
      -        text: '',   // title for the plot,
      -        show: true,
      -    },
      -
      -    axesDefaults: {
      -        show: false,    // wether or not to renderer the axis.  Determined automatically.
      -        min: null,      // minimum numerical value of the axis.  Determined automatically.
      -        max: null,      // maximum numverical value of the axis.  Determined automatically.
      -        pad: 1.2,       // a factor multiplied by the data range on the axis to give the
      -                        // axis range so that data points don't fall on the edges of the axis.
      -        ticks: [],      // a 1D [val1, val2, ...], or 2D [[val, label], [val, label], ...]
      -                        // array of ticks to use.  Computed automatically.
      -        numberTicks: undefined,
      -        renderer: $.jqplot.LinearAxisRenderer,  // renderer to use to draw the axis,
      -        rendererOptions: {},    // options to pass to the renderer.  LinearAxisRenderer
      -                                // has no options,
      -        tickOptions: {
      -            mark: 'outside',    // Where to put the tick mark on the axis
      -                                // 'outside', 'inside' or 'cross',
      -            showMark: true,
      -            showGridline: true, // wether to draw a gridline (across the whole grid) at this tick,
      -            markSize: 4,        // length the tick will extend beyond the grid in pixels.  For
      -                                // 'cross', length will be added above and below the grid boundary,
      -            show: true,         // wether to show the tick (mark and label),
      -            showLabel: true,    // wether to show the text label at the tick,
      -            formatString: '',   // format string to use with the axis tick formatter
      -        }
      -        showTicks: true,        // wether or not to show the tick labels,
      -        showTickMarks: true,    // wether or not to show the tick marks
      -    },
      -
      -    axes: {
      -        xaxis: {
      -            // same options as axesDefaults
      -        },
      -        yaxis: {
      -            // same options as axesDefaults
      -        },
      -        x2axis: {
      -            // same options as axesDefaults
      -        },
      -        y2axis: {
      -            // same options as axesDefaults
      -        }
      -    },
      -
      -    seriesDefaults: {
      -        show: true,     // wether to render the series.
      -        xaxis: 'xaxis', // either 'xaxis' or 'x2axis'.
      -        yaxis: 'yaxis', // either 'yaxis' or 'y2axis'.
      -        label: '',      // label to use in the legend for this line.
      -        color: '',      // CSS color spec to use for the line.  Determined automatically.
      -        lineWidth: 2.5, // Width of the line in pixels.
      -        shadow: true,   // show shadow or not.
      -        shadowAngle: 45,    // angle (degrees) of the shadow, clockwise from x axis.
      -        shadowOffset: 1.25, // offset from the line of the shadow.
      -        shadowDepth: 3,     // Number of strokes to make when drawing shadow.  Each
      -                            // stroke offset by shadowOffset from the last.
      -        shadowAlpha: 0.1,   // Opacity of the shadow.
      -        showLine: true,     // whether to render the line segments or not.
      -        showMarker: true,   // render the data point markers or not.
      -        fill: false,        // fill under the line,
      -        fillAndStroke: false,       // *stroke a line at top of fill area.
      -        fillColor: undefined,       // *custom fill color for filled lines (default is line color).
      -        fillAlpha: undefined,       // *custom alpha to apply to fillColor.
      -        renderer: $.jqplot.LineRenderer],    // renderer used to draw the series.
      -        rendererOptions: {}, // options passed to the renderer.  LineRenderer has no options.
      -        markerRenderer: $.jqplot.MarkerRenderer,    // renderer to use to draw the data
      -                                                    // point markers.
      -        markerOptions: {
      -            show: true,             // wether to show data point markers.
      -            style: 'filledCircle',  // circle, diamond, square, filledCircle.
      -                                    // filledDiamond or filledSquare.
      -            lineWidth: 2,       // width of the stroke drawing the marker.
      -            size: 9,            // size (diameter, edge length, etc.) of the marker.
      -            color: '#666666'    // color of marker, set to color of line by default.
      -            shadow: true,       // wether to draw shadow on marker or not.
      -            shadowAngle: 45,    // angle of the shadow.  Clockwise from x axis.
      -            shadowOffset: 1,    // offset from the line of the shadow,
      -            shadowDepth: 3,     // Number of strokes to make when drawing shadow.  Each stroke
      -                                // offset by shadowOffset from the last.
      -            shadowAlpha: 0.07   // Opacity of the shadow
      -        }
      -    },
      -
      -    series:[
      -        {Each series has same options as seriesDefaults},
      -        {You can override each series individually here}
      -    ],
      -
      -    legend: {
      -        show: false,
      -        location: 'ne',     // compass direction, nw, n, ne, e, se, s, sw, w.
      -        xoffset: 12,        // pixel offset of the legend box from the x (or x2) axis.
      -        yoffset: 12,        // pixel offset of the legend box from the y (or y2) axis.
      -    },
      -
      -    grid: {
      -        drawGridLines: true,        // wether to draw lines across the grid or not.
      -        gridLineColor: '#cccccc'    // *Color of the grid lines.
      -        background: '#fffdf6',      // CSS color spec for background color of grid.
      -        borderColor: '#999999',     // CSS color spec for border around grid.
      -        borderWidth: 2.0,           // pixel width of border around grid.
      -        shadow: true,               // draw a shadow for grid.
      -        shadowAngle: 45,            // angle of the shadow.  Clockwise from x axis.
      -        shadowOffset: 1.5,          // offset from the line of the shadow.
      -        shadowWidth: 3,             // width of the stroke for the shadow.
      -        shadowDepth: 3,             // Number of strokes to make when drawing shadow.
      -                                    // Each stroke offset by shadowOffset from the last.
      -        shadowAlpha: 0.07           // Opacity of the shadow
      -        renderer: $.jqplot.CanvasGridRenderer,  // renderer to use to draw the grid.
      -        rendererOptions: {}         // options to pass to the renderer.  Note, the default
      -                                    // CanvasGridRenderer takes no additional options.
      -    },
      -
      -    // Plugin and renderer options.
      -
      -    // BarRenderer.
      -    // With BarRenderer, you can specify additional options in the rendererOptions object
      -    // on the series or on the seriesDefaults object.  Note, some options are respecified
      -    // (like shadowDepth) to override lineRenderer defaults from which BarRenderer inherits.
      -
      -    seriesDefaults: {
      -        rendererOptions: {
      -            barPadding: 8,      // number of pixels between adjacent bars in the same
      -                                // group (same category or bin).
      -            barMargin: 10,      // number of pixels between adjacent groups of bars.
      -            barDirection: 'vertical', // vertical or horizontal.
      -            barWidth: null,     // width of the bars.  null to calculate automatically.
      -            shadowOffset: 2,    // offset from the bar edge to stroke the shadow.
      -            shadowDepth: 5,     // nuber of strokes to make for the shadow.
      -            shadowAlpha: 0.8,   // transparency of the shadow.
      -        }
      -    },
      -
      -    // Cursor
      -    // Options are passed to the cursor plugin through the "cursor" object at the top
      -    // level of the options object.
      -
      -    cursor: {
      -        style: 'crosshair',     // A CSS spec for the cursor type to change the
      -                                // cursor to when over plot.
      -        show: true,
      -        showTooltip: true,      // show a tooltip showing cursor position.
      -        followMouse: false,     // wether tooltip should follow the mouse or be stationary.
      -        tooltipLocation: 'se',  // location of the tooltip either relative to the mouse
      -                                // (followMouse=true) or relative to the plot.  One of
      -                                // the compass directions, n, ne, e, se, etc.
      -        tooltipOffset: 6,       // pixel offset of the tooltip from the mouse or the axes.
      -        showTooltipGridPosition: false,     // show the grid pixel coordinates of the mouse
      -                                            // in the tooltip.
      -        showTooltipUnitPosition: true,      // show the coordinates in data units of the mouse
      -                                            // in the tooltip.
      -        tooltipFormatString: '%.4P',    // sprintf style format string for tooltip values.
      -        useAxesFormatters: true,        // wether to use the same formatter and formatStrings
      -                                        // as used by the axes, or to use the formatString
      -                                        // specified on the cursor with sprintf.
      -        tooltipAxesGroups: [],  // show only specified axes groups in tooltip.  Would specify like:
      -                                // [['xaxis', 'yaxis'], ['xaxis', 'y2axis']].  By default, all axes
      -                                // combinations with for the series in the plot are shown.
      -
      -    },
      -
      -    // Dragable
      -    // Dragable options are specified with the "dragable" object at the top level
      -    // of the options object.
      -
      -    dragable: {
      -        color: undefined,       // custom color to use for the dragged point and dragged line
      -                                // section. default will use a transparent variant of the line color.
      -        constrainTo: 'none',    // Constrain dragging motion to an axis: 'x', 'y', or 'none'.
      -    },
      -
      -    // Highlighter
      -    // Highlighter options are specified with the "highlighter" object at the top level
      -    // of the options object.
      -
      -    highlighter: {
      -        lineWidthAdjust: 2.5,   // pixels to add to the size line stroking the data point marker
      -                                // when showing highlight.  Only affects non filled data point markers.
      -        sizeAdjust: 5,          // pixels to add to the size of filled markers when drawing highlight.
      -        showTooltip: true,      // show a tooltip with data point values.
      -        tooltipLocation: 'nw',  // location of tooltip: n, ne, e, se, s, sw, w, nw.
      -        fadeTooltip: true,      // use fade effect to show/hide tooltip.
      -        tooltipFadeSpeed: "fast"// slow, def, fast, or a number of milliseconds.
      -        tooltipOffset: 2,       // pixel offset of tooltip from the highlight.
      -        tooltipAxes: 'both',    // which axis values to display in the tooltip, x, y or both.
      -        tooltipSeparator: ', '  // separator between values in the tooltip.
      -        useAxesFormatters: true // use the same format string and formatters as used in the axes to
      -                                // display values in the tooltip.
      -        tooltipFormatString: '%.5P' // sprintf format string for the tooltip.  only used if
      -                                    // useAxesFormatters is false.  Will use sprintf formatter with
      -                                    // this string, not the axes formatters.
      -    },
      -
      -    // LogAxisRenderer
      -    // LogAxisRenderer add 2 options to the axes object.  These options are specified directly on
      -    // the axes or axesDefaults object.
      -
      -    axesDefaults: {
      -        base: 10,                   // the logarithmic base.
      -        tickDistribution: 'even',   // 'even' or 'power'.  'even' will produce with even visiual (pixel)
      -                                    // spacing on the axis.  'power' will produce ticks spaced by
      -                                    // increasing powers of the log base.
      -    },
      -
      -    // PieRenderer
      -    // PieRenderer accepts options from the rendererOptions object of the series or seriesDefaults object.
      -
      -    seriesDefaults: {
      -        rendererOptions: {
      -            diameter: undefined, // diameter of pie, auto computed by default.
      -            padding: 20,        // padding between pie and neighboring legend or plot margin.
      -            sliceMargin: 0,     // gap between slices.
      -            fill: true,         // render solid (filled) slices.
      -            shadowOffset: 2,    // offset of the shadow from the chart.
      -            shadowDepth: 5,     // Number of strokes to make when drawing shadow.  Each stroke
      -                                // offset by shadowOffset from the last.
      -            shadowAlpha: 0.07   // Opacity of the shadow
      -        }
      -    },
      -
      -    // Trendline
      -    // Trendline takes options on the trendline object of the series or seriesDefaults object.
      -
      -    seriesDefaults: {
      -        trendline: {
      -            show: true,         // show the trend line
      -            color: '#666666',   // CSS color spec for the trend line.
      -            label: '',          // label for the trend line.
      -            type: 'linear',     // 'linear', 'exponential' or 'exp'
      -            shadow: true,       // show the trend line shadow.
      -            lineWidth: 1.5,     // width of the trend line.
      -            shadowAngle: 45,    // angle of the shadow.  Clockwise from x axis.
      -            shadowOffset: 1.5,  // offset from the line of the shadow.
      -            shadowDepth: 3,     // Number of strokes to make when drawing shadow.
      -                                // Each stroke offset by shadowOffset from the last.
      -            shadowAlpha: 0.07   // Opacity of the shadow
      -        }
      -    }
      -}
      - -
      - - - - - - - - - - -
      This document will help you understand how jqPlot’s options relate to the API documentation and the jqPlot object itself.
      - - - - - - - - \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/docs/files/jqplot-axisLabelRenderer-js.html b/libreplan-webapp/src/main/webapp/jqplot/docs/files/jqplot-axisLabelRenderer-js.html deleted file mode 100644 index 878070045..000000000 --- a/libreplan-webapp/src/main/webapp/jqplot/docs/files/jqplot-axisLabelRenderer-js.html +++ /dev/null @@ -1,47 +0,0 @@ - - -$.jqplot.AxisLabelRenderer - - - - - - - - - -

      Renderer to place labels on the axes.

      Summary
      $.jqplot.AxisLabelRendererRenderer to place labels on the axes.
      Properties
      showwether or not to show the tick (mark and label).
      labelThe text or html for the label.
      escapeHTMLtrue to escape HTML entities in the label.
      - -

      Properties

      - -

      show

      this.show = true

      wether or not to show the tick (mark and label).

      - -

      label

      this.label = ''

      The text or html for the label.

      - -

      escapeHTML

      this.escapeHTML = false

      true to escape HTML entities in the label.

      - -
      - - - - - - - - - - -
      this.show = true
      wether or not to show the tick (mark and label).
      this.label = ''
      The text or html for the label.
      this.escapeHTML = false
      true to escape HTML entities in the label.
      - - - - - - - - \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/docs/files/jqplot-axisTickRenderer-js.html b/libreplan-webapp/src/main/webapp/jqplot/docs/files/jqplot-axisTickRenderer-js.html deleted file mode 100644 index 086729457..000000000 --- a/libreplan-webapp/src/main/webapp/jqplot/docs/files/jqplot-axisTickRenderer-js.html +++ /dev/null @@ -1,71 +0,0 @@ - - -$.jqplot.AxisTickRenderer - - - - - - - - - -

      A “tick” object showing the value of a tick/gridline on the plot.

      Summary
      $.jqplot.AxisTickRendererA “tick” object showing the value of a tick/gridline on the plot.
      Properties
      marktick mark on the axis.
      showMarkwether or not to show the mark on the axis.
      showGridlinewether or not to draw the gridline on the grid at this tick.
      isMinorTickif this is a minor tick.
      sizeLength of the tick beyond the grid in pixels.
      markSizeLength of the tick marks in pixels.
      showwether or not to show the tick (mark and label).
      showLabelwether or not to show the label.
      formatterA class of a formatter for the tick text.
      prefixString to prepend to the tick label.
      formatStringstring passed to the formatter.
      fontFamilycss spec for the font-family css attribute.
      fontSizecss spec for the font-size css attribute.
      textColorcss spec for the color attribute.
      escapeHTMLtrue to escape HTML entities in the label.
      - -

      Properties

      - -

      mark

      this.mark = 'outside'

      tick mark on the axis.  One of ‘inside’, ‘outside’, ‘cross’, ‘’ or null.

      - -

      showMark

      this.showMark = true

      wether or not to show the mark on the axis.

      - -

      showGridline

      this.showGridline = true

      wether or not to draw the gridline on the grid at this tick.

      - -

      isMinorTick

      this.isMinorTick = false

      if this is a minor tick.

      - -

      size

      this.size = 4

      Length of the tick beyond the grid in pixels.  DEPRECATED: This has been superceeded by markSize

      - -

      markSize

      this.markSize = 6

      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

      this.show = true

      wether or not to show the tick (mark and label).  Setting this to false requires more testing.  It is recommended to set showLabel and showMark to false instead.

      - -

      showLabel

      this.showLabel = true

      wether or not to show the label.

      - -

      formatter

      this.formatter = $.jqplot.DefaultTickFormatter

      A class of a formatter for the tick text.  sprintf by default.

      - -

      prefix

      this.prefix = ''

      String to prepend to the tick label.  Prefix is prepended to the formatted tick label.

      - -

      formatString

      this.formatString = ''

      string passed to the formatter.

      - -

      fontFamily

      this.fontFamily

      css spec for the font-family css attribute.

      - -

      fontSize

      this.fontSize

      css spec for the font-size css attribute.

      - -

      textColor

      this.textColor

      css spec for the color attribute.

      - -

      escapeHTML

      this.escapeHTML = false

      true to escape HTML entities in the label.

      - -
      - - - - - - - - - - -
      this.mark = 'outside'
      tick mark on the axis.
      this.showMark = true
      wether or not to show the mark on the axis.
      this.showGridline = true
      wether or not to draw the gridline on the grid at this tick.
      this.isMinorTick = false
      if this is a minor tick.
      this.size = 4
      Length of the tick beyond the grid in pixels.
      this.markSize = 6
      Length of the tick marks in pixels.
      this.show = true
      wether or not to show the tick (mark and label).
      this.showLabel = true
      wether or not to show the label.
      this.formatter = $.jqplot.DefaultTickFormatter
      A class of a formatter for the tick text.
      this.prefix = ''
      String to prepend to the tick label.
      this.formatString = ''
      string passed to the formatter.
      this.fontFamily
      css spec for the font-family css attribute.
      this.fontSize
      css spec for the font-size css attribute.
      this.textColor
      css spec for the color attribute.
      this.escapeHTML = false
      true to escape HTML entities in the label.
      - - - - - - - - \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/docs/files/jqplot-canvasGridRenderer-js.html b/libreplan-webapp/src/main/webapp/jqplot/docs/files/jqplot-canvasGridRenderer-js.html deleted file mode 100644 index 64640cce8..000000000 --- a/libreplan-webapp/src/main/webapp/jqplot/docs/files/jqplot-canvasGridRenderer-js.html +++ /dev/null @@ -1,39 +0,0 @@ - - -$.jqplot.CanvasGridRenderer - - - - - - - - - -

      The default jqPlot grid renderer, creating a grid on a canvas element.  The renderer has no additional options beyond the Grid class.

      - -
      - - - - - - - - - - -
      Object representing the grid on which the plot is drawn.
      - - - - - - - - \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/docs/files/jqplot-core-js.html b/libreplan-webapp/src/main/webapp/jqplot/docs/files/jqplot-core-js.html deleted file mode 100644 index cf1c4b9f2..000000000 --- a/libreplan-webapp/src/main/webapp/jqplot/docs/files/jqplot-core-js.html +++ /dev/null @@ -1,385 +0,0 @@ - - -jqPlot Charts - - - - - - - - - -

      Pure JavaScript plotting plugin for jQuery.

      Summary
      jqPlot ChartsPure JavaScript plotting plugin for jQuery.
      Version1.0.0b2_r1012
      Copyright & LicenseCopyright © 2009-2011 Chris Leonello jqPlot is currently available for use in all personal or commercial projects under both the MIT and GPL version 2.0 licenses.
      IntroductionjqPlot requires jQuery (1.4+ required for certain features).
      UsageSee jqPlot Usage
      Available OptionsSee jqPlot Options for a list of options available thorugh the options object (not complete yet!)
      Options UsageSee Options Tutorial
      ChangesSee Change Log
      $.jqplotjQuery function called by the user to create a plot.
      Hooks
      jqPlot Pugin Hooks
      AxisAn individual axis object.
      PropertiesAxes options are specified within an axes object at the top level of the plot options like so:
      showWether to display the axis on the graph.
      tickRendererA class of a rendering engine for creating the ticks labels displayed on the plot, See $.jqplot.AxisTickRenderer.
      tickOptionsOptions that will be passed to the tickRenderer, see $.jqplot.AxisTickRenderer options.
      labelRendererA class of a rendering engine for creating an axis label.
      labelOptionsOptions passed to the label renderer.
      labelLabel for the axis
      showLabeltrue to show the axis label.
      minminimum value of the axis (in data units, not pixels).
      maxmaximum value of the axis (in data units, not pixels).
      autoscaleDEPRECATED the default scaling algorithm produces superior results.
      padPadding to extend the range above and below the data bounds.
      padMaxPadding to extend the range above data bounds.
      padMinPadding to extend the range below data bounds.
      ticks1D [val, val, ...] or 2D [[val, label], [val, label], ...] array of ticks for the axis.
      numberTicksDesired number of ticks.
      tickIntervalnumber of units between ticks.
      rendererA class of a rendering engine that handles tick generation, scaling input data to pixel grid units and drawing the axis element.
      rendererOptionsrenderer specific options.
      showTicksWether to show the ticks (both marks and labels) or not.
      showTickMarksWether to show the tick marks (line crossing grid) or not.
      showMinorTicksWether or not to show minor ticks.
      drawMajorGridlinesTrue to draw gridlines for major axis ticks.
      drawMinorGridlinesTrue to draw gridlines for minor ticks.
      drawMajorTickMarksTrue to draw tick marks for major axis ticks.
      drawMinorTickMarksTrue to draw tick marks for minor ticks.
      useSeriesColorUse the color of the first series associated with this axis for the tick marks and line bordering this axis.
      borderWidthwidth of line stroked at the border of the axis.
      borderColorcolor of the border adjacent to the axis.
      syncTickstrue to try and synchronize tick spacing across multiple axes so that ticks and grid lines line up.
      tickSpacingApproximate pixel spacing between ticks on graph.
      LegendLegend object.
      Properties
      showWether to display the legend on the graph.
      locationPlacement of the legend.
      labelsArray of labels to use.
      showLabelstrue to show the label text on the legend.
      showSwatchtrue to show the color swatches on the legend.
      placement“insideGrid” places legend inside the grid area of the plot.
      xoffsetDEPRECATED.
      yoffsetDEPRECATED.
      bordercss spec for the border around the legend box.
      backgroundcss spec for the background of the legend box.
      textColorcss color spec for the legend text.
      fontFamilycss font-family spec for the legend text.
      fontSizecss font-size spec for the legend text.
      rowSpacingcss padding-top spec for the rows in the legend.
      rendererOptionsrenderer specific options passed to the renderer.
      predrawWether to draw the legend before the series or not.
      marginTopCSS margin for the legend DOM element.
      marginRightCSS margin for the legend DOM element.
      marginBottomCSS margin for the legend DOM element.
      marginLeftCSS margin for the legend DOM element.
      escapeHtmlTrue to escape special characters with their html entity equivalents in legend text.
      TitlePlot Title object.
      Properties
      texttext of the title;
      showwether or not to show the title
      fontFamilycss font-family spec for the text.
      fontSizecss font-size spec for the text.
      textAligncss text-align spec for the text.
      textColorcss color spec for the text.
      rendererA class for creating a DOM element for the title, see $.jqplot.DivTitleRenderer.
      rendererOptionsrenderer specific options passed to the renderer.
      escapeHtmlTrue to escape special characters with their html entity equivalents in title text.
      SeriesAn individual data series object.
      PropertiesProperties will be assigned from a series array at the top level of the options.
      showwether or not to draw the series.
      xaxiswhich x axis to use with this series, either ‘xaxis’ or ‘x2axis’.
      yaxiswhich y axis to use with this series, either ‘yaxis’ or ‘y2axis’.
      rendererA class of a renderer which will draw the series, see $.jqplot.LineRenderer.
      rendererOptionsOptions to pass on to the renderer.
      labelLine label to use in the legend.
      showLabeltrue to show label for this series in the legend.
      colorcss color spec for the series
      negativeColorcss color spec used for filled (area) plots that are filled to zero and the “useNegativeColors” option is true.
      lineWidthwidth of the line in pixels.
      lineJoinCanvas lineJoin style between segments of series.
      lineCapCanvas lineCap style at ends of line.
      linePatternline pattern ‘dashed’, ‘dotted’, ‘solid’, some combination of ‘-’ and ‘.’
      shadowAngleShadow angle in degrees
      shadowOffsetShadow offset from line in pixels
      shadowDepthNumber of times shadow is stroked, each stroke offset shadowOffset from the last.
      shadowAlphaAlpha channel transparency of shadow.
      breakOnNullWether line segments should be be broken at null value.
      markerRendererA class of a renderer which will draw marker (e.g.
      markerOptionsrenderer specific options to pass to the markerRenderer, see $.jqplot.MarkerRenderer.
      showLinewether to actually draw the line or not.
      showMarkerwether or not to show the markers at the data points.
      index0 based index of this series in the plot series array.
      filltrue or false, wether to fill under lines or in bars.
      fillColorCSS color spec to use for fill under line.
      fillAlphaAlpha transparency to apply to the fill under the line.
      fillAndStrokeIf true will stroke the line (with color this.color) as well as fill under it.
      disableStacktrue to not stack this series with other series in the plot.
      neighborThresholdhow close or far (in pixels) the cursor must be from a point marker to detect the point.
      fillToZerotrue will force bar and filled series to fill toward zero on the fill Axis.
      fillToValuefill a filled series to this value on the fill axis.
      fillAxisEither ‘x’ or ‘y’.
      useNegativeColorstrue to color negative values differently in filled and bar charts.
      GridObject representing the grid on which the plot is drawn.
      Properties
      drawGridlineswether to draw the gridlines on the plot.
      gridLineColorcolor of the grid lines.
      gridLineWidthwidth of the grid lines.
      backgroundcss spec for the background color.
      borderColorcss spec for the color of the grid border.
      borderWidthwidth of the border in pixels.
      drawBorderTrue to draw border around grid.
      shadowwether to show a shadow behind the grid.
      shadowAngleshadow angle in degrees
      shadowOffsetOffset of each shadow stroke from the border in pixels
      shadowWidthwidth of the stoke for the shadow
      shadowDepthNumber of times shadow is stroked, each stroke offset shadowOffset from the last.
      shadowColoran optional css color spec for the shadow in ‘rgba(n, n, n, n)’ form
      shadowAlphaAlpha channel transparency of shadow.
      rendererInstance of a renderer which will actually render the grid, see $.jqplot.CanvasGridRenderer.
      rendererOptionsOptions to pass on to the renderer, see $.jqplot.CanvasGridRenderer.
      jqPlotPlot object returned by call to $.jqplot.
      PropertiesThese properties are specified at the top of the options object like so:
      animateTrue to animate the series on initial plot draw (renderer dependent).
      animateReplotTrue to animate series after a call to the replot() method.
      axesup to 4 axes are supported, each with it’s own options, See Axis for axis specific options.
      datauser’s data.
      dataRendererA callable which can be used to preprocess data passed into the plot.
      dataRendererOptionsOptions that will be passed to the dataRenderer.
      axesDefaultsdefault options that will be applied to all axes.
      seriesDefaultsdefault options that will be applied to all series.
      defaultAxisStart1-D data series are internally converted into 2-D [x,y] data point arrays by jqPlot.
      fillBetweenFill between 2 line series in a plot.
      fontSizecss spec for the font-size attribute.
      gridSee Grid for grid specific options.
      legendsee <$.jqplot.TableLegendRenderer>
      noDataIndicatorOptions to set up a mock plot with a data loading indicator if no data is specified.
      seriesArray of series object options.
      seriesColorsAnn array of CSS color specifications that will be applied, in order, to the series in the plot.
      sortDatafalse to not sort the data passed in by the user.
      stackSeriestrue or false, creates a stack or “mountain” plot.
      titleTitle object.
      methods
      initsets the plot target, checks data and applies user options to plot.
      resetAxesScaleReset the specified axes min, max, numberTicks and tickInterval properties to null or reset these properties on all axes if no list of axes is provided.
      reInitializereinitialize plot for replotting.
      destroyReleases all resources occupied by the plot
      replotDoes a reinitialization of the plot followed by a redraw.
      redrawEmpties the plot target div and redraws the plot.
      drawDraws all elements of the plot into the container.
      drawSeriesRedraws all or just one series on the plot.
      moveSeriesToFrontThis method requires jQuery 1.4+ Moves the specified series canvas in front of all other series canvases.
      moveSeriesToBackThis method requires jQuery 1.4+ Moves the specified series canvas behind all other series canvases.
      restorePreviousSeriesOrderThis method requires jQuery 1.4+ Restore the series canvas order to its previous state.
      restoreOriginalSeriesOrderThis method requires jQuery 1.4+ Restore the series canvas order to its original order when the plot was created.
      - -

      Version

      1.0.0b2_r1012

      - -

      Copyright & License

      Copyright © 2009-2011 Chris Leonello jqPlot is currently available for use in all personal or commercial projects under both the MIT and GPL version 2.0 licenses.  This means that you can choose the license that best suits your project and use it accordingly.

      See GPL Version 2 and MIT License contained within this distribution for further information.

      The author would appreciate an email letting him know of any substantial use of jqPlot.  You can reach the author at: chris at jqplot dot com or see http://www.jqplot.com/info.php.  This is, of course, not required.

      If you are feeling kind and generous, consider supporting the project by making a donation at: http://www.jqplot.com/donate.php.

      sprintf functions contained in jqplot.sprintf.js by Ash Searle

      version 2007.04.27 author Ash Searle http://hexmen.com/blog/2007/03/printf-sprintf/ http://hexmen.com/js/sprintf.js The author (Ash Searle) has placed this code in the public domain: “This code is unrestricted: you are free to use it however you like.”

      - -

      Introduction

      jqPlot requires jQuery (1.4+ required for certain features). jQuery 1.4.2 is included in the distribution.  To use jqPlot include jQuery, the jqPlot jQuery plugin, the jqPlot css file and optionally the excanvas script for IE support in your web page:

      <!--[if lt IE 9]><script language="javascript" type="text/javascript" src="excanvas.js"></script><![endif]-->
      -<script language="javascript" type="text/javascript" src="jquery-1.4.4.min.js"></script>
      -<script language="javascript" type="text/javascript" src="jquery.jqplot.min.js"></script>
      -<link rel="stylesheet" type="text/css" href="jquery.jqplot.css" />

      jqPlot can be customized by overriding the defaults of any of the objects which make up the plot.  The general usage of jqplot is:

      chart = $.jqplot('targetElemId', [dataArray,...], {optionsObject});

      The options available to jqplot are detailed in jqPlot Options in the jqPlotOptions.txt file.

      An actual call to $.jqplot() may look like the examples below:

      chart = $.jqplot('chartdiv',  [[[1, 2],[3,5.12],[5,13.1],[7,33.6],[9,85.9],[11,219.9]]]);

      or

      dataArray = [34,12,43,55,77];
      -chart = $.jqplot('targetElemId', [dataArray, ...], {title:'My Plot', axes:{yaxis:{min:20, max:100}}});

      For more inforrmation, see jqPlot Usage.

      - -

      Usage

      - -

      Available Options

      See jqPlot Options for a list of options available thorugh the options object (not complete yet!)

      - -

      Options Usage

      - -

      Changes

      - -

      $.jqplot

      jQuery function called by the user to create a plot.

      Parameters

      targetID of target element to render the plot into.
      dataan array of data series.
      optionsuser defined options object.  See the individual classes for available options.

      Properties

      configobject to hold configuration information for jqPlot plot object.

      attributes

      enablePluginsFalse to disable plugins by default.  Plugins must then be explicitly enabled in the individual plot options.  Default: false.  This property sets the “show” property of certain plugins to true or false.  Only plugins that can be immediately active upon loading are affected.  This includes non-renderer plugins like cursor, dragable, highlighter, and trendline.
      defaultHeightDefault height for plots where no css height specification exists.  This is a jqplot wide default.
      defaultWidthDefault height for plots where no css height specification exists.  This is a jqplot wide default.
      - -

      Hooks

      - -

      jqPlot Pugin Hooks

      $.jqplot.preInitHookscalled before initialization.
      $.jqplot.postInitHookscalled after initialization.
      $.jqplot.preParseOptionsHookscalled before user options are parsed.
      $.jqplot.postParseOptionsHookscalled after user options are parsed.
      $.jqplot.preDrawHookscalled before plot draw.
      $.jqplot.postDrawHookscalled after plot draw.
      $.jqplot.preDrawSeriesHookscalled before each series is drawn.
      $.jqplot.postDrawSeriesHookscalled after each series is drawn.
      $.jqplot.preDrawLegendHookscalled before the legend is drawn.
      $.jqplot.addLegendRowHookscalled at the end of legend draw, so plugins can add rows to the legend table.
      $.jqplot.preSeriesInitHookscalled before series is initialized.
      $.jqplot.postSeriesInitHookscalled after series is initialized.
      $.jqplot.preParseSeriesOptionsHookscalled before series related options are parsed.
      $.jqplot.postParseSeriesOptionsHookscalled after series related options are parsed.
      $.jqplot.eventListenerHookscalled at the end of plot drawing, binds listeners to the event canvas which lays on top of the grid area.
      $.jqplot.preDrawSeriesShadowHookscalled before series shadows are drawn.
      $.jqplot.postDrawSeriesShadowHookscalled after series shadows are drawn.
      - -

      Axis

      An individual axis object.  Cannot be instantiated directly, but created by the Plot oject.  Axis properties can be set or overriden by the options passed in from the user.

      Summary
      PropertiesAxes options are specified within an axes object at the top level of the plot options like so:
      showWether to display the axis on the graph.
      tickRendererA class of a rendering engine for creating the ticks labels displayed on the plot, See $.jqplot.AxisTickRenderer.
      tickOptionsOptions that will be passed to the tickRenderer, see $.jqplot.AxisTickRenderer options.
      labelRendererA class of a rendering engine for creating an axis label.
      labelOptionsOptions passed to the label renderer.
      labelLabel for the axis
      showLabeltrue to show the axis label.
      minminimum value of the axis (in data units, not pixels).
      maxmaximum value of the axis (in data units, not pixels).
      autoscaleDEPRECATED the default scaling algorithm produces superior results.
      padPadding to extend the range above and below the data bounds.
      padMaxPadding to extend the range above data bounds.
      padMinPadding to extend the range below data bounds.
      ticks1D [val, val, ...] or 2D [[val, label], [val, label], ...] array of ticks for the axis.
      numberTicksDesired number of ticks.
      tickIntervalnumber of units between ticks.
      rendererA class of a rendering engine that handles tick generation, scaling input data to pixel grid units and drawing the axis element.
      rendererOptionsrenderer specific options.
      showTicksWether to show the ticks (both marks and labels) or not.
      showTickMarksWether to show the tick marks (line crossing grid) or not.
      showMinorTicksWether or not to show minor ticks.
      drawMajorGridlinesTrue to draw gridlines for major axis ticks.
      drawMinorGridlinesTrue to draw gridlines for minor ticks.
      drawMajorTickMarksTrue to draw tick marks for major axis ticks.
      drawMinorTickMarksTrue to draw tick marks for minor ticks.
      useSeriesColorUse the color of the first series associated with this axis for the tick marks and line bordering this axis.
      borderWidthwidth of line stroked at the border of the axis.
      borderColorcolor of the border adjacent to the axis.
      syncTickstrue to try and synchronize tick spacing across multiple axes so that ticks and grid lines line up.
      tickSpacingApproximate pixel spacing between ticks on graph.
      - -

      Properties

      Axes options are specified within an axes object at the top level of the plot options like so:

      {
      -   axes: {
      -       xaxis: {min: 5},
      -       yaxis: {min: 2, max: 8, numberTicks:4},
      -       x2axis: {pad: 1.5},
      -       y2axis: {ticks:[22, 44, 66, 88]}
      -       }
      -}

      There are 2 x axes, ‘xaxis’ and ‘x2axis’, and 9 yaxes, ‘yaxis’, ‘y2axis’.  ‘y3axis’, ...  Any or all of which may be specified.

      - -

      show

      this.show = false

      Wether to display the axis on the graph.

      - -

      tickRenderer

      this.tickRenderer = $.jqplot.AxisTickRenderer

      A class of a rendering engine for creating the ticks labels displayed on the plot, See $.jqplot.AxisTickRenderer.

      - -

      tickOptions

      this.tickOptions = {}

      Options that will be passed to the tickRenderer, see $.jqplot.AxisTickRenderer options.

      - -

      labelRenderer

      this.labelRenderer = $.jqplot.AxisLabelRenderer

      A class of a rendering engine for creating an axis label.

      - -

      labelOptions

      this.labelOptions = {}

      Options passed to the label renderer.

      - -

      label

      this.label = null

      Label for the axis

      - -

      showLabel

      this.showLabel = true

      true to show the axis label.

      - -

      min

      this.min = null

      minimum value of the axis (in data units, not pixels).

      - -

      max

      this.max = null

      maximum value of the axis (in data units, not pixels).

      - -

      autoscale

      this.autoscale = false

      DEPRECATED the default scaling algorithm produces superior results.

      - -

      pad

      this.pad = 1.2

      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

      this.padMax = null

      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

      this.padMin = null

      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.

      - -

      ticks

      this.ticks = []

      1D [val, val, ...] or 2D [[val, label], [val, label], ...] array of ticks for the axis.  If no label is specified, the value is formatted into an appropriate label.

      - -

      numberTicks

      this.numberTicks

      Desired number of ticks.  Default is to compute automatically.

      - -

      tickInterval

      this.tickInterval

      number of units between ticks.  Mutually exclusive with numberTicks.

      - -

      renderer

      this.renderer = $.jqplot.LinearAxisRenderer

      A class of a rendering engine that handles tick generation, scaling input data to pixel grid units and drawing the axis element.

      - -

      rendererOptions

      this.rendererOptions = {}

      renderer specific options.  See $.jqplot.LinearAxisRenderer for options.

      - -

      showTicks

      this.showTicks = true

      Wether to show the ticks (both marks and labels) or not.  Will not override showMark and showLabel options if specified on the ticks themselves.

      - -

      showTickMarks

      this.showTickMarks = true

      Wether to show the tick marks (line crossing grid) or not.  Overridden by showTicks and showMark option of tick itself.

      - -

      showMinorTicks

      this.showMinorTicks = true

      Wether or not to show minor ticks.  This is renderer dependent.

      - -

      drawMajorGridlines

      this.drawMajorGridlines = true

      True to draw gridlines for major axis ticks.

      - -

      drawMinorGridlines

      this.drawMinorGridlines = false

      True to draw gridlines for minor ticks.

      - -

      drawMajorTickMarks

      this.drawMajorTickMarks = true

      True to draw tick marks for major axis ticks.

      - -

      drawMinorTickMarks

      this.drawMinorTickMarks = true

      True to draw tick marks for minor ticks.  This is renderer dependent.

      - -

      useSeriesColor

      this.useSeriesColor = false

      Use the color of the first series associated with this axis for the tick marks and line bordering this axis.

      - -

      borderWidth

      this.borderWidth = null

      width of line stroked at the border of the axis.  Defaults to the width of the grid boarder.

      - -

      borderColor

      this.borderColor = null

      color of the border adjacent to the axis.  Defaults to grid border color.

      - -

      syncTicks

      this.syncTicks = null

      true to try and synchronize tick spacing across multiple axes so that ticks and grid lines line up.  This has an impact on autoscaling algorithm, however.  In general, autoscaling an individual axis will work better if it does not have to sync ticks.

      - -

      tickSpacing

      this.tickSpacing = 75

      Approximate pixel spacing between ticks on graph.  Used during autoscaling.  This number will be an upper bound, actual spacing will be less.

      - -

      Legend

      Legend object.  Cannot be instantiated directly, but created by the Plot oject.  Legend properties can be set or overriden by the options passed in from the user.

      Summary
      Properties
      showWether to display the legend on the graph.
      locationPlacement of the legend.
      labelsArray of labels to use.
      showLabelstrue to show the label text on the legend.
      showSwatchtrue to show the color swatches on the legend.
      placement“insideGrid” places legend inside the grid area of the plot.
      xoffsetDEPRECATED.
      yoffsetDEPRECATED.
      bordercss spec for the border around the legend box.
      backgroundcss spec for the background of the legend box.
      textColorcss color spec for the legend text.
      fontFamilycss font-family spec for the legend text.
      fontSizecss font-size spec for the legend text.
      rowSpacingcss padding-top spec for the rows in the legend.
      rendererOptionsrenderer specific options passed to the renderer.
      predrawWether to draw the legend before the series or not.
      marginTopCSS margin for the legend DOM element.
      marginRightCSS margin for the legend DOM element.
      marginBottomCSS margin for the legend DOM element.
      marginLeftCSS margin for the legend DOM element.
      escapeHtmlTrue to escape special characters with their html entity equivalents in legend text.
      - -

      Properties

      - -

      show

      this.show = false

      Wether to display the legend on the graph.

      - -

      location

      this.location = 'ne'

      Placement of the legend.  one of the compass directions: nw, n, ne, e, se, s, sw, w

      - -

      labels

      this.labels = []

      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.

      - -

      showLabels

      this.showLabels = true

      true to show the label text on the legend.

      - -

      showSwatch

      this.showSwatches = true

      true to show the color swatches on the legend.

      - -

      placement

      this.placement = "insideGrid"

      ”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.  “inside” synonym for “insideGrid”, “outside” places the legend ouside the grid area, but does not shrink the grid which can cause the legend to overflow the plot container.

      - -

      xoffset

      this.xoffset = 0

      DEPRECATED.  Set the margins on the legend using the marginTop, marginLeft, etc. properties or via CSS margin styling of the .jqplot-table-legend class.

      - -

      yoffset

      this.yoffset = 0

      DEPRECATED.  Set the margins on the legend using the marginTop, marginLeft, etc. properties or via CSS margin styling of the .jqplot-table-legend class.

      - -

      border

      this.border

      css spec for the border around the legend box.

      - -

      background

      this.background

      css spec for the background of the legend box.

      - -

      textColor

      this.textColor

      css color spec for the legend text.

      - -

      fontFamily

      this.fontFamily

      css font-family spec for the legend text.

      - -

      fontSize

      this.fontSize

      css font-size spec for the legend text.

      - -

      rowSpacing

      this.rowSpacing = '0.5em'

      css padding-top spec for the rows in the legend.

      - -

      rendererOptions

      this.rendererOptions = {}

      renderer specific options passed to the renderer.

      - -

      predraw

      Wether to draw the legend before the series or not.  Used with series specific legend renderers for pie, donut, mekko charts, etc.

      - -

      marginTop

      this.marginTop = null

      CSS margin for the legend DOM element.  This will set an element CSS style for the margin which will override any style sheet setting.  The default will be taken from the stylesheet.

      - -

      marginRight

      this.marginRight = null

      CSS margin for the legend DOM element.  This will set an element CSS style for the margin which will override any style sheet setting.  The default will be taken from the stylesheet.

      - -

      marginBottom

      this.marginBottom = null

      CSS margin for the legend DOM element.  This will set an element CSS style for the margin which will override any style sheet setting.  The default will be taken from the stylesheet.

      - -

      marginLeft

      this.marginLeft = null

      CSS margin for the legend DOM element.  This will set an element CSS style for the margin which will override any style sheet setting.  The default will be taken from the stylesheet.

      - -

      escapeHtml

      this.escapeHtml = false

      True to escape special characters with their html entity equivalents in legend text.  “<” becomes &lt; and so on, so html tags are not rendered.

      - -

      Title

      Plot Title object.  Cannot be instantiated directly, but created by the Plot oject.  Title properties can be set or overriden by the options passed in from the user.

      Parameters

      texttext of the title.
      Summary
      Properties
      texttext of the title;
      showwether or not to show the title
      fontFamilycss font-family spec for the text.
      fontSizecss font-size spec for the text.
      textAligncss text-align spec for the text.
      textColorcss color spec for the text.
      rendererA class for creating a DOM element for the title, see $.jqplot.DivTitleRenderer.
      rendererOptionsrenderer specific options passed to the renderer.
      escapeHtmlTrue to escape special characters with their html entity equivalents in title text.
      - -

      Properties

      - -

      text

      this.text = text

      text of the title;

      - -

      show

      this.show = true

      wether or not to show the title

      - -

      fontFamily

      this.fontFamily

      css font-family spec for the text.

      - -

      fontSize

      this.fontSize

      css font-size spec for the text.

      - -

      textAlign

      this.textAlign

      css text-align spec for the text.

      - -

      textColor

      this.textColor

      css color spec for the text.

      - -

      renderer

      this.renderer = $.jqplot.DivTitleRenderer

      A class for creating a DOM element for the title, see $.jqplot.DivTitleRenderer.

      - -

      rendererOptions

      this.rendererOptions = {}

      renderer specific options passed to the renderer.

      - -

      escapeHtml

      this.escapeHtml = false

      True to escape special characters with their html entity equivalents in title text.  “<” becomes &lt; and so on, so html tags are not rendered.

      - -

      Series

      An individual data series object.  Cannot be instantiated directly, but created by the Plot oject.  Series properties can be set or overriden by the options passed in from the user.

      Summary
      PropertiesProperties will be assigned from a series array at the top level of the options.
      showwether or not to draw the series.
      xaxiswhich x axis to use with this series, either ‘xaxis’ or ‘x2axis’.
      yaxiswhich y axis to use with this series, either ‘yaxis’ or ‘y2axis’.
      rendererA class of a renderer which will draw the series, see $.jqplot.LineRenderer.
      rendererOptionsOptions to pass on to the renderer.
      labelLine label to use in the legend.
      showLabeltrue to show label for this series in the legend.
      colorcss color spec for the series
      negativeColorcss color spec used for filled (area) plots that are filled to zero and the “useNegativeColors” option is true.
      lineWidthwidth of the line in pixels.
      lineJoinCanvas lineJoin style between segments of series.
      lineCapCanvas lineCap style at ends of line.
      linePatternline pattern ‘dashed’, ‘dotted’, ‘solid’, some combination of ‘-’ and ‘.’
      shadowAngleShadow angle in degrees
      shadowOffsetShadow offset from line in pixels
      shadowDepthNumber of times shadow is stroked, each stroke offset shadowOffset from the last.
      shadowAlphaAlpha channel transparency of shadow.
      breakOnNullWether line segments should be be broken at null value.
      markerRendererA class of a renderer which will draw marker (e.g.
      markerOptionsrenderer specific options to pass to the markerRenderer, see $.jqplot.MarkerRenderer.
      showLinewether to actually draw the line or not.
      showMarkerwether or not to show the markers at the data points.
      index0 based index of this series in the plot series array.
      filltrue or false, wether to fill under lines or in bars.
      fillColorCSS color spec to use for fill under line.
      fillAlphaAlpha transparency to apply to the fill under the line.
      fillAndStrokeIf true will stroke the line (with color this.color) as well as fill under it.
      disableStacktrue to not stack this series with other series in the plot.
      neighborThresholdhow close or far (in pixels) the cursor must be from a point marker to detect the point.
      fillToZerotrue will force bar and filled series to fill toward zero on the fill Axis.
      fillToValuefill a filled series to this value on the fill axis.
      fillAxisEither ‘x’ or ‘y’.
      useNegativeColorstrue to color negative values differently in filled and bar charts.
      - -

      Properties

      Properties will be assigned from a series array at the top level of the options.  If you had two series and wanted to change the color and line width of the first and set the second to use the secondary y axis with no shadow and supply custom labels for each:

      {
      -   series:[
      -       {color: '#ff4466', lineWidth: 5, label:'good line'},
      -       {yaxis: 'y2axis', shadow: false, label:'bad line'}
      -   ]
      -}
      - -

      show

      this.show = true

      wether or not to draw the series.

      - -

      xaxis

      this.xaxis = 'xaxis'

      which x axis to use with this series, either ‘xaxis’ or ‘x2axis’.

      - -

      yaxis

      this.yaxis = 'yaxis'

      which y axis to use with this series, either ‘yaxis’ or ‘y2axis’.

      - -

      renderer

      this.renderer = $.jqplot.LineRenderer

      A class of a renderer which will draw the series, see $.jqplot.LineRenderer.

      - -

      rendererOptions

      this.rendererOptions = {}

      Options to pass on to the renderer.

      - -

      label

      this.label = ''

      Line label to use in the legend.

      - -

      showLabel

      this.showLabel = true

      true to show label for this series in the legend.

      - -

      color

      this.color

      css color spec for the series

      - -

      negativeColor

      this.negativeColor

      css color spec used for filled (area) plots that are filled to zero and the “useNegativeColors” option is true.

      - -

      lineWidth

      this.lineWidth = 2.5

      width of the line in pixels.  May have different meanings depending on renderer.

      - -

      lineJoin

      this.lineJoin = 'round'

      Canvas lineJoin style between segments of series.

      - -

      lineCap

      this.lineCap = 'round'

      Canvas lineCap style at ends of line.

      - -

      linePattern

      this.linePattern = 'solid'

      line pattern ‘dashed’, ‘dotted’, ‘solid’, some combination of ‘-’ and ‘.’ characters such as ‘.-.’ or a numerical array like [draw, skip, draw, skip, ...] such as [1, 10] to draw a dotted line, [1, 10, 20, 10] to draw a dot-dash line, and so on.

      - -

      shadowAngle

      this.shadowAngle = 45

      Shadow angle in degrees

      - -

      shadowOffset

      this.shadowOffset = 1.25

      Shadow offset from line in pixels

      - -

      shadowDepth

      this.shadowDepth = 3

      Number of times shadow is stroked, each stroke offset shadowOffset from the last.

      - -

      shadowAlpha

      this.shadowAlpha = '0.1'

      Alpha channel transparency of shadow.  0 = transparent.

      - -

      breakOnNull

      this.breakOnNull = false

      Wether line segments should be be broken at null value.  False will join point on either side of line.

      - -

      markerRenderer

      this.markerRenderer = $.jqplot.MarkerRenderer

      A class of a renderer which will draw marker (e.g. circle, square, ...) at the data points, see $.jqplot.MarkerRenderer.

      - -

      markerOptions

      this.markerOptions = {}

      renderer specific options to pass to the markerRenderer, see $.jqplot.MarkerRenderer.

      - -

      showLine

      this.showLine = true

      wether to actually draw the line or not.  Series will still be renderered, even if no line is drawn.

      - -

      showMarker

      this.showMarker = true

      wether or not to show the markers at the data points.

      - -

      index

      this.index

      0 based index of this series in the plot series array.

      - -

      fill

      this.fill = false

      true or false, wether to fill under lines or in bars.  May not be implemented in all renderers.

      - -

      fillColor

      this.fillColor

      CSS color spec to use for fill under line.  Defaults to line color.

      - -

      fillAlpha

      this.fillAlpha

      Alpha transparency to apply to the fill under the line.  Use this to adjust alpha separate from fill color.

      - -

      fillAndStroke

      this.fillAndStroke = false

      If true will stroke the line (with color this.color) as well as fill under it.  Applies only when fill is true.

      - -

      disableStack

      this.disableStack = false

      true to not stack this series with other series in the plot.  To render properly, non-stacked series must come after any stacked series in the plot’s data series array.  So, the plot’s data series array would look like:

      [stackedSeries1, stackedSeries2, ..., nonStackedSeries1, nonStackedSeries2, ...]

      disableStack will put a gap in the stacking order of series, and subsequent stacked series will not fill down through the non-stacked series and will most likely not stack properly on top of the non-stacked series.

      - -

      neighborThreshold

      this.neighborThreshold = 4

      how close or far (in pixels) the cursor must be from a point marker to detect the point.

      - -

      fillToZero

      this.fillToZero = false

      true will force bar and filled series to fill toward zero on the fill Axis.

      - -

      fillToValue

      this.fillToValue = 0

      fill a filled series to this value on the fill axis.  Works in conjunction with fillToZero, so that must be true.

      - -

      fillAxis

      this.fillAxis = 'y'

      Either ‘x’ or ‘y’.  Which axis to fill the line toward if fillToZero is true.  ‘y’ means fill up/down to 0 on the y axis for this series.

      - -

      useNegativeColors

      this.useNegativeColors = true

      true to color negative values differently in filled and bar charts.

      - -

      Grid

      Object representing the grid on which the plot is drawn.  The grid in this context is the area bounded by the axes, the area which will contain the series.  Note, the series are drawn on their own canvas.  The Grid object cannot be instantiated directly, but is created by the Plot oject.  Grid properties can be set or overriden by the options passed in from the user.

      Summary
      Properties
      drawGridlineswether to draw the gridlines on the plot.
      gridLineColorcolor of the grid lines.
      gridLineWidthwidth of the grid lines.
      backgroundcss spec for the background color.
      borderColorcss spec for the color of the grid border.
      borderWidthwidth of the border in pixels.
      drawBorderTrue to draw border around grid.
      shadowwether to show a shadow behind the grid.
      shadowAngleshadow angle in degrees
      shadowOffsetOffset of each shadow stroke from the border in pixels
      shadowWidthwidth of the stoke for the shadow
      shadowDepthNumber of times shadow is stroked, each stroke offset shadowOffset from the last.
      shadowColoran optional css color spec for the shadow in ‘rgba(n, n, n, n)’ form
      shadowAlphaAlpha channel transparency of shadow.
      rendererInstance of a renderer which will actually render the grid, see $.jqplot.CanvasGridRenderer.
      rendererOptionsOptions to pass on to the renderer, see $.jqplot.CanvasGridRenderer.
      - -

      Properties

      - -

      drawGridlines

      this.drawGridlines = true

      wether to draw the gridlines on the plot.

      - -

      gridLineColor

      this.gridLineColor = '#cccccc'

      color of the grid lines.

      - -

      gridLineWidth

      this.gridLineWidth = 1.0

      width of the grid lines.

      - -

      background

      this.background = '#fffdf6'

      css spec for the background color.

      - -

      borderColor

      this.borderColor = '#999999'

      css spec for the color of the grid border.

      - -

      borderWidth

      this.borderWidth = 2.0

      width of the border in pixels.

      - -

      drawBorder

      this.drawBorder = true

      True to draw border around grid.

      - -

      shadow

      this.shadow = true

      wether to show a shadow behind the grid.

      - -

      shadowAngle

      this.shadowAngle = 45

      shadow angle in degrees

      - -

      shadowOffset

      this.shadowOffset = 1.5

      Offset of each shadow stroke from the border in pixels

      - -

      shadowWidth

      this.shadowWidth = 3

      width of the stoke for the shadow

      - -

      shadowDepth

      this.shadowDepth = 3

      Number of times shadow is stroked, each stroke offset shadowOffset from the last.

      - -

      shadowColor

      this.shadowColor = null

      an optional css color spec for the shadow in ‘rgba(n, n, n, n)’ form

      - -

      shadowAlpha

      this.shadowAlpha = '0.07'

      Alpha channel transparency of shadow.  0 = transparent.

      - -

      renderer

      this.renderer = $.jqplot.CanvasGridRenderer

      Instance of a renderer which will actually render the grid, see $.jqplot.CanvasGridRenderer.

      - -

      rendererOptions

      this.rendererOptions = {}

      Options to pass on to the renderer, see $.jqplot.CanvasGridRenderer.

      - -

      jqPlot

      Plot object returned by call to $.jqplot.  Handles parsing user options, creating sub objects (Axes, legend, title, series) and rendering the plot.

      Summary
      PropertiesThese properties are specified at the top of the options object like so:
      animateTrue to animate the series on initial plot draw (renderer dependent).
      animateReplotTrue to animate series after a call to the replot() method.
      axesup to 4 axes are supported, each with it’s own options, See Axis for axis specific options.
      datauser’s data.
      dataRendererA callable which can be used to preprocess data passed into the plot.
      dataRendererOptionsOptions that will be passed to the dataRenderer.
      axesDefaultsdefault options that will be applied to all axes.
      seriesDefaultsdefault options that will be applied to all series.
      defaultAxisStart1-D data series are internally converted into 2-D [x,y] data point arrays by jqPlot.
      fillBetweenFill between 2 line series in a plot.
      fontSizecss spec for the font-size attribute.
      gridSee Grid for grid specific options.
      legendsee <$.jqplot.TableLegendRenderer>
      noDataIndicatorOptions to set up a mock plot with a data loading indicator if no data is specified.
      seriesArray of series object options.
      seriesColorsAnn array of CSS color specifications that will be applied, in order, to the series in the plot.
      sortDatafalse to not sort the data passed in by the user.
      stackSeriestrue or false, creates a stack or “mountain” plot.
      titleTitle object.
      methods
      initsets the plot target, checks data and applies user options to plot.
      resetAxesScaleReset the specified axes min, max, numberTicks and tickInterval properties to null or reset these properties on all axes if no list of axes is provided.
      reInitializereinitialize plot for replotting.
      destroyReleases all resources occupied by the plot
      replotDoes a reinitialization of the plot followed by a redraw.
      redrawEmpties the plot target div and redraws the plot.
      drawDraws all elements of the plot into the container.
      drawSeriesRedraws all or just one series on the plot.
      moveSeriesToFrontThis method requires jQuery 1.4+ Moves the specified series canvas in front of all other series canvases.
      moveSeriesToBackThis method requires jQuery 1.4+ Moves the specified series canvas behind all other series canvases.
      restorePreviousSeriesOrderThis method requires jQuery 1.4+ Restore the series canvas order to its previous state.
      restoreOriginalSeriesOrderThis method requires jQuery 1.4+ Restore the series canvas order to its original order when the plot was created.
      - -

      Properties

      These properties are specified at the top of the options object like so:

      {
      -    axesDefaults:{min:0},
      -    series:[{color:'#6633dd'}],
      -    title: 'A Plot'
      -}
      - -

      animate

      this.animate = false

      True to animate the series on initial plot draw (renderer dependent).  Actual animation functionality must be supported in the renderer.

      - -

      animateReplot

      this.animateReplot = false

      True to animate series after a call to the replot() method.  Use with caution!  Replots can happen very frequently under certain circumstances (e.g. resizing, dragging points) and animation in these situations can cause problems.

      - -

      axes

      this.axes = {xaxis: new Axis('xaxis'), yaxis: new Axis('yaxis'), x2axis: new Axis('x2axis'), y2axis: new Axis('y2axis'), y3axis: new Axis('y3axis'), y4axis: new Axis('y4axis'), y5axis: new Axis('y5axis'), y6axis: new Axis('y6axis'), y7axis: new Axis('y7axis'), y8axis: new Axis('y8axis'), y9axis: new Axis('y9axis'), yMidAxis: new Axis('yMidAxis')}

      up to 4 axes are supported, each with it’s own options, See Axis for axis specific options.

      - -

      data

      this.data = []

      user’s data.  Data should NOT be specified in the options object, but be passed in as the second argument to the $.jqplot() function.  The data property is described here soley for reference.  The data should be in the form of an array of 2D or 1D arrays like

      [ [[x1, y1], [x2, y2],...], [y1, y2, ...] ].
      - -

      dataRenderer

      this.dataRenderer

      A callable which can be used to preprocess data passed into the plot.  Will be called with 2 arguments, the plot data and a reference to the plot.

      - -

      dataRendererOptions

      this.dataRendererOptions

      Options that will be passed to the dataRenderer.  Can be of any type.

      - -

      axesDefaults

      default options that will be applied to all axes. see Axis for axes options.

      - -

      seriesDefaults

      seriesDefaults: {}, series:[] }

      default options that will be applied to all series. see Series for series options.

      - -

      defaultAxisStart

      this.defaultAxisStart = 1

      1-D data series are internally converted into 2-D [x,y] data point arrays by jqPlot.  This is the default starting value for the missing x or y value.  The added data will be a monotonically increasing series (e.g.  [1, 2, 3, ...]) starting at this value.

      - -

      fillBetween

      this.fillBetween = { series1: null, series2: null, color: null, baseSeries: 0, fill: true }

      Fill between 2 line series in a plot.  Options object: { series1: first index (0 based) of series in fill series2: second index (0 based) of series in fill color: color of fill [default fillColor of series1] baseSeries: fill will be drawn below this series (0 based index) fill: false to turn off fill [default true].  }

      - -

      fontSize

      this.fontSize

      css spec for the font-size attribute.  Default for the entire plot.

      - -

      grid

      this.grid = new Grid()

      See Grid for grid specific options.

      - -

      legend

      this.legend = new Legend()

      see <$.jqplot.TableLegendRenderer>

      - -

      noDataIndicator

      Options to set up a mock plot with a data loading indicator if no data is specified.

      - -

      series

      this.series = []

      Array of series object options. see Series for series specific options.

      - -

      seriesColors

      this.seriesColors = $.jqplot.config.defaultColors

      Ann array of CSS color specifications that will be applied, in order, to the series in the plot.  Colors will wrap around so, if their are more series than colors, colors will be reused starting at the beginning.  For pie charts, this specifies the colors of the slices.

      - -

      sortData

      this.sortData = true

      false to not sort the data passed in by the user.  Many bar, stakced and other graphs as well as many plugins depend on having sorted data.

      - -

      stackSeries

      this.stackSeries = false

      true or false, creates a stack or “mountain” plot.  Not all series renderers may implement this option.

      - -

      title

      this.title = new Title()

      Title object.  See Title for specific options.  As a shortcut, you can specify the title option as just a string like: title: ‘My Plot’ and this will create a new title object with the specified text.

      - -

      methods

      - -

      init

      this.init = function(target,
      data,
      options)

      sets the plot target, checks data and applies user options to plot.

      - -

      resetAxesScale

      this.resetAxesScale = function(axes,
      options)

      Reset the specified axes min, max, numberTicks and tickInterval properties to null or reset these properties on all axes if no list of axes is provided.

      Parameters

      axesBoolean to reset or not reset all axes or an array or object of axis names to reset.
      - -

      reInitialize

      this.reInitialize = function ()

      reinitialize plot for replotting. not called directly.

      - -

      destroy

      this.destroy = function()

      Releases all resources occupied by the plot

      - -

      replot

      this.replot = function(options)

      Does a reinitialization of the plot followed by a redraw.  Method could be used to interactively change plot characteristics and then replot.

      Parameters

      optionsOptions used for replotting.

      Properties

      clearfalse to not clear (empty) the plot container before replotting (default: true).
      resetAxestrue to reset all axes min, max, numberTicks and tickInterval setting so axes will rescale themselves. optionally pass in list of axes to reset (e.g.  [‘xaxis’, ‘y2axis’]) (default: false).
      - -

      redraw

      this.redraw = function(clear)

      Empties the plot target div and redraws the plot.  This enables plot data and properties to be changed and then to comletely clear the plot and redraw. redraw will not reinitialize any plot elements.  That is, axes will not be autoscaled and defaults will not be reapplied to any plot elements.  redraw is used primarily with zooming.

      Parameters

      clearfalse to not clear (empty) the plot container before redrawing (default: true).
      - -

      draw

      this.draw = function()

      Draws all elements of the plot into the container.  Does not clear the container before drawing.

      - -

      drawSeries

      this.drawSeries = function(options,
      idx)

      Redraws all or just one series on the plot.  No axis scaling is performed and no other elements on the plot are redrawn. options is an options object to pass on to the series renderers.  It can be an empty object {}.  idx is the series index to redraw if only one series is to be redrawn.

      - -

      moveSeriesToFront

      this.moveSeriesToFront = function (idx)

      This method requires jQuery 1.4+ Moves the specified series canvas in front of all other series canvases.  This effectively “draws” the specified series on top of all other series, although it is performed through DOM manipulation, no redrawing is performed.

      Parameters

      idx0 based index of the series to move.  This will be the index of the series as it was first passed into the jqplot function.
      - -

      moveSeriesToBack

      this.moveSeriesToBack = function (idx)

      This method requires jQuery 1.4+ Moves the specified series canvas behind all other series canvases.

      Parameters

      idx0 based index of the series to move.  This will be the index of the series as it was first passed into the jqplot function.
      - -

      restorePreviousSeriesOrder

      this.restorePreviousSeriesOrder = function ()

      This method requires jQuery 1.4+ Restore the series canvas order to its previous state.  Useful to put a series back where it belongs after moving it to the front.

      - -

      restoreOriginalSeriesOrder

      this.restoreOriginalSeriesOrder = function ()

      This method requires jQuery 1.4+ Restore the series canvas order to its original order when the plot was created.

      - -
      - - - - - - - - - - -
      This document is out of date.
      This document will help you understand how jqPlot’s options relate to the API documentation and the jqPlot object itself.
      this.show = false
      Wether to display the axis on the graph.
      this.tickRenderer = $.jqplot.AxisTickRenderer
      A class of a rendering engine for creating the ticks labels displayed on the plot, See $.jqplot.AxisTickRenderer.
      A “tick” object showing the value of a tick/gridline on the plot.
      this.tickOptions = {}
      Options that will be passed to the tickRenderer, see $.jqplot.AxisTickRenderer options.
      this.labelRenderer = $.jqplot.AxisLabelRenderer
      A class of a rendering engine for creating an axis label.
      this.labelOptions = {}
      Options passed to the label renderer.
      this.label = null
      Label for the axis
      this.showLabel = true
      true to show the axis label.
      this.min = null
      minimum value of the axis (in data units, not pixels).
      this.max = null
      maximum value of the axis (in data units, not pixels).
      this.autoscale = false
      DEPRECATED the default scaling algorithm produces superior results.
      this.pad = 1.2
      Padding to extend the range above and below the data bounds.
      this.padMax = null
      Padding to extend the range above data bounds.
      this.padMin = null
      Padding to extend the range below data bounds.
      this.ticks = []
      1D [val, val, ...] or 2D [[val, label], [val, label], ...] array of ticks for the axis.
      this.numberTicks
      Desired number of ticks.
      this.tickInterval
      number of units between ticks.
      this.renderer = $.jqplot.LinearAxisRenderer
      A class of a rendering engine that handles tick generation, scaling input data to pixel grid units and drawing the axis element.
      this.rendererOptions = {}
      renderer specific options.
      this.showTicks = true
      Wether to show the ticks (both marks and labels) or not.
      this.showTickMarks = true
      Wether to show the tick marks (line crossing grid) or not.
      this.showMinorTicks = true
      Wether or not to show minor ticks.
      this.drawMajorGridlines = true
      True to draw gridlines for major axis ticks.
      this.drawMinorGridlines = false
      True to draw gridlines for minor ticks.
      this.drawMajorTickMarks = true
      True to draw tick marks for major axis ticks.
      this.drawMinorTickMarks = true
      True to draw tick marks for minor ticks.
      this.useSeriesColor = false
      Use the color of the first series associated with this axis for the tick marks and line bordering this axis.
      this.borderWidth = null
      width of line stroked at the border of the axis.
      this.borderColor = null
      color of the border adjacent to the axis.
      this.syncTicks = null
      true to try and synchronize tick spacing across multiple axes so that ticks and grid lines line up.
      this.tickSpacing = 75
      Approximate pixel spacing between ticks on graph.
      this.show = false
      Wether to display the legend on the graph.
      this.location = 'ne'
      Placement of the legend.
      this.labels = []
      Array of labels to use.
      this.showLabels = true
      true to show the label text on the legend.
      this.showSwatches = true
      true to show the color swatches on the legend.
      this.placement = "insideGrid"
      “insideGrid” places legend inside the grid area of the plot.
      this.xoffset = 0
      DEPRECATED.
      this.yoffset = 0
      DEPRECATED.
      this.border
      css spec for the border around the legend box.
      this.background
      css spec for the background of the legend box.
      this.textColor
      css color spec for the legend text.
      this.fontFamily
      css font-family spec for the legend text.
      this.fontSize
      css font-size spec for the legend text.
      this.rowSpacing = '0.5em'
      css padding-top spec for the rows in the legend.
      this.rendererOptions = {}
      renderer specific options passed to the renderer.
      this.marginTop = null
      CSS margin for the legend DOM element.
      this.marginRight = null
      CSS margin for the legend DOM element.
      this.marginBottom = null
      CSS margin for the legend DOM element.
      this.marginLeft = null
      CSS margin for the legend DOM element.
      this.escapeHtml = false
      True to escape special characters with their html entity equivalents in legend text.
      this.text = text
      text of the title;
      this.show = true
      wether or not to show the title
      this.fontFamily
      css font-family spec for the text.
      this.fontSize
      css font-size spec for the text.
      this.textAlign
      css text-align spec for the text.
      this.textColor
      css color spec for the text.
      this.renderer = $.jqplot.DivTitleRenderer
      A class for creating a DOM element for the title, see $.jqplot.DivTitleRenderer.
      The default title renderer for jqPlot.
      this.rendererOptions = {}
      renderer specific options passed to the renderer.
      this.escapeHtml = false
      True to escape special characters with their html entity equivalents in title text.
      this.show = true
      wether or not to draw the series.
      this.xaxis = 'xaxis'
      which x axis to use with this series, either ‘xaxis’ or ‘x2axis’.
      this.yaxis = 'yaxis'
      which y axis to use with this series, either ‘yaxis’ or ‘y2axis’.
      this.renderer = $.jqplot.LineRenderer
      A class of a renderer which will draw the series, see $.jqplot.LineRenderer.
      The default line renderer for jqPlot, this class has no options beyond the Series class.
      this.rendererOptions = {}
      Options to pass on to the renderer.
      this.label = ''
      Line label to use in the legend.
      this.showLabel = true
      true to show label for this series in the legend.
      this.color
      css color spec for the series
      this.negativeColor
      css color spec used for filled (area) plots that are filled to zero and the “useNegativeColors” option is true.
      this.lineWidth = 2.5
      width of the line in pixels.
      this.lineJoin = 'round'
      Canvas lineJoin style between segments of series.
      this.lineCap = 'round'
      Canvas lineCap style at ends of line.
      this.linePattern = 'solid'
      line pattern ‘dashed’, ‘dotted’, ‘solid’, some combination of ‘-’ and ‘.’
      this.shadowAngle = 45
      Shadow angle in degrees
      this.shadowOffset = 1.25
      Shadow offset from line in pixels
      this.shadowDepth = 3
      Number of times shadow is stroked, each stroke offset shadowOffset from the last.
      this.shadowAlpha = '0.1'
      Alpha channel transparency of shadow.
      this.breakOnNull = false
      Wether line segments should be be broken at null value.
      this.markerRenderer = $.jqplot.MarkerRenderer
      A class of a renderer which will draw marker (e.g.
      this.markerOptions = {}
      renderer specific options to pass to the markerRenderer, see $.jqplot.MarkerRenderer.
      The default jqPlot marker renderer, rendering the points on the line.
      this.showLine = true
      wether to actually draw the line or not.
      this.showMarker = true
      wether or not to show the markers at the data points.
      this.index
      0 based index of this series in the plot series array.
      this.fill = false
      true or false, wether to fill under lines or in bars.
      this.fillColor
      CSS color spec to use for fill under line.
      this.fillAlpha
      Alpha transparency to apply to the fill under the line.
      this.fillAndStroke = false
      If true will stroke the line (with color this.color) as well as fill under it.
      this.disableStack = false
      true to not stack this series with other series in the plot.
      this.neighborThreshold = 4
      how close or far (in pixels) the cursor must be from a point marker to detect the point.
      this.fillToZero = false
      true will force bar and filled series to fill toward zero on the fill Axis.
      this.fillToValue = 0
      fill a filled series to this value on the fill axis.
      this.fillAxis = 'y'
      Either ‘x’ or ‘y’.
      this.useNegativeColors = true
      true to color negative values differently in filled and bar charts.
      this.drawGridlines = true
      wether to draw the gridlines on the plot.
      this.gridLineColor = '#cccccc'
      color of the grid lines.
      this.gridLineWidth = 1.0
      width of the grid lines.
      this.background = '#fffdf6'
      css spec for the background color.
      this.borderColor = '#999999'
      css spec for the color of the grid border.
      this.borderWidth = 2.0
      width of the border in pixels.
      this.drawBorder = true
      True to draw border around grid.
      this.shadow = true
      wether to show a shadow behind the grid.
      this.shadowAngle = 45
      shadow angle in degrees
      this.shadowOffset = 1.5
      Offset of each shadow stroke from the border in pixels
      this.shadowWidth = 3
      width of the stoke for the shadow
      this.shadowDepth = 3
      Number of times shadow is stroked, each stroke offset shadowOffset from the last.
      this.shadowColor = null
      an optional css color spec for the shadow in ‘rgba(n, n, n, n)’ form
      this.shadowAlpha = '0.07'
      Alpha channel transparency of shadow.
      this.renderer = $.jqplot.CanvasGridRenderer
      Instance of a renderer which will actually render the grid, see $.jqplot.CanvasGridRenderer.
      The default jqPlot grid renderer, creating a grid on a canvas element.
      this.rendererOptions = {}
      Options to pass on to the renderer, see $.jqplot.CanvasGridRenderer.
      this.animate = false
      True to animate the series on initial plot draw (renderer dependent).
      this.animateReplot = false
      True to animate series after a call to the replot() method.
      this.axes = {xaxis: new Axis('xaxis'), yaxis: new Axis('yaxis'), x2axis: new Axis('x2axis'), y2axis: new Axis('y2axis'), y3axis: new Axis('y3axis'), y4axis: new Axis('y4axis'), y5axis: new Axis('y5axis'), y6axis: new Axis('y6axis'), y7axis: new Axis('y7axis'), y8axis: new Axis('y8axis'), y9axis: new Axis('y9axis'), yMidAxis: new Axis('yMidAxis')}
      up to 4 axes are supported, each with it’s own options, See Axis for axis specific options.
      An individual axis object.
      this.data = []
      user’s data.
      this.dataRenderer
      A callable which can be used to preprocess data passed into the plot.
      this.dataRendererOptions
      Options that will be passed to the dataRenderer.
      seriesDefaults: {}, series:[] }
      default options that will be applied to all series.
      this.defaultAxisStart = 1
      1-D data series are internally converted into 2-D [x,y] data point arrays by jqPlot.
      this.fillBetween = { series1: null, series2: null, color: null, baseSeries: 0, fill: true }
      Fill between 2 line series in a plot.
      this.fontSize
      css spec for the font-size attribute.
      this.grid = new Grid()
      See Grid for grid specific options.
      Object representing the grid on which the plot is drawn.
      this.legend = new Legend()
      see $.jqplot.TableLegendRenderer
      this.series = []
      Array of series object options.
      this.seriesColors = $.jqplot.config.defaultColors
      Ann array of CSS color specifications that will be applied, in order, to the series in the plot.
      this.sortData = true
      false to not sort the data passed in by the user.
      this.stackSeries = false
      true or false, creates a stack or “mountain” plot.
      this.title = new Title()
      Title object.
      this.init = function(target,
      data,
      options)
      sets the plot target, checks data and applies user options to plot.
      this.resetAxesScale = function(axes,
      options)
      Reset the specified axes min, max, numberTicks and tickInterval properties to null or reset these properties on all axes if no list of axes is provided.
      this.reInitialize = function ()
      reinitialize plot for replotting.
      this.destroy = function()
      Releases all resources occupied by the plot
      this.replot = function(options)
      Does a reinitialization of the plot followed by a redraw.
      this.redraw = function(clear)
      Empties the plot target div and redraws the plot.
      this.draw = function()
      Draws all elements of the plot into the container.
      this.drawSeries = function(options,
      idx)
      Redraws all or just one series on the plot.
      this.moveSeriesToFront = function (idx)
      This method requires jQuery 1.4+ Moves the specified series canvas in front of all other series canvases.
      this.moveSeriesToBack = function (idx)
      This method requires jQuery 1.4+ Moves the specified series canvas behind all other series canvases.
      this.restorePreviousSeriesOrder = function ()
      This method requires jQuery 1.4+ Restore the series canvas order to its previous state.
      this.restoreOriginalSeriesOrder = function ()
      This method requires jQuery 1.4+ Restore the series canvas order to its original order when the plot was created.
      GNU GENERAL PUBLIC LICENSE Version 2, June 1991
      Copyright © 2009-2011 Chris Leonello
      The default jqPlot axis renderer, creating a numeric axis.
      An individual data series object.
      Plot Title object.
      - - - - - - - - \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/docs/files/jqplot-divTitleRenderer-js.html b/libreplan-webapp/src/main/webapp/jqplot/docs/files/jqplot-divTitleRenderer-js.html deleted file mode 100644 index bda0f4cd4..000000000 --- a/libreplan-webapp/src/main/webapp/jqplot/docs/files/jqplot-divTitleRenderer-js.html +++ /dev/null @@ -1,39 +0,0 @@ - - -$.jqplot.DivTitleRenderer - - - - - - - - - -

      The default title renderer for jqPlot.  This class has no options beyond the Title class.

      - -
      - - - - - - - - - - -
      Plot Title object.
      - - - - - - - - \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/docs/files/jqplot-lineRenderer-js.html b/libreplan-webapp/src/main/webapp/jqplot/docs/files/jqplot-lineRenderer-js.html deleted file mode 100644 index f52d7aba9..000000000 --- a/libreplan-webapp/src/main/webapp/jqplot/docs/files/jqplot-lineRenderer-js.html +++ /dev/null @@ -1,69 +0,0 @@ - - -$.jqplot.LineRenderer - - - - - - - - - -

      The default line renderer for jqPlot, this class has no options beyond the Series class.  Draws series as a line.

      Summary
      $.jqplot.LineRendererThe default line renderer for jqPlot, this class has no options beyond the Series class.
      Properties
      smoothTrue to draw a smoothed (interpolated) line through the data points with automatically computed number of smoothing points.
      constrainSmoothingTrue to use a more accurate smoothing algorithm that will not overshoot any data points.
      bandDataData used to draw error bands or confidence intervals above/below a line.
      bandsBanding around line, e.g error bands or confidence intervals.
      showtrue to show the bands.
      colorcolor of lines at top and bottom of bands [default: series color].
      showLinesTrue to show lines at top and bottom of bands [default: false].
      fillTrue to fill area between bands [default: true].
      fillColorcss color spec for filled area.
      intervalUser specified interval above and below line for bands [default: ‘3%’’].
      Properties
      highlightMouseOverTrue to highlight area on a filled plot when moused over.
      highlightMouseDownTrue to highlight when a mouse button is pressed over an area on a filled plot.
      highlightColorcolor to use when highlighting an area on a filled plot.
      - -

      Properties

      - -

      smooth

      this.renderer.smooth = false

      True to draw a smoothed (interpolated) line through the data points with automatically computed number of smoothing points.  Set to an integer number > 2 to specify number of smoothing points to use between each data point.

      - -

      constrainSmoothing

      this.renderer.constrainSmoothing = true

      True to use a more accurate smoothing algorithm that will not overshoot any data points.  False to allow overshoot but produce a smoother looking line.

      - -

      bandData

      this.renderer.bandData = []

      Data used to draw error bands or confidence intervals above/below a line.

      bandData can be input in 3 forms.  jqPlot will figure out which is the low band line and which is the high band line for all forms:

      A 2 dimensional array like [[yl1, yl2, ...], [yu1, yu2, ...]] where [yl1, yl2, ...] are y values of the lower line and [yu1, yu2, ...] are y values of the upper line.  In this case there must be the same number of y data points as data points in the series and the bands will inherit the x values of the series.

      A 2 dimensional array like [[[xl1, yl1], [xl2, yl2], ...], [[xh1, yh1], [xh2, yh2], ...]] where [xl1, yl1] are x,y data points for the lower line and [xh1, yh1] are x,y data points for the high line. x values do not have to correspond to the x values of the series and can be of any arbitrary length.

      Can be of form [[yl1, yu1], [yl2, yu2], [yl3, yu3], ...] where there must be 3 or more arrays and there must be the same number of arrays as there are data points in the series.  In this case, [yl1, yu1] specifies the lower and upper y values for the 1st data point and so on.  The bands will inherit the x values from the series.

      - -

      bands

      Banding around line, e.g error bands or confidence intervals.

      - -

      show

      true to show the bands.  If bandData or interval is supplied, show will be set to true by default.

      - -

      color

      color of lines at top and bottom of bands [default: series color].

      - -

      showLines

      True to show lines at top and bottom of bands [default: false].

      - -

      fill

      True to fill area between bands [default: true].

      - -

      fillColor

      css color spec for filled area.  [default: series color].

      - -

      interval

      interval: '3%' }

      User specified interval above and below line for bands [default: ‘3%’’].  Can be a value like 3 or a string like ‘3%’ or an upper/lower array like [1, -2] or [‘2%’, ‘-1.5%’]

      - -

      Properties

      - -

      highlightMouseOver

      this.highlightMouseOver = true

      True to highlight area on a filled plot when moused over.  This must be false to enable highlightMouseDown to highlight when clicking on an area on a filled plot.

      - -

      highlightMouseDown

      this.highlightMouseDown = false

      True to highlight when a mouse button is pressed over an area on a filled plot.  This will be disabled if highlightMouseOver is true.

      - -

      highlightColor

      this.highlightColor = null

      color to use when highlighting an area on a filled plot.

      - -
      - - - - - - - - - - -
      An individual data series object.
      this.renderer.smooth = false
      True to draw a smoothed (interpolated) line through the data points with automatically computed number of smoothing points.
      this.renderer.constrainSmoothing = true
      True to use a more accurate smoothing algorithm that will not overshoot any data points.
      this.renderer.bandData = []
      Data used to draw error bands or confidence intervals above/below a line.
      interval: '3%' }
      User specified interval above and below line for bands [default: ‘3%’’].
      this.highlightMouseOver = true
      True to highlight area on a filled plot when moused over.
      this.highlightMouseDown = false
      True to highlight when a mouse button is pressed over an area on a filled plot.
      this.highlightColor = null
      color to use when highlighting an area on a filled plot.
      - - - - - - - - \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/docs/files/jqplot-linearAxisRenderer-js.html b/libreplan-webapp/src/main/webapp/jqplot/docs/files/jqplot-linearAxisRenderer-js.html deleted file mode 100644 index 3b492541a..000000000 --- a/libreplan-webapp/src/main/webapp/jqplot/docs/files/jqplot-linearAxisRenderer-js.html +++ /dev/null @@ -1,61 +0,0 @@ - - -$.jqplot.LinearAxisRenderer - - - - - - - - - -

      The default jqPlot axis renderer, creating a numeric axis.

      Summary
      $.jqplot.LinearAxisRendererThe default jqPlot axis renderer, creating a numeric axis.
      Properties
      breakPointsEXPERIMENTAL!! 
      breakTickLabelLabel to use at the axis break if breakPoints are specified.
      drawBaselineTrue to draw the axis baseline.
      baselineWidthwidth of the baseline in pixels.
      baselineColorCSS color spec for the baseline.
      forceTickAt0This will ensure that there is always a tick mark at 0.
      forceTickAt100This will ensure that there is always a tick mark at 100.
      tickInsetControls the amount to inset the first and last ticks from the edges of the grid, in multiples of the tick interval.
      minorTicksNumber of ticks to add between “major” ticks.
      alignTickstrue to align tick marks across opposed axes such as from the y2axis to yaxis.
      - -

      Properties

      - -

      breakPoints

      this.breakPoints = null

      EXPERIMENTAL!!  Use at your own risk!  Works only with linear axes and the default tick renderer.  Array of [start, stop] points to create a broken axis.  Broken axes have a “jump” in them, which is an immediate transition from a smaller value to a larger value.  Currently, axis ticks MUST be manually assigned if using breakPoints by using the axis ticks array option.

      - -

      breakTickLabel

      this.breakTickLabel = "&asymp

      Label to use at the axis break if breakPoints are specified.

      - -

      drawBaseline

      this.drawBaseline = true

      True to draw the axis baseline.

      - -

      baselineWidth

      this.baselineWidth = null

      width of the baseline in pixels.

      - -

      baselineColor

      this.baselineColor = null

      CSS color spec for the baseline.

      - -

      forceTickAt0

      this.forceTickAt0 = false

      This will ensure that there is always a tick mark at 0.  If data range is strictly positive or negative, this will force 0 to be inside the axis bounds unless the appropriate axis pad (pad, padMin or padMax) is set to 0, then this will force an axis min or max value at 0.  This has know effect when any of the following options are set: autoscale, min, max, numberTicks or tickInterval.

      - -

      forceTickAt100

      this.forceTickAt100 = false

      This will ensure that there is always a tick mark at 100.  If data range is strictly above or below 100, this will force 100 to be inside the axis bounds unless the appropriate axis pad (pad, padMin or padMax) is set to 0, then this will force an axis min or max value at 100.  This has know effect when any of the following options are set: autoscale, min, max, numberTicks or tickInterval.

      - -

      tickInset

      this.tickInset = 0

      Controls the amount to inset the first and last ticks from the edges of the grid, in multiples of the tick interval.  0 is no inset, 0.5 is one half a tick interval, 1 is a full tick interval, etc.

      - -

      minorTicks

      this.minorTicks = 0

      Number of ticks to add between “major” ticks.  Major ticks are ticks supplied by user or auto computed.  Minor ticks cannot be created by user.

      - -

      alignTicks

      this.alignTicks = false

      true to align tick marks across opposed axes such as from the y2axis to yaxis.

      - -
      - - - - - - - - - - -
      this.breakPoints = null
      EXPERIMENTAL!! 
      this.breakTickLabel = "&asymp
      Label to use at the axis break if breakPoints are specified.
      this.drawBaseline = true
      True to draw the axis baseline.
      this.baselineWidth = null
      width of the baseline in pixels.
      this.baselineColor = null
      CSS color spec for the baseline.
      this.forceTickAt0 = false
      This will ensure that there is always a tick mark at 0.
      this.forceTickAt100 = false
      This will ensure that there is always a tick mark at 100.
      this.tickInset = 0
      Controls the amount to inset the first and last ticks from the edges of the grid, in multiples of the tick interval.
      this.minorTicks = 0
      Number of ticks to add between “major” ticks.
      this.alignTicks = false
      true to align tick marks across opposed axes such as from the y2axis to yaxis.
      - - - - - - - - \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/docs/files/jqplot-markerRenderer-js.html b/libreplan-webapp/src/main/webapp/jqplot/docs/files/jqplot-markerRenderer-js.html deleted file mode 100644 index 2d14926bc..000000000 --- a/libreplan-webapp/src/main/webapp/jqplot/docs/files/jqplot-markerRenderer-js.html +++ /dev/null @@ -1,65 +0,0 @@ - - -$.jqplot.MarkerRenderer - - - - - - - - - -

      The default jqPlot marker renderer, rendering the points on the line.

      Summary
      $.jqplot.MarkerRendererThe default jqPlot marker renderer, rendering the points on the line.
      Properties
      showwether or not to show the marker.
      styleOne of diamond, circle, square, x, plus, dash, filledDiamond, filledCircle, filledSquare
      lineWidthsize of the line for non-filled markers.
      sizeSize of the marker (diameter or circle, length of edge of square, etc.)
      colorcolor of marker.
      shadowwether or not to draw a shadow on the line
      shadowAngleShadow angle in degrees
      shadowOffsetShadow offset from line in pixels
      shadowDepthNumber of times shadow is stroked, each stroke offset shadowOffset from the last.
      shadowAlphaAlpha channel transparency of shadow.
      shadowRendererRenderer that will draws the shadows on the marker.
      shapeRendererRenderer that will draw the marker.
      - -

      Properties

      - -

      show

      this.show = true

      wether or not to show the marker.

      - -

      style

      this.style = 'filledCircle'

      One of diamond, circle, square, x, plus, dash, filledDiamond, filledCircle, filledSquare

      - -

      lineWidth

      this.lineWidth = 2

      size of the line for non-filled markers.

      - -

      size

      this.size = 9.0

      Size of the marker (diameter or circle, length of edge of square, etc.)

      - -

      color

      this.color = '#666666'

      color of marker.  Will be set to color of series by default on init.

      - -

      shadow

      this.shadow = true

      wether or not to draw a shadow on the line

      - -

      shadowAngle

      this.shadowAngle = 45

      Shadow angle in degrees

      - -

      shadowOffset

      this.shadowOffset = 1

      Shadow offset from line in pixels

      - -

      shadowDepth

      this.shadowDepth = 3

      Number of times shadow is stroked, each stroke offset shadowOffset from the last.

      - -

      shadowAlpha

      this.shadowAlpha = '0.07'

      Alpha channel transparency of shadow.  0 = transparent.

      - -

      shadowRenderer

      this.shadowRenderer = new $.jqplot.ShadowRenderer()

      Renderer that will draws the shadows on the marker.

      - -

      shapeRenderer

      this.shapeRenderer = new $.jqplot.ShapeRenderer()

      Renderer that will draw the marker.

      - -
      - - - - - - - - - - -
      this.show = true
      wether or not to show the marker.
      this.style = 'filledCircle'
      One of diamond, circle, square, x, plus, dash, filledDiamond, filledCircle, filledSquare
      this.lineWidth = 2
      size of the line for non-filled markers.
      this.size = 9.0
      Size of the marker (diameter or circle, length of edge of square, etc.)
      this.color = '#666666'
      color of marker.
      this.shadow = true
      wether or not to draw a shadow on the line
      this.shadowAngle = 45
      Shadow angle in degrees
      this.shadowOffset = 1
      Shadow offset from line in pixels
      this.shadowDepth = 3
      Number of times shadow is stroked, each stroke offset shadowOffset from the last.
      this.shadowAlpha = '0.07'
      Alpha channel transparency of shadow.
      this.shadowRenderer = new $.jqplot.ShadowRenderer()
      Renderer that will draws the shadows on the marker.
      this.shapeRenderer = new $.jqplot.ShapeRenderer()
      Renderer that will draw the marker.
      - - - - - - - - \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/docs/files/jqplot-shadowRenderer-js.html b/libreplan-webapp/src/main/webapp/jqplot/docs/files/jqplot-shadowRenderer-js.html deleted file mode 100644 index fedf0037b..000000000 --- a/libreplan-webapp/src/main/webapp/jqplot/docs/files/jqplot-shadowRenderer-js.html +++ /dev/null @@ -1,61 +0,0 @@ - - -$.jqplot.shadowRenderer - - - - - - - - - -

      The default jqPlot shadow renderer, rendering shadows behind shapes.

      Summary
      $.jqplot.shadowRendererThe default jqPlot shadow renderer, rendering shadows behind shapes.
      Properties
      angleAngle of the shadow in degrees.
      offsetPixel offset at the given shadow angle of each shadow stroke from the last stroke.
      alphaalpha transparency of shadow stroke.
      lineWidthwidth of the shadow line stroke.
      lineJoinHow line segments of the shadow are joined.
      lineCaphow ends of the shadow line are rendered.
      fillwhether to fill the shape.
      depthhow many times the shadow is stroked.
      isarcwether the shadow is an arc or not.
      drawdraws an transparent black (i.e.
      - -

      Properties

      - -

      angle

      this.angle = 45

      Angle of the shadow in degrees.  Measured counter-clockwise from the x axis.

      - -

      offset

      this.offset = 1

      Pixel offset at the given shadow angle of each shadow stroke from the last stroke.

      - -

      alpha

      this.alpha = 0.07

      alpha transparency of shadow stroke.

      - -

      lineWidth

      this.lineWidth = 1.5

      width of the shadow line stroke.

      - -

      lineJoin

      this.lineJoin = 'miter'

      How line segments of the shadow are joined.

      - -

      lineCap

      this.lineCap = 'round'

      how ends of the shadow line are rendered.

      - -

      fill

      this.fill = false

      whether to fill the shape.

      - -

      depth

      this.depth = 3

      how many times the shadow is stroked.  Each stroke will be offset by offset at angle degrees.

      - -

      isarc

      this.isarc = false

      wether the shadow is an arc or not.

      - -

      draw

      $.jqplot.ShadowRenderer.prototype.draw = function(ctx,
      points,
      options)

      draws an transparent black (i.e. gray) shadow.

      ctxcanvas drawing context
      pointsarray of points or [x, y, radius, start angle (rad), end angle (rad)]
      - -
      - - - - - - - - - - -
      this.angle = 45
      Angle of the shadow in degrees.
      this.offset = 1
      Pixel offset at the given shadow angle of each shadow stroke from the last stroke.
      this.alpha = 0.07
      alpha transparency of shadow stroke.
      this.lineWidth = 1.5
      width of the shadow line stroke.
      this.lineJoin = 'miter'
      How line segments of the shadow are joined.
      this.lineCap = 'round'
      how ends of the shadow line are rendered.
      this.fill = false
      whether to fill the shape.
      this.depth = 3
      how many times the shadow is stroked.
      this.isarc = false
      wether the shadow is an arc or not.
      $.jqplot.ShadowRenderer.prototype.draw = function(ctx,
      points,
      options)
      draws an transparent black (i.e.
      - - - - - - - - \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/docs/files/jqplot-shapeRenderer-js.html b/libreplan-webapp/src/main/webapp/jqplot/docs/files/jqplot-shapeRenderer-js.html deleted file mode 100644 index d913b1a7f..000000000 --- a/libreplan-webapp/src/main/webapp/jqplot/docs/files/jqplot-shapeRenderer-js.html +++ /dev/null @@ -1,65 +0,0 @@ - - -$.jqplot.shapeRenderer - - - - - - - - - -

      The default jqPlot shape renderer.  Given a set of points will plot them and either stroke a line (fill = false) or fill them (fill = true).  If a filled shape is desired, closePath = true must also be set to close the shape.

      Summary
      $.jqplot.shapeRendererThe default jqPlot shape renderer.
      Properties
      linePatternline pattern ‘dashed’, ‘dotted’, ‘solid’, some combination of ‘-’ and ‘.’
      lineJoinHow line segments of the shadow are joined.
      lineCaphow ends of the shadow line are rendered.
      fillwhether to fill the shape.
      isarcwether the shadow is an arc or not.
      fillRecttrue to draw shape as a filled rectangle.
      strokeRecttrue to draw shape as a stroked rectangle.
      clearRecttrue to cear a rectangle.
      strokeStylecss color spec for the stoke style
      fillStylecss color spec for the fill style.
      Functions
      drawdraws the shape.
      - -

      Properties

      - -

      linePattern

      this.linePattern = 'solid'

      line pattern ‘dashed’, ‘dotted’, ‘solid’, some combination of ‘-’ and ‘.’ characters such as ‘.-.’ or a numerical array like [draw, skip, draw, skip, ...] such as [1, 10] to draw a dotted line, [1, 10, 20, 10] to draw a dot-dash line, and so on.

      - -

      lineJoin

      this.lineJoin = 'miter'

      How line segments of the shadow are joined.

      - -

      lineCap

      this.lineCap = 'round'

      how ends of the shadow line are rendered.

      - -

      fill

      this.fill = false

      whether to fill the shape.

      - -

      isarc

      this.isarc = false

      wether the shadow is an arc or not.

      - -

      fillRect

      this.fillRect = false

      true to draw shape as a filled rectangle.

      - -

      strokeRect

      this.strokeRect = false

      true to draw shape as a stroked rectangle.

      - -

      clearRect

      this.clearRect = false

      true to cear a rectangle.

      - -

      strokeStyle

      this.strokeStyle = '#999999'

      css color spec for the stoke style

      - -

      fillStyle

      this.fillStyle = '#999999'

      css color spec for the fill style.

      - -

      Functions

      - -

      draw

      $.jqplot.ShapeRenderer.prototype.draw = function(ctx,
      points,
      options)

      draws the shape.

      ctxcanvas drawing context
      pointsarray of points for shapes or [x, y, width, height] for rectangles or [x, y, radius, start angle (rad), end angle (rad)] for circles and arcs.
      - -
      - - - - - - - - - - -
      this.linePattern = 'solid'
      line pattern ‘dashed’, ‘dotted’, ‘solid’, some combination of ‘-’ and ‘.’
      this.lineJoin = 'miter'
      How line segments of the shadow are joined.
      this.lineCap = 'round'
      how ends of the shadow line are rendered.
      this.fill = false
      whether to fill the shape.
      this.isarc = false
      wether the shadow is an arc or not.
      this.fillRect = false
      true to draw shape as a filled rectangle.
      this.strokeRect = false
      true to draw shape as a stroked rectangle.
      this.clearRect = false
      true to cear a rectangle.
      this.strokeStyle = '#999999'
      css color spec for the stoke style
      this.fillStyle = '#999999'
      css color spec for the fill style.
      $.jqplot.ShapeRenderer.prototype.draw = function(ctx,
      points,
      options)
      draws the shape.
      - - - - - - - - \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/docs/files/jqplot-themeEngine-js.html b/libreplan-webapp/src/main/webapp/jqplot/docs/files/jqplot-themeEngine-js.html deleted file mode 100644 index a61451056..000000000 --- a/libreplan-webapp/src/main/webapp/jqplot/docs/files/jqplot-themeEngine-js.html +++ /dev/null @@ -1,191 +0,0 @@ - - -$.jqplot.ThemeEngine - - - - - - - - - -

      Theme Engine provides a programatic way to change some of the more common jqplot styling options such as fonts, colors and grid options.  A theme engine instance is created with each plot.  The theme engine manages a collection of themes which can be modified, added to, or applied to the plot.

      The themeEngine class is not instantiated directly.  When a plot is initialized, the current plot options are scanned an a default theme named “Default” is created.  This theme is used as the basis for other themes added to the theme engine and is always available.

      A theme is a simple javascript object with styling parameters for various entities of the plot.  A theme has the form:

      {
      -    _name:f "Default",
      -    target: {
      -        backgroundColor: "transparent"
      -    },
      -    legend: {
      -        textColor: null,
      -        fontFamily: null,
      -        fontSize: null,
      -        border: null,
      -        background: null
      -    },
      -    title: {
      -        textColor: "rgb(102, 102, 102)",
      -        fontFamily: "'Trebuchet MS',Arial,Helvetica,sans-serif",
      -        fontSize: "19.2px",
      -        textAlign: "center"
      -    },
      -    seriesStyles: {},
      -    series: [{
      -        color: "#4bb2c5",
      -        lineWidth: 2.5,
      -        linePattern: "solid",
      -        shadow: true,
      -        fillColor: "#4bb2c5",
      -        showMarker: true,
      -        markerOptions: {
      -            color: "#4bb2c5",
      -            show: true,
      -            style: 'filledCircle',
      -            lineWidth: 1.5,
      -            size: 4,
      -            shadow: true
      -        }
      -    }],
      -    grid: {
      -        drawGridlines: true,
      -        gridLineColor: "#cccccc",
      -        gridLineWidth: 1,
      -        backgroundColor: "#fffdf6",
      -        borderColor: "#999999",
      -        borderWidth: 2,
      -        shadow: true
      -    },
      -    axesStyles: {
      -        label: {},
      -        ticks: {}
      -    },
      -    axes: {
      -        xaxis: {
      -            borderColor: "#999999",
      -            borderWidth: 2,
      -            ticks: {
      -                show: true,
      -                showGridline: true,
      -                showLabel: true,
      -                showMark: true,
      -                size: 4,
      -                textColor: "",
      -                whiteSpace: "nowrap",
      -                fontSize: "12px",
      -                fontFamily: "'Trebuchet MS',Arial,Helvetica,sans-serif"
      -            },
      -            label: {
      -                textColor: "rgb(102, 102, 102)",
      -                whiteSpace: "normal",
      -                fontSize: "14.6667px",
      -                fontFamily: "'Trebuchet MS',Arial,Helvetica,sans-serif",
      -                fontWeight: "400"
      -            }
      -        },
      -        yaxis: {
      -            borderColor: "#999999",
      -            borderWidth: 2,
      -            ticks: {
      -                show: true,
      -                showGridline: true,
      -                showLabel: true,
      -                showMark: true,
      -                size: 4,
      -                textColor: "",
      -                whiteSpace: "nowrap",
      -                fontSize: "12px",
      -                fontFamily: "'Trebuchet MS',Arial,Helvetica,sans-serif"
      -            },
      -            label: {
      -                textColor: null,
      -                whiteSpace: null,
      -                fontSize: null,
      -                fontFamily: null,
      -                fontWeight: null
      -            }
      -        },
      -        x2axis: {...
      -        },
      -        ...
      -        y9axis: {...
      -        }
      -    }
      -}

      ”seriesStyles” is a style object that will be applied to all series in the plot.  It will forcibly override any styles applied on the individual series.  “axesStyles” is a style object that will be applied to all axes in the plot.  It will also forcibly override any styles on the individual axes.

      The example shown above has series options for a line series.  Options for other series types are shown below:

      Bar Series

      {
      -    color: "#4bb2c5",
      -    seriesColors: ["#4bb2c5", "#EAA228", "#c5b47f", "#579575", "#839557", "#958c12", "#953579", "#4b5de4", "#d8b83f", "#ff5800", "#0085cc", "#c747a3", "#cddf54", "#FBD178", "#26B4E3", "#bd70c7"],
      -    lineWidth: 2.5,
      -    shadow: true,
      -    barPadding: 2,
      -    barMargin: 10,
      -    barWidth: 15.09375,
      -    highlightColors: ["rgb(129,201,214)", "rgb(129,201,214)", "rgb(129,201,214)", "rgb(129,201,214)", "rgb(129,201,214)", "rgb(129,201,214)", "rgb(129,201,214)", "rgb(129,201,214)"]
      -}

      Pie Series

      {
      -    seriesColors: ["#4bb2c5", "#EAA228", "#c5b47f", "#579575", "#839557", "#958c12", "#953579", "#4b5de4", "#d8b83f", "#ff5800", "#0085cc", "#c747a3", "#cddf54", "#FBD178", "#26B4E3", "#bd70c7"],
      -    padding: 20,
      -    sliceMargin: 0,
      -    fill: true,
      -    shadow: true,
      -    startAngle: 0,
      -    lineWidth: 2.5,
      -    highlightColors: ["rgb(129,201,214)", "rgb(240,189,104)", "rgb(214,202,165)", "rgb(137,180,158)", "rgb(168,180,137)", "rgb(180,174,89)", "rgb(180,113,161)", "rgb(129,141,236)", "rgb(227,205,120)", "rgb(255,138,76)", "rgb(76,169,219)", "rgb(215,126,190)", "rgb(220,232,135)", "rgb(200,167,96)", "rgb(103,202,235)", "rgb(208,154,215)"]
      -}

      Funnel Series

      {
      -    color: "#4bb2c5",
      -    lineWidth: 2,
      -    shadow: true,
      -    padding: {
      -        top: 20,
      -        right: 20,
      -        bottom: 20,
      -        left: 20
      -    },
      -    sectionMargin: 6,
      -    seriesColors: ["#4bb2c5", "#EAA228", "#c5b47f", "#579575", "#839557", "#958c12", "#953579", "#4b5de4", "#d8b83f", "#ff5800", "#0085cc", "#c747a3", "#cddf54", "#FBD178", "#26B4E3", "#bd70c7"],
      -    highlightColors: ["rgb(147,208,220)", "rgb(242,199,126)", "rgb(220,210,178)", "rgb(154,191,172)", "rgb(180,191,154)", "rgb(191,186,112)", "rgb(191,133,174)", "rgb(147,157,238)", "rgb(231,212,139)", "rgb(255,154,102)", "rgb(102,181,224)", "rgb(221,144,199)", "rgb(225,235,152)", "rgb(200,167,96)", "rgb(124,210,238)", "rgb(215,169,221)"]
      -}
      Summary
      $.jqplot.ThemeEngineTheme Engine provides a programatic way to change some of the more common jqplot styling options such as fonts, colors and grid options.
      Properties
      themeshash of themes managed by the theme engine.
      activeThemePointer to currently active theme
      methods
      getGet and return the named theme or the active theme if no name given.
      getThemeNamesReturn the list of theme names in this manager in alpha-numerical order.
      getThemesReturn a list of themes in alpha-numerical order by name.
      removeRemove the given theme from the themeEngine.
      newThemeCreate a new theme based on the default theme, adding it the themeEngine.
      renameRename a theme.
      copyCreate a copy of an existing theme in the themeEngine, adding it the themeEngine.
      - -

      Properties

      - -

      themes

      this.themes = {}

      hash of themes managed by the theme engine.  Indexed by theme name.

      - -

      activeTheme

      this.activeTheme=null

      Pointer to currently active theme

      - -

      methods

      - -

      get

      $.jqplot.ThemeEngine.prototype.get = function(name)

      Get and return the named theme or the active theme if no name given.

      parameter

      namename of theme to get.

      returns

      Theme instance of given name.

      - -

      getThemeNames

      $.jqplot.ThemeEngine.prototype.getThemeNames = function()

      Return the list of theme names in this manager in alpha-numerical order.

      parameter

      None

      returns

      A the list of theme names in this manager in alpha-numerical order.

      - -

      getThemes

      $.jqplot.ThemeEngine.prototype.getThemes = function()

      Return a list of themes in alpha-numerical order by name.

      parameter

      None

      returns

      A list of themes in alpha-numerical order by name.

      - -

      remove

      $.jqplot.ThemeEngine.prototype.remove = function(name)

      Remove the given theme from the themeEngine.

      parameters

      namename of the theme to remove.

      returns

      true on success, false on failure.

      - -

      newTheme

      $.jqplot.ThemeEngine.prototype.newTheme = function(name,
      obj)

      Create a new theme based on the default theme, adding it the themeEngine.

      parameters

      namename of the new theme.
      objoptional object of styles to be applied to this new theme.

      returns

      new Theme object.

      - -

      rename

      $.jqplot.ThemeEngine.prototype.rename = function (oldName,
      newName)

      Rename a theme.

      parameters

      oldNamecurrent name of the theme.
      newNamedesired name of the theme.

      returns

      new Theme object.

      - -

      copy

      $.jqplot.ThemeEngine.prototype.copy = function (sourceName,
      targetName,
      obj)

      Create a copy of an existing theme in the themeEngine, adding it the themeEngine.

      parameters

      sourceNamename of the existing theme.
      targetNamename of the copy.
      objoptional object of style parameter to apply to the new theme.

      returns

      new Theme object.

      - -
      - - - - - - - - - - -
      this.themes = {}
      hash of themes managed by the theme engine.
      this.activeTheme=null
      Pointer to currently active theme
      $.jqplot.ThemeEngine.prototype.get = function(name)
      Get and return the named theme or the active theme if no name given.
      $.jqplot.ThemeEngine.prototype.getThemeNames = function()
      Return the list of theme names in this manager in alpha-numerical order.
      $.jqplot.ThemeEngine.prototype.getThemes = function()
      Return a list of themes in alpha-numerical order by name.
      $.jqplot.ThemeEngine.prototype.remove = function(name)
      Remove the given theme from the themeEngine.
      $.jqplot.ThemeEngine.prototype.newTheme = function(name,
      obj)
      Create a new theme based on the default theme, adding it the themeEngine.
      $.jqplot.ThemeEngine.prototype.rename = function (oldName,
      newName)
      Rename a theme.
      $.jqplot.ThemeEngine.prototype.copy = function (sourceName,
      targetName,
      obj)
      Create a copy of an existing theme in the themeEngine, adding it the themeEngine.
      - - - - - - - - \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/docs/files/jqplot-toImage-js.html b/libreplan-webapp/src/main/webapp/jqplot/docs/files/jqplot-toImage-js.html deleted file mode 100644 index eb1db2d93..000000000 --- a/libreplan-webapp/src/main/webapp/jqplot/docs/files/jqplot-toImage-js.html +++ /dev/null @@ -1,39 +0,0 @@ - - -$.fn - - - - - - - - - -

      jQuery namespace to attach functions to jQuery elements.

      - -
      - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/docs/files/optionsTutorial-txt.html b/libreplan-webapp/src/main/webapp/jqplot/docs/files/optionsTutorial-txt.html deleted file mode 100644 index 3be8b5606..000000000 --- a/libreplan-webapp/src/main/webapp/jqplot/docs/files/optionsTutorial-txt.html +++ /dev/null @@ -1,120 +0,0 @@ - - -Options Tutorial - - - - - - - - - -

      This document will help you understand how jqPlot’s options relate to the API documentation and the jqPlot object itself.  For a listing of options available to jqPlot, see jqPlot Options in the jqPlotOptions.txt file.

      The key to effectively using jqPlot is understanding jqPlot’s options.  The online documentation is API documentation.  While it explains what attributes and methods various objects posses, it doesn’t explain how to use or set those attributes through options.  This tutorial will help explain that.

      Lets assume you are creating a plot like this:

      chart = $.jqplot('chart', dataSeries, optionsObj);

      First, note that you shouldn’t try to directly set attributes on the “chart” object (like chart.grid.shadow) after your call to $.jqplot().  At best this won’t do anything **(see below).  You should pass options in via the “optionsObj”.

      the optionsObj really represents the plot object (jqPlot object, not to be confused with the $.jqplot function which will create a jqPlot object).  Attributes you specify on that object will be merged with attributes in the jqPlot object.  The axes, legend, series, etc. are attributes on the jqPlot object.  The jqPlot/optionsObj object looks something like (only some attributes shown):

      jqPlot-|
      -       |-seriesColors
      -       |-textColor
      -       |-fontFamily
      -       |-fontSize
      -       |-stackSeries
      -       |-series(Array)-|
      -       |               |-Series1-|
      -       |               |         |-lineWidth
      -       |               |         |-linePattern
      -       |               |         |-shadow
      -       |               |         |-showLine
      -       |               |         |-showMarker
      -       |               |         |-color
      -       |               |-Series2...
      -       |               |-...
      -       |               |-SeriesN
      -       |
      -       |-grid(Object)-|
      -       |              |-drawGridLines
      -       |              |-background
      -       |              |-borderColor
      -       |              |-borderWidth
      -       |              |-shadow
      -       |
      -       |-title(Object)-|
      -       |               |-text
      -       |               |-show
      -       |               |-fontFamily
      -       |               |-fontSize
      -       |               |-textAlign
      -       |               |-textColor
      -       |
      -       |-axes(Object)-|
      -       |              |-xais-|
      -       |              |      |-min
      -       |              |      |-max
      -       |              |      |-numberTicks
      -       |              |      |-showTicks
      -       |              |      |-showTickMarks
      -       |              |      |-pad
      -       |
      -       | ... and so on

      The optionsObj should follow the same construction as if it were a jqPlot object (with some exceptions/shortcuts I’ll mention in a moment).  So generally, when you see something like “this.drawGridLines” in the grid properties in the docs, just replace “this” with “grid” in your options object.  So it becomes optionsObj.grid.drawGridLines.  Do likewise with the other objects in the plot, replacing “this”, with the respective attribute on the plot like “legend” or “title”.  Series and Axes are handled a little different, because series is an array and axes has 4 distinct children “xaxis”, “yaxis”, “x2axis” and “y2axis”.

      So, to remove the shadow from the grid and change the grid border size you would do:

      optionObj = {grid:{shadow:false, borderWidth:9.0}};

      To do the same as above but also make all the text in the plot red you would do:

      optionObj = {
      -   textColor:"#ff0000",
      -   grid:{shadow:false, borderWidth:9.0}
      -}

      Here is a more deeply nested example.  Say you want to specify a min and max on your y axis and use a specific color for your second series.  That would look like:

      optionsObj = {
      -   axes:{yaxis:{min:5, max:230}},
      -   series:[{},{color:"#33ff66"}]
      -}

      Note that series options are an array in order of the series data you sent in to your plot.  To get to the second series, you have to put an object (even if empty) in place of the first series.

      There is a handy shortcut to assign options to all axes or all series at one go.  Use axesDefaults and seriesDefaults.  So, if you wanted both x and y axes to start at 0 and you wanted all series to not show markers, you could do:

      optionsObj = {axesDefaults:{min:0}, seriesDefaults:{showMarker:false}}

      Another shortcut is for the plot title.  Normally, you would assign options to the title as an object.  If you specify a title option as a string, it will assign that to the title.text property automatically.  So these two are equivalent:

      optionsObj = {title:{text:"My Plot"}}

      and

      optionsObj = {title:"My Plot"}

      Where things need more explaination is with renderers, plugins and their options.  Briefly, what’s renderer, what’s a plugin.

      A renderer is an object that is used to draw something and gets attached to an existing object in the plot in order to draw it.  A plugin does more than just provide drawing functionality to an object.  It will do more like calculate a trend line, change the cursor, provide event driven functionality, etc.  I consider renderers plugins, but plugins don’t have to be renderers.

      So, how do you use renderers, plugins, and specify their options?  Some common renderes are for bar charts and category axes.  If you want to render your series as a bar chart with each set of bars showing up in a category on the x axis, you do:

      optionsObj = {
      -   seriesDefaults:{renderer:$.jqplot.BarRenderer},
      -   axes:{xaxis:{renderer:$.jqplot.CategoryAxisRenderer}}
      -}

      This replaces the default renderer used for all series in the plot with a bar renderer and the x axis default renderer (but not any other axis) with a category renderer.

      Now, how would I assign options to those renderers?  The renderer’s attributes may not be present in the pre-existing jqPlot object, they may be specific to the renderer.  This is done through the “rendererOptions” option on the appropriate object.  So, if I wanted my bars to be 25 pixels wide, I would do:

      optionsObj = {
      -   seriesDefaults:{
      -       renderer:$.jqplot.BarRenderer},
      -       rendererOptions:{
      -           barWidth:25
      -       },
      -   axes:{xaxis:{renderer:$.jqplot.CategoryAxisRenderer}}
      -}

      Again, this is using the “seriesDefaults” option, which will apply options to all series in the plot.  You could do the same on any particular series in the plot through the “series” options array.

      Plugins are free to add their own options.  For example, the highlighter plugin has it’s own set of options that are unique to it.  As a result, it responds to options placed in the “highlighter” attribute of your options object.  So, if I wanted to change the highlighter tooltip to fade in and out slowly and be positioned directly above the point I’m highlighting:

      optionsObj = {
      -    highlighter:{tooltipFadeSpeed:'slow', tooltipLocation:'n'}
      -}

      Other plugins, like dragable and trendlines, add their options in with the series.  This is because both of those plugins can have different options for different series in the plot.  So, if you wanted to specify the color of the dragable and constrain it to drag only on the x axis as well as specify the color of the trend line you could do:

      series:[{
      -    dragable: {
      -        color: '#ff3366',
      -        constrainTo: 'x'
      -    },
      -    trendline: {
      -        color: '#cccccc'
      -    }
      -}]

      This would apply those options to the first series only.  If you had 2 series and wanted to turn off dragging and trend lines on the second series, you could do:

      series:[{
      -    dragable: {
      -        color: '#ff3366',
      -        constrainTo: 'x'
      -    },
      -    trendline: {
      -        color: '#cccccc'
      -    }
      -}, {
      -   isDragable: false,
      -   trendline:{
      -       show: false
      -   }
      -}]

      Note, series dragability is turned off with the “isDragable” option directly on the series itself, not with a suboption of “dragable”.  This may be improved in the future.

      I hope this is helpful.  A few key points to remember:

      • When you see “this” in the api docs, you generally replace it with the name of the object (in lowercase) you are looking at in your options object.
      • seriesDefaults and axesDefaults are convenient shortcuts.
      • to assign options to a renderer, generally use the “rendererOptions”
      • plugins may add their own options attribute, like “highlighter” or “cursor”.

      ** Note: you can set attributes after the plot is created (like plot.grid.shadow = false), but you’ll have to issue the appropriate calls to possibly reinitialize and redraw the plot.  jqPlot can definitely handle this to change the plot after creation (this is how the dragable plugin updates the plot data and the trend line plugin recomputes itself when data changes).  This hasn’t been documented yet, however.

      - -
      - - - - - - - - - - -
      This document is out of date.
      - - - - - - - - \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/docs/files/plugins/jqplot-BezierCurveRenderer-js.html b/libreplan-webapp/src/main/webapp/jqplot/docs/files/plugins/jqplot-BezierCurveRenderer-js.html deleted file mode 100644 index 3ece1db9a..000000000 --- a/libreplan-webapp/src/main/webapp/jqplot/docs/files/plugins/jqplot-BezierCurveRenderer-js.html +++ /dev/null @@ -1,45 +0,0 @@ - - -$.jqplot.BezierCurveRenderer.js - - - - - - - - - -

      Renderer which draws lines as stacked bezier curves.  Data for the line will not be specified as an array of [x, y] data point values, but as a an array of [start piont, bezier curve] So, the line is specified as: [[xstart, ystart], [cp1x, cp1y, cp2x, cp2y, xend, yend]].

      Summary
      $.jqplot.BezierCurveRenderer.jsRenderer which draws lines as stacked bezier curves.
      Functions
      setGridDataconverts the user data values to grid coordinates and stores them in the gridData array.
      makeGridDataconverts any arbitrary data values to grid coordinates and returns them.
      - -

      Functions

      - -

      setGridData

      $.jqplot.BezierCurveRenderer.prototype.setGridData = function(plot)

      converts the user data values to grid coordinates and stores them in the gridData array.  Called with scope of a series.

      - -

      makeGridData

      $.jqplot.BezierCurveRenderer.prototype.makeGridData = function(data,
      plot)

      converts any arbitrary data values to grid coordinates and returns them.  This method exists so that plugins can use a series’ linerenderer to generate grid data points without overwriting the grid data associated with that series.  Called with scope of a series.

      - -
      - - - - - - - - - - -
      $.jqplot.BezierCurveRenderer.prototype.setGridData = function(plot)
      converts the user data values to grid coordinates and stores them in the gridData array.
      $.jqplot.BezierCurveRenderer.prototype.makeGridData = function(data,
      plot)
      converts any arbitrary data values to grid coordinates and returns them.
      - - - - - - - - \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/docs/files/plugins/jqplot-barRenderer-js.html b/libreplan-webapp/src/main/webapp/jqplot/docs/files/plugins/jqplot-barRenderer-js.html deleted file mode 100644 index a0828dd12..000000000 --- a/libreplan-webapp/src/main/webapp/jqplot/docs/files/plugins/jqplot-barRenderer-js.html +++ /dev/null @@ -1,69 +0,0 @@ - - -$.jqplot.BarRenderer - - - - - - - - - -

      A plugin renderer for jqPlot to draw a bar plot.  Draws series as a line.

      Summary
      $.jqplot.BarRendererA plugin renderer for jqPlot to draw a bar plot.
      Properties
      barPaddingNumber of pixels between adjacent bars at the same axis value.
      barMarginNumber of pixels between groups of bars at adjacent axis values.
      barDirection‘vertical’ = up and down bars, ‘horizontal’ = side to side bars
      barWidthWidth of the bar in pixels (auto by devaul).
      shadowOffsetoffset of the shadow from the slice and offset of each succesive stroke of the shadow from the last.
      shadowDepthnumber of strokes to apply to the shadow, each stroke offset shadowOffset from the last.
      shadowAlphatransparency of the shadow (0 = transparent, 1 = opaque)
      waterfalltrue to enable waterfall plot.
      groupsgroup bars into this many groups
      varyBarColortrue to color each bar of a series separately rather than have every bar of a given series the same color.
      highlightMouseOverTrue to highlight slice when moused over.
      highlightMouseDownTrue to highlight when a mouse button is pressed over a slice.
      highlightColorsan array of colors to use when highlighting a bar.
      transposedDataNOT IMPLEMENTED YET.
      - -

      Properties

      - -

      barPadding

      this.barPadding = 8

      Number of pixels between adjacent bars at the same axis value.

      - -

      barMargin

      this.barMargin = 10

      Number of pixels between groups of bars at adjacent axis values.

      - -

      barDirection

      this.barDirection = 'vertical'

      ’vertical’ = up and down bars, ‘horizontal’ = side to side bars

      - -

      barWidth

      this.barWidth = null

      Width of the bar in pixels (auto by devaul).  null = calculated automatically.

      - -

      shadowOffset

      this.shadowOffset = 2

      offset of the shadow from the slice and offset of each succesive stroke of the shadow from the last.

      - -

      shadowDepth

      this.shadowDepth = 5

      number of strokes to apply to the shadow, each stroke offset shadowOffset from the last.

      - -

      shadowAlpha

      this.shadowAlpha = 0.08

      transparency of the shadow (0 = transparent, 1 = opaque)

      - -

      waterfall

      this.waterfall = false

      true to enable waterfall plot.

      - -

      groups

      this.groups = 1

      group bars into this many groups

      - -

      varyBarColor

      this.varyBarColor = false

      true to color each bar of a series separately rather than have every bar of a given series the same color.  If used for non-stacked multiple series bar plots, user should specify a separate ‘seriesColors’ array for each series.  Otherwise, each series will set their bars to the same color array.  This option has no Effect for stacked bar charts and is disabled.

      - -

      highlightMouseOver

      this.highlightMouseOver = true

      True to highlight slice when moused over.  This must be false to enable highlightMouseDown to highlight when clicking on a slice.

      - -

      highlightMouseDown

      this.highlightMouseDown = false

      True to highlight when a mouse button is pressed over a slice.  This will be disabled if highlightMouseOver is true.

      - -

      highlightColors

      this.highlightColors = []

      an array of colors to use when highlighting a bar.

      - -

      transposedData

      this.transposedData = true

      NOT IMPLEMENTED YET.  True if this is a horizontal bar plot and x and y values are “transposed”.  Tranposed, or “swapped”, data is required prior to rev.  894 builds of jqPlot with horizontal bars.  Allows backward compatability of bar renderer horizontal bars with old style data sets.

      - -
      - - - - - - - - - - -
      this.barPadding = 8
      Number of pixels between adjacent bars at the same axis value.
      this.barMargin = 10
      Number of pixels between groups of bars at adjacent axis values.
      this.barDirection = 'vertical'
      ‘vertical’ = up and down bars, ‘horizontal’ = side to side bars
      this.barWidth = null
      Width of the bar in pixels (auto by devaul).
      this.shadowOffset = 2
      offset of the shadow from the slice and offset of each succesive stroke of the shadow from the last.
      this.shadowDepth = 5
      number of strokes to apply to the shadow, each stroke offset shadowOffset from the last.
      this.shadowAlpha = 0.08
      transparency of the shadow (0 = transparent, 1 = opaque)
      this.waterfall = false
      true to enable waterfall plot.
      this.groups = 1
      group bars into this many groups
      this.varyBarColor = false
      true to color each bar of a series separately rather than have every bar of a given series the same color.
      this.highlightMouseOver = true
      True to highlight slice when moused over.
      this.highlightMouseDown = false
      True to highlight when a mouse button is pressed over a slice.
      this.highlightColors = []
      an array of colors to use when highlighting a bar.
      this.transposedData = true
      NOT IMPLEMENTED YET.
      - - - - - - - - \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/docs/files/plugins/jqplot-blockRenderer-js.html b/libreplan-webapp/src/main/webapp/jqplot/docs/files/plugins/jqplot-blockRenderer-js.html deleted file mode 100644 index 0af8dec62..000000000 --- a/libreplan-webapp/src/main/webapp/jqplot/docs/files/plugins/jqplot-blockRenderer-js.html +++ /dev/null @@ -1,53 +0,0 @@ - - -$.jqplot.BlockRenderer - - - - - - - - - -

      Plugin renderer to draw a x-y block chart.  A Block chart has data points displayed as colored squares with a text label inside.  Data must be supplied in the form:

      [[x1, y1, "label 1", {css}], [x2, y2, "label 2", {css}], ...]

      The label and css object are optional.  If the label is ommitted, the box will collapse unless a css height and/or width is specified.

      The css object is an object specifying css properties such as:

      {background:'#4f98a5', border:'3px solid gray', padding:'1px'}

      Note that css properties specified with the data point override defaults specified with the series.

      Summary
      $.jqplot.BlockRendererPlugin renderer to draw a x-y block chart.
      Properties
      cssdefault css styles that will be applied to all data blocks.
      escapeHtmltrue to escape html in the box label.
      insertBreakstrue to turn spaces in data block label into html breaks <br />.
      varyBlockColorstrue to vary the color of each block in this series according to the seriesColors array.
      Methods
      moveBlockMoves an individual block.
      - -

      Properties

      - -

      css

      this.css = {padding:'2px', border:'1px solid #999', textAlign:'center'}

      default css styles that will be applied to all data blocks. these values will be overridden by css styles supplied with the individulal data points.

      - -

      escapeHtml

      this.escapeHtml = false

      true to escape html in the box label.

      - -

      insertBreaks

      this.insertBreaks = true

      true to turn spaces in data block label into html breaks <br />.

      - -

      varyBlockColors

      this.varyBlockColors = false

      true to vary the color of each block in this series according to the seriesColors array.  False to set each block to the color specified on this series.  This has no effect if a css background color option is specified in the renderer css options.

      - -

      Methods

      - -

      moveBlock

      this.moveBlock = function (idx,
      x,
      y,
      duration)

      Moves an individual block.  More efficient than redrawing the whole series by calling plot.drawSeries().  Properties: idx - the 0 based index of the block or point in this series. x - the x coordinate in data units (value on x axis) to move the block to. y - the y coordinate in data units (value on the y axis) to move the block to. duration - optional parameter to create an animated movement.  Can be a number (higher is slower animation) or ‘fast’, ‘normal’ or ‘slow’.  If not provided, the element is moved without any animation.

      - -
      - - - - - - - - - - -
      this.css = {padding:'2px', border:'1px solid #999', textAlign:'center'}
      default css styles that will be applied to all data blocks.
      this.escapeHtml = false
      true to escape html in the box label.
      this.insertBreaks = true
      true to turn spaces in data block label into html breaks br /.
      this.varyBlockColors = false
      true to vary the color of each block in this series according to the seriesColors array.
      this.moveBlock = function (idx,
      x,
      y,
      duration)
      Moves an individual block.
      - - - - - - - - \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/docs/files/plugins/jqplot-bubbleRenderer-js.html b/libreplan-webapp/src/main/webapp/jqplot/docs/files/plugins/jqplot-bubbleRenderer-js.html deleted file mode 100644 index d69711b4e..000000000 --- a/libreplan-webapp/src/main/webapp/jqplot/docs/files/plugins/jqplot-bubbleRenderer-js.html +++ /dev/null @@ -1,71 +0,0 @@ - - -$.jqplot.BubbleRenderer - - - - - - - - - -

      Plugin renderer to draw a bubble chart.  A Bubble chart has data points displayed as colored circles with an optional text label inside.  To use the bubble renderer, you must include the bubble renderer like:

      <script language="javascript" type="text/javascript" src="../src/plugins/jqplot.bubbleRenderer.js"></script>

      Data must be supplied in the form:

      [[x1, y1, r1, <label or {label:'text', color:color}>], ...]

      where the label or options object is optional.

      Note that all bubble colors will be the same unless the “varyBubbleColors” option is set to true.  Colors can be specified in the data array or in the seriesColors array option on the series.  If no colors are defined, the default jqPlot series of 16 colors are used.  Colors are automatically cycled around again if there are more bubbles than colors.

      Bubbles are autoscaled by default to fit within the chart area while maintaining relative sizes.  If the “autoscaleBubbles” option is set to false, the r(adius) values in the data array a treated as literal pixel values for the radii of the bubbles.

      Properties are passed into the bubble renderer in the rendererOptions object of the series options like:

      seriesDefaults: {
      -    renderer: $.jqplot.BubbleRenderer,
      -    rendererOptions: {
      -        bubbleAlpha: 0.7,
      -        varyBubbleColors: false
      -    }
      -}
      Summary
      $.jqplot.BubbleRendererPlugin renderer to draw a bubble chart.
      Properties
      varyBubbleColorsTrue to vary the color of each bubble in this series according to the seriesColors array.
      autoscaleBubblesTrue to scale the bubble radius based on plot size.
      autoscaleMultiplierMultiplier the bubble size if autoscaleBubbles is true.
      autoscalePointsFactorFactor which decreases bubble size based on how many bubbles on on the chart.
      escapeHtmlTrue to escape html in bubble label text.
      highlightMouseOverTrue to highlight bubbles when moused over.
      highlightMouseDownTrue to highlight when a mouse button is pressed over a bubble.
      highlightColorsAn array of colors to use when highlighting a slice.
      bubbleAlphaAlpha transparency to apply to all bubbles in this series.
      highlightAlphaAlpha transparency to apply when highlighting bubble.
      bubbleGradientsTrue to color the bubbles with gradient fills instead of flat colors.
      showLabelsTrue to show labels on bubbles (if any), false to not show.
      - -

      Properties

      - -

      varyBubbleColors

      this.varyBubbleColors = true

      True to vary the color of each bubble in this series according to the seriesColors array.  False to set each bubble to the color specified on this series.  This has no effect if a css background color option is specified in the renderer css options.

      - -

      autoscaleBubbles

      this.autoscaleBubbles = true

      True to scale the bubble radius based on plot size.  False will use the radius value as provided as a raw pixel value for bubble radius.

      - -

      autoscaleMultiplier

      this.autoscaleMultiplier = 1.0

      Multiplier the bubble size if autoscaleBubbles is true.

      - -

      autoscalePointsFactor

      this.autoscalePointsFactor = -0.07

      Factor which decreases bubble size based on how many bubbles on on the chart.  0 means no adjustment for number of bubbles.  Negative values will decrease size of bubbles as more bubbles are added.  Values between 0 and -0.2 should work well.

      - -

      escapeHtml

      this.escapeHtml = true

      True to escape html in bubble label text.

      - -

      highlightMouseOver

      this.highlightMouseOver = true

      True to highlight bubbles when moused over.  This must be false to enable highlightMouseDown to highlight when clicking on a slice.

      - -

      highlightMouseDown

      this.highlightMouseDown = false

      True to highlight when a mouse button is pressed over a bubble.  This will be disabled if highlightMouseOver is true.

      - -

      highlightColors

      this.highlightColors = []

      An array of colors to use when highlighting a slice.  Calculated automatically if not supplied.

      - -

      bubbleAlpha

      this.bubbleAlpha = 1.0

      Alpha transparency to apply to all bubbles in this series.

      - -

      highlightAlpha

      this.highlightAlpha = null

      Alpha transparency to apply when highlighting bubble.  Set to value of bubbleAlpha by default.

      - -

      bubbleGradients

      this.bubbleGradients = false

      True to color the bubbles with gradient fills instead of flat colors.  NOT AVAILABLE IN IE due to lack of excanvas support for radial gradient fills. will be ignored in IE.

      - -

      showLabels

      this.showLabels = true

      True to show labels on bubbles (if any), false to not show.

      - -
      - - - - - - - - - - -
      this.varyBubbleColors = true
      True to vary the color of each bubble in this series according to the seriesColors array.
      this.autoscaleBubbles = true
      True to scale the bubble radius based on plot size.
      this.autoscaleMultiplier = 1.0
      Multiplier the bubble size if autoscaleBubbles is true.
      this.autoscalePointsFactor = -0.07
      Factor which decreases bubble size based on how many bubbles on on the chart.
      this.escapeHtml = true
      True to escape html in bubble label text.
      this.highlightMouseOver = true
      True to highlight bubbles when moused over.
      this.highlightMouseDown = false
      True to highlight when a mouse button is pressed over a bubble.
      this.highlightColors = []
      An array of colors to use when highlighting a slice.
      this.bubbleAlpha = 1.0
      Alpha transparency to apply to all bubbles in this series.
      this.highlightAlpha = null
      Alpha transparency to apply when highlighting bubble.
      this.bubbleGradients = false
      True to color the bubbles with gradient fills instead of flat colors.
      this.showLabels = true
      True to show labels on bubbles (if any), false to not show.
      - - - - - - - - \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/docs/files/plugins/jqplot-canvasAxisLabelRenderer-js.html b/libreplan-webapp/src/main/webapp/jqplot/docs/files/plugins/jqplot-canvasAxisLabelRenderer-js.html deleted file mode 100644 index 27d4846c6..000000000 --- a/libreplan-webapp/src/main/webapp/jqplot/docs/files/plugins/jqplot-canvasAxisLabelRenderer-js.html +++ /dev/null @@ -1,63 +0,0 @@ - - -$.jqplot.CanvasAxisLabelRenderer - - - - - - - - - -

      Renderer to draw axis labels with a canvas element to support advanced featrues such as rotated text.  This renderer uses a separate rendering engine to draw the text on the canvas.  Two modes of rendering the text are available.  If the browser has native font support for canvas fonts (currently Mozila 3.5 and Safari 4), you can enable text rendering with the canvas fillText method.  You do so by setting the “enableFontSupport” option to true.

      Browsers lacking native font support will have the text drawn on the canvas using the Hershey font metrics.  Even if the “enableFontSupport” option is true non-supporting browsers will still render with the Hershey font.

      Summary
      $.jqplot.CanvasAxisLabelRendererRenderer to draw axis labels with a canvas element to support advanced featrues such as rotated text.
      Properties
      angleangle of text, measured clockwise from x axis.
      showwether or not to show the tick (mark and label).
      showLabelwether or not to show the label.
      labellabel for the axis.
      fontFamilyCSS spec for the font-family css attribute.
      fontSizeCSS spec for font size.
      fontWeight
      fontStretchMultiplier to condense or expand font width.
      textColorcss spec for the color attribute.
      enableFontSupporttrue to turn on native canvas font support in Mozilla 3.5+ and Safari 4+.
      pt2pxPoint to pixel scaling factor, used for computing height of bounding box around a label.
      - -

      Properties

      - -

      angle

      this.angle = 0

      angle of text, measured clockwise from x axis.

      - -

      show

      this.show = true

      wether or not to show the tick (mark and label).

      - -

      showLabel

      this.showLabel = true

      wether or not to show the label.

      - -

      label

      this.label = ''

      label for the axis.

      - -

      fontFamily

      this.fontFamily = '"Trebuchet MS", Arial, Helvetica, sans-serif'

      CSS spec for the font-family css attribute.  Applies only to browsers supporting native font rendering in the canvas tag.  Currently Mozilla 3.5 and Safari 4.

      - -

      fontSize

      this.fontSize = '11pt'

      CSS spec for font size.

      - -

      fontWeight

      this.fontWeight = 'normal'
      CSS spec for fontWeight: normal, bold, bolder, lighter or a number 100900
      - -

      fontStretch

      this.fontStretch = 1.0

      Multiplier to condense or expand font width.  Applies only to browsers which don’t support canvas native font rendering.

      - -

      textColor

      this.textColor = '#666666'

      css spec for the color attribute.

      - -

      enableFontSupport

      this.enableFontSupport = true

      true to turn on native canvas font support in Mozilla 3.5+ and Safari 4+.  If true, label will be drawn with canvas tag native support for fonts.  If false, label will be drawn with Hershey font metrics.

      - -

      pt2px

      this.pt2px = null

      Point to pixel scaling factor, used for computing height of bounding box around a label.  The labels text renderer has a default setting of 1.4, which should be suitable for most fonts.  Leave as null to use default.  If tops of letters appear clipped, increase this.  If bounding box seems too big, decrease.  This is an issue only with the native font renderering capabilities of Mozilla 3.5 and Safari 4 since they do not provide a method to determine the font height.

      - -
      - - - - - - - - - - -
      this.angle = 0
      angle of text, measured clockwise from x axis.
      this.show = true
      wether or not to show the tick (mark and label).
      this.showLabel = true
      wether or not to show the label.
      this.label = ''
      label for the axis.
      this.fontFamily = '"Trebuchet MS", Arial, Helvetica, sans-serif'
      CSS spec for the font-family css attribute.
      this.fontSize = '11pt'
      CSS spec for font size.
      this.fontWeight = 'normal'
      this.fontStretch = 1.0
      Multiplier to condense or expand font width.
      this.textColor = '#666666'
      css spec for the color attribute.
      this.enableFontSupport = true
      true to turn on native canvas font support in Mozilla 3.5+ and Safari 4+.
      this.pt2px = null
      Point to pixel scaling factor, used for computing height of bounding box around a label.
      - - - - - - - - \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/docs/files/plugins/jqplot-canvasAxisTickRenderer-js.html b/libreplan-webapp/src/main/webapp/jqplot/docs/files/plugins/jqplot-canvasAxisTickRenderer-js.html deleted file mode 100644 index f21c49186..000000000 --- a/libreplan-webapp/src/main/webapp/jqplot/docs/files/plugins/jqplot-canvasAxisTickRenderer-js.html +++ /dev/null @@ -1,79 +0,0 @@ - - -$.jqplot.CanvasAxisTickRenderer - - - - - - - - - -

      Renderer to draw axis ticks with a canvas element to support advanced featrues such as rotated text.  This renderer uses a separate rendering engine to draw the text on the canvas.  Two modes of rendering the text are available.  If the browser has native font support for canvas fonts (currently Mozila 3.5 and Safari 4), you can enable text rendering with the canvas fillText method.  You do so by setting the “enableFontSupport” option to true.

      Browsers lacking native font support will have the text drawn on the canvas using the Hershey font metrics.  Even if the “enableFontSupport” option is true non-supporting browsers will still render with the Hershey font.

      Summary
      $.jqplot.CanvasAxisTickRendererRenderer to draw axis ticks with a canvas element to support advanced featrues such as rotated text.
      Properties
      marktick mark on the axis.
      showMarkwether or not to show the mark on the axis.
      showGridlinewether or not to draw the gridline on the grid at this tick.
      isMinorTickif this is a minor tick.
      angleangle of text, measured clockwise from x axis.
      markSizeLength of the tick marks in pixels.
      showwether or not to show the tick (mark and label).
      showLabelwether or not to show the label.
      labelPosition‘auto’, ‘start’, ‘middle’ or ‘end’.
      formatterA class of a formatter for the tick text.
      formatStringstring passed to the formatter.
      prefixString to prepend to the tick label.
      fontFamilycss spec for the font-family css attribute.
      fontSizeCSS spec for font size.
      fontWeightCSS spec for fontWeight
      fontStretchMultiplier to condense or expand font width.
      textColorcss spec for the color attribute.
      enableFontSupporttrue to turn on native canvas font support in Mozilla 3.5+ and Safari 4+.
      pt2pxPoint to pixel scaling factor, used for computing height of bounding box around a label.
      - -

      Properties

      - -

      mark

      this.mark = 'outside'

      tick mark on the axis.  One of ‘inside’, ‘outside’, ‘cross’, ‘’ or null.

      - -

      showMark

      this.showMark = true

      wether or not to show the mark on the axis.

      - -

      showGridline

      this.showGridline = true

      wether or not to draw the gridline on the grid at this tick.

      - -

      isMinorTick

      this.isMinorTick = false

      if this is a minor tick.

      - -

      angle

      this.angle = 0

      angle of text, measured clockwise from x axis.

      - -

      markSize

      this.markSize = 4

      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

      this.show = true

      wether or not to show the tick (mark and label).

      - -

      showLabel

      this.showLabel = true

      wether or not to show the label.

      - -

      labelPosition

      this.labelPosition = 'auto'

      ’auto’, ‘start’, ‘middle’ or ‘end’.  Whether tick label should be positioned so the start, middle, or end of the tick mark.

      - -

      formatter

      this.formatter = $.jqplot.DefaultTickFormatter

      A class of a formatter for the tick text.  The default $.jqplot.DefaultTickFormatter uses sprintf.

      - -

      formatString

      this.formatString = ''

      string passed to the formatter.

      - -

      prefix

      this.prefix = ''

      String to prepend to the tick label.  Prefix is prepended to the formatted tick label.

      - -

      fontFamily

      this.fontFamily = '"Trebuchet MS", Arial, Helvetica, sans-serif'

      css spec for the font-family css attribute.

      - -

      fontSize

      this.fontSize = '10pt'

      CSS spec for font size.

      - -

      fontWeight

      this.fontWeight = 'normal'

      CSS spec for fontWeight

      - -

      fontStretch

      this.fontStretch = 1.0

      Multiplier to condense or expand font width.  Applies only to browsers which don’t support canvas native font rendering.

      - -

      textColor

      this.textColor = '#666666'

      css spec for the color attribute.

      - -

      enableFontSupport

      this.enableFontSupport = true

      true to turn on native canvas font support in Mozilla 3.5+ and Safari 4+.  If true, tick label will be drawn with canvas tag native support for fonts.  If false, tick label will be drawn with Hershey font metrics.

      - -

      pt2px

      this.pt2px = null

      Point to pixel scaling factor, used for computing height of bounding box around a label.  The labels text renderer has a default setting of 1.4, which should be suitable for most fonts.  Leave as null to use default.  If tops of letters appear clipped, increase this.  If bounding box seems too big, decrease.  This is an issue only with the native font renderering capabilities of Mozilla 3.5 and Safari 4 since they do not provide a method to determine the font height.

      - -
      - - - - - - - - - - -
      this.mark = 'outside'
      tick mark on the axis.
      this.showMark = true
      wether or not to show the mark on the axis.
      this.showGridline = true
      wether or not to draw the gridline on the grid at this tick.
      this.isMinorTick = false
      if this is a minor tick.
      this.angle = 0
      angle of text, measured clockwise from x axis.
      this.markSize = 4
      Length of the tick marks in pixels.
      this.show = true
      wether or not to show the tick (mark and label).
      this.showLabel = true
      wether or not to show the label.
      this.labelPosition = 'auto'
      ‘auto’, ‘start’, ‘middle’ or ‘end’.
      this.formatter = $.jqplot.DefaultTickFormatter
      A class of a formatter for the tick text.
      this.formatString = ''
      string passed to the formatter.
      this.prefix = ''
      String to prepend to the tick label.
      this.fontFamily = '"Trebuchet MS", Arial, Helvetica, sans-serif'
      css spec for the font-family css attribute.
      this.fontSize = '10pt'
      CSS spec for font size.
      this.fontWeight = 'normal'
      CSS spec for fontWeight
      this.fontStretch = 1.0
      Multiplier to condense or expand font width.
      this.textColor = '#666666'
      css spec for the color attribute.
      this.enableFontSupport = true
      true to turn on native canvas font support in Mozilla 3.5+ and Safari 4+.
      this.pt2px = null
      Point to pixel scaling factor, used for computing height of bounding box around a label.
      - - - - - - - - \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/docs/files/plugins/jqplot-canvasOverlay-js.html b/libreplan-webapp/src/main/webapp/jqplot/docs/files/plugins/jqplot-canvasOverlay-js.html deleted file mode 100644 index e77c4c81c..000000000 --- a/libreplan-webapp/src/main/webapp/jqplot/docs/files/plugins/jqplot-canvasOverlay-js.html +++ /dev/null @@ -1,113 +0,0 @@ - - -$.jqplot.CanvasOverlay - - - - - - - - - -
      Summary
      $.jqplot.CanvasOverlay
      Properties
      objects
      nameOptional name for the overlay object.
      showtrue to show (draw), false to not draw.
      lineWidthWidth of the line.
      lineCapType of ending placed on the line [‘round’, ‘butt’, ‘square’]
      colorcolor of the line
      shadowwether or not to draw a shadow on the line
      shadowAngleShadow angle in degrees
      shadowOffsetShadow offset from line in pixels
      shadowDepthNumber of times shadow is stroked, each stroke offset shadowOffset from the last.
      shadowAlphaAlpha channel transparency of shadow.
      xaxisX axis to use for positioning/scaling the line.
      yaxisY axis to use for positioning/scaling the line.
      showTooltipShow a tooltip with data point values.
      showTooltipPrecisionControls how close to line cursor must be to show tooltip.
      tooltipLocationWhere to position tooltip, ‘n’, ‘ne’, ‘e’, ‘se’, ‘s’, ‘sw’, ‘w’, ‘nw’
      fadeTooltiptrue = fade in/out tooltip, flase = show/hide tooltip
      tooltipFadeSpeed‘slow’, ‘def’, ‘fast’, or number of milliseconds.
      tooltipOffsetPixel offset of tooltip from the highlight.
      tooltipFormatStringFormat string passed the x and y values of the cursor on the line.
      LineA straight line.
      Properties
      start[x, y] coordinates for the start of the line.
      stop[x, y] coordinates for the end of the line.
      HorizontalLineA straight horizontal line.
      Properties
      yy value to position the line
      xminx value for the start of the line, null to scale to axis min.
      xmaxx value for the end of the line, null to scale to axis max.
      DashedHorizontalLineA straight dashed horizontal line.
      Properties
      dashPatternArray of line, space settings in pixels.
      VerticalLineA straight vertical line.
      DashedVerticalLineA straight dashed vertical line.
      Properties
      dashPatternArray of line, space settings in pixels.
      - -

      Properties

      - -

      objects

      this.objects = []
      - -

      name

      Optional name for the overlay object.  Can be later used to retrieve the object by name.

      - -

      show

      true to show (draw), false to not draw.

      - -

      lineWidth

      Width of the line.

      - -

      lineCap

      Type of ending placed on the line [‘round’, ‘butt’, ‘square’]

      - -

      color

      color of the line

      - -

      shadow

      wether or not to draw a shadow on the line

      - -

      shadowAngle

      Shadow angle in degrees

      - -

      shadowOffset

      Shadow offset from line in pixels

      - -

      shadowDepth

      Number of times shadow is stroked, each stroke offset shadowOffset from the last.

      - -

      shadowAlpha

      Alpha channel transparency of shadow.  0 = transparent.

      - -

      xaxis

      X axis to use for positioning/scaling the line.

      - -

      yaxis

      Y axis to use for positioning/scaling the line.

      - -

      showTooltip

      Show a tooltip with data point values.

      - -

      showTooltipPrecision

      Controls how close to line cursor must be to show tooltip.  Higher number = closer to line, lower number = farther from line.  1.0 = cursor must be over line.

      - -

      tooltipLocation

      Where to position tooltip, ‘n’, ‘ne’, ‘e’, ‘se’, ‘s’, ‘sw’, ‘w’, ‘nw’

      - -

      fadeTooltip

      true = fade in/out tooltip, flase = show/hide tooltip

      - -

      tooltipFadeSpeed

      ’slow’, ‘def’, ‘fast’, or number of milliseconds.

      - -

      tooltipOffset

      Pixel offset of tooltip from the highlight.

      - -

      tooltipFormatString

      tooltipFormatString: '%d, %d' }

      Format string passed the x and y values of the cursor on the line. e.g., ‘Dogs: %.2f, Cats: %d’.

      - -

      Line

      A straight line.

      Summary
      Properties
      start[x, y] coordinates for the start of the line.
      stop[x, y] coordinates for the end of the line.
      - -

      Properties

      - -

      start

      [x, y] coordinates for the start of the line.

      - -

      stop

      stop: [] }

      [x, y] coordinates for the end of the line.

      - -

      HorizontalLine

      A straight horizontal line.

      Summary
      Properties
      yy value to position the line
      xminx value for the start of the line, null to scale to axis min.
      xmaxx value for the end of the line, null to scale to axis max.
      - -

      Properties

      - -

      y

      y value to position the line

      - -

      xmin

      x value for the start of the line, null to scale to axis min.

      - -

      xmax

      x value for the end of the line, null to scale to axis max.

      - -

      DashedHorizontalLine

      A straight dashed horizontal line.

      Summary
      Properties
      dashPatternArray of line, space settings in pixels.
      - -

      Properties

      - -

      dashPattern

      dashPattern: [8,8] }

      Array of line, space settings in pixels.  Default is 8 pixel of line, 8 pixel of space.  Note, limit to a 2 element array b/c of bug with higher order arrays.

      - -

      VerticalLine

      A straight vertical line.

      - -

      DashedVerticalLine

      A straight dashed vertical line.

      Summary
      Properties
      dashPatternArray of line, space settings in pixels.
      - -

      Properties

      - -

      dashPattern

      dashPattern: [8,8] }

      Array of line, space settings in pixels.  Default is 8 pixel of line, 8 pixel of space.  Note, limit to a 2 element array b/c of bug with higher order arrays.

      - -
      - - - - - - - - - - -
      this.objects = []
      tooltipFormatString: '%d, %d' }
      Format string passed the x and y values of the cursor on the line.
      stop: [] }
      [x, y] coordinates for the end of the line.
      dashPattern: [8,8] }
      Array of line, space settings in pixels.
      dashPattern: [8,8] }
      Array of line, space settings in pixels.
      - - - - - - - - \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/docs/files/plugins/jqplot-categoryAxisRenderer-js.html b/libreplan-webapp/src/main/webapp/jqplot/docs/files/plugins/jqplot-categoryAxisRenderer-js.html deleted file mode 100644 index 1076a7a1d..000000000 --- a/libreplan-webapp/src/main/webapp/jqplot/docs/files/plugins/jqplot-categoryAxisRenderer-js.html +++ /dev/null @@ -1,46 +0,0 @@ - - -$.jqplot.CategoryAxisRenderer - - - - - - - - - -

      A plugin for jqPlot to render a category style axis, with equal pixel spacing between y data values of a series.

      To use this renderer, include the plugin in your source

      <script type="text/javascript" language="javascript" src="plugins/jqplot.categoryAxisRenderer.js"></script>

      and supply the appropriate options to your plot

      {axes:{xaxis:{renderer:$.jqplot.CategoryAxisRenderer}}}
      Summary
      $.jqplot.CategoryAxisRendererA plugin for jqPlot to render a category style axis, with equal pixel spacing between y data values of a series.
      Properties
      sortMergedLabelsTrue to sort tick labels when labels are created by merging x axis values from multiple series.
      tickRendererA class of a rendering engine for creating the ticks labels displayed on the plot, See $.jqplot.AxisTickRenderer.
      - -

      Properties

      - -

      sortMergedLabels

      this.sortMergedLabels = false

      True to sort tick labels when labels are created by merging x axis values from multiple series.  That is, say you have two series like:

      line1 = [[2006, 4],            [2008, 9], [2009, 16]];
      -line2 = [[2006, 3], [2007, 7], [2008, 6]];

      If no label array is specified, tick labels will be collected from the x values of the series.  With sortMergedLabels set to true, tick labels will be:

      [2006, 2007, 2008, 2009]

      With sortMergedLabels set to false, tick labels will be:

      [2006, 2008, 2009, 2007]

      Note, this property is specified on the renderOptions for the axes when creating a plot:

      axes:{xaxis:{renderer:$.jqplot.CategoryAxisRenderer, rendererOptions:{sortMergedLabels:true}}}
      - -

      tickRenderer

      A class of a rendering engine for creating the ticks labels displayed on the plot, See $.jqplot.AxisTickRenderer. this.tickRenderer = $.jqplot.AxisTickRenderer; this.labelRenderer = $.jqplot.AxisLabelRenderer;

      - -
      - - - - - - - - - - -
      this.sortMergedLabels = false
      True to sort tick labels when labels are created by merging x axis values from multiple series.
      A “tick” object showing the value of a tick/gridline on the plot.
      - - - - - - - - \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/docs/files/plugins/jqplot-ciParser-js.html b/libreplan-webapp/src/main/webapp/jqplot/docs/files/plugins/jqplot-ciParser-js.html deleted file mode 100644 index 0e08b3b6b..000000000 --- a/libreplan-webapp/src/main/webapp/jqplot/docs/files/plugins/jqplot-ciParser-js.html +++ /dev/null @@ -1,39 +0,0 @@ - - -$.jqplot.ciParser - - - - - - - - - -

      Data Renderer function which converts a custom JSON data object into jqPlot data format.  Set this as a callable on the jqplot dataRenderer plot option:

      plot = $.jqplot('mychart', [data], { dataRenderer: $.jqplot.ciParser, ... });

      Where data is an object in JSON format or a JSON encoded string conforming to the City Index API spec.

      Note that calling the renderer function is handled internally by jqPlot.  The user does not have to call the function.  The parameters described below will automatically be passed to the ciParser function.

      Parameters

      dataJSON encoded string or object.
      plotreference to jqPlot Plot object.

      Returns

      data array in jqPlot format.

      - -
      - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/docs/files/plugins/jqplot-cursor-js.html b/libreplan-webapp/src/main/webapp/jqplot/docs/files/plugins/jqplot-cursor-js.html deleted file mode 100644 index e118c3d36..000000000 --- a/libreplan-webapp/src/main/webapp/jqplot/docs/files/plugins/jqplot-cursor-js.html +++ /dev/null @@ -1,93 +0,0 @@ - - -$.jqplot.Cursor - - - - - - - - - -

      Plugin class representing the cursor as displayed on the plot.

      Summary
      $.jqplot.CursorPlugin class representing the cursor as displayed on the plot.
      Properties
      styleCSS spec for cursor style
      showwether to show the cursor or not.
      showTooltipshow a cursor position tooltip.
      followMouseTooltip follows the mouse, it is not at a fixed location.
      tooltipLocationWhere to position tooltip.
      tooltipOffsetPixel offset of tooltip from the grid boudaries or cursor center.
      showTooltipGridPositionshow the grid pixel coordinates of the mouse.
      showTooltipUnitPositionshow the unit (data) coordinates of the mouse.
      showTooltipDataPositionUsed with showVerticalLine to show intersecting data points in the tooltip.
      tooltipFormatStringsprintf format string for the tooltip.
      useAxesFormattersUse the x and y axes formatters to format the text in the tooltip.
      tooltipAxisGroupsShow position for the specified axes.
      zoomEnable plot zooming.
      looseZoomWill expand zoom range to provide more rounded tick values.
      clickResetWill reset plot zoom if single click on plot without drag.
      dblClickResetWill reset plot zoom if double click on plot without drag.
      showVerticalLinedraw a vertical line across the plot which follows the cursor.
      showHorizontalLinedraw a horizontal line across the plot which follows the cursor.
      constrainZoomTo‘none’, ‘x’ or ‘y’
      intersectionThresholdpixel distance from data point or marker to consider cursor lines intersecting with point.
      showCursorLegendReplace the plot legend with an enhanced legend displaying intersection information.
      cursorLegendFormatStringFormat string used in the cursor legend.
      constrainOutsideZoomTrue to limit actual zoom area to edges of grid, even when zooming outside of plot area.
      showTooltipOutsideZoomTrue will keep updating the tooltip when zooming of the grid.
      methods
      $.jqplot.Cursor.zoomProxylinks targetPlot to controllerPlot so that plot zooming of targetPlot will be controlled by zooming on the controllerPlot.
      - -

      Properties

      - -

      style

      this.style = 'crosshair'

      CSS spec for cursor style

      - -

      show

      this.show = $.jqplot.config.enablePlugins

      wether to show the cursor or not.

      - -

      showTooltip

      this.showTooltip = true

      show a cursor position tooltip.  Location of the tooltip will be controlled by followMouse and tooltipLocation.

      - -

      followMouse

      this.followMouse = false

      Tooltip follows the mouse, it is not at a fixed location.  Tooltip will show on the grid at the location given by tooltipLocation, offset from the grid edge by tooltipOffset.

      - -

      tooltipLocation

      this.tooltipLocation = 'se'

      Where to position tooltip.  If followMouse is true, this is relative to the cursor, otherwise, it is relative to the grid.  One of ‘n’, ‘ne’, ‘e’, ‘se’, ‘s’, ‘sw’, ‘w’, ‘nw’

      - -

      tooltipOffset

      this.tooltipOffset = 6

      Pixel offset of tooltip from the grid boudaries or cursor center.

      - -

      showTooltipGridPosition

      this.showTooltipGridPosition = false

      show the grid pixel coordinates of the mouse.

      - -

      showTooltipUnitPosition

      this.showTooltipUnitPosition = true

      show the unit (data) coordinates of the mouse.

      - -

      showTooltipDataPosition

      this.showTooltipDataPosition = false

      Used with showVerticalLine to show intersecting data points in the tooltip.

      - -

      tooltipFormatString

      this.tooltipFormatString = '%.4P, %.4P'

      sprintf format string for the tooltip.  Uses Ash Searle’s javascript sprintf implementation found here: http://hexmen.com/blog/2007/03/printf-sprintf/ See http://perldoc.perl.org/functions/sprintf.html for reference Note, if showTooltipDataPosition is true, the default tooltipFormatString will be set to the cursorLegendFormatString, not the default given here.

      - -

      useAxesFormatters

      this.useAxesFormatters = true

      Use the x and y axes formatters to format the text in the tooltip.

      - -

      tooltipAxisGroups

      this.tooltipAxisGroups = []

      Show position for the specified axes.  This is an array like [[‘xaxis’, ‘yaxis’], [‘xaxis’, ‘y2axis’]] Default is to compute automatically for all visible axes.

      - -

      zoom

      this.zoom = false

      Enable plot zooming.

      - -

      looseZoom

      this.looseZoom = true

      Will expand zoom range to provide more rounded tick values.  Works only with linear, log and date axes.

      - -

      clickReset

      this.clickReset = false

      Will reset plot zoom if single click on plot without drag.

      - -

      dblClickReset

      this.dblClickReset = true

      Will reset plot zoom if double click on plot without drag.

      - -

      showVerticalLine

      this.showVerticalLine = false

      draw a vertical line across the plot which follows the cursor.  When the line is near a data point, a special legend and/or tooltip can be updated with the data values.

      - -

      showHorizontalLine

      this.showHorizontalLine = false

      draw a horizontal line across the plot which follows the cursor.

      - -

      constrainZoomTo

      this.constrainZoomTo = 'none'

      ’none’, ‘x’ or ‘y’

      - -

      intersectionThreshold

      this.intersectionThreshold = 2

      pixel distance from data point or marker to consider cursor lines intersecting with point.  If data point markers are not shown, this should be >= 1 or will often miss point intersections.

      - -

      showCursorLegend

      this.showCursorLegend = false

      Replace the plot legend with an enhanced legend displaying intersection information.

      - -

      cursorLegendFormatString

      this.cursorLegendFormatString = $.jqplot.Cursor.cursorLegendFormatString

      Format string used in the cursor legend.  If showTooltipDataPosition is true, this will also be the default format string used by tooltipFormatString.

      - -

      constrainOutsideZoom

      this.constrainOutsideZoom = true

      True to limit actual zoom area to edges of grid, even when zooming outside of plot area.  That is, can’t zoom out by mousing outside plot.

      - -

      showTooltipOutsideZoom

      this.showTooltipOutsideZoom = false

      True will keep updating the tooltip when zooming of the grid.

      - -

      methods

      - -

      $.jqplot.Cursor.zoomProxy

      $.jqplot.Cursor.zoomProxy = function(targetPlot,
      controllerPlot)

      links targetPlot to controllerPlot so that plot zooming of targetPlot will be controlled by zooming on the controllerPlot. controllerPlot will not actually zoom, but acts as an overview plot.  Note, the zoom options must be set to true for zoomProxy to work.

      - -
      - - - - - - - - - - -
      this.style = 'crosshair'
      CSS spec for cursor style
      this.show = $.jqplot.config.enablePlugins
      wether to show the cursor or not.
      this.showTooltip = true
      show a cursor position tooltip.
      this.followMouse = false
      Tooltip follows the mouse, it is not at a fixed location.
      this.tooltipLocation = 'se'
      Where to position tooltip.
      this.tooltipOffset = 6
      Pixel offset of tooltip from the grid boudaries or cursor center.
      this.showTooltipGridPosition = false
      show the grid pixel coordinates of the mouse.
      this.showTooltipUnitPosition = true
      show the unit (data) coordinates of the mouse.
      this.showTooltipDataPosition = false
      Used with showVerticalLine to show intersecting data points in the tooltip.
      this.tooltipFormatString = '%.4P, %.4P'
      sprintf format string for the tooltip.
      this.useAxesFormatters = true
      Use the x and y axes formatters to format the text in the tooltip.
      this.tooltipAxisGroups = []
      Show position for the specified axes.
      this.zoom = false
      Enable plot zooming.
      this.looseZoom = true
      Will expand zoom range to provide more rounded tick values.
      this.clickReset = false
      Will reset plot zoom if single click on plot without drag.
      this.dblClickReset = true
      Will reset plot zoom if double click on plot without drag.
      this.showVerticalLine = false
      draw a vertical line across the plot which follows the cursor.
      this.showHorizontalLine = false
      draw a horizontal line across the plot which follows the cursor.
      this.constrainZoomTo = 'none'
      ‘none’, ‘x’ or ‘y’
      this.intersectionThreshold = 2
      pixel distance from data point or marker to consider cursor lines intersecting with point.
      this.showCursorLegend = false
      Replace the plot legend with an enhanced legend displaying intersection information.
      this.cursorLegendFormatString = $.jqplot.Cursor.cursorLegendFormatString
      Format string used in the cursor legend.
      this.constrainOutsideZoom = true
      True to limit actual zoom area to edges of grid, even when zooming outside of plot area.
      this.showTooltipOutsideZoom = false
      True will keep updating the tooltip when zooming of the grid.
      $.jqplot.Cursor.zoomProxy = function(targetPlot,
      controllerPlot)
      links targetPlot to controllerPlot so that plot zooming of targetPlot will be controlled by zooming on the controllerPlot.
      - - - - - - - - \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/docs/files/plugins/jqplot-dateAxisRenderer-js.html b/libreplan-webapp/src/main/webapp/jqplot/docs/files/plugins/jqplot-dateAxisRenderer-js.html deleted file mode 100644 index 814f125aa..000000000 --- a/libreplan-webapp/src/main/webapp/jqplot/docs/files/plugins/jqplot-dateAxisRenderer-js.html +++ /dev/null @@ -1,101 +0,0 @@ - - -$.jqplot.DateAxisRenderer - - - - - - - - - -

      A plugin for a jqPlot to render an axis as a series of date values.  This renderer has no options beyond those supplied by the Axis class.  It supplies it’s own tick formatter, so the tickOptions.formatter option should not be overridden.

      Thanks to Ken Synder for his enhanced Date instance methods which are included with this code http://kendsnyder.com/sandbox/date/.

      To use this renderer, include the plugin in your source

      <script type="text/javascript" language="javascript" src="plugins/jqplot.dateAxisRenderer.js"></script>

      and supply the appropriate options to your plot

      {axes:{xaxis:{renderer:$.jqplot.DateAxisRenderer}}}

      Dates can be passed into the axis in almost any recognizable value and will be parsed.  They will be rendered on the axis in the format specified by tickOptions.formatString.  e.g. tickOptions.formatString = ‘%Y-%m-%d’.

      Accecptable format codes are:

      Code    Result                  Description
      -            == Years ==
      -%Y      2008                Four-digit year
      -%y      08                  Two-digit year
      -            == Months ==
      -%m      09                  Two-digit month
      -%#m     9                   One or two-digit month
      -%B      September           Full month name
      -%b      Sep                 Abbreviated month name
      -            == Days ==
      -%d      05                  Two-digit day of month
      -%#d     5                   One or two-digit day of month
      -%e      5                   One or two-digit day of month
      -%A      Sunday              Full name of the day of the week
      -%a      Sun                 Abbreviated name of the day of the week
      -%w      0                   Number of the day of the week (0 = Sunday, 6 = Saturday)
      -%o      th                  The ordinal suffix string following the day of the month
      -            == Hours ==
      -%H      23                  Hours in 24-hour format (two digits)
      -%#H     3                   Hours in 24-hour integer format (one or two digits)
      -%I      11                  Hours in 12-hour format (two digits)
      -%#I     3                   Hours in 12-hour integer format (one or two digits)
      -%p      PM                  AM or PM
      -            == Minutes ==
      -%M      09                  Minutes (two digits)
      -%#M     9                   Minutes (one or two digits)
      -            == Seconds ==
      -%S      02                  Seconds (two digits)
      -%#S     2                   Seconds (one or two digits)
      -%s      1206567625723       Unix timestamp (Seconds past 1970-01-01 00:00:00)
      -            == Milliseconds ==
      -%N      008                 Milliseconds (three digits)
      -%#N     8                   Milliseconds (one to three digits)
      -            == Timezone ==
      -%O      360                 difference in minutes between local time and GMT
      -%Z      Mountain Standard Time  Name of timezone as reported by browser
      -%G      -06:00              Hours and minutes between GMT
      -            == Shortcuts ==
      -%F      2008-03-26          %Y-%m-%d
      -%T      05:06:30            %H:%M:%S
      -%X      05:06:30            %H:%M:%S
      -%x      03/26/08            %m/%d/%y
      -%D      03/26/08            %m/%d/%y
      -%#c     Wed Mar 26 15:31:00 2008  %a %b %e %H:%M:%S %Y
      -%v      3-Sep-2008          %e-%b-%Y
      -%R      15:31               %H:%M
      -%r      3:31:00 PM          %I:%M:%S %p
      -            == Characters ==
      -%n      \n                  Newline
      -%t      \t                  Tab
      -%%      %                   Percent Symbol
      Summary
      $.jqplot.DateAxisRendererA plugin for a jqPlot to render an axis as a series of date values.
      Properties
      tickRendererA class of a rendering engine for creating the ticks labels displayed on the plot, See $.jqplot.AxisTickRenderer.
      tickInsetControls the amount to inset the first and last ticks from the edges of the grid, in multiples of the tick interval.
      drawBaselineTrue to draw the axis baseline.
      baselineWidthwidth of the baseline in pixels.
      baselineColorCSS color spec for the baseline.
      - -

      Properties

      - -

      tickRenderer

      A class of a rendering engine for creating the ticks labels displayed on the plot, See $.jqplot.AxisTickRenderer. this.tickRenderer = $.jqplot.AxisTickRenderer; this.labelRenderer = $.jqplot.AxisLabelRenderer;

      - -

      tickInset

      this.tickInset = 0

      Controls the amount to inset the first and last ticks from the edges of the grid, in multiples of the tick interval.  0 is no inset, 0.5 is one half a tick interval, 1 is a full tick interval, etc.

      - -

      drawBaseline

      this.drawBaseline = true

      True to draw the axis baseline.

      - -

      baselineWidth

      this.baselineWidth = null

      width of the baseline in pixels.

      - -

      baselineColor

      this.baselineColor = null

      CSS color spec for the baseline.

      - -
      - - - - - - - - - - -
      A “tick” object showing the value of a tick/gridline on the plot.
      this.tickInset = 0
      Controls the amount to inset the first and last ticks from the edges of the grid, in multiples of the tick interval.
      this.drawBaseline = true
      True to draw the axis baseline.
      this.baselineWidth = null
      width of the baseline in pixels.
      this.baselineColor = null
      CSS color spec for the baseline.
      An individual axis object.
      - - - - - - - - \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/docs/files/plugins/jqplot-donutRenderer-js.html b/libreplan-webapp/src/main/webapp/jqplot/docs/files/plugins/jqplot-donutRenderer-js.html deleted file mode 100644 index 32969db74..000000000 --- a/libreplan-webapp/src/main/webapp/jqplot/docs/files/plugins/jqplot-donutRenderer-js.html +++ /dev/null @@ -1,98 +0,0 @@ - - -$.jqplot.DonutRenderer - - - - - - - - - -

      Plugin renderer to draw a donut chart. x values, if present, will be used as slice labels. y values give slice size.

      To use this renderer, you need to include the donut renderer plugin, for example:

      <script type="text/javascript" src="plugins/jqplot.donutRenderer.js"></script>

      Properties described here are passed into the $.jqplot function as options on the series renderer.  For example:

      plot2 = $.jqplot('chart2', [s1, s2], {
      -    seriesDefaults: {
      -        renderer:$.jqplot.DonutRenderer,
      -        rendererOptions:{
      -             sliceMargin: 2,
      -             innerDiameter: 110,
      -             startAngle: -90
      -         }
      -     }
      -});

      A donut plot will trigger events on the plot target according to user interaction.  All events return the event object, the series index, the point (slice) index, and the point data for the appropriate slice.

      ’jqplotDataMouseOver’triggered when user mouseing over a slice.
      ’jqplotDataHighlight’triggered the first time user mouses over a slice, if highlighting is enabled.
      ’jqplotDataUnhighlight’triggered when a user moves the mouse out of a highlighted slice.
      ’jqplotDataClick’triggered when the user clicks on a slice.
      ’jqplotDataRightClick’tiggered when the user right clicks on a slice if the “captureRightClick” option is set to true on the plot.
      Summary
      $.jqplot.DonutRendererPlugin renderer to draw a donut chart.
      Properties
      diameterOuter diameter of the donut, auto computed by default
      innerDiameterInner diameter of the donut, auto calculated by default.
      thicknessthickness of the donut, auto computed by default Overridden by if innerDiameter is specified.
      paddingpadding between the donut and plot edges, legend, etc.
      sliceMarginangular spacing between donut slices in degrees.
      ringMarginpixel distance between rings, or multiple series in a donut plot.
      filltrue or false, wether to fil the slices.
      shadowOffsetoffset of the shadow from the slice and offset of each succesive stroke of the shadow from the last.
      shadowAlphatransparency of the shadow (0 = transparent, 1 = opaque)
      shadowDepthnumber of strokes to apply to the shadow, each stroke offset shadowOffset from the last.
      highlightMouseOverTrue to highlight slice when moused over.
      highlightMouseDownTrue to highlight when a mouse button is pressed over a slice.
      highlightColorsan array of colors to use when highlighting a slice.
      dataLabelsEither ‘label’, ‘value’, ‘percent’ or an array of labels to place on the pie slices.
      showDataLabelstrue to show data labels on slices.
      dataLabelFormatStringFormat string for data labels.
      dataLabelThreshold
      dataLabelPositionFactorA Multiplier (0-1) of the pie radius which controls position of label on slice.
      dataLabelNudgeNumber of pixels to slide the label away from (+) or toward (-) the center of the pie.
      startAngleAngle to start drawing donut in degrees.
      $.jqplot.DonutLegendRendererLegend Renderer specific to donut plots.
      Properties
      numberRowsMaximum number of rows in the legend.
      numberColumnsMaximum number of columns in the legend.
      - -

      Properties

      - -

      diameter

      this.diameter = null

      Outer diameter of the donut, auto computed by default

      - -

      innerDiameter

      this.innerDiameter = null

      Inner diameter of the donut, auto calculated by default.  If specified will override thickness value.

      - -

      thickness

      this.thickness = null

      thickness of the donut, auto computed by default Overridden by if innerDiameter is specified.

      - -

      padding

      this.padding = 20

      padding between the donut and plot edges, legend, etc.

      - -

      sliceMargin

      this.sliceMargin = 0

      angular spacing between donut slices in degrees.

      - -

      ringMargin

      this.ringMargin = null

      pixel distance between rings, or multiple series in a donut plot. null will compute ringMargin based on sliceMargin.

      - -

      fill

      this.fill = true

      true or false, wether to fil the slices.

      - -

      shadowOffset

      this.shadowOffset = 2

      offset of the shadow from the slice and offset of each succesive stroke of the shadow from the last.

      - -

      shadowAlpha

      this.shadowAlpha = 0.07

      transparency of the shadow (0 = transparent, 1 = opaque)

      - -

      shadowDepth

      this.shadowDepth = 5

      number of strokes to apply to the shadow, each stroke offset shadowOffset from the last.

      - -

      highlightMouseOver

      this.highlightMouseOver = true

      True to highlight slice when moused over.  This must be false to enable highlightMouseDown to highlight when clicking on a slice.

      - -

      highlightMouseDown

      this.highlightMouseDown = false

      True to highlight when a mouse button is pressed over a slice.  This will be disabled if highlightMouseOver is true.

      - -

      highlightColors

      this.highlightColors = []

      an array of colors to use when highlighting a slice.

      - -

      dataLabels

      this.dataLabels = 'percent'

      Either ‘label’, ‘value’, ‘percent’ or an array of labels to place on the pie slices.  Defaults to percentage of each pie slice.

      - -

      showDataLabels

      this.showDataLabels = false

      true to show data labels on slices.

      - -

      dataLabelFormatString

      this.dataLabelFormatString = null

      Format string for data labels.  If none, ‘%s’ is used for “label” and for arrays, ‘%d’ for value and ‘%d%%’ for percentage.

      - -

      dataLabelThreshold

      this.dataLabelThreshold = 3
      Threshhold in percentage (0100) of pie area, below which no label will be displayed.  This applies to all label types, not just to percentage labels.
      - -

      dataLabelPositionFactor

      this.dataLabelPositionFactor = 0.4

      A Multiplier (0-1) of the pie radius which controls position of label on slice.  Increasing will slide label toward edge of pie, decreasing will slide label toward center of pie.

      - -

      dataLabelNudge

      this.dataLabelNudge = 0

      Number of pixels to slide the label away from (+) or toward (-) the center of the pie.

      - -

      startAngle

      this.startAngle = 0

      Angle to start drawing donut in degrees.  According to orientation of canvas coordinate system: 0 = on the positive x axis -90 = on the positive y axis.  90 = on the negaive y axis.  180 or - 180 = on the negative x axis.

      - -

      $.jqplot.DonutLegendRenderer

      Legend Renderer specific to donut plots.  Set by default when user creates a donut plot.

      Summary
      Properties
      numberRowsMaximum number of rows in the legend.
      numberColumnsMaximum number of columns in the legend.
      - -

      Properties

      - -

      numberRows

      this.numberRows = null

      Maximum number of rows in the legend.  0 or null for unlimited.

      - -

      numberColumns

      this.numberColumns = null

      Maximum number of columns in the legend.  0 or null for unlimited.

      - -
      - - - - - - - - - - -
      this.diameter = null
      Outer diameter of the donut, auto computed by default
      this.innerDiameter = null
      Inner diameter of the donut, auto calculated by default.
      this.thickness = null
      thickness of the donut, auto computed by default Overridden by if innerDiameter is specified.
      this.padding = 20
      padding between the donut and plot edges, legend, etc.
      this.sliceMargin = 0
      angular spacing between donut slices in degrees.
      this.ringMargin = null
      pixel distance between rings, or multiple series in a donut plot.
      this.fill = true
      true or false, wether to fil the slices.
      this.shadowOffset = 2
      offset of the shadow from the slice and offset of each succesive stroke of the shadow from the last.
      this.shadowAlpha = 0.07
      transparency of the shadow (0 = transparent, 1 = opaque)
      this.shadowDepth = 5
      number of strokes to apply to the shadow, each stroke offset shadowOffset from the last.
      this.highlightMouseOver = true
      True to highlight slice when moused over.
      this.highlightMouseDown = false
      True to highlight when a mouse button is pressed over a slice.
      this.highlightColors = []
      an array of colors to use when highlighting a slice.
      this.dataLabels = 'percent'
      Either ‘label’, ‘value’, ‘percent’ or an array of labels to place on the pie slices.
      this.showDataLabels = false
      true to show data labels on slices.
      this.dataLabelFormatString = null
      Format string for data labels.
      this.dataLabelThreshold = 3
      this.dataLabelPositionFactor = 0.4
      A Multiplier (0-1) of the pie radius which controls position of label on slice.
      this.dataLabelNudge = 0
      Number of pixels to slide the label away from (+) or toward (-) the center of the pie.
      this.startAngle = 0
      Angle to start drawing donut in degrees.
      this.numberRows = null
      Maximum number of rows in the legend.
      this.numberColumns = null
      Maximum number of columns in the legend.
      - - - - - - - - \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/docs/files/plugins/jqplot-dragable-js.html b/libreplan-webapp/src/main/webapp/jqplot/docs/files/plugins/jqplot-dragable-js.html deleted file mode 100644 index eda768228..000000000 --- a/libreplan-webapp/src/main/webapp/jqplot/docs/files/plugins/jqplot-dragable-js.html +++ /dev/null @@ -1,45 +0,0 @@ - - -$.jqplot.Dragable - - - - - - - - - -

      Plugin to make plotted points dragable by the user.

      Summary
      $.jqplot.DragablePlugin to make plotted points dragable by the user.
      Properties
      colorCSS color spec for the dragged point (and adjacent line segment or bar).
      constrainToConstrain dragging motion to an axis or to none.
      - -

      Properties

      - -

      color

      this.color

      CSS color spec for the dragged point (and adjacent line segment or bar).

      - -

      constrainTo

      this.constrainTo = 'none'

      Constrain dragging motion to an axis or to none.  Allowable values are ‘none’, ‘x’, ‘y’

      - -
      - - - - - - - - - - -
      this.color
      CSS color spec for the dragged point (and adjacent line segment or bar).
      this.constrainTo = 'none'
      Constrain dragging motion to an axis or to none.
      - - - - - - - - \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/docs/files/plugins/jqplot-enhancedLegendRenderer-js.html b/libreplan-webapp/src/main/webapp/jqplot/docs/files/plugins/jqplot-enhancedLegendRenderer-js.html deleted file mode 100644 index 0e61933f3..000000000 --- a/libreplan-webapp/src/main/webapp/jqplot/docs/files/plugins/jqplot-enhancedLegendRenderer-js.html +++ /dev/null @@ -1,49 +0,0 @@ - - -/Users/chris/Sites/lib/jqplot/build/plugins/jqplot.enhancedLegendRenderer.js - - - - - - - - - -
      Summary
      jqplot.enhancedLegendRenderer.js
      Properties
      numberRowsMaximum number of rows in the legend.
      numberColumnsMaximum number of columns in the legend.
      seriesTogglefalse to not enable series on/off toggling on the legend.
      disableIEFadingtrue to toggle series with a show/hide method only and not allow fading in/out.
      - -

      Properties

      - -

      numberRows

      this.numberRows = null

      Maximum number of rows in the legend.  0 or null for unlimited.

      - -

      numberColumns

      this.numberColumns = null

      Maximum number of columns in the legend.  0 or null for unlimited.

      - -

      seriesToggle

      this.seriesToggle = 'normal'

      false to not enable series on/off toggling on the legend. true or a fadein/fadeout speed (number of milliseconds or ‘fast’, ‘normal’, ‘slow’) to enable show/hide of series on click of legend item.

      - -

      disableIEFading

      this.disableIEFading = true

      true to toggle series with a show/hide method only and not allow fading in/out.  This is to overcome poor performance of fade in some versions of IE.

      - -
      - - - - - - - - - - -
      this.numberRows = null
      Maximum number of rows in the legend.
      this.numberColumns = null
      Maximum number of columns in the legend.
      this.seriesToggle = 'normal'
      false to not enable series on/off toggling on the legend.
      this.disableIEFading = true
      true to toggle series with a show/hide method only and not allow fading in/out.
      - - - - - - - - \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/docs/files/plugins/jqplot-funnelRenderer-js.html b/libreplan-webapp/src/main/webapp/jqplot/docs/files/plugins/jqplot-funnelRenderer-js.html deleted file mode 100644 index 05c55d4ba..000000000 --- a/libreplan-webapp/src/main/webapp/jqplot/docs/files/plugins/jqplot-funnelRenderer-js.html +++ /dev/null @@ -1,87 +0,0 @@ - - -$.jqplot.FunnelRenderer - - - - - - - - - -

      Plugin renderer to draw a funnel chart. x values, if present, will be used as labels. y values give area size.

      Funnel charts will draw a single series only.

      To use this renderer, you need to include the funnel renderer plugin, for example:

      <script type="text/javascript" src="plugins/jqplot.funnelRenderer.js"></script>

      Properties described here are passed into the $.jqplot function as options on the series renderer.  For example:

      plot2 = $.jqplot('chart2', [s1, s2], {
      -    seriesDefaults: {
      -        renderer:$.jqplot.FunnelRenderer,
      -        rendererOptions:{
      -             sectionMargin: 12,
      -             widthRatio: 0.3
      -         }
      -     }
      -});

      IMPORTANT

      The funnel renderer will reorder data in descending order so the largest value in the data set is first and displayed on top of the funnel.  Data will then be displayed in descending order down the funnel.  The area of each funnel section will correspond to the value of each data point relative to the sum of all values.  That is section area is proportional to section value divided by sum of all section values.

      If your data is not in descending order when passed into the plot, it will be reordered when stored in the series.data property.  A copy of the unordered data is kept in the series._unorderedData property.

      A funnel plot will trigger events on the plot target according to user interaction.  All events return the event object, the series index, the point (section) index, and the point data for the appropriate section.  Note the point index will referr to the ordered data, not the original unordered data.

      ’jqplotDataMouseOver’triggered when mousing over a section.
      ’jqplotDataHighlight’triggered the first time user mouses over a section, if highlighting is enabled.
      ’jqplotDataUnhighlight’triggered when a user moves the mouse out of a highlighted section.
      ’jqplotDataClick’triggered when the user clicks on a section.
      ’jqplotDataRightClick’tiggered when the user right clicks on a section if the “captureRightClick” option is set to true on the plot.
      Summary
      $.jqplot.FunnelRendererPlugin renderer to draw a funnel chart.
      Properties
      paddingpadding between the funnel and plot edges, legend, etc.
      sectionMarginspacing between funnel sections in pixels.
      filltrue or false, wether to fill the areas.
      shadowOffsetoffset of the shadow from the area and offset of each succesive stroke of the shadow from the last.
      shadowAlphatransparency of the shadow (0 = transparent, 1 = opaque)
      shadowDepthnumber of strokes to apply to the shadow, each stroke offset shadowOffset from the last.
      highlightMouseOverTrue to highlight area when moused over.
      highlightMouseDownTrue to highlight when a mouse button is pressed over a area.
      highlightColorsarray of colors to use when highlighting an area.
      widthRatioThe ratio of the width of the top of the funnel to the bottom.
      lineWidthwidth of line if areas are stroked and not filled.
      dataLabelsEither ‘label’, ‘value’, ‘percent’ or an array of labels to place on the pie slices.
      showDataLabelstrue to show data labels on slices.
      dataLabelFormatStringFormat string for data labels.
      dataLabelThreshold
      $.jqplot.FunnelLegendRendererLegend Renderer specific to funnel plots.
      Properties
      numberRowsMaximum number of rows in the legend.
      numberColumnsMaximum number of columns in the legend.
      - -

      Properties

      - -

      padding

      this.padding = {top: 20, right: 20, bottom: 20, left: 20}

      padding between the funnel and plot edges, legend, etc.

      - -

      sectionMargin

      this.sectionMargin = 6

      spacing between funnel sections in pixels.

      - -

      fill

      this.fill = true

      true or false, wether to fill the areas.

      - -

      shadowOffset

      this.shadowOffset = 2

      offset of the shadow from the area and offset of each succesive stroke of the shadow from the last.

      - -

      shadowAlpha

      this.shadowAlpha = 0.07

      transparency of the shadow (0 = transparent, 1 = opaque)

      - -

      shadowDepth

      this.shadowDepth = 5

      number of strokes to apply to the shadow, each stroke offset shadowOffset from the last.

      - -

      highlightMouseOver

      this.highlightMouseOver = true

      True to highlight area when moused over.  This must be false to enable highlightMouseDown to highlight when clicking on a area.

      - -

      highlightMouseDown

      this.highlightMouseDown = false

      True to highlight when a mouse button is pressed over a area.  This will be disabled if highlightMouseOver is true.

      - -

      highlightColors

      this.highlightColors = []

      array of colors to use when highlighting an area.

      - -

      widthRatio

      this.widthRatio = 0.2

      The ratio of the width of the top of the funnel to the bottom. a ratio of 0 will make an upside down pyramid.

      - -

      lineWidth

      this.lineWidth = 2

      width of line if areas are stroked and not filled.

      - -

      dataLabels

      this.dataLabels = 'percent'

      Either ‘label’, ‘value’, ‘percent’ or an array of labels to place on the pie slices.  Defaults to percentage of each pie slice.

      - -

      showDataLabels

      this.showDataLabels = false

      true to show data labels on slices.

      - -

      dataLabelFormatString

      this.dataLabelFormatString = null

      Format string for data labels.  If none, ‘%s’ is used for “label” and for arrays, ‘%d’ for value and ‘%d%%’ for percentage.

      - -

      dataLabelThreshold

      this.dataLabelThreshold = 3
      Threshhold in percentage (0100) of pie area, below which no label will be displayed.  This applies to all label types, not just to percentage labels.
      - -

      $.jqplot.FunnelLegendRenderer

      Legend Renderer specific to funnel plots.  Set by default when the user creates a funnel plot.

      Summary
      Properties
      numberRowsMaximum number of rows in the legend.
      numberColumnsMaximum number of columns in the legend.
      - -

      Properties

      - -

      numberRows

      this.numberRows = null

      Maximum number of rows in the legend.  0 or null for unlimited.

      - -

      numberColumns

      this.numberColumns = null

      Maximum number of columns in the legend.  0 or null for unlimited.

      - -
      - - - - - - - - - - -
      this.padding = {top: 20, right: 20, bottom: 20, left: 20}
      padding between the funnel and plot edges, legend, etc.
      this.sectionMargin = 6
      spacing between funnel sections in pixels.
      this.fill = true
      true or false, wether to fill the areas.
      this.shadowOffset = 2
      offset of the shadow from the area and offset of each succesive stroke of the shadow from the last.
      this.shadowAlpha = 0.07
      transparency of the shadow (0 = transparent, 1 = opaque)
      this.shadowDepth = 5
      number of strokes to apply to the shadow, each stroke offset shadowOffset from the last.
      this.highlightMouseOver = true
      True to highlight area when moused over.
      this.highlightMouseDown = false
      True to highlight when a mouse button is pressed over a area.
      this.highlightColors = []
      array of colors to use when highlighting an area.
      this.widthRatio = 0.2
      The ratio of the width of the top of the funnel to the bottom.
      this.lineWidth = 2
      width of line if areas are stroked and not filled.
      this.dataLabels = 'percent'
      Either ‘label’, ‘value’, ‘percent’ or an array of labels to place on the pie slices.
      this.showDataLabels = false
      true to show data labels on slices.
      this.dataLabelFormatString = null
      Format string for data labels.
      this.dataLabelThreshold = 3
      this.numberRows = null
      Maximum number of rows in the legend.
      this.numberColumns = null
      Maximum number of columns in the legend.
      - - - - - - - - \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/docs/files/plugins/jqplot-highlighter-js.html b/libreplan-webapp/src/main/webapp/jqplot/docs/files/plugins/jqplot-highlighter-js.html deleted file mode 100644 index d2da937d3..000000000 --- a/libreplan-webapp/src/main/webapp/jqplot/docs/files/plugins/jqplot-highlighter-js.html +++ /dev/null @@ -1,80 +0,0 @@ - - -$.jqplot.Highlighter - - - - - - - - - -

      Plugin which will highlight data points when they are moused over.

      To use this plugin, include the js file in your source:

      <script type="text/javascript" src="plugins/jqplot.highlighter.js"></script>

      A tooltip providing information about the data point is enabled by default.  To disable the tooltip, set “showTooltip” to false.

      You can control what data is displayed in the tooltip with various options.  The “tooltipAxes” option controls wether the x, y or both data values are displayed.

      Some chart types (e.g. hi-low-close) have more than one y value per data point.  To display the additional values in the tooltip, set the “yvalues” option to the desired number of y values present (3 for a hlc chart).

      By default, data values will be formatted with the same formatting specifiers as used to format the axis ticks.  A custom format code can be supplied with the tooltipFormatString option.  This will apply to all values in the tooltip.

      For more complete control, the “formatString” option can be set.  This Allows conplete control over tooltip formatting.  Values are passed to the format string in an order determined by the “tooltipAxes” and “yvalues” options.  So, if you have a hi-low-close chart and you just want to display the hi-low-close values in the tooltip, you could set a formatString like:

      highlighter: {
      -    tooltipAxes: 'y',
      -    yvalues: 3,
      -    formatString:'<table class="jqplot-highlighter">
      -        <tr><td>hi:</td><td>%s</td></tr>
      -        <tr><td>low:</td><td>%s</td></tr>
      -        <tr><td>close:</td><td>%s</td></tr></table>'
      -}
      Summary
      $.jqplot.HighlighterPlugin which will highlight data points when they are moused over.
      Properties
      showtrue to show the highlight.
      markerRendererRenderer used to draw the marker of the highlighted point.
      showMarkertrue to show the marker
      lineWidthAdjustPixels to add to the lineWidth of the highlight.
      sizeAdjustPixels to add to the overall size of the highlight.
      showTooltipShow a tooltip with data point values.
      tooltipLocationWhere to position tooltip, ‘n’, ‘ne’, ‘e’, ‘se’, ‘s’, ‘sw’, ‘w’, ‘nw’
      fadeTooltiptrue = fade in/out tooltip, flase = show/hide tooltip
      tooltipFadeSpeed‘slow’, ‘def’, ‘fast’, or number of milliseconds.
      tooltipOffsetPixel offset of tooltip from the highlight.
      tooltipAxesWhich axes to display in tooltip, ‘x’, ‘y’ or ‘both’, ‘xy’ or ‘yx’ ‘both’ and ‘xy’ are equivalent, ‘yx’ reverses order of labels.
      useAxesFormattersUse the x and y axes formatters to format the text in the tooltip.
      tooltipFormatStringsprintf format string for the tooltip.
      formatStringalternative to tooltipFormatString will format the whole tooltip text, populating with x, y values as indicated by tooltipAxes option.
      yvaluesNumber of y values to expect in the data point array.
      bringSeriesToFrontThis option requires jQuery 1.4+ True to bring the series of the highlighted point to the front of other series.
      - -

      Properties

      - -

      show

      this.show = $.jqplot.config.enablePlugins

      true to show the highlight.

      - -

      markerRenderer

      this.markerRenderer = new $.jqplot.MarkerRenderer({shadow:false})

      Renderer used to draw the marker of the highlighted point.  Renderer will assimilate attributes from the data point being highlighted, so no attributes need set on the renderer directly.  Default is to turn off shadow drawing on the highlighted point.

      - -

      showMarker

      this.showMarker = true

      true to show the marker

      - -

      lineWidthAdjust

      this.lineWidthAdjust = 2.5

      Pixels to add to the lineWidth of the highlight.

      - -

      sizeAdjust

      this.sizeAdjust = 5

      Pixels to add to the overall size of the highlight.

      - -

      showTooltip

      this.showTooltip = true

      Show a tooltip with data point values.

      - -

      tooltipLocation

      this.tooltipLocation = 'nw'

      Where to position tooltip, ‘n’, ‘ne’, ‘e’, ‘se’, ‘s’, ‘sw’, ‘w’, ‘nw’

      - -

      fadeTooltip

      this.fadeTooltip = true

      true = fade in/out tooltip, flase = show/hide tooltip

      - -

      tooltipFadeSpeed

      this.tooltipFadeSpeed = "fast"

      ’slow’, ‘def’, ‘fast’, or number of milliseconds.

      - -

      tooltipOffset

      this.tooltipOffset = 2

      Pixel offset of tooltip from the highlight.

      - -

      tooltipAxes

      this.tooltipAxes = 'both'

      Which axes to display in tooltip, ‘x’, ‘y’ or ‘both’, ‘xy’ or ‘yx’ ‘both’ and ‘xy’ are equivalent, ‘yx’ reverses order of labels.

      - -

      useAxesFormatters

      this.useAxesFormatters = true

      Use the x and y axes formatters to format the text in the tooltip.

      - -

      tooltipFormatString

      this.tooltipFormatString = '%.5P'

      sprintf format string for the tooltip.  Uses Ash Searle’s javascript sprintf implementation found here: http://hexmen.com/blog/2007/03/printf-sprintf/ See http://perldoc.perl.org/functions/sprintf.html for reference.  Additional “p” and “P” format specifiers added by Chris Leonello.

      - -

      formatString

      this.formatString = null

      alternative to tooltipFormatString will format the whole tooltip text, populating with x, y values as indicated by tooltipAxes option.  So, you could have a tooltip like: ‘Date: %s, number of cats: %d’ to format the whole tooltip at one go.  If useAxesFormatters is true, values will be formatted according to Axes formatters and you can populate your tooltip string with %s placeholders.

      - -

      yvalues

      this.yvalues = 1

      Number of y values to expect in the data point array.  Typically this is 1.  Certain plots, like OHLC, will have more y values in each data point array.

      - -

      bringSeriesToFront

      this.bringSeriesToFront = false

      This option requires jQuery 1.4+ True to bring the series of the highlighted point to the front of other series.

      - -
      - - - - - - - - - - -
      this.show = $.jqplot.config.enablePlugins
      true to show the highlight.
      this.markerRenderer = new $.jqplot.MarkerRenderer({shadow:false})
      Renderer used to draw the marker of the highlighted point.
      this.showMarker = true
      true to show the marker
      this.lineWidthAdjust = 2.5
      Pixels to add to the lineWidth of the highlight.
      this.sizeAdjust = 5
      Pixels to add to the overall size of the highlight.
      this.showTooltip = true
      Show a tooltip with data point values.
      this.tooltipLocation = 'nw'
      Where to position tooltip, ‘n’, ‘ne’, ‘e’, ‘se’, ‘s’, ‘sw’, ‘w’, ‘nw’
      this.fadeTooltip = true
      true = fade in/out tooltip, flase = show/hide tooltip
      this.tooltipFadeSpeed = "fast"
      ‘slow’, ‘def’, ‘fast’, or number of milliseconds.
      this.tooltipOffset = 2
      Pixel offset of tooltip from the highlight.
      this.tooltipAxes = 'both'
      Which axes to display in tooltip, ‘x’, ‘y’ or ‘both’, ‘xy’ or ‘yx’ ‘both’ and ‘xy’ are equivalent, ‘yx’ reverses order of labels.
      this.useAxesFormatters = true
      Use the x and y axes formatters to format the text in the tooltip.
      this.tooltipFormatString = '%.5P'
      sprintf format string for the tooltip.
      this.formatString = null
      alternative to tooltipFormatString will format the whole tooltip text, populating with x, y values as indicated by tooltipAxes option.
      this.yvalues = 1
      Number of y values to expect in the data point array.
      this.bringSeriesToFront = false
      This option requires jQuery 1.4+ True to bring the series of the highlighted point to the front of other series.
      - - - - - - - - \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/docs/files/plugins/jqplot-logAxisRenderer-js.html b/libreplan-webapp/src/main/webapp/jqplot/docs/files/plugins/jqplot-logAxisRenderer-js.html deleted file mode 100644 index 8a5348f98..000000000 --- a/libreplan-webapp/src/main/webapp/jqplot/docs/files/plugins/jqplot-logAxisRenderer-js.html +++ /dev/null @@ -1,47 +0,0 @@ - - -$.jqplot.LogAxisRenderer - - - - - - - - - -

      A plugin for a jqPlot to render a logarithmic axis.

      To use this renderer, include the plugin in your source

      <script type="text/javascript" language="javascript" src="plugins/jqplot.logAxisRenderer.js"></script>

      and supply the appropriate options to your plot

      {axes:{xaxis:{renderer:$.jqplot.LogAxisRenderer}}}
      Summary
      $.jqplot.LogAxisRendererA plugin for a jqPlot to render a logarithmic axis.
      axisDefaultsDefault properties which will be applied directly to the series.
      PropertiesProperties
      drawBaselineTrue to draw the axis baseline.
      minorTicksNumber of ticks to add between “major” ticks.
      - -

      axisDefaults

      Default properties which will be applied directly to the series.

      - -

      Properties

      Properties

      basethe logarithmic base, commonly 2, 10 or Math.E
      tickDistributionDeprecated.  “power” distribution of ticks always used.  Option has no effect.
      - -

      drawBaseline

      this.drawBaseline = true

      True to draw the axis baseline.

      - -

      minorTicks

      this.minorTicks = 'auto'

      Number of ticks to add between “major” ticks.  Major ticks are ticks supplied by user or auto computed.  Minor ticks cannot be created by user.

      - -
      - - - - - - - - - - -
      this.drawBaseline = true
      True to draw the axis baseline.
      this.minorTicks = 'auto'
      Number of ticks to add between “major” ticks.
      - - - - - - - - \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/docs/files/plugins/jqplot-mekkoAxisRenderer-js.html b/libreplan-webapp/src/main/webapp/jqplot/docs/files/plugins/jqplot-mekkoAxisRenderer-js.html deleted file mode 100644 index 3084d4a46..000000000 --- a/libreplan-webapp/src/main/webapp/jqplot/docs/files/plugins/jqplot-mekkoAxisRenderer-js.html +++ /dev/null @@ -1,49 +0,0 @@ - - -$.jqplot.MekkoAxisRenderer - - - - - - - - - -

      An axis renderer for a Mekko chart.  Should be used with a Mekko chart where the mekkoRenderer is used on the series.  Displays the Y axis as a range from 0 to 1 (0 to 100%) and the x axis with a tick for each series scaled to the sum of all the y values.

      Summary
      $.jqplot.MekkoAxisRendererAn axis renderer for a Mekko chart.
      Properties
      tickModeHow to space the ticks on the axis.
      barLabelRendererrenderer to use to draw labels under each bar.
      barLabelsarray of labels to put under each bar.
      barLabelOptionsoptions object to pass to the bar label renderer.
      - -

      Properties

      - -

      tickMode

      this.tickMode

      How to space the ticks on the axis.  ‘bar’ will place a tick at the width of each bar.  This is the default for the x axis.  ‘even’ will place ticks at even intervals.  This is the default for x2 axis and y axis.  y axis cannot be changed.

      - -

      barLabelRenderer

      this.barLabelRenderer = $.jqplot.AxisLabelRenderer

      renderer to use to draw labels under each bar.

      - -

      barLabels

      this.barLabels = this.barLabels || []

      array of labels to put under each bar.

      - -

      barLabelOptions

      this.barLabelOptions = {}

      options object to pass to the bar label renderer.

      - -
      - - - - - - - - - - -
      this.tickMode
      How to space the ticks on the axis.
      this.barLabelRenderer = $.jqplot.AxisLabelRenderer
      renderer to use to draw labels under each bar.
      this.barLabels = this.barLabels || []
      array of labels to put under each bar.
      this.barLabelOptions = {}
      options object to pass to the bar label renderer.
      - - - - - - - - \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/docs/files/plugins/jqplot-mekkoRenderer-js.html b/libreplan-webapp/src/main/webapp/jqplot/docs/files/plugins/jqplot-mekkoRenderer-js.html deleted file mode 100644 index e2705f59a..000000000 --- a/libreplan-webapp/src/main/webapp/jqplot/docs/files/plugins/jqplot-mekkoRenderer-js.html +++ /dev/null @@ -1,62 +0,0 @@ - - -$.jqplot.MekkoRenderer - - - - - - - - - -

      Draws a Mekko style chart which shows 3 dimensional data on a 2 dimensional graph. the $.jqplot.MekkoAxisRenderer should be used with mekko charts.  The mekko renderer overrides the default legend renderer with it’s own $.jqplot.MekkoLegendRenderer which allows more flexibility to specify number of rows and columns in the legend.

      Data is specified per bar in the chart.  You can specify data as an array of y values, or as an array of [label, value] pairs.  Note that labels are used only on the first series.  Labels on subsequent series are ignored:

      bar1 = [['shirts', 8],['hats', 14],['shoes', 6],['gloves', 16],['dolls', 12]];
      -bar2 = [15,6,9,13,6];
      -bar3 = [['grumpy',4],['sneezy',2],['happy',7],['sleepy',9],['doc',7]];

      If you want to place labels for each bar under the axis, you use the barLabels option on the axes.  The bar labels can be styled with the “.jqplot-mekko-barLabel” css class.

      barLabels = ['Mickey Mouse', 'Donald Duck', 'Goofy'];
      -axes:{xaxis:{barLabels:barLabels}}
      Summary
      $.jqplot.MekkoRendererDraws a Mekko style chart which shows 3 dimensional data on a 2 dimensional graph.
      Properties
      borderColorcolor of the borders between areas on the chart
      showBordersTrue to draw borders lines between areas on the chart.
      Functions
      setGridDataconverts the user data values to grid coordinates and stores them in the gridData array.
      makeGridDataconverts any arbitrary data values to grid coordinates and returns them.
      $.jqplot.MekkoLegendRendererLegend renderer used by mekko charts with options for controlling number or rows and columns as well as placement outside of plot area.
      Properties
      numberRowsMaximum number of rows in the legend.
      numberColumnsMaximum number of columns in the legend.
      - -

      Properties

      - -

      borderColor

      this.borderColor = null

      color of the borders between areas on the chart

      - -

      showBorders

      this.showBorders = true

      True to draw borders lines between areas on the chart.  False will draw borders lines with the same color as the area.

      - -

      Functions

      - -

      setGridData

      $.jqplot.MekkoRenderer.prototype.setGridData = function(plot)

      converts the user data values to grid coordinates and stores them in the gridData array.  Will convert user data into appropriate rectangles.  Called with scope of a series.

      - -

      makeGridData

      $.jqplot.MekkoRenderer.prototype.makeGridData = function(data,
      plot)

      converts any arbitrary data values to grid coordinates and returns them.  This method exists so that plugins can use a series’ linerenderer to generate grid data points without overwriting the grid data associated with that series.  Called with scope of a series.

      - -

      $.jqplot.MekkoLegendRenderer

      Legend renderer used by mekko charts with options for controlling number or rows and columns as well as placement outside of plot area.

      Summary
      Properties
      numberRowsMaximum number of rows in the legend.
      numberColumnsMaximum number of columns in the legend.
      - -

      Properties

      - -

      numberRows

      this.numberRows = null

      Maximum number of rows in the legend.  0 or null for unlimited.

      - -

      numberColumns

      this.numberColumns = null

      Maximum number of columns in the legend.  0 or null for unlimited.

      - -
      - - - - - - - - - - -
      this.borderColor = null
      color of the borders between areas on the chart
      this.showBorders = true
      True to draw borders lines between areas on the chart.
      $.jqplot.MekkoRenderer.prototype.setGridData = function(plot)
      converts the user data values to grid coordinates and stores them in the gridData array.
      $.jqplot.MekkoRenderer.prototype.makeGridData = function(data,
      plot)
      converts any arbitrary data values to grid coordinates and returns them.
      this.numberRows = null
      Maximum number of rows in the legend.
      this.numberColumns = null
      Maximum number of columns in the legend.
      An axis renderer for a Mekko chart.
      - - - - - - - - \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/docs/files/plugins/jqplot-meterGaugeRenderer-js.html b/libreplan-webapp/src/main/webapp/jqplot/docs/files/plugins/jqplot-meterGaugeRenderer-js.html deleted file mode 100644 index 9d3aa68f7..000000000 --- a/libreplan-webapp/src/main/webapp/jqplot/docs/files/plugins/jqplot-meterGaugeRenderer-js.html +++ /dev/null @@ -1,103 +0,0 @@ - - -$.jqplot.MeterGaugeRenderer - - - - - - - - - -

      Plugin renderer to draw a meter gauge chart.

      Data consists of a single series with 1 data point to position the gauge needle.

      To use this renderer, you need to include the meter gauge renderer plugin, for example:

      <script type="text/javascript" src="plugins/jqplot.meterGaugeRenderer.js"></script>

      Properties described here are passed into the $.jqplot function as options on the series renderer.  For example:

      plot0 = $.jqplot('chart0',[[18]],{
      -    title: 'Network Speed',
      -    seriesDefaults: {
      -        renderer: $.jqplot.MeterGaugeRenderer,
      -        rendererOptions: {
      -            label: 'MB/s'
      -        }
      -    }
      -});

      A meterGauge plot does not support events.

      Summary
      $.jqplot.MeterGaugeRendererPlugin renderer to draw a meter gauge chart.
      Properties
      diameterOuter diameter of the meterGauge, auto computed by default
      paddingpadding between the meterGauge and plot edges, auto calculated by default.
      shadowOffsetoffset of the shadow from the gauge ring and offset of each succesive stroke of the shadow from the last.
      shadowAlphatransparency of the shadow (0 = transparent, 1 = opaque)
      shadowDepthnumber of strokes to apply to the shadow, each stroke offset shadowOffset from the last.
      backgroundbackground color of the inside of the gauge.
      ringColorcolor of the outer ring, hub, and needle of the gauge.
      tickColorcolor of the tick marks around the gauge.
      ringWidthwidth of the ring around the gauge.
      minMinimum value on the gauge.
      maxMaximum value on the gauge.
      ticksArray of tick values.
      showTickstrue to show ticks around gauge.
      showTickLabelstrue to show tick labels next to ticks.
      labelA gauge label like ‘kph’ or ‘Volts’
      labelHeightAdjustNumber of Pixels to offset the label up (-) or down (+) from its default position.
      labelPositionWhere to position the label, either ‘inside’ or ‘bottom’.
      intervalsArray of ranges to be drawn around the gauge.
      intervalColorsArray of colors to use for the intervals.
      intervalInnerRadiusRadius of the inner circle of the interval ring.
      intervalOuterRadiusRadius of the outer circle of the interval ring.
      tickSpacingDegrees between ticks.
      hubRadiusRadius of the hub at the bottom center of gauge which the needle attaches to.
      tickPaddingpadding of the tick marks to the outer ring and the tick labels to marks.
      needleThicknessMaximum thickness the needle.
      needlePadPadding between needle and inner edge of the ring when the needle is at the min or max gauge value.
      pegNeedleTrue will stop needle just below/above the min/max values if data is below/above min/max, as if the meter is “pegged”.
      - -

      Properties

      - -

      diameter

      this.diameter = null

      Outer diameter of the meterGauge, auto computed by default

      - -

      padding

      this.padding = null

      padding between the meterGauge and plot edges, auto calculated by default.

      - -

      shadowOffset

      this.shadowOffset = 2

      offset of the shadow from the gauge ring and offset of each succesive stroke of the shadow from the last.

      - -

      shadowAlpha

      this.shadowAlpha = 0.07

      transparency of the shadow (0 = transparent, 1 = opaque)

      - -

      shadowDepth

      this.shadowDepth = 4

      number of strokes to apply to the shadow, each stroke offset shadowOffset from the last.

      - -

      background

      this.background = "#efefef"

      background color of the inside of the gauge.

      - -

      ringColor

      this.ringColor = "#BBC6D0"

      color of the outer ring, hub, and needle of the gauge.

      - -

      tickColor

      this.tickColor = "989898"

      color of the tick marks around the gauge.

      - -

      ringWidth

      this.ringWidth = null

      width of the ring around the gauge.  Auto computed by default.

      - -

      min

      this.min

      Minimum value on the gauge.  Auto computed by default

      - -

      max

      this.max

      Maximum value on the gauge.  Auto computed by default

      - -

      ticks

      this.ticks = []

      Array of tick values.  Auto computed by default.

      - -

      showTicks

      this.showTicks = true

      true to show ticks around gauge.

      - -

      showTickLabels

      this.showTickLabels = true

      true to show tick labels next to ticks.

      - -

      label

      this.label = null

      A gauge label like ‘kph’ or ‘Volts’

      - -

      labelHeightAdjust

      this.labelHeightAdjust = 0

      Number of Pixels to offset the label up (-) or down (+) from its default position.

      - -

      labelPosition

      this.labelPosition = 'inside'

      Where to position the label, either ‘inside’ or ‘bottom’.

      - -

      intervals

      this.intervals = []

      Array of ranges to be drawn around the gauge.  Array of form:

      [value1, value2, ...]

      indicating the values for the first, second, ... intervals.

      - -

      intervalColors

      this.intervalColors = [ "#4bb2c5", "#EAA228", "#c5b47f", "#579575", "#839557", "#958c12", "#953579", "#4b5de4", "#d8b83f", "#ff5800", "#0085cc", "#c747a3", "#cddf54", "#FBD178", "#26B4E3", "#bd70c7"]

      Array of colors to use for the intervals.

      - -

      intervalInnerRadius

      this.intervalInnerRadius = null

      Radius of the inner circle of the interval ring.

      - -

      intervalOuterRadius

      this.intervalOuterRadius = null

      Radius of the outer circle of the interval ring.

      - -

      tickSpacing

      this.tickSpacing = 30

      Degrees between ticks.  This is a target number, if incompatible span and ticks are supplied, a suitable spacing close to this value will be computed.

      - -

      hubRadius

      this.hubRadius = null

      Radius of the hub at the bottom center of gauge which the needle attaches to.  Auto computed by default

      - -

      tickPadding

      this.tickPadding = null

      padding of the tick marks to the outer ring and the tick labels to marks.  Auto computed by default.

      - -

      needleThickness

      this.needleThickness = null

      Maximum thickness the needle.  Auto computed by default.

      - -

      needlePad

      this.needlePad = 6

      Padding between needle and inner edge of the ring when the needle is at the min or max gauge value.

      - -

      pegNeedle

      this.pegNeedle = true

      True will stop needle just below/above the min/max values if data is below/above min/max, as if the meter is “pegged”.

      - -
      - - - - - - - - - - -
      this.diameter = null
      Outer diameter of the meterGauge, auto computed by default
      this.padding = null
      padding between the meterGauge and plot edges, auto calculated by default.
      this.shadowOffset = 2
      offset of the shadow from the gauge ring and offset of each succesive stroke of the shadow from the last.
      this.shadowAlpha = 0.07
      transparency of the shadow (0 = transparent, 1 = opaque)
      this.shadowDepth = 4
      number of strokes to apply to the shadow, each stroke offset shadowOffset from the last.
      this.background = "#efefef"
      background color of the inside of the gauge.
      this.ringColor = "#BBC6D0"
      color of the outer ring, hub, and needle of the gauge.
      this.tickColor = "989898"
      color of the tick marks around the gauge.
      this.ringWidth = null
      width of the ring around the gauge.
      this.min
      Minimum value on the gauge.
      this.max
      Maximum value on the gauge.
      this.ticks = []
      Array of tick values.
      this.showTicks = true
      true to show ticks around gauge.
      this.showTickLabels = true
      true to show tick labels next to ticks.
      this.label = null
      A gauge label like ‘kph’ or ‘Volts’
      this.labelHeightAdjust = 0
      Number of Pixels to offset the label up (-) or down (+) from its default position.
      this.labelPosition = 'inside'
      Where to position the label, either ‘inside’ or ‘bottom’.
      this.intervals = []
      Array of ranges to be drawn around the gauge.
      this.intervalColors = [ "#4bb2c5", "#EAA228", "#c5b47f", "#579575", "#839557", "#958c12", "#953579", "#4b5de4", "#d8b83f", "#ff5800", "#0085cc", "#c747a3", "#cddf54", "#FBD178", "#26B4E3", "#bd70c7"]
      Array of colors to use for the intervals.
      this.intervalInnerRadius = null
      Radius of the inner circle of the interval ring.
      this.intervalOuterRadius = null
      Radius of the outer circle of the interval ring.
      this.tickSpacing = 30
      Degrees between ticks.
      this.hubRadius = null
      Radius of the hub at the bottom center of gauge which the needle attaches to.
      this.tickPadding = null
      padding of the tick marks to the outer ring and the tick labels to marks.
      this.needleThickness = null
      Maximum thickness the needle.
      this.needlePad = 6
      Padding between needle and inner edge of the ring when the needle is at the min or max gauge value.
      this.pegNeedle = true
      True will stop needle just below/above the min/max values if data is below/above min/max, as if the meter is “pegged”.
      - - - - - - - - \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/docs/files/plugins/jqplot-ohlcRenderer-js.html b/libreplan-webapp/src/main/webapp/jqplot/docs/files/plugins/jqplot-ohlcRenderer-js.html deleted file mode 100644 index e129b9637..000000000 --- a/libreplan-webapp/src/main/webapp/jqplot/docs/files/plugins/jqplot-ohlcRenderer-js.html +++ /dev/null @@ -1,65 +0,0 @@ - - -$.jqplot.OHLCRenderer - - - - - - - - - -

      jqPlot Plugin to draw Open Hi Low Close, Candlestick and Hi Low Close charts.

      To use this plugin, include the renderer js file in your source:

      <script type="text/javascript" src="plugins/jqplot.ohlcRenderer.js"></script>

      You will most likely want to use a date axis renderer for the x axis also, so include the date axis render js file also:

      <script type="text/javascript" src="plugins/jqplot.dateAxisRenderer.js"></script>

      Then you set the renderer in the series options on your plot

      series: [{renderer:$.jqplot.OHLCRenderer}]

      For OHLC and candlestick charts, data should be specified like so:

      dat = [['07/06/2009',138.7,139.68,135.18,135.4], ['06/29/2009',143.46,144.66,139.79,140.02], ...]

      If the data array has only 4 values per point instead of 5, the renderer will create a Hi Low Close chart instead.  In that case, data should be supplied like:

      dat = [['07/06/2009',139.68,135.18,135.4], ['06/29/2009',144.66,139.79,140.02], ...]

      To generate a candlestick chart instead of an OHLC chart, set the “candlestick” option to true:

      series: [{renderer:$.jqplot.OHLCRenderer, rendererOptions:{candleStick:true}}],
      Summary
      $.jqplot.OHLCRendererjqPlot Plugin to draw Open Hi Low Close, Candlestick and Hi Low Close charts.
      Properties
      candleSticktrue to render chart as candleStick.
      tickLengthlength of the line in pixels indicating open and close price.
      bodyWidthwidth of the candlestick body in pixels.
      openColorcolor of the open price tick mark.
      closeColorcolor of the close price tick mark.
      wickColorcolor of the hi-lo line thorugh the candlestick body.
      fillUpBodytrue to render an “up” day (close price greater than open price) with a filled candlestick body.
      fillDownBodytrue to render a “down” day (close price lower than open price) with a filled candlestick body.
      upBodyColorColor of candlestick body of an “up” day.
      downBodyColorColor of candlestick body on a “down” day.
      hlctrue if is a hi-low-close chart (no open price).
      lineWidthWidth of the hi-low line and open/close ticks.
      - -

      Properties

      - -

      candleStick

      this.candleStick = false

      true to render chart as candleStick.  Must have an open price, cannot be a hlc chart.

      - -

      tickLength

      this.tickLength = 'auto'

      length of the line in pixels indicating open and close price.  Default will auto calculate based on plot width and number of points displayed.

      - -

      bodyWidth

      this.bodyWidth = 'auto'

      width of the candlestick body in pixels.  Default will auto calculate based on plot width and number of candlesticks displayed.

      - -

      openColor

      this.openColor = null

      color of the open price tick mark.  Default is series color.

      - -

      closeColor

      this.closeColor = null

      color of the close price tick mark.  Default is series color.

      - -

      wickColor

      this.wickColor = null

      color of the hi-lo line thorugh the candlestick body.  Default is the series color.

      - -

      fillUpBody

      this.fillUpBody = false

      true to render an “up” day (close price greater than open price) with a filled candlestick body.

      - -

      fillDownBody

      this.fillDownBody = true

      true to render a “down” day (close price lower than open price) with a filled candlestick body.

      - -

      upBodyColor

      this.upBodyColor = null

      Color of candlestick body of an “up” day.  Default is series color.

      - -

      downBodyColor

      this.downBodyColor = null

      Color of candlestick body on a “down” day.  Default is series color.

      - -

      hlc

      this.hlc = false

      true if is a hi-low-close chart (no open price).  This is determined automatically from the series data.

      - -

      lineWidth

      this.lineWidth = 1.5

      Width of the hi-low line and open/close ticks.  Must be set in the rendererOptions for the series.

      - -
      - - - - - - - - - - -
      this.candleStick = false
      true to render chart as candleStick.
      this.tickLength = 'auto'
      length of the line in pixels indicating open and close price.
      this.bodyWidth = 'auto'
      width of the candlestick body in pixels.
      this.openColor = null
      color of the open price tick mark.
      this.closeColor = null
      color of the close price tick mark.
      this.wickColor = null
      color of the hi-lo line thorugh the candlestick body.
      this.fillUpBody = false
      true to render an “up” day (close price greater than open price) with a filled candlestick body.
      this.fillDownBody = true
      true to render a “down” day (close price lower than open price) with a filled candlestick body.
      this.upBodyColor = null
      Color of candlestick body of an “up” day.
      this.downBodyColor = null
      Color of candlestick body on a “down” day.
      this.hlc = false
      true if is a hi-low-close chart (no open price).
      this.lineWidth = 1.5
      Width of the hi-low line and open/close ticks.
      - - - - - - - - \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/docs/files/plugins/jqplot-pieRenderer-js.html b/libreplan-webapp/src/main/webapp/jqplot/docs/files/plugins/jqplot-pieRenderer-js.html deleted file mode 100644 index aeae10e44..000000000 --- a/libreplan-webapp/src/main/webapp/jqplot/docs/files/plugins/jqplot-pieRenderer-js.html +++ /dev/null @@ -1,93 +0,0 @@ - - -$.jqplot.PieRenderer - - - - - - - - - -

      Plugin renderer to draw a pie chart. x values, if present, will be used as slice labels. y values give slice size.

      To use this renderer, you need to include the pie renderer plugin, for example:

      <script type="text/javascript" src="plugins/jqplot.pieRenderer.js"></script>

      Properties described here are passed into the $.jqplot function as options on the series renderer.  For example:

      plot2 = $.jqplot('chart2', [s1, s2], {
      -    seriesDefaults: {
      -        renderer:$.jqplot.PieRenderer,
      -        rendererOptions:{
      -             sliceMargin: 2,
      -             startAngle: -90
      -         }
      -     }
      -});

      A pie plot will trigger events on the plot target according to user interaction.  All events return the event object, the series index, the point (slice) index, and the point data for the appropriate slice.

      ’jqplotDataMouseOver’triggered when user mouseing over a slice.
      ’jqplotDataHighlight’triggered the first time user mouses over a slice, if highlighting is enabled.
      ’jqplotDataUnhighlight’triggered when a user moves the mouse out of a highlighted slice.
      ’jqplotDataClick’triggered when the user clicks on a slice.
      ’jqplotDataRightClick’tiggered when the user right clicks on a slice if the “captureRightClick” option is set to true on the plot.
      Summary
      $.jqplot.PieRendererPlugin renderer to draw a pie chart.
      Properties
      diameterOuter diameter of the pie, auto computed by default
      paddingpadding between the pie and plot edges, legend, etc.
      sliceMarginangular spacing between pie slices in degrees.
      filltrue or false, wether to fil the slices.
      shadowOffsetoffset of the shadow from the slice and offset of each succesive stroke of the shadow from the last.
      shadowAlphatransparency of the shadow (0 = transparent, 1 = opaque)
      shadowDepthnumber of strokes to apply to the shadow, each stroke offset shadowOffset from the last.
      highlightMouseOverTrue to highlight slice when moused over.
      highlightMouseDownTrue to highlight when a mouse button is pressed over a slice.
      highlightColorsan array of colors to use when highlighting a slice.
      dataLabelsEither ‘label’, ‘value’, ‘percent’ or an array of labels to place on the pie slices.
      showDataLabelstrue to show data labels on slices.
      dataLabelFormatStringFormat string for data labels.
      dataLabelThresholdThreshhold in percentage (0-100) of pie area, below which no label will be displayed.
      dataLabelPositionFactorA Multiplier (0-1) of the pie radius which controls position of label on slice.
      dataLabelNudgeNumber of pixels to slide the label away from (+) or toward (-) the center of the pie.
      dataLabelCenterOnTrue to center the data label at its position.
      startAngleAngle to start drawing pie in degrees.
      $.jqplot.PieLegendRendererLegend Renderer specific to pie plots.
      Properties
      numberRowsMaximum number of rows in the legend.
      numberColumnsMaximum number of columns in the legend.
      - -

      Properties

      - -

      diameter

      this.diameter = null

      Outer diameter of the pie, auto computed by default

      - -

      padding

      this.padding = 20

      padding between the pie and plot edges, legend, etc.

      - -

      sliceMargin

      this.sliceMargin = 0

      angular spacing between pie slices in degrees.

      - -

      fill

      this.fill = true

      true or false, wether to fil the slices.

      - -

      shadowOffset

      this.shadowOffset = 2

      offset of the shadow from the slice and offset of each succesive stroke of the shadow from the last.

      - -

      shadowAlpha

      this.shadowAlpha = 0.07

      transparency of the shadow (0 = transparent, 1 = opaque)

      - -

      shadowDepth

      this.shadowDepth = 5

      number of strokes to apply to the shadow, each stroke offset shadowOffset from the last.

      - -

      highlightMouseOver

      this.highlightMouseOver = true

      True to highlight slice when moused over.  This must be false to enable highlightMouseDown to highlight when clicking on a slice.

      - -

      highlightMouseDown

      this.highlightMouseDown = false

      True to highlight when a mouse button is pressed over a slice.  This will be disabled if highlightMouseOver is true.

      - -

      highlightColors

      this.highlightColors = []

      an array of colors to use when highlighting a slice.

      - -

      dataLabels

      this.dataLabels = 'percent'

      Either ‘label’, ‘value’, ‘percent’ or an array of labels to place on the pie slices.  Defaults to percentage of each pie slice.

      - -

      showDataLabels

      this.showDataLabels = false

      true to show data labels on slices.

      - -

      dataLabelFormatString

      this.dataLabelFormatString = null

      Format string for data labels.  If none, ‘%s’ is used for “label” and for arrays, ‘%d’ for value and ‘%d%%’ for percentage.

      - -

      dataLabelThreshold

      this.dataLabelThreshold = 3

      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

      this.dataLabelPositionFactor = 0.52

      A Multiplier (0-1) of the pie radius which controls position of label on slice.  Increasing will slide label toward edge of pie, decreasing will slide label toward center of pie.

      - -

      dataLabelNudge

      this.dataLabelNudge = 2

      Number of pixels to slide the label away from (+) or toward (-) the center of the pie.

      - -

      dataLabelCenterOn

      this.dataLabelCenterOn = true

      True to center the data label at its position.  False to set the inside facing edge of the label at its position.

      - -

      startAngle

      this.startAngle = 0

      Angle to start drawing pie in degrees.  According to orientation of canvas coordinate system: 0 = on the positive x axis -90 = on the positive y axis.  90 = on the negaive y axis.  180 or - 180 = on the negative x axis.

      - -

      $.jqplot.PieLegendRenderer

      Legend Renderer specific to pie plots.  Set by default when user creates a pie plot.

      Summary
      Properties
      numberRowsMaximum number of rows in the legend.
      numberColumnsMaximum number of columns in the legend.
      - -

      Properties

      - -

      numberRows

      this.numberRows = null

      Maximum number of rows in the legend.  0 or null for unlimited.

      - -

      numberColumns

      this.numberColumns = null

      Maximum number of columns in the legend.  0 or null for unlimited.

      - -
      - - - - - - - - - - -
      this.diameter = null
      Outer diameter of the pie, auto computed by default
      this.padding = 20
      padding between the pie and plot edges, legend, etc.
      this.sliceMargin = 0
      angular spacing between pie slices in degrees.
      this.fill = true
      true or false, wether to fil the slices.
      this.shadowOffset = 2
      offset of the shadow from the slice and offset of each succesive stroke of the shadow from the last.
      this.shadowAlpha = 0.07
      transparency of the shadow (0 = transparent, 1 = opaque)
      this.shadowDepth = 5
      number of strokes to apply to the shadow, each stroke offset shadowOffset from the last.
      this.highlightMouseOver = true
      True to highlight slice when moused over.
      this.highlightMouseDown = false
      True to highlight when a mouse button is pressed over a slice.
      this.highlightColors = []
      an array of colors to use when highlighting a slice.
      this.dataLabels = 'percent'
      Either ‘label’, ‘value’, ‘percent’ or an array of labels to place on the pie slices.
      this.showDataLabels = false
      true to show data labels on slices.
      this.dataLabelFormatString = null
      Format string for data labels.
      this.dataLabelThreshold = 3
      Threshhold in percentage (0-100) of pie area, below which no label will be displayed.
      this.dataLabelPositionFactor = 0.52
      A Multiplier (0-1) of the pie radius which controls position of label on slice.
      this.dataLabelNudge = 2
      Number of pixels to slide the label away from (+) or toward (-) the center of the pie.
      this.dataLabelCenterOn = true
      True to center the data label at its position.
      this.startAngle = 0
      Angle to start drawing pie in degrees.
      this.numberRows = null
      Maximum number of rows in the legend.
      this.numberColumns = null
      Maximum number of columns in the legend.
      - - - - - - - - \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/docs/files/plugins/jqplot-pointLabels-js.html b/libreplan-webapp/src/main/webapp/jqplot/docs/files/plugins/jqplot-pointLabels-js.html deleted file mode 100644 index 97fbe7975..000000000 --- a/libreplan-webapp/src/main/webapp/jqplot/docs/files/plugins/jqplot-pointLabels-js.html +++ /dev/null @@ -1,72 +0,0 @@ - - -$.jqplot.PointLabels - - - - - - - - - -

      Plugin for putting labels at the data points.

      To use this plugin, include the js file in your source:

      <script type="text/javascript" src="plugins/jqplot.pointLabels.js"></script>

      By default, the last value in the data ponit array in the data series is used for the label.  For most series renderers, extra data can be added to the data point arrays and the last value will be used as the label.

      For instance, this series:

      [[1,4], [3,5], [7,2]]

      Would, by default, use the y values in the labels.  Extra data can be added to the series like so:

      [[1,4,'mid'], [3 5,'hi'], [7,2,'low']]

      And now the point labels would be ‘mid’, ‘low’, and ‘hi’.

      Options to the point labels and a custom labels array can be passed into the “pointLabels” option on the series option like so:

      series:[{pointLabels:{
      -   labels:['mid', 'hi', 'low'],
      -   location:'se',
      -   ypadding: 12
      -   }
      -}]

      A custom labels array in the options takes precendence over any labels in the series data.  If you have a custom labels array in the options, but still want to use values from the series array as labels, set the “labelsFromSeries” option to true.

      By default, html entities (<, >, etc.) are escaped in point labels.  If you want to include actual html markup in the labels, set the “escapeHTML” option to false.

      Summary
      $.jqplot.PointLabelsPlugin for putting labels at the data points.
      Properties
      showshow the labels or not.
      locationcompass location where to position the label around the point.
      labelsFromSeriestrue to use labels within data point arrays.
      seriesLabelIndexarray index for location of labels within data point arrays.
      labelsarray of arrays of labels, one array for each series.
      stackedValuetrue to display value as stacked in a stacked plot.
      ypaddingvertical padding in pixels between point and label
      xpaddinghorizontal padding in pixels between point and label
      escapeHTMLtrue to escape html entities in the labels.
      edgeToleranceNumber of pixels that the label must be away from an axis boundary in order to be drawn.
      formatterA class of a formatter for the tick text.
      formatStringstring passed to the formatter.
      hideZerostrue to not show a label for a value which is 0.
      - -

      Properties

      - -

      show

      this.show = $.jqplot.config.enablePlugins

      show the labels or not.

      - -

      location

      this.location = 'n'

      compass location where to position the label around the point.  ‘n’, ‘ne’, ‘e’, ‘se’, ‘s’, ‘sw’, ‘w’, ‘nw’

      - -

      labelsFromSeries

      this.labelsFromSeries = false

      true to use labels within data point arrays.

      - -

      seriesLabelIndex

      this.seriesLabelIndex = null

      array index for location of labels within data point arrays. if null, will use the last element of the data point array.

      - -

      labels

      this.labels = []

      array of arrays of labels, one array for each series.

      - -

      stackedValue

      this.stackedValue = false

      true to display value as stacked in a stacked plot. no effect if labels is specified.

      - -

      ypadding

      this.ypadding = 6

      vertical padding in pixels between point and label

      - -

      xpadding

      this.xpadding = 6

      horizontal padding in pixels between point and label

      - -

      escapeHTML

      this.escapeHTML = true

      true to escape html entities in the labels.  If you want to include markup in the labels, set to false.

      - -

      edgeTolerance

      this.edgeTolerance = -5

      Number of pixels that the label must be away from an axis boundary in order to be drawn.  Negative values will allow overlap with the grid boundaries.

      - -

      formatter

      this.formatter = $.jqplot.DefaultTickFormatter

      A class of a formatter for the tick text.  sprintf by default.

      - -

      formatString

      this.formatString = ''

      string passed to the formatter.

      - -

      hideZeros

      this.hideZeros = false

      true to not show a label for a value which is 0.

      - -
      - - - - - - - - - - -
      this.show = $.jqplot.config.enablePlugins
      show the labels or not.
      this.location = 'n'
      compass location where to position the label around the point.
      this.labelsFromSeries = false
      true to use labels within data point arrays.
      this.seriesLabelIndex = null
      array index for location of labels within data point arrays.
      this.labels = []
      array of arrays of labels, one array for each series.
      this.stackedValue = false
      true to display value as stacked in a stacked plot.
      this.ypadding = 6
      vertical padding in pixels between point and label
      this.xpadding = 6
      horizontal padding in pixels between point and label
      this.escapeHTML = true
      true to escape html entities in the labels.
      this.edgeTolerance = -5
      Number of pixels that the label must be away from an axis boundary in order to be drawn.
      this.formatter = $.jqplot.DefaultTickFormatter
      A class of a formatter for the tick text.
      this.formatString = ''
      string passed to the formatter.
      this.hideZeros = false
      true to not show a label for a value which is 0.
      - - - - - - - - \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/docs/files/plugins/jqplot-pyramidAxisRenderer-js.html b/libreplan-webapp/src/main/webapp/jqplot/docs/files/plugins/jqplot-pyramidAxisRenderer-js.html deleted file mode 100644 index d0ad8a95f..000000000 --- a/libreplan-webapp/src/main/webapp/jqplot/docs/files/plugins/jqplot-pyramidAxisRenderer-js.html +++ /dev/null @@ -1,49 +0,0 @@ - - -/Users/chris/Sites/lib/jqplot/build/plugins/jqplot.pyramidAxisRenderer.js - - - - - - - - - -
      Summary
      jqplot.pyramidAxisRenderer.js
      Properties
      positionPosition of axis.
      drawBaselineTrue to draw the axis baseline.
      baselineWidthwidth of the baseline in pixels.
      baselineColorCSS color spec for the baseline.
      - -

      Properties

      - -

      position

      this.position = null

      Position of axis.  Values are: top, bottom , left, center, right.  By default, x and x2 axes are bottom, y axis is center.

      - -

      drawBaseline

      this.drawBaseline = true

      True to draw the axis baseline.

      - -

      baselineWidth

      this.baselineWidth = null

      width of the baseline in pixels.

      - -

      baselineColor

      this.baselineColor = null

      CSS color spec for the baseline.

      - -
      - - - - - - - - - - -
      this.position = null
      Position of axis.
      this.drawBaseline = true
      True to draw the axis baseline.
      this.baselineWidth = null
      width of the baseline in pixels.
      this.baselineColor = null
      CSS color spec for the baseline.
      - - - - - - - - \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/docs/files/plugins/jqplot-pyramidGridRenderer-js.html b/libreplan-webapp/src/main/webapp/jqplot/docs/files/plugins/jqplot-pyramidGridRenderer-js.html deleted file mode 100644 index 9b14c5ef9..000000000 --- a/libreplan-webapp/src/main/webapp/jqplot/docs/files/plugins/jqplot-pyramidGridRenderer-js.html +++ /dev/null @@ -1,39 +0,0 @@ - - -$.jqplot.CanvasGridRenderer - - - - - - - - - -

      The default jqPlot grid renderer, creating a grid on a canvas element.  The renderer has no additional options beyond the Grid class.

      - -
      - - - - - - - - - - -
      Object representing the grid on which the plot is drawn.
      - - - - - - - - \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/docs/files/plugins/jqplot-pyramidRenderer-js.html b/libreplan-webapp/src/main/webapp/jqplot/docs/files/plugins/jqplot-pyramidRenderer-js.html deleted file mode 100644 index e5b9bad93..000000000 --- a/libreplan-webapp/src/main/webapp/jqplot/docs/files/plugins/jqplot-pyramidRenderer-js.html +++ /dev/null @@ -1,53 +0,0 @@ - - -/Users/chris/Sites/lib/jqplot/build/plugins/jqplot.pyramidRenderer.js - - - - - - - - - -
      Summary
      jqplot.pyramidRenderer.js
      Properties
      barPadding
      fillTrue to fill the bars.
      highlightMouseOverTrue to highlight slice when moused over.
      highlightMouseDownTrue to highlight when a mouse button is pressed over a slice.
      highlightColorsan array of colors to use when highlighting a slice.
      offsetBarsFalse will center bars on their y value.
      - -

      Properties

      - -

      barPadding

      this.barPadding = 10
      - -

      fill

      this.fill = true

      True to fill the bars.

      - -

      highlightMouseOver

      this.highlightMouseOver = true

      True to highlight slice when moused over.  This must be false to enable highlightMouseDown to highlight when clicking on a slice.

      - -

      highlightMouseDown

      this.highlightMouseDown = false

      True to highlight when a mouse button is pressed over a slice.  This will be disabled if highlightMouseOver is true.

      - -

      highlightColors

      this.highlightColors = []

      an array of colors to use when highlighting a slice.

      - -

      offsetBars

      this.offsetBars = false

      False will center bars on their y value.  True will push bars up by 1/2 bar width to fill between their y values.  If true, there needs to be 1 more tick than there are bars.

      - -
      - - - - - - - - - - -
      this.barPadding = 10
      this.fill = true
      True to fill the bars.
      this.highlightMouseOver = true
      True to highlight slice when moused over.
      this.highlightMouseDown = false
      True to highlight when a mouse button is pressed over a slice.
      this.highlightColors = []
      an array of colors to use when highlighting a slice.
      this.offsetBars = false
      False will center bars on their y value.
      - - - - - - - - \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/docs/files/plugins/jqplot-trendline-js.html b/libreplan-webapp/src/main/webapp/jqplot/docs/files/plugins/jqplot-trendline-js.html deleted file mode 100644 index 4ef698c4e..000000000 --- a/libreplan-webapp/src/main/webapp/jqplot/docs/files/plugins/jqplot-trendline-js.html +++ /dev/null @@ -1,67 +0,0 @@ - - -$.jqplot.Trendline - - - - - - - - - -

      Plugin which will automatically compute and draw trendlines for plotted data.

      Summary
      $.jqplot.TrendlinePlugin which will automatically compute and draw trendlines for plotted data.
      Properties
      showWether or not to show the trend line.
      colorCSS color spec for the trend line.
      rendererRenderer to use to draw the trend line.
      rendererOptionsOptions to pass to the line renderer.
      labelLabel for the trend line to use in the legend.
      typeEither ‘exponential’, ‘exp’, or ‘linear’.
      shadowtrue or false, wether or not to show the shadow.
      markerRendererRenderer to use to draw markers on the line.
      lineWidthWidth of the trend line.
      shadowAngleAngle of the shadow on the trend line.
      shadowOffsetpixel offset for each stroke of the shadow.
      shadowAlphaAlpha transparency of the shadow.
      shadowDepthnumber of strokes to make of the shadow.
      - -

      Properties

      - -

      show

      this.show = $.jqplot.config.enablePlugins

      Wether or not to show the trend line.

      - -

      color

      this.color = '#666666'

      CSS color spec for the trend line.  By default this wil be the same color as the primary line.

      - -

      renderer

      this.renderer = new $.jqplot.LineRenderer()

      Renderer to use to draw the trend line.  The data series that is plotted may not be rendered as a line.  Therefore, we use our own line renderer here to draw a trend line.

      - -

      rendererOptions

      this.rendererOptions = {marker:{show:false}}

      Options to pass to the line renderer.  By default, markers are not shown on trend lines.

      - -

      label

      this.label = ''

      Label for the trend line to use in the legend.

      - -

      type

      this.type = 'linear'

      Either ‘exponential’, ‘exp’, or ‘linear’.

      - -

      shadow

      this.shadow = true

      true or false, wether or not to show the shadow.

      - -

      markerRenderer

      this.markerRenderer = {show:false}

      Renderer to use to draw markers on the line.  I think this is wrong.

      - -

      lineWidth

      this.lineWidth = 1.5

      Width of the trend line.

      - -

      shadowAngle

      this.shadowAngle = 45

      Angle of the shadow on the trend line.

      - -

      shadowOffset

      this.shadowOffset = 1.0

      pixel offset for each stroke of the shadow.

      - -

      shadowAlpha

      this.shadowAlpha = 0.07

      Alpha transparency of the shadow.

      - -

      shadowDepth

      this.shadowDepth = 3

      number of strokes to make of the shadow.

      - -
      - - - - - - - - - - -
      this.show = $.jqplot.config.enablePlugins
      Wether or not to show the trend line.
      this.color = '#666666'
      CSS color spec for the trend line.
      this.renderer = new $.jqplot.LineRenderer()
      Renderer to use to draw the trend line.
      this.rendererOptions = {marker:{show:false}}
      Options to pass to the line renderer.
      this.label = ''
      Label for the trend line to use in the legend.
      this.type = 'linear'
      Either ‘exponential’, ‘exp’, or ‘linear’.
      this.shadow = true
      true or false, wether or not to show the shadow.
      this.markerRenderer = {show:false}
      Renderer to use to draw markers on the line.
      this.lineWidth = 1.5
      Width of the trend line.
      this.shadowAngle = 45
      Angle of the shadow on the trend line.
      this.shadowOffset = 1.0
      pixel offset for each stroke of the shadow.
      this.shadowAlpha = 0.07
      Alpha transparency of the shadow.
      this.shadowDepth = 3
      number of strokes to make of the shadow.
      - - - - - - - - \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/docs/files/usage-txt.html b/libreplan-webapp/src/main/webapp/jqplot/docs/files/usage-txt.html deleted file mode 100644 index 85e724b3f..000000000 --- a/libreplan-webapp/src/main/webapp/jqplot/docs/files/usage-txt.html +++ /dev/null @@ -1,58 +0,0 @@ - - -jqPlot Usage - - - - - - - - - -

      Usage Documentation

      Introduction

      jqPlot is a jQuery plugin to generate pure client-side javascript charts in your web pages.

      The jqPlot home page is at http://www.jqplot.com/.

      The project page and downloads are at http://www.bitbucket.org/cleonello/jqplot/.

      Below are a few examples to demonstrate jqPlot usage.  These plots are shown as static images.  Many more examples of dynamically rendered plots can be seen on the test and examples pages here: ../../tests/.

      Include the Files

      jqPlot requires jQuery (1.4+ required for certain features). jQuery is included in the distribution.  To use jqPlot include jquery, the jqPlot jQuery plugin, jqPlot css file and optionally the excanvas script for IE support in your web page.  Note, excanvas is required only for IE versions below 9.  IE 9 includes native support for the canvas element and does not require excanvas:

      <!--[if lt IE 9]><script language="javascript" type="text/javascript" src="excanvas.js"></script><![endif]-->
      -<script language="javascript" type="text/javascript" src="jquery.min.js"></script>
      -<script language="javascript" type="text/javascript" src="jquery.jqplot.min.js"></script>
      -<link rel="stylesheet" type="text/css" href="jquery.jqplot.css" />

      Add a plot container

      Add a container (target) to your web page where you want your plot to show up.  Be sure to give your target a width and a height:

      <div id="chartdiv" style="height:400px;width:300px; "></div>

      Create a plot

      Then, create the actual plot by calling the $.jqplot plugin with the id of your target and some data:

      $.jqplot('chartdiv',  [[[1, 2],[3,5.12],[5,13.1],[7,33.6],[9,85.9],[11,219.9]]]);

      Which will produce a chart like:

      Plot Options

      You can customize the plot by passing options to the $.jqplot function.  Options are described in jqPlot Options in the jqPlotOptions.txt file.  An example of options usage:

      $.jqplot('chartdiv',  [[[1, 2],[3,5.12],[5,13.1],[7,33.6],[9,85.9],[11,219.9]]],
      -{ title:'Exponential Line',
      -  axes:{yaxis:{min:-10, max:240}},
      -  series:[{color:'#5FAB78'}]
      -});

      Which will produce a plot like:

      Using Plugins

      You can use jqPlot plugins (that is, plugins to the jqPlot plugin) by including them in your html after you include the jqPlot plugin.  Here is how to include the log axis plugin:

      <link rel="stylesheet" type="text/css" href="jquery.jqplot.css" />
      -<!--[if IE]><script language="javascript" type="text/javascript" src="excanvas.js"></script><![endif]-->
      -<script language="javascript" type="text/javascript" src="jquery.min.js"></script>
      -<script language="javascript" type="text/javascript" src="jquery.jqplot.min.js"></script>
      -<script language="javascript" type="text/javascript" src="jqplot.logAxisRenderer.js"></script>

      Important note: For jqplot builds r529 and above (0.9.7r529 and higher), you must explicitly enable plugins via either the { show: true } plugin option to the plot or by using the $.jqplot.config.enablePlugins = true; config options set on the page before plot creation.  Only plugins that can be immediately active upon loading are affected.  This includes non-renderer plugins like cursor, dragable, highlighter, and trendline.

      Here is a the same $.jqplot call but with a log y axis:

      $.jqplot('chartdiv',  [[[1, 2],[3,5.12],[5,13.1],[7,33.6],[9,85.9],[11,219.9]]],
      -{ title:'Exponential Line',
      -  axes:{yaxis:{renderer: $.jqplot.LogAxisRenderer}},
      -  series:[{color:'#5FAB78'}]
      -});

      Which produces a plot like:

      You can further customize with options specific to the log axis plugin:

      $.jqplot('chartdiv',  [[[1, 2],[3,5.12],[5,13.1],[7,33.6],[9,85.9],[11,219.9]]],
      -{ title:'Exponential Line',
      -  axes:{yaxis:{renderer: $.jqplot.LogAxisRenderer, tickDistribution:'power'}},
      -  series:[{color:'#5FAB78'}]
      -});

      Which makes a plot like:

      For a full list of options, see jqPlot Options in the jqPlotOptions.txt file.

      You can add as many plugins as you wish.  Order is generally not important.  Some plugins, like the highlighter plugin which highlights data points near the mouse, don’t need any extra options or setup to function.  Highlighter does have additional options which the user can set.

      Other plugins, the barRenderer for example, provide functionality the must be specified in the chart options object.  To render a series as a bar graph with the bar renderer, you would first include the plugin after jqPlot:

      <script language="javascript" type="text/javascript" src="plugins/jqplot.barRenderer.min.js"></script>

      Then you would create a chart like:

      $.jqplot('chartdiv',  [[34.53, 56.32, 25.1, 18.6]], {series:[{renderer:$.jqplot.BarRenderer}]});

      Here the default LineRenderer is replaced by a BarRenderer to generate a bar graph for the first (an only) series.

      - -
      - - - - - - - - - - -
      This document is out of date.
      - - - - - - - - \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/docs/index.html b/libreplan-webapp/src/main/webapp/jqplot/docs/index.html deleted file mode 100644 index 295fd4a6f..000000000 --- a/libreplan-webapp/src/main/webapp/jqplot/docs/index.html +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/docs/index/Classes.html b/libreplan-webapp/src/main/webapp/jqplot/docs/index/Classes.html deleted file mode 100644 index adb55b1d2..000000000 --- a/libreplan-webapp/src/main/webapp/jqplot/docs/index/Classes.html +++ /dev/null @@ -1,70 +0,0 @@ - - -Class Index - - - - - - - - - -
      Class Index
      $#! · 0-9 · A · B · C · D · E · F · G · H · I · J · K · L · M · N · O · P · Q · R · S · T · U · V · W · X · Y · Z
      $#!
       $.fn
       $.jqplot
       $.jqplot.AxisLabelRenderer
       $.jqplot.AxisTickRenderer
       $.jqplot.BarRenderer
       $.jqplot.BezierCurveRenderer.js
       $.jqplot.BlockRenderer
       $.jqplot.BubbleRenderer
       $.jqplot.CanvasAxisLabelRenderer
       $.jqplot.CanvasAxisTickRenderer
       $.jqplot.CanvasGridRenderer
       $.jqplot.CanvasOverlay
       $.jqplot.CategoryAxisRenderer
       $.jqplot.ciParser
       $.jqplot.Cursor
       $.jqplot.DateAxisRenderer
       $.jqplot.DivTitleRenderer
       $.jqplot.DonutLegendRenderer
       $.jqplot.DonutRenderer
       $.jqplot.Dragable
       $.jqplot.FunnelLegendRenderer
       $.jqplot.FunnelRenderer
       $.jqplot.Highlighter
       $.jqplot.LinearAxisRenderer
       $.jqplot.LineRenderer
       $.jqplot.LogAxisRenderer
       $.jqplot.MarkerRenderer
       $.jqplot.MekkoAxisRenderer
       $.jqplot.MekkoLegendRenderer
       $.jqplot.MekkoRenderer
       $.jqplot.MeterGaugeRenderer
       $.jqplot.OHLCRenderer
       $.jqplot.PieLegendRenderer
       $.jqplot.PieRenderer
       $.jqplot.PointLabels
       $.jqplot.shadowRenderer
       $.jqplot.shapeRenderer
       $.jqplot.ThemeEngine
       $.jqplot.Trendline
      A
       Axis
      D
       DashedHorizontalLine
       DashedVerticalLine
      G
       Grid
      H
       HorizontalLine
      J
       jqPlot
      L
       Legend
       Line
      S
       Series
      T
       Title
      V
       VerticalLine
      - -
      jQuery namespace to attach functions to jQuery elements.
      jQuery function called by the user to create a plot.
      Renderer to place labels on the axes.
      A “tick” object showing the value of a tick/gridline on the plot.
      A plugin renderer for jqPlot to draw a bar plot.
      Renderer which draws lines as stacked bezier curves.
      Plugin renderer to draw a x-y block chart.
      Plugin renderer to draw a bubble chart.
      Renderer to draw axis labels with a canvas element to support advanced featrues such as rotated text.
      Renderer to draw axis ticks with a canvas element to support advanced featrues such as rotated text.
      The default jqPlot grid renderer, creating a grid on a canvas element.
      A plugin for jqPlot to render a category style axis, with equal pixel spacing between y data values of a series.
      Data Renderer function which converts a custom JSON data object into jqPlot data format.
      Plugin class representing the cursor as displayed on the plot.
      A plugin for a jqPlot to render an axis as a series of date values.
      The default title renderer for jqPlot.
      Legend Renderer specific to donut plots.
      Plugin renderer to draw a donut chart.
      Plugin to make plotted points dragable by the user.
      Legend Renderer specific to funnel plots.
      Plugin renderer to draw a funnel chart.
      Plugin which will highlight data points when they are moused over.
      The default jqPlot axis renderer, creating a numeric axis.
      The default line renderer for jqPlot, this class has no options beyond the Series class.
      A plugin for a jqPlot to render a logarithmic axis.
      The default jqPlot marker renderer, rendering the points on the line.
      An axis renderer for a Mekko chart.
      Legend renderer used by mekko charts with options for controlling number or rows and columns as well as placement outside of plot area.
      Draws a Mekko style chart which shows 3 dimensional data on a 2 dimensional graph.
      Plugin renderer to draw a meter gauge chart.
      jqPlot Plugin to draw Open Hi Low Close, Candlestick and Hi Low Close charts.
      Legend Renderer specific to pie plots.
      Plugin renderer to draw a pie chart.
      Plugin for putting labels at the data points.
      The default jqPlot shadow renderer, rendering shadows behind shapes.
      The default jqPlot shape renderer.
      Theme Engine provides a programatic way to change some of the more common jqplot styling options such as fonts, colors and grid options.
      Plugin which will automatically compute and draw trendlines for plotted data.
      - - - -
      An individual axis object.
      - - - -
      A straight dashed horizontal line.
      A straight dashed vertical line.
      - - - -
      Object representing the grid on which the plot is drawn.
      - - - -
      A straight horizontal line.
      - - - -
      Plot object returned by call to $.jqplot.
      - - - -
      Legend object.
      A straight line.
      - - - -
      An individual data series object.
      - - - -
      Plot Title object.
      - - - -
      A straight vertical line.
      - -
      - - - - - - - - - - - - \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/docs/index/Files.html b/libreplan-webapp/src/main/webapp/jqplot/docs/index/Files.html deleted file mode 100644 index 93258a017..000000000 --- a/libreplan-webapp/src/main/webapp/jqplot/docs/index/Files.html +++ /dev/null @@ -1,34 +0,0 @@ - - -File Index - - - - - - - - - -
      File Index
      $#! · 0-9 · A · B · C · D · E · F · G · H · I · J · K · L · M · N · O · P · Q · R · S · T · U · V · W · X · Y · Z
      J
       jqplot.enhancedLegendRenderer.js
       jqplot.pyramidAxisRenderer.js
       jqplot.pyramidRenderer.js
      - - - -
      - - - - - - - - - - - - \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/docs/index/Functions.html b/libreplan-webapp/src/main/webapp/jqplot/docs/index/Functions.html deleted file mode 100644 index e55ee282e..000000000 --- a/libreplan-webapp/src/main/webapp/jqplot/docs/index/Functions.html +++ /dev/null @@ -1,66 +0,0 @@ - - -Function Index - - - - - - - - - -
      Function Index
      $#! · 0-9 · A · B · C · D · E · F · G · H · I · J · K · L · M · N · O · P · Q · R · S · T · U · V · W · X · Y · Z
      C
       copy, $.jqplot.ThemeEngine
      D
       destroy, jqPlot
       draw
       drawSeries, jqPlot
      G
       get, $.jqplot.ThemeEngine
       getThemeNames, $.jqplot.ThemeEngine
       getThemes, $.jqplot.ThemeEngine
      I
       init, jqPlot
      M
       makeGridData
       moveBlock, $.jqplot.BlockRenderer
       moveSeriesToBack, jqPlot
       moveSeriesToFront, jqPlot
      N
       newTheme, $.jqplot.ThemeEngine
      R
       redraw, jqPlot
       reInitialize, jqPlot
       remove, $.jqplot.ThemeEngine
       rename, $.jqplot.ThemeEngine
       replot, jqPlot
       resetAxesScale, jqPlot
       restoreOriginalSeriesOrder, jqPlot
       restorePreviousSeriesOrder, jqPlot
      S
       setGridData
      Z
       zoomProxy, $.jqplot.Cursor.$.jqplot.Cursor
      - -
      $.jqplot.ThemeEngine.prototype.copy = function (sourceName,
      targetName,
      obj)
      Create a copy of an existing theme in the themeEngine, adding it the themeEngine.
      - - - -
      this.destroy = function()
      Releases all resources occupied by the plot
      $.jqplot.ShadowRenderer.prototype.draw = function(ctx,
      points,
      options)
      draws an transparent black (i.e.
      $.jqplot.ShapeRenderer.prototype.draw = function(ctx,
      points,
      options)
      draws the shape.
      this.draw = function()
      Draws all elements of the plot into the container.
      this.drawSeries = function(options,
      idx)
      Redraws all or just one series on the plot.
      - - - -
      $.jqplot.ThemeEngine.prototype.get = function(name)
      Get and return the named theme or the active theme if no name given.
      $.jqplot.ThemeEngine.prototype.getThemeNames = function()
      Return the list of theme names in this manager in alpha-numerical order.
      $.jqplot.ThemeEngine.prototype.getThemes = function()
      Return a list of themes in alpha-numerical order by name.
      - - - -
      this.init = function(target,
      data,
      options)
      sets the plot target, checks data and applies user options to plot.
      - - - -
      $.jqplot.BezierCurveRenderer.prototype.makeGridData = function(data,
      plot)
      converts any arbitrary data values to grid coordinates and returns them.
      $.jqplot.MekkoRenderer.prototype.makeGridData = function(data,
      plot)
      converts any arbitrary data values to grid coordinates and returns them.
      this.moveBlock = function (idx,
      x,
      y,
      duration)
      Moves an individual block.
      this.moveSeriesToBack = function (idx)
      This method requires jQuery 1.4+ Moves the specified series canvas behind all other series canvases.
      this.moveSeriesToFront = function (idx)
      This method requires jQuery 1.4+ Moves the specified series canvas in front of all other series canvases.
      - - - -
      $.jqplot.ThemeEngine.prototype.newTheme = function(name,
      obj)
      Create a new theme based on the default theme, adding it the themeEngine.
      - - - -
      this.redraw = function(clear)
      Empties the plot target div and redraws the plot.
      this.reInitialize = function ()
      reinitialize plot for replotting.
      $.jqplot.ThemeEngine.prototype.remove = function(name)
      Remove the given theme from the themeEngine.
      $.jqplot.ThemeEngine.prototype.rename = function (oldName,
      newName)
      Rename a theme.
      this.replot = function(options)
      Does a reinitialization of the plot followed by a redraw.
      this.resetAxesScale = function(axes,
      options)
      Reset the specified axes min, max, numberTicks and tickInterval properties to null or reset these properties on all axes if no list of axes is provided.
      this.restoreOriginalSeriesOrder = function ()
      This method requires jQuery 1.4+ Restore the series canvas order to its original order when the plot was created.
      this.restorePreviousSeriesOrder = function ()
      This method requires jQuery 1.4+ Restore the series canvas order to its previous state.
      - - - -
      $.jqplot.BezierCurveRenderer.prototype.setGridData = function(plot)
      converts the user data values to grid coordinates and stores them in the gridData array.
      $.jqplot.MekkoRenderer.prototype.setGridData = function(plot)
      converts the user data values to grid coordinates and stores them in the gridData array.
      - - - -
      $.jqplot.Cursor.zoomProxy = function(targetPlot,
      controllerPlot)
      links targetPlot to controllerPlot so that plot zooming of targetPlot will be controlled by zooming on the controllerPlot.
      - -
      - - - - - - - - - - - - \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/docs/index/General.html b/libreplan-webapp/src/main/webapp/jqplot/docs/index/General.html deleted file mode 100644 index b689ef3a7..000000000 --- a/libreplan-webapp/src/main/webapp/jqplot/docs/index/General.html +++ /dev/null @@ -1,42 +0,0 @@ - - -Index - - - - - - - - - -
      Index
      $#! · 0-9 · A · B · C · D · E · F · G · H · I · J · K · L · M · N · O · P · Q · R · S · T · U · V · W · X · Y · Z
      $#!
       $.fn
       $.jqplot
       $.jqplot.AxisLabelRenderer
       $.jqplot.AxisTickRenderer
       $.jqplot.BarRenderer
       $.jqplot.BezierCurveRenderer.js
       $.jqplot.BlockRenderer
       $.jqplot.BubbleRenderer
       $.jqplot.CanvasAxisLabelRenderer
       $.jqplot.CanvasAxisTickRenderer
       $.jqplot.CanvasGridRenderer
       $.jqplot.CanvasOverlay
       $.jqplot.CategoryAxisRenderer
       $.jqplot.ciParser
       $.jqplot.Cursor
       $.jqplot.DateAxisRenderer
       $.jqplot.DivTitleRenderer
       $.jqplot.DonutLegendRenderer
       $.jqplot.DonutRenderer
       $.jqplot.Dragable
       $.jqplot.FunnelLegendRenderer
       $.jqplot.FunnelRenderer
       $.jqplot.Highlighter
       $.jqplot.LinearAxisRenderer
       $.jqplot.LineRenderer
       $.jqplot.LogAxisRenderer
       $.jqplot.MarkerRenderer
       $.jqplot.MekkoAxisRenderer
       $.jqplot.MekkoLegendRenderer
       $.jqplot.MekkoRenderer
       $.jqplot.MeterGaugeRenderer
       $.jqplot.OHLCRenderer
       $.jqplot.PieLegendRenderer
       $.jqplot.PieRenderer
       $.jqplot.PointLabels
       $.jqplot.shadowRenderer
       $.jqplot.shapeRenderer
       $.jqplot.ThemeEngine
       $.jqplot.Trendline
      A
       activeTheme, $.jqplot.ThemeEngine
       addLegendRowHooks, $.jqplot.$.jqplot
       alignTicks, $.jqplot.LinearAxisRenderer
       alpha, $.jqplot.shadowRenderer
       angle
       animate, jqPlot
       animateReplot, jqPlot
       autoscale, Axis
       autoscaleBubbles, $.jqplot.BubbleRenderer
       autoscaleMultiplier, $.jqplot.BubbleRenderer
       autoscalePointsFactor, $.jqplot.BubbleRenderer
       Available Options
       axes, jqPlot
       axesDefaults, jqPlot
       Axis
       axisDefaults, $.jqplot.LogAxisRenderer
      B
       background
       bandData, $.jqplot.LineRenderer
       bands, $.jqplot.LineRenderer
       barDirection, $.jqplot.BarRenderer
       barLabelOptions, $.jqplot.MekkoAxisRenderer
       barLabelRenderer, $.jqplot.MekkoAxisRenderer
       barLabels, $.jqplot.MekkoAxisRenderer
       barMargin, $.jqplot.BarRenderer
       barPadding
       barWidth, $.jqplot.BarRenderer
       baselineColor
       baselineWidth
       bodyWidth, $.jqplot.OHLCRenderer
       border, Legend
       borderColor
       borderWidth
       breakOnNull, Series
       breakPoints, $.jqplot.LinearAxisRenderer
       breakTickLabel, $.jqplot.LinearAxisRenderer
       bringSeriesToFront, $.jqplot.Highlighter
       bubbleAlpha, $.jqplot.BubbleRenderer
       bubbleGradients, $.jqplot.BubbleRenderer
      - -
      jQuery namespace to attach functions to jQuery elements.
      jQuery function called by the user to create a plot.
      Renderer to place labels on the axes.
      A “tick” object showing the value of a tick/gridline on the plot.
      A plugin renderer for jqPlot to draw a bar plot.
      Renderer which draws lines as stacked bezier curves.
      Plugin renderer to draw a x-y block chart.
      Plugin renderer to draw a bubble chart.
      Renderer to draw axis labels with a canvas element to support advanced featrues such as rotated text.
      Renderer to draw axis ticks with a canvas element to support advanced featrues such as rotated text.
      The default jqPlot grid renderer, creating a grid on a canvas element.
      A plugin for jqPlot to render a category style axis, with equal pixel spacing between y data values of a series.
      Data Renderer function which converts a custom JSON data object into jqPlot data format.
      Plugin class representing the cursor as displayed on the plot.
      A plugin for a jqPlot to render an axis as a series of date values.
      The default title renderer for jqPlot.
      Legend Renderer specific to donut plots.
      Plugin renderer to draw a donut chart.
      Plugin to make plotted points dragable by the user.
      Legend Renderer specific to funnel plots.
      Plugin renderer to draw a funnel chart.
      Plugin which will highlight data points when they are moused over.
      The default jqPlot axis renderer, creating a numeric axis.
      The default line renderer for jqPlot, this class has no options beyond the Series class.
      A plugin for a jqPlot to render a logarithmic axis.
      The default jqPlot marker renderer, rendering the points on the line.
      An axis renderer for a Mekko chart.
      Legend renderer used by mekko charts with options for controlling number or rows and columns as well as placement outside of plot area.
      Draws a Mekko style chart which shows 3 dimensional data on a 2 dimensional graph.
      Plugin renderer to draw a meter gauge chart.
      jqPlot Plugin to draw Open Hi Low Close, Candlestick and Hi Low Close charts.
      Legend Renderer specific to pie plots.
      Plugin renderer to draw a pie chart.
      Plugin for putting labels at the data points.
      The default jqPlot shadow renderer, rendering shadows behind shapes.
      The default jqPlot shape renderer.
      Theme Engine provides a programatic way to change some of the more common jqplot styling options such as fonts, colors and grid options.
      Plugin which will automatically compute and draw trendlines for plotted data.
      - - - -
      this.activeTheme=null
      Pointer to currently active theme
      called at the end of legend draw, so plugins can add rows to the legend table.
      this.alignTicks = false
      true to align tick marks across opposed axes such as from the y2axis to yaxis.
      this.alpha = 0.07
      alpha transparency of shadow stroke.
      this.angle = 0
      angle of text, measured clockwise from x axis.
      this.angle = 0
      angle of text, measured clockwise from x axis.
      this.angle = 45
      Angle of the shadow in degrees.
      this.animate = false
      True to animate the series on initial plot draw (renderer dependent).
      this.animateReplot = false
      True to animate series after a call to the replot() method.
      this.autoscale = false
      DEPRECATED the default scaling algorithm produces superior results.
      this.autoscaleBubbles = true
      True to scale the bubble radius based on plot size.
      this.autoscaleMultiplier = 1.0
      Multiplier the bubble size if autoscaleBubbles is true.
      this.autoscalePointsFactor = -0.07
      Factor which decreases bubble size based on how many bubbles on on the chart.
      See jqPlot Options for a list of options available thorugh the options object (not complete yet!)
      this.axes = {xaxis: new Axis('xaxis'), yaxis: new Axis('yaxis'), x2axis: new Axis('x2axis'), y2axis: new Axis('y2axis'), y3axis: new Axis('y3axis'), y4axis: new Axis('y4axis'), y5axis: new Axis('y5axis'), y6axis: new Axis('y6axis'), y7axis: new Axis('y7axis'), y8axis: new Axis('y8axis'), y9axis: new Axis('y9axis'), yMidAxis: new Axis('yMidAxis')}
      up to 4 axes are supported, each with it’s own options, See Axis for axis specific options.
      default options that will be applied to all axes.
      An individual axis object.
      Default properties which will be applied directly to the series.
      - - - -
      this.background = "#efefef"
      background color of the inside of the gauge.
      this.background = '#fffdf6'
      css spec for the background color.
      this.background
      css spec for the background of the legend box.
      this.renderer.bandData = []
      Data used to draw error bands or confidence intervals above/below a line.
      Banding around line, e.g error bands or confidence intervals.
      this.barDirection = 'vertical'
      ‘vertical’ = up and down bars, ‘horizontal’ = side to side bars
      this.barLabelOptions = {}
      options object to pass to the bar label renderer.
      this.barLabelRenderer = $.jqplot.AxisLabelRenderer
      renderer to use to draw labels under each bar.
      this.barLabels = this.barLabels || []
      array of labels to put under each bar.
      this.barMargin = 10
      Number of pixels between groups of bars at adjacent axis values.
      this.barPadding = 10
      this.barPadding = 8
      Number of pixels between adjacent bars at the same axis value.
      this.barWidth = null
      Width of the bar in pixels (auto by devaul).
      this.baselineColor = null
      CSS color spec for the baseline.
      this.baselineColor = null
      CSS color spec for the baseline.
      this.baselineColor = null
      CSS color spec for the baseline.
      this.baselineWidth = null
      width of the baseline in pixels.
      this.baselineWidth = null
      width of the baseline in pixels.
      this.baselineWidth = null
      width of the baseline in pixels.
      this.bodyWidth = 'auto'
      width of the candlestick body in pixels.
      this.border
      css spec for the border around the legend box.
      this.borderColor = null
      color of the borders between areas on the chart
      this.borderColor = null
      color of the border adjacent to the axis.
      this.borderColor = '#999999'
      css spec for the color of the grid border.
      this.borderWidth = null
      width of line stroked at the border of the axis.
      this.borderWidth = 2.0
      width of the border in pixels.
      this.breakOnNull = false
      Wether line segments should be be broken at null value.
      this.breakPoints = null
      EXPERIMENTAL!! 
      this.breakTickLabel = "&asymp
      Label to use at the axis break if breakPoints are specified.
      this.bringSeriesToFront = false
      This option requires jQuery 1.4+ True to bring the series of the highlighted point to the front of other series.
      this.bubbleAlpha = 1.0
      Alpha transparency to apply to all bubbles in this series.
      this.bubbleGradients = false
      True to color the bubbles with gradient fills instead of flat colors.
      - -
      - - - - - - - - - - - - \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/docs/index/General2.html b/libreplan-webapp/src/main/webapp/jqplot/docs/index/General2.html deleted file mode 100644 index 9c3162131..000000000 --- a/libreplan-webapp/src/main/webapp/jqplot/docs/index/General2.html +++ /dev/null @@ -1,42 +0,0 @@ - - -Index - - - - - - - - - -
      Index
      $#! · 0-9 · A · B · C · D · E · F · G · H · I · J · K · L · M · N · O · P · Q · R · S · T · U · V · W · X · Y · Z
      C
       candleStick, $.jqplot.OHLCRenderer
       Change Log
       Changes
       clearRect, $.jqplot.shapeRenderer
       clickReset, $.jqplot.Cursor
       closeColor, $.jqplot.OHLCRenderer
       color
       constrainOutsideZoom, $.jqplot.Cursor
       constrainSmoothing, $.jqplot.LineRenderer
       constrainTo, $.jqplot.Dragable
       constrainZoomTo, $.jqplot.Cursor
       copy, $.jqplot.ThemeEngine
       Copyright&License
       css, $.jqplot.BlockRenderer
       cursorLegendFormatString, $.jqplot.Cursor
      D
       DashedHorizontalLine
       DashedVerticalLine
       dashPattern
       data, jqPlot
       dataLabelCenterOn, $.jqplot.PieRenderer
       dataLabelFormatString
       dataLabelNudge
       dataLabelPositionFactor
       dataLabels
       dataLabelThreshold
       dataRenderer, jqPlot
       dataRendererOptions, jqPlot
       dblClickReset, $.jqplot.Cursor
       defaultAxisStart, jqPlot
       depth, $.jqplot.shadowRenderer
       destroy, jqPlot
       diameter
       disableIEFading
       disableStack, Series
       downBodyColor, $.jqplot.OHLCRenderer
       draw
       drawBaseline
       drawBorder, Grid
       drawGridlines, Grid
       drawMajorGridlines, Axis
       drawMajorTickMarks, Axis
       drawMinorGridlines, Axis
       drawMinorTickMarks, Axis
       drawSeries, jqPlot
      E
       edgeTolerance, $.jqplot.PointLabels
       enableFontSupport
       escapeHtml
       escapeHTML
       eventListenerHooks, $.jqplot.$.jqplot
      - -
      this.candleStick = false
      true to render chart as candleStick.
      See Change Log
      this.clearRect = false
      true to cear a rectangle.
      this.clickReset = false
      Will reset plot zoom if single click on plot without drag.
      this.closeColor = null
      color of the close price tick mark.
      color of the line
      this.color
      CSS color spec for the dragged point (and adjacent line segment or bar).
      color of lines at top and bottom of bands [default: series color].
      this.color = '#666666'
      color of marker.
      this.color = '#666666'
      CSS color spec for the trend line.
      this.color
      css color spec for the series
      this.constrainOutsideZoom = true
      True to limit actual zoom area to edges of grid, even when zooming outside of plot area.
      this.renderer.constrainSmoothing = true
      True to use a more accurate smoothing algorithm that will not overshoot any data points.
      this.constrainTo = 'none'
      Constrain dragging motion to an axis or to none.
      this.constrainZoomTo = 'none'
      ‘none’, ‘x’ or ‘y’
      $.jqplot.ThemeEngine.prototype.copy = function (sourceName,
      targetName,
      obj)
      Create a copy of an existing theme in the themeEngine, adding it the themeEngine.
      Copyright © 2009-2011 Chris Leonello jqPlot is currently available for use in all personal or commercial projects under both the MIT and GPL version 2.0 licenses.
      this.css = {padding:'2px', border:'1px solid #999', textAlign:'center'}
      default css styles that will be applied to all data blocks.
      this.cursorLegendFormatString = $.jqplot.Cursor.cursorLegendFormatString
      Format string used in the cursor legend.
      - - - -
      A straight dashed horizontal line.
      A straight dashed vertical line.
      dashPattern: [8,8] }
      Array of line, space settings in pixels.
      dashPattern: [8,8] }
      Array of line, space settings in pixels.
      this.data = []
      user’s data.
      this.dataLabelCenterOn = true
      True to center the data label at its position.
      this.dataLabelFormatString = null
      Format string for data labels.
      this.dataLabelFormatString = null
      Format string for data labels.
      this.dataLabelFormatString = null
      Format string for data labels.
      this.dataLabelNudge = 0
      Number of pixels to slide the label away from (+) or toward (-) the center of the pie.
      this.dataLabelNudge = 2
      Number of pixels to slide the label away from (+) or toward (-) the center of the pie.
      this.dataLabelPositionFactor = 0.4
      A Multiplier (0-1) of the pie radius which controls position of label on slice.
      this.dataLabelPositionFactor = 0.52
      A Multiplier (0-1) of the pie radius which controls position of label on slice.
      this.dataLabels = 'percent'
      Either ‘label’, ‘value’, ‘percent’ or an array of labels to place on the pie slices.
      this.dataLabels = 'percent'
      Either ‘label’, ‘value’, ‘percent’ or an array of labels to place on the pie slices.
      this.dataLabels = 'percent'
      Either ‘label’, ‘value’, ‘percent’ or an array of labels to place on the pie slices.
      this.dataLabelThreshold = 3
      this.dataLabelThreshold = 3
      this.dataLabelThreshold = 3
      Threshhold in percentage (0-100) of pie area, below which no label will be displayed.
      this.dataRenderer
      A callable which can be used to preprocess data passed into the plot.
      this.dataRendererOptions
      Options that will be passed to the dataRenderer.
      this.dblClickReset = true
      Will reset plot zoom if double click on plot without drag.
      this.defaultAxisStart = 1
      1-D data series are internally converted into 2-D [x,y] data point arrays by jqPlot.
      this.depth = 3
      how many times the shadow is stroked.
      this.destroy = function()
      Releases all resources occupied by the plot
      this.diameter = null
      Outer diameter of the donut, auto computed by default
      this.diameter = null
      Outer diameter of the meterGauge, auto computed by default
      this.diameter = null
      Outer diameter of the pie, auto computed by default
      this.disableIEFading = true
      true to toggle series with a show/hide method only and not allow fading in/out.
      this.disableStack = false
      true to not stack this series with other series in the plot.
      this.downBodyColor = null
      Color of candlestick body on a “down” day.
      $.jqplot.ShadowRenderer.prototype.draw = function(ctx,
      points,
      options)
      draws an transparent black (i.e.
      $.jqplot.ShapeRenderer.prototype.draw = function(ctx,
      points,
      options)
      draws the shape.
      this.draw = function()
      Draws all elements of the plot into the container.
      this.drawBaseline = true
      True to draw the axis baseline.
      this.drawBaseline = true
      True to draw the axis baseline.
      this.drawBaseline = true
      True to draw the axis baseline.
      this.drawBaseline = true
      True to draw the axis baseline.
      this.drawBorder = true
      True to draw border around grid.
      this.drawGridlines = true
      wether to draw the gridlines on the plot.
      this.drawMajorGridlines = true
      True to draw gridlines for major axis ticks.
      this.drawMajorTickMarks = true
      True to draw tick marks for major axis ticks.
      this.drawMinorGridlines = false
      True to draw gridlines for minor ticks.
      this.drawMinorTickMarks = true
      True to draw tick marks for minor ticks.
      this.drawSeries = function(options,
      idx)
      Redraws all or just one series on the plot.
      - - - -
      this.edgeTolerance = -5
      Number of pixels that the label must be away from an axis boundary in order to be drawn.
      this.enableFontSupport = true
      true to turn on native canvas font support in Mozilla 3.5+ and Safari 4+.
      this.enableFontSupport = true
      true to turn on native canvas font support in Mozilla 3.5+ and Safari 4+.
      this.escapeHtml = false
      true to escape html in the box label.
      this.escapeHtml = true
      True to escape html in bubble label text.
      this.escapeHtml = false
      True to escape special characters with their html entity equivalents in legend text.
      this.escapeHtml = false
      True to escape special characters with their html entity equivalents in title text.
      this.escapeHTML = false
      true to escape HTML entities in the label.
      this.escapeHTML = false
      true to escape HTML entities in the label.
      this.escapeHTML = true
      true to escape html entities in the labels.
      called at the end of plot drawing, binds listeners to the event canvas which lays on top of the grid area.
      - -
      - - - - - - - - - - - - \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/docs/index/General3.html b/libreplan-webapp/src/main/webapp/jqplot/docs/index/General3.html deleted file mode 100644 index 1f929be03..000000000 --- a/libreplan-webapp/src/main/webapp/jqplot/docs/index/General3.html +++ /dev/null @@ -1,42 +0,0 @@ - - -Index - - - - - - - - - -
      Index
      $#! · 0-9 · A · B · C · D · E · F · G · H · I · J · K · L · M · N · O · P · Q · R · S · T · U · V · W · X · Y · Z
      F
       fadeTooltip
       fill
       fillAlpha, Series
       fillAndStroke, Series
       fillAxis, Series
       fillBetween, jqPlot
       fillColor
       fillDownBody, $.jqplot.OHLCRenderer
       fillRect, $.jqplot.shapeRenderer
       fillStyle, $.jqplot.shapeRenderer
       fillToValue, Series
       fillToZero, Series
       fillUpBody, $.jqplot.OHLCRenderer
       followMouse, $.jqplot.Cursor
       fontFamily
       fontSize
       fontStretch
       fontWeight
       forceTickAt0, $.jqplot.LinearAxisRenderer
       forceTickAt100, $.jqplot.LinearAxisRenderer
       formatString
       formatter
       Functions
      G
       get, $.jqplot.ThemeEngine
       getThemeNames, $.jqplot.ThemeEngine
       getThemes, $.jqplot.ThemeEngine
       GPL Version 2
       grid, jqPlot
       Grid
       gridLineColor, Grid
       gridLineWidth, Grid
       groups, $.jqplot.BarRenderer
      H
       hideZeros, $.jqplot.PointLabels
       highlightAlpha, $.jqplot.BubbleRenderer
       highlightColor, $.jqplot.LineRenderer
       highlightColors
       highlightMouseDown
       highlightMouseOver
       hlc, $.jqplot.OHLCRenderer
       Hooks, $.jqplot
       HorizontalLine
       hubRadius, $.jqplot.MeterGaugeRenderer
      - -
      true = fade in/out tooltip, flase = show/hide tooltip
      this.fadeTooltip = true
      true = fade in/out tooltip, flase = show/hide tooltip
      this.fill = true
      True to fill the bars.
      this.fill = true
      true or false, wether to fil the slices.
      this.fill = true
      true or false, wether to fill the areas.
      True to fill area between bands [default: true].
      this.fill = true
      true or false, wether to fil the slices.
      this.fill = false
      whether to fill the shape.
      this.fill = false
      whether to fill the shape.
      this.fill = false
      true or false, wether to fill under lines or in bars.
      this.fillAlpha
      Alpha transparency to apply to the fill under the line.
      this.fillAndStroke = false
      If true will stroke the line (with color this.color) as well as fill under it.
      this.fillAxis = 'y'
      Either ‘x’ or ‘y’.
      this.fillBetween = { series1: null, series2: null, color: null, baseSeries: 0, fill: true }
      Fill between 2 line series in a plot.
      css color spec for filled area.
      this.fillColor
      CSS color spec to use for fill under line.
      this.fillDownBody = true
      true to render a “down” day (close price lower than open price) with a filled candlestick body.
      this.fillRect = false
      true to draw shape as a filled rectangle.
      this.fillStyle = '#999999'
      css color spec for the fill style.
      this.fillToValue = 0
      fill a filled series to this value on the fill axis.
      this.fillToZero = false
      true will force bar and filled series to fill toward zero on the fill Axis.
      this.fillUpBody = false
      true to render an “up” day (close price greater than open price) with a filled candlestick body.
      this.followMouse = false
      Tooltip follows the mouse, it is not at a fixed location.
      this.fontFamily
      css spec for the font-family css attribute.
      this.fontFamily = '"Trebuchet MS", Arial, Helvetica, sans-serif'
      CSS spec for the font-family css attribute.
      this.fontFamily = '"Trebuchet MS", Arial, Helvetica, sans-serif'
      css spec for the font-family css attribute.
      this.fontFamily
      css font-family spec for the legend text.
      this.fontFamily
      css font-family spec for the text.
      this.fontSize
      css spec for the font-size css attribute.
      this.fontSize = '11pt'
      CSS spec for font size.
      this.fontSize = '10pt'
      CSS spec for font size.
      this.fontSize
      css spec for the font-size attribute.
      this.fontSize
      css font-size spec for the legend text.
      this.fontSize
      css font-size spec for the text.
      this.fontStretch = 1.0
      Multiplier to condense or expand font width.
      this.fontStretch = 1.0
      Multiplier to condense or expand font width.
      this.fontWeight = 'normal'
      this.fontWeight = 'normal'
      CSS spec for fontWeight
      this.forceTickAt0 = false
      This will ensure that there is always a tick mark at 0.
      this.forceTickAt100 = false
      This will ensure that there is always a tick mark at 100.
      this.formatString = ''
      string passed to the formatter.
      this.formatString = ''
      string passed to the formatter.
      this.formatString = null
      alternative to tooltipFormatString will format the whole tooltip text, populating with x, y values as indicated by tooltipAxes option.
      this.formatString = ''
      string passed to the formatter.
      this.formatter = $.jqplot.DefaultTickFormatter
      A class of a formatter for the tick text.
      this.formatter = $.jqplot.DefaultTickFormatter
      A class of a formatter for the tick text.
      this.formatter = $.jqplot.DefaultTickFormatter
      A class of a formatter for the tick text.
      - - - -
      $.jqplot.ThemeEngine.prototype.get = function(name)
      Get and return the named theme or the active theme if no name given.
      $.jqplot.ThemeEngine.prototype.getThemeNames = function()
      Return the list of theme names in this manager in alpha-numerical order.
      $.jqplot.ThemeEngine.prototype.getThemes = function()
      Return a list of themes in alpha-numerical order by name.
      GNU GENERAL PUBLIC LICENSE Version 2, June 1991
      this.grid = new Grid()
      See Grid for grid specific options.
      Object representing the grid on which the plot is drawn.
      this.gridLineColor = '#cccccc'
      color of the grid lines.
      this.gridLineWidth = 1.0
      width of the grid lines.
      this.groups = 1
      group bars into this many groups
      - - - -
      this.hideZeros = false
      true to not show a label for a value which is 0.
      this.highlightAlpha = null
      Alpha transparency to apply when highlighting bubble.
      this.highlightColor = null
      color to use when highlighting an area on a filled plot.
      this.highlightColors = []
      an array of colors to use when highlighting a slice.
      this.highlightColors = []
      an array of colors to use when highlighting a bar.
      this.highlightColors = []
      An array of colors to use when highlighting a slice.
      this.highlightColors = []
      an array of colors to use when highlighting a slice.
      this.highlightColors = []
      array of colors to use when highlighting an area.
      this.highlightColors = []
      an array of colors to use when highlighting a slice.
      this.highlightMouseDown = false
      True to highlight when a mouse button is pressed over a slice.
      this.highlightMouseDown = false
      True to highlight when a mouse button is pressed over a slice.
      this.highlightMouseDown = false
      True to highlight when a mouse button is pressed over a bubble.
      this.highlightMouseDown = false
      True to highlight when a mouse button is pressed over a slice.
      this.highlightMouseDown = false
      True to highlight when a mouse button is pressed over a area.
      this.highlightMouseDown = false
      True to highlight when a mouse button is pressed over an area on a filled plot.
      this.highlightMouseDown = false
      True to highlight when a mouse button is pressed over a slice.
      this.highlightMouseOver = true
      True to highlight slice when moused over.
      this.highlightMouseOver = true
      True to highlight slice when moused over.
      this.highlightMouseOver = true
      True to highlight bubbles when moused over.
      this.highlightMouseOver = true
      True to highlight slice when moused over.
      this.highlightMouseOver = true
      True to highlight area when moused over.
      this.highlightMouseOver = true
      True to highlight area on a filled plot when moused over.
      this.highlightMouseOver = true
      True to highlight slice when moused over.
      this.hlc = false
      true if is a hi-low-close chart (no open price).
      A straight horizontal line.
      this.hubRadius = null
      Radius of the hub at the bottom center of gauge which the needle attaches to.
      - -
      - - - - - - - - - - - - \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/docs/index/General4.html b/libreplan-webapp/src/main/webapp/jqplot/docs/index/General4.html deleted file mode 100644 index 88b3caed4..000000000 --- a/libreplan-webapp/src/main/webapp/jqplot/docs/index/General4.html +++ /dev/null @@ -1,46 +0,0 @@ - - -Index - - - - - - - - - -
      Index
      $#! · 0-9 · A · B · C · D · E · F · G · H · I · J · K · L · M · N · O · P · Q · R · S · T · U · V · W · X · Y · Z
      I
       index, Series
       init, jqPlot
       innerDiameter, $.jqplot.DonutRenderer
       insertBreaks, $.jqplot.BlockRenderer
       intersectionThreshold, $.jqplot.Cursor
       interval, $.jqplot.LineRenderer
       intervalColors, $.jqplot.MeterGaugeRenderer
       intervalInnerRadius, $.jqplot.MeterGaugeRenderer
       intervalOuterRadius, $.jqplot.MeterGaugeRenderer
       intervals, $.jqplot.MeterGaugeRenderer
       Introduction
       isarc
       isMinorTick
      J
       jqPlot
       jqPlot Charts
       jqPlot CSS Customization
       jqPlot Options
       jqPlot Pugin Hooks, $.jqplot
       jqPlot Usage
       jqplot.enhancedLegendRenderer.js
       jqplot.pyramidAxisRenderer.js
       jqplot.pyramidRenderer.js
      L
       label
       labelHeightAdjust, $.jqplot.MeterGaugeRenderer
       labelOptions, Axis
       labelPosition
       labelRenderer, Axis
       labels
       labelsFromSeries, $.jqplot.PointLabels
       legend, jqPlot
       Legend
       Line
       lineCap
       lineJoin
       linePattern
       lineWidth
       lineWidthAdjust, $.jqplot.Highlighter
       location
       looseZoom, $.jqplot.Cursor
      M
       makeGridData
       marginBottom, Legend
       marginLeft, Legend
       marginRight, Legend
       marginTop, Legend
       mark
       markerOptions, Series
       markerRenderer
       markSize
       max
       methods
       Methods, $.jqplot.BlockRenderer
       min
       minorTicks
       MIT License
       moveBlock, $.jqplot.BlockRenderer
       moveSeriesToBack, jqPlot
       moveSeriesToFront, jqPlot
      - -
      this.index
      0 based index of this series in the plot series array.
      this.init = function(target,
      data,
      options)
      sets the plot target, checks data and applies user options to plot.
      this.innerDiameter = null
      Inner diameter of the donut, auto calculated by default.
      this.insertBreaks = true
      true to turn spaces in data block label into html breaks br /.
      this.intersectionThreshold = 2
      pixel distance from data point or marker to consider cursor lines intersecting with point.
      interval: '3%' }
      User specified interval above and below line for bands [default: ‘3%’’].
      this.intervalColors = [ "#4bb2c5", "#EAA228", "#c5b47f", "#579575", "#839557", "#958c12", "#953579", "#4b5de4", "#d8b83f", "#ff5800", "#0085cc", "#c747a3", "#cddf54", "#FBD178", "#26B4E3", "#bd70c7"]
      Array of colors to use for the intervals.
      this.intervalInnerRadius = null
      Radius of the inner circle of the interval ring.
      this.intervalOuterRadius = null
      Radius of the outer circle of the interval ring.
      this.intervals = []
      Array of ranges to be drawn around the gauge.
      jqPlot requires jQuery (1.4+ required for certain features).
      this.isarc = false
      wether the shadow is an arc or not.
      this.isarc = false
      wether the shadow is an arc or not.
      this.isMinorTick = false
      if this is a minor tick.
      this.isMinorTick = false
      if this is a minor tick.
      - - - -
      Plot object returned by call to $.jqplot.
      Pure JavaScript plotting plugin for jQuery.
      Much of the styling of jqPlot is done by css.
      This document is out of date.
      - - - -
      this.label = ''
      The text or html for the label.
      this.label = ''
      label for the axis.
      this.label = null
      A gauge label like ‘kph’ or ‘Volts’
      this.label = ''
      Label for the trend line to use in the legend.
      this.label = null
      Label for the axis
      this.label = ''
      Line label to use in the legend.
      this.labelHeightAdjust = 0
      Number of Pixels to offset the label up (-) or down (+) from its default position.
      this.labelOptions = {}
      Options passed to the label renderer.
      this.labelPosition = 'auto'
      ‘auto’, ‘start’, ‘middle’ or ‘end’.
      this.labelPosition = 'inside'
      Where to position the label, either ‘inside’ or ‘bottom’.
      this.labelRenderer = $.jqplot.AxisLabelRenderer
      A class of a rendering engine for creating an axis label.
      this.labels = []
      array of arrays of labels, one array for each series.
      this.labels = []
      Array of labels to use.
      this.labelsFromSeries = false
      true to use labels within data point arrays.
      this.legend = new Legend()
      see $.jqplot.TableLegendRenderer
      Legend object.
      A straight line.
      Type of ending placed on the line [‘round’, ‘butt’, ‘square’]
      this.lineCap = 'round'
      how ends of the shadow line are rendered.
      this.lineCap = 'round'
      how ends of the shadow line are rendered.
      this.lineCap = 'round'
      Canvas lineCap style at ends of line.
      this.lineJoin = 'miter'
      How line segments of the shadow are joined.
      this.lineJoin = 'miter'
      How line segments of the shadow are joined.
      this.lineJoin = 'round'
      Canvas lineJoin style between segments of series.
      this.linePattern = 'solid'
      line pattern ‘dashed’, ‘dotted’, ‘solid’, some combination of ‘-’ and ‘.’
      this.linePattern = 'solid'
      line pattern ‘dashed’, ‘dotted’, ‘solid’, some combination of ‘-’ and ‘.’
      Width of the line.
      this.lineWidth = 2
      width of line if areas are stroked and not filled.
      this.lineWidth = 2
      size of the line for non-filled markers.
      this.lineWidth = 1.5
      Width of the hi-low line and open/close ticks.
      this.lineWidth = 1.5
      width of the shadow line stroke.
      this.lineWidth = 1.5
      Width of the trend line.
      this.lineWidth = 2.5
      width of the line in pixels.
      this.lineWidthAdjust = 2.5
      Pixels to add to the lineWidth of the highlight.
      this.location = 'n'
      compass location where to position the label around the point.
      this.location = 'ne'
      Placement of the legend.
      this.looseZoom = true
      Will expand zoom range to provide more rounded tick values.
      - - - -
      $.jqplot.BezierCurveRenderer.prototype.makeGridData = function(data,
      plot)
      converts any arbitrary data values to grid coordinates and returns them.
      $.jqplot.MekkoRenderer.prototype.makeGridData = function(data,
      plot)
      converts any arbitrary data values to grid coordinates and returns them.
      this.marginBottom = null
      CSS margin for the legend DOM element.
      this.marginLeft = null
      CSS margin for the legend DOM element.
      this.marginRight = null
      CSS margin for the legend DOM element.
      this.marginTop = null
      CSS margin for the legend DOM element.
      this.mark = 'outside'
      tick mark on the axis.
      this.mark = 'outside'
      tick mark on the axis.
      this.markerOptions = {}
      renderer specific options to pass to the markerRenderer, see $.jqplot.MarkerRenderer.
      this.markerRenderer = new $.jqplot.MarkerRenderer({shadow:false})
      Renderer used to draw the marker of the highlighted point.
      this.markerRenderer = {show:false}
      Renderer to use to draw markers on the line.
      this.markerRenderer = $.jqplot.MarkerRenderer
      A class of a renderer which will draw marker (e.g.
      this.markSize = 6
      Length of the tick marks in pixels.
      this.markSize = 4
      Length of the tick marks in pixels.
      this.max
      Maximum value on the gauge.
      this.max = null
      maximum value of the axis (in data units, not pixels).
      this.min
      Minimum value on the gauge.
      this.min = null
      minimum value of the axis (in data units, not pixels).
      this.minorTicks = 0
      Number of ticks to add between “major” ticks.
      this.minorTicks = 'auto'
      Number of ticks to add between “major” ticks.
      Copyright © 2009-2011 Chris Leonello
      this.moveBlock = function (idx,
      x,
      y,
      duration)
      Moves an individual block.
      this.moveSeriesToBack = function (idx)
      This method requires jQuery 1.4+ Moves the specified series canvas behind all other series canvases.
      this.moveSeriesToFront = function (idx)
      This method requires jQuery 1.4+ Moves the specified series canvas in front of all other series canvases.
      - -
      - - - - - - - - - - - - \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/docs/index/General5.html b/libreplan-webapp/src/main/webapp/jqplot/docs/index/General5.html deleted file mode 100644 index 4fc52cc00..000000000 --- a/libreplan-webapp/src/main/webapp/jqplot/docs/index/General5.html +++ /dev/null @@ -1,46 +0,0 @@ - - -Index - - - - - - - - - -
      Index
      $#! · 0-9 · A · B · C · D · E · F · G · H · I · J · K · L · M · N · O · P · Q · R · S · T · U · V · W · X · Y · Z
      N
       name, $.jqplot.CanvasOverlay
       needlePad, $.jqplot.MeterGaugeRenderer
       needleThickness, $.jqplot.MeterGaugeRenderer
       negativeColor, Series
       neighborThreshold, Series
       newTheme, $.jqplot.ThemeEngine
       noDataIndicator, jqPlot
       numberColumns
       numberRows
       numberTicks, Axis
      O
       objects, $.jqplot.CanvasOverlay
       offset, $.jqplot.shadowRenderer
       offsetBars
       openColor, $.jqplot.OHLCRenderer
       Options Tutorial
       Options Usage
      P
       pad, Axis
       padding
       padMax, Axis
       padMin, Axis
       pegNeedle, $.jqplot.MeterGaugeRenderer
       placement, Legend
       position
       postDrawHooks, $.jqplot.$.jqplot
       postDrawSeriesHooks, $.jqplot.$.jqplot
       postDrawSeriesShadowHooks, $.jqplot.$.jqplot
       postInitHooks, $.jqplot.$.jqplot
       postParseOptionsHooks, $.jqplot.$.jqplot
       postParseSeriesOptionsHooks, $.jqplot.$.jqplot
       postSeriesInitHooks, $.jqplot.$.jqplot
       predraw, Legend
       preDrawHooks, $.jqplot.$.jqplot
       preDrawLegendHooks, $.jqplot.$.jqplot
       preDrawSeriesHooks, $.jqplot.$.jqplot
       preDrawSeriesShadowHooks, $.jqplot.$.jqplot
       prefix
       preInitHooks, $.jqplot.$.jqplot
       preParseOptionsHooks, $.jqplot.$.jqplot
       preParseSeriesOptionsHooks, $.jqplot.$.jqplot
       preSeriesInitHooks, $.jqplot.$.jqplot
       Properties
       pt2px
      R
       redraw, jqPlot
       reInitialize, jqPlot
       remove, $.jqplot.ThemeEngine
       rename, $.jqplot.ThemeEngine
       renderer
       rendererOptions
       replot, jqPlot
       resetAxesScale, jqPlot
       restoreOriginalSeriesOrder, jqPlot
       restorePreviousSeriesOrder, jqPlot
       ringColor, $.jqplot.MeterGaugeRenderer
       ringMargin, $.jqplot.DonutRenderer
       ringWidth, $.jqplot.MeterGaugeRenderer
       rowSpacing, Legend
      - -
      Optional name for the overlay object.
      this.needlePad = 6
      Padding between needle and inner edge of the ring when the needle is at the min or max gauge value.
      this.needleThickness = null
      Maximum thickness the needle.
      this.negativeColor
      css color spec used for filled (area) plots that are filled to zero and the “useNegativeColors” option is true.
      this.neighborThreshold = 4
      how close or far (in pixels) the cursor must be from a point marker to detect the point.
      $.jqplot.ThemeEngine.prototype.newTheme = function(name,
      obj)
      Create a new theme based on the default theme, adding it the themeEngine.
      Options to set up a mock plot with a data loading indicator if no data is specified.
      this.numberColumns = null
      Maximum number of columns in the legend.
      this.numberColumns = null
      Maximum number of columns in the legend.
      this.numberColumns = null
      Maximum number of columns in the legend.
      this.numberColumns = null
      Maximum number of columns in the legend.
      this.numberColumns = null
      Maximum number of columns in the legend.
      this.numberRows = null
      Maximum number of rows in the legend.
      this.numberRows = null
      Maximum number of rows in the legend.
      this.numberRows = null
      Maximum number of rows in the legend.
      this.numberRows = null
      Maximum number of rows in the legend.
      this.numberRows = null
      Maximum number of rows in the legend.
      this.numberTicks
      Desired number of ticks.
      - - - -
      this.objects = []
      this.offset = 1
      Pixel offset at the given shadow angle of each shadow stroke from the last stroke.
      this.offsetBars = false
      False will center bars on their y value.
      this.openColor = null
      color of the open price tick mark.
      This document will help you understand how jqPlot’s options relate to the API documentation and the jqPlot object itself.
      See Options Tutorial
      - - - -
      this.pad = 1.2
      Padding to extend the range above and below the data bounds.
      this.padding = 20
      padding between the donut and plot edges, legend, etc.
      this.padding = {top: 20, right: 20, bottom: 20, left: 20}
      padding between the funnel and plot edges, legend, etc.
      this.padding = null
      padding between the meterGauge and plot edges, auto calculated by default.
      this.padding = 20
      padding between the pie and plot edges, legend, etc.
      this.padMax = null
      Padding to extend the range above data bounds.
      this.padMin = null
      Padding to extend the range below data bounds.
      this.pegNeedle = true
      True will stop needle just below/above the min/max values if data is below/above min/max, as if the meter is “pegged”.
      this.placement = "insideGrid"
      “insideGrid” places legend inside the grid area of the plot.
      this.position = null
      Position of axis.
      called after plot draw.
      called after each series is drawn.
      called after series shadows are drawn.
      called after initialization.
      called after user options are parsed.
      called after series related options are parsed.
      called after series is initialized.
      Wether to draw the legend before the series or not.
      called before plot draw.
      called before the legend is drawn.
      called before each series is drawn.
      called before series shadows are drawn.
      this.prefix = ''
      String to prepend to the tick label.
      this.prefix = ''
      String to prepend to the tick label.
      called before initialization.
      called before user options are parsed.
      called before series related options are parsed.
      called before series is initialized.
      Properties
      Axes options are specified within an axes object at the top level of the plot options like so:
      These properties are specified at the top of the options object like so:
      Properties will be assigned from a series array at the top level of the options.
      this.pt2px = null
      Point to pixel scaling factor, used for computing height of bounding box around a label.
      this.pt2px = null
      Point to pixel scaling factor, used for computing height of bounding box around a label.
      - - - -
      this.redraw = function(clear)
      Empties the plot target div and redraws the plot.
      this.reInitialize = function ()
      reinitialize plot for replotting.
      $.jqplot.ThemeEngine.prototype.remove = function(name)
      Remove the given theme from the themeEngine.
      $.jqplot.ThemeEngine.prototype.rename = function (oldName,
      newName)
      Rename a theme.
      this.renderer = new $.jqplot.LineRenderer()
      Renderer to use to draw the trend line.
      this.renderer = $.jqplot.LinearAxisRenderer
      A class of a rendering engine that handles tick generation, scaling input data to pixel grid units and drawing the axis element.
      this.renderer = $.jqplot.CanvasGridRenderer
      Instance of a renderer which will actually render the grid, see $.jqplot.CanvasGridRenderer.
      this.renderer = $.jqplot.LineRenderer
      A class of a renderer which will draw the series, see $.jqplot.LineRenderer.
      this.renderer = $.jqplot.DivTitleRenderer
      A class for creating a DOM element for the title, see $.jqplot.DivTitleRenderer.
      this.rendererOptions = {marker:{show:false}}
      Options to pass to the line renderer.
      this.rendererOptions = {}
      renderer specific options.
      this.rendererOptions = {}
      Options to pass on to the renderer, see $.jqplot.CanvasGridRenderer.
      this.rendererOptions = {}
      renderer specific options passed to the renderer.
      this.rendererOptions = {}
      Options to pass on to the renderer.
      this.rendererOptions = {}
      renderer specific options passed to the renderer.
      this.replot = function(options)
      Does a reinitialization of the plot followed by a redraw.
      this.resetAxesScale = function(axes,
      options)
      Reset the specified axes min, max, numberTicks and tickInterval properties to null or reset these properties on all axes if no list of axes is provided.
      this.restoreOriginalSeriesOrder = function ()
      This method requires jQuery 1.4+ Restore the series canvas order to its original order when the plot was created.
      this.restorePreviousSeriesOrder = function ()
      This method requires jQuery 1.4+ Restore the series canvas order to its previous state.
      this.ringColor = "#BBC6D0"
      color of the outer ring, hub, and needle of the gauge.
      this.ringMargin = null
      pixel distance between rings, or multiple series in a donut plot.
      this.ringWidth = null
      width of the ring around the gauge.
      this.rowSpacing = '0.5em'
      css padding-top spec for the rows in the legend.
      - -
      - - - - - - - - - - - - \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/docs/index/General6.html b/libreplan-webapp/src/main/webapp/jqplot/docs/index/General6.html deleted file mode 100644 index 0589a43ef..000000000 --- a/libreplan-webapp/src/main/webapp/jqplot/docs/index/General6.html +++ /dev/null @@ -1,34 +0,0 @@ - - -Index - - - - - - - - - -
      Index
      $#! · 0-9 · A · B · C · D · E · F · G · H · I · J · K · L · M · N · O · P · Q · R · S · T · U · V · W · X · Y · Z
      S
       sectionMargin, $.jqplot.FunnelRenderer
       series, jqPlot
       Series
       seriesColors, jqPlot
       seriesDefaults, jqPlot
       seriesLabelIndex, $.jqplot.PointLabels
       seriesToggle
       setGridData
       shadow
       shadowAlpha
       shadowAngle
       shadowColor, Grid
       shadowDepth
       shadowOffset
       shadowRenderer, $.jqplot.MarkerRenderer
       shadowWidth, Grid
       shapeRenderer, $.jqplot.MarkerRenderer
       show
       showBorders, $.jqplot.MekkoRenderer
       showCursorLegend, $.jqplot.Cursor
       showDataLabels
       showGridline
       showHorizontalLine, $.jqplot.Cursor
       showLabel
       showLabels
       showLine, Series
       showLines, $.jqplot.LineRenderer
       showMark
       showMarker
       showMinorTicks, Axis
       showSwatch, Legend
       showTickLabels, $.jqplot.MeterGaugeRenderer
       showTickMarks, Axis
       showTicks
       showTooltip
       showTooltipDataPosition, $.jqplot.Cursor
       showTooltipGridPosition, $.jqplot.Cursor
       showTooltipOutsideZoom, $.jqplot.Cursor
       showTooltipPrecision, $.jqplot.CanvasOverlay
       showTooltipUnitPosition, $.jqplot.Cursor
       showVerticalLine, $.jqplot.Cursor
       size
       sizeAdjust, $.jqplot.Highlighter
       sliceMargin
       smooth, $.jqplot.LineRenderer
       sortData, jqPlot
       sortMergedLabels, $.jqplot.CategoryAxisRenderer
       stackedValue, $.jqplot.PointLabels
       stackSeries, jqPlot
       start, Line
       startAngle
       stop, Line
       strokeRect, $.jqplot.shapeRenderer
       strokeStyle, $.jqplot.shapeRenderer
       style
       syncTicks, Axis
      - -
      this.sectionMargin = 6
      spacing between funnel sections in pixels.
      this.series = []
      Array of series object options.
      An individual data series object.
      this.seriesColors = $.jqplot.config.defaultColors
      Ann array of CSS color specifications that will be applied, in order, to the series in the plot.
      seriesDefaults: {}, series:[] }
      default options that will be applied to all series.
      this.seriesLabelIndex = null
      array index for location of labels within data point arrays.
      this.seriesToggle = 'normal'
      false to not enable series on/off toggling on the legend.
      $.jqplot.BezierCurveRenderer.prototype.setGridData = function(plot)
      converts the user data values to grid coordinates and stores them in the gridData array.
      $.jqplot.MekkoRenderer.prototype.setGridData = function(plot)
      converts the user data values to grid coordinates and stores them in the gridData array.
      wether or not to draw a shadow on the line
      this.shadow = true
      wether or not to draw a shadow on the line
      this.shadow = true
      true or false, wether or not to show the shadow.
      this.shadow = true
      wether to show a shadow behind the grid.
      this.shadowAlpha = 0.08
      transparency of the shadow (0 = transparent, 1 = opaque)
      Alpha channel transparency of shadow.
      this.shadowAlpha = 0.07
      transparency of the shadow (0 = transparent, 1 = opaque)
      this.shadowAlpha = 0.07
      transparency of the shadow (0 = transparent, 1 = opaque)
      this.shadowAlpha = '0.07'
      Alpha channel transparency of shadow.
      this.shadowAlpha = 0.07
      transparency of the shadow (0 = transparent, 1 = opaque)
      this.shadowAlpha = 0.07
      transparency of the shadow (0 = transparent, 1 = opaque)
      this.shadowAlpha = 0.07
      Alpha transparency of the shadow.
      this.shadowAlpha = '0.07'
      Alpha channel transparency of shadow.
      this.shadowAlpha = '0.1'
      Alpha channel transparency of shadow.
      Shadow angle in degrees
      this.shadowAngle = 45
      Shadow angle in degrees
      this.shadowAngle = 45
      Angle of the shadow on the trend line.
      this.shadowAngle = 45
      shadow angle in degrees
      this.shadowAngle = 45
      Shadow angle in degrees
      this.shadowColor = null
      an optional css color spec for the shadow in ‘rgba(n, n, n, n)’ form
      this.shadowDepth = 5
      number of strokes to apply to the shadow, each stroke offset shadowOffset from the last.
      Number of times shadow is stroked, each stroke offset shadowOffset from the last.
      this.shadowDepth = 5
      number of strokes to apply to the shadow, each stroke offset shadowOffset from the last.
      this.shadowDepth = 5
      number of strokes to apply to the shadow, each stroke offset shadowOffset from the last.
      this.shadowDepth = 3
      Number of times shadow is stroked, each stroke offset shadowOffset from the last.
      this.shadowDepth = 4
      number of strokes to apply to the shadow, each stroke offset shadowOffset from the last.
      this.shadowDepth = 5
      number of strokes to apply to the shadow, each stroke offset shadowOffset from the last.
      this.shadowDepth = 3
      number of strokes to make of the shadow.
      this.shadowDepth = 3
      Number of times shadow is stroked, each stroke offset shadowOffset from the last.
      this.shadowDepth = 3
      Number of times shadow is stroked, each stroke offset shadowOffset from the last.
      this.shadowOffset = 2
      offset of the shadow from the slice and offset of each succesive stroke of the shadow from the last.
      Shadow offset from line in pixels
      this.shadowOffset = 2
      offset of the shadow from the slice and offset of each succesive stroke of the shadow from the last.
      this.shadowOffset = 2
      offset of the shadow from the area and offset of each succesive stroke of the shadow from the last.
      this.shadowOffset = 1
      Shadow offset from line in pixels
      this.shadowOffset = 2
      offset of the shadow from the gauge ring and offset of each succesive stroke of the shadow from the last.
      this.shadowOffset = 2
      offset of the shadow from the slice and offset of each succesive stroke of the shadow from the last.
      this.shadowOffset = 1.0
      pixel offset for each stroke of the shadow.
      this.shadowOffset = 1.5
      Offset of each shadow stroke from the border in pixels
      this.shadowOffset = 1.25
      Shadow offset from line in pixels
      this.shadowRenderer = new $.jqplot.ShadowRenderer()
      Renderer that will draws the shadows on the marker.
      this.shadowWidth = 3
      width of the stoke for the shadow
      this.shapeRenderer = new $.jqplot.ShapeRenderer()
      Renderer that will draw the marker.
      this.show = true
      wether or not to show the tick (mark and label).
      this.show = true
      wether or not to show the tick (mark and label).
      this.show = true
      wether or not to show the tick (mark and label).
      this.show = true
      wether or not to show the tick (mark and label).
      true to show (draw), false to not draw.
      this.show = $.jqplot.config.enablePlugins
      wether to show the cursor or not.
      this.show = $.jqplot.config.enablePlugins
      true to show the highlight.
      true to show the bands.
      this.show = true
      wether or not to show the marker.
      this.show = $.jqplot.config.enablePlugins
      show the labels or not.
      this.show = $.jqplot.config.enablePlugins
      Wether or not to show the trend line.
      this.show = false
      Wether to display the axis on the graph.
      this.show = false
      Wether to display the legend on the graph.
      this.show = true
      wether or not to draw the series.
      this.show = true
      wether or not to show the title
      this.showBorders = true
      True to draw borders lines between areas on the chart.
      this.showCursorLegend = false
      Replace the plot legend with an enhanced legend displaying intersection information.
      this.showDataLabels = false
      true to show data labels on slices.
      this.showDataLabels = false
      true to show data labels on slices.
      this.showDataLabels = false
      true to show data labels on slices.
      this.showGridline = true
      wether or not to draw the gridline on the grid at this tick.
      this.showGridline = true
      wether or not to draw the gridline on the grid at this tick.
      this.showHorizontalLine = false
      draw a horizontal line across the plot which follows the cursor.
      this.showLabel = true
      wether or not to show the label.
      this.showLabel = true
      wether or not to show the label.
      this.showLabel = true
      wether or not to show the label.
      this.showLabel = true
      true to show the axis label.
      this.showLabel = true
      true to show label for this series in the legend.
      this.showLabels = true
      True to show labels on bubbles (if any), false to not show.
      this.showLabels = true
      true to show the label text on the legend.
      this.showLine = true
      wether to actually draw the line or not.
      True to show lines at top and bottom of bands [default: false].
      this.showMark = true
      wether or not to show the mark on the axis.
      this.showMark = true
      wether or not to show the mark on the axis.
      this.showMarker = true
      true to show the marker
      this.showMarker = true
      wether or not to show the markers at the data points.
      this.showMinorTicks = true
      Wether or not to show minor ticks.
      this.showSwatches = true
      true to show the color swatches on the legend.
      this.showTickLabels = true
      true to show tick labels next to ticks.
      this.showTickMarks = true
      Wether to show the tick marks (line crossing grid) or not.
      this.showTicks = true
      true to show ticks around gauge.
      this.showTicks = true
      Wether to show the ticks (both marks and labels) or not.
      Show a tooltip with data point values.
      this.showTooltip = true
      show a cursor position tooltip.
      this.showTooltip = true
      Show a tooltip with data point values.
      this.showTooltipDataPosition = false
      Used with showVerticalLine to show intersecting data points in the tooltip.
      this.showTooltipGridPosition = false
      show the grid pixel coordinates of the mouse.
      this.showTooltipOutsideZoom = false
      True will keep updating the tooltip when zooming of the grid.
      Controls how close to line cursor must be to show tooltip.
      this.showTooltipUnitPosition = true
      show the unit (data) coordinates of the mouse.
      this.showVerticalLine = false
      draw a vertical line across the plot which follows the cursor.
      this.size = 4
      Length of the tick beyond the grid in pixels.
      this.size = 9.0
      Size of the marker (diameter or circle, length of edge of square, etc.)
      this.sizeAdjust = 5
      Pixels to add to the overall size of the highlight.
      this.sliceMargin = 0
      angular spacing between donut slices in degrees.
      this.sliceMargin = 0
      angular spacing between pie slices in degrees.
      this.renderer.smooth = false
      True to draw a smoothed (interpolated) line through the data points with automatically computed number of smoothing points.
      this.sortData = true
      false to not sort the data passed in by the user.
      this.sortMergedLabels = false
      True to sort tick labels when labels are created by merging x axis values from multiple series.
      this.stackedValue = false
      true to display value as stacked in a stacked plot.
      this.stackSeries = false
      true or false, creates a stack or “mountain” plot.
      [x, y] coordinates for the start of the line.
      this.startAngle = 0
      Angle to start drawing donut in degrees.
      this.startAngle = 0
      Angle to start drawing pie in degrees.
      stop: [] }
      [x, y] coordinates for the end of the line.
      this.strokeRect = false
      true to draw shape as a stroked rectangle.
      this.strokeStyle = '#999999'
      css color spec for the stoke style
      this.style = 'crosshair'
      CSS spec for cursor style
      this.style = 'filledCircle'
      One of diamond, circle, square, x, plus, dash, filledDiamond, filledCircle, filledSquare
      this.syncTicks = null
      true to try and synchronize tick spacing across multiple axes so that ticks and grid lines line up.
      - -
      - - - - - - - - - - - - \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/docs/index/General7.html b/libreplan-webapp/src/main/webapp/jqplot/docs/index/General7.html deleted file mode 100644 index 576b7a09d..000000000 --- a/libreplan-webapp/src/main/webapp/jqplot/docs/index/General7.html +++ /dev/null @@ -1,58 +0,0 @@ - - -Index - - - - - - - - - -
      Index
      $#! · 0-9 · A · B · C · D · E · F · G · H · I · J · K · L · M · N · O · P · Q · R · S · T · U · V · W · X · Y · Z
      T
       text, Title
       textAlign, Title
       textColor
       themes, $.jqplot.ThemeEngine
       thickness, $.jqplot.DonutRenderer
       tickColor, $.jqplot.MeterGaugeRenderer
       tickInset
       tickInterval, Axis
       tickLength, $.jqplot.OHLCRenderer
       tickMode, $.jqplot.MekkoAxisRenderer
       tickOptions, Axis
       tickPadding, $.jqplot.MeterGaugeRenderer
       tickRenderer
       ticks
       tickSpacing
       title, jqPlot
       Title
       tooltipAxes, $.jqplot.Highlighter
       tooltipAxisGroups, $.jqplot.Cursor
       tooltipFadeSpeed
       tooltipFormatString
       tooltipLocation
       tooltipOffset
       transposedData, $.jqplot.BarRenderer
       type, $.jqplot.Trendline
      U
       upBodyColor, $.jqplot.OHLCRenderer
       Usage
       useAxesFormatters
       useNegativeColors, Series
       useSeriesColor, Axis
      V
       varyBarColor, $.jqplot.BarRenderer
       varyBlockColors, $.jqplot.BlockRenderer
       varyBubbleColors, $.jqplot.BubbleRenderer
       Version
       VerticalLine
      W
       waterfall, $.jqplot.BarRenderer
       wickColor, $.jqplot.OHLCRenderer
       widthRatio, $.jqplot.FunnelRenderer
      X
       xaxis
       xmax, HorizontalLine
       xmin, HorizontalLine
       xoffset, Legend
       xpadding, $.jqplot.PointLabels
      Y
       y, HorizontalLine
       yaxis
       yoffset, Legend
       ypadding, $.jqplot.PointLabels
       yvalues, $.jqplot.Highlighter
      Z
       zoom, $.jqplot.Cursor
       zoomProxy, $.jqplot.Cursor.$.jqplot.Cursor
      - -
      this.text = text
      text of the title;
      this.textAlign
      css text-align spec for the text.
      this.textColor
      css spec for the color attribute.
      this.textColor = '#666666'
      css spec for the color attribute.
      this.textColor = '#666666'
      css spec for the color attribute.
      this.textColor
      css color spec for the legend text.
      this.textColor
      css color spec for the text.
      this.themes = {}
      hash of themes managed by the theme engine.
      this.thickness = null
      thickness of the donut, auto computed by default Overridden by if innerDiameter is specified.
      this.tickColor = "989898"
      color of the tick marks around the gauge.
      this.tickInset = 0
      Controls the amount to inset the first and last ticks from the edges of the grid, in multiples of the tick interval.
      this.tickInset = 0
      Controls the amount to inset the first and last ticks from the edges of the grid, in multiples of the tick interval.
      this.tickInterval
      number of units between ticks.
      this.tickLength = 'auto'
      length of the line in pixels indicating open and close price.
      this.tickMode
      How to space the ticks on the axis.
      this.tickOptions = {}
      Options that will be passed to the tickRenderer, see $.jqplot.AxisTickRenderer options.
      this.tickPadding = null
      padding of the tick marks to the outer ring and the tick labels to marks.
      A class of a rendering engine for creating the ticks labels displayed on the plot, See $.jqplot.AxisTickRenderer.
      A class of a rendering engine for creating the ticks labels displayed on the plot, See $.jqplot.AxisTickRenderer.
      this.tickRenderer = $.jqplot.AxisTickRenderer
      A class of a rendering engine for creating the ticks labels displayed on the plot, See $.jqplot.AxisTickRenderer.
      this.ticks = []
      Array of tick values.
      this.ticks = []
      1D [val, val, ...] or 2D [[val, label], [val, label], ...] array of ticks for the axis.
      this.tickSpacing = 30
      Degrees between ticks.
      this.tickSpacing = 75
      Approximate pixel spacing between ticks on graph.
      this.title = new Title()
      Title object.
      Plot Title object.
      this.tooltipAxes = 'both'
      Which axes to display in tooltip, ‘x’, ‘y’ or ‘both’, ‘xy’ or ‘yx’ ‘both’ and ‘xy’ are equivalent, ‘yx’ reverses order of labels.
      this.tooltipAxisGroups = []
      Show position for the specified axes.
      ‘slow’, ‘def’, ‘fast’, or number of milliseconds.
      this.tooltipFadeSpeed = "fast"
      ‘slow’, ‘def’, ‘fast’, or number of milliseconds.
      tooltipFormatString: '%d, %d' }
      Format string passed the x and y values of the cursor on the line.
      this.tooltipFormatString = '%.4P, %.4P'
      sprintf format string for the tooltip.
      this.tooltipFormatString = '%.5P'
      sprintf format string for the tooltip.
      Where to position tooltip, ‘n’, ‘ne’, ‘e’, ‘se’, ‘s’, ‘sw’, ‘w’, ‘nw’
      this.tooltipLocation = 'se'
      Where to position tooltip.
      this.tooltipLocation = 'nw'
      Where to position tooltip, ‘n’, ‘ne’, ‘e’, ‘se’, ‘s’, ‘sw’, ‘w’, ‘nw’
      Pixel offset of tooltip from the highlight.
      this.tooltipOffset = 6
      Pixel offset of tooltip from the grid boudaries or cursor center.
      this.tooltipOffset = 2
      Pixel offset of tooltip from the highlight.
      this.transposedData = true
      NOT IMPLEMENTED YET.
      this.type = 'linear'
      Either ‘exponential’, ‘exp’, or ‘linear’.
      - - - -
      this.upBodyColor = null
      Color of candlestick body of an “up” day.
      See jqPlot Usage
      this.useAxesFormatters = true
      Use the x and y axes formatters to format the text in the tooltip.
      this.useAxesFormatters = true
      Use the x and y axes formatters to format the text in the tooltip.
      this.useNegativeColors = true
      true to color negative values differently in filled and bar charts.
      this.useSeriesColor = false
      Use the color of the first series associated with this axis for the tick marks and line bordering this axis.
      - - - -
      this.varyBarColor = false
      true to color each bar of a series separately rather than have every bar of a given series the same color.
      this.varyBlockColors = false
      true to vary the color of each block in this series according to the seriesColors array.
      this.varyBubbleColors = true
      True to vary the color of each bubble in this series according to the seriesColors array.
      1.0.0b2_r1012
      A straight vertical line.
      - - - -
      this.waterfall = false
      true to enable waterfall plot.
      this.wickColor = null
      color of the hi-lo line thorugh the candlestick body.
      this.widthRatio = 0.2
      The ratio of the width of the top of the funnel to the bottom.
      - - - -
      X axis to use for positioning/scaling the line.
      this.xaxis = 'xaxis'
      which x axis to use with this series, either ‘xaxis’ or ‘x2axis’.
      x value for the end of the line, null to scale to axis max.
      x value for the start of the line, null to scale to axis min.
      this.xoffset = 0
      DEPRECATED.
      this.xpadding = 6
      horizontal padding in pixels between point and label
      - - - -
      y value to position the line
      Y axis to use for positioning/scaling the line.
      this.yaxis = 'yaxis'
      which y axis to use with this series, either ‘yaxis’ or ‘y2axis’.
      this.yoffset = 0
      DEPRECATED.
      this.ypadding = 6
      vertical padding in pixels between point and label
      this.yvalues = 1
      Number of y values to expect in the data point array.
      - - - -
      this.zoom = false
      Enable plot zooming.
      $.jqplot.Cursor.zoomProxy = function(targetPlot,
      controllerPlot)
      links targetPlot to controllerPlot so that plot zooming of targetPlot will be controlled by zooming on the controllerPlot.
      - -
      - - - - - - - - - - - - \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/docs/index/Hooks.html b/libreplan-webapp/src/main/webapp/jqplot/docs/index/Hooks.html deleted file mode 100644 index 59ccfc8d4..000000000 --- a/libreplan-webapp/src/main/webapp/jqplot/docs/index/Hooks.html +++ /dev/null @@ -1,46 +0,0 @@ - - -Hook Index - - - - - - - - - -
      Hook Index
      $#! · 0-9 · A · B · C · D · E · F · G · H · I · J · K · L · M · N · O · P · Q · R · S · T · U · V · W · X · Y · Z
      A
       addLegendRowHooks, $.jqplot.$.jqplot
      E
       eventListenerHooks, $.jqplot.$.jqplot
      J
       jqPlot Pugin Hooks, $.jqplot
      P
       postDrawHooks, $.jqplot.$.jqplot
       postDrawSeriesHooks, $.jqplot.$.jqplot
       postDrawSeriesShadowHooks, $.jqplot.$.jqplot
       postInitHooks, $.jqplot.$.jqplot
       postParseOptionsHooks, $.jqplot.$.jqplot
       postParseSeriesOptionsHooks, $.jqplot.$.jqplot
       postSeriesInitHooks, $.jqplot.$.jqplot
       preDrawHooks, $.jqplot.$.jqplot
       preDrawLegendHooks, $.jqplot.$.jqplot
       preDrawSeriesHooks, $.jqplot.$.jqplot
       preDrawSeriesShadowHooks, $.jqplot.$.jqplot
       preInitHooks, $.jqplot.$.jqplot
       preParseOptionsHooks, $.jqplot.$.jqplot
       preParseSeriesOptionsHooks, $.jqplot.$.jqplot
       preSeriesInitHooks, $.jqplot.$.jqplot
      - -
      called at the end of legend draw, so plugins can add rows to the legend table.
      - - - -
      called at the end of plot drawing, binds listeners to the event canvas which lays on top of the grid area.
      - - - - - - - -
      called after plot draw.
      called after each series is drawn.
      called after series shadows are drawn.
      called after initialization.
      called after user options are parsed.
      called after series related options are parsed.
      called after series is initialized.
      called before plot draw.
      called before the legend is drawn.
      called before each series is drawn.
      called before series shadows are drawn.
      called before initialization.
      called before user options are parsed.
      called before series related options are parsed.
      called before series is initialized.
      - -
      - - - - - - - - - - - - \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/docs/index/Properties.html b/libreplan-webapp/src/main/webapp/jqplot/docs/index/Properties.html deleted file mode 100644 index d4f4dde54..000000000 --- a/libreplan-webapp/src/main/webapp/jqplot/docs/index/Properties.html +++ /dev/null @@ -1,42 +0,0 @@ - - -Property Index - - - - - - - - - -
      Property Index
      $#! · 0-9 · A · B · C · D · E · F · G · H · I · J · K · L · M · N · O · P · Q · R · S · T · U · V · W · X · Y · Z
      A
       activeTheme, $.jqplot.ThemeEngine
       alignTicks, $.jqplot.LinearAxisRenderer
       alpha, $.jqplot.shadowRenderer
       angle
       animate, jqPlot
       animateReplot, jqPlot
       autoscale, Axis
       autoscaleBubbles, $.jqplot.BubbleRenderer
       autoscaleMultiplier, $.jqplot.BubbleRenderer
       autoscalePointsFactor, $.jqplot.BubbleRenderer
       axes, jqPlot
       axesDefaults, jqPlot
       axisDefaults, $.jqplot.LogAxisRenderer
      B
       background
       bandData, $.jqplot.LineRenderer
       barDirection, $.jqplot.BarRenderer
       barLabelOptions, $.jqplot.MekkoAxisRenderer
       barLabelRenderer, $.jqplot.MekkoAxisRenderer
       barLabels, $.jqplot.MekkoAxisRenderer
       barMargin, $.jqplot.BarRenderer
       barPadding
       barWidth, $.jqplot.BarRenderer
       baselineColor
       baselineWidth
       bodyWidth, $.jqplot.OHLCRenderer
       border, Legend
       borderColor
       borderWidth
       breakOnNull, Series
       breakPoints, $.jqplot.LinearAxisRenderer
       breakTickLabel, $.jqplot.LinearAxisRenderer
       bringSeriesToFront, $.jqplot.Highlighter
       bubbleAlpha, $.jqplot.BubbleRenderer
       bubbleGradients, $.jqplot.BubbleRenderer
      C
       candleStick, $.jqplot.OHLCRenderer
       clearRect, $.jqplot.shapeRenderer
       clickReset, $.jqplot.Cursor
       closeColor, $.jqplot.OHLCRenderer
       color
       constrainOutsideZoom, $.jqplot.Cursor
       constrainSmoothing, $.jqplot.LineRenderer
       constrainTo, $.jqplot.Dragable
       constrainZoomTo, $.jqplot.Cursor
       css, $.jqplot.BlockRenderer
       cursorLegendFormatString, $.jqplot.Cursor
      - -
      this.activeTheme=null
      Pointer to currently active theme
      this.alignTicks = false
      true to align tick marks across opposed axes such as from the y2axis to yaxis.
      this.alpha = 0.07
      alpha transparency of shadow stroke.
      this.angle = 0
      angle of text, measured clockwise from x axis.
      this.angle = 0
      angle of text, measured clockwise from x axis.
      this.angle = 45
      Angle of the shadow in degrees.
      this.animate = false
      True to animate the series on initial plot draw (renderer dependent).
      this.animateReplot = false
      True to animate series after a call to the replot() method.
      this.autoscale = false
      DEPRECATED the default scaling algorithm produces superior results.
      this.autoscaleBubbles = true
      True to scale the bubble radius based on plot size.
      this.autoscaleMultiplier = 1.0
      Multiplier the bubble size if autoscaleBubbles is true.
      this.autoscalePointsFactor = -0.07
      Factor which decreases bubble size based on how many bubbles on on the chart.
      this.axes = {xaxis: new Axis('xaxis'), yaxis: new Axis('yaxis'), x2axis: new Axis('x2axis'), y2axis: new Axis('y2axis'), y3axis: new Axis('y3axis'), y4axis: new Axis('y4axis'), y5axis: new Axis('y5axis'), y6axis: new Axis('y6axis'), y7axis: new Axis('y7axis'), y8axis: new Axis('y8axis'), y9axis: new Axis('y9axis'), yMidAxis: new Axis('yMidAxis')}
      up to 4 axes are supported, each with it’s own options, See Axis for axis specific options.
      default options that will be applied to all axes.
      Default properties which will be applied directly to the series.
      - - - -
      this.background = "#efefef"
      background color of the inside of the gauge.
      this.background = '#fffdf6'
      css spec for the background color.
      this.background
      css spec for the background of the legend box.
      this.renderer.bandData = []
      Data used to draw error bands or confidence intervals above/below a line.
      this.barDirection = 'vertical'
      ‘vertical’ = up and down bars, ‘horizontal’ = side to side bars
      this.barLabelOptions = {}
      options object to pass to the bar label renderer.
      this.barLabelRenderer = $.jqplot.AxisLabelRenderer
      renderer to use to draw labels under each bar.
      this.barLabels = this.barLabels || []
      array of labels to put under each bar.
      this.barMargin = 10
      Number of pixels between groups of bars at adjacent axis values.
      this.barPadding = 10
      this.barPadding = 8
      Number of pixels between adjacent bars at the same axis value.
      this.barWidth = null
      Width of the bar in pixels (auto by devaul).
      this.baselineColor = null
      CSS color spec for the baseline.
      this.baselineColor = null
      CSS color spec for the baseline.
      this.baselineColor = null
      CSS color spec for the baseline.
      this.baselineWidth = null
      width of the baseline in pixels.
      this.baselineWidth = null
      width of the baseline in pixels.
      this.baselineWidth = null
      width of the baseline in pixels.
      this.bodyWidth = 'auto'
      width of the candlestick body in pixels.
      this.border
      css spec for the border around the legend box.
      this.borderColor = null
      color of the borders between areas on the chart
      this.borderColor = null
      color of the border adjacent to the axis.
      this.borderColor = '#999999'
      css spec for the color of the grid border.
      this.borderWidth = null
      width of line stroked at the border of the axis.
      this.borderWidth = 2.0
      width of the border in pixels.
      this.breakOnNull = false
      Wether line segments should be be broken at null value.
      this.breakPoints = null
      EXPERIMENTAL!! 
      this.breakTickLabel = "&asymp
      Label to use at the axis break if breakPoints are specified.
      this.bringSeriesToFront = false
      This option requires jQuery 1.4+ True to bring the series of the highlighted point to the front of other series.
      this.bubbleAlpha = 1.0
      Alpha transparency to apply to all bubbles in this series.
      this.bubbleGradients = false
      True to color the bubbles with gradient fills instead of flat colors.
      - - - -
      this.candleStick = false
      true to render chart as candleStick.
      this.clearRect = false
      true to cear a rectangle.
      this.clickReset = false
      Will reset plot zoom if single click on plot without drag.
      this.closeColor = null
      color of the close price tick mark.
      color of the line
      this.color
      CSS color spec for the dragged point (and adjacent line segment or bar).
      color of lines at top and bottom of bands [default: series color].
      this.color = '#666666'
      color of marker.
      this.color = '#666666'
      CSS color spec for the trend line.
      this.color
      css color spec for the series
      this.constrainOutsideZoom = true
      True to limit actual zoom area to edges of grid, even when zooming outside of plot area.
      this.renderer.constrainSmoothing = true
      True to use a more accurate smoothing algorithm that will not overshoot any data points.
      this.constrainTo = 'none'
      Constrain dragging motion to an axis or to none.
      this.constrainZoomTo = 'none'
      ‘none’, ‘x’ or ‘y’
      this.css = {padding:'2px', border:'1px solid #999', textAlign:'center'}
      default css styles that will be applied to all data blocks.
      this.cursorLegendFormatString = $.jqplot.Cursor.cursorLegendFormatString
      Format string used in the cursor legend.
      - -
      - - - - - - - - - - - - \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/docs/index/Properties2.html b/libreplan-webapp/src/main/webapp/jqplot/docs/index/Properties2.html deleted file mode 100644 index a8780d106..000000000 --- a/libreplan-webapp/src/main/webapp/jqplot/docs/index/Properties2.html +++ /dev/null @@ -1,42 +0,0 @@ - - -Property Index - - - - - - - - - -
      Property Index
      $#! · 0-9 · A · B · C · D · E · F · G · H · I · J · K · L · M · N · O · P · Q · R · S · T · U · V · W · X · Y · Z
      D
       dashPattern
       data, jqPlot
       dataLabelCenterOn, $.jqplot.PieRenderer
       dataLabelFormatString
       dataLabelNudge
       dataLabelPositionFactor
       dataLabels
       dataLabelThreshold
       dataRenderer, jqPlot
       dataRendererOptions, jqPlot
       dblClickReset, $.jqplot.Cursor
       defaultAxisStart, jqPlot
       depth, $.jqplot.shadowRenderer
       diameter
       disableIEFading
       disableStack, Series
       downBodyColor, $.jqplot.OHLCRenderer
       drawBaseline
       drawBorder, Grid
       drawGridlines, Grid
       drawMajorGridlines, Axis
       drawMajorTickMarks, Axis
       drawMinorGridlines, Axis
       drawMinorTickMarks, Axis
      E
       edgeTolerance, $.jqplot.PointLabels
       enableFontSupport
       escapeHtml
       escapeHTML
      F
       fadeTooltip
       fill
       fillAlpha, Series
       fillAndStroke, Series
       fillAxis, Series
       fillBetween, jqPlot
       fillColor
       fillDownBody, $.jqplot.OHLCRenderer
       fillRect, $.jqplot.shapeRenderer
       fillStyle, $.jqplot.shapeRenderer
       fillToValue, Series
       fillToZero, Series
       fillUpBody, $.jqplot.OHLCRenderer
       followMouse, $.jqplot.Cursor
       fontFamily
       fontSize
       fontStretch
       fontWeight
       forceTickAt0, $.jqplot.LinearAxisRenderer
       forceTickAt100, $.jqplot.LinearAxisRenderer
       formatString
       formatter
      - -
      dashPattern: [8,8] }
      Array of line, space settings in pixels.
      dashPattern: [8,8] }
      Array of line, space settings in pixels.
      this.data = []
      user’s data.
      this.dataLabelCenterOn = true
      True to center the data label at its position.
      this.dataLabelFormatString = null
      Format string for data labels.
      this.dataLabelFormatString = null
      Format string for data labels.
      this.dataLabelFormatString = null
      Format string for data labels.
      this.dataLabelNudge = 0
      Number of pixels to slide the label away from (+) or toward (-) the center of the pie.
      this.dataLabelNudge = 2
      Number of pixels to slide the label away from (+) or toward (-) the center of the pie.
      this.dataLabelPositionFactor = 0.4
      A Multiplier (0-1) of the pie radius which controls position of label on slice.
      this.dataLabelPositionFactor = 0.52
      A Multiplier (0-1) of the pie radius which controls position of label on slice.
      this.dataLabels = 'percent'
      Either ‘label’, ‘value’, ‘percent’ or an array of labels to place on the pie slices.
      this.dataLabels = 'percent'
      Either ‘label’, ‘value’, ‘percent’ or an array of labels to place on the pie slices.
      this.dataLabels = 'percent'
      Either ‘label’, ‘value’, ‘percent’ or an array of labels to place on the pie slices.
      this.dataLabelThreshold = 3
      this.dataLabelThreshold = 3
      this.dataLabelThreshold = 3
      Threshhold in percentage (0-100) of pie area, below which no label will be displayed.
      this.dataRenderer
      A callable which can be used to preprocess data passed into the plot.
      this.dataRendererOptions
      Options that will be passed to the dataRenderer.
      this.dblClickReset = true
      Will reset plot zoom if double click on plot without drag.
      this.defaultAxisStart = 1
      1-D data series are internally converted into 2-D [x,y] data point arrays by jqPlot.
      this.depth = 3
      how many times the shadow is stroked.
      this.diameter = null
      Outer diameter of the donut, auto computed by default
      this.diameter = null
      Outer diameter of the meterGauge, auto computed by default
      this.diameter = null
      Outer diameter of the pie, auto computed by default
      this.disableIEFading = true
      true to toggle series with a show/hide method only and not allow fading in/out.
      this.disableStack = false
      true to not stack this series with other series in the plot.
      this.downBodyColor = null
      Color of candlestick body on a “down” day.
      this.drawBaseline = true
      True to draw the axis baseline.
      this.drawBaseline = true
      True to draw the axis baseline.
      this.drawBaseline = true
      True to draw the axis baseline.
      this.drawBaseline = true
      True to draw the axis baseline.
      this.drawBorder = true
      True to draw border around grid.
      this.drawGridlines = true
      wether to draw the gridlines on the plot.
      this.drawMajorGridlines = true
      True to draw gridlines for major axis ticks.
      this.drawMajorTickMarks = true
      True to draw tick marks for major axis ticks.
      this.drawMinorGridlines = false
      True to draw gridlines for minor ticks.
      this.drawMinorTickMarks = true
      True to draw tick marks for minor ticks.
      - - - -
      this.edgeTolerance = -5
      Number of pixels that the label must be away from an axis boundary in order to be drawn.
      this.enableFontSupport = true
      true to turn on native canvas font support in Mozilla 3.5+ and Safari 4+.
      this.enableFontSupport = true
      true to turn on native canvas font support in Mozilla 3.5+ and Safari 4+.
      this.escapeHtml = false
      true to escape html in the box label.
      this.escapeHtml = true
      True to escape html in bubble label text.
      this.escapeHtml = false
      True to escape special characters with their html entity equivalents in legend text.
      this.escapeHtml = false
      True to escape special characters with their html entity equivalents in title text.
      this.escapeHTML = false
      true to escape HTML entities in the label.
      this.escapeHTML = false
      true to escape HTML entities in the label.
      this.escapeHTML = true
      true to escape html entities in the labels.
      - - - -
      true = fade in/out tooltip, flase = show/hide tooltip
      this.fadeTooltip = true
      true = fade in/out tooltip, flase = show/hide tooltip
      this.fill = true
      True to fill the bars.
      this.fill = true
      true or false, wether to fil the slices.
      this.fill = true
      true or false, wether to fill the areas.
      True to fill area between bands [default: true].
      this.fill = true
      true or false, wether to fil the slices.
      this.fill = false
      whether to fill the shape.
      this.fill = false
      whether to fill the shape.
      this.fill = false
      true or false, wether to fill under lines or in bars.
      this.fillAlpha
      Alpha transparency to apply to the fill under the line.
      this.fillAndStroke = false
      If true will stroke the line (with color this.color) as well as fill under it.
      this.fillAxis = 'y'
      Either ‘x’ or ‘y’.
      this.fillBetween = { series1: null, series2: null, color: null, baseSeries: 0, fill: true }
      Fill between 2 line series in a plot.
      css color spec for filled area.
      this.fillColor
      CSS color spec to use for fill under line.
      this.fillDownBody = true
      true to render a “down” day (close price lower than open price) with a filled candlestick body.
      this.fillRect = false
      true to draw shape as a filled rectangle.
      this.fillStyle = '#999999'
      css color spec for the fill style.
      this.fillToValue = 0
      fill a filled series to this value on the fill axis.
      this.fillToZero = false
      true will force bar and filled series to fill toward zero on the fill Axis.
      this.fillUpBody = false
      true to render an “up” day (close price greater than open price) with a filled candlestick body.
      this.followMouse = false
      Tooltip follows the mouse, it is not at a fixed location.
      this.fontFamily
      css spec for the font-family css attribute.
      this.fontFamily = '"Trebuchet MS", Arial, Helvetica, sans-serif'
      CSS spec for the font-family css attribute.
      this.fontFamily = '"Trebuchet MS", Arial, Helvetica, sans-serif'
      css spec for the font-family css attribute.
      this.fontFamily
      css font-family spec for the legend text.
      this.fontFamily
      css font-family spec for the text.
      this.fontSize
      css spec for the font-size css attribute.
      this.fontSize = '11pt'
      CSS spec for font size.
      this.fontSize = '10pt'
      CSS spec for font size.
      this.fontSize
      css spec for the font-size attribute.
      this.fontSize
      css font-size spec for the legend text.
      this.fontSize
      css font-size spec for the text.
      this.fontStretch = 1.0
      Multiplier to condense or expand font width.
      this.fontStretch = 1.0
      Multiplier to condense or expand font width.
      this.fontWeight = 'normal'
      this.fontWeight = 'normal'
      CSS spec for fontWeight
      this.forceTickAt0 = false
      This will ensure that there is always a tick mark at 0.
      this.forceTickAt100 = false
      This will ensure that there is always a tick mark at 100.
      this.formatString = ''
      string passed to the formatter.
      this.formatString = ''
      string passed to the formatter.
      this.formatString = null
      alternative to tooltipFormatString will format the whole tooltip text, populating with x, y values as indicated by tooltipAxes option.
      this.formatString = ''
      string passed to the formatter.
      this.formatter = $.jqplot.DefaultTickFormatter
      A class of a formatter for the tick text.
      this.formatter = $.jqplot.DefaultTickFormatter
      A class of a formatter for the tick text.
      this.formatter = $.jqplot.DefaultTickFormatter
      A class of a formatter for the tick text.
      - -
      - - - - - - - - - - - - \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/docs/index/Properties3.html b/libreplan-webapp/src/main/webapp/jqplot/docs/index/Properties3.html deleted file mode 100644 index c5efc4c47..000000000 --- a/libreplan-webapp/src/main/webapp/jqplot/docs/index/Properties3.html +++ /dev/null @@ -1,46 +0,0 @@ - - -Property Index - - - - - - - - - -
      Property Index
      $#! · 0-9 · A · B · C · D · E · F · G · H · I · J · K · L · M · N · O · P · Q · R · S · T · U · V · W · X · Y · Z
      G
       grid, jqPlot
       gridLineColor, Grid
       gridLineWidth, Grid
       groups, $.jqplot.BarRenderer
      H
       hideZeros, $.jqplot.PointLabels
       highlightAlpha, $.jqplot.BubbleRenderer
       highlightColor, $.jqplot.LineRenderer
       highlightColors
       highlightMouseDown
       highlightMouseOver
       hlc, $.jqplot.OHLCRenderer
       hubRadius, $.jqplot.MeterGaugeRenderer
      I
       index, Series
       innerDiameter, $.jqplot.DonutRenderer
       insertBreaks, $.jqplot.BlockRenderer
       intersectionThreshold, $.jqplot.Cursor
       interval, $.jqplot.LineRenderer
       intervalColors, $.jqplot.MeterGaugeRenderer
       intervalInnerRadius, $.jqplot.MeterGaugeRenderer
       intervalOuterRadius, $.jqplot.MeterGaugeRenderer
       intervals, $.jqplot.MeterGaugeRenderer
       isarc
       isMinorTick
      L
       label
       labelHeightAdjust, $.jqplot.MeterGaugeRenderer
       labelOptions, Axis
       labelPosition
       labelRenderer, Axis
       labels
       labelsFromSeries, $.jqplot.PointLabels
       legend, jqPlot
       lineCap
       lineJoin
       linePattern
       lineWidth
       lineWidthAdjust, $.jqplot.Highlighter
       location
       looseZoom, $.jqplot.Cursor
      - -
      this.grid = new Grid()
      See Grid for grid specific options.
      this.gridLineColor = '#cccccc'
      color of the grid lines.
      this.gridLineWidth = 1.0
      width of the grid lines.
      this.groups = 1
      group bars into this many groups
      - - - -
      this.hideZeros = false
      true to not show a label for a value which is 0.
      this.highlightAlpha = null
      Alpha transparency to apply when highlighting bubble.
      this.highlightColor = null
      color to use when highlighting an area on a filled plot.
      this.highlightColors = []
      an array of colors to use when highlighting a slice.
      this.highlightColors = []
      an array of colors to use when highlighting a bar.
      this.highlightColors = []
      An array of colors to use when highlighting a slice.
      this.highlightColors = []
      an array of colors to use when highlighting a slice.
      this.highlightColors = []
      array of colors to use when highlighting an area.
      this.highlightColors = []
      an array of colors to use when highlighting a slice.
      this.highlightMouseDown = false
      True to highlight when a mouse button is pressed over a slice.
      this.highlightMouseDown = false
      True to highlight when a mouse button is pressed over a slice.
      this.highlightMouseDown = false
      True to highlight when a mouse button is pressed over a bubble.
      this.highlightMouseDown = false
      True to highlight when a mouse button is pressed over a slice.
      this.highlightMouseDown = false
      True to highlight when a mouse button is pressed over a area.
      this.highlightMouseDown = false
      True to highlight when a mouse button is pressed over an area on a filled plot.
      this.highlightMouseDown = false
      True to highlight when a mouse button is pressed over a slice.
      this.highlightMouseOver = true
      True to highlight slice when moused over.
      this.highlightMouseOver = true
      True to highlight slice when moused over.
      this.highlightMouseOver = true
      True to highlight bubbles when moused over.
      this.highlightMouseOver = true
      True to highlight slice when moused over.
      this.highlightMouseOver = true
      True to highlight area when moused over.
      this.highlightMouseOver = true
      True to highlight area on a filled plot when moused over.
      this.highlightMouseOver = true
      True to highlight slice when moused over.
      this.hlc = false
      true if is a hi-low-close chart (no open price).
      this.hubRadius = null
      Radius of the hub at the bottom center of gauge which the needle attaches to.
      - - - -
      this.index
      0 based index of this series in the plot series array.
      this.innerDiameter = null
      Inner diameter of the donut, auto calculated by default.
      this.insertBreaks = true
      true to turn spaces in data block label into html breaks br /.
      this.intersectionThreshold = 2
      pixel distance from data point or marker to consider cursor lines intersecting with point.
      interval: '3%' }
      User specified interval above and below line for bands [default: ‘3%’’].
      this.intervalColors = [ "#4bb2c5", "#EAA228", "#c5b47f", "#579575", "#839557", "#958c12", "#953579", "#4b5de4", "#d8b83f", "#ff5800", "#0085cc", "#c747a3", "#cddf54", "#FBD178", "#26B4E3", "#bd70c7"]
      Array of colors to use for the intervals.
      this.intervalInnerRadius = null
      Radius of the inner circle of the interval ring.
      this.intervalOuterRadius = null
      Radius of the outer circle of the interval ring.
      this.intervals = []
      Array of ranges to be drawn around the gauge.
      this.isarc = false
      wether the shadow is an arc or not.
      this.isarc = false
      wether the shadow is an arc or not.
      this.isMinorTick = false
      if this is a minor tick.
      this.isMinorTick = false
      if this is a minor tick.
      - - - -
      this.label = ''
      The text or html for the label.
      this.label = ''
      label for the axis.
      this.label = null
      A gauge label like ‘kph’ or ‘Volts’
      this.label = ''
      Label for the trend line to use in the legend.
      this.label = null
      Label for the axis
      this.label = ''
      Line label to use in the legend.
      this.labelHeightAdjust = 0
      Number of Pixels to offset the label up (-) or down (+) from its default position.
      this.labelOptions = {}
      Options passed to the label renderer.
      this.labelPosition = 'auto'
      ‘auto’, ‘start’, ‘middle’ or ‘end’.
      this.labelPosition = 'inside'
      Where to position the label, either ‘inside’ or ‘bottom’.
      this.labelRenderer = $.jqplot.AxisLabelRenderer
      A class of a rendering engine for creating an axis label.
      this.labels = []
      array of arrays of labels, one array for each series.
      this.labels = []
      Array of labels to use.
      this.labelsFromSeries = false
      true to use labels within data point arrays.
      this.legend = new Legend()
      see $.jqplot.TableLegendRenderer
      Type of ending placed on the line [‘round’, ‘butt’, ‘square’]
      this.lineCap = 'round'
      how ends of the shadow line are rendered.
      this.lineCap = 'round'
      how ends of the shadow line are rendered.
      this.lineCap = 'round'
      Canvas lineCap style at ends of line.
      this.lineJoin = 'miter'
      How line segments of the shadow are joined.
      this.lineJoin = 'miter'
      How line segments of the shadow are joined.
      this.lineJoin = 'round'
      Canvas lineJoin style between segments of series.
      this.linePattern = 'solid'
      line pattern ‘dashed’, ‘dotted’, ‘solid’, some combination of ‘-’ and ‘.’
      this.linePattern = 'solid'
      line pattern ‘dashed’, ‘dotted’, ‘solid’, some combination of ‘-’ and ‘.’
      Width of the line.
      this.lineWidth = 2
      width of line if areas are stroked and not filled.
      this.lineWidth = 2
      size of the line for non-filled markers.
      this.lineWidth = 1.5
      Width of the hi-low line and open/close ticks.
      this.lineWidth = 1.5
      width of the shadow line stroke.
      this.lineWidth = 1.5
      Width of the trend line.
      this.lineWidth = 2.5
      width of the line in pixels.
      this.lineWidthAdjust = 2.5
      Pixels to add to the lineWidth of the highlight.
      this.location = 'n'
      compass location where to position the label around the point.
      this.location = 'ne'
      Placement of the legend.
      this.looseZoom = true
      Will expand zoom range to provide more rounded tick values.
      - -
      - - - - - - - - - - - - \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/docs/index/Properties4.html b/libreplan-webapp/src/main/webapp/jqplot/docs/index/Properties4.html deleted file mode 100644 index e5e1d4ecc..000000000 --- a/libreplan-webapp/src/main/webapp/jqplot/docs/index/Properties4.html +++ /dev/null @@ -1,50 +0,0 @@ - - -Property Index - - - - - - - - - -
      Property Index
      $#! · 0-9 · A · B · C · D · E · F · G · H · I · J · K · L · M · N · O · P · Q · R · S · T · U · V · W · X · Y · Z
      M
       marginBottom, Legend
       marginLeft, Legend
       marginRight, Legend
       marginTop, Legend
       mark
       markerOptions, Series
       markerRenderer
       markSize
       max
       min
       minorTicks
      N
       name, $.jqplot.CanvasOverlay
       needlePad, $.jqplot.MeterGaugeRenderer
       needleThickness, $.jqplot.MeterGaugeRenderer
       negativeColor, Series
       neighborThreshold, Series
       noDataIndicator, jqPlot
       numberColumns
       numberRows
       numberTicks, Axis
      O
       objects, $.jqplot.CanvasOverlay
       offset, $.jqplot.shadowRenderer
       offsetBars
       openColor, $.jqplot.OHLCRenderer
      P
       pad, Axis
       padding
       padMax, Axis
       padMin, Axis
       pegNeedle, $.jqplot.MeterGaugeRenderer
       placement, Legend
       position
       predraw, Legend
       prefix
       pt2px
      R
       renderer
       rendererOptions
       ringColor, $.jqplot.MeterGaugeRenderer
       ringMargin, $.jqplot.DonutRenderer
       ringWidth, $.jqplot.MeterGaugeRenderer
       rowSpacing, Legend
      - -
      this.marginBottom = null
      CSS margin for the legend DOM element.
      this.marginLeft = null
      CSS margin for the legend DOM element.
      this.marginRight = null
      CSS margin for the legend DOM element.
      this.marginTop = null
      CSS margin for the legend DOM element.
      this.mark = 'outside'
      tick mark on the axis.
      this.mark = 'outside'
      tick mark on the axis.
      this.markerOptions = {}
      renderer specific options to pass to the markerRenderer, see $.jqplot.MarkerRenderer.
      this.markerRenderer = new $.jqplot.MarkerRenderer({shadow:false})
      Renderer used to draw the marker of the highlighted point.
      this.markerRenderer = {show:false}
      Renderer to use to draw markers on the line.
      this.markerRenderer = $.jqplot.MarkerRenderer
      A class of a renderer which will draw marker (e.g.
      this.markSize = 6
      Length of the tick marks in pixels.
      this.markSize = 4
      Length of the tick marks in pixels.
      this.max
      Maximum value on the gauge.
      this.max = null
      maximum value of the axis (in data units, not pixels).
      this.min
      Minimum value on the gauge.
      this.min = null
      minimum value of the axis (in data units, not pixels).
      this.minorTicks = 0
      Number of ticks to add between “major” ticks.
      this.minorTicks = 'auto'
      Number of ticks to add between “major” ticks.
      - - - -
      Optional name for the overlay object.
      this.needlePad = 6
      Padding between needle and inner edge of the ring when the needle is at the min or max gauge value.
      this.needleThickness = null
      Maximum thickness the needle.
      this.negativeColor
      css color spec used for filled (area) plots that are filled to zero and the “useNegativeColors” option is true.
      this.neighborThreshold = 4
      how close or far (in pixels) the cursor must be from a point marker to detect the point.
      Options to set up a mock plot with a data loading indicator if no data is specified.
      this.numberColumns = null
      Maximum number of columns in the legend.
      this.numberColumns = null
      Maximum number of columns in the legend.
      this.numberColumns = null
      Maximum number of columns in the legend.
      this.numberColumns = null
      Maximum number of columns in the legend.
      this.numberColumns = null
      Maximum number of columns in the legend.
      this.numberRows = null
      Maximum number of rows in the legend.
      this.numberRows = null
      Maximum number of rows in the legend.
      this.numberRows = null
      Maximum number of rows in the legend.
      this.numberRows = null
      Maximum number of rows in the legend.
      this.numberRows = null
      Maximum number of rows in the legend.
      this.numberTicks
      Desired number of ticks.
      - - - -
      this.objects = []
      this.offset = 1
      Pixel offset at the given shadow angle of each shadow stroke from the last stroke.
      this.offsetBars = false
      False will center bars on their y value.
      this.openColor = null
      color of the open price tick mark.
      - - - -
      this.pad = 1.2
      Padding to extend the range above and below the data bounds.
      this.padding = 20
      padding between the donut and plot edges, legend, etc.
      this.padding = {top: 20, right: 20, bottom: 20, left: 20}
      padding between the funnel and plot edges, legend, etc.
      this.padding = null
      padding between the meterGauge and plot edges, auto calculated by default.
      this.padding = 20
      padding between the pie and plot edges, legend, etc.
      this.padMax = null
      Padding to extend the range above data bounds.
      this.padMin = null
      Padding to extend the range below data bounds.
      this.pegNeedle = true
      True will stop needle just below/above the min/max values if data is below/above min/max, as if the meter is “pegged”.
      this.placement = "insideGrid"
      “insideGrid” places legend inside the grid area of the plot.
      this.position = null
      Position of axis.
      Wether to draw the legend before the series or not.
      this.prefix = ''
      String to prepend to the tick label.
      this.prefix = ''
      String to prepend to the tick label.
      this.pt2px = null
      Point to pixel scaling factor, used for computing height of bounding box around a label.
      this.pt2px = null
      Point to pixel scaling factor, used for computing height of bounding box around a label.
      - - - -
      this.renderer = new $.jqplot.LineRenderer()
      Renderer to use to draw the trend line.
      this.renderer = $.jqplot.LinearAxisRenderer
      A class of a rendering engine that handles tick generation, scaling input data to pixel grid units and drawing the axis element.
      this.renderer = $.jqplot.CanvasGridRenderer
      Instance of a renderer which will actually render the grid, see $.jqplot.CanvasGridRenderer.
      this.renderer = $.jqplot.LineRenderer
      A class of a renderer which will draw the series, see $.jqplot.LineRenderer.
      this.renderer = $.jqplot.DivTitleRenderer
      A class for creating a DOM element for the title, see $.jqplot.DivTitleRenderer.
      this.rendererOptions = {marker:{show:false}}
      Options to pass to the line renderer.
      this.rendererOptions = {}
      renderer specific options.
      this.rendererOptions = {}
      Options to pass on to the renderer, see $.jqplot.CanvasGridRenderer.
      this.rendererOptions = {}
      renderer specific options passed to the renderer.
      this.rendererOptions = {}
      Options to pass on to the renderer.
      this.rendererOptions = {}
      renderer specific options passed to the renderer.
      this.ringColor = "#BBC6D0"
      color of the outer ring, hub, and needle of the gauge.
      this.ringMargin = null
      pixel distance between rings, or multiple series in a donut plot.
      this.ringWidth = null
      width of the ring around the gauge.
      this.rowSpacing = '0.5em'
      css padding-top spec for the rows in the legend.
      - -
      - - - - - - - - - - - - \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/docs/index/Properties5.html b/libreplan-webapp/src/main/webapp/jqplot/docs/index/Properties5.html deleted file mode 100644 index ae419f32b..000000000 --- a/libreplan-webapp/src/main/webapp/jqplot/docs/index/Properties5.html +++ /dev/null @@ -1,34 +0,0 @@ - - -Property Index - - - - - - - - - -
      Property Index
      $#! · 0-9 · A · B · C · D · E · F · G · H · I · J · K · L · M · N · O · P · Q · R · S · T · U · V · W · X · Y · Z
      S
       sectionMargin, $.jqplot.FunnelRenderer
       series, jqPlot
       seriesColors, jqPlot
       seriesDefaults, jqPlot
       seriesLabelIndex, $.jqplot.PointLabels
       seriesToggle
       shadow
       shadowAlpha
       shadowAngle
       shadowColor, Grid
       shadowDepth
       shadowOffset
       shadowRenderer, $.jqplot.MarkerRenderer
       shadowWidth, Grid
       shapeRenderer, $.jqplot.MarkerRenderer
       show
       showBorders, $.jqplot.MekkoRenderer
       showCursorLegend, $.jqplot.Cursor
       showDataLabels
       showGridline
       showHorizontalLine, $.jqplot.Cursor
       showLabel
       showLabels
       showLine, Series
       showLines, $.jqplot.LineRenderer
       showMark
       showMarker
       showMinorTicks, Axis
       showSwatch, Legend
       showTickLabels, $.jqplot.MeterGaugeRenderer
       showTickMarks, Axis
       showTicks
       showTooltip
       showTooltipDataPosition, $.jqplot.Cursor
       showTooltipGridPosition, $.jqplot.Cursor
       showTooltipOutsideZoom, $.jqplot.Cursor
       showTooltipPrecision, $.jqplot.CanvasOverlay
       showTooltipUnitPosition, $.jqplot.Cursor
       showVerticalLine, $.jqplot.Cursor
       size
       sizeAdjust, $.jqplot.Highlighter
       sliceMargin
       smooth, $.jqplot.LineRenderer
       sortData, jqPlot
       sortMergedLabels, $.jqplot.CategoryAxisRenderer
       stackedValue, $.jqplot.PointLabels
       stackSeries, jqPlot
       start, Line
       startAngle
       stop, Line
       strokeRect, $.jqplot.shapeRenderer
       strokeStyle, $.jqplot.shapeRenderer
       style
       syncTicks, Axis
      - -
      this.sectionMargin = 6
      spacing between funnel sections in pixels.
      this.series = []
      Array of series object options.
      this.seriesColors = $.jqplot.config.defaultColors
      Ann array of CSS color specifications that will be applied, in order, to the series in the plot.
      seriesDefaults: {}, series:[] }
      default options that will be applied to all series.
      this.seriesLabelIndex = null
      array index for location of labels within data point arrays.
      this.seriesToggle = 'normal'
      false to not enable series on/off toggling on the legend.
      wether or not to draw a shadow on the line
      this.shadow = true
      wether or not to draw a shadow on the line
      this.shadow = true
      true or false, wether or not to show the shadow.
      this.shadow = true
      wether to show a shadow behind the grid.
      this.shadowAlpha = 0.08
      transparency of the shadow (0 = transparent, 1 = opaque)
      Alpha channel transparency of shadow.
      this.shadowAlpha = 0.07
      transparency of the shadow (0 = transparent, 1 = opaque)
      this.shadowAlpha = 0.07
      transparency of the shadow (0 = transparent, 1 = opaque)
      this.shadowAlpha = '0.07'
      Alpha channel transparency of shadow.
      this.shadowAlpha = 0.07
      transparency of the shadow (0 = transparent, 1 = opaque)
      this.shadowAlpha = 0.07
      transparency of the shadow (0 = transparent, 1 = opaque)
      this.shadowAlpha = 0.07
      Alpha transparency of the shadow.
      this.shadowAlpha = '0.07'
      Alpha channel transparency of shadow.
      this.shadowAlpha = '0.1'
      Alpha channel transparency of shadow.
      Shadow angle in degrees
      this.shadowAngle = 45
      Shadow angle in degrees
      this.shadowAngle = 45
      Angle of the shadow on the trend line.
      this.shadowAngle = 45
      shadow angle in degrees
      this.shadowAngle = 45
      Shadow angle in degrees
      this.shadowColor = null
      an optional css color spec for the shadow in ‘rgba(n, n, n, n)’ form
      this.shadowDepth = 5
      number of strokes to apply to the shadow, each stroke offset shadowOffset from the last.
      Number of times shadow is stroked, each stroke offset shadowOffset from the last.
      this.shadowDepth = 5
      number of strokes to apply to the shadow, each stroke offset shadowOffset from the last.
      this.shadowDepth = 5
      number of strokes to apply to the shadow, each stroke offset shadowOffset from the last.
      this.shadowDepth = 3
      Number of times shadow is stroked, each stroke offset shadowOffset from the last.
      this.shadowDepth = 4
      number of strokes to apply to the shadow, each stroke offset shadowOffset from the last.
      this.shadowDepth = 5
      number of strokes to apply to the shadow, each stroke offset shadowOffset from the last.
      this.shadowDepth = 3
      number of strokes to make of the shadow.
      this.shadowDepth = 3
      Number of times shadow is stroked, each stroke offset shadowOffset from the last.
      this.shadowDepth = 3
      Number of times shadow is stroked, each stroke offset shadowOffset from the last.
      this.shadowOffset = 2
      offset of the shadow from the slice and offset of each succesive stroke of the shadow from the last.
      Shadow offset from line in pixels
      this.shadowOffset = 2
      offset of the shadow from the slice and offset of each succesive stroke of the shadow from the last.
      this.shadowOffset = 2
      offset of the shadow from the area and offset of each succesive stroke of the shadow from the last.
      this.shadowOffset = 1
      Shadow offset from line in pixels
      this.shadowOffset = 2
      offset of the shadow from the gauge ring and offset of each succesive stroke of the shadow from the last.
      this.shadowOffset = 2
      offset of the shadow from the slice and offset of each succesive stroke of the shadow from the last.
      this.shadowOffset = 1.0
      pixel offset for each stroke of the shadow.
      this.shadowOffset = 1.5
      Offset of each shadow stroke from the border in pixels
      this.shadowOffset = 1.25
      Shadow offset from line in pixels
      this.shadowRenderer = new $.jqplot.ShadowRenderer()
      Renderer that will draws the shadows on the marker.
      this.shadowWidth = 3
      width of the stoke for the shadow
      this.shapeRenderer = new $.jqplot.ShapeRenderer()
      Renderer that will draw the marker.
      this.show = true
      wether or not to show the tick (mark and label).
      this.show = true
      wether or not to show the tick (mark and label).
      this.show = true
      wether or not to show the tick (mark and label).
      this.show = true
      wether or not to show the tick (mark and label).
      true to show (draw), false to not draw.
      this.show = $.jqplot.config.enablePlugins
      wether to show the cursor or not.
      this.show = $.jqplot.config.enablePlugins
      true to show the highlight.
      true to show the bands.
      this.show = true
      wether or not to show the marker.
      this.show = $.jqplot.config.enablePlugins
      show the labels or not.
      this.show = $.jqplot.config.enablePlugins
      Wether or not to show the trend line.
      this.show = false
      Wether to display the axis on the graph.
      this.show = false
      Wether to display the legend on the graph.
      this.show = true
      wether or not to draw the series.
      this.show = true
      wether or not to show the title
      this.showBorders = true
      True to draw borders lines between areas on the chart.
      this.showCursorLegend = false
      Replace the plot legend with an enhanced legend displaying intersection information.
      this.showDataLabels = false
      true to show data labels on slices.
      this.showDataLabels = false
      true to show data labels on slices.
      this.showDataLabels = false
      true to show data labels on slices.
      this.showGridline = true
      wether or not to draw the gridline on the grid at this tick.
      this.showGridline = true
      wether or not to draw the gridline on the grid at this tick.
      this.showHorizontalLine = false
      draw a horizontal line across the plot which follows the cursor.
      this.showLabel = true
      wether or not to show the label.
      this.showLabel = true
      wether or not to show the label.
      this.showLabel = true
      wether or not to show the label.
      this.showLabel = true
      true to show the axis label.
      this.showLabel = true
      true to show label for this series in the legend.
      this.showLabels = true
      True to show labels on bubbles (if any), false to not show.
      this.showLabels = true
      true to show the label text on the legend.
      this.showLine = true
      wether to actually draw the line or not.
      True to show lines at top and bottom of bands [default: false].
      this.showMark = true
      wether or not to show the mark on the axis.
      this.showMark = true
      wether or not to show the mark on the axis.
      this.showMarker = true
      true to show the marker
      this.showMarker = true
      wether or not to show the markers at the data points.
      this.showMinorTicks = true
      Wether or not to show minor ticks.
      this.showSwatches = true
      true to show the color swatches on the legend.
      this.showTickLabels = true
      true to show tick labels next to ticks.
      this.showTickMarks = true
      Wether to show the tick marks (line crossing grid) or not.
      this.showTicks = true
      true to show ticks around gauge.
      this.showTicks = true
      Wether to show the ticks (both marks and labels) or not.
      Show a tooltip with data point values.
      this.showTooltip = true
      show a cursor position tooltip.
      this.showTooltip = true
      Show a tooltip with data point values.
      this.showTooltipDataPosition = false
      Used with showVerticalLine to show intersecting data points in the tooltip.
      this.showTooltipGridPosition = false
      show the grid pixel coordinates of the mouse.
      this.showTooltipOutsideZoom = false
      True will keep updating the tooltip when zooming of the grid.
      Controls how close to line cursor must be to show tooltip.
      this.showTooltipUnitPosition = true
      show the unit (data) coordinates of the mouse.
      this.showVerticalLine = false
      draw a vertical line across the plot which follows the cursor.
      this.size = 4
      Length of the tick beyond the grid in pixels.
      this.size = 9.0
      Size of the marker (diameter or circle, length of edge of square, etc.)
      this.sizeAdjust = 5
      Pixels to add to the overall size of the highlight.
      this.sliceMargin = 0
      angular spacing between donut slices in degrees.
      this.sliceMargin = 0
      angular spacing between pie slices in degrees.
      this.renderer.smooth = false
      True to draw a smoothed (interpolated) line through the data points with automatically computed number of smoothing points.
      this.sortData = true
      false to not sort the data passed in by the user.
      this.sortMergedLabels = false
      True to sort tick labels when labels are created by merging x axis values from multiple series.
      this.stackedValue = false
      true to display value as stacked in a stacked plot.
      this.stackSeries = false
      true or false, creates a stack or “mountain” plot.
      [x, y] coordinates for the start of the line.
      this.startAngle = 0
      Angle to start drawing donut in degrees.
      this.startAngle = 0
      Angle to start drawing pie in degrees.
      stop: [] }
      [x, y] coordinates for the end of the line.
      this.strokeRect = false
      true to draw shape as a stroked rectangle.
      this.strokeStyle = '#999999'
      css color spec for the stoke style
      this.style = 'crosshair'
      CSS spec for cursor style
      this.style = 'filledCircle'
      One of diamond, circle, square, x, plus, dash, filledDiamond, filledCircle, filledSquare
      this.syncTicks = null
      true to try and synchronize tick spacing across multiple axes so that ticks and grid lines line up.
      - -
      - - - - - - - - - - - - \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/docs/index/Properties6.html b/libreplan-webapp/src/main/webapp/jqplot/docs/index/Properties6.html deleted file mode 100644 index e2e7e9207..000000000 --- a/libreplan-webapp/src/main/webapp/jqplot/docs/index/Properties6.html +++ /dev/null @@ -1,58 +0,0 @@ - - -Property Index - - - - - - - - - -
      Property Index
      $#! · 0-9 · A · B · C · D · E · F · G · H · I · J · K · L · M · N · O · P · Q · R · S · T · U · V · W · X · Y · Z
      T
       text, Title
       textAlign, Title
       textColor
       themes, $.jqplot.ThemeEngine
       thickness, $.jqplot.DonutRenderer
       tickColor, $.jqplot.MeterGaugeRenderer
       tickInset
       tickInterval, Axis
       tickLength, $.jqplot.OHLCRenderer
       tickMode, $.jqplot.MekkoAxisRenderer
       tickOptions, Axis
       tickPadding, $.jqplot.MeterGaugeRenderer
       tickRenderer
       ticks
       tickSpacing
       title, jqPlot
       tooltipAxes, $.jqplot.Highlighter
       tooltipAxisGroups, $.jqplot.Cursor
       tooltipFadeSpeed
       tooltipFormatString
       tooltipLocation
       tooltipOffset
       transposedData, $.jqplot.BarRenderer
       type, $.jqplot.Trendline
      U
       upBodyColor, $.jqplot.OHLCRenderer
       useAxesFormatters
       useNegativeColors, Series
       useSeriesColor, Axis
      V
       varyBarColor, $.jqplot.BarRenderer
       varyBlockColors, $.jqplot.BlockRenderer
       varyBubbleColors, $.jqplot.BubbleRenderer
      W
       waterfall, $.jqplot.BarRenderer
       wickColor, $.jqplot.OHLCRenderer
       widthRatio, $.jqplot.FunnelRenderer
      X
       xaxis
       xmax, HorizontalLine
       xmin, HorizontalLine
       xoffset, Legend
       xpadding, $.jqplot.PointLabels
      Y
       y, HorizontalLine
       yaxis
       yoffset, Legend
       ypadding, $.jqplot.PointLabels
       yvalues, $.jqplot.Highlighter
      Z
       zoom, $.jqplot.Cursor
      - -
      this.text = text
      text of the title;
      this.textAlign
      css text-align spec for the text.
      this.textColor
      css spec for the color attribute.
      this.textColor = '#666666'
      css spec for the color attribute.
      this.textColor = '#666666'
      css spec for the color attribute.
      this.textColor
      css color spec for the legend text.
      this.textColor
      css color spec for the text.
      this.themes = {}
      hash of themes managed by the theme engine.
      this.thickness = null
      thickness of the donut, auto computed by default Overridden by if innerDiameter is specified.
      this.tickColor = "989898"
      color of the tick marks around the gauge.
      this.tickInset = 0
      Controls the amount to inset the first and last ticks from the edges of the grid, in multiples of the tick interval.
      this.tickInset = 0
      Controls the amount to inset the first and last ticks from the edges of the grid, in multiples of the tick interval.
      this.tickInterval
      number of units between ticks.
      this.tickLength = 'auto'
      length of the line in pixels indicating open and close price.
      this.tickMode
      How to space the ticks on the axis.
      this.tickOptions = {}
      Options that will be passed to the tickRenderer, see $.jqplot.AxisTickRenderer options.
      this.tickPadding = null
      padding of the tick marks to the outer ring and the tick labels to marks.
      A class of a rendering engine for creating the ticks labels displayed on the plot, See $.jqplot.AxisTickRenderer.
      A class of a rendering engine for creating the ticks labels displayed on the plot, See $.jqplot.AxisTickRenderer.
      this.tickRenderer = $.jqplot.AxisTickRenderer
      A class of a rendering engine for creating the ticks labels displayed on the plot, See $.jqplot.AxisTickRenderer.
      this.ticks = []
      Array of tick values.
      this.ticks = []
      1D [val, val, ...] or 2D [[val, label], [val, label], ...] array of ticks for the axis.
      this.tickSpacing = 30
      Degrees between ticks.
      this.tickSpacing = 75
      Approximate pixel spacing between ticks on graph.
      this.title = new Title()
      Title object.
      this.tooltipAxes = 'both'
      Which axes to display in tooltip, ‘x’, ‘y’ or ‘both’, ‘xy’ or ‘yx’ ‘both’ and ‘xy’ are equivalent, ‘yx’ reverses order of labels.
      this.tooltipAxisGroups = []
      Show position for the specified axes.
      ‘slow’, ‘def’, ‘fast’, or number of milliseconds.
      this.tooltipFadeSpeed = "fast"
      ‘slow’, ‘def’, ‘fast’, or number of milliseconds.
      tooltipFormatString: '%d, %d' }
      Format string passed the x and y values of the cursor on the line.
      this.tooltipFormatString = '%.4P, %.4P'
      sprintf format string for the tooltip.
      this.tooltipFormatString = '%.5P'
      sprintf format string for the tooltip.
      Where to position tooltip, ‘n’, ‘ne’, ‘e’, ‘se’, ‘s’, ‘sw’, ‘w’, ‘nw’
      this.tooltipLocation = 'se'
      Where to position tooltip.
      this.tooltipLocation = 'nw'
      Where to position tooltip, ‘n’, ‘ne’, ‘e’, ‘se’, ‘s’, ‘sw’, ‘w’, ‘nw’
      Pixel offset of tooltip from the highlight.
      this.tooltipOffset = 6
      Pixel offset of tooltip from the grid boudaries or cursor center.
      this.tooltipOffset = 2
      Pixel offset of tooltip from the highlight.
      this.transposedData = true
      NOT IMPLEMENTED YET.
      this.type = 'linear'
      Either ‘exponential’, ‘exp’, or ‘linear’.
      - - - -
      this.upBodyColor = null
      Color of candlestick body of an “up” day.
      this.useAxesFormatters = true
      Use the x and y axes formatters to format the text in the tooltip.
      this.useAxesFormatters = true
      Use the x and y axes formatters to format the text in the tooltip.
      this.useNegativeColors = true
      true to color negative values differently in filled and bar charts.
      this.useSeriesColor = false
      Use the color of the first series associated with this axis for the tick marks and line bordering this axis.
      - - - -
      this.varyBarColor = false
      true to color each bar of a series separately rather than have every bar of a given series the same color.
      this.varyBlockColors = false
      true to vary the color of each block in this series according to the seriesColors array.
      this.varyBubbleColors = true
      True to vary the color of each bubble in this series according to the seriesColors array.
      - - - -
      this.waterfall = false
      true to enable waterfall plot.
      this.wickColor = null
      color of the hi-lo line thorugh the candlestick body.
      this.widthRatio = 0.2
      The ratio of the width of the top of the funnel to the bottom.
      - - - -
      X axis to use for positioning/scaling the line.
      this.xaxis = 'xaxis'
      which x axis to use with this series, either ‘xaxis’ or ‘x2axis’.
      x value for the end of the line, null to scale to axis max.
      x value for the start of the line, null to scale to axis min.
      this.xoffset = 0
      DEPRECATED.
      this.xpadding = 6
      horizontal padding in pixels between point and label
      - - - -
      y value to position the line
      Y axis to use for positioning/scaling the line.
      this.yaxis = 'yaxis'
      which y axis to use with this series, either ‘yaxis’ or ‘y2axis’.
      this.yoffset = 0
      DEPRECATED.
      this.ypadding = 6
      vertical padding in pixels between point and label
      this.yvalues = 1
      Number of y values to expect in the data point array.
      - - - -
      this.zoom = false
      Enable plot zooming.
      - -
      - - - - - - - - - - - - \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/docs/javascript/main.js b/libreplan-webapp/src/main/webapp/jqplot/docs/javascript/main.js deleted file mode 100644 index efcdca966..000000000 --- a/libreplan-webapp/src/main/webapp/jqplot/docs/javascript/main.js +++ /dev/null @@ -1,836 +0,0 @@ -// This file is part of Natural Docs, which is Copyright (C) 2003-2008 Greg Valure -// Natural Docs is licensed under the GPL - - -// -// Browser Styles -// ____________________________________________________________________________ - -var agt=navigator.userAgent.toLowerCase(); -var browserType; -var browserVer; - -if (agt.indexOf("opera") != -1) - { - browserType = "Opera"; - - if (agt.indexOf("opera 7") != -1 || agt.indexOf("opera/7") != -1) - { browserVer = "Opera7"; } - else if (agt.indexOf("opera 8") != -1 || agt.indexOf("opera/8") != -1) - { browserVer = "Opera8"; } - else if (agt.indexOf("opera 9") != -1 || agt.indexOf("opera/9") != -1) - { browserVer = "Opera9"; } - } - -else if (agt.indexOf("applewebkit") != -1) - { - browserType = "Safari"; - - if (agt.indexOf("version/3") != -1) - { browserVer = "Safari3"; } - else if (agt.indexOf("safari/4") != -1) - { browserVer = "Safari2"; } - } - -else if (agt.indexOf("khtml") != -1) - { - browserType = "Konqueror"; - } - -else if (agt.indexOf("msie") != -1) - { - browserType = "IE"; - - if (agt.indexOf("msie 6") != -1) - { browserVer = "IE6"; } - else if (agt.indexOf("msie 7") != -1) - { browserVer = "IE7"; } - } - -else if (agt.indexOf("gecko") != -1) - { - browserType = "Firefox"; - - if (agt.indexOf("rv:1.7") != -1) - { browserVer = "Firefox1"; } - else if (agt.indexOf("rv:1.8)") != -1 || agt.indexOf("rv:1.8.0") != -1) - { browserVer = "Firefox15"; } - else if (agt.indexOf("rv:1.8.1") != -1) - { browserVer = "Firefox2"; } - } - - -// -// Support Functions -// ____________________________________________________________________________ - - -function GetXPosition(item) - { - var position = 0; - - if (item.offsetWidth != null) - { - while (item != document.body && item != null) - { - position += item.offsetLeft; - item = item.offsetParent; - }; - }; - - return position; - }; - - -function GetYPosition(item) - { - var position = 0; - - if (item.offsetWidth != null) - { - while (item != document.body && item != null) - { - position += item.offsetTop; - item = item.offsetParent; - }; - }; - - return position; - }; - - -function MoveToPosition(item, x, y) - { - // Opera 5 chokes on the px extension, so it can use the Microsoft one instead. - - if (item.style.left != null) - { - item.style.left = x + "px"; - item.style.top = y + "px"; - } - else if (item.style.pixelLeft != null) - { - item.style.pixelLeft = x; - item.style.pixelTop = y; - }; - }; - - -// -// Menu -// ____________________________________________________________________________ - - -function ToggleMenu(id) - { - if (!window.document.getElementById) - { return; }; - - var display = window.document.getElementById(id).style.display; - - if (display == "none") - { display = "block"; } - else - { display = "none"; } - - window.document.getElementById(id).style.display = display; - } - -function HideAllBut(ids, max) - { - if (document.getElementById) - { - ids.sort( function(a,b) { return a - b; } ); - var number = 1; - - while (number < max) - { - if (ids.length > 0 && number == ids[0]) - { ids.shift(); } - else - { - document.getElementById("MGroupContent" + number).style.display = "none"; - }; - - number++; - }; - }; - } - - -// -// Tooltips -// ____________________________________________________________________________ - - -var tooltipTimer = 0; - -function ShowTip(event, tooltipID, linkID) - { - if (tooltipTimer) - { clearTimeout(tooltipTimer); }; - - var docX = event.clientX + window.pageXOffset; - var docY = event.clientY + window.pageYOffset; - - var showCommand = "ReallyShowTip('" + tooltipID + "', '" + linkID + "', " + docX + ", " + docY + ")"; - - tooltipTimer = setTimeout(showCommand, 1000); - } - -function ReallyShowTip(tooltipID, linkID, docX, docY) - { - tooltipTimer = 0; - - var tooltip; - var link; - - if (document.getElementById) - { - tooltip = document.getElementById(tooltipID); - link = document.getElementById(linkID); - } -/* else if (document.all) - { - tooltip = eval("document.all['" + tooltipID + "']"); - link = eval("document.all['" + linkID + "']"); - } -*/ - if (tooltip) - { - var left = GetXPosition(link); - var top = GetYPosition(link); - top += link.offsetHeight; - - - // The fallback method is to use the mouse X and Y relative to the document. We use a separate if and test if its a number - // in case some browser snuck through the above if statement but didn't support everything. - - if (!isFinite(top) || top == 0) - { - left = docX; - top = docY; - } - - // Some spacing to get it out from under the cursor. - - top += 10; - - // Make sure the tooltip doesnt get smushed by being too close to the edge, or in some browsers, go off the edge of the - // page. We do it here because Konqueror does get offsetWidth right even if it doesnt get the positioning right. - - if (tooltip.offsetWidth != null) - { - var width = tooltip.offsetWidth; - var docWidth = document.body.clientWidth; - - if (left + width > docWidth) - { left = docWidth - width - 1; } - - // If there's a horizontal scroll bar we could go past zero because it's using the page width, not the window width. - if (left < 0) - { left = 0; }; - } - - MoveToPosition(tooltip, left, top); - tooltip.style.visibility = "visible"; - } - } - -function HideTip(tooltipID) - { - if (tooltipTimer) - { - clearTimeout(tooltipTimer); - tooltipTimer = 0; - } - - var tooltip; - - if (document.getElementById) - { tooltip = document.getElementById(tooltipID); } - else if (document.all) - { tooltip = eval("document.all['" + tooltipID + "']"); } - - if (tooltip) - { tooltip.style.visibility = "hidden"; } - } - - -// -// Blockquote fix for IE -// ____________________________________________________________________________ - - -function NDOnLoad() - { - if (browserVer == "IE6") - { - var scrollboxes = document.getElementsByTagName('blockquote'); - - if (scrollboxes.item(0)) - { - NDDoResize(); - window.onresize=NDOnResize; - }; - }; - }; - - -var resizeTimer = 0; - -function NDOnResize() - { - if (resizeTimer != 0) - { clearTimeout(resizeTimer); }; - - resizeTimer = setTimeout(NDDoResize, 250); - }; - - -function NDDoResize() - { - var scrollboxes = document.getElementsByTagName('blockquote'); - - var i; - var item; - - i = 0; - while (item = scrollboxes.item(i)) - { - item.style.width = 100; - i++; - }; - - i = 0; - while (item = scrollboxes.item(i)) - { - item.style.width = item.parentNode.offsetWidth; - i++; - }; - - clearTimeout(resizeTimer); - resizeTimer = 0; - } - - - -/* ________________________________________________________________________________________________________ - - Class: SearchPanel - ________________________________________________________________________________________________________ - - A class handling everything associated with the search panel. - - Parameters: - - name - The name of the global variable that will be storing this instance. Is needed to be able to set timeouts. - mode - The mode the search is going to work in. Pass CommandLineOption()>, so the - value will be something like "HTML" or "FramedHTML". - - ________________________________________________________________________________________________________ -*/ - - -function SearchPanel(name, mode, resultsPath) - { - if (!name || !mode || !resultsPath) - { alert("Incorrect parameters to SearchPanel."); }; - - - // Group: Variables - // ________________________________________________________________________ - - /* - var: name - The name of the global variable that will be storing this instance of the class. - */ - this.name = name; - - /* - var: mode - The mode the search is going to work in, such as "HTML" or "FramedHTML". - */ - this.mode = mode; - - /* - var: resultsPath - The relative path from the current HTML page to the results page directory. - */ - this.resultsPath = resultsPath; - - /* - var: keyTimeout - The timeout used between a keystroke and when a search is performed. - */ - this.keyTimeout = 0; - - /* - var: keyTimeoutLength - The length of in thousandths of a second. - */ - this.keyTimeoutLength = 500; - - /* - var: lastSearchValue - The last search string executed, or an empty string if none. - */ - this.lastSearchValue = ""; - - /* - var: lastResultsPage - The last results page. The value is only relevant if is set. - */ - this.lastResultsPage = ""; - - /* - var: deactivateTimeout - - The timeout used between when a control is deactivated and when the entire panel is deactivated. Is necessary - because a control may be deactivated in favor of another control in the same panel, in which case it should stay - active. - */ - this.deactivateTimout = 0; - - /* - var: deactivateTimeoutLength - The length of in thousandths of a second. - */ - this.deactivateTimeoutLength = 200; - - - - - // Group: DOM Elements - // ________________________________________________________________________ - - - // Function: DOMSearchField - this.DOMSearchField = function() - { return document.getElementById("MSearchField"); }; - - // Function: DOMSearchType - this.DOMSearchType = function() - { return document.getElementById("MSearchType"); }; - - // Function: DOMPopupSearchResults - this.DOMPopupSearchResults = function() - { return document.getElementById("MSearchResults"); }; - - // Function: DOMPopupSearchResultsWindow - this.DOMPopupSearchResultsWindow = function() - { return document.getElementById("MSearchResultsWindow"); }; - - // Function: DOMSearchPanel - this.DOMSearchPanel = function() - { return document.getElementById("MSearchPanel"); }; - - - - - // Group: Event Handlers - // ________________________________________________________________________ - - - /* - Function: OnSearchFieldFocus - Called when focus is added or removed from the search field. - */ - this.OnSearchFieldFocus = function(isActive) - { - this.Activate(isActive); - }; - - - /* - Function: OnSearchFieldChange - Called when the content of the search field is changed. - */ - this.OnSearchFieldChange = function() - { - if (this.keyTimeout) - { - clearTimeout(this.keyTimeout); - this.keyTimeout = 0; - }; - - var searchValue = this.DOMSearchField().value.replace(/ +/g, ""); - - if (searchValue != this.lastSearchValue) - { - if (searchValue != "") - { - this.keyTimeout = setTimeout(this.name + ".Search()", this.keyTimeoutLength); - } - else - { - if (this.mode == "HTML") - { this.DOMPopupSearchResultsWindow().style.display = "none"; }; - this.lastSearchValue = ""; - }; - }; - }; - - - /* - Function: OnSearchTypeFocus - Called when focus is added or removed from the search type. - */ - this.OnSearchTypeFocus = function(isActive) - { - this.Activate(isActive); - }; - - - /* - Function: OnSearchTypeChange - Called when the search type is changed. - */ - this.OnSearchTypeChange = function() - { - var searchValue = this.DOMSearchField().value.replace(/ +/g, ""); - - if (searchValue != "") - { - this.Search(); - }; - }; - - - - // Group: Action Functions - // ________________________________________________________________________ - - - /* - Function: CloseResultsWindow - Closes the results window. - */ - this.CloseResultsWindow = function() - { - this.DOMPopupSearchResultsWindow().style.display = "none"; - this.Activate(false, true); - }; - - - /* - Function: Search - Performs a search. - */ - this.Search = function() - { - this.keyTimeout = 0; - - var searchValue = this.DOMSearchField().value.replace(/^ +/, ""); - var searchTopic = this.DOMSearchType().value; - - var pageExtension = searchValue.substr(0,1); - - if (pageExtension.match(/^[a-z]/i)) - { pageExtension = pageExtension.toUpperCase(); } - else if (pageExtension.match(/^[0-9]/)) - { pageExtension = 'Numbers'; } - else - { pageExtension = "Symbols"; }; - - var resultsPage; - var resultsPageWithSearch; - var hasResultsPage; - - // indexSectionsWithContent is defined in searchdata.js - if (indexSectionsWithContent[searchTopic][pageExtension] == true) - { - resultsPage = this.resultsPath + '/' + searchTopic + pageExtension + '.html'; - resultsPageWithSearch = resultsPage+'?'+escape(searchValue); - hasResultsPage = true; - } - else - { - resultsPage = this.resultsPath + '/NoResults.html'; - resultsPageWithSearch = resultsPage; - hasResultsPage = false; - }; - - var resultsFrame; - if (this.mode == "HTML") - { resultsFrame = window.frames.MSearchResults; } - else if (this.mode == "FramedHTML") - { resultsFrame = window.top.frames['Content']; }; - - - if (resultsPage != this.lastResultsPage || - - // Bug in IE. If everything becomes hidden in a run, none of them will be able to be reshown in the next for some - // reason. It counts the right number of results, and you can even read the display as "block" after setting it, but it - // just doesn't work in IE 6 or IE 7. So if we're on the right page but the previous search had no results, reload the - // page anyway to get around the bug. - (browserType == "IE" && hasResultsPage && - (!resultsFrame.searchResults || resultsFrame.searchResults.lastMatchCount == 0)) ) - - { - resultsFrame.location.href = resultsPageWithSearch; - } - - // So if the results page is right and there's no IE bug, reperform the search on the existing page. We have to check if there - // are results because NoResults.html doesn't have any JavaScript, and it would be useless to do anything on that page even - // if it did. - else if (hasResultsPage) - { - // We need to check if this exists in case the frame is present but didn't finish loading. - if (resultsFrame.searchResults) - { resultsFrame.searchResults.Search(searchValue); } - - // Otherwise just reload instead of waiting. - else - { resultsFrame.location.href = resultsPageWithSearch; }; - }; - - - var domPopupSearchResultsWindow = this.DOMPopupSearchResultsWindow(); - - if (this.mode == "HTML" && domPopupSearchResultsWindow.style.display != "block") - { - var domSearchType = this.DOMSearchType(); - - var left = GetXPosition(domSearchType); - var top = GetYPosition(domSearchType) + domSearchType.offsetHeight; - - MoveToPosition(domPopupSearchResultsWindow, left, top); - domPopupSearchResultsWindow.style.display = 'block'; - }; - - - this.lastSearchValue = searchValue; - this.lastResultsPage = resultsPage; - }; - - - - // Group: Activation Functions - // Functions that handle whether the entire panel is active or not. - // ________________________________________________________________________ - - - /* - Function: Activate - - Activates or deactivates the search panel, resetting things to their default values if necessary. You can call this on every - control's OnBlur() and it will handle not deactivating the entire panel when focus is just switching between them transparently. - - Parameters: - - isActive - Whether you're activating or deactivating the panel. - ignoreDeactivateDelay - Set if you're positive the action will deactivate the panel and thus want to skip the delay. - */ - this.Activate = function(isActive, ignoreDeactivateDelay) - { - // We want to ignore isActive being false while the results window is open. - if (isActive || (this.mode == "HTML" && this.DOMPopupSearchResultsWindow().style.display == "block")) - { - if (this.inactivateTimeout) - { - clearTimeout(this.inactivateTimeout); - this.inactivateTimeout = 0; - }; - - this.DOMSearchPanel().className = 'MSearchPanelActive'; - - var searchField = this.DOMSearchField(); - - if (searchField.value == 'Search') - { searchField.value = ""; } - } - else if (!ignoreDeactivateDelay) - { - this.inactivateTimeout = setTimeout(this.name + ".InactivateAfterTimeout()", this.inactivateTimeoutLength); - } - else - { - this.InactivateAfterTimeout(); - }; - }; - - - /* - Function: InactivateAfterTimeout - - Called by , which is set by . Inactivation occurs on a timeout because a control may - receive OnBlur() when focus is really transferring to another control in the search panel. In this case we don't want to - actually deactivate the panel because not only would that cause a visible flicker but it could also reset the search value. - So by doing it on a timeout instead, there's a short period where the second control's OnFocus() can cancel the deactivation. - */ - this.InactivateAfterTimeout = function() - { - this.inactivateTimeout = 0; - - this.DOMSearchPanel().className = 'MSearchPanelInactive'; - this.DOMSearchField().value = "Search"; - - this.lastSearchValue = ""; - this.lastResultsPage = ""; - }; - }; - - - - -/* ________________________________________________________________________________________________________ - - Class: SearchResults - _________________________________________________________________________________________________________ - - The class that handles everything on the search results page. - _________________________________________________________________________________________________________ -*/ - - -function SearchResults(name, mode) - { - /* - var: mode - The mode the search is going to work in, such as "HTML" or "FramedHTML". - */ - this.mode = mode; - - /* - var: lastMatchCount - The number of matches from the last run of . - */ - this.lastMatchCount = 0; - - - /* - Function: Toggle - Toggles the visibility of the passed element ID. - */ - this.Toggle = function(id) - { - if (this.mode == "FramedHTML") - { return; }; - - var parentElement = document.getElementById(id); - - var element = parentElement.firstChild; - - while (element && element != parentElement) - { - if (element.nodeName == 'DIV' && element.className == 'ISubIndex') - { - if (element.style.display == 'block') - { element.style.display = "none"; } - else - { element.style.display = 'block'; } - }; - - if (element.nodeName == 'DIV' && element.hasChildNodes()) - { element = element.firstChild; } - else if (element.nextSibling) - { element = element.nextSibling; } - else - { - do - { - element = element.parentNode; - } - while (element && element != parentElement && !element.nextSibling); - - if (element && element != parentElement) - { element = element.nextSibling; }; - }; - }; - }; - - - /* - Function: Search - - Searches for the passed string. If there is no parameter, it takes it from the URL query. - - Always returns true, since other documents may try to call it and that may or may not be possible. - */ - this.Search = function(search) - { - if (!search) - { - search = window.location.search; - search = search.substring(1); // Remove the leading ? - search = unescape(search); - }; - - search = search.replace(/^ +/, ""); - search = search.replace(/ +$/, ""); - search = search.toLowerCase(); - - if (search.match(/[^a-z0-9]/)) // Just a little speedup so it doesn't have to go through the below unnecessarily. - { - search = search.replace(/\_/g, "_und"); - search = search.replace(/\ +/gi, "_spc"); - search = search.replace(/\~/g, "_til"); - search = search.replace(/\!/g, "_exc"); - search = search.replace(/\@/g, "_att"); - search = search.replace(/\#/g, "_num"); - search = search.replace(/\$/g, "_dol"); - search = search.replace(/\%/g, "_pct"); - search = search.replace(/\^/g, "_car"); - search = search.replace(/\&/g, "_amp"); - search = search.replace(/\*/g, "_ast"); - search = search.replace(/\(/g, "_lpa"); - search = search.replace(/\)/g, "_rpa"); - search = search.replace(/\-/g, "_min"); - search = search.replace(/\+/g, "_plu"); - search = search.replace(/\=/g, "_equ"); - search = search.replace(/\{/g, "_lbc"); - search = search.replace(/\}/g, "_rbc"); - search = search.replace(/\[/g, "_lbk"); - search = search.replace(/\]/g, "_rbk"); - search = search.replace(/\:/g, "_col"); - search = search.replace(/\;/g, "_sco"); - search = search.replace(/\"/g, "_quo"); - search = search.replace(/\'/g, "_apo"); - search = search.replace(/\/g, "_ran"); - search = search.replace(/\,/g, "_com"); - search = search.replace(/\./g, "_per"); - search = search.replace(/\?/g, "_que"); - search = search.replace(/\//g, "_sla"); - search = search.replace(/[^a-z0-9\_]i/gi, "_zzz"); - }; - - var resultRows = document.getElementsByTagName("div"); - var matches = 0; - - var i = 0; - while (i < resultRows.length) - { - var row = resultRows.item(i); - - if (row.className == "SRResult") - { - var rowMatchName = row.id.toLowerCase(); - rowMatchName = rowMatchName.replace(/^sr\d*_/, ''); - - if (search.length <= rowMatchName.length && rowMatchName.substr(0, search.length) == search) - { - row.style.display = "block"; - matches++; - } - else - { row.style.display = "none"; }; - }; - - i++; - }; - - document.getElementById("Searching").style.display="none"; - - if (matches == 0) - { document.getElementById("NoMatches").style.display="block"; } - else - { document.getElementById("NoMatches").style.display="none"; } - - this.lastMatchCount = matches; - - return true; - }; - }; - diff --git a/libreplan-webapp/src/main/webapp/jqplot/docs/javascript/searchdata.js b/libreplan-webapp/src/main/webapp/jqplot/docs/javascript/searchdata.js deleted file mode 100644 index 691a4e6c3..000000000 --- a/libreplan-webapp/src/main/webapp/jqplot/docs/javascript/searchdata.js +++ /dev/null @@ -1,182 +0,0 @@ -var indexSectionsWithContent = { - "General": { - "Symbols": true, - "Numbers": false, - "A": true, - "B": true, - "C": true, - "D": true, - "E": true, - "F": true, - "G": true, - "H": true, - "I": true, - "J": true, - "K": false, - "L": true, - "M": true, - "N": true, - "O": true, - "P": true, - "Q": false, - "R": true, - "S": true, - "T": true, - "U": true, - "V": true, - "W": true, - "X": true, - "Y": true, - "Z": true - }, - "Functions": { - "Symbols": false, - "Numbers": false, - "A": false, - "B": false, - "C": true, - "D": true, - "E": false, - "F": false, - "G": true, - "H": false, - "I": true, - "J": false, - "K": false, - "L": false, - "M": true, - "N": true, - "O": false, - "P": false, - "Q": false, - "R": true, - "S": true, - "T": false, - "U": false, - "V": false, - "W": false, - "X": false, - "Y": false, - "Z": true - }, - "Files": { - "Symbols": false, - "Numbers": false, - "A": false, - "B": false, - "C": false, - "D": false, - "E": false, - "F": false, - "G": false, - "H": false, - "I": false, - "J": true, - "K": false, - "L": false, - "M": false, - "N": false, - "O": false, - "P": false, - "Q": false, - "R": false, - "S": false, - "T": false, - "U": false, - "V": false, - "W": false, - "X": false, - "Y": false, - "Z": false - }, - "Classes": { - "Symbols": true, - "Numbers": false, - "A": true, - "B": false, - "C": false, - "D": true, - "E": false, - "F": false, - "G": true, - "H": true, - "I": false, - "J": true, - "K": false, - "L": true, - "M": false, - "N": false, - "O": false, - "P": false, - "Q": false, - "R": false, - "S": true, - "T": true, - "U": false, - "V": true, - "W": false, - "X": false, - "Y": false, - "Z": false - }, - "Hooks": { - "Symbols": false, - "Numbers": false, - "A": true, - "B": false, - "C": false, - "D": false, - "E": true, - "F": false, - "G": false, - "H": false, - "I": false, - "J": true, - "K": false, - "L": false, - "M": false, - "N": false, - "O": false, - "P": true, - "Q": false, - "R": false, - "S": false, - "T": false, - "U": false, - "V": false, - "W": false, - "X": false, - "Y": false, - "Z": false - }, - "Properties": { - "Symbols": false, - "Numbers": false, - "A": true, - "B": true, - "C": true, - "D": true, - "E": true, - "F": true, - "G": true, - "H": true, - "I": true, - "J": false, - "K": false, - "L": true, - "M": true, - "N": true, - "O": true, - "P": true, - "Q": false, - "R": true, - "S": true, - "T": true, - "U": true, - "V": true, - "W": true, - "X": true, - "Y": true, - "Z": true - } - } \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/docs/search/ClassesA.html b/libreplan-webapp/src/main/webapp/jqplot/docs/search/ClassesA.html deleted file mode 100644 index 2f4dab577..000000000 --- a/libreplan-webapp/src/main/webapp/jqplot/docs/search/ClassesA.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - - - - -
      Loading...
      Searching...
      No Matches
      \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/docs/search/ClassesD.html b/libreplan-webapp/src/main/webapp/jqplot/docs/search/ClassesD.html deleted file mode 100644 index 135eeb6a2..000000000 --- a/libreplan-webapp/src/main/webapp/jqplot/docs/search/ClassesD.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - - - - -
      Loading...
      Searching...
      No Matches
      \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/docs/search/ClassesG.html b/libreplan-webapp/src/main/webapp/jqplot/docs/search/ClassesG.html deleted file mode 100644 index 36f121b0a..000000000 --- a/libreplan-webapp/src/main/webapp/jqplot/docs/search/ClassesG.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - - - - -
      Loading...
      Searching...
      No Matches
      \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/docs/search/ClassesH.html b/libreplan-webapp/src/main/webapp/jqplot/docs/search/ClassesH.html deleted file mode 100644 index c411b320f..000000000 --- a/libreplan-webapp/src/main/webapp/jqplot/docs/search/ClassesH.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - - - - -
      Loading...
      Searching...
      No Matches
      \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/docs/search/ClassesJ.html b/libreplan-webapp/src/main/webapp/jqplot/docs/search/ClassesJ.html deleted file mode 100644 index b22500983..000000000 --- a/libreplan-webapp/src/main/webapp/jqplot/docs/search/ClassesJ.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - - - - -
      Loading...
      Searching...
      No Matches
      \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/docs/search/ClassesL.html b/libreplan-webapp/src/main/webapp/jqplot/docs/search/ClassesL.html deleted file mode 100644 index 6a93b819d..000000000 --- a/libreplan-webapp/src/main/webapp/jqplot/docs/search/ClassesL.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - - - - -
      Loading...
      Searching...
      No Matches
      \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/docs/search/ClassesS.html b/libreplan-webapp/src/main/webapp/jqplot/docs/search/ClassesS.html deleted file mode 100644 index 53823e7dc..000000000 --- a/libreplan-webapp/src/main/webapp/jqplot/docs/search/ClassesS.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - - - - -
      Loading...
      Searching...
      No Matches
      \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/docs/search/ClassesSymbols.html b/libreplan-webapp/src/main/webapp/jqplot/docs/search/ClassesSymbols.html deleted file mode 100644 index 53396614d..000000000 --- a/libreplan-webapp/src/main/webapp/jqplot/docs/search/ClassesSymbols.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - - - - - \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/docs/search/ClassesT.html b/libreplan-webapp/src/main/webapp/jqplot/docs/search/ClassesT.html deleted file mode 100644 index 782f11db1..000000000 --- a/libreplan-webapp/src/main/webapp/jqplot/docs/search/ClassesT.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - - - - -
      Loading...
      Searching...
      No Matches
      \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/docs/search/ClassesV.html b/libreplan-webapp/src/main/webapp/jqplot/docs/search/ClassesV.html deleted file mode 100644 index 62d2e7cb2..000000000 --- a/libreplan-webapp/src/main/webapp/jqplot/docs/search/ClassesV.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - - - - -
      Loading...
      Searching...
      No Matches
      \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/docs/search/FilesJ.html b/libreplan-webapp/src/main/webapp/jqplot/docs/search/FilesJ.html deleted file mode 100644 index 3c66afa02..000000000 --- a/libreplan-webapp/src/main/webapp/jqplot/docs/search/FilesJ.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - - - - -
      Loading...
      Searching...
      No Matches
      \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/docs/search/FunctionsC.html b/libreplan-webapp/src/main/webapp/jqplot/docs/search/FunctionsC.html deleted file mode 100644 index 40135d3a6..000000000 --- a/libreplan-webapp/src/main/webapp/jqplot/docs/search/FunctionsC.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - - - - -
      Loading...
      copy, $.jqplot.ThemeEngine
      Searching...
      No Matches
      \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/docs/search/FunctionsD.html b/libreplan-webapp/src/main/webapp/jqplot/docs/search/FunctionsD.html deleted file mode 100644 index 2c2bed5db..000000000 --- a/libreplan-webapp/src/main/webapp/jqplot/docs/search/FunctionsD.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - - - - -
      Loading...
      destroy, jqPlot
      drawSeries, jqPlot
      Searching...
      No Matches
      \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/docs/search/FunctionsG.html b/libreplan-webapp/src/main/webapp/jqplot/docs/search/FunctionsG.html deleted file mode 100644 index 561eabc01..000000000 --- a/libreplan-webapp/src/main/webapp/jqplot/docs/search/FunctionsG.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - - - - -
      Loading...
      get, $.jqplot.ThemeEngine
      getThemeNames, $.jqplot.ThemeEngine
      getThemes, $.jqplot.ThemeEngine
      Searching...
      No Matches
      \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/docs/search/FunctionsI.html b/libreplan-webapp/src/main/webapp/jqplot/docs/search/FunctionsI.html deleted file mode 100644 index 450909835..000000000 --- a/libreplan-webapp/src/main/webapp/jqplot/docs/search/FunctionsI.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - - - - -
      Loading...
      init, jqPlot
      Searching...
      No Matches
      \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/docs/search/FunctionsM.html b/libreplan-webapp/src/main/webapp/jqplot/docs/search/FunctionsM.html deleted file mode 100644 index 0b6446cb9..000000000 --- a/libreplan-webapp/src/main/webapp/jqplot/docs/search/FunctionsM.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - - - - -
      Loading...
      moveBlock, $.jqplot.BlockRenderer
      Searching...
      No Matches
      \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/docs/search/FunctionsN.html b/libreplan-webapp/src/main/webapp/jqplot/docs/search/FunctionsN.html deleted file mode 100644 index 7cc60bfec..000000000 --- a/libreplan-webapp/src/main/webapp/jqplot/docs/search/FunctionsN.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - - - - -
      Loading...
      newTheme, $.jqplot.ThemeEngine
      Searching...
      No Matches
      \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/docs/search/FunctionsR.html b/libreplan-webapp/src/main/webapp/jqplot/docs/search/FunctionsR.html deleted file mode 100644 index fac0dbcc8..000000000 --- a/libreplan-webapp/src/main/webapp/jqplot/docs/search/FunctionsR.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - - - - -
      Loading...
      redraw, jqPlot
      reInitialize, jqPlot
      remove, $.jqplot.ThemeEngine
      rename, $.jqplot.ThemeEngine
      replot, jqPlot
      Searching...
      No Matches
      \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/docs/search/FunctionsS.html b/libreplan-webapp/src/main/webapp/jqplot/docs/search/FunctionsS.html deleted file mode 100644 index bab767cf1..000000000 --- a/libreplan-webapp/src/main/webapp/jqplot/docs/search/FunctionsS.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - - - - -
      Loading...
      Searching...
      No Matches
      \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/docs/search/FunctionsZ.html b/libreplan-webapp/src/main/webapp/jqplot/docs/search/FunctionsZ.html deleted file mode 100644 index 4b364e983..000000000 --- a/libreplan-webapp/src/main/webapp/jqplot/docs/search/FunctionsZ.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - - - - -
      Loading...
      zoomProxy, $.jqplot.Cursor.$.jqplot.Cursor
      Searching...
      No Matches
      \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/docs/search/GeneralA.html b/libreplan-webapp/src/main/webapp/jqplot/docs/search/GeneralA.html deleted file mode 100644 index f62a230b9..000000000 --- a/libreplan-webapp/src/main/webapp/jqplot/docs/search/GeneralA.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - - - - -
      Loading...
      activeTheme, $.jqplot.ThemeEngine
      addLegendRowHooks, $.jqplot.$.jqplot
      alignTicks, $.jqplot.LinearAxisRenderer
      alpha, $.jqplot.shadowRenderer
      animate, jqPlot
      autoscale, Axis
      autoscaleBubbles, $.jqplot.BubbleRenderer
      autoscaleMultiplier, $.jqplot.BubbleRenderer
      autoscalePointsFactor, $.jqplot.BubbleRenderer
      axes, jqPlot
      axesDefaults, jqPlot
      axisDefaults, $.jqplot.LogAxisRenderer
      Searching...
      No Matches
      \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/docs/search/GeneralB.html b/libreplan-webapp/src/main/webapp/jqplot/docs/search/GeneralB.html deleted file mode 100644 index 06a97030e..000000000 --- a/libreplan-webapp/src/main/webapp/jqplot/docs/search/GeneralB.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - - - - -
      Loading...
      bandData, $.jqplot.LineRenderer
      bands, $.jqplot.LineRenderer
      barDirection, $.jqplot.BarRenderer
      barLabelOptions, $.jqplot.MekkoAxisRenderer
      barLabelRenderer, $.jqplot.MekkoAxisRenderer
      barLabels, $.jqplot.MekkoAxisRenderer
      barMargin, $.jqplot.BarRenderer
      barWidth, $.jqplot.BarRenderer
      bodyWidth, $.jqplot.OHLCRenderer
      border, Legend
      breakOnNull, Series
      breakPoints, $.jqplot.LinearAxisRenderer
      breakTickLabel, $.jqplot.LinearAxisRenderer
      bringSeriesToFront, $.jqplot.Highlighter
      bubbleAlpha, $.jqplot.BubbleRenderer
      bubbleGradients, $.jqplot.BubbleRenderer
      Searching...
      No Matches
      \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/docs/search/GeneralC.html b/libreplan-webapp/src/main/webapp/jqplot/docs/search/GeneralC.html deleted file mode 100644 index 20bb76ec9..000000000 --- a/libreplan-webapp/src/main/webapp/jqplot/docs/search/GeneralC.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - - - - -
      Loading...
      candleStick, $.jqplot.OHLCRenderer
      clearRect, $.jqplot.shapeRenderer
      clickReset, $.jqplot.Cursor
      closeColor, $.jqplot.OHLCRenderer
      constrainOutsideZoom, $.jqplot.Cursor
      constrainSmoothing, $.jqplot.LineRenderer
      constrainTo, $.jqplot.Dragable
      constrainZoomTo, $.jqplot.Cursor
      copy, $.jqplot.ThemeEngine
      css, $.jqplot.BlockRenderer
      cursorLegendFormatString, $.jqplot.Cursor
      Searching...
      No Matches
      \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/docs/search/GeneralD.html b/libreplan-webapp/src/main/webapp/jqplot/docs/search/GeneralD.html deleted file mode 100644 index 3c759ce2d..000000000 --- a/libreplan-webapp/src/main/webapp/jqplot/docs/search/GeneralD.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - - - - - \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/docs/search/GeneralE.html b/libreplan-webapp/src/main/webapp/jqplot/docs/search/GeneralE.html deleted file mode 100644 index 5f3a9205a..000000000 --- a/libreplan-webapp/src/main/webapp/jqplot/docs/search/GeneralE.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - - - - -
      Loading...
      edgeTolerance, $.jqplot.PointLabels
      eventListenerHooks, $.jqplot.$.jqplot
      Searching...
      No Matches
      \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/docs/search/GeneralF.html b/libreplan-webapp/src/main/webapp/jqplot/docs/search/GeneralF.html deleted file mode 100644 index c1af77c88..000000000 --- a/libreplan-webapp/src/main/webapp/jqplot/docs/search/GeneralF.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - - - - - \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/docs/search/GeneralG.html b/libreplan-webapp/src/main/webapp/jqplot/docs/search/GeneralG.html deleted file mode 100644 index 092df1505..000000000 --- a/libreplan-webapp/src/main/webapp/jqplot/docs/search/GeneralG.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - - - - -
      Loading...
      get, $.jqplot.ThemeEngine
      getThemeNames, $.jqplot.ThemeEngine
      getThemes, $.jqplot.ThemeEngine
      grid, jqPlot
      groups, $.jqplot.BarRenderer
      Searching...
      No Matches
      \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/docs/search/GeneralH.html b/libreplan-webapp/src/main/webapp/jqplot/docs/search/GeneralH.html deleted file mode 100644 index ff6d0676d..000000000 --- a/libreplan-webapp/src/main/webapp/jqplot/docs/search/GeneralH.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - - - - -
      Loading...
      hideZeros, $.jqplot.PointLabels
      highlightAlpha, $.jqplot.BubbleRenderer
      highlightColor, $.jqplot.LineRenderer
      hlc, $.jqplot.OHLCRenderer
      Hooks, $.jqplot
      hubRadius, $.jqplot.MeterGaugeRenderer
      Searching...
      No Matches
      \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/docs/search/GeneralI.html b/libreplan-webapp/src/main/webapp/jqplot/docs/search/GeneralI.html deleted file mode 100644 index 7873ee408..000000000 --- a/libreplan-webapp/src/main/webapp/jqplot/docs/search/GeneralI.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - - - - -
      Loading...
      index, Series
      init, jqPlot
      innerDiameter, $.jqplot.DonutRenderer
      insertBreaks, $.jqplot.BlockRenderer
      intersectionThreshold, $.jqplot.Cursor
      interval, $.jqplot.LineRenderer
      intervalColors, $.jqplot.MeterGaugeRenderer
      intervalInnerRadius, $.jqplot.MeterGaugeRenderer
      intervalOuterRadius, $.jqplot.MeterGaugeRenderer
      intervals, $.jqplot.MeterGaugeRenderer
      Searching...
      No Matches
      \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/docs/search/GeneralJ.html b/libreplan-webapp/src/main/webapp/jqplot/docs/search/GeneralJ.html deleted file mode 100644 index fe560304a..000000000 --- a/libreplan-webapp/src/main/webapp/jqplot/docs/search/GeneralJ.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - - - - -
      Loading...
      Searching...
      No Matches
      \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/docs/search/GeneralL.html b/libreplan-webapp/src/main/webapp/jqplot/docs/search/GeneralL.html deleted file mode 100644 index 0fc128968..000000000 --- a/libreplan-webapp/src/main/webapp/jqplot/docs/search/GeneralL.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - - - - - \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/docs/search/GeneralM.html b/libreplan-webapp/src/main/webapp/jqplot/docs/search/GeneralM.html deleted file mode 100644 index 53789facf..000000000 --- a/libreplan-webapp/src/main/webapp/jqplot/docs/search/GeneralM.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - - - - - \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/docs/search/GeneralN.html b/libreplan-webapp/src/main/webapp/jqplot/docs/search/GeneralN.html deleted file mode 100644 index d282c7883..000000000 --- a/libreplan-webapp/src/main/webapp/jqplot/docs/search/GeneralN.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - - - - -
      Loading...
      name, $.jqplot.CanvasOverlay
      needlePad, $.jqplot.MeterGaugeRenderer
      needleThickness, $.jqplot.MeterGaugeRenderer
      newTheme, $.jqplot.ThemeEngine
      Searching...
      No Matches
      \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/docs/search/GeneralO.html b/libreplan-webapp/src/main/webapp/jqplot/docs/search/GeneralO.html deleted file mode 100644 index bac068d9c..000000000 --- a/libreplan-webapp/src/main/webapp/jqplot/docs/search/GeneralO.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - - - - -
      Loading...
      objects, $.jqplot.CanvasOverlay
      offset, $.jqplot.shadowRenderer
      openColor, $.jqplot.OHLCRenderer
      Searching...
      No Matches
      \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/docs/search/GeneralP.html b/libreplan-webapp/src/main/webapp/jqplot/docs/search/GeneralP.html deleted file mode 100644 index 25e44059d..000000000 --- a/libreplan-webapp/src/main/webapp/jqplot/docs/search/GeneralP.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - - - - -
      Loading...
      pad, Axis
      padMax, Axis
      padMin, Axis
      pegNeedle, $.jqplot.MeterGaugeRenderer
      placement, Legend
      postDrawHooks, $.jqplot.$.jqplot
      postDrawSeriesHooks, $.jqplot.$.jqplot
      postDrawSeriesShadowHooks, $.jqplot.$.jqplot
      postInitHooks, $.jqplot.$.jqplot
      postParseOptionsHooks, $.jqplot.$.jqplot
      postParseSeriesOptionsHooks, $.jqplot.$.jqplot
      postSeriesInitHooks, $.jqplot.$.jqplot
      predraw, Legend
      preDrawHooks, $.jqplot.$.jqplot
      preDrawLegendHooks, $.jqplot.$.jqplot
      preDrawSeriesHooks, $.jqplot.$.jqplot
      preDrawSeriesShadowHooks, $.jqplot.$.jqplot
      preInitHooks, $.jqplot.$.jqplot
      preParseOptionsHooks, $.jqplot.$.jqplot
      preParseSeriesOptionsHooks, $.jqplot.$.jqplot
      preSeriesInitHooks, $.jqplot.$.jqplot
      Searching...
      No Matches
      \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/docs/search/GeneralR.html b/libreplan-webapp/src/main/webapp/jqplot/docs/search/GeneralR.html deleted file mode 100644 index 830dac937..000000000 --- a/libreplan-webapp/src/main/webapp/jqplot/docs/search/GeneralR.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - - - - -
      Loading...
      redraw, jqPlot
      reInitialize, jqPlot
      remove, $.jqplot.ThemeEngine
      rename, $.jqplot.ThemeEngine
      replot, jqPlot
      ringColor, $.jqplot.MeterGaugeRenderer
      ringMargin, $.jqplot.DonutRenderer
      ringWidth, $.jqplot.MeterGaugeRenderer
      rowSpacing, Legend
      Searching...
      No Matches
      \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/docs/search/GeneralS.html b/libreplan-webapp/src/main/webapp/jqplot/docs/search/GeneralS.html deleted file mode 100644 index 1980bbeee..000000000 --- a/libreplan-webapp/src/main/webapp/jqplot/docs/search/GeneralS.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - - - - -
      Loading...
      sectionMargin, $.jqplot.FunnelRenderer
      series, jqPlot
      seriesColors, jqPlot
      seriesLabelIndex, $.jqplot.PointLabels
      shadowRenderer, $.jqplot.MarkerRenderer
      shapeRenderer, $.jqplot.MarkerRenderer
      showBorders, $.jqplot.MekkoRenderer
      showCursorLegend, $.jqplot.Cursor
      showHorizontalLine, $.jqplot.Cursor
      showLine, Series
      showLines, $.jqplot.LineRenderer
      showSwatch, Legend
      showTickLabels, $.jqplot.MeterGaugeRenderer
      showTooltipDataPosition, $.jqplot.Cursor
      showTooltipGridPosition, $.jqplot.Cursor
      showTooltipOutsideZoom, $.jqplot.Cursor
      showTooltipPrecision, $.jqplot.CanvasOverlay
      showTooltipUnitPosition, $.jqplot.Cursor
      showVerticalLine, $.jqplot.Cursor
      sizeAdjust, $.jqplot.Highlighter
      smooth, $.jqplot.LineRenderer
      sortData, jqPlot
      sortMergedLabels, $.jqplot.CategoryAxisRenderer
      stackedValue, $.jqplot.PointLabels
      stackSeries, jqPlot
      start, Line
      stop, Line
      strokeRect, $.jqplot.shapeRenderer
      strokeStyle, $.jqplot.shapeRenderer
      syncTicks, Axis
      Searching...
      No Matches
      \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/docs/search/GeneralSymbols.html b/libreplan-webapp/src/main/webapp/jqplot/docs/search/GeneralSymbols.html deleted file mode 100644 index 53396614d..000000000 --- a/libreplan-webapp/src/main/webapp/jqplot/docs/search/GeneralSymbols.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - - - - - \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/docs/search/GeneralT.html b/libreplan-webapp/src/main/webapp/jqplot/docs/search/GeneralT.html deleted file mode 100644 index 20f4ead98..000000000 --- a/libreplan-webapp/src/main/webapp/jqplot/docs/search/GeneralT.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - - - - -
      Loading...
      text, Title
      textAlign, Title
      themes, $.jqplot.ThemeEngine
      thickness, $.jqplot.DonutRenderer
      tickColor, $.jqplot.MeterGaugeRenderer
      tickLength, $.jqplot.OHLCRenderer
      tickMode, $.jqplot.MekkoAxisRenderer
      tickPadding, $.jqplot.MeterGaugeRenderer
      title, jqPlot
      tooltipAxes, $.jqplot.Highlighter
      tooltipAxisGroups, $.jqplot.Cursor
      transposedData, $.jqplot.BarRenderer
      type, $.jqplot.Trendline
      Searching...
      No Matches
      \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/docs/search/GeneralU.html b/libreplan-webapp/src/main/webapp/jqplot/docs/search/GeneralU.html deleted file mode 100644 index 31bcbf122..000000000 --- a/libreplan-webapp/src/main/webapp/jqplot/docs/search/GeneralU.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - - - - -
      Loading...
      upBodyColor, $.jqplot.OHLCRenderer
      Searching...
      No Matches
      \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/docs/search/GeneralV.html b/libreplan-webapp/src/main/webapp/jqplot/docs/search/GeneralV.html deleted file mode 100644 index 51af427ec..000000000 --- a/libreplan-webapp/src/main/webapp/jqplot/docs/search/GeneralV.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - - - - -
      Loading...
      varyBarColor, $.jqplot.BarRenderer
      varyBlockColors, $.jqplot.BlockRenderer
      varyBubbleColors, $.jqplot.BubbleRenderer
      Searching...
      No Matches
      \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/docs/search/GeneralW.html b/libreplan-webapp/src/main/webapp/jqplot/docs/search/GeneralW.html deleted file mode 100644 index ce589762e..000000000 --- a/libreplan-webapp/src/main/webapp/jqplot/docs/search/GeneralW.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - - - - -
      Loading...
      waterfall, $.jqplot.BarRenderer
      wickColor, $.jqplot.OHLCRenderer
      widthRatio, $.jqplot.FunnelRenderer
      Searching...
      No Matches
      \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/docs/search/GeneralX.html b/libreplan-webapp/src/main/webapp/jqplot/docs/search/GeneralX.html deleted file mode 100644 index 443e98c48..000000000 --- a/libreplan-webapp/src/main/webapp/jqplot/docs/search/GeneralX.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - - - - -
      Loading...
      xmax, HorizontalLine
      xmin, HorizontalLine
      xoffset, Legend
      xpadding, $.jqplot.PointLabels
      Searching...
      No Matches
      \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/docs/search/GeneralY.html b/libreplan-webapp/src/main/webapp/jqplot/docs/search/GeneralY.html deleted file mode 100644 index 8f6ea7a62..000000000 --- a/libreplan-webapp/src/main/webapp/jqplot/docs/search/GeneralY.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - - - - -
      Loading...
      y, HorizontalLine
      yoffset, Legend
      ypadding, $.jqplot.PointLabels
      yvalues, $.jqplot.Highlighter
      Searching...
      No Matches
      \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/docs/search/GeneralZ.html b/libreplan-webapp/src/main/webapp/jqplot/docs/search/GeneralZ.html deleted file mode 100644 index 1e8baa080..000000000 --- a/libreplan-webapp/src/main/webapp/jqplot/docs/search/GeneralZ.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - - - - -
      Loading...
      zoom, $.jqplot.Cursor
      zoomProxy, $.jqplot.Cursor.$.jqplot.Cursor
      Searching...
      No Matches
      \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/docs/search/HooksA.html b/libreplan-webapp/src/main/webapp/jqplot/docs/search/HooksA.html deleted file mode 100644 index 82b17cda6..000000000 --- a/libreplan-webapp/src/main/webapp/jqplot/docs/search/HooksA.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - - - - -
      Loading...
      addLegendRowHooks, $.jqplot.$.jqplot
      Searching...
      No Matches
      \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/docs/search/HooksE.html b/libreplan-webapp/src/main/webapp/jqplot/docs/search/HooksE.html deleted file mode 100644 index fe464932e..000000000 --- a/libreplan-webapp/src/main/webapp/jqplot/docs/search/HooksE.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - - - - -
      Loading...
      eventListenerHooks, $.jqplot.$.jqplot
      Searching...
      No Matches
      \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/docs/search/HooksJ.html b/libreplan-webapp/src/main/webapp/jqplot/docs/search/HooksJ.html deleted file mode 100644 index f94e00368..000000000 --- a/libreplan-webapp/src/main/webapp/jqplot/docs/search/HooksJ.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - - - - -
      Loading...
      Searching...
      No Matches
      \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/docs/search/HooksP.html b/libreplan-webapp/src/main/webapp/jqplot/docs/search/HooksP.html deleted file mode 100644 index eb28c716c..000000000 --- a/libreplan-webapp/src/main/webapp/jqplot/docs/search/HooksP.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - - - - -
      Loading...
      postDrawHooks, $.jqplot.$.jqplot
      postDrawSeriesHooks, $.jqplot.$.jqplot
      postDrawSeriesShadowHooks, $.jqplot.$.jqplot
      postInitHooks, $.jqplot.$.jqplot
      postParseOptionsHooks, $.jqplot.$.jqplot
      postParseSeriesOptionsHooks, $.jqplot.$.jqplot
      postSeriesInitHooks, $.jqplot.$.jqplot
      preDrawHooks, $.jqplot.$.jqplot
      preDrawLegendHooks, $.jqplot.$.jqplot
      preDrawSeriesHooks, $.jqplot.$.jqplot
      preDrawSeriesShadowHooks, $.jqplot.$.jqplot
      preInitHooks, $.jqplot.$.jqplot
      preParseOptionsHooks, $.jqplot.$.jqplot
      preParseSeriesOptionsHooks, $.jqplot.$.jqplot
      preSeriesInitHooks, $.jqplot.$.jqplot
      Searching...
      No Matches
      \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/docs/search/NoResults.html b/libreplan-webapp/src/main/webapp/jqplot/docs/search/NoResults.html deleted file mode 100644 index d2459c05e..000000000 --- a/libreplan-webapp/src/main/webapp/jqplot/docs/search/NoResults.html +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - - - - - - - -
      No Matches
      \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/docs/search/PropertiesA.html b/libreplan-webapp/src/main/webapp/jqplot/docs/search/PropertiesA.html deleted file mode 100644 index 386d9e899..000000000 --- a/libreplan-webapp/src/main/webapp/jqplot/docs/search/PropertiesA.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - - - - -
      Loading...
      activeTheme, $.jqplot.ThemeEngine
      alignTicks, $.jqplot.LinearAxisRenderer
      alpha, $.jqplot.shadowRenderer
      animate, jqPlot
      autoscale, Axis
      autoscaleBubbles, $.jqplot.BubbleRenderer
      autoscaleMultiplier, $.jqplot.BubbleRenderer
      autoscalePointsFactor, $.jqplot.BubbleRenderer
      axes, jqPlot
      axesDefaults, jqPlot
      axisDefaults, $.jqplot.LogAxisRenderer
      Searching...
      No Matches
      \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/docs/search/PropertiesB.html b/libreplan-webapp/src/main/webapp/jqplot/docs/search/PropertiesB.html deleted file mode 100644 index a6cef468d..000000000 --- a/libreplan-webapp/src/main/webapp/jqplot/docs/search/PropertiesB.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - - - - -
      Loading...
      bandData, $.jqplot.LineRenderer
      barDirection, $.jqplot.BarRenderer
      barLabelOptions, $.jqplot.MekkoAxisRenderer
      barLabelRenderer, $.jqplot.MekkoAxisRenderer
      barLabels, $.jqplot.MekkoAxisRenderer
      barMargin, $.jqplot.BarRenderer
      barWidth, $.jqplot.BarRenderer
      bodyWidth, $.jqplot.OHLCRenderer
      border, Legend
      breakOnNull, Series
      breakPoints, $.jqplot.LinearAxisRenderer
      breakTickLabel, $.jqplot.LinearAxisRenderer
      bringSeriesToFront, $.jqplot.Highlighter
      bubbleAlpha, $.jqplot.BubbleRenderer
      bubbleGradients, $.jqplot.BubbleRenderer
      Searching...
      No Matches
      \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/docs/search/PropertiesC.html b/libreplan-webapp/src/main/webapp/jqplot/docs/search/PropertiesC.html deleted file mode 100644 index a30bf3da3..000000000 --- a/libreplan-webapp/src/main/webapp/jqplot/docs/search/PropertiesC.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - - - - -
      Loading...
      candleStick, $.jqplot.OHLCRenderer
      clearRect, $.jqplot.shapeRenderer
      clickReset, $.jqplot.Cursor
      closeColor, $.jqplot.OHLCRenderer
      constrainOutsideZoom, $.jqplot.Cursor
      constrainSmoothing, $.jqplot.LineRenderer
      constrainTo, $.jqplot.Dragable
      constrainZoomTo, $.jqplot.Cursor
      css, $.jqplot.BlockRenderer
      cursorLegendFormatString, $.jqplot.Cursor
      Searching...
      No Matches
      \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/docs/search/PropertiesD.html b/libreplan-webapp/src/main/webapp/jqplot/docs/search/PropertiesD.html deleted file mode 100644 index e0380eae7..000000000 --- a/libreplan-webapp/src/main/webapp/jqplot/docs/search/PropertiesD.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - - - - - \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/docs/search/PropertiesE.html b/libreplan-webapp/src/main/webapp/jqplot/docs/search/PropertiesE.html deleted file mode 100644 index 5bb760ff9..000000000 --- a/libreplan-webapp/src/main/webapp/jqplot/docs/search/PropertiesE.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - - - - -
      Loading...
      edgeTolerance, $.jqplot.PointLabels
      Searching...
      No Matches
      \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/docs/search/PropertiesF.html b/libreplan-webapp/src/main/webapp/jqplot/docs/search/PropertiesF.html deleted file mode 100644 index cf90670b8..000000000 --- a/libreplan-webapp/src/main/webapp/jqplot/docs/search/PropertiesF.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - - - - - \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/docs/search/PropertiesG.html b/libreplan-webapp/src/main/webapp/jqplot/docs/search/PropertiesG.html deleted file mode 100644 index 3a7573d17..000000000 --- a/libreplan-webapp/src/main/webapp/jqplot/docs/search/PropertiesG.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - - - - -
      Loading...
      grid, jqPlot
      groups, $.jqplot.BarRenderer
      Searching...
      No Matches
      \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/docs/search/PropertiesH.html b/libreplan-webapp/src/main/webapp/jqplot/docs/search/PropertiesH.html deleted file mode 100644 index ca8f802e4..000000000 --- a/libreplan-webapp/src/main/webapp/jqplot/docs/search/PropertiesH.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - - - - -
      Loading...
      hideZeros, $.jqplot.PointLabels
      highlightAlpha, $.jqplot.BubbleRenderer
      highlightColor, $.jqplot.LineRenderer
      hlc, $.jqplot.OHLCRenderer
      hubRadius, $.jqplot.MeterGaugeRenderer
      Searching...
      No Matches
      \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/docs/search/PropertiesI.html b/libreplan-webapp/src/main/webapp/jqplot/docs/search/PropertiesI.html deleted file mode 100644 index 289adc8d8..000000000 --- a/libreplan-webapp/src/main/webapp/jqplot/docs/search/PropertiesI.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - - - - -
      Loading...
      index, Series
      innerDiameter, $.jqplot.DonutRenderer
      insertBreaks, $.jqplot.BlockRenderer
      intersectionThreshold, $.jqplot.Cursor
      interval, $.jqplot.LineRenderer
      intervalColors, $.jqplot.MeterGaugeRenderer
      intervalInnerRadius, $.jqplot.MeterGaugeRenderer
      intervalOuterRadius, $.jqplot.MeterGaugeRenderer
      intervals, $.jqplot.MeterGaugeRenderer
      Searching...
      No Matches
      \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/docs/search/PropertiesL.html b/libreplan-webapp/src/main/webapp/jqplot/docs/search/PropertiesL.html deleted file mode 100644 index 2465230d8..000000000 --- a/libreplan-webapp/src/main/webapp/jqplot/docs/search/PropertiesL.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - - - - - \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/docs/search/PropertiesM.html b/libreplan-webapp/src/main/webapp/jqplot/docs/search/PropertiesM.html deleted file mode 100644 index 80a53cbf1..000000000 --- a/libreplan-webapp/src/main/webapp/jqplot/docs/search/PropertiesM.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - - - - -
      Loading...
      marginBottom, Legend
      marginLeft, Legend
      marginRight, Legend
      marginTop, Legend
      Searching...
      No Matches
      \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/docs/search/PropertiesN.html b/libreplan-webapp/src/main/webapp/jqplot/docs/search/PropertiesN.html deleted file mode 100644 index c60188302..000000000 --- a/libreplan-webapp/src/main/webapp/jqplot/docs/search/PropertiesN.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - - - - -
      Loading...
      name, $.jqplot.CanvasOverlay
      needlePad, $.jqplot.MeterGaugeRenderer
      needleThickness, $.jqplot.MeterGaugeRenderer
      Searching...
      No Matches
      \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/docs/search/PropertiesO.html b/libreplan-webapp/src/main/webapp/jqplot/docs/search/PropertiesO.html deleted file mode 100644 index e3e5f594a..000000000 --- a/libreplan-webapp/src/main/webapp/jqplot/docs/search/PropertiesO.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - - - - -
      Loading...
      objects, $.jqplot.CanvasOverlay
      offset, $.jqplot.shadowRenderer
      openColor, $.jqplot.OHLCRenderer
      Searching...
      No Matches
      \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/docs/search/PropertiesP.html b/libreplan-webapp/src/main/webapp/jqplot/docs/search/PropertiesP.html deleted file mode 100644 index f1a4b167a..000000000 --- a/libreplan-webapp/src/main/webapp/jqplot/docs/search/PropertiesP.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - - - - -
      Loading...
      pad, Axis
      padMax, Axis
      padMin, Axis
      pegNeedle, $.jqplot.MeterGaugeRenderer
      placement, Legend
      predraw, Legend
      Searching...
      No Matches
      \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/docs/search/PropertiesR.html b/libreplan-webapp/src/main/webapp/jqplot/docs/search/PropertiesR.html deleted file mode 100644 index a462e0991..000000000 --- a/libreplan-webapp/src/main/webapp/jqplot/docs/search/PropertiesR.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - - - - -
      Loading...
      ringColor, $.jqplot.MeterGaugeRenderer
      ringMargin, $.jqplot.DonutRenderer
      ringWidth, $.jqplot.MeterGaugeRenderer
      rowSpacing, Legend
      Searching...
      No Matches
      \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/docs/search/PropertiesS.html b/libreplan-webapp/src/main/webapp/jqplot/docs/search/PropertiesS.html deleted file mode 100644 index e347d720e..000000000 --- a/libreplan-webapp/src/main/webapp/jqplot/docs/search/PropertiesS.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - - - - -
      Loading...
      sectionMargin, $.jqplot.FunnelRenderer
      series, jqPlot
      seriesColors, jqPlot
      seriesLabelIndex, $.jqplot.PointLabels
      shadowRenderer, $.jqplot.MarkerRenderer
      shapeRenderer, $.jqplot.MarkerRenderer
      showBorders, $.jqplot.MekkoRenderer
      showCursorLegend, $.jqplot.Cursor
      showHorizontalLine, $.jqplot.Cursor
      showLine, Series
      showLines, $.jqplot.LineRenderer
      showSwatch, Legend
      showTickLabels, $.jqplot.MeterGaugeRenderer
      showTooltipDataPosition, $.jqplot.Cursor
      showTooltipGridPosition, $.jqplot.Cursor
      showTooltipOutsideZoom, $.jqplot.Cursor
      showTooltipPrecision, $.jqplot.CanvasOverlay
      showTooltipUnitPosition, $.jqplot.Cursor
      showVerticalLine, $.jqplot.Cursor
      sizeAdjust, $.jqplot.Highlighter
      smooth, $.jqplot.LineRenderer
      sortData, jqPlot
      sortMergedLabels, $.jqplot.CategoryAxisRenderer
      stackedValue, $.jqplot.PointLabels
      stackSeries, jqPlot
      start, Line
      stop, Line
      strokeRect, $.jqplot.shapeRenderer
      strokeStyle, $.jqplot.shapeRenderer
      syncTicks, Axis
      Searching...
      No Matches
      \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/docs/search/PropertiesT.html b/libreplan-webapp/src/main/webapp/jqplot/docs/search/PropertiesT.html deleted file mode 100644 index bc107de45..000000000 --- a/libreplan-webapp/src/main/webapp/jqplot/docs/search/PropertiesT.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - - - - -
      Loading...
      text, Title
      textAlign, Title
      themes, $.jqplot.ThemeEngine
      thickness, $.jqplot.DonutRenderer
      tickColor, $.jqplot.MeterGaugeRenderer
      tickLength, $.jqplot.OHLCRenderer
      tickMode, $.jqplot.MekkoAxisRenderer
      tickPadding, $.jqplot.MeterGaugeRenderer
      title, jqPlot
      tooltipAxes, $.jqplot.Highlighter
      tooltipAxisGroups, $.jqplot.Cursor
      transposedData, $.jqplot.BarRenderer
      type, $.jqplot.Trendline
      Searching...
      No Matches
      \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/docs/search/PropertiesU.html b/libreplan-webapp/src/main/webapp/jqplot/docs/search/PropertiesU.html deleted file mode 100644 index df97c192a..000000000 --- a/libreplan-webapp/src/main/webapp/jqplot/docs/search/PropertiesU.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - - - - -
      Loading...
      upBodyColor, $.jqplot.OHLCRenderer
      Searching...
      No Matches
      \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/docs/search/PropertiesV.html b/libreplan-webapp/src/main/webapp/jqplot/docs/search/PropertiesV.html deleted file mode 100644 index ebd8349eb..000000000 --- a/libreplan-webapp/src/main/webapp/jqplot/docs/search/PropertiesV.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - - - - -
      Loading...
      varyBarColor, $.jqplot.BarRenderer
      varyBlockColors, $.jqplot.BlockRenderer
      varyBubbleColors, $.jqplot.BubbleRenderer
      Searching...
      No Matches
      \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/docs/search/PropertiesW.html b/libreplan-webapp/src/main/webapp/jqplot/docs/search/PropertiesW.html deleted file mode 100644 index ce589762e..000000000 --- a/libreplan-webapp/src/main/webapp/jqplot/docs/search/PropertiesW.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - - - - -
      Loading...
      waterfall, $.jqplot.BarRenderer
      wickColor, $.jqplot.OHLCRenderer
      widthRatio, $.jqplot.FunnelRenderer
      Searching...
      No Matches
      \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/docs/search/PropertiesX.html b/libreplan-webapp/src/main/webapp/jqplot/docs/search/PropertiesX.html deleted file mode 100644 index 443e98c48..000000000 --- a/libreplan-webapp/src/main/webapp/jqplot/docs/search/PropertiesX.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - - - - -
      Loading...
      xmax, HorizontalLine
      xmin, HorizontalLine
      xoffset, Legend
      xpadding, $.jqplot.PointLabels
      Searching...
      No Matches
      \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/docs/search/PropertiesY.html b/libreplan-webapp/src/main/webapp/jqplot/docs/search/PropertiesY.html deleted file mode 100644 index 8f6ea7a62..000000000 --- a/libreplan-webapp/src/main/webapp/jqplot/docs/search/PropertiesY.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - - - - -
      Loading...
      y, HorizontalLine
      yoffset, Legend
      ypadding, $.jqplot.PointLabels
      yvalues, $.jqplot.Highlighter
      Searching...
      No Matches
      \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/docs/search/PropertiesZ.html b/libreplan-webapp/src/main/webapp/jqplot/docs/search/PropertiesZ.html deleted file mode 100644 index 9da6ccfc7..000000000 --- a/libreplan-webapp/src/main/webapp/jqplot/docs/search/PropertiesZ.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - - - - -
      Loading...
      zoom, $.jqplot.Cursor
      Searching...
      No Matches
      \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/docs/styles/1.css b/libreplan-webapp/src/main/webapp/jqplot/docs/styles/1.css deleted file mode 100644 index 17e9cbc30..000000000 --- a/libreplan-webapp/src/main/webapp/jqplot/docs/styles/1.css +++ /dev/null @@ -1,767 +0,0 @@ -/* - IMPORTANT: If you're editing this file in the output directory of one of - your projects, your changes will be overwritten the next time you run - Natural Docs. Instead, copy this file to your project directory, make your - changes, and you can use it with -s. Even better would be to make a CSS - file in your project directory with only your changes, which you can then - use with -s [original style] [your changes]. - - On the other hand, if you're editing this file in the Natural Docs styles - directory, the changes will automatically be applied to all your projects - that use this style the next time Natural Docs is run on them. - - This file is part of Natural Docs, which is Copyright (C) 2003-2008 Greg Valure - Natural Docs is licensed under the GPL -*/ - -body { - font: 10pt Verdana, Arial, sans-serif; - color: #000000; - margin: 0; padding: 0; - } - -.ContentPage, -.IndexPage, -.FramedMenuPage { - background-color: #E8E8E8; - } -.FramedContentPage, -.FramedIndexPage, -.FramedSearchResultsPage, -.PopupSearchResultsPage { - background-color: #FFFFFF; - } - - -a:link, -a:visited { color: #900000; text-decoration: none } -a:hover { color: #900000; text-decoration: underline } -a:active { color: #FF0000; text-decoration: underline } - -td { - vertical-align: top } - -img { border: 0; } - - -/* - Comment out this line to use web-style paragraphs (blank line between - paragraphs, no indent) instead of print-style paragraphs (no blank line, - indented.) -*/ -p { - text-indent: 5ex; margin: 0 } - - -/* Opera doesn't break with just wbr, but will if you add this. */ -.Opera wbr:after { - content: "\00200B"; - } - - -/* Blockquotes are used as containers for things that may need to scroll. */ -blockquote { - padding: 0; - margin: 0; - overflow: auto; - } - - -.Firefox1 blockquote { - padding-bottom: .5em; - } - -/* Turn off scrolling when printing. */ -@media print { - blockquote { - overflow: visible; - } - .IE blockquote { - width: auto; - } - } - - - -#Menu { - font-size: 9pt; - padding: 10px 0 0 0; - } -.ContentPage #Menu, -.IndexPage #Menu { - position: absolute; - top: 0; - left: 0; - width: 31ex; - overflow: hidden; - } -.ContentPage .Firefox #Menu, -.IndexPage .Firefox #Menu { - width: 27ex; - } - - - .MTitle { - font-size: 16pt; font-weight: bold; font-variant: small-caps; - text-align: center; - padding: 5px 10px 15px 10px; - border-bottom: 1px dotted #000000; - margin-bottom: 15px } - - .MSubTitle { - font-size: 9pt; font-weight: normal; font-variant: normal; - margin-top: 1ex; margin-bottom: 5px } - - - .MEntry a:link, - .MEntry a:hover, - .MEntry a:visited { color: #606060; margin-right: 0 } - .MEntry a:active { color: #A00000; margin-right: 0 } - - - .MGroup { - font-variant: small-caps; font-weight: bold; - margin: 1em 0 1em 10px; - } - - .MGroupContent { - font-variant: normal; font-weight: normal } - - .MGroup a:link, - .MGroup a:hover, - .MGroup a:visited { color: #545454; margin-right: 10px } - .MGroup a:active { color: #A00000; margin-right: 10px } - - - .MFile, - .MText, - .MLink, - .MIndex { - padding: 1px 17px 2px 10px; - margin: .25em 0 .25em 0; - } - - .MText { - font-size: 8pt; font-style: italic } - - .MLink { - font-style: italic } - - #MSelected { - color: #000000; background-color: #FFFFFF; - /* Replace padding with border. */ - padding: 0 10px 0 10px; - border-width: 1px 2px 2px 0; border-style: solid; border-color: #000000; - margin-right: 5px; - } - - /* Close off the left side when its in a group. */ - .MGroup #MSelected { - padding-left: 9px; border-left-width: 1px } - - /* A treat for Mozilla users. Blatantly non-standard. Will be replaced with CSS 3 attributes when finalized/supported. */ - .Firefox #MSelected { - -moz-border-radius-topright: 10px; - -moz-border-radius-bottomright: 10px } - .Firefox .MGroup #MSelected { - -moz-border-radius-topleft: 10px; - -moz-border-radius-bottomleft: 10px } - - - #MSearchPanel { - padding: 0px 6px; - margin: .25em 0; - } - - - #MSearchField { - font: italic 9pt Verdana, sans-serif; - color: #606060; - background-color: #E8E8E8; - border: none; - padding: 2px 4px; - width: 100%; - } - /* Only Opera gets it right. */ - .Firefox #MSearchField, - .IE #MSearchField, - .Safari #MSearchField { - width: 94%; - } - .Opera9 #MSearchField, - .Konqueror #MSearchField { - width: 97%; - } - .FramedMenuPage .Firefox #MSearchField, - .FramedMenuPage .Safari #MSearchField, - .FramedMenuPage .Konqueror #MSearchField { - width: 98%; - } - - /* Firefox doesn't do this right in frames without #MSearchPanel added on. - It's presence doesn't hurt anything other browsers. */ - #MSearchPanel.MSearchPanelInactive:hover #MSearchField { - background-color: #FFFFFF; - border: 1px solid #C0C0C0; - padding: 1px 3px; - } - .MSearchPanelActive #MSearchField { - background-color: #FFFFFF; - border: 1px solid #C0C0C0; - font-style: normal; - padding: 1px 3px; - } - - #MSearchType { - visibility: hidden; - font: 8pt Verdana, sans-serif; - width: 98%; - padding: 0; - border: 1px solid #C0C0C0; - } - .MSearchPanelActive #MSearchType, - /* As mentioned above, Firefox doesn't do this right in frames without #MSearchPanel added on. */ - #MSearchPanel.MSearchPanelInactive:hover #MSearchType, - #MSearchType:focus { - visibility: visible; - color: #606060; - } - #MSearchType option#MSearchEverything { - font-weight: bold; - } - - .Opera8 .MSearchPanelInactive:hover, - .Opera8 .MSearchPanelActive { - margin-left: -1px; - } - - - iframe#MSearchResults { - width: 60ex; - height: 15em; - } - #MSearchResultsWindow { - display: none; - position: absolute; - left: 0; top: 0; - border: 1px solid #000000; - background-color: #E8E8E8; - } - #MSearchResultsWindowClose { - font-weight: bold; - font-size: 8pt; - display: block; - padding: 2px 5px; - } - #MSearchResultsWindowClose:link, - #MSearchResultsWindowClose:visited { - color: #000000; - text-decoration: none; - } - #MSearchResultsWindowClose:active, - #MSearchResultsWindowClose:hover { - color: #800000; - text-decoration: none; - background-color: #F4F4F4; - } - - - - -#Content { - padding-bottom: 15px; - } - -.ContentPage #Content { - border-width: 0 0 1px 1px; - border-style: solid; - border-color: #000000; - background-color: #FFFFFF; - font-size: 9pt; /* To make 31ex match the menu's 31ex. */ - margin-left: 31ex; - } -.ContentPage .Firefox #Content { - margin-left: 27ex; - } - - - - .CTopic { - font-size: 10pt; - margin-bottom: 3em; - } - - - .CTitle { - font-size: 12pt; font-weight: bold; - border-width: 0 0 1px 0; border-style: solid; border-color: #A0A0A0; - margin: 0 15px .5em 15px } - - .CGroup .CTitle { - font-size: 16pt; font-variant: small-caps; - padding-left: 15px; padding-right: 15px; - border-width: 0 0 2px 0; border-color: #000000; - margin-left: 0; margin-right: 0 } - - .CClass .CTitle, - .CInterface .CTitle, - .CDatabase .CTitle, - .CDatabaseTable .CTitle, - .CSection .CTitle { - font-size: 18pt; - color: #FFFFFF; background-color: #A0A0A0; - padding: 10px 15px 10px 15px; - border-width: 2px 0; border-color: #000000; - margin-left: 0; margin-right: 0 } - - #MainTopic .CTitle { - font-size: 20pt; - color: #FFFFFF; background-color: #7070C0; - padding: 10px 15px 10px 15px; - border-width: 0 0 3px 0; border-color: #000000; - margin-left: 0; margin-right: 0 } - - .CBody { - margin-left: 15px; margin-right: 15px } - - - .CToolTip { - position: absolute; visibility: hidden; - left: 0; top: 0; - background-color: #FFFFE0; - padding: 5px; - border-width: 1px 2px 2px 1px; border-style: solid; border-color: #000000; - font-size: 8pt; - } - - .Opera .CToolTip { - max-width: 98%; - } - - /* Scrollbars would be useless. */ - .CToolTip blockquote { - overflow: hidden; - } - .IE6 .CToolTip blockquote { - overflow: visible; - } - - .CHeading { - font-weight: bold; font-size: 10pt; - margin: 1.5em 0 .5em 0; - } - - .CBody pre { - font: 10pt "Courier New", Courier, monospace; - margin: 1em 0; - } - - .CBody ul { - /* I don't know why CBody's margin doesn't apply, but it's consistent across browsers so whatever. - Reapply it here as padding. */ - padding-left: 15px; padding-right: 15px; - margin: .5em 5ex .5em 5ex; - } - - .CDescriptionList { - margin: .5em 5ex 0 5ex } - - .CDLEntry { - font: 10pt "Courier New", Courier, monospace; color: #808080; - padding-bottom: .25em; - white-space: nowrap } - - .CDLDescription { - font-size: 10pt; /* For browsers that don't inherit correctly, like Opera 5. */ - padding-bottom: .5em; padding-left: 5ex } - - - .CTopic img { - text-align: center; - display: block; - margin: 1em auto; - } - .CImageCaption { - font-variant: small-caps; - font-size: 8pt; - color: #808080; - text-align: center; - position: relative; - top: 1em; - } - - .CImageLink { - color: #808080; - font-style: italic; - } - a.CImageLink:link, - a.CImageLink:visited, - a.CImageLink:hover { color: #808080 } - - - - - -.Prototype { - font: 10pt "Courier New", Courier, monospace; - padding: 5px 3ex; - border-width: 1px; border-style: solid; - margin: 0 5ex 1.5em 5ex; - } - - .Prototype td { - font-size: 10pt; - } - - .PDefaultValue, - .PDefaultValuePrefix, - .PTypePrefix { - color: #8F8F8F; - } - .PTypePrefix { - text-align: right; - } - .PAfterParameters { - vertical-align: bottom; - } - - .IE .Prototype table { - padding: 0; - } - - .CFunction .Prototype { - background-color: #F4F4F4; border-color: #D0D0D0 } - .CProperty .Prototype { - background-color: #F4F4FF; border-color: #C0C0E8 } - .CVariable .Prototype { - background-color: #FFFFF0; border-color: #E0E0A0 } - - .CClass .Prototype { - border-width: 1px 2px 2px 1px; border-style: solid; border-color: #A0A0A0; - background-color: #F4F4F4; - } - .CInterface .Prototype { - border-width: 1px 2px 2px 1px; border-style: solid; border-color: #A0A0D0; - background-color: #F4F4FF; - } - - .CDatabaseIndex .Prototype, - .CConstant .Prototype { - background-color: #D0D0D0; border-color: #000000 } - .CType .Prototype, - .CEnumeration .Prototype { - background-color: #FAF0F0; border-color: #E0B0B0; - } - .CDatabaseTrigger .Prototype, - .CEvent .Prototype, - .CDelegate .Prototype { - background-color: #F0FCF0; border-color: #B8E4B8 } - - .CToolTip .Prototype { - margin: 0 0 .5em 0; - white-space: nowrap; - } - - - - - -.Summary { - margin: 1.5em 5ex 0 5ex } - - .STitle { - font-size: 12pt; font-weight: bold; - margin-bottom: .5em } - - - .SBorder { - background-color: #FFFFF0; - padding: 15px; - border: 1px solid #C0C060 } - - /* In a frame IE 6 will make them too long unless you set the width to 100%. Without frames it will be correct without a width - or slightly too long (but not enough to scroll) with a width. This arbitrary weirdness simply astounds me. IE 7 has the same - problem with frames, haven't tested it without. */ - .FramedContentPage .IE .SBorder { - width: 100% } - - /* A treat for Mozilla users. Blatantly non-standard. Will be replaced with CSS 3 attributes when finalized/supported. */ - .Firefox .SBorder { - -moz-border-radius: 20px } - - - .STable { - font-size: 9pt; width: 100% } - - .SEntry { - width: 30% } - .SDescription { - width: 70% } - - - .SMarked { - background-color: #F8F8D8 } - - .SDescription { padding-left: 2ex } - .SIndent1 .SEntry { padding-left: 1.5ex } .SIndent1 .SDescription { padding-left: 3.5ex } - .SIndent2 .SEntry { padding-left: 3.0ex } .SIndent2 .SDescription { padding-left: 5.0ex } - .SIndent3 .SEntry { padding-left: 4.5ex } .SIndent3 .SDescription { padding-left: 6.5ex } - .SIndent4 .SEntry { padding-left: 6.0ex } .SIndent4 .SDescription { padding-left: 8.0ex } - .SIndent5 .SEntry { padding-left: 7.5ex } .SIndent5 .SDescription { padding-left: 9.5ex } - - .SDescription a { color: #800000} - .SDescription a:active { color: #A00000 } - - .SGroup td { - padding-top: .5em; padding-bottom: .25em } - - .SGroup .SEntry { - font-weight: bold; font-variant: small-caps } - - .SGroup .SEntry a { color: #800000 } - .SGroup .SEntry a:active { color: #F00000 } - - - .SMain td, - .SClass td, - .SDatabase td, - .SDatabaseTable td, - .SSection td { - font-size: 10pt; - padding-bottom: .25em } - - .SClass td, - .SDatabase td, - .SDatabaseTable td, - .SSection td { - padding-top: 1em } - - .SMain .SEntry, - .SClass .SEntry, - .SDatabase .SEntry, - .SDatabaseTable .SEntry, - .SSection .SEntry { - font-weight: bold; - } - - .SMain .SEntry a, - .SClass .SEntry a, - .SDatabase .SEntry a, - .SDatabaseTable .SEntry a, - .SSection .SEntry a { color: #000000 } - - .SMain .SEntry a:active, - .SClass .SEntry a:active, - .SDatabase .SEntry a:active, - .SDatabaseTable .SEntry a:active, - .SSection .SEntry a:active { color: #A00000 } - - - - - -.ClassHierarchy { - margin: 0 15px 1em 15px } - - .CHEntry { - border-width: 1px 2px 2px 1px; border-style: solid; border-color: #A0A0A0; - margin-bottom: 3px; - padding: 2px 2ex; - font-size: 10pt; - background-color: #F4F4F4; color: #606060; - } - - .Firefox .CHEntry { - -moz-border-radius: 4px; - } - - .CHCurrent .CHEntry { - font-weight: bold; - border-color: #000000; - color: #000000; - } - - .CHChildNote .CHEntry { - font-style: italic; - font-size: 8pt; - } - - .CHIndent { - margin-left: 3ex; - } - - .CHEntry a:link, - .CHEntry a:visited, - .CHEntry a:hover { - color: #606060; - } - .CHEntry a:active { - color: #800000; - } - - - - - -#Index { - background-color: #FFFFFF; - } - -/* As opposed to .PopupSearchResultsPage #Index */ -.IndexPage #Index, -.FramedIndexPage #Index, -.FramedSearchResultsPage #Index { - padding: 15px; - } - -.IndexPage #Index { - border-width: 0 0 1px 1px; - border-style: solid; - border-color: #000000; - font-size: 9pt; /* To make 27ex match the menu's 27ex. */ - margin-left: 27ex; - } - - - .IPageTitle { - font-size: 20pt; font-weight: bold; - color: #FFFFFF; background-color: #7070C0; - padding: 10px 15px 10px 15px; - border-width: 0 0 3px 0; border-color: #000000; border-style: solid; - margin: -15px -15px 0 -15px } - - .FramedSearchResultsPage .IPageTitle { - margin-bottom: 15px; - } - - .INavigationBar { - font-size: 10pt; - text-align: center; - background-color: #FFFFF0; - padding: 5px; - border-bottom: solid 1px black; - margin: 0 -15px 15px -15px; - } - - .INavigationBar a { - font-weight: bold } - - .IHeading { - font-size: 16pt; font-weight: bold; - padding: 2.5em 0 .5em 0; - text-align: center; - width: 3.5ex; - } - #IFirstHeading { - padding-top: 0; - } - - .IEntry { - font-size: 10pt; - padding-left: 1ex; - } - .PopupSearchResultsPage .IEntry { - font-size: 8pt; - padding: 1px 5px; - } - .PopupSearchResultsPage .Opera9 .IEntry, - .FramedSearchResultsPage .Opera9 .IEntry { - text-align: left; - } - .FramedSearchResultsPage .IEntry { - padding: 0; - } - - .ISubIndex { - padding-left: 3ex; padding-bottom: .5em } - .PopupSearchResultsPage .ISubIndex { - display: none; - } - - /* While it may cause some entries to look like links when they aren't, I found it's much easier to read the - index if everything's the same color. */ - .ISymbol { - font-weight: bold; color: #900000 } - - .IndexPage .ISymbolPrefix, - .FramedIndexPage .ISymbolPrefix { - font-size: 10pt; - text-align: right; - color: #C47C7C; - background-color: #F8F8F8; - border-right: 3px solid #E0E0E0; - border-left: 1px solid #E0E0E0; - padding: 0 1px 0 2px; - } - .PopupSearchResultsPage .ISymbolPrefix, - .FramedSearchResultsPage .ISymbolPrefix { - color: #900000; - } - .PopupSearchResultsPage .ISymbolPrefix { - font-size: 8pt; - } - - .IndexPage #IFirstSymbolPrefix, - .FramedIndexPage #IFirstSymbolPrefix { - border-top: 1px solid #E0E0E0; - } - .IndexPage #ILastSymbolPrefix, - .FramedIndexPage #ILastSymbolPrefix { - border-bottom: 1px solid #E0E0E0; - } - .IndexPage #IOnlySymbolPrefix, - .FramedIndexPage #IOnlySymbolPrefix { - border-top: 1px solid #E0E0E0; - border-bottom: 1px solid #E0E0E0; - } - - a.IParent, - a.IFile { - display: block; - } - - .PopupSearchResultsPage .SRStatus { - padding: 2px 5px; - font-size: 8pt; - font-style: italic; - } - .FramedSearchResultsPage .SRStatus { - font-size: 10pt; - font-style: italic; - } - - .SRResult { - display: none; - } - - - -#Footer { - font-size: 8pt; - color: #989898; - text-align: right; - } - -#Footer p { - text-indent: 0; - margin-bottom: .5em; - } - -.ContentPage #Footer, -.IndexPage #Footer { - text-align: right; - margin: 2px; - } - -.FramedMenuPage #Footer { - text-align: center; - margin: 5em 10px 10px 10px; - padding-top: 1em; - border-top: 1px solid #C8C8C8; - } - - #Footer a:link, - #Footer a:hover, - #Footer a:visited { color: #989898 } - #Footer a:active { color: #A00000 } - diff --git a/libreplan-webapp/src/main/webapp/jqplot/docs/styles/2.css b/libreplan-webapp/src/main/webapp/jqplot/docs/styles/2.css deleted file mode 100644 index 12117d4e6..000000000 --- a/libreplan-webapp/src/main/webapp/jqplot/docs/styles/2.css +++ /dev/null @@ -1,174 +0,0 @@ -html, body { - height: 100%; -} - -/* -div.Firefox { - height: 100%; -} -*/ - -.MTitle { - font-variant: normal; -} - -.MLink { - font-style: normal; -} - -.CBody { -margin-left: 30px; -margin-right: 30px; -} - -p { - text-indent: 0; - margin-bottom: 1em; - } - -.CBody p { -/* - padding-top: 4px; - padding-bottom: 4px; -*/ -} - -#Menu { - margin-top: 94px; - border: 0px; -} - -body.ContentPage { - background-image: url('../../images/background.jpg'); - background-color: #818181; - background-position: left top; - background-repeat: repeat-x; -} - -.MGroup a:link, -.MGroup a:hover, -.MGroup a:visited { color: #bfbfbf; margin-right: 10px } -.MGroup a:active { color: #f58f07; margin-right: 10px } - - -.MEntry a:link, -.MEntry a:hover, -.MEntry a:visited { color: #bfbfbf; margin-right: 0 } -.MEntry a:active { color: #f58f07; margin-right: 0 } - -#Footer { - color: #bfbfbf; -} - -#Footer a:link, #Footer a:hover, #Footer a:visited { - color: #5c93f0; -} - -#MainTopic div.CTitle.logo { - color: #292929; - font-size: 0px; - font-style: normal; - font-weight: normal; - border-width: 0px; - padding: 0px; - margin: 0px; - background-position: left top; - background-repeat: no-repeat; - background-image: url('../../images/logo.jpg'); - background-color: #292929; - height: 94px; - position: relative; - -} - -#MainTopic h1.CTitle a { - display: none; -} - - -#MainTopic div.CBody p:first-child { - margin-top: 24px; -} - -.ContentPage #Content { - border: 0px; -/* height: 100%; */ -} - -#IPageLogo { - width: 780px; - color: #292929; - font-style: normal; - font-weight: normal; - border-width: 0px; - padding: 0px; - margin: 0px; - background-position: left top; - background-repeat: no-repeat; - background-image: url('../../images/logo.jpg'); - background-color: #292929; - height: 94px; - position: relative; - left: 27ex; -} - -#Menu, #IPageLogo { - font-size: 9pt; -} - -body.IndexPage { - background-image: url('../../images/background.jpg'); -} - -/*#IPageLogo:hover { - cursor: pointer; -}*/ - -.IPageTitle { - background-color:#FFFFF0; - color: #333333; - border: 0px; -} - - - -div.nav { - position:relative; - top: 70px; - text-align: right; -} - -a.nav span { - font-size: 11px; - position: relative; - bottom: 2px; -} - -a.nav:visited { - text-decoration: none; - border: 0px; - color: #aaaaaa; -} - -a.nav, a.nav:link { - border: 0px; - text-decoration: none; - font-family: Tahoma, "Helvetica Neue", "Trebuchet MS", Verdana, Arial, sans-serif; - font-size: 16px; - color: #aaaaaa; - margin-right: 11px; -} - -a.nav:hover { - text-decoration: none; - border: 0px; - color: #E0771C; -} - -a.nav:active { - text-decoration: none; - border: 0px; - color: #E0771C; -} - - diff --git a/libreplan-webapp/src/main/webapp/jqplot/docs/styles/main.css b/libreplan-webapp/src/main/webapp/jqplot/docs/styles/main.css deleted file mode 100644 index a672a9492..000000000 --- a/libreplan-webapp/src/main/webapp/jqplot/docs/styles/main.css +++ /dev/null @@ -1,2 +0,0 @@ -@import URL("1.css"); -@import URL("2.css"); diff --git a/libreplan-webapp/src/main/webapp/jqplot/examples/.htaccess b/libreplan-webapp/src/main/webapp/jqplot/examples/.htaccess deleted file mode 100644 index ceee610f0..000000000 --- a/libreplan-webapp/src/main/webapp/jqplot/examples/.htaccess +++ /dev/null @@ -1,7 +0,0 @@ -# This works on my local apache (with mod_php) -# AddType application/x-httpd-php .php .html .htm - -# This works for dreamhost (php as fast cgi) -# AddType php-cgi .php .html .htm - -IndexOptions +FancyIndexing +SuppressDescription NameWidth=* +FoldersFirst diff --git a/libreplan-webapp/src/main/webapp/jqplot/examples/KCPsample4.csv b/libreplan-webapp/src/main/webapp/jqplot/examples/KCPsample4.csv deleted file mode 100644 index 453517b0e..000000000 --- a/libreplan-webapp/src/main/webapp/jqplot/examples/KCPsample4.csv +++ /dev/null @@ -1,25 +0,0 @@ -Product or service,v01,v02,v03,v04,v05,v06,v07,v08,v09,v10,v11,v12,v13,v14,v15,v16,v17,v18,v19,v20 -Rice,15.8442,13.0993,11.2898,10.7892,10.252,9.0165,8.5287,7.7442,6.9867,6.5213,5.9473,5.4766,4.9214,4.6398,3.8935,3.5228,3.0128,2.4847,2.0357,1.0672 -Bread and other cereals,1.7703,2.2535,2.2753,2.7927,2.2509,2.4341,2.5518,2.5547,2.4204,2.4186,2.4261,2.2927,2.4386,2.2295,2.2203,1.915,1.8791,1.7941,1.6567,0.9296 -Meat,8.3728,8.1221,8.3989,7.9758,8.8246,8.2377,8.432,7.8466,7.5343,7.1171,6.9801,6.9349,5.8307,5.7089,4.927,4.2237,3.6872,3.1429,2.581,1.3766 -Fish and seafood,9.1249,8.7326,7.6122,7.8577,7.1625,6.8527,6.5158,6.1715,6.1298,5.8702,5.3456,4.9906,4.4424,4.3022,3.5298,3.405,2.9977,2.4159,2.0832,1.1499 -Fruits and vegetables,8.0508,7.7875,7.6534,7.4448,7.3702,7.4188,7.3882,7.1647,6.9617,6.6576,6.6077,6.4823,5.9117,5.8149,5.505,5.5355,5.0907,4.569,4.3049,2.6325 -Other food products,10.4408,9.8278,9.9293,9.5176,9.6658,9.2359,9.2842,8.6497,8.7656,8.2962,8.155,7.7294,7.3674,6.9888,6.2995,5.7314,5.2703,4.6947,3.9614,2.2509 -Catering services,4.1883,4.7514,5.3198,5.8819,5.1732,5.5764,6.1713,6.7915,6.8511,7.2681,7.1461,8.109,9.2649,9.5322,11.2138,12.8299,12.9621,13.8936,13.7828,10.0525 -Non-alcoholic beverages,0.6641,0.8454,0.9018,1.0461,1.0113,1.235,1.279,1.3049,1.5024,1.4471,1.5358,1.5796,1.6471,1.6443,1.6562,1.6763,1.6097,1.5039,1.3752,0.864 -Alcoholic beverages,0.5221,0.6997,0.8513,0.8849,0.9168,0.9099,0.8339,0.9921,1.1169,1.1764,1.1936,1.1415,1.1181,1.2889,1.1378,1.023,1.1283,1.0417,0.9839,0.587 -Tobacco and narcotics,1.0969,1.188,1.0713,1.2803,1.1787,1.148,1.3229,1.1726,1.3764,1.3887,1.4011,1.3034,1.4368,1.5017,1.4899,1.4123,1.3168,1.1407,0.8458,0.38 -Clothing and footwear,2.275,2.5511,3.1025,2.9834,3.2857,3.7625,3.1928,3.7071,4.0364,3.629,3.9258,3.2208,3.7113,3.3166,3.4775,3.429,3.6121,3.4569,3.8416,4.1323 -Rentals (actual or imputed) and maintenance and repair of the dwelling,16.0654,15.719,16.3773,16.0175,15.8853,16.132,16.1309,16.3491,15.8512,16.4743,16.2862,15.7327,16.2793,16.6329,17.4903,17.4425,17.3413,18.3527,18.5029,15.2763 -Water supply and miscellaneous services related to the dwelling,1.1145,1.176,1.1183,1.0411,1.0058,1.0796,1.0321,1.0714,1.1117,1.0278,1.136,1.1397,1.1556,1.2206,1.2871,1.2361,1.2111,1.2312,1.1545,0.7881 -Electricity gas and other fuels,4.5928,4.7558,4.8855,4.4684,4.6677,4.6038,4.7789,4.6098,4.4171,4.5078,4.4137,4.4645,4.2693,4.2836,4.1709,4.159,3.8423,3.9957,3.6816,2.5785 -Furnishing household equipment and routine household maintenance,2.1027,2.1576,2.0721,2.0623,2.3498,2.2573,2.2866,2.3766,2.2488,2.3665,2.3445,2.2474,2.3345,2.2479,2.158,2.355,2.0744,2.2269,3.0474,3.8925 -Health,1.2709,1.6007,1.3996,1.612,1.4649,1.5875,1.7056,1.7315,1.7378,2.0401,2.3265,2.1096,2.0513,2.1548,2.0634,2.2206,1.8427,2.4817,2.3066,2.1685 -Transport,4.6414,5.6167,5.9571,6.5372,7.0242,7.6332,7.9823,8.3906,9.112,9.6872,10.2014,11.0074,11.375,11.6753,12.0489,12.0692,13.2962,13.2183,14.6559,32.0912 -Communication,0.2334,0.3642,0.5267,0.5911,0.8888,1.1633,1.0997,1.76,1.9811,2.1708,2.931,3.2634,3.6254,4.107,4.6944,5.0941,5.9984,6.2419,6.6059,5.8353 -Recreation and culture,2.2553,2.8903,2.9564,3.2839,3.4822,3.255,3.1666,3.4245,3.4066,3.8536,3.6333,4.0331,4.4847,4.3552,4.2768,4.1439,4.7196,4.6585,4.4286,3.921 -Education,0.3437,0.3282,0.4805,0.3881,0.4796,0.9766,0.6589,0.6443,1.0423,0.7941,1.064,1.5504,1.3977,1.5226,1.8344,1.9186,2.3022,2.8188,2.8424,2.7792 -Personal care,3.4466,3.5641,3.5711,3.4219,3.2835,3.3569,3.3416,3.4544,3.3675,3.2806,3.118,3.1881,3.2252,3.0588,3.0051,2.9868,3.0361,2.8972,2.9611,2.2867 -Other miscellaneous goods and services,1.5831,1.9691,2.2498,2.122,2.3766,2.1273,2.3165,2.0884,2.0421,2.0067,1.8809,2.0027,1.7115,1.7734,1.6204,1.6702,1.769,1.7391,2.3607,2.9604 -Food and non-alcoholic beverages,58.4561,55.4196,53.3806,53.3059,51.7105,50.007,50.1509,48.2276,47.1521,45.5962,44.1436,43.5952,41.8242,40.8606,39.2451,38.8396,36.5095,34.4988,31.7809,20.3231 -Non food,41.5439,44.5804,46.6194,46.6941,48.2895,49.993,49.8491,51.7724,52.8479,54.4038,55.8564,56.4048,58.1758,59.1394,60.7549,61.1604,63.4905,65.5012,68.2191,79.6769 diff --git a/libreplan-webapp/src/main/webapp/jqplot/examples/ajax-loader.gif b/libreplan-webapp/src/main/webapp/jqplot/examples/ajax-loader.gif deleted file mode 100644 index 3288d1035d70bb86517e2c233f1a904e41f06b29..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3208 zcmc(iX;4#H9>pJdFE7h`I{IF)0|5<6L}(j=N}5%L009EB2nYfyF)E0PvIqo$u!IC; z4PgyY5|S9AEh38G)(9eq4TbH7_UHg@yWrlIJ$6smIADL7s^P;_O;ykRc9soXl`UC*LwQJXkii*0rx|*7rI2=x7WaRkx_~XZqFJ8R3c=2Kg zf@aSAv8+BJ8+^hyay>(QR@t*blbKzsf0}bscEqRc5Hd3o(-N5RyW=zWB*zQw6Zh>* z2CROCDAbu#D`)S|J_o(lL9Yn3l*+8RdiRD_>iNz$#_IAzCna&Wl5 zSF_(rRCDD!wi#i8oAm&jYtn2_@VB%2-H*G%bN#|(6R6N?wM)3u`PiGzwuX7qmTgyF zpE)h0kuoxQ9?=kW7Y!=R@DmhU9)vwT*EZWzJ zrt+=2tqFts72yIp?|gvdLhs8Hfku^Z(){gmN%Y=K#P|%fkvgUj~HfIp3CuXqCtYGtJ#me+n+-LmP( z*XNuk%!aH8bIE@_Bj46>M*dSro|7<6vZ7WUHh5YQzN$>IJFqCb|CT!wj~R2C2%=q{ zpt8rzY$aw?W?=Ustv{jo?Ow@ZRkLe<)NItY>Cyhle*wR59dTdF6(@{5^ zAQBOB*hNtc3bkY-8{Cm$nFS@elbTtSqrt7MB{h_4y+~`!mVa}?c&N>&?P}GqdMuhQ z&@TD5Czd((DcG_Su~dKKV)Pj$-qi1WHM8_vc^O4?^!oY|tmK~i!{fjd&@_1E(T~r7 z_REZy&hMT^ySJB3W7l$4YhR`M(J7S5S~+4Q&3HPa)z%zPpisOp$^ zTEe99ig2$5_qFr!$;7A6CJ}PJmRhli>w?LC}Y`#HLGy6 zMU4EhL~dKCN5Ut;U2jd*83ShBNiu zcJB0l9>1Modc?-oM<R4?}3g}UJ%@K);kriq>)e*rh%hdqM)5Q)*+O8 zXm;SEbs@koiYS!9YXIclSg+5m_s~yrW#kKMdiRszg(gCP5HPmP7L)vCf8@fxUh6qY z@Z#TmkjzAZX{rwE+q|K~F2v5{_@vt%>yT_a#fF03SFt{0RXvDAiaY~K9CgS1O>frXgAjBCS}mEd4mIWZ$=ovd5| zR?GRdU}d6+Q`+JRW)|=v7$)XNkn3yE`!nAiSCvOB1jKT zG<1aK3s<0b0m==egTD#8i(Of=1pGDTOCho0XpIOMQ&P87cVKY1W=C6kIg z9cH=@a&zbm2+`|{(_?YC9fdm?1TY~-pwlBn?>=(~1pDKbco6jloP;0-cqRiwV1A_S zEyV0Dj8Pwy!nekzaN>{)7rgZ&_QLxK{~1yRe865^yx>}+a!ECd>#MMwddow z@CU{l+Rt$xuXuf}?ga{3IAr?Raql^c@a%sI0U5m}HvJ5O1#I%_MMPt#BH>OqUZ{-k zt>4Xzz=%jT*FVW(uYkWyx}9Gw$HdN*qU?Bit#ji(Wi7p-u|_8?h^%szIS^s^fNM}b zgGy>|=cbEufpguY5_6w~&ZLv=Bo06UF9EYIY;Er-1VK)SyF&!|J{axiE1z^(hXwVq zsFS=K-#zC}CcOs^8W{KAt+kK)jYDgDYbCXv{{rwsgqtIU3<910$CJi)s?? z_t8k{>7*0~4l~LLF7$WXT5OSq5QCTbP_l!SN|{R}3D&eWA8~0ltWh1IL+ZBX4rRSt zWF6Om3WDMu4xK^1(BF`2cL}rUCzhHAB`@j5&R-yk_l*t;mPGY|u2^o|myvcOdrg0W z%=lX;f^Vkqfp?u7*4qQq%A3Mpf!xspWBSKS@O%r*TSM}?dl(@*%{0Jm_8;(h{R__M Bt - - - - - Filled (Area) Charts - - - - - - - - - - - - - -
      - - - - - - - - -

      Area charts support highlighting and mouse events by default. The options and handlers and callbacks are essentially the same as with bar, pie, donut and funnel charts. One notable exception for area charts is that no data point index will be provided to the callback and the entire data set for the highlighted area will be returned. This is because the area is not associated with one particular data point, but with the entire data set of the series.

      - -
      Moused Over: Nothing
      - -
      - -

      For the chart below, mouseover has been disabled and click handling is enabled by setting "highlightMouseDown: true". For "fillToZero" area charts that have both negative and positive values as shown below, clicking in either the positive of negative regions will generate the same result.

      - -
      You Clicked: Nothing yet
      - -
      - - - - - - - - - - - - - - - - - - - - - - - - - -
      - - - - - - \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/examples/axisLabelTests.html b/libreplan-webapp/src/main/webapp/jqplot/examples/axisLabelTests.html deleted file mode 100644 index fe71750eb..000000000 --- a/libreplan-webapp/src/main/webapp/jqplot/examples/axisLabelTests.html +++ /dev/null @@ -1,157 +0,0 @@ - - - - - - Line Charts and Options - - - - - - - - - - - - - -
      - - - - - - -

      jqPlot support axis labels through the "label" option of each axis. The default label renderer creates labels in div tags, which allows full css control over every label. Labels are assigned css classes like "jqplot-axis_name-label" where "axis_name" will be xaxis, yaxis, etc.

      - -
      - -
      
      -
      -
      -

      By including the "jqplot.canvasTextRenderer.min.js" and "jqplot.canvasAxisLabelRenderer.min.js" plugins, you can render label text directly onto canvas elements. This allows text to be rotated and yaxes will have their labels rotated 90 degrees by default. By default the labels will be rendered using the Hershey font metrics and not stroked as text. Most recent browsers (include IE 9) support native text rendering in canvas elements.

      - -
      - -
      
      -
      -      
      -

      If a visitors is using a browser suppporting native canvas fonts, the plot belowsupported browser, they will see the labels in the plot below rendered as 12 pt Georgia (or their system serif font if Georgia is unavailable). If they are on an unsupported browser, they will see the default Hershey font.

      - -
      - -
      
      -
      -
      -  
      -
      -  
      -
      -  
      -
      -
      -
      -
      -
      -
      -
      -
      -
      -    
      -    
      -    
      -    
      -
      -
      -
      -
      -  
      -  
      -
      -
      -
      -
      -	
      - - - - - - \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/examples/axisLabelsRotatedText.html b/libreplan-webapp/src/main/webapp/jqplot/examples/axisLabelsRotatedText.html deleted file mode 100644 index 5acfde39d..000000000 --- a/libreplan-webapp/src/main/webapp/jqplot/examples/axisLabelsRotatedText.html +++ /dev/null @@ -1,229 +0,0 @@ - - - - - - Axis Labels and Rotated Text - - - - - - - - - - - - - -
      - - - -
      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      - - - - - - \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/examples/axisScalingForceTickAt.html b/libreplan-webapp/src/main/webapp/jqplot/examples/axisScalingForceTickAt.html deleted file mode 100644 index e09aa7503..000000000 --- a/libreplan-webapp/src/main/webapp/jqplot/examples/axisScalingForceTickAt.html +++ /dev/null @@ -1,242 +0,0 @@ - - - - - - Force Plot to Have Tick at 0 or 100 - - - - - - - - - - - - - -
      - - - - - - - - - - - - - - - - - - - - - -
      -
      
      -
      -
      
      -
      -
      
      -
      -
      
      -
      -
      
      -
      - -
      - - -
      -
      - - -
      - -
      
      -
      -
      -
      -
      -
      -
      -    
      -    
      -    
      -    
      -
      -
      -
      -  
      -  
      -  
      -  
      -
      -
      -
      -
      -	
      - - - - - - \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/examples/bandedLine.html b/libreplan-webapp/src/main/webapp/jqplot/examples/bandedLine.html deleted file mode 100644 index e94f472b8..000000000 --- a/libreplan-webapp/src/main/webapp/jqplot/examples/bandedLine.html +++ /dev/null @@ -1,310 +0,0 @@ - - - - - - Error Bands and Confidence Intervals - - - - - - - - - - - - - -
      - - - - - -

      Bands (like confidence intervals or error bands) can be added to line charts through the "bands" option of the line renderer. The band data can be automatically computed or manually assigned. If assigned manually, the simpliest approach is to set the "rendererOptions: { bandData: [] }" array on the series. Note that band data is taken into account when axes scale themselves so bands will not get clipped.

      - - -

      Band data can be supplied as arrays of [x,y] values. One array for the upper band line and one for the lower band line.

      - -
      -
      
      -
      -
      -

      The number of points in the band data arrays does not have to correspond to the number of points in the data series. Also, band data will be drawn as smoothed lines if the data series is smoothed.

      - -
      -
      
      -
      -

      In this example, band data is supplied as an array of arrays of y values for the low and hi bands. X values for the bands are taken from the x values of the series. The band data is of the form: [ [y low 1, y hi 1], [y low 2, y hi 2], ... ] and there must be a corresponding array of low/hi y values for each x value in the data series.

      - -
      -
      
      -
      -

      The band data can also be supplied as an array of [low y values], [hi y values]. In this case there must also be an equal number of low y values and hi y values as there are data points in the series. X values for the low and hi bands will be taken from the series data. Additionally, the order of low/hi values does not matter as long as they are consistent. jqPlot will figure out which is the low values and which are the high values.

      - -
      -
      
      -
      -

      Band data does not have to be provided. By default, jqPlot will compute +/- 3% band intervals if the "rendererOptions: { bands: { show: true } }" option is set. The band intervals can be customized as well through the "rendererOptions: { bands: { interval: [number|string|arry] } }" option. Valid intervals are:

      - -
        -
      • '1.7' - will add bands at y +/- 1.7 above and below the line.
      • -
      • '10%' - will compute +/- 10% interval bands.
      • -
      • [3, '-10%'] - will add bands at y + 3 and y - 10% above and below the line.
      • -
      - -

      Examples of such interval specifications are shown below:

      - -
      -
      
      - 
      -
      
      -
      - 
      -
      
      -    
      -

      You can also customize the fill color of the bands and turn on/off band lines. By default, bands respond to the mouse over event, but they can be set to respond to mouse down as well.

      -
      -
      
      -
      -

      Note, the plots on this page all extend the following pre-defined theme:

      - -
      
      -
      -
      -
      -
      -
      -
      -
      -
      -
      -
      -
      -
      -
      -
      -
      -
      -
      -
      -
      -
      -
      -
      -
      -
      -
      -    
      -    
      -    
      -    
      -
      -
      -    
      -    
      -    
      -    
      -
      -
      -
      -
      -	
      - - - - - - \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/examples/bar-charts.html b/libreplan-webapp/src/main/webapp/jqplot/examples/bar-charts.html deleted file mode 100644 index 4c6f824e3..000000000 --- a/libreplan-webapp/src/main/webapp/jqplot/examples/bar-charts.html +++ /dev/null @@ -1,219 +0,0 @@ - - - - - - Vertical and Horizontal Bar Charts - - - - - - - - - - - - - -
      - - - - - - - - - -
      - -
      
      -
      -    
      - -
      
      -
      -    

      Click on a bar in the plot below to update the text box.

      -

      You Clicked: - Nothing yet. -

      -
      - -
      
      -
      -  
      -  
      -
      -
      -
      -    
      -
      -
      -
      -
      -
      -
      -    
      -    
      -    
      -    
      -
      -
      -
      -
      -    
      -    
      -    
      -
      -
      -
      -
      -	
      - - - - - - \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/examples/barLineAnimated.html b/libreplan-webapp/src/main/webapp/jqplot/examples/barLineAnimated.html deleted file mode 100644 index 41a60ac97..000000000 --- a/libreplan-webapp/src/main/webapp/jqplot/examples/barLineAnimated.html +++ /dev/null @@ -1,165 +0,0 @@ - - - - - - Animated Charts - - - - - - - - - - - - - -
      - - - - - - -
      - -

      This plot animates the bars bottom to top and the line series left to right upon initial page load. Since the animateReplot: true option is set, the bars and line will also animate upon calls to plot1.replot( { resetAxes: true } ).

      - -
      
      -
      -
      - 
      -
      -
      -
      -
      -
      -    
      -    
      -    
      -    
      -
      -
      -  
      -  
      -   
      -  
      -
      -
      -
      -
      -	
      - - - - - - \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/examples/barTest.html b/libreplan-webapp/src/main/webapp/jqplot/examples/barTest.html deleted file mode 100644 index b4b495f87..000000000 --- a/libreplan-webapp/src/main/webapp/jqplot/examples/barTest.html +++ /dev/null @@ -1,299 +0,0 @@ - - - - - - Bar Charts - - - - - - - - - - - - - -
      - - - - - - -

      Below is a default bar plot. Bars will highlight on mouseover. Events are triggered when you mouseover a bar and also when you click on a bar. Here We capture the 'jqplotDataClick' event and display the clicked series index, point index and data values. When series data is assigned as a 1-dimensional array as in this example, jqPlot automatically converts it into a 2-dimensional array for plotting. So a series defined as [2, 6, 7, 10] will become [[1,2], [2,6], [3,7], [4,10]].

      - -

      You Clicked: Nothing yet
      - -
      -
      
      -
      -    

      The plot target also fires a 'jqplotDataMouseOver' when the cursor is moused over a bar even if highlighting is turned off. This event will fire continuously as the user mouses over the bar. 'jqplotDataHighlight' fires only once when the user first passes over the bar. Additionally, a 'jqplotDataUnhighlight' event is fired when the user moves out of a bar (if highlighting is enabled).

      - -

      Moused Over: Nothing
      - -
      -
      
      -    
      -    
      Moused Over: Nothing
      -
      Clicked: Nothing
      - -
      -
      
      -    
      -    

      The next example has the plot's 'captureRightClick' option set to true. This causes the plot to fire a 'jqplotRightClick' event the the user clicks the right mouse button over a bar. Here, the 'highlightMouseDown' option is also set to true. This will highlight a slice on mouse down instead of on move over. Highlighting will occur for either left or right click.

      - -
      You Right Clicked: Nothing yet
      - -
      -
      
      -    
      -    
      -
      
      -    
      -    
      -
      
      -        
      -

      A pie chart is added to test for incompatibilities.

      -
      -
      
      -
      -

      The nex example shows the placement of point labels on negative bars. They shou be placed on the opposite position. That is, if it is placed 'north' to the positive bars, then it should be placed 'south' to the negative bars.

      -
      -
      
      -
      -  
      -    
      -  
      -    
      -  
      -    
      -  
      -    
      -  
      -    
      -  
      -
      -   
      -
      -     
      -
      -
      -
      -
      -
      -    
      -    
      -    
      -    
      -
      -
      -  
      -  
      -  
      -  
      -  
      -
      -
      -
      -
      -	
      - - - - - - \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/examples/bezierCurve.html b/libreplan-webapp/src/main/webapp/jqplot/examples/bezierCurve.html deleted file mode 100644 index 2c5a61409..000000000 --- a/libreplan-webapp/src/main/webapp/jqplot/examples/bezierCurve.html +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - Bezier Curve Plots - - - - - - - - - - - - - -
      - - - - - - -

      The Bezier curve renderer can distinguish between two different input data formats. This first example has the data passed in as 2 data points, the second one defining the Bezier curve to the end point. With this format, non-default axes renderers will require specifying the minimum and maximum on the axes.

      -
      -    [[xstart, ystart], [cp1x, cp1y, cp2x, cp2y, xend, yend]];
      -
      -
      -

      This second example has the data broken out into 4 points, which will be assembled to define the Bezier Curve. With this format, any axes renderer can be used without explicitly specifying the minimum and maximum.

      -
      -    [[xstart, ystart], [cp1x, cp1y], [cp2x, cp2y], [xend, yend]];
      -
      -
      -

      Here is an example using a date axis renderer with Bezier curves. The data looks like:

      -
      -    [['01/01/2010', 6], ['02/01/2010', 9], ['03/01/2010', 8], ['04/01/2010', 3]]
      -
      - -
      - - - - - - - - - - - - - - - - - - - - - - - - -
      - - - - - - \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/examples/blockPlot.html b/libreplan-webapp/src/main/webapp/jqplot/examples/blockPlot.html deleted file mode 100644 index f648fd79c..000000000 --- a/libreplan-webapp/src/main/webapp/jqplot/examples/blockPlot.html +++ /dev/null @@ -1,197 +0,0 @@ - - - - - - Block Plots - - - - - - - - - - - - - -
      - - - - - - -

      Below is an example block plot. This plot also uses the Enhanced Legend Renderer plugin. Clicking on an item in the legend will toggle display of the appropriate series.

      - -
      - -

      Blocks can be moved by selecting the series, the point, and an optional duration parameter. If specified, duration will animate the movement. Duration is either a number in milliseconds, or the keywords 'fast' or 'slow'. Higher numbers will cause a slower animation.

      - Series: - Point: - Duration: - X: - Y: - -
      
      -    
      -    
      -    

      This second chart is like the first except the "varyBlockColors" renderer option is set to true. This will vary the color of each block in a series separately. This allows displaying a third dimension to the data such as grouping beverage products by producer and by category such as "cola", "tea", "energy drink", etc.

      - -

      Also, the legend has it's "showSwathces" option set to false, since the blocks of each series will be of varying color and won't correspond to one swatch color. This still enables the user to show and hide the series by clicking on a label in the legend.

      - -
      - - - - - - - - - - - - - - - - - - - - - - - - -
      - - - - - - \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/examples/bubble-plots.html b/libreplan-webapp/src/main/webapp/jqplot/examples/bubble-plots.html deleted file mode 100644 index 7733804da..000000000 --- a/libreplan-webapp/src/main/webapp/jqplot/examples/bubble-plots.html +++ /dev/null @@ -1,213 +0,0 @@ - - - - - - Bubble Plots - - - - - - - - - - - - - -
      - - - - - - - - -

      Bubble charts represent 3 dimensional data. First, a basic bubble chart with the "bubbleGradients: true" option to specify gradient fills. Radial gradients are not supported in IE version before IE 9 and will be automatically disabled.

      - -
      - -
      
      -
      -
      -

      Data is passed in to a bubble chart as a series of [x, y, radius, <label or object>]. The optional fourth element of the data point can either be either a label string or an object having 'label' and/or 'color' properties to assign to the bubble.

      - -

      By default, all bubbles are scaled according to the size of the plot area. The radius value in the data point will be adjusted to fit the bubbles in the chart. If the "autoscaleBubbles" option is set to false, the radius value in the data will be taken as a literal pixel value for the radius of the points.

      - -

      Next are some basic customizations of bubble appearance with the "bubbleAlpha" and "highlightAlpha" options.

      - -
      - -
      
      -
      -
      -

      In the following example, display of a custom toolip and highlighting of a custom table legend is performed by binding to the "jqplotDataHighlight" and "jqplotDataUnhighlight" events. The custom legend table here is dynamically created with a few lines of jQuery (O.K., it could be done in one line) based on the data array of the plot.

      - - - - - - -
      CompanyR Value
      - -
      
      -
      -
      -
      -  
      -
      -
      -
      -
      -
      -
      -
      -
      -
      -    
      -    
      -    
      -    
      -
      -
      -
      -
      -    
      -
      -
      -
      -
      -	
      - - - - - - \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/examples/bubbleChart.html b/libreplan-webapp/src/main/webapp/jqplot/examples/bubbleChart.html deleted file mode 100644 index 99a907d62..000000000 --- a/libreplan-webapp/src/main/webapp/jqplot/examples/bubbleChart.html +++ /dev/null @@ -1,264 +0,0 @@ - - - - - - Bubble Charts - - - - - - - - - - - - - -
      - - - - - - - - - -

      Bubble charts represent 3 dimensional data. Data is passed in to a bubble chart as a series of [x, y, radius, <label or object>]. The optional fourth element of the data point can either be either a label string or an object having 'label' and/or 'color' properties to assign to the bubble.

      - -

      By default, all bubbles are scaled according to the size of the plot area. The radius value in the data point will be adjusted to fit the bubbles in the chart. If the "autoscaleBubbles" option is set to false, the radius value in the data will be taken as a literal pixel value for the radius of the points.

      - -

      The below chart show basic customization of bubble appearance with the "bubbleAlpha" and "highlightAlpha" options.

      - -
      -
      
      -
      -
      -
      -
      -    
      -    
      -
      CompanyR Value
      -
      
      -
      -

      Below is a basic bubble chart showing usage of the optional label and color properties passed in with the data.

      - -
      -
      
      -
      -

      The next chart uses the "bubbleGradients: true" option to specify gradient fills on the bubbles. Radial gradients are not supported in IE* and will be automatically disabled.

      - -
      - -

      *Radial gradients are not supported in IE 7 and IE 8 because they are not supported in the excanvas emulation layer used by jqPlot to render charts in IE 7 and IE 8. jqPlot renders charts using the HTML canvas element which is supported by nearly every browser including IE 9. Excanvas translates the canvas rendering to VML rendering for IE 7 and 8, but unfortunately does not properly handle radial gradients.

      - -
      
      -
      -

      The following bubble chart shows the "autoscalePointsFactor" and "autoscaleMultiplier" options which can be used to control bubble scaling. The "autoscalePointsFactor" options controls bubble scaling with the number of points on the plot. A negative value will decrease bubble size and number of bubbles increases. The "autoscaleMultiplier" will makes all bubbles larger or smaller for values greater or less than 1.0.

      - -

      This chart also demonstrates some of the highlighting options. Bubble highlighting is controlled with the "highlightMouseOver" and "highlightMouseDown" boolean options. Here the "highlightMouseDown: true" option is set which causes the plot to highlight on mousedown (click). This automatically sets the "highlightMouseOver" option to false.

      - -

      Events are also trigger with plot interaction. Specifically, "jqplotDataHighlight", "jqplotDataUnhighlight", "jqplotDataClick" and "jqplotDataRightClick" events are triggered. Handlers are passed an event object, the series index, the point index, and the bubble data.

      - -
      -
      
      -
      -
      -
      -
      -
      -
      -
      -
      -
      -
      -
      -
      -
      -
      -
      -
      -
      -    
      -    
      -    
      -    
      -
      -
      -  
      -
      -
      -
      -
      -	
      - - - - - - \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/examples/candlestick-charts.html b/libreplan-webapp/src/main/webapp/jqplot/examples/candlestick-charts.html deleted file mode 100644 index 00475f6a0..000000000 --- a/libreplan-webapp/src/main/webapp/jqplot/examples/candlestick-charts.html +++ /dev/null @@ -1,209 +0,0 @@ - - - - - - Open Hi Low Close and Candlestick Charts - - - - - - - - - - - - - -
      - - - - - - -

      OHLC, HLC and Candlestick charts are all created using the $.jqplot.OHLCRenderer plugin. The plots on this page make use of the highlighter plugin which shows a customized tooltip as the mouse moves over a data point.

      -
      - -
      
      -
      -
      - -
      
      -
      -

      The previous plots use the following data set. jqPlot will parse most human readable date formats. It is always safest, however, to pass a date in as a JavaScript timestamp rather than have jqPlot parse an arbitrary date string.

      - -
      
      -
      -
      -
      -
      -
      -
      -
      -
      -
      -
      -
      -
      -
      -
      -    
      -    
      -    
      -    
      -
      -
      -
      -
      -    
      -    
      -    
      -
      -
      -
      -
      -	
      - - - - - - \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/examples/candlestick.html b/libreplan-webapp/src/main/webapp/jqplot/examples/candlestick.html deleted file mode 100644 index d2da3dd72..000000000 --- a/libreplan-webapp/src/main/webapp/jqplot/examples/candlestick.html +++ /dev/null @@ -1,322 +0,0 @@ - - - - - - Candlestick and Open Hi Low Close charts - - - - - - - - - - - - - -
      - - - - - - -
      -
      
      -
      -
      
      -
      -
      
      -
      -
      
      -
      -
      
      -

      The examples on this page use the folowing code:

      -
      
      -
      -
      -
      -
      -
      -
      -
      -
      -
      -
      -
      -
      -
      -
      -
      -
      -
      -
      -    
      -    
      -    
      -    
      -
      -
      -
      -
      -    
      -    
      -    
      -    
      -    
      -
      -
      -
      -
      -	
      - - - - - - \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/examples/cursor-highlighter.html b/libreplan-webapp/src/main/webapp/jqplot/examples/cursor-highlighter.html deleted file mode 100644 index f2268de75..000000000 --- a/libreplan-webapp/src/main/webapp/jqplot/examples/cursor-highlighter.html +++ /dev/null @@ -1,137 +0,0 @@ - - - - - - Data Point Highlighting, Tooltips and Cursor Tracking - - - - - - - - - - - - - -
      - - - - - - -

      The Highlighter plugin will highlight data points near the mouse and display an optional tooltip with the data point value. By default, the tooltip values will be formatted with the same formatter as used to display the axes tick values. The text format can be customized with an optional sprintf style format string.

      - -
      - -
      
      -
      -

      The Cursor plugin changes the mouse cursor when it enters the graph area and displays an optional tooltip with the mouse position. The tooltip can be in a fixed location, or it can follow the mouse. The pointer style, set to "crosshair" by default, can also be customized. Tooltip values are formatted similar to the Highlighter plugin. By default they use the axes formatters, but can be customized with a sprintf format string.

      - -
      - -
      
      -
      -
      -  
      -
      -
      -
      -
      -
      -
      -
      -
      -    
      -    
      -    
      -    
      -
      -
      -
      -
      -    
      -    
      -    
      -
      -
      -
      -
      -	
      - - - - - - \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/examples/customHighlighterCursorTrendline.html b/libreplan-webapp/src/main/webapp/jqplot/examples/customHighlighterCursorTrendline.html deleted file mode 100644 index e85fa64f5..000000000 --- a/libreplan-webapp/src/main/webapp/jqplot/examples/customHighlighterCursorTrendline.html +++ /dev/null @@ -1,104 +0,0 @@ - - - - - - Highlighting, Dragging Points, Cursor and Trend Lines. - - - - - - - - - - - - - -
      - - - -
      - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      - - - - - - \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/examples/dashboardWidget.html b/libreplan-webapp/src/main/webapp/jqplot/examples/dashboardWidget.html deleted file mode 100644 index ee1191426..000000000 --- a/libreplan-webapp/src/main/webapp/jqplot/examples/dashboardWidget.html +++ /dev/null @@ -1,212 +0,0 @@ - - - - - - Animated Dashboard Sample - Filled Line with Log Axis - - - - - - - - - - - - - -
      - - - - - - - - - -
      -
      Hi Powered Data
      -
      -
      -
      -
      - -
      
      -
      -    
      -
      -
      -
      -
      -
      -
      -
      -    
      -    
      -    
      -    
      -
      -
      -
      -    
      -    
      -    
      -    
      -    
      -
      -
      -
      -
      -	
      - - - - - - \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/examples/dashedLines.html b/libreplan-webapp/src/main/webapp/jqplot/examples/dashedLines.html deleted file mode 100644 index 13aca5a5e..000000000 --- a/libreplan-webapp/src/main/webapp/jqplot/examples/dashedLines.html +++ /dev/null @@ -1,227 +0,0 @@ - - - - - - Dashed Lines with Smoothing - - - - - - - - - - - - - -
      - - - - - - - - - -
      - -
      - -
      - -
      - -
      - -
      - -
      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      - - - - - - \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/examples/data-renderers.html b/libreplan-webapp/src/main/webapp/jqplot/examples/data-renderers.html deleted file mode 100644 index ac2e96d43..000000000 --- a/libreplan-webapp/src/main/webapp/jqplot/examples/data-renderers.html +++ /dev/null @@ -1,144 +0,0 @@ - - - - - - AJAX and JSON Data Loading via Data Renderers - - - - - - - - - - - - - -
      - - - - - - -

      Data renderers allow jqPlot to pull data from any external source (e.g. a function implementing an AJAX call). Simply assign the external source to the "dataRenderer" plot option. The only requirement on data renderers is that it must return a valid jqPlot data array.

      - -
      - -
      
      -
      -
      -

      Data renderers get passed options by the plot. The signiture for a data renderer is:

      - - -
      -function(userData, plotObject, options) {
      -  ...
      -  return data;
      -}
      -
      - - -

      Where userData is whatever data was passed into the plot, plotObject is a reference back to the plot itself, and options are any options passed into the plots "dataRendererOption" option. The following example shows a more complicated example which uses ajax pulls data from an external json data source.

      - -
      - -
      
      -
      -
      -
      -
      -  
      -
      -
      -
      -
      -
      -
      -
      -
      -    
      -    
      -    
      -    
      -
      -
      -
      -
      -    
      -
      -
      -
      -
      -	
      - - - - - - \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/examples/date-axes.html b/libreplan-webapp/src/main/webapp/jqplot/examples/date-axes.html deleted file mode 100644 index 1047e6adc..000000000 --- a/libreplan-webapp/src/main/webapp/jqplot/examples/date-axes.html +++ /dev/null @@ -1,107 +0,0 @@ - - - - - - Date Axes - - - - - - - - - - - - - -
      - - - - - -

      Date axes support is provided through the dateAxisRenderer plugin. Date axes expand javascripts native date handling capabilities. This allow dates to be input in almost any unambiguous form, not just in milliseconds!

      - -

      Note, although jqPlot will parse most any human readable date, it is safest to use javascript time stamps when possible. Also, it is best to specify a date and time and not just a date alone. This is due to inconsistent browser handling of local time vs. UTC with bare dates.

      - -
      - -
      
      -
      -

      Date Axes also provide powerful formatting features. This allows custom formatter strings to be used to format axis tick labels precisely the way you want.

      - -
      - -
      
      -  
      -
      -
      -
      -
      -
      -
      -
      -
      -
      -
      -    
      -    
      -    
      -    
      -
      -
      -
      -
      -    
      -
      -
      -
      -
      -	
      - - - - - - \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/examples/dateAxisLogAxisZooming.html b/libreplan-webapp/src/main/webapp/jqplot/examples/dateAxisLogAxisZooming.html deleted file mode 100644 index 9692d8f3f..000000000 --- a/libreplan-webapp/src/main/webapp/jqplot/examples/dateAxisLogAxisZooming.html +++ /dev/null @@ -1,105 +0,0 @@ - - - - - - Zooming with Date and Log Axes - - - - - - - - - - - - - -
      - - - -
      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      - - - - - - \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/examples/dateAxisRenderer.html b/libreplan-webapp/src/main/webapp/jqplot/examples/dateAxisRenderer.html deleted file mode 100644 index 130292660..000000000 --- a/libreplan-webapp/src/main/webapp/jqplot/examples/dateAxisRenderer.html +++ /dev/null @@ -1,292 +0,0 @@ - - - - - - Date Axes - - - - - - - - - - - - - -
      - - - - - - -

      Date axis renderer with default settings. Ticks are given wider spacing by default since date axes typically have longer tick labels.

      -
      -

      Date axis recognizes rotated tick labels. It will space ticks a little closer when labels are rotated.

      -
      -

      If you want more or less ticks, specify the "numberTicks" options. Date axes will try to produce the desired number of ticks, but may adjust to get a nice interval.

      -
      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      - - - - - - \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/examples/example.js b/libreplan-webapp/src/main/webapp/jqplot/examples/example.js deleted file mode 100644 index ff85cd205..000000000 --- a/libreplan-webapp/src/main/webapp/jqplot/examples/example.js +++ /dev/null @@ -1,114 +0,0 @@ -$(document).ready(function(){ - if (!$.jqplot._noCodeBlock) { - $('script.code').each(function(index) { - if ($('pre.code').eq(index).length ) { - $('pre.code').eq(index).text($(this).html()); - } - else { - // var str = $(this).text(); - // $('div.jqplot-target').eq(index).after($('
      '+str+'
      ')); - var pre = $('
      ');
      -                $('div.jqplot-target').eq(index).after(pre);
      -                pre.text($(this).html());
      -                pre = null;
      -            }
      -        });
      -
      -        $('script.common').each(function(index) {
      -            $('pre.common').eq(index).text($(this).html());
      -        });
      -
      -        var elstr='';
      -        if ($('script.include, link.include').length > 0) {
      -
      -            if ($('pre.include').length == 0) {
      -                var temp = [
      -                    '
      ', - '

      The charts on this page depend on the following files:

      ', - '
      ',
      -                    '
      ' - ]; - - temp = $(temp.join('\n')); - $('div.example-content').append(temp); - temp = null; - } - - - $('script.include').each(function(index) { - if (elstr !== '') { - elstr += '\n'; - } - elstr += ''; - }); - - $('link.include').each(function(index) { - if (elstr !== '') { - elstr += '\n'; - } - elstr += ''; - }) - - $('pre.include').text(elstr); - } - - else { - $('pre.include').remove(); - $('div.include').remove(); - } - } - - if (!$.jqplot.use_excanvas) { - $('div.jqplot-target').each(function(){ - var outerDiv = $(document.createElement('div')); - var header = $(document.createElement('div')); - var div = $(document.createElement('div')); - - outerDiv.append(header); - outerDiv.append(div); - - outerDiv.addClass('jqplot-image-container'); - header.addClass('jqplot-image-container-header'); - div.addClass('jqplot-image-container-content'); - - header.html('Right Click to Save Image As...'); - - var close = $(document.createElement('a')); - close.addClass('jqplot-image-container-close'); - close.html('Close'); - close.attr('href', '#'); - close.click(function() { - $(this).parents('div.jqplot-image-container').hide(500); - }) - header.append(close); - - $(this).after(outerDiv); - outerDiv.hide(); - - outerDiv = header = div = close = null; - - if (!$.jqplot._noToImageButton) { - var btn = $(document.createElement('button')); - btn.text('View Plot Image'); - btn.addClass('jqplot-image-button'); - btn.bind('click', {chart: $(this)}, function(evt) { - var imgelem = evt.data.chart.jqplotToImageElem(); - var div = $(this).nextAll('div.jqplot-image-container').first(); - div.children('div.jqplot-image-container-content').empty(); - div.children('div.jqplot-image-container-content').append(imgelem); - div.show(500); - div = null; - }); - - $(this).after(btn); - btn.after('
      '); - btn = null; - } - }); - } - - SyntaxHighlighter.defaults['toolbar'] = true; - SyntaxHighlighter.all(); - - $(document).unload(function() {$('*').unbind(); }); -}); \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/examples/example.min.js b/libreplan-webapp/src/main/webapp/jqplot/examples/example.min.js deleted file mode 100644 index 132e22953..000000000 --- a/libreplan-webapp/src/main/webapp/jqplot/examples/example.min.js +++ /dev/null @@ -1 +0,0 @@ -$(document).ready(function(){if(!$.jqplot._noCodeBlock){$("script.code").each(function(c){if($("pre.code").eq(c).length){$("pre.code").eq(c).text($(this).html())}else{var d=$('
      ');$("div.jqplot-target").eq(c).after(d);d.text($(this).html());d=null}});$("script.common").each(function(c){$("pre.common").eq(c).text($(this).html())});var b="";if($("script.include, link.include").length>0){if($("pre.include").length==0){var a=['
      ','

      The charts on this page depend on the following files:

      ','
      ',"
      "];a=$(a.join("\n"));$("div.example-content").append(a);a=null}$("script.include").each(function(c){if(b!==""){b+="\n"}b+=' - - - - - -
      - - - - - - - - - -
      - -

      Enter 2 series to fill between:

      - - - - - - - -
      
      -
      -
      -    
      -
      -
      -
      -
      -
      -
      -    
      -    
      -    
      -    
      -
      -
      -
      -
      -
      -
      -
      -	
      - - - - - - \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/examples/hiddenPlotsInTabs.html b/libreplan-webapp/src/main/webapp/jqplot/examples/hiddenPlotsInTabs.html deleted file mode 100644 index 875582f19..000000000 --- a/libreplan-webapp/src/main/webapp/jqplot/examples/hiddenPlotsInTabs.html +++ /dev/null @@ -1,225 +0,0 @@ - - - - - - Hidden Plots - - - - - - - - - - - - - -
      - - - - - - - - -

      This page demonstrates placing plots within jQuery UI widgets. Tab 2 and tab 3 contain plots. Using a combination of alternate sizing specification and the jqplot "replot" method the plots are properly displayed when their containers are shown.

      - -

      The alternate sizing specifications for setting plot height and width are needed because a hidden element (or child of a hidden element) has no size. The first example in tab 2 uses custom "data-height" and "data-width" attributes on the plot target element. The second example uses "width" and "height" properties specified on the options object passed into the $.jqplot() function.

      - -

      The default plot size is 300px wide by 400px high. The default setting can be overridden by specifying different values to the $.jqplot.config.defaultHeight and $.jqplot.config.defaultWidth properties. Height and width values are taken in this order of precedence: -

      - -
        -
      1. The css properties of the plot target if available (not available with display:none;).
      2. -
      3. Options object passed into the $.jqplot() function.
      4. -
      5. Custom data-height and data-width attributes on the plot target.
      6. -
      7. The config defaults.
      8. -
      - -
      - -
      - Tabs 2 and 3 have plots. Since tabs 2 and 3 are initially inactive, their contents (and the plots) are initially hidden. -
      - -
      -

      This plot was in an initially hidden container. It's hieght and width are set by the "data-height" and "data-width" properties of the plot container.

      -
      -
      - -
      -

      This plot is in an initially hidden container. It's height and width are set by the 'height' and 'width' properties of the options object passed into the plot constructor.

      -
      -
      - -
      - -

      In the accordion below, section 2 contains a plot. Sizing plots in hidden accordion sections is very similar to sizing in a tab widget. Because of the default animation on accordions, however, the plot will not draw itself until the entire accordion panel is shown.

      - -
      - -

      Section 1

      -
      - Here is section 1 there is no plot. Section 2 has a plot that will display once the section is completely shown. -
      - -

      Section 2

      -
      -

      - This plot also has it's height and width set with the data-height and data-width attributes. Note, if you want the accordion widget to properly size itself before the plot is shown, you must also specify a css height and width on the plot target. -

      -
      -
      - -
      - -

      Code for generating the plots follows. It is critical to bind the callback to the UI widgets "show" or "change" method which calls the plots "replot" method. Without this, the plot won't properly redraw itself when it's container becomes visible.

      - -

      - Note in the ui.index and plot._drawCount properties in the tabsshow callback. ui.index gives the index of the activated tab. plot._drawCount keeps track of how many times the plot was visibly drawn (or redrawn/replotted). Generally, replot only needs to be called the first time the plot is visibly drawn, hence the check for plot._drawCount == 0. -

      - -
      
      -
      - 
      -
      -
      -
      -
      -
      -
      -    
      -    
      -    
      -    
      -
      -
      -
      -  
      -  
      -  
      -  
      -   
      -  
      -
      -
      -
      -
      -	
      - - - - - - \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/examples/images/logo.jpg b/libreplan-webapp/src/main/webapp/jqplot/examples/images/logo.jpg deleted file mode 100644 index a12fffcd5e43de9e69d5b2e42842837972123577..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14632 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 diff --git a/libreplan-webapp/src/main/webapp/jqplot/examples/index.html b/libreplan-webapp/src/main/webapp/jqplot/examples/index.html deleted file mode 100644 index 7d47fb769..000000000 --- a/libreplan-webapp/src/main/webapp/jqplot/examples/index.html +++ /dev/null @@ -1,100 +0,0 @@ - - - - - - jqPlot Sample Charts - - - - - - - - - - - - - - - - - - - - - -
    - - - - - diff --git a/libreplan-webapp/src/main/webapp/jqplot/examples/jquery-ui/css/ui-lightness/images/ui-bg_flat_0_aaaaaa_40x100.png b/libreplan-webapp/src/main/webapp/jqplot/examples/jquery-ui/css/ui-lightness/images/ui-bg_flat_0_aaaaaa_40x100.png deleted file mode 100644 index 5b5dab2ab7b1c50dea9cfe73dc5a269a92d2d4b4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 180 zcmeAS@N?(olHy`uVBq!ia0vp^8bF-F!3HG1q!d*FscKIb$B>N1x91EQ4=4yQ7#`R^ z$vje}bP0l+XkK DSH>_4 diff --git a/libreplan-webapp/src/main/webapp/jqplot/examples/jquery-ui/css/ui-lightness/images/ui-bg_flat_75_ffffff_40x100.png b/libreplan-webapp/src/main/webapp/jqplot/examples/jquery-ui/css/ui-lightness/images/ui-bg_flat_75_ffffff_40x100.png deleted file mode 100644 index ac8b229af950c29356abf64a6c4aa894575445f0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 178 zcmeAS@N?(olHy`uVBq!ia0vp^8bF-F!3HG1q!d*FsY*{5$B>N1x91EQ4=4yQYz+E8 zPo9&<{J;c_6SHRil>2s{Zw^OT)6@jj2u|u!(plXsM>LJD`vD!n;OXk;vd$@?2>^GI BH@yG= diff --git a/libreplan-webapp/src/main/webapp/jqplot/examples/jquery-ui/css/ui-lightness/images/ui-bg_glass_55_fbf9ee_1x400.png b/libreplan-webapp/src/main/webapp/jqplot/examples/jquery-ui/css/ui-lightness/images/ui-bg_glass_55_fbf9ee_1x400.png deleted file mode 100644 index ad3d6346e00f246102f72f2e026ed0491988b394..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 120 zcmeAS@N?(olHy`uVBq!ia0vp^j6gJjgAK^akKnour0hLi978O6-<~(*I$*%ybaDOn z{W;e!B}_MSUQoPXhYd^Y6RUoS1yepnPx`2Kz)7OXQG!!=-jY=F+d2OOy?#DnJ32>z UEim$g7SJdLPgg&ebxsLQ09~*s;{X5v diff --git a/libreplan-webapp/src/main/webapp/jqplot/examples/jquery-ui/css/ui-lightness/images/ui-bg_glass_65_ffffff_1x400.png b/libreplan-webapp/src/main/webapp/jqplot/examples/jquery-ui/css/ui-lightness/images/ui-bg_glass_65_ffffff_1x400.png deleted file mode 100644 index 42ccba269b6e91bef12ad0fa18be651b5ef0ee68..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 105 zcmeAS@N?(olHy`uVBq!ia0vp^j6gJjgAK^akKnouqzpV=978O6-=0?FV^9z|eBtf= z|7WztIJ;WT>{+tN>ySr~=F{k$>;_x^_y?afmf9pRKH0)6?eSP?3s5hEr>mdKI;Vst E0O;M1& diff --git a/libreplan-webapp/src/main/webapp/jqplot/examples/jquery-ui/css/ui-lightness/images/ui-bg_glass_75_dadada_1x400.png b/libreplan-webapp/src/main/webapp/jqplot/examples/jquery-ui/css/ui-lightness/images/ui-bg_glass_75_dadada_1x400.png deleted file mode 100644 index 5a46b47cb16631068aee9e0bd61269fc4e95e5cd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 111 zcmeAS@N?(olHy`uVBq!ia0vp^j6gJjgAK^akKnouq|7{B978O6lPf+wIa#m9#>Unb zm^4K~wN3Zq+uP{vDV26o)#~38k_!`W=^oo1w6ixmPC4R1b Tyd6G3lNdZ*{an^LB{Ts5`idse diff --git a/libreplan-webapp/src/main/webapp/jqplot/examples/jquery-ui/css/ui-lightness/images/ui-bg_highlight-soft_75_cccccc_1x100.png b/libreplan-webapp/src/main/webapp/jqplot/examples/jquery-ui/css/ui-lightness/images/ui-bg_highlight-soft_75_cccccc_1x100.png deleted file mode 100644 index 7c9fa6c6edcfcdd3e5b77e6f547b719e6fc66e30..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 101 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 diff --git a/libreplan-webapp/src/main/webapp/jqplot/examples/jquery-ui/css/ui-lightness/images/ui-icons_2e83ff_256x240.png b/libreplan-webapp/src/main/webapp/jqplot/examples/jquery-ui/css/ui-lightness/images/ui-icons_2e83ff_256x240.png deleted file mode 100644 index 45e8928e5284adacea3f9ec07b9b50667d2ac65f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4369 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 diff --git a/libreplan-webapp/src/main/webapp/jqplot/examples/jquery-ui/css/ui-lightness/images/ui-icons_454545_256x240.png b/libreplan-webapp/src/main/webapp/jqplot/examples/jquery-ui/css/ui-lightness/images/ui-icons_454545_256x240.png deleted file mode 100644 index 7ec70d11bfb2f77374dfd00ef61ba0c3647b5a0c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4369 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 k*Kv;w;*%(i9W@fAqs5i2wiq diff --git a/libreplan-webapp/src/main/webapp/jqplot/examples/jquery-ui/css/ui-lightness/images/ui-icons_888888_256x240.png b/libreplan-webapp/src/main/webapp/jqplot/examples/jquery-ui/css/ui-lightness/images/ui-icons_888888_256x240.png deleted file mode 100644 index 5ba708c39172a69e069136bd1309c4322c61f571..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4369 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 diff --git a/libreplan-webapp/src/main/webapp/jqplot/examples/jquery-ui/css/ui-lightness/jquery-ui.css b/libreplan-webapp/src/main/webapp/jqplot/examples/jquery-ui/css/ui-lightness/jquery-ui.css deleted file mode 100644 index cd66d5377..000000000 --- a/libreplan-webapp/src/main/webapp/jqplot/examples/jquery-ui/css/ui-lightness/jquery-ui.css +++ /dev/null @@ -1,612 +0,0 @@ -/* - * jQuery UI CSS Framework 1.9pre - * - * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) - * Dual licensed under the MIT or GPL Version 2 licenses. - * http://jquery.org/license - * - * http://docs.jquery.com/UI/Theming/API - */ - -/* Layout helpers -----------------------------------*/ -.ui-helper-hidden { display: none; } -.ui-helper-hidden-accessible { position: absolute !important; clip: rect(1px 1px 1px 1px); clip: rect(1px,1px,1px,1px); } -.ui-helper-reset { margin: 0; padding: 0; border: 0; outline: 0; line-height: 1.3; text-decoration: none; font-size: 100%; list-style: none; } -.ui-helper-clearfix:after { content: "."; display: block; height: 0; clear: both; visibility: hidden; } -.ui-helper-clearfix { display: inline-block; } -/* required comment for clearfix to work in Opera \*/ -* html .ui-helper-clearfix { height:1%; } -.ui-helper-clearfix { display:block; } -/* end clearfix */ -.ui-helper-zfix { width: 100%; height: 100%; top: 0; left: 0; position: absolute; opacity: 0; filter:Alpha(Opacity=0); } - - -/* Interaction Cues -----------------------------------*/ -.ui-state-disabled { cursor: default !important; } - - -/* Icons -----------------------------------*/ - -/* states and images */ -.ui-icon { display: block; text-indent: -99999px; overflow: hidden; background-repeat: no-repeat; } - - -/* Misc visuals -----------------------------------*/ - -/* Overlays */ -.ui-widget-overlay { position: absolute; top: 0; left: 0; width: 100%; height: 100%; } -/* - * jQuery UI Accordion 1.9pre - * - * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) - * Dual licensed under the MIT or GPL Version 2 licenses. - * http://jquery.org/license - * - * http://docs.jquery.com/UI/Accordion#theming - */ -/* IE/Win - Fix animation bug - #4615 */ -.ui-accordion { width: 100%; } -.ui-accordion .ui-accordion-header { cursor: pointer; position: relative; margin-top: 1px; zoom: 1; } -.ui-accordion .ui-accordion-header-active { border-bottom: 0 !important; } -.ui-accordion .ui-accordion-heading { display: block; font-size: 1em; padding: .5em .5em .5em .7em; } -.ui-accordion-icons .ui-accordion-heading { padding-left: 2.2em; } -.ui-accordion .ui-accordion-header .ui-accordion-header-icon { position: absolute; left: .5em; top: 50%; margin-top: -8px; } -.ui-accordion .ui-accordion-content { padding: 1em 2.2em; border-top: 0; margin-top: -2px; position: relative; top: 1px; margin-bottom: 2px; overflow: auto; display: none; zoom: 1; } -.ui-accordion .ui-accordion-content-active { display: block; } -/* - * jQuery UI Autocomplete 1.9pre - * - * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) - * Dual licensed under the MIT or GPL Version 2 licenses. - * http://jquery.org/license - * - * http://docs.jquery.com/UI/Autocomplete#theming - */ -.ui-autocomplete { position: absolute; cursor: default; } - -/* workarounds */ -* html .ui-autocomplete { width:1px; } /* without this, the menu expands to 100% in IE6 */ -/* - * jQuery UI Button 1.9pre - * - * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) - * Dual licensed under the MIT or GPL Version 2 licenses. - * http://jquery.org/license - * - * http://docs.jquery.com/UI/Button#theming - */ -.ui-button { display: inline-block; position: relative; padding: 0; margin-right: .1em; text-decoration: none !important; cursor: pointer; text-align: center; zoom: 1; overflow: visible; } /* the overflow property removes extra width in IE */ -.ui-button-icon-only { width: 2.2em; } /* to make room for the icon, a width needs to be set here */ -button.ui-button-icon-only { width: 2.4em; } /* button elements seem to need a little more width */ -.ui-button-icons-only { width: 3.4em; } -button.ui-button-icons-only { width: 3.7em; } - -/*button text element */ -.ui-button .ui-button-text { display: block; line-height: 1.4; } -.ui-button-text-only .ui-button-text { padding: .4em 1em; } -.ui-button-icon-only .ui-button-text, .ui-button-icons-only .ui-button-text { padding: .4em; text-indent: -9999999px; } -.ui-button-text-icon-primary .ui-button-text, .ui-button-text-icons .ui-button-text { padding: .4em 1em .4em 2.1em; } -.ui-button-text-icon-secondary .ui-button-text, .ui-button-text-icons .ui-button-text { padding: .4em 2.1em .4em 1em; } -.ui-button-text-icons .ui-button-text { padding-left: 2.1em; padding-right: 2.1em; } -/* no icon support for input elements, provide padding by default */ -input.ui-button { padding: .4em 1em; } - -/*button icon element(s) */ -.ui-button-icon-only .ui-icon, .ui-button-text-icon-primary .ui-icon, .ui-button-text-icon-secondary .ui-icon, .ui-button-text-icons .ui-icon, .ui-button-icons-only .ui-icon { position: absolute; top: 50%; margin-top: -8px; } -.ui-button-icon-only .ui-icon { left: 50%; margin-left: -8px; } -.ui-button-text-icon-primary .ui-button-icon-primary, .ui-button-text-icons .ui-button-icon-primary, .ui-button-icons-only .ui-button-icon-primary { left: .5em; } -.ui-button-text-icon-secondary .ui-button-icon-secondary, .ui-button-text-icons .ui-button-icon-secondary, .ui-button-icons-only .ui-button-icon-secondary { right: .5em; } -.ui-button-text-icons .ui-button-icon-secondary, .ui-button-icons-only .ui-button-icon-secondary { right: .5em; } - -/*button sets*/ -.ui-buttonset { margin-right: 7px; } -.ui-buttonset .ui-button { margin-left: 0; margin-right: -.3em; } - -/* workarounds */ -button.ui-button::-moz-focus-inner { border: 0; padding: 0; } /* reset extra padding in Firefox */ -/* - * jQuery UI Datepicker 1.9pre - * - * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) - * Dual licensed under the MIT or GPL Version 2 licenses. - * http://jquery.org/license - * - * http://docs.jquery.com/UI/Datepicker#theming - */ -.ui-datepicker { width: 17em; padding: .2em .2em 0; display: none; } -.ui-datepicker .ui-datepicker-header { position:relative; padding:.2em 0; } -.ui-datepicker .ui-datepicker-prev, .ui-datepicker .ui-datepicker-next { position:absolute; top: 2px; width: 1.8em; height: 1.8em; } -.ui-datepicker .ui-datepicker-prev-hover, .ui-datepicker .ui-datepicker-next-hover { top: 1px; } -.ui-datepicker .ui-datepicker-prev { left:2px; } -.ui-datepicker .ui-datepicker-next { right:2px; } -.ui-datepicker .ui-datepicker-prev-hover { left:1px; } -.ui-datepicker .ui-datepicker-next-hover { right:1px; } -.ui-datepicker .ui-datepicker-prev span, .ui-datepicker .ui-datepicker-next span { display: block; position: absolute; left: 50%; margin-left: -8px; top: 50%; margin-top: -8px; } -.ui-datepicker .ui-datepicker-title { margin: 0 2.3em; line-height: 1.8em; text-align: center; } -.ui-datepicker .ui-datepicker-title select { font-size:1em; margin:1px 0; } -.ui-datepicker select.ui-datepicker-month-year {width: 100%;} -.ui-datepicker select.ui-datepicker-month, -.ui-datepicker select.ui-datepicker-year { width: 49%;} -.ui-datepicker table {width: 100%; font-size: .9em; border-collapse: collapse; margin:0 0 .4em; } -.ui-datepicker th { padding: .7em .3em; text-align: center; font-weight: bold; border: 0; } -.ui-datepicker td { border: 0; padding: 1px; } -.ui-datepicker td span, .ui-datepicker td a { display: block; padding: .2em; text-align: right; text-decoration: none; } -.ui-datepicker .ui-datepicker-buttonpane { background-image: none; margin: .7em 0 0 0; padding:0 .2em; border-left: 0; border-right: 0; border-bottom: 0; } -.ui-datepicker .ui-datepicker-buttonpane button { float: right; margin: .5em .2em .4em; cursor: pointer; padding: .2em .6em .3em .6em; width:auto; overflow:visible; } -.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current { float:left; } - -/* with multiple calendars */ -.ui-datepicker.ui-datepicker-multi { width:auto; } -.ui-datepicker-multi .ui-datepicker-group { float:left; } -.ui-datepicker-multi .ui-datepicker-group table { width:95%; margin:0 auto .4em; } -.ui-datepicker-multi-2 .ui-datepicker-group { width:50%; } -.ui-datepicker-multi-3 .ui-datepicker-group { width:33.3%; } -.ui-datepicker-multi-4 .ui-datepicker-group { width:25%; } -.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header { border-left-width:0; } -.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header { border-left-width:0; } -.ui-datepicker-multi .ui-datepicker-buttonpane { clear:left; } -.ui-datepicker-row-break { clear:both; width:100%; font-size:0em; } - -/* RTL support */ -.ui-datepicker-rtl { direction: rtl; } -.ui-datepicker-rtl .ui-datepicker-prev { right: 2px; left: auto; } -.ui-datepicker-rtl .ui-datepicker-next { left: 2px; right: auto; } -.ui-datepicker-rtl .ui-datepicker-prev:hover { right: 1px; left: auto; } -.ui-datepicker-rtl .ui-datepicker-next:hover { left: 1px; right: auto; } -.ui-datepicker-rtl .ui-datepicker-buttonpane { clear:right; } -.ui-datepicker-rtl .ui-datepicker-buttonpane button { float: left; } -.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current { float:right; } -.ui-datepicker-rtl .ui-datepicker-group { float:right; } -.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header { border-right-width:0; border-left-width:1px; } -.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header { border-right-width:0; border-left-width:1px; } - -/* IE6 IFRAME FIX (taken from datepicker 1.5.3 */ -.ui-datepicker-cover { - display: none; /*sorry for IE5*/ - display/**/: block; /*sorry for IE5*/ - position: absolute; /*must have*/ - z-index: -1; /*must have*/ - filter: mask(); /*must have*/ - top: -4px; /*must have*/ - left: -4px; /*must have*/ - width: 200px; /*must have*/ - height: 200px; /*must have*/ -}/* - * jQuery UI Dialog 1.9pre - * - * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) - * Dual licensed under the MIT or GPL Version 2 licenses. - * http://jquery.org/license - * - * http://docs.jquery.com/UI/Dialog#theming - */ -.ui-dialog { position: absolute; padding: .2em; width: 300px; overflow: hidden; } -.ui-dialog .ui-dialog-titlebar { padding: .4em 1em; position: relative; } -.ui-dialog .ui-dialog-title { float: left; margin: .1em 16px .1em 0; } -.ui-dialog .ui-dialog-titlebar-close { position: absolute; right: .3em; top: 50%; width: 19px; margin: -10px 0 0 0; padding: 1px; height: 18px; } -.ui-dialog .ui-dialog-titlebar-close span { display: block; margin: 1px; } -.ui-dialog .ui-dialog-titlebar-close:hover, .ui-dialog .ui-dialog-titlebar-close:focus { padding: 0; } -.ui-dialog .ui-dialog-content { position: relative; border: 0; padding: .5em 1em; background: none; overflow: auto; zoom: 1; } -.ui-dialog .ui-dialog-buttonpane { text-align: left; border-width: 1px 0 0 0; background-image: none; margin: .5em 0 0 0; padding: .3em 1em .5em .4em; } -.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset { float: right; } -.ui-dialog .ui-dialog-buttonpane button { margin: .5em .4em .5em 0; cursor: pointer; } -.ui-dialog .ui-resizable-se { width: 14px; height: 14px; right: 3px; bottom: 3px; } -.ui-draggable .ui-dialog-titlebar { cursor: move; } -/* - * jQuery UI Menu 1.9pre - * - * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) - * Dual licensed under the MIT or GPL Version 2 licenses. - * http://jquery.org/license - * - * http://docs.jquery.com/UI/Menu#theming - */ -.ui-menu { list-style:none; padding: 2px; margin: 0; display:block; outline: none; } -.ui-menu .ui-menu { margin-top: -3px; position: absolute; } -.ui-menu .ui-menu-item { margin: 0; padding: 0; zoom: 1; width: 100%; } -.ui-menu .ui-menu-item a { text-decoration: none; display: block; padding: 2px .4em; line-height: 1.5; zoom: 1; font-weight: normal; } -.ui-menu .ui-menu-item a.ui-state-focus, -.ui-menu .ui-menu-item a.ui-state-active { font-weight: normal; margin: -1px; } - -.ui-menu li.ui-state-disabled { font-weight: normal; padding: .0em .4em; margin: .4em 0 .2em; line-height: 1.5; } - -/* icon support */ -.ui-menu-icons { position: relative; } -.ui-menu-icons .ui-menu-item a { position: relative; padding-left: 2em; } - -/* left-aligned */ -.ui-menu .ui-icon { position: absolute; top: .2em; left: .2em; } - -/* right-aligned */ -.ui-menu .ui-menu-icon { position: static; float: right; } -/* - * jQuery UI Menubar 1.9pre - * - * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) - * Dual licensed under the MIT or GPL Version 2 licenses. - * http://jquery.org/license - */ -.ui-menubar { list-style: none; margin: 0; padding-left: 0; } - -.ui-menubar-item { float: left; } - -.ui-menubar .ui-button { float: left; font-weight: normal; border-top-width: 0 !important; border-bottom-width: 0 !important; margin: 0; outline: none; } -.ui-menubar .ui-menubar-link { border-right: 1px dashed transparent; border-left: 1px dashed transparent; } - -.ui-menubar .ui-menu { width: 200px; position: absolute; z-index: 9999; } -/* - * jQuery UI Progressbar 1.9pre - * - * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) - * Dual licensed under the MIT or GPL Version 2 licenses. - * http://jquery.org/license - * - * http://docs.jquery.com/UI/Progressbar#theming - */ -.ui-progressbar { height:2em; text-align: left; overflow: hidden; } -.ui-progressbar .ui-progressbar-value {margin: -1px; height:100%; }/* - * jQuery UI Resizable 1.9pre - * - * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) - * Dual licensed under the MIT or GPL Version 2 licenses. - * http://jquery.org/license - * - * http://docs.jquery.com/UI/Resizable#theming - */ -.ui-resizable { position: relative;} -.ui-resizable-handle { position: absolute;font-size: 0.1px;z-index: 99999; display: block; } -.ui-resizable-disabled .ui-resizable-handle, .ui-resizable-autohide .ui-resizable-handle { display: none; } -.ui-resizable-n { cursor: n-resize; height: 7px; width: 100%; top: -5px; left: 0; } -.ui-resizable-s { cursor: s-resize; height: 7px; width: 100%; bottom: -5px; left: 0; } -.ui-resizable-e { cursor: e-resize; width: 7px; right: -5px; top: 0; height: 100%; } -.ui-resizable-w { cursor: w-resize; width: 7px; left: -5px; top: 0; height: 100%; } -.ui-resizable-se { cursor: se-resize; width: 12px; height: 12px; right: 1px; bottom: 1px; } -.ui-resizable-sw { cursor: sw-resize; width: 9px; height: 9px; left: -5px; bottom: -5px; } -.ui-resizable-nw { cursor: nw-resize; width: 9px; height: 9px; left: -5px; top: -5px; } -.ui-resizable-ne { cursor: ne-resize; width: 9px; height: 9px; right: -5px; top: -5px;}/* - * jQuery UI Selectable 1.9pre - * - * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) - * Dual licensed under the MIT or GPL Version 2 licenses. - * http://jquery.org/license - * - * http://docs.jquery.com/UI/Selectable#theming - */ -.ui-selectable-helper { position: absolute; z-index: 100; border:1px dotted black; } -/* - * jQuery UI Slider 1.9pre - * - * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) - * Dual licensed under the MIT or GPL Version 2 licenses. - * http://jquery.org/license - * - * http://docs.jquery.com/UI/Slider#theming - */ -.ui-slider { position: relative; text-align: left; } -.ui-slider .ui-slider-handle { position: absolute; z-index: 2; width: 1.2em; height: 1.2em; cursor: default; } -.ui-slider .ui-slider-range { position: absolute; z-index: 1; font-size: .7em; display: block; border: 0; background-position: 0 0; } - -.ui-slider-horizontal { height: .8em; } -.ui-slider-horizontal .ui-slider-handle { top: -.3em; margin-left: -.6em; } -.ui-slider-horizontal .ui-slider-range { top: 0; height: 100%; } -.ui-slider-horizontal .ui-slider-range-min { left: 0; } -.ui-slider-horizontal .ui-slider-range-max { right: 0; } - -.ui-slider-vertical { width: .8em; height: 100px; } -.ui-slider-vertical .ui-slider-handle { left: -.3em; margin-left: 0; margin-bottom: -.6em; } -.ui-slider-vertical .ui-slider-range { left: 0; width: 100%; } -.ui-slider-vertical .ui-slider-range-min { bottom: 0; } -.ui-slider-vertical .ui-slider-range-max { top: 0; }/* - * jQuery UI Spinner 1.9pre - * - * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) - * Dual licensed under the MIT or GPL Version 2 licenses. - * http://jquery.org/license - * - * http://docs.jquery.com/UI/Spinner#theming - */ -.ui-spinner { position:relative; display: inline-block; overflow: hidden; padding: 0; vertical-align: middle; } -.ui-spinner-input { border: none; background: none; padding: 0; margin: .2em 0; vertical-align: middle; margin-left: .4em; margin-right: 22px; } -.ui-spinner-button { width: 16px; height: 50%; font-size: .5em; padding: 0; margin: 0; z-index: 100; text-align: center; vertical-align: middle; position: absolute; cursor: default; display: block; overflow: hidden; right: 0; } -.ui-spinner a.ui-spinner-button { border-top: none; border-bottom: none; border-right: none; } /* more specificity required here to overide default borders */ -.ui-spinner .ui-icon { position: absolute; margin-top: -8px; top: 50%; left: 0; } /* vertical centre icon */ -.ui-spinner-up { top: 0; } -.ui-spinner-down { bottom: 0; } - -/* TR overrides */ -span.ui-spinner { background: none; } -.ui-spinner .ui-icon-triangle-1-s { - /* need to fix icons sprite */ - background-position:-65px -16px; -} -/* - * jQuery UI Tabs 1.9pre - * - * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) - * Dual licensed under the MIT or GPL Version 2 licenses. - * http://jquery.org/license - * - * http://docs.jquery.com/UI/Tabs#theming - */ -.ui-tabs { position: relative; padding: .2em; zoom: 1; } /* position: relative prevents IE scroll bug (element with position: relative inside container with overflow: auto appear as "fixed") */ -.ui-tabs .ui-tabs-nav { margin: 0; padding: .2em .2em 0; } -.ui-tabs .ui-tabs-nav li { list-style: none; float: left; position: relative; top: 0; margin: 1px .2em 0 0; border-bottom: 0 !important; padding: 0; white-space: nowrap; } -.ui-tabs .ui-tabs-nav li a { float: left; padding: .5em 1em; text-decoration: none; } -.ui-tabs .ui-tabs-nav li.ui-tabs-active { margin-bottom: -1px; padding-bottom: 1px; } -.ui-tabs .ui-tabs-nav li.ui-tabs-active a, .ui-tabs .ui-tabs-nav li.ui-state-disabled a, .ui-tabs .ui-tabs-nav li.ui-tabs-loading a { cursor: text; } -.ui-tabs .ui-tabs-nav li a, .ui-tabs.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active a { cursor: pointer; } /* first selector in group seems obsolete, but required to overcome bug in Opera applying cursor: text overall if defined elsewhere... */ -.ui-tabs .ui-tabs-panel { display: block; border-width: 0; padding: 1em 1.4em; background: none; } -/* - * jQuery UI Tooltip 1.9pre - * - * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) - * Dual licensed under the MIT or GPL Version 2 licenses. - * http://jquery.org/license - * - * http://docs.jquery.com/UI/Tooltip#theming - */ -.ui-tooltip { - padding:8px; - position:absolute; - z-index:9999; - -o-box-shadow: 0 0 5px #aaa; - -moz-box-shadow: 0 0 5px #aaa; - -webkit-box-shadow: 0 0 5px #aaa; - box-shadow: 0 0 5px #aaa; -} -/* Fades and background-images don't work well together in IE6, drop the image */ -* html .ui-tooltip { - background-image: none; -} -body .ui-tooltip { border-width:2px; } -/* - * jQuery UI CSS Framework 1.9pre - * - * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) - * Dual licensed under the MIT or GPL Version 2 licenses. - * http://jquery.org/license - * - * http://docs.jquery.com/UI/Theming/API - * - * To view and modify this theme, visit http://jqueryui.com/themeroller/ - */ - - -/* Component containers -----------------------------------*/ -.ui-widget { font-family: Verdana,Arial,sans-serif/*{ffDefault}*/; font-size: 1.1em/*{fsDefault}*/; } -.ui-widget .ui-widget { font-size: 1em; } -.ui-widget input, .ui-widget select, .ui-widget textarea, .ui-widget button { font-family: Verdana,Arial,sans-serif/*{ffDefault}*/; font-size: 1em; } -.ui-widget-content { border: 1px solid #aaaaaa/*{borderColorContent}*/; background: #ffffff/*{bgColorContent}*/ url(images/ui-bg_flat_75_ffffff_40x100.png)/*{bgImgUrlContent}*/ 50%/*{bgContentXPos}*/ 50%/*{bgContentYPos}*/ repeat-x/*{bgContentRepeat}*/; color: #222222/*{fcContent}*/; } -.ui-widget-content a { color: #222222/*{fcContent}*/; } -.ui-widget-header { border: 1px solid #aaaaaa/*{borderColorHeader}*/; background: #cccccc/*{bgColorHeader}*/ url(images/ui-bg_highlight-soft_75_cccccc_1x100.png)/*{bgImgUrlHeader}*/ 50%/*{bgHeaderXPos}*/ 50%/*{bgHeaderYPos}*/ repeat-x/*{bgHeaderRepeat}*/; color: #222222/*{fcHeader}*/; font-weight: bold; } -.ui-widget-header a { color: #222222/*{fcHeader}*/; } - -/* Interaction states -----------------------------------*/ -.ui-state-default, .ui-widget-content .ui-state-default, .ui-widget-header .ui-state-default { border: 1px solid #d3d3d3/*{borderColorDefault}*/; background: #e6e6e6/*{bgColorDefault}*/ url(images/ui-bg_glass_75_e6e6e6_1x400.png)/*{bgImgUrlDefault}*/ 50%/*{bgDefaultXPos}*/ 50%/*{bgDefaultYPos}*/ repeat-x/*{bgDefaultRepeat}*/; font-weight: normal/*{fwDefault}*/; color: #555555/*{fcDefault}*/; } -.ui-state-default a, .ui-state-default a:link, .ui-state-default a:visited { color: #555555/*{fcDefault}*/; text-decoration: none; } -.ui-state-hover, .ui-widget-content .ui-state-hover, .ui-widget-header .ui-state-hover, .ui-state-focus, .ui-widget-content .ui-state-focus, .ui-widget-header .ui-state-focus { border: 1px solid #999999/*{borderColorHover}*/; background: #dadada/*{bgColorHover}*/ url(images/ui-bg_glass_75_dadada_1x400.png)/*{bgImgUrlHover}*/ 50%/*{bgHoverXPos}*/ 50%/*{bgHoverYPos}*/ repeat-x/*{bgHoverRepeat}*/; font-weight: normal/*{fwDefault}*/; color: #212121/*{fcHover}*/; } -.ui-state-hover a, .ui-state-hover a:hover { color: #212121/*{fcHover}*/; text-decoration: none; } -.ui-state-active, .ui-widget-content .ui-state-active, .ui-widget-header .ui-state-active { border: 1px solid #aaaaaa/*{borderColorActive}*/; background: #ffffff/*{bgColorActive}*/ url(images/ui-bg_glass_65_ffffff_1x400.png)/*{bgImgUrlActive}*/ 50%/*{bgActiveXPos}*/ 50%/*{bgActiveYPos}*/ repeat-x/*{bgActiveRepeat}*/; font-weight: normal/*{fwDefault}*/; color: #212121/*{fcActive}*/; } -.ui-state-active a, .ui-state-active a:link, .ui-state-active a:visited { color: #212121/*{fcActive}*/; text-decoration: none; } -.ui-widget :active { outline: none; } - -/* Interaction Cues -----------------------------------*/ -.ui-state-highlight, .ui-widget-content .ui-state-highlight, .ui-widget-header .ui-state-highlight {border: 1px solid #fcefa1/*{borderColorHighlight}*/; background: #fbf9ee/*{bgColorHighlight}*/ url(images/ui-bg_glass_55_fbf9ee_1x400.png)/*{bgImgUrlHighlight}*/ 50%/*{bgHighlightXPos}*/ 50%/*{bgHighlightYPos}*/ repeat-x/*{bgHighlightRepeat}*/; color: #363636/*{fcHighlight}*/; } -.ui-state-highlight a, .ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a { color: #363636/*{fcHighlight}*/; } -.ui-state-error, .ui-widget-content .ui-state-error, .ui-widget-header .ui-state-error {border: 1px solid #cd0a0a/*{borderColorError}*/; background: #fef1ec/*{bgColorError}*/ url(images/ui-bg_glass_95_fef1ec_1x400.png)/*{bgImgUrlError}*/ 50%/*{bgErrorXPos}*/ 50%/*{bgErrorYPos}*/ repeat-x/*{bgErrorRepeat}*/; color: #cd0a0a/*{fcError}*/; } -.ui-state-error a, .ui-widget-content .ui-state-error a, .ui-widget-header .ui-state-error a { color: #cd0a0a/*{fcError}*/; } -.ui-state-error-text, .ui-widget-content .ui-state-error-text, .ui-widget-header .ui-state-error-text { color: #cd0a0a/*{fcError}*/; } -.ui-priority-primary, .ui-widget-content .ui-priority-primary, .ui-widget-header .ui-priority-primary { font-weight: bold; } -.ui-priority-secondary, .ui-widget-content .ui-priority-secondary, .ui-widget-header .ui-priority-secondary { opacity: .7; filter:Alpha(Opacity=70); font-weight: normal; } -.ui-state-disabled, .ui-widget-content .ui-state-disabled, .ui-widget-header .ui-state-disabled { opacity: .35; filter:Alpha(Opacity=35); background-image: none; } - -/* Icons -----------------------------------*/ - -/* states and images */ -.ui-icon { width: 16px; height: 16px; background-image: url(images/ui-icons_222222_256x240.png)/*{iconsContent}*/; } -.ui-widget-content .ui-icon {background-image: url(images/ui-icons_222222_256x240.png)/*{iconsContent}*/; } -.ui-widget-header .ui-icon {background-image: url(images/ui-icons_222222_256x240.png)/*{iconsHeader}*/; } -.ui-state-default .ui-icon { background-image: url(images/ui-icons_888888_256x240.png)/*{iconsDefault}*/; } -.ui-state-hover .ui-icon, .ui-state-focus .ui-icon {background-image: url(images/ui-icons_454545_256x240.png)/*{iconsHover}*/; } -.ui-state-active .ui-icon {background-image: url(images/ui-icons_454545_256x240.png)/*{iconsActive}*/; } -.ui-state-highlight .ui-icon {background-image: url(images/ui-icons_2e83ff_256x240.png)/*{iconsHighlight}*/; } -.ui-state-error .ui-icon, .ui-state-error-text .ui-icon {background-image: url(images/ui-icons_cd0a0a_256x240.png)/*{iconsError}*/; } - -/* positioning */ -.ui-icon-carat-1-n { background-position: 0 0; } -.ui-icon-carat-1-ne { background-position: -16px 0; } -.ui-icon-carat-1-e { background-position: -32px 0; } -.ui-icon-carat-1-se { background-position: -48px 0; } -.ui-icon-carat-1-s { background-position: -64px 0; } -.ui-icon-carat-1-sw { background-position: -80px 0; } -.ui-icon-carat-1-w { background-position: -96px 0; } -.ui-icon-carat-1-nw { background-position: -112px 0; } -.ui-icon-carat-2-n-s { background-position: -128px 0; } -.ui-icon-carat-2-e-w { background-position: -144px 0; } -.ui-icon-triangle-1-n { background-position: 0 -16px; } -.ui-icon-triangle-1-ne { background-position: -16px -16px; } -.ui-icon-triangle-1-e { background-position: -32px -16px; } -.ui-icon-triangle-1-se { background-position: -48px -16px; } -.ui-icon-triangle-1-s { background-position: -64px -16px; } -.ui-icon-triangle-1-sw { background-position: -80px -16px; } -.ui-icon-triangle-1-w { background-position: -96px -16px; } -.ui-icon-triangle-1-nw { background-position: -112px -16px; } -.ui-icon-triangle-2-n-s { background-position: -128px -16px; } -.ui-icon-triangle-2-e-w { background-position: -144px -16px; } -.ui-icon-arrow-1-n { background-position: 0 -32px; } -.ui-icon-arrow-1-ne { background-position: -16px -32px; } -.ui-icon-arrow-1-e { background-position: -32px -32px; } -.ui-icon-arrow-1-se { background-position: -48px -32px; } -.ui-icon-arrow-1-s { background-position: -64px -32px; } -.ui-icon-arrow-1-sw { background-position: -80px -32px; } -.ui-icon-arrow-1-w { background-position: -96px -32px; } -.ui-icon-arrow-1-nw { background-position: -112px -32px; } -.ui-icon-arrow-2-n-s { background-position: -128px -32px; } -.ui-icon-arrow-2-ne-sw { background-position: -144px -32px; } -.ui-icon-arrow-2-e-w { background-position: -160px -32px; } -.ui-icon-arrow-2-se-nw { background-position: -176px -32px; } -.ui-icon-arrowstop-1-n { background-position: -192px -32px; } -.ui-icon-arrowstop-1-e { background-position: -208px -32px; } -.ui-icon-arrowstop-1-s { background-position: -224px -32px; } -.ui-icon-arrowstop-1-w { background-position: -240px -32px; } -.ui-icon-arrowthick-1-n { background-position: 0 -48px; } -.ui-icon-arrowthick-1-ne { background-position: -16px -48px; } -.ui-icon-arrowthick-1-e { background-position: -32px -48px; } -.ui-icon-arrowthick-1-se { background-position: -48px -48px; } -.ui-icon-arrowthick-1-s { background-position: -64px -48px; } -.ui-icon-arrowthick-1-sw { background-position: -80px -48px; } -.ui-icon-arrowthick-1-w { background-position: -96px -48px; } -.ui-icon-arrowthick-1-nw { background-position: -112px -48px; } -.ui-icon-arrowthick-2-n-s { background-position: -128px -48px; } -.ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; } -.ui-icon-arrowthick-2-e-w { background-position: -160px -48px; } -.ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; } -.ui-icon-arrowthickstop-1-n { background-position: -192px -48px; } -.ui-icon-arrowthickstop-1-e { background-position: -208px -48px; } -.ui-icon-arrowthickstop-1-s { background-position: -224px -48px; } -.ui-icon-arrowthickstop-1-w { background-position: -240px -48px; } -.ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; } -.ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; } -.ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; } -.ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; } -.ui-icon-arrowreturn-1-w { background-position: -64px -64px; } -.ui-icon-arrowreturn-1-n { background-position: -80px -64px; } -.ui-icon-arrowreturn-1-e { background-position: -96px -64px; } -.ui-icon-arrowreturn-1-s { background-position: -112px -64px; } -.ui-icon-arrowrefresh-1-w { background-position: -128px -64px; } -.ui-icon-arrowrefresh-1-n { background-position: -144px -64px; } -.ui-icon-arrowrefresh-1-e { background-position: -160px -64px; } -.ui-icon-arrowrefresh-1-s { background-position: -176px -64px; } -.ui-icon-arrow-4 { background-position: 0 -80px; } -.ui-icon-arrow-4-diag { background-position: -16px -80px; } -.ui-icon-extlink { background-position: -32px -80px; } -.ui-icon-newwin { background-position: -48px -80px; } -.ui-icon-refresh { background-position: -64px -80px; } -.ui-icon-shuffle { background-position: -80px -80px; } -.ui-icon-transfer-e-w { background-position: -96px -80px; } -.ui-icon-transferthick-e-w { background-position: -112px -80px; } -.ui-icon-folder-collapsed { background-position: 0 -96px; } -.ui-icon-folder-open { background-position: -16px -96px; } -.ui-icon-document { background-position: -32px -96px; } -.ui-icon-document-b { background-position: -48px -96px; } -.ui-icon-note { background-position: -64px -96px; } -.ui-icon-mail-closed { background-position: -80px -96px; } -.ui-icon-mail-open { background-position: -96px -96px; } -.ui-icon-suitcase { background-position: -112px -96px; } -.ui-icon-comment { background-position: -128px -96px; } -.ui-icon-person { background-position: -144px -96px; } -.ui-icon-print { background-position: -160px -96px; } -.ui-icon-trash { background-position: -176px -96px; } -.ui-icon-locked { background-position: -192px -96px; } -.ui-icon-unlocked { background-position: -208px -96px; } -.ui-icon-bookmark { background-position: -224px -96px; } -.ui-icon-tag { background-position: -240px -96px; } -.ui-icon-home { background-position: 0 -112px; } -.ui-icon-flag { background-position: -16px -112px; } -.ui-icon-calendar { background-position: -32px -112px; } -.ui-icon-cart { background-position: -48px -112px; } -.ui-icon-pencil { background-position: -64px -112px; } -.ui-icon-clock { background-position: -80px -112px; } -.ui-icon-disk { background-position: -96px -112px; } -.ui-icon-calculator { background-position: -112px -112px; } -.ui-icon-zoomin { background-position: -128px -112px; } -.ui-icon-zoomout { background-position: -144px -112px; } -.ui-icon-search { background-position: -160px -112px; } -.ui-icon-wrench { background-position: -176px -112px; } -.ui-icon-gear { background-position: -192px -112px; } -.ui-icon-heart { background-position: -208px -112px; } -.ui-icon-star { background-position: -224px -112px; } -.ui-icon-link { background-position: -240px -112px; } -.ui-icon-cancel { background-position: 0 -128px; } -.ui-icon-plus { background-position: -16px -128px; } -.ui-icon-plusthick { background-position: -32px -128px; } -.ui-icon-minus { background-position: -48px -128px; } -.ui-icon-minusthick { background-position: -64px -128px; } -.ui-icon-close { background-position: -80px -128px; } -.ui-icon-closethick { background-position: -96px -128px; } -.ui-icon-key { background-position: -112px -128px; } -.ui-icon-lightbulb { background-position: -128px -128px; } -.ui-icon-scissors { background-position: -144px -128px; } -.ui-icon-clipboard { background-position: -160px -128px; } -.ui-icon-copy { background-position: -176px -128px; } -.ui-icon-contact { background-position: -192px -128px; } -.ui-icon-image { background-position: -208px -128px; } -.ui-icon-video { background-position: -224px -128px; } -.ui-icon-script { background-position: -240px -128px; } -.ui-icon-alert { background-position: 0 -144px; } -.ui-icon-info { background-position: -16px -144px; } -.ui-icon-notice { background-position: -32px -144px; } -.ui-icon-help { background-position: -48px -144px; } -.ui-icon-check { background-position: -64px -144px; } -.ui-icon-bullet { background-position: -80px -144px; } -.ui-icon-radio-on { background-position: -96px -144px; } -.ui-icon-radio-off { background-position: -112px -144px; } -.ui-icon-pin-w { background-position: -128px -144px; } -.ui-icon-pin-s { background-position: -144px -144px; } -.ui-icon-play { background-position: 0 -160px; } -.ui-icon-pause { background-position: -16px -160px; } -.ui-icon-seek-next { background-position: -32px -160px; } -.ui-icon-seek-prev { background-position: -48px -160px; } -.ui-icon-seek-end { background-position: -64px -160px; } -.ui-icon-seek-start { background-position: -80px -160px; } -/* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */ -.ui-icon-seek-first { background-position: -80px -160px; } -.ui-icon-stop { background-position: -96px -160px; } -.ui-icon-eject { background-position: -112px -160px; } -.ui-icon-volume-off { background-position: -128px -160px; } -.ui-icon-volume-on { background-position: -144px -160px; } -.ui-icon-power { background-position: 0 -176px; } -.ui-icon-signal-diag { background-position: -16px -176px; } -.ui-icon-signal { background-position: -32px -176px; } -.ui-icon-battery-0 { background-position: -48px -176px; } -.ui-icon-battery-1 { background-position: -64px -176px; } -.ui-icon-battery-2 { background-position: -80px -176px; } -.ui-icon-battery-3 { background-position: -96px -176px; } -.ui-icon-circle-plus { background-position: 0 -192px; } -.ui-icon-circle-minus { background-position: -16px -192px; } -.ui-icon-circle-close { background-position: -32px -192px; } -.ui-icon-circle-triangle-e { background-position: -48px -192px; } -.ui-icon-circle-triangle-s { background-position: -64px -192px; } -.ui-icon-circle-triangle-w { background-position: -80px -192px; } -.ui-icon-circle-triangle-n { background-position: -96px -192px; } -.ui-icon-circle-arrow-e { background-position: -112px -192px; } -.ui-icon-circle-arrow-s { background-position: -128px -192px; } -.ui-icon-circle-arrow-w { background-position: -144px -192px; } -.ui-icon-circle-arrow-n { background-position: -160px -192px; } -.ui-icon-circle-zoomin { background-position: -176px -192px; } -.ui-icon-circle-zoomout { background-position: -192px -192px; } -.ui-icon-circle-check { background-position: -208px -192px; } -.ui-icon-circlesmall-plus { background-position: 0 -208px; } -.ui-icon-circlesmall-minus { background-position: -16px -208px; } -.ui-icon-circlesmall-close { background-position: -32px -208px; } -.ui-icon-squaresmall-plus { background-position: -48px -208px; } -.ui-icon-squaresmall-minus { background-position: -64px -208px; } -.ui-icon-squaresmall-close { background-position: -80px -208px; } -.ui-icon-grip-dotted-vertical { background-position: 0 -224px; } -.ui-icon-grip-dotted-horizontal { background-position: -16px -224px; } -.ui-icon-grip-solid-vertical { background-position: -32px -224px; } -.ui-icon-grip-solid-horizontal { background-position: -48px -224px; } -.ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; } -.ui-icon-grip-diagonal-se { background-position: -80px -224px; } - - -/* Misc visuals -----------------------------------*/ - -/* Corner radius */ -.ui-corner-all, .ui-corner-top, .ui-corner-left, .ui-corner-tl { -moz-border-radius-topleft: 4px/*{cornerRadius}*/; -webkit-border-top-left-radius: 4px/*{cornerRadius}*/; -khtml-border-top-left-radius: 4px/*{cornerRadius}*/; border-top-left-radius: 4px/*{cornerRadius}*/; } -.ui-corner-all, .ui-corner-top, .ui-corner-right, .ui-corner-tr { -moz-border-radius-topright: 4px/*{cornerRadius}*/; -webkit-border-top-right-radius: 4px/*{cornerRadius}*/; -khtml-border-top-right-radius: 4px/*{cornerRadius}*/; border-top-right-radius: 4px/*{cornerRadius}*/; } -.ui-corner-all, .ui-corner-bottom, .ui-corner-left, .ui-corner-bl { -moz-border-radius-bottomleft: 4px/*{cornerRadius}*/; -webkit-border-bottom-left-radius: 4px/*{cornerRadius}*/; -khtml-border-bottom-left-radius: 4px/*{cornerRadius}*/; border-bottom-left-radius: 4px/*{cornerRadius}*/; } -.ui-corner-all, .ui-corner-bottom, .ui-corner-right, .ui-corner-br { -moz-border-radius-bottomright: 4px/*{cornerRadius}*/; -webkit-border-bottom-right-radius: 4px/*{cornerRadius}*/; -khtml-border-bottom-right-radius: 4px/*{cornerRadius}*/; border-bottom-right-radius: 4px/*{cornerRadius}*/; } - -/* Overlays */ -.ui-widget-overlay { background: #aaaaaa/*{bgColorOverlay}*/ url(images/ui-bg_flat_0_aaaaaa_40x100.png)/*{bgImgUrlOverlay}*/ 50%/*{bgOverlayXPos}*/ 50%/*{bgOverlayYPos}*/ repeat-x/*{bgOverlayRepeat}*/; opacity: .3;filter:Alpha(Opacity=30)/*{opacityOverlay}*/; } -.ui-widget-shadow { margin: -8px/*{offsetTopShadow}*/ 0 0 -8px/*{offsetLeftShadow}*/; padding: 8px/*{thicknessShadow}*/; background: #aaaaaa/*{bgColorShadow}*/ url(images/ui-bg_flat_0_aaaaaa_40x100.png)/*{bgImgUrlShadow}*/ 50%/*{bgShadowXPos}*/ 50%/*{bgShadowYPos}*/ repeat-x/*{bgShadowRepeat}*/; opacity: .3;filter:Alpha(Opacity=30)/*{opacityShadow}*/; -moz-border-radius: 8px/*{cornerRadiusShadow}*/; -khtml-border-radius: 8px/*{cornerRadiusShadow}*/; -webkit-border-radius: 8px/*{cornerRadiusShadow}*/; border-radius: 8px/*{cornerRadiusShadow}*/; } \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/examples/jquery-ui/css/ui-lightness/jquery-ui.min.css b/libreplan-webapp/src/main/webapp/jqplot/examples/jquery-ui/css/ui-lightness/jquery-ui.min.css deleted file mode 100644 index 56a9be11a..000000000 --- a/libreplan-webapp/src/main/webapp/jqplot/examples/jquery-ui/css/ui-lightness/jquery-ui.min.css +++ /dev/null @@ -1,10 +0,0 @@ -/* - * jQuery UI CSS Framework 1.9pre - * - * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) - * Dual licensed under the MIT or GPL Version 2 licenses. - * http://jquery.org/license - * - * http://docs.jquery.com/UI/Theming/API - */ -.ui-helper-hidden{display:none;}.ui-helper-hidden-accessible{position:absolute!important;clip:rect(1px 1px 1px 1px);clip:rect(1px,1px,1px,1px);}.ui-helper-reset{margin:0;padding:0;border:0;outline:0;line-height:1.3;text-decoration:none;font-size:100%;list-style:none;}.ui-helper-clearfix:after{content:".";display:block;height:0;clear:both;visibility:hidden;}.ui-helper-clearfix{display:inline-block;}/* required comment for clearfix to work in Opera \*/ * html .ui-helper-clearfix{height:1%;}.ui-helper-clearfix{display:block;}/* end clearfix */ .ui-helper-zfix{width:100%;height:100%;top:0;left:0;position:absolute;opacity:0;filter:Alpha(Opacity=0);}.ui-state-disabled{cursor:default!important;}.ui-icon{display:block;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat;}.ui-widget-overlay{position:absolute;top:0;left:0;width:100%;height:100%;}.ui-accordion{width:100%;}.ui-accordion .ui-accordion-header{cursor:pointer;position:relative;margin-top:1px;zoom:1;}.ui-accordion .ui-accordion-header-active{border-bottom:0!important;}.ui-accordion .ui-accordion-heading{display:block;font-size:1em;padding:.5em .5em .5em .7em;}.ui-accordion-icons .ui-accordion-heading{padding-left:2.2em;}.ui-accordion .ui-accordion-header .ui-accordion-header-icon{position:absolute;left:.5em;top:50%;margin-top:-8px;}.ui-accordion .ui-accordion-content{padding:1em 2.2em;border-top:0;margin-top:-2px;position:relative;top:1px;margin-bottom:2px;overflow:auto;display:none;zoom:1;}.ui-accordion .ui-accordion-content-active{display:block;}.ui-autocomplete{position:absolute;cursor:default;}* html .ui-autocomplete{width:1px;}.ui-button{display:inline-block;position:relative;padding:0;margin-right:.1em;text-decoration:none!important;cursor:pointer;text-align:center;zoom:1;overflow:visible;}.ui-button-icon-only{width:2.2em;}button.ui-button-icon-only{width:2.4em;}.ui-button-icons-only{width:3.4em;}button.ui-button-icons-only{width:3.7em;}.ui-button .ui-button-text{display:block;line-height:1.4;}.ui-button-text-only .ui-button-text{padding:.4em 1em;}.ui-button-icon-only .ui-button-text,.ui-button-icons-only .ui-button-text{padding:.4em;text-indent:-9999999px;}.ui-button-text-icon-primary .ui-button-text,.ui-button-text-icons .ui-button-text{padding:.4em 1em .4em 2.1em;}.ui-button-text-icon-secondary .ui-button-text,.ui-button-text-icons .ui-button-text{padding:.4em 2.1em .4em 1em;}.ui-button-text-icons .ui-button-text{padding-left:2.1em;padding-right:2.1em;}input.ui-button{padding:.4em 1em;}.ui-button-icon-only .ui-icon,.ui-button-text-icon-primary .ui-icon,.ui-button-text-icon-secondary .ui-icon,.ui-button-text-icons .ui-icon,.ui-button-icons-only .ui-icon{position:absolute;top:50%;margin-top:-8px;}.ui-button-icon-only .ui-icon{left:50%;margin-left:-8px;}.ui-button-text-icon-primary .ui-button-icon-primary,.ui-button-text-icons .ui-button-icon-primary,.ui-button-icons-only .ui-button-icon-primary{left:.5em;}.ui-button-text-icon-secondary .ui-button-icon-secondary,.ui-button-text-icons .ui-button-icon-secondary,.ui-button-icons-only .ui-button-icon-secondary{right:.5em;}.ui-button-text-icons .ui-button-icon-secondary,.ui-button-icons-only .ui-button-icon-secondary{right:.5em;}.ui-buttonset{margin-right:7px;}.ui-buttonset .ui-button{margin-left:0;margin-right:-.3em;}button.ui-button::-moz-focus-inner{border:0;padding:0;}.ui-datepicker{width:17em;padding:.2em .2em 0;display:none;}.ui-datepicker .ui-datepicker-header{position:relative;padding:.2em 0;}.ui-datepicker .ui-datepicker-prev,.ui-datepicker .ui-datepicker-next{position:absolute;top:2px;width:1.8em;height:1.8em;}.ui-datepicker .ui-datepicker-prev-hover,.ui-datepicker .ui-datepicker-next-hover{top:1px;}.ui-datepicker .ui-datepicker-prev{left:2px;}.ui-datepicker .ui-datepicker-next{right:2px;}.ui-datepicker .ui-datepicker-prev-hover{left:1px;}.ui-datepicker .ui-datepicker-next-hover{right:1px;}.ui-datepicker .ui-datepicker-prev span,.ui-datepicker .ui-datepicker-next span{display:block;position:absolute;left:50%;margin-left:-8px;top:50%;margin-top:-8px;}.ui-datepicker .ui-datepicker-title{margin:0 2.3em;line-height:1.8em;text-align:center;}.ui-datepicker .ui-datepicker-title select{font-size:1em;margin:1px 0;}.ui-datepicker select.ui-datepicker-month-year{width:100%;}.ui-datepicker select.ui-datepicker-month,.ui-datepicker select.ui-datepicker-year{width:49%;}.ui-datepicker table{width:100%;font-size:.9em;border-collapse:collapse;margin:0 0 .4em;}.ui-datepicker th{padding:.7em .3em;text-align:center;font-weight:bold;border:0;}.ui-datepicker td{border:0;padding:1px;}.ui-datepicker td span,.ui-datepicker td a{display:block;padding:.2em;text-align:right;text-decoration:none;}.ui-datepicker .ui-datepicker-buttonpane{background-image:none;margin:.7em 0 0 0;padding:0 .2em;border-left:0;border-right:0;border-bottom:0;}.ui-datepicker .ui-datepicker-buttonpane button{float:right;margin:.5em .2em .4em;cursor:pointer;padding:.2em .6em .3em .6em;width:auto;overflow:visible;}.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current{float:left;}.ui-datepicker.ui-datepicker-multi{width:auto;}.ui-datepicker-multi .ui-datepicker-group{float:left;}.ui-datepicker-multi .ui-datepicker-group table{width:95%;margin:0 auto .4em;}.ui-datepicker-multi-2 .ui-datepicker-group{width:50%;}.ui-datepicker-multi-3 .ui-datepicker-group{width:33.3%;}.ui-datepicker-multi-4 .ui-datepicker-group{width:25%;}.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header{border-left-width:0;}.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header{border-left-width:0;}.ui-datepicker-multi .ui-datepicker-buttonpane{clear:left;}.ui-datepicker-row-break{clear:both;width:100%;font-size:0;}.ui-datepicker-rtl{direction:rtl;}.ui-datepicker-rtl .ui-datepicker-prev{right:2px;left:auto;}.ui-datepicker-rtl .ui-datepicker-next{left:2px;right:auto;}.ui-datepicker-rtl .ui-datepicker-prev:hover{right:1px;left:auto;}.ui-datepicker-rtl .ui-datepicker-next:hover{left:1px;right:auto;}.ui-datepicker-rtl .ui-datepicker-buttonpane{clear:right;}.ui-datepicker-rtl .ui-datepicker-buttonpane button{float:left;}.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current{float:right;}.ui-datepicker-rtl .ui-datepicker-group{float:right;}.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header{border-right-width:0;border-left-width:1px;}.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header{border-right-width:0;border-left-width:1px;}.ui-datepicker-cover{display:none;display:block;position:absolute;z-index:-1;filter:mask();top:-4px;left:-4px;width:200px;height:200px;}.ui-dialog{position:absolute;padding:.2em;width:300px;overflow:hidden;}.ui-dialog .ui-dialog-titlebar{padding:.4em 1em;position:relative;}.ui-dialog .ui-dialog-title{float:left;margin:.1em 16px .1em 0;}.ui-dialog .ui-dialog-titlebar-close{position:absolute;right:.3em;top:50%;width:19px;margin:-10px 0 0 0;padding:1px;height:18px;}.ui-dialog .ui-dialog-titlebar-close span{display:block;margin:1px;}.ui-dialog .ui-dialog-titlebar-close:hover,.ui-dialog .ui-dialog-titlebar-close:focus{padding:0;}.ui-dialog .ui-dialog-content{position:relative;border:0;padding:.5em 1em;background:none;overflow:auto;zoom:1;}.ui-dialog .ui-dialog-buttonpane{text-align:left;border-width:1px 0 0 0;background-image:none;margin:.5em 0 0 0;padding:.3em 1em .5em .4em;}.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset{float:right;}.ui-dialog .ui-dialog-buttonpane button{margin:.5em .4em .5em 0;cursor:pointer;}.ui-dialog .ui-resizable-se{width:14px;height:14px;right:3px;bottom:3px;}.ui-draggable .ui-dialog-titlebar{cursor:move;}.ui-menu{list-style:none;padding:2px;margin:0;display:block;outline:none;}.ui-menu .ui-menu{margin-top:-3px;position:absolute;}.ui-menu .ui-menu-item{margin:0;padding:0;zoom:1;width:100%;}.ui-menu .ui-menu-item a{text-decoration:none;display:block;padding:2px .4em;line-height:1.5;zoom:1;font-weight:normal;}.ui-menu .ui-menu-item a.ui-state-focus,.ui-menu .ui-menu-item a.ui-state-active{font-weight:normal;margin:-1px;}.ui-menu li.ui-state-disabled{font-weight:normal;padding:.0em .4em;margin:.4em 0 .2em;line-height:1.5;}.ui-menu-icons{position:relative;}.ui-menu-icons .ui-menu-item a{position:relative;padding-left:2em;}.ui-menu .ui-icon{position:absolute;top:.2em;left:.2em;}.ui-menu .ui-menu-icon{position:static;float:right;}.ui-menubar{list-style:none;margin:0;padding-left:0;}.ui-menubar-item{float:left;}.ui-menubar .ui-button{float:left;font-weight:normal;border-top-width:0!important;border-bottom-width:0!important;margin:0;outline:none;}.ui-menubar .ui-menubar-link{border-right:1px dashed transparent;border-left:1px dashed transparent;}.ui-menubar .ui-menu{width:200px;position:absolute;z-index:9999;}.ui-progressbar{height:2em;text-align:left;overflow:hidden;}.ui-progressbar .ui-progressbar-value{margin:-1px;height:100%;}.ui-resizable{position:relative;}.ui-resizable-handle{position:absolute;font-size:.1px;z-index:99999;display:block;}.ui-resizable-disabled .ui-resizable-handle,.ui-resizable-autohide .ui-resizable-handle{display:none;}.ui-resizable-n{cursor:n-resize;height:7px;width:100%;top:-5px;left:0;}.ui-resizable-s{cursor:s-resize;height:7px;width:100%;bottom:-5px;left:0;}.ui-resizable-e{cursor:e-resize;width:7px;right:-5px;top:0;height:100%;}.ui-resizable-w{cursor:w-resize;width:7px;left:-5px;top:0;height:100%;}.ui-resizable-se{cursor:se-resize;width:12px;height:12px;right:1px;bottom:1px;}.ui-resizable-sw{cursor:sw-resize;width:9px;height:9px;left:-5px;bottom:-5px;}.ui-resizable-nw{cursor:nw-resize;width:9px;height:9px;left:-5px;top:-5px;}.ui-resizable-ne{cursor:ne-resize;width:9px;height:9px;right:-5px;top:-5px;}.ui-selectable-helper{position:absolute;z-index:100;border:1px dotted black;}.ui-slider{position:relative;text-align:left;}.ui-slider .ui-slider-handle{position:absolute;z-index:2;width:1.2em;height:1.2em;cursor:default;}.ui-slider .ui-slider-range{position:absolute;z-index:1;font-size:.7em;display:block;border:0;background-position:0 0;}.ui-slider-horizontal{height:.8em;}.ui-slider-horizontal .ui-slider-handle{top:-.3em;margin-left:-.6em;}.ui-slider-horizontal .ui-slider-range{top:0;height:100%;}.ui-slider-horizontal .ui-slider-range-min{left:0;}.ui-slider-horizontal .ui-slider-range-max{right:0;}.ui-slider-vertical{width:.8em;height:100px;}.ui-slider-vertical .ui-slider-handle{left:-.3em;margin-left:0;margin-bottom:-.6em;}.ui-slider-vertical .ui-slider-range{left:0;width:100%;}.ui-slider-vertical .ui-slider-range-min{bottom:0;}.ui-slider-vertical .ui-slider-range-max{top:0;}.ui-spinner{position:relative;display:inline-block;overflow:hidden;padding:0;vertical-align:middle;}.ui-spinner-input{border:none;background:none;padding:0;margin:.2em 0;vertical-align:middle;margin-left:.4em;margin-right:22px;}.ui-spinner-button{width:16px;height:50%;font-size:.5em;padding:0;margin:0;z-index:100;text-align:center;vertical-align:middle;position:absolute;cursor:default;display:block;overflow:hidden;right:0;}.ui-spinner a.ui-spinner-button{border-top:none;border-bottom:none;border-right:none;}.ui-spinner .ui-icon{position:absolute;margin-top:-8px;top:50%;left:0;}.ui-spinner-up{top:0;}.ui-spinner-down{bottom:0;}span.ui-spinner{background:none;}.ui-spinner .ui-icon-triangle-1-s{background-position:-65px -16px;}.ui-tabs{position:relative;padding:.2em;zoom:1;}.ui-tabs .ui-tabs-nav{margin:0;padding:.2em .2em 0;}.ui-tabs .ui-tabs-nav li{list-style:none;float:left;position:relative;top:0;margin:1px .2em 0 0;border-bottom:0!important;padding:0;white-space:nowrap;}.ui-tabs .ui-tabs-nav li a{float:left;padding:.5em 1em;text-decoration:none;}.ui-tabs .ui-tabs-nav li.ui-tabs-active{margin-bottom:-1px;padding-bottom:1px;}.ui-tabs .ui-tabs-nav li.ui-tabs-active a,.ui-tabs .ui-tabs-nav li.ui-state-disabled a,.ui-tabs .ui-tabs-nav li.ui-tabs-loading a{cursor:text;}.ui-tabs .ui-tabs-nav li a,.ui-tabs.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active a{cursor:pointer;}.ui-tabs .ui-tabs-panel{display:block;border-width:0;padding:1em 1.4em;background:none;}.ui-tooltip{padding:8px;position:absolute;z-index:9999;-o-box-shadow:0 0 5px #aaa;-moz-box-shadow:0 0 5px #aaa;-webkit-box-shadow:0 0 5px #aaa;box-shadow:0 0 5px #aaa;}* html .ui-tooltip{background-image:none;}body .ui-tooltip{border-width:2px;}.ui-widget{font-family:Verdana,Arial,sans-serif;font-size:1.1em;}.ui-widget .ui-widget{font-size:1em;}.ui-widget input,.ui-widget select,.ui-widget textarea,.ui-widget button{font-family:Verdana,Arial,sans-serif;font-size:1em;}.ui-widget-content{border:1px solid #aaa;background:#fff url(images/ui-bg_flat_75_ffffff_40x100.png) 50% 50% repeat-x;color:#222;}.ui-widget-content a{color:#222;}.ui-widget-header{border:1px solid #aaa;background:#ccc url(images/ui-bg_highlight-soft_75_cccccc_1x100.png) 50% 50% repeat-x;color:#222;font-weight:bold;}.ui-widget-header a{color:#222;}.ui-state-default,.ui-widget-content .ui-state-default,.ui-widget-header .ui-state-default{border:1px solid #d3d3d3;background:#e6e6e6 url(images/ui-bg_glass_75_e6e6e6_1x400.png) 50% 50% repeat-x;font-weight:normal;color:#555;}.ui-state-default a,.ui-state-default a:link,.ui-state-default a:visited{color:#555;text-decoration:none;}.ui-state-hover,.ui-widget-content .ui-state-hover,.ui-widget-header .ui-state-hover,.ui-state-focus,.ui-widget-content .ui-state-focus,.ui-widget-header .ui-state-focus{border:1px solid #999;background:#dadada url(images/ui-bg_glass_75_dadada_1x400.png) 50% 50% repeat-x;font-weight:normal;color:#212121;}.ui-state-hover a,.ui-state-hover a:hover{color:#212121;text-decoration:none;}.ui-state-active,.ui-widget-content .ui-state-active,.ui-widget-header .ui-state-active{border:1px solid #aaa;background:#fff url(images/ui-bg_glass_65_ffffff_1x400.png) 50% 50% repeat-x;font-weight:normal;color:#212121;}.ui-state-active a,.ui-state-active a:link,.ui-state-active a:visited{color:#212121;text-decoration:none;}.ui-widget :active{outline:none;}.ui-state-highlight,.ui-widget-content .ui-state-highlight,.ui-widget-header .ui-state-highlight{border:1px solid #fcefa1;background:#fbf9ee url(images/ui-bg_glass_55_fbf9ee_1x400.png) 50% 50% repeat-x;color:#363636;}.ui-state-highlight a,.ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a{color:#363636;}.ui-state-error,.ui-widget-content .ui-state-error,.ui-widget-header .ui-state-error{border:1px solid #cd0a0a;background:#fef1ec url(images/ui-bg_glass_95_fef1ec_1x400.png) 50% 50% repeat-x;color:#cd0a0a;}.ui-state-error a,.ui-widget-content .ui-state-error a,.ui-widget-header .ui-state-error a{color:#cd0a0a;}.ui-state-error-text,.ui-widget-content .ui-state-error-text,.ui-widget-header .ui-state-error-text{color:#cd0a0a;}.ui-priority-primary,.ui-widget-content .ui-priority-primary,.ui-widget-header .ui-priority-primary{font-weight:bold;}.ui-priority-secondary,.ui-widget-content .ui-priority-secondary,.ui-widget-header .ui-priority-secondary{opacity:.7;filter:Alpha(Opacity=70);font-weight:normal;}.ui-state-disabled,.ui-widget-content .ui-state-disabled,.ui-widget-header .ui-state-disabled{opacity:.35;filter:Alpha(Opacity=35);background-image:none;}.ui-icon{width:16px;height:16px;background-image:url(images/ui-icons_222222_256x240.png);}.ui-widget-content .ui-icon{background-image:url(images/ui-icons_222222_256x240.png);}.ui-widget-header .ui-icon{background-image:url(images/ui-icons_222222_256x240.png);}.ui-state-default .ui-icon{background-image:url(images/ui-icons_888888_256x240.png);}.ui-state-hover .ui-icon,.ui-state-focus .ui-icon{background-image:url(images/ui-icons_454545_256x240.png);}.ui-state-active .ui-icon{background-image:url(images/ui-icons_454545_256x240.png);}.ui-state-highlight .ui-icon{background-image:url(images/ui-icons_2e83ff_256x240.png);}.ui-state-error .ui-icon,.ui-state-error-text .ui-icon{background-image:url(images/ui-icons_cd0a0a_256x240.png);}.ui-icon-carat-1-n{background-position:0 0;}.ui-icon-carat-1-ne{background-position:-16px 0;}.ui-icon-carat-1-e{background-position:-32px 0;}.ui-icon-carat-1-se{background-position:-48px 0;}.ui-icon-carat-1-s{background-position:-64px 0;}.ui-icon-carat-1-sw{background-position:-80px 0;}.ui-icon-carat-1-w{background-position:-96px 0;}.ui-icon-carat-1-nw{background-position:-112px 0;}.ui-icon-carat-2-n-s{background-position:-128px 0;}.ui-icon-carat-2-e-w{background-position:-144px 0;}.ui-icon-triangle-1-n{background-position:0 -16px;}.ui-icon-triangle-1-ne{background-position:-16px -16px;}.ui-icon-triangle-1-e{background-position:-32px -16px;}.ui-icon-triangle-1-se{background-position:-48px -16px;}.ui-icon-triangle-1-s{background-position:-64px -16px;}.ui-icon-triangle-1-sw{background-position:-80px -16px;}.ui-icon-triangle-1-w{background-position:-96px -16px;}.ui-icon-triangle-1-nw{background-position:-112px -16px;}.ui-icon-triangle-2-n-s{background-position:-128px -16px;}.ui-icon-triangle-2-e-w{background-position:-144px -16px;}.ui-icon-arrow-1-n{background-position:0 -32px;}.ui-icon-arrow-1-ne{background-position:-16px -32px;}.ui-icon-arrow-1-e{background-position:-32px -32px;}.ui-icon-arrow-1-se{background-position:-48px -32px;}.ui-icon-arrow-1-s{background-position:-64px -32px;}.ui-icon-arrow-1-sw{background-position:-80px -32px;}.ui-icon-arrow-1-w{background-position:-96px -32px;}.ui-icon-arrow-1-nw{background-position:-112px -32px;}.ui-icon-arrow-2-n-s{background-position:-128px -32px;}.ui-icon-arrow-2-ne-sw{background-position:-144px -32px;}.ui-icon-arrow-2-e-w{background-position:-160px -32px;}.ui-icon-arrow-2-se-nw{background-position:-176px -32px;}.ui-icon-arrowstop-1-n{background-position:-192px -32px;}.ui-icon-arrowstop-1-e{background-position:-208px -32px;}.ui-icon-arrowstop-1-s{background-position:-224px -32px;}.ui-icon-arrowstop-1-w{background-position:-240px -32px;}.ui-icon-arrowthick-1-n{background-position:0 -48px;}.ui-icon-arrowthick-1-ne{background-position:-16px -48px;}.ui-icon-arrowthick-1-e{background-position:-32px -48px;}.ui-icon-arrowthick-1-se{background-position:-48px -48px;}.ui-icon-arrowthick-1-s{background-position:-64px -48px;}.ui-icon-arrowthick-1-sw{background-position:-80px -48px;}.ui-icon-arrowthick-1-w{background-position:-96px -48px;}.ui-icon-arrowthick-1-nw{background-position:-112px -48px;}.ui-icon-arrowthick-2-n-s{background-position:-128px -48px;}.ui-icon-arrowthick-2-ne-sw{background-position:-144px -48px;}.ui-icon-arrowthick-2-e-w{background-position:-160px -48px;}.ui-icon-arrowthick-2-se-nw{background-position:-176px -48px;}.ui-icon-arrowthickstop-1-n{background-position:-192px -48px;}.ui-icon-arrowthickstop-1-e{background-position:-208px -48px;}.ui-icon-arrowthickstop-1-s{background-position:-224px -48px;}.ui-icon-arrowthickstop-1-w{background-position:-240px -48px;}.ui-icon-arrowreturnthick-1-w{background-position:0 -64px;}.ui-icon-arrowreturnthick-1-n{background-position:-16px -64px;}.ui-icon-arrowreturnthick-1-e{background-position:-32px -64px;}.ui-icon-arrowreturnthick-1-s{background-position:-48px -64px;}.ui-icon-arrowreturn-1-w{background-position:-64px -64px;}.ui-icon-arrowreturn-1-n{background-position:-80px -64px;}.ui-icon-arrowreturn-1-e{background-position:-96px -64px;}.ui-icon-arrowreturn-1-s{background-position:-112px -64px;}.ui-icon-arrowrefresh-1-w{background-position:-128px -64px;}.ui-icon-arrowrefresh-1-n{background-position:-144px -64px;}.ui-icon-arrowrefresh-1-e{background-position:-160px -64px;}.ui-icon-arrowrefresh-1-s{background-position:-176px -64px;}.ui-icon-arrow-4{background-position:0 -80px;}.ui-icon-arrow-4-diag{background-position:-16px -80px;}.ui-icon-extlink{background-position:-32px -80px;}.ui-icon-newwin{background-position:-48px -80px;}.ui-icon-refresh{background-position:-64px -80px;}.ui-icon-shuffle{background-position:-80px -80px;}.ui-icon-transfer-e-w{background-position:-96px -80px;}.ui-icon-transferthick-e-w{background-position:-112px -80px;}.ui-icon-folder-collapsed{background-position:0 -96px;}.ui-icon-folder-open{background-position:-16px -96px;}.ui-icon-document{background-position:-32px -96px;}.ui-icon-document-b{background-position:-48px -96px;}.ui-icon-note{background-position:-64px -96px;}.ui-icon-mail-closed{background-position:-80px -96px;}.ui-icon-mail-open{background-position:-96px -96px;}.ui-icon-suitcase{background-position:-112px -96px;}.ui-icon-comment{background-position:-128px -96px;}.ui-icon-person{background-position:-144px -96px;}.ui-icon-print{background-position:-160px -96px;}.ui-icon-trash{background-position:-176px -96px;}.ui-icon-locked{background-position:-192px -96px;}.ui-icon-unlocked{background-position:-208px -96px;}.ui-icon-bookmark{background-position:-224px -96px;}.ui-icon-tag{background-position:-240px -96px;}.ui-icon-home{background-position:0 -112px;}.ui-icon-flag{background-position:-16px -112px;}.ui-icon-calendar{background-position:-32px -112px;}.ui-icon-cart{background-position:-48px -112px;}.ui-icon-pencil{background-position:-64px -112px;}.ui-icon-clock{background-position:-80px -112px;}.ui-icon-disk{background-position:-96px -112px;}.ui-icon-calculator{background-position:-112px -112px;}.ui-icon-zoomin{background-position:-128px -112px;}.ui-icon-zoomout{background-position:-144px -112px;}.ui-icon-search{background-position:-160px -112px;}.ui-icon-wrench{background-position:-176px -112px;}.ui-icon-gear{background-position:-192px -112px;}.ui-icon-heart{background-position:-208px -112px;}.ui-icon-star{background-position:-224px -112px;}.ui-icon-link{background-position:-240px -112px;}.ui-icon-cancel{background-position:0 -128px;}.ui-icon-plus{background-position:-16px -128px;}.ui-icon-plusthick{background-position:-32px -128px;}.ui-icon-minus{background-position:-48px -128px;}.ui-icon-minusthick{background-position:-64px -128px;}.ui-icon-close{background-position:-80px -128px;}.ui-icon-closethick{background-position:-96px -128px;}.ui-icon-key{background-position:-112px -128px;}.ui-icon-lightbulb{background-position:-128px -128px;}.ui-icon-scissors{background-position:-144px -128px;}.ui-icon-clipboard{background-position:-160px -128px;}.ui-icon-copy{background-position:-176px -128px;}.ui-icon-contact{background-position:-192px -128px;}.ui-icon-image{background-position:-208px -128px;}.ui-icon-video{background-position:-224px -128px;}.ui-icon-script{background-position:-240px -128px;}.ui-icon-alert{background-position:0 -144px;}.ui-icon-info{background-position:-16px -144px;}.ui-icon-notice{background-position:-32px -144px;}.ui-icon-help{background-position:-48px -144px;}.ui-icon-check{background-position:-64px -144px;}.ui-icon-bullet{background-position:-80px -144px;}.ui-icon-radio-on{background-position:-96px -144px;}.ui-icon-radio-off{background-position:-112px -144px;}.ui-icon-pin-w{background-position:-128px -144px;}.ui-icon-pin-s{background-position:-144px -144px;}.ui-icon-play{background-position:0 -160px;}.ui-icon-pause{background-position:-16px -160px;}.ui-icon-seek-next{background-position:-32px -160px;}.ui-icon-seek-prev{background-position:-48px -160px;}.ui-icon-seek-end{background-position:-64px -160px;}.ui-icon-seek-start{background-position:-80px -160px;}.ui-icon-seek-first{background-position:-80px -160px;}.ui-icon-stop{background-position:-96px -160px;}.ui-icon-eject{background-position:-112px -160px;}.ui-icon-volume-off{background-position:-128px -160px;}.ui-icon-volume-on{background-position:-144px -160px;}.ui-icon-power{background-position:0 -176px;}.ui-icon-signal-diag{background-position:-16px -176px;}.ui-icon-signal{background-position:-32px -176px;}.ui-icon-battery-0{background-position:-48px -176px;}.ui-icon-battery-1{background-position:-64px -176px;}.ui-icon-battery-2{background-position:-80px -176px;}.ui-icon-battery-3{background-position:-96px -176px;}.ui-icon-circle-plus{background-position:0 -192px;}.ui-icon-circle-minus{background-position:-16px -192px;}.ui-icon-circle-close{background-position:-32px -192px;}.ui-icon-circle-triangle-e{background-position:-48px -192px;}.ui-icon-circle-triangle-s{background-position:-64px -192px;}.ui-icon-circle-triangle-w{background-position:-80px -192px;}.ui-icon-circle-triangle-n{background-position:-96px -192px;}.ui-icon-circle-arrow-e{background-position:-112px -192px;}.ui-icon-circle-arrow-s{background-position:-128px -192px;}.ui-icon-circle-arrow-w{background-position:-144px -192px;}.ui-icon-circle-arrow-n{background-position:-160px -192px;}.ui-icon-circle-zoomin{background-position:-176px -192px;}.ui-icon-circle-zoomout{background-position:-192px -192px;}.ui-icon-circle-check{background-position:-208px -192px;}.ui-icon-circlesmall-plus{background-position:0 -208px;}.ui-icon-circlesmall-minus{background-position:-16px -208px;}.ui-icon-circlesmall-close{background-position:-32px -208px;}.ui-icon-squaresmall-plus{background-position:-48px -208px;}.ui-icon-squaresmall-minus{background-position:-64px -208px;}.ui-icon-squaresmall-close{background-position:-80px -208px;}.ui-icon-grip-dotted-vertical{background-position:0 -224px;}.ui-icon-grip-dotted-horizontal{background-position:-16px -224px;}.ui-icon-grip-solid-vertical{background-position:-32px -224px;}.ui-icon-grip-solid-horizontal{background-position:-48px -224px;}.ui-icon-gripsmall-diagonal-se{background-position:-64px -224px;}.ui-icon-grip-diagonal-se{background-position:-80px -224px;}.ui-corner-all,.ui-corner-top,.ui-corner-left,.ui-corner-tl{-moz-border-radius-topleft:4px;-webkit-border-top-left-radius:4px;-khtml-border-top-left-radius:4px;border-top-left-radius:4px;}.ui-corner-all,.ui-corner-top,.ui-corner-right,.ui-corner-tr{-moz-border-radius-topright:4px;-webkit-border-top-right-radius:4px;-khtml-border-top-right-radius:4px;border-top-right-radius:4px;}.ui-corner-all,.ui-corner-bottom,.ui-corner-left,.ui-corner-bl{-moz-border-radius-bottomleft:4px;-webkit-border-bottom-left-radius:4px;-khtml-border-bottom-left-radius:4px;border-bottom-left-radius:4px;}.ui-corner-all,.ui-corner-bottom,.ui-corner-right,.ui-corner-br{-moz-border-radius-bottomright:4px;-webkit-border-bottom-right-radius:4px;-khtml-border-bottom-right-radius:4px;border-bottom-right-radius:4px;}.ui-widget-overlay{background:#aaa url(images/ui-bg_flat_0_aaaaaa_40x100.png) 50% 50% repeat-x;opacity:.3;filter:Alpha(Opacity=30);}.ui-widget-shadow{margin:-8px 0 0 -8px;padding:8px;background:#aaa url(images/ui-bg_flat_0_aaaaaa_40x100.png) 50% 50% repeat-x;opacity:.3;filter:Alpha(Opacity=30);-moz-border-radius:8px;-khtml-border-radius:8px;-webkit-border-radius:8px;border-radius:8px;} \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/examples/jquery-ui/js/jquery-ui.min.js b/libreplan-webapp/src/main/webapp/jqplot/examples/jquery-ui/js/jquery-ui.min.js deleted file mode 100644 index 5ca2642d2..000000000 --- a/libreplan-webapp/src/main/webapp/jqplot/examples/jquery-ui/js/jquery-ui.min.js +++ /dev/null @@ -1,473 +0,0 @@ -/*! - * jQuery UI 1.9pre - * - * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) - * Dual licensed under the MIT or GPL Version 2 licenses. - * http://jquery.org/license - * - * http://docs.jquery.com/UI - */ -(function(a,g){function d(e,f){var i=e.nodeName.toLowerCase();if("area"===i){i=e.parentNode;var b=i.name;if(!e.href||!b||i.nodeName.toLowerCase()!=="map")return false;i=a("img[usemap=#"+b+"]")[0];return!!i&&c(i)}return(/input|select|textarea|button|object/.test(i)?!e.disabled:"a"==i?e.href||f:f)&&c(e)}function c(e){return!a(e).parents().andSelf().filter(function(){return a.curCSS(this,"visibility")==="hidden"||a.expr.filters.hidden(this)}).length}a.ui=a.ui||{};if(!a.ui.version){a.extend(a.ui,{version:"1.9pre", -keyCode:{ALT:18,BACKSPACE:8,CAPS_LOCK:20,COMMA:188,COMMAND:91,COMMAND_LEFT:91,COMMAND_RIGHT:93,CONTROL:17,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,INSERT:45,LEFT:37,MENU:93,NUMPAD_ADD:107,NUMPAD_DECIMAL:110,NUMPAD_DIVIDE:111,NUMPAD_ENTER:108,NUMPAD_MULTIPLY:106,NUMPAD_SUBTRACT:109,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SHIFT:16,SPACE:32,TAB:9,UP:38,WINDOWS:91}});a.fn.extend({_focus:a.fn.focus,focus:function(e,f){return typeof e==="number"?this.each(function(){var i=this;setTimeout(function(){a(i).focus(); -f&&f.call(i)},e)}):this._focus.apply(this,arguments)},scrollParent:function(){var e;e=a.browser.msie&&/(static|relative)/.test(this.css("position"))||/absolute/.test(this.css("position"))?this.parents().filter(function(){return/(relative|absolute|fixed)/.test(a.curCSS(this,"position",1))&&/(auto|scroll)/.test(a.curCSS(this,"overflow",1)+a.curCSS(this,"overflow-y",1)+a.curCSS(this,"overflow-x",1))}).eq(0):this.parents().filter(function(){return/(auto|scroll)/.test(a.curCSS(this,"overflow",1)+a.curCSS(this, -"overflow-y",1)+a.curCSS(this,"overflow-x",1))}).eq(0);return/fixed/.test(this.css("position"))||!e.length?a(document):e},zIndex:function(e){if(e!==g)return this.css("zIndex",e);if(this.length){e=a(this[0]);for(var f;e.length&&e[0]!==document;){f=e.css("position");if(f==="absolute"||f==="relative"||f==="fixed"){f=parseInt(e.css("zIndex"),10);if(!isNaN(f)&&f!==0)return f}e=e.parent()}}return 0},disableSelection:function(){return this.bind((a.support.selectstart?"selectstart":"mousedown")+".ui-disableSelection", -function(e){e.preventDefault()})},enableSelection:function(){return this.unbind(".ui-disableSelection")}});a.each(["Width","Height"],function(e,f){function i(l,j,m,n){a.each(b,function(){j-=parseFloat(a.curCSS(l,"padding"+this,true))||0;if(m)j-=parseFloat(a.curCSS(l,"border"+this+"Width",true))||0;if(n)j-=parseFloat(a.curCSS(l,"margin"+this,true))||0});return j}var b=f==="Width"?["Left","Right"]:["Top","Bottom"],h=f.toLowerCase(),k={innerWidth:a.fn.innerWidth,innerHeight:a.fn.innerHeight,outerWidth:a.fn.outerWidth, -outerHeight:a.fn.outerHeight};a.fn["inner"+f]=function(l){if(l===g)return k["inner"+f].call(this);return this.each(function(){a(this).css(h,i(this,l)+"px")})};a.fn["outer"+f]=function(l,j){if(typeof l!=="number")return k["outer"+f].call(this,l);return this.each(function(){a(this).css(h,i(this,l,true,j)+"px")})}});a.extend(a.expr[":"],{data:function(e,f,i){return!!a.data(e,i[3])},focusable:function(e){return d(e,!isNaN(a.attr(e,"tabindex")))},tabbable:function(e){var f=a.attr(e,"tabindex"),i=isNaN(f); -return(i||f>=0)&&d(e,!i)}});a(function(){var e=document.body,f=e.appendChild(f=document.createElement("div"));a.extend(f.style,{minHeight:"100px",height:"auto",padding:0,borderWidth:0});a.support.minHeight=f.offsetHeight===100;a.support.selectstart="onselectstart"in f;e.removeChild(f).style.display="none"});a.extend(a.ui,{plugin:{add:function(e,f,i){e=a.ui[e].prototype;for(var b in i){e.plugins[b]=e.plugins[b]||[];e.plugins[b].push([f,i[b]])}},call:function(e,f,i){if((f=e.plugins[f])&&e.element[0].parentNode)for(var b= -0;b0)return true;e[i]=1;b=e[i]>0;e[i]=0;return b},isOverAxis:function(e,f,i){return e>f&&e", -options:{disabled:false,create:null},_createWidget:function(e,f){f=a(f||this.defaultElement||this)[0];this.element=a(f);this.options=a.widget.extend({},this.options,this._getCreateOptions(),e);this.bindings=a();this.hoverable=a();this.focusable=a();if(f!==this){a.data(f,this.widgetName,this);this._bind({remove:"destroy"})}this._create();this._trigger("create");this._init()},_getCreateOptions:a.noop,_create:a.noop,_init:a.noop,destroy:function(){this._destroy();this.element.unbind("."+this.widgetName).removeData(this.widgetName); -this.widget().unbind("."+this.widgetName).removeAttr("aria-disabled").removeClass(this.widgetBaseClass+"-disabled ui-state-disabled");this.bindings.unbind("."+this.widgetName);this.hoverable.removeClass("ui-state-hover");this.focusable.removeClass("ui-state-focus")},_destroy:a.noop,widget:function(){return this.element},option:function(e,f){var i=e,b,h,k;if(arguments.length===0)return a.widget.extend({},this.options);if(typeof e==="string"){i={};b=e.split(".");e=b.shift();if(b.length){h=i[e]=a.widget.extend({}, -this.options[e]);for(k=0;k=9)&&!d.button)return this._mouseUp(d);if(this._mouseStarted){this._mouseDrag(d);return d.preventDefault()}if(this._mouseDistanceMet(d)&&this._mouseDelayMet(d))(this._mouseStarted=this._mouseStart(this._mouseDownEvent,d)!==false)?this._mouseDrag(d):this._mouseUp(d);return!this._mouseStarted},_mouseUp:function(d){a(document).unbind("mousemove."+this.widgetName,this._mouseMoveDelegate).unbind("mouseup."+this.widgetName, -this._mouseUpDelegate);if(this._mouseStarted){this._mouseStarted=false;d.target==this._mouseDownEvent.target&&a.data(d.target,this.widgetName+".preventClickEvent",true);this._mouseStop(d)}return false},_mouseDistanceMet:function(d){return Math.max(Math.abs(this._mouseDownEvent.pageX-d.pageX),Math.abs(this._mouseDownEvent.pageY-d.pageY))>=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return true}})})(jQuery); -(function(a){a.widget("ui.draggable",a.ui.mouse,{version:"1.9pre",widgetEventPrefix:"drag",options:{addClasses:true,appendTo:"parent",axis:false,connectToSortable:false,containment:false,cursor:"auto",cursorAt:false,grid:false,handle:false,helper:"original",iframeFix:false,opacity:false,refreshPositions:false,revert:false,revertDuration:500,scope:"default",scroll:true,scrollSensitivity:20,scrollSpeed:20,snap:false,snapMode:"both",snapTolerance:20,stack:false,zIndex:false},_create:function(){if(this.options.helper== -"original"&&!/^(?:r|a|f)/.test(this.element.css("position")))this.element[0].style.position="relative";this.options.addClasses&&this.element.addClass("ui-draggable");this.options.disabled&&this.element.addClass("ui-draggable-disabled");this._mouseInit()},destroy:function(){if(this.element.data("draggable")){this.element.removeData("draggable").unbind(".draggable").removeClass("ui-draggable ui-draggable-dragging ui-draggable-disabled");this._mouseDestroy();return this}},_mouseCapture:function(g){var d= -this.options;if(this.helper||d.disabled||a(g.target).is(".ui-resizable-handle"))return false;this.handle=this._getHandle(g);if(!this.handle)return false;a(d.iframeFix===true?"iframe":d.iframeFix).each(function(){a('
    ').css({width:this.offsetWidth+"px",height:this.offsetHeight+"px",position:"absolute",opacity:"0.001",zIndex:1E3}).css(a(this).offset()).appendTo("body")});return true},_mouseStart:function(g){var d=this.options;this.helper= -this._createHelper(g);this._cacheHelperProportions();if(a.ui.ddmanager)a.ui.ddmanager.current=this;this._cacheMargins();this.cssPosition=this.helper.css("position");this.scrollParent=this.helper.scrollParent();this.offset=this.positionAbs=this.element.offset();this.offset={top:this.offset.top-this.margins.top,left:this.offset.left-this.margins.left};a.extend(this.offset,{click:{left:g.pageX-this.offset.left,top:g.pageY-this.offset.top},parent:this._getParentOffset(),relative:this._getRelativeOffset()}); -this.originalPosition=this.position=this._generatePosition(g);this.originalPageX=g.pageX;this.originalPageY=g.pageY;d.cursorAt&&this._adjustOffsetFromHelper(d.cursorAt);d.containment&&this._setContainment();if(this._trigger("start",g)===false){this._clear();return false}this._cacheHelperProportions();a.ui.ddmanager&&!d.dropBehaviour&&a.ui.ddmanager.prepareOffsets(this,g);this.helper.addClass("ui-draggable-dragging");this._mouseDrag(g,true);a.ui.ddmanager&&a.ui.ddmanager.dragStart(this,g);return true}, -_mouseDrag:function(g,d){this.position=this._generatePosition(g);this.positionAbs=this._convertPositionTo("absolute");if(!d){var c=this._uiHash();if(this._trigger("drag",g,c)===false){this._mouseUp({});return false}this.position=c.position}if(!this.options.axis||this.options.axis!="y")this.helper[0].style.left=this.position.left+"px";if(!this.options.axis||this.options.axis!="x")this.helper[0].style.top=this.position.top+"px";a.ui.ddmanager&&a.ui.ddmanager.drag(this,g);return false},_mouseStop:function(g){var d= -false;if(a.ui.ddmanager&&!this.options.dropBehaviour)d=a.ui.ddmanager.drop(this,g);if(this.dropped){d=this.dropped;this.dropped=false}if(!this.element[0]||!this.element[0].parentNode)return false;if(this.options.revert=="invalid"&&!d||this.options.revert=="valid"&&d||this.options.revert===true||a.isFunction(this.options.revert)&&this.options.revert.call(this.element,d)){var c=this;a(this.helper).animate(this.originalPosition,parseInt(this.options.revertDuration,10),function(){c._trigger("stop",g)!== -false&&c._clear()})}else this._trigger("stop",g)!==false&&this._clear();return false},_mouseUp:function(g){this.options.iframeFix===true&&a("div.ui-draggable-iframeFix").each(function(){this.parentNode.removeChild(this)});a.ui.ddmanager&&a.ui.ddmanager.dragStop(this,g);return a.ui.mouse.prototype._mouseUp.call(this,g)},cancel:function(){this.helper.is(".ui-draggable-dragging")?this._mouseUp({}):this._clear();return this},_getHandle:function(g){var d=!this.options.handle||!a(this.options.handle,this.element).length? -true:false;a(this.options.handle,this.element).find("*").andSelf().each(function(){if(this==g.target)d=true});return d},_createHelper:function(g){var d=this.options;g=a.isFunction(d.helper)?a(d.helper.apply(this.element[0],[g])):d.helper=="clone"?this.element.clone().removeAttr("id"):this.element;g.parents("body").length||g.appendTo(d.appendTo=="parent"?this.element[0].parentNode:d.appendTo);g[0]!=this.element[0]&&!/(fixed|absolute)/.test(g.css("position"))&&g.css("position","absolute");return g}, -_adjustOffsetFromHelper:function(g){if(typeof g=="string")g=g.split(" ");if(a.isArray(g))g={left:+g[0],top:+g[1]||0};if("left"in g)this.offset.click.left=g.left+this.margins.left;if("right"in g)this.offset.click.left=this.helperProportions.width-g.right+this.margins.left;if("top"in g)this.offset.click.top=g.top+this.margins.top;if("bottom"in g)this.offset.click.top=this.helperProportions.height-g.bottom+this.margins.top},_getParentOffset:function(){this.offsetParent=this.helper.offsetParent();var g= -this.offsetParent.offset();if(this.cssPosition=="absolute"&&this.scrollParent[0]!=document&&a.contains(this.scrollParent[0],this.offsetParent[0])){g.left+=this.scrollParent.scrollLeft();g.top+=this.scrollParent.scrollTop()}if(this.offsetParent[0]==document.body||this.offsetParent[0].tagName&&this.offsetParent[0].tagName.toLowerCase()=="html"&&a.browser.msie)g={top:0,left:0};return{top:g.top+(parseInt(this.offsetParent.css("borderTopWidth"),10)||0),left:g.left+(parseInt(this.offsetParent.css("borderLeftWidth"), -10)||0)}},_getRelativeOffset:function(){if(this.cssPosition=="relative"){var g=this.element.position();return{top:g.top-(parseInt(this.helper.css("top"),10)||0)+this.scrollParent.scrollTop(),left:g.left-(parseInt(this.helper.css("left"),10)||0)+this.scrollParent.scrollLeft()}}else return{top:0,left:0}},_cacheMargins:function(){this.margins={left:parseInt(this.element.css("marginLeft"),10)||0,top:parseInt(this.element.css("marginTop"),10)||0,right:parseInt(this.element.css("marginRight"),10)||0,bottom:parseInt(this.element.css("marginBottom"), -10)||0}},_cacheHelperProportions:function(){this.helperProportions={width:this.helper.outerWidth(),height:this.helper.outerHeight()}},_setContainment:function(){var g=this.options;if(g.containment=="parent")g.containment=this.helper[0].parentNode;if(g.containment=="document"||g.containment=="window")this.containment=[g.containment=="document"?0:a(window).scrollLeft()-this.offset.relative.left-this.offset.parent.left,g.containment=="document"?0:a(window).scrollTop()-this.offset.relative.top-this.offset.parent.top, -(g.containment=="document"?0:a(window).scrollLeft())+a(g.containment=="document"?document:window).width()-this.helperProportions.width-this.margins.left,(g.containment=="document"?0:a(window).scrollTop())+(a(g.containment=="document"?document:window).height()||document.body.parentNode.scrollHeight)-this.helperProportions.height-this.margins.top];if(!/^(document|window|parent)$/.test(g.containment)&&g.containment.constructor!=Array){g=a(g.containment);var d=g[0];if(d){g.offset();var c=a(d).css("overflow")!= -"hidden";this.containment=[(parseInt(a(d).css("borderLeftWidth"),10)||0)+(parseInt(a(d).css("paddingLeft"),10)||0),(parseInt(a(d).css("borderTopWidth"),10)||0)+(parseInt(a(d).css("paddingTop"),10)||0),(c?Math.max(d.scrollWidth,d.offsetWidth):d.offsetWidth)-(parseInt(a(d).css("borderLeftWidth"),10)||0)-(parseInt(a(d).css("paddingRight"),10)||0)-this.helperProportions.width-this.margins.left-this.margins.right,(c?Math.max(d.scrollHeight,d.offsetHeight):d.offsetHeight)-(parseInt(a(d).css("borderTopWidth"), -10)||0)-(parseInt(a(d).css("paddingBottom"),10)||0)-this.helperProportions.height-this.margins.top-this.margins.bottom];this.relative_container=g}}else if(g.containment.constructor==Array)this.containment=g.containment},_convertPositionTo:function(g,d){if(!d)d=this.position;var c=g=="absolute"?1:-1,e=this.cssPosition=="absolute"&&!(this.scrollParent[0]!=document&&a.contains(this.scrollParent[0],this.offsetParent[0]))?this.offsetParent:this.scrollParent,f=/(html|body)/i.test(e[0].tagName);return{top:d.top+ -this.offset.relative.top*c+this.offset.parent.top*c-(a.browser.safari&&a.browser.version<526&&this.cssPosition=="fixed"?0:(this.cssPosition=="fixed"?-this.scrollParent.scrollTop():f?0:e.scrollTop())*c),left:d.left+this.offset.relative.left*c+this.offset.parent.left*c-(a.browser.safari&&a.browser.version<526&&this.cssPosition=="fixed"?0:(this.cssPosition=="fixed"?-this.scrollParent.scrollLeft():f?0:e.scrollLeft())*c)}},_generatePosition:function(g){var d=this.options,c=this.cssPosition=="absolute"&& -!(this.scrollParent[0]!=document&&a.contains(this.scrollParent[0],this.offsetParent[0]))?this.offsetParent:this.scrollParent,e=/(html|body)/i.test(c[0].tagName),f=g.pageX,i=g.pageY;if(this.originalPosition){var b;if(this.containment){if(this.relative_container){b=this.relative_container.offset();b=[this.containment[0]+b.left,this.containment[1]+b.top,this.containment[2]+b.left,this.containment[3]+b.top]}else b=this.containment;if(g.pageX-this.offset.click.leftb[2])f=b[2]+this.offset.click.left;if(g.pageY-this.offset.click.top>b[3])i=b[3]+this.offset.click.top}if(d.grid){i=d.grid[1]?this.originalPageY+Math.round((i-this.originalPageY)/d.grid[1])*d.grid[1]:this.originalPageY;i=b?!(i-this.offset.click.topb[3])?i:!(i-this.offset.click.topb[2])?f:!(f-this.offset.click.left=0;l--){var j=c.snapElements[l].left,m=j+c.snapElements[l].width,n=c.snapElements[l].top,o=n+c.snapElements[l].height;if(j-f=l&&i<=j||b>=l&&b<=j||ij)&&(e>=h&&e<=k||f>=h&&f<=k||ek);default:return false}}; -a.ui.ddmanager={current:null,droppables:{"default":[]},prepareOffsets:function(g,d){var c=a.ui.ddmanager.droppables[g.options.scope]||[],e=d?d.type:null,f=(g.currentItem||g.element).find(":data(droppable)").andSelf(),i=0;a:for(;i
    ').css({position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(), -top:this.element.css("top"),left:this.element.css("left")}));this.element=this.element.parent().data("resizable",this.element.data("resizable"));this.elementIsWrapper=true;this.element.css({marginLeft:this.originalElement.css("marginLeft"),marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom")});this.originalElement.css({marginLeft:0,marginTop:0,marginRight:0,marginBottom:0});this.originalResizeStyle= -this.originalElement.css("resize");this.originalElement.css("resize","none");this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"}));this.originalElement.css({margin:this.originalElement.css("margin")});this._proportionallyResize()}this.handles=e.handles||(!a(".ui-resizable-handle",this.element).length?"e,s,se":{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne", -nw:".ui-resizable-nw"});if(this.handles.constructor==String){if(this.handles=="all")this.handles="n,e,s,w,se,sw,ne,nw";var f=this.handles.split(",");this.handles={};for(var i=0;i
    ');/sw|se|ne|nw/.test(b)&&h.css({zIndex:++e.zIndex});"se"==b&&h.addClass("ui-icon ui-icon-gripsmall-diagonal-se");this.handles[b]=".ui-resizable-"+b;this.element.append(h)}}this._renderAxis=function(k){k=k||this.element;for(var l in this.handles){if(this.handles[l].constructor== -String)this.handles[l]=a(this.handles[l],this.element).show();if(this.elementIsWrapper&&this.originalElement[0].nodeName.match(/textarea|input|select|button/i)){var j=a(this.handles[l],this.element),m=0;m=/sw|ne|nw|se|n|s/.test(l)?j.outerHeight():j.outerWidth();j=["padding",/ne|nw|n/.test(l)?"Top":/se|sw|s/.test(l)?"Bottom":/^e$/.test(l)?"Right":"Left"].join("");k.css(j,m);this._proportionallyResize()}a(this.handles[l])}};this._renderAxis(this.element);this._handles=a(".ui-resizable-handle",this.element).disableSelection(); -this._handles.mouseover(function(){if(!c.resizing){if(this.className)var k=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i);c.axis=k&&k[1]?k[1]:"se"}});if(e.autoHide){this._handles.hide();a(this.element).addClass("ui-resizable-autohide").hover(function(){if(!e.disabled){a(this).removeClass("ui-resizable-autohide");c._handles.show()}},function(){if(!e.disabled)if(!c.resizing){a(this).addClass("ui-resizable-autohide");c._handles.hide()}})}this._mouseInit()},destroy:function(){this._mouseDestroy(); -var c=function(f){a(f).removeClass("ui-resizable ui-resizable-disabled ui-resizable-resizing").removeData("resizable").unbind(".resizable").find(".ui-resizable-handle").remove()};if(this.elementIsWrapper){c(this.element);var e=this.element;e.after(this.originalElement.css({position:e.css("position"),width:e.outerWidth(),height:e.outerHeight(),top:e.css("top"),left:e.css("left")})).remove()}this.originalElement.css("resize",this.originalResizeStyle);c(this.originalElement);return this},_mouseCapture:function(c){var e= -false,f;for(f in this.handles)if(a(this.handles[f])[0]==c.target)e=true;return!this.options.disabled&&e},_mouseStart:function(c){var e=this.options,f=this.element.position(),i=this.element;this.resizing=true;this.documentScroll={top:a(document).scrollTop(),left:a(document).scrollLeft()};if(i.is(".ui-draggable")||/absolute/.test(i.css("position")))i.css({position:"absolute",top:f.top,left:f.left});a.browser.opera&&/relative/.test(i.css("position"))&&i.css({position:"relative",top:"auto",left:"auto"}); -this._renderProxy();f=g(this.helper.css("left"));var b=g(this.helper.css("top"));if(e.containment){f+=a(e.containment).scrollLeft()||0;b+=a(e.containment).scrollTop()||0}this.offset=this.helper.offset();this.position={left:f,top:b};this.size=this._helper?{width:i.outerWidth(),height:i.outerHeight()}:{width:i.width(),height:i.height()};this.originalSize=this._helper?{width:i.outerWidth(),height:i.outerHeight()}:{width:i.width(),height:i.height()};this.originalPosition={left:f,top:b};this.sizeDiff= -{width:i.outerWidth()-i.width(),height:i.outerHeight()-i.height()};this.originalMousePosition={left:c.pageX,top:c.pageY};this.aspectRatio=typeof e.aspectRatio=="number"?e.aspectRatio:this.originalSize.width/this.originalSize.height||1;e=a(".ui-resizable-"+this.axis).css("cursor");a("body").css("cursor",e=="auto"?this.axis+"-resize":e);i.addClass("ui-resizable-resizing");this._propagate("start",c);return true},_mouseDrag:function(c){var e=this.helper,f=this.originalMousePosition,i=this._change[this.axis]; -if(!i)return false;f=i.apply(this,[c,c.pageX-f.left||0,c.pageY-f.top||0]);this._updateVirtualBoundaries(c.shiftKey);if(this._aspectRatio||c.shiftKey)f=this._updateRatio(f,c);f=this._respectSize(f,c);this._propagate("resize",c);e.css({top:this.position.top+"px",left:this.position.left+"px",width:this.size.width+"px",height:this.size.height+"px"});!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize();this._updateCache(f);this._trigger("resize",c,this.ui());return false}, -_mouseStop:function(c){this.resizing=false;var e=this.options;if(this._helper){var f=this._proportionallyResizeElements,i=f.length&&/textarea/i.test(f[0].nodeName);f=i&&a.ui.hasScroll(f[0],"left")?0:this.sizeDiff.height;i=i?0:this.sizeDiff.width;i={width:this.helper.width()-i,height:this.helper.height()-f};f=parseInt(this.element.css("left"),10)+(this.position.left-this.originalPosition.left)||null;var b=parseInt(this.element.css("top"),10)+(this.position.top-this.originalPosition.top)||null;e.animate|| -this.element.css(a.extend(i,{top:b,left:f}));this.helper.height(this.size.height);this.helper.width(this.size.width);this._helper&&!e.animate&&this._proportionallyResize()}a("body").css("cursor","auto");this.element.removeClass("ui-resizable-resizing");this._propagate("stop",c);this._helper&&this.helper.remove();return false},_updateVirtualBoundaries:function(c){var e=this.options,f,i,b;e={minWidth:d(e.minWidth)?e.minWidth:0,maxWidth:d(e.maxWidth)?e.maxWidth:Infinity,minHeight:d(e.minHeight)?e.minHeight: -0,maxHeight:d(e.maxHeight)?e.maxHeight:Infinity};if(this._aspectRatio||c){c=e.minHeight*this.aspectRatio;i=e.minWidth/this.aspectRatio;f=e.maxHeight*this.aspectRatio;b=e.maxWidth/this.aspectRatio;if(c>e.minWidth)e.minWidth=c;if(i>e.minHeight)e.minHeight=i;if(fc.width,k=d(c.height)&&e.minHeight&&e.minHeight>c.height;if(h)c.width=e.minWidth;if(k)c.height=e.minHeight;if(i)c.width=e.maxWidth;if(b)c.height=e.maxHeight;var l=this.originalPosition.left+this.originalSize.width,j=this.position.top+this.size.height,m=/sw|nw|w/.test(f);f=/nw|ne|n/.test(f);if(h&&m)c.left=l-e.minWidth;if(i&&m)c.left=l-e.maxWidth;if(k&&f)c.top=j-e.minHeight;if(b&&f)c.top=j-e.maxHeight;if((e=!c.width&&!c.height)&&!c.left&&c.top)c.top=null; -else if(e&&!c.top&&c.left)c.left=null;return c},_proportionallyResize:function(){if(this._proportionallyResizeElements.length)for(var c=this.helper||this.element,e=0;e');var e=a.browser.msie&&a.browser.version<7,f=e?1:0;e=e?2:-1;this.helper.addClass(this._helper).css({width:this.element.outerWidth()+ -e,height:this.element.outerHeight()+e,position:"absolute",left:this.elementOffset.left-f+"px",top:this.elementOffset.top-f+"px",zIndex:++c.zIndex});this.helper.appendTo("body").disableSelection()}else this.helper=this.element},_change:{e:function(c,e){return{width:this.originalSize.width+e}},w:function(c,e){return{left:this.originalPosition.left+e,width:this.originalSize.width-e}},n:function(c,e,f){return{top:this.originalPosition.top+f,height:this.originalSize.height-f}},s:function(c,e,f){return{height:this.originalSize.height+ -f}},se:function(c,e,f){return a.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[c,e,f]))},sw:function(c,e,f){return a.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[c,e,f]))},ne:function(c,e,f){return a.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[c,e,f]))},nw:function(c,e,f){return a.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[c,e,f]))}},_propagate:function(c,e){a.ui.plugin.call(this,c,[e,this.ui()]); -c!="resize"&&this._trigger(c,e,this.ui())},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}});a.ui.plugin.add("resizable","alsoResize",{start:function(){var c=a(this).data("resizable").options,e=function(f){a(f).each(function(){var i=a(this);i.data("resizable-alsoresize",{width:parseInt(i.width(),10),height:parseInt(i.height(),10), -left:parseInt(i.css("left"),10),top:parseInt(i.css("top"),10),position:i.css("position")})})};if(typeof c.alsoResize=="object"&&!c.alsoResize.parentNode)if(c.alsoResize.length){c.alsoResize=c.alsoResize[0];e(c.alsoResize)}else a.each(c.alsoResize,function(f){e(f)});else e(c.alsoResize)},resize:function(c,e){var f=a(this).data("resizable"),i=f.options,b=f.originalSize,h=f.originalPosition,k={height:f.size.height-b.height||0,width:f.size.width-b.width||0,top:f.position.top-h.top||0,left:f.position.left- -h.left||0},l=function(j,m){a(j).each(function(){var n=a(this),o=a(this).data("resizable-alsoresize"),p={},q=m&&m.length?m:n.parents(e.originalElement[0]).length?["width","height"]:["width","height","top","left"];a.each(q,function(u,s){var r=(o[s]||0)+(k[s]||0);if(r&&r>=0)p[s]=r||null});if(a.browser.opera&&/relative/.test(n.css("position"))){f._revertToRelativePosition=true;n.css({position:"absolute",top:"auto",left:"auto"})}n.css(p)})};typeof i.alsoResize=="object"&&!i.alsoResize.nodeType?a.each(i.alsoResize, -function(j,m){l(j,m)}):l(i.alsoResize)},stop:function(){var c=a(this).data("resizable"),e=c.options,f=function(i){a(i).each(function(){var b=a(this);b.css({position:b.data("resizable-alsoresize").position})})};if(c._revertToRelativePosition){c._revertToRelativePosition=false;typeof e.alsoResize=="object"&&!e.alsoResize.nodeType?a.each(e.alsoResize,function(i){f(i)}):f(e.alsoResize)}a(this).removeData("resizable-alsoresize")}});a.ui.plugin.add("resizable","animate",{stop:function(c){var e=a(this).data("resizable"), -f=e.options,i=e._proportionallyResizeElements,b=i.length&&/textarea/i.test(i[0].nodeName),h=b&&a.ui.hasScroll(i[0],"left")?0:e.sizeDiff.height;b={width:e.size.width-(b?0:e.sizeDiff.width),height:e.size.height-h};h=parseInt(e.element.css("left"),10)+(e.position.left-e.originalPosition.left)||null;var k=parseInt(e.element.css("top"),10)+(e.position.top-e.originalPosition.top)||null;e.element.animate(a.extend(b,k&&h?{top:k,left:h}:{}),{duration:f.animateDuration,easing:f.animateEasing,step:function(){var l= -{width:parseInt(e.element.css("width"),10),height:parseInt(e.element.css("height"),10),top:parseInt(e.element.css("top"),10),left:parseInt(e.element.css("left"),10)};i&&i.length&&a(i[0]).css({width:l.width,height:l.height});e._updateCache(l);e._propagate("resize",c)}})}});a.ui.plugin.add("resizable","containment",{start:function(){var c=a(this).data("resizable"),e=c.element,f=c.options.containment;if(e=f instanceof a?f.get(0):/parent/.test(f)?e.parent().get(0):f){c.containerElement=a(e);if(/document/.test(f)|| -f==document){c.containerOffset={left:0,top:0};c.containerPosition={left:0,top:0};c.parentData={element:a(document),left:0,top:0,width:a(document).width(),height:a(document).height()||document.body.parentNode.scrollHeight}}else{var i=a(e),b=[];a(["Top","Right","Left","Bottom"]).each(function(l,j){b[l]=g(i.css("padding"+j))});c.containerOffset=i.offset();c.containerPosition=i.position();c.containerSize={height:i.innerHeight()-b[3],width:i.innerWidth()-b[1]};f=c.containerOffset;var h=c.containerSize.height, -k=c.containerSize.width;k=a.ui.hasScroll(e,"left")?e.scrollWidth:k;h=a.ui.hasScroll(e)?e.scrollHeight:h;c.parentData={element:e,left:f.left,top:f.top,width:k,height:h}}}},resize:function(c){var e=a(this).data("resizable"),f=e.options,i=e.containerOffset,b=e.position;c=e._aspectRatio||c.shiftKey;var h={top:0,left:0},k=e.containerElement;if(k[0]!=document&&/static/.test(k.css("position")))h=i;if(b.left<(e._helper?i.left:0)){e.size.width+=e._helper?e.position.left-i.left:e.position.left-h.left;if(c)e.size.height= -e.size.width/f.aspectRatio;e.position.left=f.helper?i.left:0}if(b.top<(e._helper?i.top:0)){e.size.height+=e._helper?e.position.top-i.top:e.position.top;if(c)e.size.width=e.size.height*f.aspectRatio;e.position.top=e._helper?i.top:0}e.offset.left=e.parentData.left+e.position.left;e.offset.top=e.parentData.top+e.position.top;f=Math.abs((e._helper?e.offset.left-h.left:e.offset.left-h.left)+e.sizeDiff.width);i=Math.abs((e._helper?e.offset.top-h.top:e.offset.top-i.top)+e.sizeDiff.height);b=e.containerElement.get(0)== -e.element.parent().get(0);h=/relative|absolute/.test(e.containerElement.css("position"));if(b&&h)f-=e.parentData.left;if(f+e.size.width>=e.parentData.width){e.size.width=e.parentData.width-f;if(c)e.size.height=e.size.width/e.aspectRatio}if(i+e.size.height>=e.parentData.height){e.size.height=e.parentData.height-i;if(c)e.size.width=e.size.height*e.aspectRatio}},stop:function(){var c=a(this).data("resizable"),e=c.options,f=c.containerOffset,i=c.containerPosition,b=c.containerElement,h=a(c.helper),k= -h.offset(),l=h.outerWidth()-c.sizeDiff.width;h=h.outerHeight()-c.sizeDiff.height;c._helper&&!e.animate&&/relative/.test(b.css("position"))&&a(this).css({left:k.left-i.left-f.left,width:l,height:h});c._helper&&!e.animate&&/static/.test(b.css("position"))&&a(this).css({left:k.left-i.left-f.left,width:l,height:h})}});a.ui.plugin.add("resizable","ghost",{start:function(){var c=a(this).data("resizable"),e=c.options,f=c.size;c.ghost=c.originalElement.clone();c.ghost.css({opacity:0.25,display:"block",position:"relative", -height:f.height,width:f.width,margin:0,left:0,top:0}).addClass("ui-resizable-ghost").addClass(typeof e.ghost=="string"?e.ghost:"");c.ghost.appendTo(c.helper)},resize:function(){var c=a(this).data("resizable");c.ghost&&c.ghost.css({position:"relative",height:c.size.height,width:c.size.width})},stop:function(){var c=a(this).data("resizable");c.ghost&&c.helper&&c.helper.get(0).removeChild(c.ghost.get(0))}});a.ui.plugin.add("resizable","grid",{resize:function(){var c=a(this).data("resizable"),e=c.options, -f=c.size,i=c.originalSize,b=c.originalPosition,h=c.axis;e.grid=typeof e.grid=="number"?[e.grid,e.grid]:e.grid;var k=Math.round((f.width-i.width)/(e.grid[0]||1))*(e.grid[0]||1);e=Math.round((f.height-i.height)/(e.grid[1]||1))*(e.grid[1]||1);if(/^(se|s|e)$/.test(h)){c.size.width=i.width+k;c.size.height=i.height+e}else if(/^(ne)$/.test(h)){c.size.width=i.width+k;c.size.height=i.height+e;c.position.top=b.top-e}else{if(/^(sw)$/.test(h)){c.size.width=i.width+k;c.size.height=i.height+e}else{c.size.width= -i.width+k;c.size.height=i.height+e;c.position.top=b.top-e}c.position.left=b.left-k}}});var g=function(c){return parseInt(c,10)||0},d=function(c){return!isNaN(parseInt(c,10))}})(jQuery); -(function(a){a.widget("ui.selectable",a.ui.mouse,{version:"1.9pre",options:{appendTo:"body",autoRefresh:true,distance:0,filter:"*",tolerance:"touch"},_create:function(){var g=this;this.element.addClass("ui-selectable");this.dragged=false;var d;this.refresh=function(){d=a(g.options.filter,g.element[0]);d.each(function(){var c=a(this),e=c.offset();a.data(this,"selectable-item",{element:this,$element:c,left:e.left,top:e.top,right:e.left+c.outerWidth(),bottom:e.top+c.outerHeight(),startselected:false, -selected:c.hasClass("ui-selected"),selecting:c.hasClass("ui-selecting"),unselecting:c.hasClass("ui-unselecting")})})};this.refresh();this.selectees=d.addClass("ui-selectee");this._mouseInit();this.helper=a("
    ")},destroy:function(){this.selectees.removeClass("ui-selectee").removeData("selectable-item");this.element.removeClass("ui-selectable ui-selectable-disabled").removeData("selectable").unbind(".selectable");this._mouseDestroy();return this},_mouseStart:function(g){var d= -this;this.opos=[g.pageX,g.pageY];if(!this.options.disabled){var c=this.options;this.selectees=a(c.filter,this.element[0]);this._trigger("start",g);a(c.appendTo).append(this.helper);this.helper.css({left:g.clientX,top:g.clientY,width:0,height:0});c.autoRefresh&&this.refresh();this.selectees.filter(".ui-selected").each(function(){var e=a.data(this,"selectable-item");e.startselected=true;if(!g.metaKey){e.$element.removeClass("ui-selected");e.selected=false;e.$element.addClass("ui-unselecting");e.unselecting= -true;d._trigger("unselecting",g,{unselecting:e.element})}});a(g.target).parents().andSelf().each(function(){var e=a.data(this,"selectable-item");if(e){var f=!g.metaKey||!e.$element.hasClass("ui-selected");e.$element.removeClass(f?"ui-unselecting":"ui-selected").addClass(f?"ui-selecting":"ui-unselecting");e.unselecting=!f;e.selecting=f;(e.selected=f)?d._trigger("selecting",g,{selecting:e.element}):d._trigger("unselecting",g,{unselecting:e.element});return false}})}},_mouseDrag:function(g){var d=this; -this.dragged=true;if(!this.options.disabled){var c=this.options,e=this.opos[0],f=this.opos[1],i=g.pageX,b=g.pageY;if(e>i){var h=i;i=e;e=h}if(f>b){h=b;b=f;f=h}this.helper.css({left:e,top:f,width:i-e,height:b-f});this.selectees.each(function(){var k=a.data(this,"selectable-item");if(!(!k||k.element==d.element[0])){var l=false;if(c.tolerance=="touch")l=!(k.left>i||k.rightb||k.bottome&&k.rightf&&k.bottom *",opacity:false,placeholder:false,revert:false,scroll:true,scrollSensitivity:20,scrollSpeed:20,scope:"default",tolerance:"intersect",zIndex:1E3},_create:function(){var g=this.options;this.containerCache= -{};this.element.addClass("ui-sortable");this.refresh();this.floating=this.items.length?g.axis==="x"||/left|right/.test(this.items[0].item.css("float"))||/inline|table-cell/.test(this.items[0].item.css("display")):false;this.offset=this.element.offset();this._mouseInit()},destroy:function(){this.element.removeClass("ui-sortable ui-sortable-disabled");this._mouseDestroy();for(var g=this.items.length-1;g>=0;g--)this.items[g].item.removeData(this.widgetName+"-item");return this},_setOption:function(g, -d){if(g==="disabled"){this.options[g]=d;this.widget().toggleClass("ui-sortable-disabled",!!d)}else a.Widget.prototype._setOption.apply(this,arguments)},_mouseCapture:function(g,d){var c=this;if(this.reverting)return false;if(this.options.disabled||this.options.type=="static")return false;this._refreshItems(g);var e=null,f=this;a(g.target).parents().each(function(){if(a.data(this,c.widgetName+"-item")==f){e=a(this);return false}});if(a.data(g.target,c.widgetName+"-item")==f)e=a(g.target);if(!e)return false; -if(this.options.handle&&!d){var i=false;a(this.options.handle,e).find("*").andSelf().each(function(){if(this==g.target)i=true});if(!i)return false}this.currentItem=e;this._removeCurrentsFromItems();return true},_mouseStart:function(g,d,c){d=this.options;this.currentContainer=this;this.refreshPositions();this.helper=this._createHelper(g);this._cacheHelperProportions();this._cacheMargins();this.scrollParent=this.helper.scrollParent();this.offset=this.currentItem.offset();this.offset={top:this.offset.top- -this.margins.top,left:this.offset.left-this.margins.left};this.helper.css("position","absolute");this.cssPosition=this.helper.css("position");a.extend(this.offset,{click:{left:g.pageX-this.offset.left,top:g.pageY-this.offset.top},parent:this._getParentOffset(),relative:this._getRelativeOffset()});this.originalPosition=this._generatePosition(g);this.originalPageX=g.pageX;this.originalPageY=g.pageY;d.cursorAt&&this._adjustOffsetFromHelper(d.cursorAt);this.domPosition={prev:this.currentItem.prev()[0], -parent:this.currentItem.parent()[0]};this.helper[0]!=this.currentItem[0]&&this.currentItem.hide();this._createPlaceholder();d.containment&&this._setContainment();if(d.cursor){if(a("body").css("cursor"))this._storedCursor=a("body").css("cursor");a("body").css("cursor",d.cursor)}if(d.opacity){if(this.helper.css("opacity"))this._storedOpacity=this.helper.css("opacity");this.helper.css("opacity",d.opacity)}if(d.zIndex){if(this.helper.css("zIndex"))this._storedZIndex=this.helper.css("zIndex");this.helper.css("zIndex", -d.zIndex)}if(this.scrollParent[0]!=document&&this.scrollParent[0].tagName!="HTML")this.overflowOffset=this.scrollParent.offset();this._trigger("start",g,this._uiHash());this._preserveHelperProportions||this._cacheHelperProportions();if(!c)for(c=this.containers.length-1;c>=0;c--)this.containers[c]._trigger("activate",g,this._uiHash(this));if(a.ui.ddmanager)a.ui.ddmanager.current=this;a.ui.ddmanager&&!d.dropBehaviour&&a.ui.ddmanager.prepareOffsets(this,g);this.dragging=true;this.helper.addClass("ui-sortable-helper"); -this._mouseDrag(g);return true},_mouseDrag:function(g){this.position=this._generatePosition(g);this.positionAbs=this._convertPositionTo("absolute");if(!this.lastPositionAbs)this.lastPositionAbs=this.positionAbs;if(this.options.scroll){var d=this.options,c=false;if(this.scrollParent[0]!=document&&this.scrollParent[0].tagName!="HTML"){if(this.overflowOffset.top+this.scrollParent[0].offsetHeight-g.pageY=0;d--){c=this.items[d];var e=c.item[0],f=this._intersectsWithPointer(c);if(f)if(e!=this.currentItem[0]&&this.placeholder[f==1?"next":"prev"]()[0]!=e&&!a.contains(this.placeholder[0],e)&&(this.options.type== -"semi-dynamic"?!a.contains(this.element[0],e):1)){this.direction=f==1?"down":"up";if(this.options.tolerance=="pointer"||this._intersectsWithSides(c))this._rearrange(g,c);else break;this._trigger("change",g,this._uiHash());break}}this._contactContainers(g);a.ui.ddmanager&&a.ui.ddmanager.drag(this,g);this._trigger("sort",g,this._uiHash());this.lastPositionAbs=this.positionAbs;return false},_mouseStop:function(g,d){if(g){a.ui.ddmanager&&!this.options.dropBehaviour&&a.ui.ddmanager.drop(this,g);if(this.options.revert){var c= -this,e=c.placeholder.offset();c.reverting=true;a(this.helper).animate({left:e.left-this.offset.parent.left-c.margins.left+(this.offsetParent[0]==document.body?0:this.offsetParent[0].scrollLeft),top:e.top-this.offset.parent.top-c.margins.top+(this.offsetParent[0]==document.body?0:this.offsetParent[0].scrollTop)},parseInt(this.options.revert,10)||500,function(){c._clear(g)})}else this._clear(g,d);return false}},cancel:function(){if(this.dragging){this._mouseUp({target:null});this.options.helper=="original"? -this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper"):this.currentItem.show();for(var g=this.containers.length-1;g>=0;g--){this.containers[g]._trigger("deactivate",null,this._uiHash(this));if(this.containers[g].containerCache.over){this.containers[g]._trigger("out",null,this._uiHash(this));this.containers[g].containerCache.over=0}}}if(this.placeholder){this.placeholder[0].parentNode&&this.placeholder[0].parentNode.removeChild(this.placeholder[0]);this.options.helper!="original"&& -this.helper&&this.helper[0].parentNode&&this.helper.remove();a.extend(this,{helper:null,dragging:false,reverting:false,_noFinalSort:null});this.domPosition.prev?a(this.domPosition.prev).after(this.currentItem):a(this.domPosition.parent).prepend(this.currentItem)}return this},serialize:function(g){var d=this._getItemsAsjQuery(g&&g.connected),c=[];g=g||{};a(d).each(function(){var e=(a(g.item||this).attr(g.attribute||"id")||"").match(g.expression||/(.+)[-=_](.+)/);if(e)c.push((g.key||e[1]+"[]")+"="+ -(g.key&&g.expression?e[1]:e[2]))});!c.length&&g.key&&c.push(g.key+"=");return c.join("&")},toArray:function(g){var d=this._getItemsAsjQuery(g&&g.connected),c=[];g=g||{};d.each(function(){c.push(a(g.item||this).attr(g.attribute||"id")||"")});return c},_intersectsWith:function(g){var d=this.positionAbs.left,c=d+this.helperProportions.width,e=this.positionAbs.top,f=e+this.helperProportions.height,i=g.left,b=i+g.width,h=g.top,k=h+g.height,l=this.offset.click.top,j=this.offset.click.left;return this.options.tolerance== -"pointer"||this.options.forcePointerForContainers||this.options.tolerance!="pointer"&&this.helperProportions[this.floating?"width":"height"]>g[this.floating?"width":"height"]?e+l>h&&e+li&&d+j0?"down":"up")},_getDragHorizontalDirection:function(){var g=this.positionAbs.left-this.lastPositionAbs.left;return g!=0&&(g>0?"right":"left")},refresh:function(g){this._refreshItems(g);this.refreshPositions();return this},_connectWith:function(){var g=this.options;return g.connectWith.constructor==String?[g.connectWith]: -g.connectWith},_getItemsAsjQuery:function(g){var d=[],c=[],e=this._connectWith();if(e&&g)for(g=e.length-1;g>=0;g--)for(var f=a(e[g]),i=f.length-1;i>=0;i--){var b=a.data(f[i],this.widgetName);if(b&&b!=this&&!b.options.disabled)c.push([a.isFunction(b.options.items)?b.options.items.call(b.element):a(b.options.items,b.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"),b])}c.push([a.isFunction(this.options.items)?this.options.items.call(this.element,null,{options:this.options,item:this.currentItem}): -a(this.options.items,this.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"),this]);for(g=c.length-1;g>=0;g--)c[g][0].each(function(){d.push(this)});return a(d)},_removeCurrentsFromItems:function(){for(var g=this.currentItem.find(":data("+this.widgetName+"-item)"),d=0;d=0;f--)for(var i=a(e[f]),b=i.length-1;b>=0;b--){var h=a.data(i[b],this.widgetName);if(h&&h!=this&&!h.options.disabled){c.push([a.isFunction(h.options.items)?h.options.items.call(h.element[0],g,{item:this.currentItem}):a(h.options.items,h.element),h]);this.containers.push(h)}}for(f=c.length-1;f>=0;f--){g=c[f][1];e=c[f][0];b=0;for(i=e.length;b< -i;b++){h=a(e[b]);h.data(this.widgetName+"-item",g);d.push({item:h,instance:g,width:0,height:0,left:0,top:0})}}},refreshPositions:function(g){if(this.offsetParent&&this.helper)this.offset.parent=this._getParentOffset();for(var d=this.items.length-1;d>=0;d--){var c=this.items[d];if(!(c.instance!=this.currentContainer&&this.currentContainer&&c.item[0]!=this.currentItem[0])){var e=this.options.toleranceElement?a(this.options.toleranceElement,c.item):c.item;if(!g){c.width=e.outerWidth();c.height=e.outerHeight()}e= -e.offset();c.left=e.left;c.top=e.top}}if(this.options.custom&&this.options.custom.refreshContainers)this.options.custom.refreshContainers.call(this);else for(d=this.containers.length-1;d>=0;d--){e=this.containers[d].element.offset();this.containers[d].containerCache.left=e.left;this.containers[d].containerCache.top=e.top;this.containers[d].containerCache.width=this.containers[d].element.outerWidth();this.containers[d].containerCache.height=this.containers[d].element.outerHeight()}return this},_createPlaceholder:function(g){var d= -g||this,c=d.options;if(!c.placeholder||c.placeholder.constructor==String){var e=c.placeholder;c.placeholder={element:function(){var f=a(document.createElement(d.currentItem[0].nodeName)).addClass(e||d.currentItem[0].className+" ui-sortable-placeholder").removeClass("ui-sortable-helper")[0];if(!e)f.style.visibility="hidden";return f},update:function(f,i){if(!(e&&!c.forcePlaceholderSize)){i.height()||i.height(d.currentItem.innerHeight()-parseInt(d.currentItem.css("paddingTop")||0,10)-parseInt(d.currentItem.css("paddingBottom")|| -0,10));i.width()||i.width(d.currentItem.innerWidth()-parseInt(d.currentItem.css("paddingLeft")||0,10)-parseInt(d.currentItem.css("paddingRight")||0,10))}}}}d.placeholder=a(c.placeholder.element.call(d.element,d.currentItem));d.currentItem.after(d.placeholder);c.placeholder.update(d,d.placeholder)},_contactContainers:function(g){for(var d=null,c=null,e=this.containers.length-1;e>=0;e--)if(!a.contains(this.currentItem[0],this.containers[e].element[0]))if(this._intersectsWith(this.containers[e].containerCache)){if(!(d&& -a.contains(this.containers[e].element[0],d.element[0]))){d=this.containers[e];c=e}}else if(this.containers[e].containerCache.over){this.containers[e]._trigger("out",g,this._uiHash(this));this.containers[e].containerCache.over=0}if(d)if(this.containers.length===1){this.containers[c]._trigger("over",g,this._uiHash(this));this.containers[c].containerCache.over=1}else if(this.currentContainer!=this.containers[c]){d=1E4;e=null;for(var f=this.positionAbs[this.containers[c].floating?"left":"top"],i=this.items.length- -1;i>=0;i--)if(a.contains(this.containers[c].element[0],this.items[i].item[0])){var b=this.items[i][this.containers[c].floating?"left":"top"];if(Math.abs(b-f) -this.containment[2])f=this.containment[2]+this.offset.click.left;if(g.pageY-this.offset.click.top>this.containment[3])i=this.containment[3]+this.offset.click.top}if(d.grid){i=this.originalPageY+Math.round((i-this.originalPageY)/d.grid[1])*d.grid[1];i=this.containment?!(i-this.offset.click.topthis.containment[3])?i:!(i-this.offset.click.topthis.containment[2])?f:!(f-this.offset.click.left=0;e--)if(a.contains(this.containers[e].element[0],this.currentItem[0])&&!d){c.push(function(f){return function(i){f._trigger("receive",i,this._uiHash(this))}}.call(this,this.containers[e]));c.push(function(f){return function(i){f._trigger("update", -i,this._uiHash(this))}}.call(this,this.containers[e]))}}for(e=this.containers.length-1;e>=0;e--){d||c.push(function(f){return function(i){f._trigger("deactivate",i,this._uiHash(this))}}.call(this,this.containers[e]));if(this.containers[e].containerCache.over){c.push(function(f){return function(i){f._trigger("out",i,this._uiHash(this))}}.call(this,this.containers[e]));this.containers[e].containerCache.over=0}}this._storedCursor&&a("body").css("cursor",this._storedCursor);this._storedOpacity&&this.helper.css("opacity", -this._storedOpacity);if(this._storedZIndex)this.helper.css("zIndex",this._storedZIndex=="auto"?"":this._storedZIndex);this.dragging=false;if(this.cancelHelperRemoval){if(!d){this._trigger("beforeStop",g,this._uiHash());for(e=0;e").addClass("ui-effects-wrapper").css({fontSize:"100%",background:"transparent",border:"none",margin:0,padding:0}), -n={width:l.width(),height:l.height()},o=document.activeElement;l.wrap(m);if(l[0]===o||a.contains(l[0],o))a(o).focus();m=l.parent();if(l.css("position")==="static"){m.css({position:"relative"});l.css({position:"relative"})}else{a.extend(j,{position:l.css("position"),zIndex:l.css("z-index")});a.each(["top","left","bottom","right"],function(p,q){j[q]=l.css(q);if(isNaN(parseInt(j[q],10)))j[q]="auto"});l.css({position:"relative",top:0,left:0,right:"auto",bottom:"auto"})}l.css(n);return m.css(j).show()}, -removeWrapper:function(l){var j=document.activeElement;if(l.parent().is(".ui-effects-wrapper")){l.parent().replaceWith(l);if(l[0]===j||a.contains(l[0],j))a(j).focus()}return l},setTransition:function(l,j,m,n){n=n||{};a.each(j,function(o,p){var q=l.cssUnit(p);if(q[0]>0)n[p]=q[0]*m+q[1]});return n}});a.fn.extend({effect:function(){function l(q){function u(){a.isFunction(r)&&r.call(s[0]);a.isFunction(q)&&q()}var s=a(this),r=j.complete,t=j.mode;(s.is(":hidden")?t==="hide":t==="show")?u():o.call(s[0], -j,u)}var j=e.apply(this,arguments),m=j.mode,n=j.queue,o=a.effects.effect[j.effect],p=!o&&i&&a.effects[j.effect];if(a.fx.off||!(o||p))return m?this[m](j.duration,j.complete):this.each(function(){j.complete&&j.complete.call(this)});return o?n===false?this.each(l):this.queue(n||"fx",l):p.call(this,{options:j,duration:j.duration,callback:j.complete,mode:j.mode})},_show:a.fn.show,show:function(l){if(f(l))return this._show.apply(this,arguments);else{var j=e.apply(this,arguments);j.mode="show";return this.effect.call(this, -j)}},_hide:a.fn.hide,hide:function(l){if(f(l))return this._hide.apply(this,arguments);else{var j=e.apply(this,arguments);j.mode="hide";return this.effect.call(this,j)}},__toggle:a.fn.toggle,toggle:function(l){if(f(l)||typeof l==="boolean"||a.isFunction(l))return this.__toggle.apply(this,arguments);else{var j=e.apply(this,arguments);j.mode="toggle";return this.effect.call(this,j)}},cssUnit:function(l){var j=this.css(l),m=[];a.each(["em","px","%","pt"],function(n,o){if(j.indexOf(o)>0)m=[parseFloat(j), -o]});return m}});a.easing.jswing=a.easing.swing;a.extend(a.easing,{def:"easeOutQuad",swing:function(l,j,m,n,o){return a.easing[a.easing.def](l,j,m,n,o)},easeInQuad:function(l,j,m,n,o){return n*(j/=o)*j+m},easeOutQuad:function(l,j,m,n,o){return-n*(j/=o)*(j-2)+m},easeInOutQuad:function(l,j,m,n,o){if((j/=o/2)<1)return n/2*j*j+m;return-n/2*(--j*(j-2)-1)+m},easeInCubic:function(l,j,m,n,o){return n*(j/=o)*j*j+m},easeOutCubic:function(l,j,m,n,o){return n*((j=j/o-1)*j*j+1)+m},easeInOutCubic:function(l,j, -m,n,o){if((j/=o/2)<1)return n/2*j*j*j+m;return n/2*((j-=2)*j*j+2)+m},easeInQuart:function(l,j,m,n,o){return n*(j/=o)*j*j*j+m},easeOutQuart:function(l,j,m,n,o){return-n*((j=j/o-1)*j*j*j-1)+m},easeInOutQuart:function(l,j,m,n,o){if((j/=o/2)<1)return n/2*j*j*j*j+m;return-n/2*((j-=2)*j*j*j-2)+m},easeInQuint:function(l,j,m,n,o){return n*(j/=o)*j*j*j*j+m},easeOutQuint:function(l,j,m,n,o){return n*((j=j/o-1)*j*j*j*j+1)+m},easeInOutQuint:function(l,j,m,n,o){if((j/=o/2)<1)return n/2*j*j*j*j*j+m;return n/2* -((j-=2)*j*j*j*j+2)+m},easeInSine:function(l,j,m,n,o){return-n*Math.cos(j/o*(Math.PI/2))+n+m},easeOutSine:function(l,j,m,n,o){return n*Math.sin(j/o*(Math.PI/2))+m},easeInOutSine:function(l,j,m,n,o){return-n/2*(Math.cos(Math.PI*j/o)-1)+m},easeInExpo:function(l,j,m,n,o){return j==0?m:n*Math.pow(2,10*(j/o-1))+m},easeOutExpo:function(l,j,m,n,o){return j==o?m+n:n*(-Math.pow(2,-10*j/o)+1)+m},easeInOutExpo:function(l,j,m,n,o){if(j==0)return m;if(j==o)return m+n;if((j/=o/2)<1)return n/2*Math.pow(2,10*(j-1))+ -m;return n/2*(-Math.pow(2,-10*--j)+2)+m},easeInCirc:function(l,j,m,n,o){return-n*(Math.sqrt(1-(j/=o)*j)-1)+m},easeOutCirc:function(l,j,m,n,o){return n*Math.sqrt(1-(j=j/o-1)*j)+m},easeInOutCirc:function(l,j,m,n,o){if((j/=o/2)<1)return-n/2*(Math.sqrt(1-j*j)-1)+m;return n/2*(Math.sqrt(1-(j-=2)*j)+1)+m},easeInElastic:function(l,j,m,n,o){l=1.70158;var p=o*0.3,q=n;if(j==0)return m;if((j/=o)==1)return m+n;if(q1&&q.splice.apply(q,[1,0].concat(q.splice(u,l+1)));c.dequeue()}})(jQuery); -(function(a){a.effects.effect.clip=function(g,d){var c=a(this),e=["position","top","bottom","left","right","height","width"],f=a.effects.setMode(c,g.mode||"hide")==="show",i=(g.direction||"vertical")==="vertical",b=i?"height":"width";i=i?"top":"left";var h={},k,l;a.effects.save(c,e);c.show();k=a.effects.createWrapper(c).css({overflow:"hidden"});k=c[0].tagName==="IMG"?k:c;l=k[b]();if(f){k.css(b,0);k.css(i,l/2)}h[b]=f?l:0;h[i]=f?0:l/2;k.animate(h,{queue:false,duration:g.duration,easing:g.easing,complete:function(){f|| -c.hide();a.effects.restore(c,e);a.effects.removeWrapper(c);d()}})}})(jQuery); -(function(a){a.effects.effect.drop=function(g,d){var c=a(this),e=["position","top","bottom","left","right","opacity","height","width"],f=a.effects.setMode(c,g.mode||"hide"),i=f==="show",b=g.direction||"left",h=b==="up"||b==="down"?"top":"left";b=b==="up"||b==="left"?"pos":"neg";var k={opacity:i?1:0},l;a.effects.save(c,e);c.show();a.effects.createWrapper(c);l=g.distance||c[h=="top"?"outerHeight":"outerWidth"]({margin:true})/2;if(i)c.css("opacity",0).css(h,b=="pos"?-l:l);k[h]=(i?b==="pos"?"+=":"-=": -b==="pos"?"-=":"+=")+l;c.animate(k,{queue:false,duration:g.duration,easing:g.easing,complete:function(){f=="hide"&&c.hide();a.effects.restore(c,e);a.effects.removeWrapper(c);d()}})}})(jQuery); -(function(a){a.effects.effect.explode=function(g,d){function c(){j.push(this);if(j.length==e*f){i.css({visibility:"visible"});a(j).remove();b||i.hide();d()}}var e=g.pieces?Math.round(Math.sqrt(g.pieces)):3,f=e,i=a(this),b=a.effects.setMode(i,g.mode||"hide")==="show",h=i.show().css("visibility","hidden").offset(),k=Math.ceil(i.outerWidth()/f),l=Math.ceil(i.outerHeight()/e),j=[],m,n,o,p,q,u;for(m=0;m").css({position:"absolute", -visibility:"visible",left:-n*k,top:-m*l}).parent().addClass("ui-effects-explode").css({position:"absolute",overflow:"hidden",width:k,height:l,left:o+(b?q*k:0),top:p+(b?u*l:0),opacity:b?0:1}).animate({left:o+(b?0:q*k),top:p+(b?0:u*l),opacity:b?1:0},g.duration||500,g.easing,c)}}}})(jQuery); -(function(a){a.effects.effect.fade=function(g,d){var c=a(this),e=a.effects.setMode(c,g.mode||"toggle")==="hide";c.show();c.animate({opacity:e?0:1},{queue:false,duration:g.duration,easing:g.easing,complete:function(){e&&c.hide();d()}})}})(jQuery); -(function(a){a.effects.effect.fold=function(g,d){var c=a(this),e=["position","top","bottom","left","right","height","width"],f=a.effects.setMode(c,g.mode||"hide"),i=f==="show",b=f==="hide";f=g.size||15;var h=/([0-9]+)%/.exec(f),k=!!g.horizFirst,l=i!=k,j=l?["width","height"]:["height","width"],m=g.duration/2,n,o={},p={};a.effects.save(c,e);c.show();n=a.effects.createWrapper(c).css({overflow:"hidden"});l=l?[n.width(),n.height()]:[n.height(),n.width()];if(h)f=parseInt(h[1],10)/100*l[b?0:1];if(i)n.css(k? -{height:0,width:f}:{height:f,width:0});o[j[0]]=i?l[0]:f;p[j[1]]=i?l[1]:0;n.animate(o,m,g.easing).animate(p,m,g.easing,function(){b&&c.hide();a.effects.restore(c,e);a.effects.removeWrapper(c);d()})}})(jQuery); -(function(a){a.effects.effect.highlight=function(g,d){var c=a(this),e=["backgroundImage","backgroundColor","opacity"],f=a.effects.setMode(c,g.mode||"show"),i={backgroundColor:c.css("backgroundColor")};if(f==="hide")i.opacity=0;a.effects.save(c,e);c.show().css({backgroundImage:"none",backgroundColor:g.color||"#ffff99"}).animate(i,{queue:false,duration:g.duration,easing:g.easing,complete:function(){f==="hide"&&c.hide();a.effects.restore(c,e);d()}})}})(jQuery); -(function(a){a.effects.effect.pulsate=function(g,d){var c=a(this),e=a.effects.setMode(c,g.mode||"show"),f=e==="show",i=e==="hide";e=(g.times||5)*2+(f||e==="hide"?1:0);var b=g.duration/e,h=0,k=c.queue(),l=k.length;if(f||!c.is(":visible")){c.css("opacity",0).show();h=1}for(f=1;f1&&k.splice.apply(k,[1,0].concat(k.splice(l,e+1)));c.dequeue()}})(jQuery); -(function(a){a.effects.effect.puff=function(g,d){var c=a(this),e=a.effects.setMode(c,g.mode||"hide"),f=e==="hide",i=parseInt(g.percent,10)||150,b=i/100,h={height:c.height(),width:c.width()};a.extend(g,{effect:"scale",queue:false,fade:true,mode:e,complete:d,percent:f?i:100,from:f?h:{height:h.height*b,width:h.width*b}});c.effect(g)};a.effects.effect.scale=function(g,d){var c=a(this),e=a.extend(true,{},g),f=a.effects.setMode(c,g.mode||"effect"),i=parseInt(g.percent,10)||(parseInt(g.percent,10)==0?0: -f=="hide"?0:100),b=g.direction||"both",h=g.origin,k={height:c.height(),width:c.width(),outerHeight:c.outerHeight(),outerWidth:c.outerWidth()};i={y:b!="horizontal"?i/100:1,x:b!="vertical"?i/100:1};e.effect="size";e.queue=false;e.complete=d;if(f!="effect"){e.origin=h||["middle","center"];e.restore=true}e.from=g.from||(f=="show"?{height:0,width:0}:k);e.to={height:k.height*i.y,width:k.width*i.x,outerHeight:k.outerHeight*i.y,outerWidth:k.outerWidth*i.x};if(e.fade){if(f=="show"){e.from.opacity=0;e.to.opacity= -1}if(f=="hide"){e.from.opacity=1;e.to.opacity=0}}c.effect(e)};a.effects.effect.size=function(g,d){var c=a(this),e=["position","top","bottom","left","right","width","height","overflow","opacity"],f=["position","top","bottom","left","right","overflow","opacity"],i=["width","height","overflow"],b=["fontSize"],h=["borderTopWidth","borderBottomWidth","paddingTop","paddingBottom"],k=["borderLeftWidth","borderRightWidth","paddingLeft","paddingRight"],l=a.effects.setMode(c,g.mode||"effect"),j=g.restore|| -l!=="effect",m=g.scale||"both",n=g.origin||["middle","center"],o,p,q,u=c.css("position"),s=c.css("bottom")!=="auto"?"bottom":"top";originalHorizontalPositioning=c.css("right")!=="auto"?"right":"left";l==="show"&&c.show();o={height:c.height(),width:c.width(),outerHeight:c.outerHeight(),outerWidth:c.outerWidth()};c.from=g.from||o;c.to=g.to||o;q={from:{y:c.from.height/o.height,x:c.from.width/o.width},to:{y:c.to.height/o.height,x:c.to.width/o.width}};if(m=="box"||m=="both"){if(q.from.y!==q.to.y){e=e.concat(h); -c.from=a.effects.setTransition(c,h,q.from.y,c.from);c.to=a.effects.setTransition(c,h,q.to.y,c.to)}if(q.from.x!==q.to.x){e=e.concat(k);c.from=a.effects.setTransition(c,k,q.from.x,c.from);c.to=a.effects.setTransition(c,k,q.to.x,c.to)}}if(m=="content"||m=="both")if(q.from.y!==q.to.y){e=e.concat(b);c.from=a.effects.setTransition(c,b,q.from.y,c.from);c.to=a.effects.setTransition(c,b,q.to.y,c.to)}a.effects.save(c,j?e:f);c.show();a.effects.createWrapper(c);c.css("overflow","hidden").css(c.from);if(n){p= -a.effects.getBaseline(n,o);c.from.top=(o.outerHeight-c.outerHeight())*p.y;c.from.left=(o.outerWidth-c.outerWidth())*p.x;c.to.top=(o.outerHeight-c.to.outerHeight)*p.y;c.to.left=(o.outerWidth-c.to.outerWidth)*p.x}c.css(c.from);if(m=="content"||m=="both"){h=h.concat(["marginTop","marginBottom"]).concat(b);k=k.concat(["marginLeft","marginRight"]);i=e.concat(h).concat(k);c.find("*[width]").each(function(){var r=a(this),t={height:r.height(),width:r.width()};j&&a.effects.save(r,i);r.from={height:t.height* -q.from.y,width:t.width*q.from.x};r.to={height:t.height*q.to.y,width:t.width*q.to.x};if(q.from.y!=q.to.y){r.from=a.effects.setTransition(r,h,q.from.y,r.from);r.to=a.effects.setTransition(r,h,q.to.y,r.to)}if(q.from.x!=q.to.x){r.from=a.effects.setTransition(r,k,q.from.x,r.from);r.to=a.effects.setTransition(r,k,q.to.x,r.to)}r.css(r.from);r.animate(r.to,g.duration,g.easing,function(){j&&a.effects.restore(r,i)})})}c.animate(c.to,{queue:false,duration:g.duration,easing:g.easing,complete:function(){c.to.opacity=== -0&&c.css("opacity",c.from.opacity);l=="hide"&&c.hide();a.effects.restore(c,j?e:f);j||(u==="static"?c.css({position:"relative",top:c.to.top,left:c.to.left}):a.each([s,originalHorizontalPositioning],function(r,t){c.css(t,function(v,w){var x=parseInt(w,10),C=r?c.to.left:c.to.top,A=r?c.to.outerWidth-c.from.outerWidth:c.to.outerHeight-c.from.outerHeight,y=n[r]===t,D=n[r]==="middle"||n[r]==="center";if(w==="auto")return C+"px";if(!(t=="left"||t=="top"))if(u==="relative")C*=-1;else D||(C-=A*(y?-1:1));return x+ -C+"px"})}));a.effects.removeWrapper(c);d()}})}})(jQuery); -(function(a){a.effects.effect.shake=function(g,d){var c=a(this),e=["position","top","bottom","left","right","height","width"],f=a.effects.setMode(c,g.mode||"effect"),i=g.direction||"left",b=g.distance||20,h=g.times||3,k=h*2+1,l=g.duration,j=i=="up"||i=="down"?"top":"left",m=i=="up"||i=="left";i={};var n={},o={},p=c.queue(),q=p.length;a.effects.save(c,e);c.show();a.effects.createWrapper(c);i[j]=(m?"-=":"+=")+b;n[j]=(m?"+=":"-=")+b*2;o[j]=(m?"-=":"+=")+b*2;c.animate(i,l,g.easing);for(b=1;b1&&p.splice.apply(p,[1,0].concat(p.splice(q,k+1)));c.dequeue()}})(jQuery); -(function(a){a.effects.effect.slide=function(g,d){var c=a(this),e=["position","top","bottom","left","right","width","height"],f=a.effects.setMode(c,g.mode||"show"),i=f==="show",b=g.direction||"left",h=b=="up"||b=="down"?"top":"left";b=b=="up"||b=="left";var k,l={};a.effects.save(c,e);c.show();k=g.distance||c[h==="top"?"outerHeight":"outerWidth"]({margin:true});a.effects.createWrapper(c).css({overflow:"hidden"});if(i)c.css(h,b?isNaN(k)?"-"+k:-k:k);l[h]=(i?b?"+=":"-=":b?"-=":"+=")+k;c.animate(l,{queue:false, -duration:g.duration,easing:g.easing,complete:function(){f==="hide"&&c.hide();a.effects.restore(c,e);a.effects.removeWrapper(c);d()}})}})(jQuery); -(function(a){a.effects.effect.transfer=function(g,d){var c=a(this),e=a(g.to),f=e.css("position")==="fixed",i=a("body"),b=f?i.scrollTop():0;i=f?i.scrollLeft():0;var h=e.offset();e={top:h.top-b,left:h.left-i,height:e.innerHeight(),width:e.innerWidth()};h=c.offset();var k=a('
    ').appendTo(document.body).addClass(g.className).css({top:h.top-b,left:h.left-i,height:c.innerHeight(),width:c.innerWidth(),position:f?"fixed":"absolute"}).animate(e,g.duration,g.easing,function(){k.remove(); -d()})}})(jQuery); -(function(a){a.widget("ui.accordion",{version:"1.9pre",options:{active:0,animated:"slide",collapsible:false,event:"click",header:"> li > :first-child,> :not(li):even",heightStyle:"auto",icons:{activeHeader:"ui-icon-triangle-1-s",header:"ui-icon-triangle-1-e"},activate:null,beforeActivate:null},_create:function(){var g=this.options;this.lastToggle={};this.element.addClass("ui-accordion ui-widget ui-helper-reset");this.headers=this.element.find(g.header).addClass("ui-accordion-header ui-helper-reset ui-state-default ui-corner-all");this._hoverable(this.headers); -this._focusable(this.headers);this.headers.find(":first-child").addClass("ui-accordion-heading");this.headers.next().addClass("ui-accordion-content ui-helper-reset ui-widget-content ui-corner-bottom");if(!g.collapsible&&g.active===false)g.active=0;if(g.active<0)g.active+=this.headers.length;this.active=this._findActive(g.active).addClass("ui-state-default ui-state-active").toggleClass("ui-corner-all").toggleClass("ui-corner-top");this.active.next().addClass("ui-accordion-content-active");this._createIcons(); -this.refresh();this.element.attr("role","tablist");this.headers.attr("role","tab").bind("keydown.accordion",a.proxy(this,"_keydown")).next().attr("role","tabpanel");this.headers.not(this.active).attr({"aria-expanded":"false","aria-selected":"false",tabIndex:-1}).next().hide();this.active.length?this.active.attr({"aria-expanded":"true","aria-selected":"true",tabIndex:0}):this.headers.eq(0).attr("tabIndex",0);a.browser.safari||this.headers.find("a").attr("tabIndex",-1);this._setupEvents(g.event)},_createIcons:function(){var g= -this.options.icons;if(g){a("").addClass("ui-accordion-header-icon ui-icon "+g.header).prependTo(this.headers);this.active.children(".ui-accordion-header-icon").removeClass(g.header).addClass(g.activeHeader);this.element.addClass("ui-accordion-icons")}},_destroyIcons:function(){this.headers.children(".ui-accordion-header-icon").remove();this.element.removeClass("ui-accordion-icons")},_destroy:function(){this.element.removeClass("ui-accordion ui-widget ui-helper-reset").removeAttr("role");this.headers.unbind(".accordion").removeClass("ui-accordion-header ui-accordion-disabled ui-helper-reset ui-state-default ui-corner-all ui-state-active ui-state-disabled ui-corner-top").removeAttr("role").removeAttr("aria-expanded").removeAttr("aria-selected").removeAttr("tabIndex").find("a").removeAttr("tabIndex").end().find(".ui-accordion-heading").removeClass("ui-accordion-heading"); -this._destroyIcons();var g=this.headers.next().css("display","").removeAttr("role").removeClass("ui-helper-reset ui-widget-content ui-corner-bottom ui-accordion-content ui-accordion-content-active ui-accordion-disabled ui-state-disabled");this.options.heightStyle!=="content"&&g.css("height","")},_setOption:function(g,d){if(g==="active")this._activate(d);else{if(g==="event"){this.options.event&&this.headers.unbind(this.options.event+".accordion",this._eventHandler);this._setupEvents(d)}this._super("_setOption", -g,d);g==="collapsible"&&!d&&this.options.active===false&&this._activate(0);if(g==="icons"){this._destroyIcons();d&&this._createIcons()}g==="disabled"&&this.headers.add(this.headers.next()).toggleClass("ui-accordion-disabled ui-state-disabled",!!d)}},_keydown:function(g){if(!(this.options.disabled||g.altKey||g.ctrlKey)){var d=a.ui.keyCode,c=this.headers.length,e=this.headers.index(g.target),f=false;switch(g.keyCode){case d.RIGHT:case d.DOWN:f=this.headers[(e+1)%c];break;case d.LEFT:case d.UP:f=this.headers[(e- -1+c)%c];break;case d.SPACE:case d.ENTER:this._eventHandler(g)}if(f){a(g.target).attr("tabIndex",-1);a(f).attr("tabIndex",0);f.focus();g.preventDefault()}}},refresh:function(){var g=this.options,d=this.element.parent(),c,e;if(g.heightStyle==="fill"){if(!a.support.minHeight){e=d.css("overflow");d.css("overflow","hidden")}c=d.height();this.element.siblings(":visible").each(function(){var f=a(this),i=f.css("position");i==="absolute"||i==="fixed"||(c-=f.outerHeight(true))});e&&d.css("overflow",e);this.headers.each(function(){c-= -a(this).outerHeight(true)});this.headers.next().each(function(){a(this).height(Math.max(0,c-a(this).innerHeight()+a(this).height()))}).css("overflow","auto")}else if(g.heightStyle==="auto"){c=0;this.headers.next().each(function(){c=Math.max(c,a(this).height("").height())}).height(c)}return this},_activate:function(g){g=this._findActive(g)[0];if(g!==this.active[0]){g=g||this.active[0];this._eventHandler({target:g,currentTarget:g,preventDefault:a.noop})}},_findActive:function(g){return typeof g==="number"? -this.headers.eq(g):a()},_setupEvents:function(g){g&&this.headers.bind(g.split(" ").join(".accordion ")+".accordion",a.proxy(this,"_eventHandler"))},_eventHandler:function(g){var d=this.options,c=this.active,e=a(g.currentTarget),f=e[0]===c[0],i=f&&d.collapsible,b=i?a():e.next(),h=c.next();b={oldHeader:c,oldContent:h,newHeader:i?a():e,newContent:b};g.preventDefault();if(!(d.disabled||f&&!d.collapsible||this._trigger("beforeActivate",g,b)===false)){d.active=i?false:this.headers.index(e);this.active= -f?a():e;this._toggle(b);c.removeClass("ui-state-active ui-corner-top").addClass("ui-state-default ui-corner-all").children(".ui-accordion-header-icon").removeClass(d.icons.activeHeader).addClass(d.icons.header);if(!f){e.removeClass("ui-state-default ui-corner-all").addClass("ui-state-active ui-corner-top").children(".ui-accordion-header-icon").removeClass(d.icons.header).addClass(d.icons.activeHeader);e.next().addClass("ui-accordion-content-active")}}},_toggle:function(g){function d(){c._completed(g)} -var c=this,e=c.options,f=g.newContent,i=g.oldContent;if(e.animated){var b=a.ui.accordion.animations;e=e.animated;var h;if(!b[e]){h={easing:a.easing[e]?e:"slide",duration:700};e="slide"}b[e]({widget:c,toShow:f,toHide:i,prevShow:c.lastToggle.toShow,prevHide:c.lastToggle.toHide,complete:d,down:f.length&&(!i.length||f.index()",options:{appendTo:"body",autoFocus:false,delay:300,minLength:1,position:{my:"left top",at:"left bottom",collision:"none"},source:null,change:null,close:null,focus:null,open:null,response:null,search:null,select:null},pending:0,_create:function(){var d=this,c=this.element[0].ownerDocument,e,f;this.valueMethod=this.element[this.element.is("input,textarea")?"val":"text"];this.element.addClass("ui-autocomplete-input").attr("autocomplete", -"off").attr({role:"textbox","aria-autocomplete":"list","aria-haspopup":"true"}).bind("keydown.autocomplete",function(i){if(d.options.disabled||d.element.prop("readOnly"))f=e=true;else{f=e=false;var b=a.ui.keyCode;switch(i.keyCode){case b.PAGE_UP:e=true;d._move("previousPage",i);break;case b.PAGE_DOWN:e=true;d._move("nextPage",i);break;case b.UP:e=true;d._move("previous",i);i.preventDefault();break;case b.DOWN:e=true;d._move("next",i);i.preventDefault();break;case b.ENTER:case b.NUMPAD_ENTER:if(d.menu.active){e= -true;i.preventDefault()}case b.TAB:if(!d.menu.active)break;d.menu.select(i);break;case b.ESCAPE:if(d.menu.element.is(":visible")){d._value(d.term);d.close(i)}break;default:d._searchTimeout(i)}}}).bind("keypress.autocomplete",function(i){if(e){e=false;i.preventDefault()}else{var b=a.ui.keyCode;switch(i.keyCode){case b.PAGE_UP:d._move("previousPage",i);break;case b.PAGE_DOWN:d._move("nextPage",i);break;case b.UP:d._move("previous",i);i.preventDefault();break;case b.DOWN:d._move("next",i);i.preventDefault()}}}).bind("input.autocomplete", -function(i){if(f){f=false;i.preventDefault()}else d._searchTimeout(i)}).bind("focus.autocomplete",function(){if(!d.options.disabled){d.selectedItem=null;d.previous=d._value()}}).bind("blur.autocomplete",function(i){if(!d.options.disabled){clearTimeout(d.searching);d.closing=setTimeout(function(){d.close(i);d._change(i)},150)}});this._initSource();this.response=function(){return d._response.apply(d,arguments)};this.menu=a("
      ").addClass("ui-autocomplete").appendTo(a(this.options.appendTo||"body", -c)[0]).mousedown(function(i){var b=d.menu.element[0];a(i.target).closest(".ui-menu-item").length||setTimeout(function(){a(document).one("mousedown",function(h){h.target!==d.element[0]&&h.target!==b&&!a.contains(b,h.target)&&d.close()})},1);setTimeout(function(){clearTimeout(d.closing)},13)}).menu({input:a(),focus:function(i,b){var h=b.item.data("item.autocomplete");false!==d._trigger("focus",i,{item:h})&&/^key/.test(i.originalEvent.type)&&d._value(h.value)},select:function(i,b){var h=b.item.data("item.autocomplete"), -k=d.previous;if(d.element[0]!==c.activeElement){d.element.focus();d.previous=k;setTimeout(function(){d.previous=k;d.selectedItem=h},1)}false!==d._trigger("select",i,{item:h})&&d._value(h.value);d.term=d._value();d.close(i);d.selectedItem=h}}).zIndex(this.element.zIndex()+1).hide().data("menu");a.fn.bgiframe&&this.menu.element.bgiframe()},_destroy:function(){clearTimeout(this.searching);this.element.removeClass("ui-autocomplete-input").removeAttr("autocomplete").removeAttr("role").removeAttr("aria-autocomplete").removeAttr("aria-haspopup"); -this.menu.element.remove()},_setOption:function(d,c){this._super("_setOption",d,c);d==="source"&&this._initSource();if(d==="appendTo")this.menu.element.appendTo(a(c||"body",this.element[0].ownerDocument)[0]);d==="disabled"&&c&&this.xhr&&this.xhr.abort()},_initSource:function(){var d=this,c,e;if(a.isArray(this.options.source)){c=this.options.source;this.source=function(f,i){i(a.ui.autocomplete.filter(c,f.term))}}else if(typeof this.options.source==="string"){e=this.options.source;this.source=function(f, -i){d.xhr&&d.xhr.abort();d.xhr=a.ajax({url:e,data:f,dataType:"json",autocompleteRequest:++g,success:function(b){this.autocompleteRequest===g&&i(b)},error:function(){this.autocompleteRequest===g&&i([])}})}}else this.source=this.options.source},_searchTimeout:function(d){var c=this;clearTimeout(c.searching);c.searching=setTimeout(function(){if(c.term!==c._value()){c.selectedItem=null;c.search(null,d)}},c.options.delay)},search:function(d,c){d=d!=null?d:this._value();this.term=this._value();if(d.length< -this.options.minLength)return this.close(c);clearTimeout(this.closing);if(this._trigger("search",c)!==false)return this._search(d)},_search:function(d){this.pending++;this.element.addClass("ui-autocomplete-loading");this.source({term:d},this.response)},_response:function(d){if(d)d=this._normalize(d);this._trigger("response",null,{content:d});if(!this.options.disabled&&d&&d.length){this._suggest(d);this._trigger("open")}else this.close();this.pending--;this.pending||this.element.removeClass("ui-autocomplete-loading")}, -close:function(d){clearTimeout(this.closing);if(this.menu.element.is(":visible")){this.menu.element.hide();this.menu.blur();this._trigger("close",d)}},_change:function(d){this.previous!==this._value()&&this._trigger("change",d,{item:this.selectedItem})},_normalize:function(d){if(d.length&&d[0].label&&d[0].value)return d;return a.map(d,function(c){if(typeof c==="string")return{label:c,value:c};return a.extend({label:c.label||c.value,value:c.value||c.label},c)})},_suggest:function(d){var c=this.menu.element.empty().zIndex(this.element.zIndex()+ -1);this._renderMenu(c,d);this.menu.blur();this.menu.refresh();c.show();this._resizeMenu();c.position(a.extend({of:this.element},this.options.position));this.options.autoFocus&&this.menu.next(new a.Event("mouseover"))},_resizeMenu:function(){var d=this.menu.element;d.outerWidth(Math.max(d.width("").outerWidth(),this.element.outerWidth()))},_renderMenu:function(d,c){var e=this;a.each(c,function(f,i){e._renderItem(d,i)})},_renderItem:function(d,c){return a("
    • ").data("item.autocomplete",c).append(a("").text(c.label)).appendTo(d)}, -_move:function(d,c){if(this.menu.element.is(":visible"))if(this.menu.first()&&/^previous/.test(d)||this.menu.last()&&/^next/.test(d)){this._value(this.term);this.menu.blur()}else this.menu[d](c);else this.search(null,c)},widget:function(){return this.menu.element},_value:function(){return this.valueMethod.apply(this.element,arguments)}});a.extend(a.ui.autocomplete,{escapeRegex:function(d){return d.replace(/[-[\]{}()*+?.,\\^$|#\s]/g,"\\$&")},filter:function(d,c){var e=RegExp(a.ui.autocomplete.escapeRegex(c), -"i");return a.grep(d,function(f){return e.test(f.label||f.value||f)})}})})(jQuery); -(function(a){var g,d,c,e,f=function(){var b=a(this).find(":ui-button");setTimeout(function(){b.button("refresh")},1)},i=function(b){var h=b.name,k=b.form,l=a([]);if(h)l=k?a(k).find("[name='"+h+"']"):a("[name='"+h+"']",b.ownerDocument).filter(function(){return!this.form});return l};a.widget("ui.button",{version:"1.9pre",defaultElement:"').addClass(this._triggerClass).html(j==""?k:a("").attr({src:j,alt:k,title:k})));b[l?"before":"after"](h.trigger);h.trigger.click(function(){a.datepicker._datepickerShowing&&a.datepicker._lastInput==b[0]?a.datepicker._hideDatepicker(): -a.datepicker._showDatepicker(b[0]);return false})}},_autoSize:function(b){if(this._get(b,"autoSize")&&!b.inline){var h=new Date(2009,11,20),k=this._get(b,"dateFormat");if(k.match(/[DM]/)){var l=function(j){for(var m=0,n=0,o=0;om){m=j[o].length;n=o}return n};h.setMonth(l(this._get(b,k.match(/MM/)?"monthNames":"monthNamesShort")));h.setDate(l(this._get(b,k.match(/DD/)?"dayNames":"dayNamesShort"))+20-h.getDay())}b.input.attr("size",this._formatDate(b,h).length)}},_inlineDatepicker:function(b, -h){var k=a(b);if(!k.hasClass(this.markerClassName)){k.addClass(this.markerClassName).append(h.dpDiv).bind("setData.datepicker",function(l,j,m){h.settings[j]=m}).bind("getData.datepicker",function(l,j){return this._get(h,j)});a.data(b,"datepicker",h);this._setDate(h,this._getDefaultDate(h),true);this._updateDatepicker(h);this._updateAlternate(h);h.settings.disabled&&this._disableDatepicker(b);h.dpDiv.css("display","block")}},_dialogDatepicker:function(b,h,k,l,j){b=this._dialogInst;if(!b){this.uuid+= -1;this._dialogInput=a('');this._dialogInput.keydown(this._doKeyDown);a("body").append(this._dialogInput);b=this._dialogInst=this._newInst(this._dialogInput,false);b.settings={};a.data(this._dialogInput[0],"datepicker",b)}e(b.settings,l||{});h=h&&h.constructor==Date?this._formatDate(b,h):h;this._dialogInput.val(h);this._pos=j?j.length?j:[j.pageX,j.pageY]:null;if(!this._pos)this._pos=[document.documentElement.clientWidth/ -2-100+(document.documentElement.scrollLeft||document.body.scrollLeft),document.documentElement.clientHeight/2-150+(document.documentElement.scrollTop||document.body.scrollTop)];this._dialogInput.css("left",this._pos[0]+20+"px").css("top",this._pos[1]+"px");b.settings.onSelect=k;this._inDialog=true;this.dpDiv.addClass(this._dialogClass);this._showDatepicker(this._dialogInput[0]);a.blockUI&&a.blockUI(this.dpDiv);a.data(this._dialogInput[0],"datepicker",b);return this},_destroyDatepicker:function(b){var h= -a(b),k=a.data(b,"datepicker");if(h.hasClass(this.markerClassName)){var l=b.nodeName.toLowerCase();a.removeData(b,"datepicker");if(l=="input"){k.append.remove();k.trigger.remove();h.removeClass(this.markerClassName).unbind("focus",this._showDatepicker).unbind("keydown",this._doKeyDown).unbind("keypress",this._doKeyPress).unbind("keyup",this._doKeyUp)}else if(l=="div"||l=="span")h.removeClass(this.markerClassName).empty()}},_enableDatepicker:function(b){var h=a(b),k=a.data(b,"datepicker");if(h.hasClass(this.markerClassName)){var l= -b.nodeName.toLowerCase();if(l=="input"){b.disabled=false;k.trigger.filter("button").each(function(){this.disabled=false}).end().filter("img").css({opacity:"1.0",cursor:""})}else if(l=="div"||l=="span"){h=h.children("."+this._inlineClass);h.children().removeClass("ui-state-disabled");h.find("select.ui-datepicker-month, select.ui-datepicker-year").prop("disabled",false)}this._disabledInputs=a.map(this._disabledInputs,function(j){return j==b?null:j})}},_disableDatepicker:function(b){var h=a(b),k=a.data(b, -"datepicker");if(h.hasClass(this.markerClassName)){var l=b.nodeName.toLowerCase();if(l=="input"){b.disabled=true;k.trigger.filter("button").each(function(){this.disabled=true}).end().filter("img").css({opacity:"0.5",cursor:"default"})}else if(l=="div"||l=="span"){h=h.children("."+this._inlineClass);h.children().addClass("ui-state-disabled");h.find("select.ui-datepicker-month, select.ui-datepicker-year").prop("disabled",true)}this._disabledInputs=a.map(this._disabledInputs,function(j){return j==b? -null:j});this._disabledInputs[this._disabledInputs.length]=b}},_isDisabledDatepicker:function(b){if(!b)return false;for(var h=0;h-1}},_doKeyUp:function(b){b=a.datepicker._getInst(b.target);if(b.input.val()!=b.lastVal)try{if(a.datepicker.parseDate(a.datepicker._get(b,"dateFormat"),b.input?b.input.val():null,a.datepicker._getFormatConfig(b))){a.datepicker._setDateFromField(b);a.datepicker._updateAlternate(b);a.datepicker._updateDatepicker(b)}}catch(h){a.datepicker.log(h)}return true},_showDatepicker:function(b){b=b.target||b;if(b.nodeName.toLowerCase()!= -"input")b=a("input",b.parentNode)[0];if(!(a.datepicker._isDisabledDatepicker(b)||a.datepicker._lastInput==b)){var h=a.datepicker._getInst(b);if(a.datepicker._curInst&&a.datepicker._curInst!=h){a.datepicker._curInst.dpDiv.stop(true,true);h&&a.datepicker._datepickerShowing&&a.datepicker._hideDatepicker(a.datepicker._curInst.input[0])}var k=a.datepicker._get(h,"beforeShow");k=k?k.apply(b,[b,h]):{};if(k!==false){e(h.settings,k);h.lastVal=null;a.datepicker._lastInput=b;a.datepicker._setDateFromField(h); -if(a.datepicker._inDialog)b.value="";if(!a.datepicker._pos){a.datepicker._pos=a.datepicker._findPos(b);a.datepicker._pos[1]+=b.offsetHeight}var l=false;a(b).parents().each(function(){l|=a(this).css("position")=="fixed";return!l});if(l&&a.browser.opera){a.datepicker._pos[0]-=document.documentElement.scrollLeft;a.datepicker._pos[1]-=document.documentElement.scrollTop}k={left:a.datepicker._pos[0],top:a.datepicker._pos[1]};a.datepicker._pos=null;h.dpDiv.empty();h.dpDiv.css({position:"absolute",display:"block", -top:"-1000px"});a.datepicker._updateDatepicker(h);k=a.datepicker._checkOffset(h,k,l);h.dpDiv.css({position:a.datepicker._inDialog&&a.blockUI?"static":l?"fixed":"absolute",display:"none",left:k.left+"px",top:k.top+"px"});if(!h.inline){k=a.datepicker._get(h,"showAnim");var j=a.datepicker._get(h,"duration"),m=function(){var n=h.dpDiv.find("iframe.ui-datepicker-cover");if(n.length){var o=a.datepicker._getBorders(h.dpDiv);n.css({left:-o[0],top:-o[1],width:h.dpDiv.outerWidth(),height:h.dpDiv.outerHeight()})}}; -h.dpDiv.zIndex(a(b).zIndex()+1);a.datepicker._datepickerShowing=true;if(a.effects&&(a.effects.effect[k]||a.effects[k]))h.dpDiv.show(k,a.datepicker._get(h,"showOptions"),j,m);else h.dpDiv[k||"show"](k?j:null,m);if(!k||!j)m();h.input.is(":visible")&&!h.input.is(":disabled")&&h.input.focus();a.datepicker._curInst=h}}}},_updateDatepicker:function(b){this.maxRows=4;var h=a.datepicker._getBorders(b.dpDiv);i=b;b.dpDiv.empty().append(this._generateHTML(b));var k=b.dpDiv.find("iframe.ui-datepicker-cover"); -k.length&&k.css({left:-h[0],top:-h[1],width:b.dpDiv.outerWidth(),height:b.dpDiv.outerHeight()});b.dpDiv.find("."+this._dayOverClass+" a").mouseover();h=this._getNumberOfMonths(b);k=h[1];b.dpDiv.removeClass("ui-datepicker-multi-2 ui-datepicker-multi-3 ui-datepicker-multi-4").width("");k>1&&b.dpDiv.addClass("ui-datepicker-multi-"+k).css("width",17*k+"em");b.dpDiv[(h[0]!=1||h[1]!=1?"add":"remove")+"Class"]("ui-datepicker-multi");b.dpDiv[(this._get(b,"isRTL")?"add":"remove")+"Class"]("ui-datepicker-rtl"); -b==a.datepicker._curInst&&a.datepicker._datepickerShowing&&b.input&&b.input.is(":visible")&&!b.input.is(":disabled")&&b.input[0]!=document.activeElement&&b.input.focus();if(b.yearshtml){var l=b.yearshtml;setTimeout(function(){l===b.yearshtml&&b.yearshtml&&b.dpDiv.find("select.ui-datepicker-year:first").replaceWith(b.yearshtml);l=b.yearshtml=null},0)}},_getBorders:function(b){var h=function(k){return{thin:1,medium:2,thick:3}[k]||k};return[parseFloat(h(b.css("border-left-width"))),parseFloat(h(b.css("border-top-width")))]}, -_checkOffset:function(b,h,k){var l=b.dpDiv.outerWidth(),j=b.dpDiv.outerHeight(),m=b.input?b.input.outerWidth():0,n=b.input?b.input.outerHeight():0,o=document.documentElement.clientWidth+a(document).scrollLeft(),p=document.documentElement.clientHeight+a(document).scrollTop();h.left-=this._get(b,"isRTL")?l-m:0;h.left-=k&&h.left==b.input.offset().left?a(document).scrollLeft():0;h.top-=k&&h.top==b.input.offset().top+n?a(document).scrollTop():0;h.left-=Math.min(h.left,h.left+l>o&&o>l?Math.abs(h.left+l- -o):0);h.top-=Math.min(h.top,h.top+j>p&&p>j?Math.abs(j+n):0);return h},_findPos:function(b){for(var h=this._get(this._getInst(b),"isRTL");b&&(b.type=="hidden"||b.nodeType!=1||a.expr.filters.hidden(b));)b=b[h?"previousSibling":"nextSibling"];b=a(b).offset();return[b.left,b.top]},_hideDatepicker:function(b){var h=this._curInst;if(!(!h||b&&h!=a.data(b,"datepicker")))if(this._datepickerShowing){b=this._get(h,"showAnim");var k=this._get(h,"duration"),l=function(){a.datepicker._tidyDialog(h);this._curInst= -null};if(a.effects&&(a.effects.effect[b]||a.effects[b]))h.dpDiv.hide(b,a.datepicker._get(h,"showOptions"),k,l);else h.dpDiv[b=="slideDown"?"slideUp":b=="fadeIn"?"fadeOut":"hide"](b?k:null,l);b||l();this._datepickerShowing=false;if(b=this._get(h,"onClose"))b.apply(h.input?h.input[0]:null,[h.input?h.input.val():"",h]);this._lastInput=null;if(this._inDialog){this._dialogInput.css({position:"absolute",left:"0",top:"-100px"});if(a.blockUI){a.unblockUI();a("body").append(this.dpDiv)}}this._inDialog=false}}, -_tidyDialog:function(b){b.dpDiv.removeClass(this._dialogClass).unbind(".ui-datepicker-calendar")},_checkExternalClick:function(b){if(a.datepicker._curInst){b=a(b.target);var h=a.datepicker._getInst(b[0]);if(b[0].id!=a.datepicker._mainDivId&&b.parents("#"+a.datepicker._mainDivId).length==0&&!b.hasClass(a.datepicker.markerClassName)&&!b.hasClass(a.datepicker._triggerClass)&&a.datepicker._datepickerShowing&&!(a.datepicker._inDialog&&a.blockUI)||b.hasClass(a.datepicker.markerClassName)&&a.datepicker._curInst!= -h)a.datepicker._hideDatepicker()}},_adjustDate:function(b,h,k){b=a(b);var l=this._getInst(b[0]);if(!this._isDisabledDatepicker(b[0])){this._adjustInstDate(l,h+(k=="M"?this._get(l,"showCurrentAtPos"):0),k);this._updateDatepicker(l)}},_gotoToday:function(b){b=a(b);var h=this._getInst(b[0]);if(this._get(h,"gotoCurrent")&&h.currentDay){h.selectedDay=h.currentDay;h.drawMonth=h.selectedMonth=h.currentMonth;h.drawYear=h.selectedYear=h.currentYear}else{var k=new Date;h.selectedDay=k.getDate();h.drawMonth= -h.selectedMonth=k.getMonth();h.drawYear=h.selectedYear=k.getFullYear()}this._notifyChange(h);this._adjustDate(b)},_selectMonthYear:function(b,h,k){b=a(b);var l=this._getInst(b[0]);l["selected"+(k=="M"?"Month":"Year")]=l["draw"+(k=="M"?"Month":"Year")]=parseInt(h.options[h.selectedIndex].value,10);this._notifyChange(l);this._adjustDate(b)},_selectDay:function(b,h,k,l){var j=a(b);if(!(a(l).hasClass(this._unselectableClass)||this._isDisabledDatepicker(j[0]))){j=this._getInst(j[0]);j.selectedDay=j.currentDay= -a("a",l).html();j.selectedMonth=j.currentMonth=h;j.selectedYear=j.currentYear=k;this._selectDate(b,this._formatDate(j,j.currentDay,j.currentMonth,j.currentYear))}},_clearDate:function(b){b=a(b);this._getInst(b[0]);this._selectDate(b,"")},_selectDate:function(b,h){var k=this._getInst(a(b)[0]);h=h!=null?h:this._formatDate(k);k.input&&k.input.val(h);this._updateAlternate(k);var l=this._get(k,"onSelect");if(l)l.apply(k.input?k.input[0]:null,[h,k]);else k.input&&k.input.trigger("change");if(k.inline)this._updateDatepicker(k); -else{this._hideDatepicker();this._lastInput=k.input[0];typeof k.input[0]!="object"&&k.input.focus();this._lastInput=null}},_updateAlternate:function(b){var h=this._get(b,"altField");if(h){var k=this._get(b,"altFormat")||this._get(b,"dateFormat"),l=this._getDate(b),j=this.formatDate(k,l,this._getFormatConfig(b));a(h).each(function(){a(this).val(j)})}},noWeekends:function(b){b=b.getDay();return[b>0&&b<6,""]},iso8601Week:function(b){b=new Date(b.getTime());b.setDate(b.getDate()+4-(b.getDay()||7));var h= -b.getTime();b.setMonth(0);b.setDate(1);return Math.floor(Math.round((h-b)/864E5)/7)+1},parseDate:function(b,h,k){if(b==null||h==null)throw"Invalid arguments";h=typeof h=="object"?h.toString():h+"";if(h=="")return null;var l=(k?k.shortYearCutoff:null)||this._defaults.shortYearCutoff;l=typeof l!="string"?l:(new Date).getFullYear()%100+parseInt(l,10);for(var j=(k?k.dayNamesShort:null)||this._defaults.dayNamesShort,m=(k?k.dayNames:null)||this._defaults.dayNames,n=(k?k.monthNamesShort:null)||this._defaults.monthNamesShort, -o=(k?k.monthNames:null)||this._defaults.monthNames,p=k=-1,q=-1,u=-1,s=false,r=function(y){(y=C+1-1){p=1;q=u;do{l=this._getDaysInMonth(k,p-1); -if(q<=l)break;p++;q-=l}while(1)}A=this._daylightSavingAdjust(new Date(k,p-1,q));if(A.getFullYear()!=k||A.getMonth()+1!=p||A.getDate()!=q)throw"Invalid date";return A},ATOM:"yy-mm-dd",COOKIE:"D, dd M yy",ISO_8601:"yy-mm-dd",RFC_822:"D, d M y",RFC_850:"DD, dd-M-y",RFC_1036:"D, d M y",RFC_1123:"D, d M yy",RFC_2822:"D, d M yy",RSS:"D, d M y",TICKS:"!",TIMESTAMP:"@",W3C:"yy-mm-dd",_ticksTo1970:(718685+Math.floor(492.5)-Math.floor(19.7)+Math.floor(4.925))*864E9,formatDate:function(b,h,k){if(!h)return""; -var l=(k?k.dayNamesShort:null)||this._defaults.dayNamesShort,j=(k?k.dayNames:null)||this._defaults.dayNames,m=(k?k.monthNamesShort:null)||this._defaults.monthNamesShort;k=(k?k.monthNames:null)||this._defaults.monthNames;var n=function(r){(r=s+112?b.getHours()+2:0);return b},_setDate:function(b,h,k){var l=!h,j=b.selectedMonth,m=b.selectedYear;h=this._restrictMinMax(b,this._determineDate(b,h,new Date));b.selectedDay=b.currentDay=h.getDate();b.drawMonth=b.selectedMonth=b.currentMonth=h.getMonth();b.drawYear=b.selectedYear=b.currentYear=h.getFullYear();if((j!=b.selectedMonth||m!=b.selectedYear)&& -!k)this._notifyChange(b);this._adjustInstDate(b);if(b.input)b.input.val(l?"":this._formatDate(b))},_getDate:function(b){return!b.currentYear||b.input&&b.input.val()==""?null:this._daylightSavingAdjust(new Date(b.currentYear,b.currentMonth,b.currentDay))},_generateHTML:function(b){var h=new Date;h=this._daylightSavingAdjust(new Date(h.getFullYear(),h.getMonth(),h.getDate()));var k=this._get(b,"isRTL"),l=this._get(b,"showButtonPanel"),j=this._get(b,"hideIfNoPrevNext"),m=this._get(b,"navigationAsDateFormat"), -n=this._getNumberOfMonths(b),o=this._get(b,"showCurrentAtPos"),p=this._get(b,"stepMonths"),q=n[0]!=1||n[1]!=1,u=this._daylightSavingAdjust(!b.currentDay?new Date(9999,9,9):new Date(b.currentYear,b.currentMonth,b.currentDay)),s=this._getMinMaxDate(b,"min"),r=this._getMinMaxDate(b,"max");o=b.drawMonth-o;var t=b.drawYear;if(o<0){o+=12;t--}if(r){var v=this._daylightSavingAdjust(new Date(r.getFullYear(),r.getMonth()-n[0]*n[1]+1,r.getDate()));for(v=s&&v -v;){o--;if(o<0){o=11;t--}}}b.drawMonth=o;b.drawYear=t;v=this._get(b,"prevText");v=!m?v:this.formatDate(v,this._daylightSavingAdjust(new Date(t,o-p,1)),this._getFormatConfig(b));v=this._canAdjustMonth(b,-1,t,o)?''+v+"":j?"":''+v+"";var w=this._get(b,"nextText");w=!m?w:this.formatDate(w,this._daylightSavingAdjust(new Date(t,o+p,1)),this._getFormatConfig(b));j=this._canAdjustMonth(b,+1,t,o)?''+w+"":j?"":''+w+"";p=this._get(b,"currentText");w=this._get(b,"gotoCurrent")&&b.currentDay?u:h;p=!m?p:this.formatDate(p,w,this._getFormatConfig(b));m=!b.inline?'":"";l=l?'
      '+(k?m:"")+(this._isInRange(b, -w)?'":"")+(k?"":m)+"
      ":"";m=parseInt(this._get(b,"firstDay"),10);m=isNaN(m)?0:m;p=this._get(b,"showWeek");w=this._get(b,"dayNames");this._get(b,"dayNamesShort");var x=this._get(b,"dayNamesMin"),C=this._get(b,"monthNames"),A=this._get(b,"monthNamesShort"),y=this._get(b,"beforeShowDay"),D=this._get(b,"showOtherMonths"), -J=this._get(b,"selectOtherMonths");this._get(b,"calculateWeek");for(var I=this._getDefaultDate(b),H="",E=0;E1)switch(M){case 0:F+=" ui-datepicker-group-first";B=" ui-corner-"+(k?"right":"left");break;case n[1]-1:F+=" ui-datepicker-group-last";B=" ui-corner-"+(k?"left":"right");break;default:F+=" ui-datepicker-group-middle"; -B=""}F+='">'}F+='
      '+(/all|left/.test(B)&&E==0?k?j:v:"")+(/all|right/.test(B)&&E==0?k?v:j:"")+this._generateMonthYearHeader(b,o,t,s,r,E>0||M>0,C,A)+'
      ';var G=p?'":"";for(B=0;B<7;B++){var z=(B+m)%7;G+="=5?' class="ui-datepicker-week-end"':"")+'>'+x[z]+""}F+= -G+"";G=this._getDaysInMonth(t,o);if(t==b.selectedYear&&o==b.selectedMonth)b.selectedDay=Math.min(b.selectedDay,G);B=(this._getFirstDayOfMonth(t,o)-m+7)%7;G=Math.ceil((B+G)/7);this.maxRows=G=q?this.maxRows>G?this.maxRows:G:G;z=this._daylightSavingAdjust(new Date(t,o,1-B));for(var Q=0;Q";var R=!p?"":'";for(B=0;B<7;B++){var N=y?y.apply(b.input?b.input[0]:null,[z]):[true,""],L=z.getMonth()!= -o,O=L&&!J||!N[0]||s&&zr;R+='";z.setDate(z.getDate()+1);z=this._daylightSavingAdjust(z)}F+=R+""}o++;if(o>11){o=0;t++}F+="
      '+this._get(b,"weekHeader")+"
      '+this._get(b,"calculateWeek")(z)+""+(L&&!D?" ":O?''+z.getDate()+"":''+z.getDate()+"")+"
      "+(q?""+ -(n[0]>0&&M==n[1]-1?'
      ':""):"");K+=F}H+=K}H+=l+(a.browser.msie&&parseInt(a.browser.version,10)<7&&!b.inline?'':"");b._keyEvent=false;return H},_generateMonthYearHeader:function(b,h,k,l,j,m,n,o){var p=this._get(b,"changeMonth"),q=this._get(b,"changeYear"),u=this._get(b,"showMonthAfterYear"),s='
      ',r="";if(m||!p)r+=''+ -n[h]+"";else{n=l&&l.getFullYear()==k;var t=j&&j.getFullYear()==k;r+='"}u||(s+=r+(m||!(p&&q)?" ":""));if(!b.yearshtml){b.yearshtml="";if(m||!q)s+=''+k+"";else{o=this._get(b, -"yearRange").split(":");var w=(new Date).getFullYear();n=function(x){x=x.match(/c[+-].*/)?k+parseInt(x.substring(1),10):x.match(/[+-].*/)?w+parseInt(x,10):parseInt(x,10);return isNaN(x)?w:x};h=n(o[0]);o=Math.max(h,n(o[1]||""));h=l?Math.max(h,l.getFullYear()):h;o=j?Math.min(o,j.getFullYear()):o;for(b.yearshtml+='";s+=b.yearshtml;b.yearshtml=null}}s+=this._get(b,"yearSuffix");if(u)s+=(m||!(p&&q)?" ":"")+r;s+="
      ";return s},_adjustInstDate:function(b,h,k){var l=b.drawYear+(k=="Y"?h:0),j=b.drawMonth+(k=="M"?h:0);h=Math.min(b.selectedDay,this._getDaysInMonth(l,j))+(k=="D"?h:0);l=this._restrictMinMax(b,this._daylightSavingAdjust(new Date(l,j,h)));b.selectedDay=l.getDate();b.drawMonth=b.selectedMonth=l.getMonth();b.drawYear=b.selectedYear=l.getFullYear();if(k== -"M"||k=="Y")this._notifyChange(b)},_restrictMinMax:function(b,h){var k=this._getMinMaxDate(b,"min"),l=this._getMinMaxDate(b,"max");k=k&&hl?l:k},_notifyChange:function(b){var h=this._get(b,"onChangeMonthYear");if(h)h.apply(b.input?b.input[0]:null,[b.selectedYear,b.selectedMonth+1,b])},_getNumberOfMonths:function(b){b=this._get(b,"numberOfMonths");return b==null?[1,1]:typeof b=="number"?[1,b]:b},_getMinMaxDate:function(b,h){return this._determineDate(b,this._get(b,h+"Date"),null)}, -_getDaysInMonth:function(b,h){return 32-this._daylightSavingAdjust(new Date(b,h,32)).getDate()},_getFirstDayOfMonth:function(b,h){return(new Date(b,h,1)).getDay()},_canAdjustMonth:function(b,h,k,l){var j=this._getNumberOfMonths(b);k=this._daylightSavingAdjust(new Date(k,l+(h<0?h:j[0]*j[1]),1));h<0&&k.setDate(this._getDaysInMonth(k.getFullYear(),k.getMonth()));return this._isInRange(b,k)},_isInRange:function(b,h){var k=this._getMinMaxDate(b,"min"),l=this._getMinMaxDate(b,"max");return(!k||h.getTime()>= -k.getTime())&&(!l||h.getTime()<=l.getTime())},_getFormatConfig:function(b){var h=this._get(b,"shortYearCutoff");h=typeof h!="string"?h:(new Date).getFullYear()%100+parseInt(h,10);return{shortYearCutoff:h,dayNamesShort:this._get(b,"dayNamesShort"),dayNames:this._get(b,"dayNames"),monthNamesShort:this._get(b,"monthNamesShort"),monthNames:this._get(b,"monthNames")}},_formatDate:function(b,h,k,l){if(!h){b.currentDay=b.selectedDay;b.currentMonth=b.selectedMonth;b.currentYear=b.selectedYear}h=h?typeof h== -"object"?h:this._daylightSavingAdjust(new Date(l,k,h)):this._daylightSavingAdjust(new Date(b.currentYear,b.currentMonth,b.currentDay));return this.formatDate(this._get(b,"dateFormat"),h,this._getFormatConfig(b))}});a.fn.datepicker=function(b){if(!this.length)return this;if(!a.datepicker.initialized){a(document).mousedown(a.datepicker._checkExternalClick).find("body").append(a.datepicker.dpDiv);a.datepicker.initialized=true}var h=Array.prototype.slice.call(arguments,1);if(typeof b=="string"&&(b=="isDisabled"|| -b=="getDate"||b=="widget"))return a.datepicker["_"+b+"Datepicker"].apply(a.datepicker,[this[0]].concat(h));if(b=="option"&&arguments.length==2&&typeof arguments[1]=="string")return a.datepicker["_"+b+"Datepicker"].apply(a.datepicker,[this[0]].concat(h));return this.each(function(){typeof b=="string"?a.datepicker["_"+b+"Datepicker"].apply(a.datepicker,[this].concat(h)):a.datepicker._attachDatepicker(this,b)})};a.datepicker=new d;a.datepicker.initialized=false;a.datepicker.uuid=(new Date).getTime(); -a.datepicker.version="1.9pre";window["DP_jQuery_"+f]=a})(jQuery); -(function(a,g){var d={buttons:true,height:true,maxHeight:true,maxWidth:true,minHeight:true,minWidth:true,width:true},c={maxHeight:true,maxWidth:true,minHeight:true,minWidth:true};a.widget("ui.dialog",{version:"1.9pre",options:{autoOpen:true,buttons:{},closeOnEscape:true,closeText:"close",dialogClass:"",draggable:true,hide:null,height:"auto",maxHeight:false,maxWidth:false,minHeight:150,minWidth:150,modal:false,position:{my:"center",at:"center",of:window,collision:"fit",using:function(e){var f=a(this).css(e).offset().top; -f<0&&a(this).css("top",e.top-f)}},resizable:true,show:null,stack:true,title:"",width:300,zIndex:1E3},_create:function(){this.originalTitle=this.element.attr("title");if(typeof this.originalTitle!=="string")this.originalTitle="";this.options.title=this.options.title||this.originalTitle;var e=this,f=e.options,i=f.title||" ",b=a.ui.dialog.getTitleId(e.element),h=(e.uiDialog=a("
      ")).addClass("ui-dialog ui-widget ui-widget-content ui-corner-all "+f.dialogClass).css({display:"none",outline:0,zIndex:f.zIndex}).attr("tabIndex", --1).keydown(function(j){if(f.closeOnEscape&&!j.isDefaultPrevented()&&j.keyCode&&j.keyCode===a.ui.keyCode.ESCAPE){e.close(j);j.preventDefault()}}).attr({role:"dialog","aria-labelledby":b}).mousedown(function(j){e.moveToTop(false,j)}).appendTo("body");e.element.show().removeAttr("title").addClass("ui-dialog-content ui-widget-content").appendTo(h);var k=(e.uiDialogTitlebar=a("
      ")).addClass("ui-dialog-titlebar ui-widget-header ui-corner-all ui-helper-clearfix").prependTo(h),l=a("").addClass("ui-dialog-titlebar-close ui-corner-all").attr("role", -"button").click(function(j){j.preventDefault();e.close(j)}).appendTo(k);(e.uiDialogTitlebarCloseText=a("")).addClass("ui-icon ui-icon-closethick").text(f.closeText).appendTo(l);a("").addClass("ui-dialog-title").attr("id",b).html(i).prependTo(k);k.find("*").add(k).disableSelection();this._hoverable(l);this._focusable(l);f.draggable&&a.fn.draggable&&e._makeDraggable();f.resizable&&a.fn.resizable&&e._makeResizable();e._createButtons(f.buttons);e._isOpen=false;a.fn.bgiframe&&h.bgiframe()}, -_init:function(){this.options.autoOpen&&this.open()},_destroy:function(){this.overlay&&this.overlay.destroy();this.uiDialog.hide();this.element.removeClass("ui-dialog-content ui-widget-content").hide().appendTo("body");this.uiDialog.remove();this.originalTitle&&this.element.attr("title",this.originalTitle)},widget:function(){return this.uiDialog},close:function(e){if(!this._isOpen)return f;var f=this,i,b;if(false!==f._trigger("beforeClose",e)){f._isOpen=false;f.overlay&&f.overlay.destroy();f.uiDialog.unbind("keypress.ui-dialog"); -if(f.options.hide)f.uiDialog.hide(f.options.hide,function(){f._trigger("close",e)});else{f.uiDialog.hide();f._trigger("close",e)}a.ui.dialog.overlay.resize();if(f.options.modal){i=0;a(".ui-dialog").each(function(){if(this!==f.uiDialog[0]){b=a(this).css("z-index");isNaN(b)||(i=Math.max(i,b))}});a.ui.dialog.maxZ=i}return f}},isOpen:function(){return this._isOpen},moveToTop:function(e,f){var i=this.options;if(i.modal&&!e||!i.stack&&!i.modal)return this._trigger("focus",f);if(i.zIndex>a.ui.dialog.maxZ)a.ui.dialog.maxZ= -i.zIndex;if(this.overlay){a.ui.dialog.maxZ+=1;a.ui.dialog.overlay.maxZ=a.ui.dialog.maxZ;this.overlay.$el.css("z-index",a.ui.dialog.overlay.maxZ)}i={scrollTop:this.element.scrollTop(),scrollLeft:this.element.scrollLeft()};a.ui.dialog.maxZ+=1;this.uiDialog.css("z-index",a.ui.dialog.maxZ);this.element.attr(i);this._trigger("focus",f);return this},open:function(){if(!this._isOpen){var e=this.options,f=this.uiDialog;this._size();this._position(e.position);f.show(e.show);this.overlay=e.modal?new a.ui.dialog.overlay(this): -null;this.moveToTop(true);e.modal&&f.bind("keydown.ui-dialog",function(i){if(i.keyCode===a.ui.keyCode.TAB){var b=a(":tabbable",this),h=b.filter(":first");b=b.filter(":last");if(i.target===b[0]&&!i.shiftKey){h.focus(1);return false}else if(i.target===h[0]&&i.shiftKey){b.focus(1);return false}}});e=this.element.find(":tabbable");if(!e.length){e=f.find(".ui-dialog-buttonpane :tabbable");e.length||(e=f)}e.eq(0).focus();this._isOpen=true;this._trigger("open");return this}},_createButtons:function(e){var f= -this,i=false;f.uiDialog.find(".ui-dialog-buttonpane").remove();typeof e==="object"&&e!==null&&a.each(e,function(){return!(i=true)});if(i){var b=a("
      ").addClass("ui-dialog-buttonpane ui-widget-content ui-helper-clearfix"),h=a("
      ").addClass("ui-dialog-buttonset").appendTo(b);a.each(e,function(k,l){l=a.isFunction(l)?{click:l,text:k}:l;var j=a("
      ").appendTo(this.element);this.oldValue=this._value();this._refreshValue()},_destroy:function(){this.element.removeClass("ui-progressbar ui-widget ui-widget-content ui-corner-all").removeAttr("role").removeAttr("aria-valuemin").removeAttr("aria-valuemax").removeAttr("aria-valuenow"); -this.valueDiv.remove()},value:function(d){if(d===g)return this._value();this._setOption("value",d);return this},_setOption:function(d,c){if(d==="value"){this.options.value=c;this._refreshValue();this._value()===this.options.max&&this._trigger("complete")}this._super("_setOption",d,c)},_value:function(){var d=this.options.value;if(typeof d!=="number")d=0;return Math.min(this.options.max,Math.max(this.min,d))},_percentage:function(){return 100*this._value()/this.options.max},_refreshValue:function(){var d= -this.value(),c=this._percentage();if(this.oldValue!==d){this.oldValue=d;this._trigger("change")}this.valueDiv.toggle(d>this.min).toggleClass("ui-corner-right",d===this.options.max).width(c.toFixed(0)+"%");this.element.attr("aria-valuenow",d)}})})(jQuery); -(function(a){a.widget("ui.slider",a.ui.mouse,{version:"1.9pre",widgetEventPrefix:"slide",options:{animate:false,distance:0,max:100,min:0,orientation:"horizontal",range:false,step:1,value:0,values:null},_create:function(){var g=this,d=this.options,c=this.element.find(".ui-slider-handle").addClass("ui-state-default ui-corner-all"),e=d.values&&d.values.length||1,f=[];this._mouseSliding=this._keySliding=false;this._animateOff=true;this._handleIndex=null;this._detectOrientation();this._mouseInit();this.element.addClass("ui-slider ui-slider-"+ -this.orientation+" ui-widget ui-widget-content ui-corner-all"+(d.disabled?" ui-slider-disabled ui-disabled":""));this.range=a([]);if(d.range){if(d.range===true){if(!d.values)d.values=[this._valueMin(),this._valueMin()];if(d.values.length&&d.values.length!==2)d.values=[d.values[0],d.values[0]]}this.range=a("
      ").appendTo(this.element).addClass("ui-slider-range ui-widget-header"+(d.range==="min"||d.range==="max"?" ui-slider-range-"+d.range:""))}for(var i=c.length;i"); -this.handles=c.add(a(f.join("")).appendTo(g.element));this.handle=this.handles.eq(0);this.handles.add(this.range).filter("a").click(function(b){b.preventDefault()}).hover(function(){d.disabled||a(this).addClass("ui-state-hover")},function(){a(this).removeClass("ui-state-hover")}).focus(function(){if(d.disabled)a(this).blur();else{a(".ui-slider .ui-state-focus").removeClass("ui-state-focus");a(this).addClass("ui-state-focus")}}).blur(function(){a(this).removeClass("ui-state-focus")});this.handles.each(function(b){a(this).data("index.ui-slider-handle", -b)});this.handles.keydown(function(b){var h=true,k=a(this).data("index.ui-slider-handle"),l,j,m;if(!g.options.disabled){switch(b.keyCode){case a.ui.keyCode.HOME:case a.ui.keyCode.END:case a.ui.keyCode.PAGE_UP:case a.ui.keyCode.PAGE_DOWN:case a.ui.keyCode.UP:case a.ui.keyCode.RIGHT:case a.ui.keyCode.DOWN:case a.ui.keyCode.LEFT:h=false;if(!g._keySliding){g._keySliding=true;a(this).addClass("ui-state-active");l=g._start(b,k);if(l===false)return}}m=g.options.step;l=g.options.values&&g.options.values.length? -j=g.values(k):j=g.value();switch(b.keyCode){case a.ui.keyCode.HOME:j=g._valueMin();break;case a.ui.keyCode.END:j=g._valueMax();break;case a.ui.keyCode.PAGE_UP:j=g._trimAlignValue(l+(g._valueMax()-g._valueMin())/5);break;case a.ui.keyCode.PAGE_DOWN:j=g._trimAlignValue(l-(g._valueMax()-g._valueMin())/5);break;case a.ui.keyCode.UP:case a.ui.keyCode.RIGHT:if(l===g._valueMax())return;j=g._trimAlignValue(l+m);break;case a.ui.keyCode.DOWN:case a.ui.keyCode.LEFT:if(l===g._valueMin())return;j=g._trimAlignValue(l- -m)}g._slide(b,k,j);return h}}).keyup(function(b){var h=a(this).data("index.ui-slider-handle");if(g._keySliding){g._keySliding=false;g._stop(b,h);g._change(b,h);a(this).removeClass("ui-state-active")}});this._refreshValue();this._animateOff=false},destroy:function(){this.handles.remove();this.range.remove();this.element.removeClass("ui-slider ui-slider-horizontal ui-slider-vertical ui-slider-disabled ui-widget ui-widget-content ui-corner-all").removeData("slider").unbind(".slider");this._mouseDestroy(); -return this},_mouseCapture:function(g){var d=this.options,c,e,f,i,b;if(d.disabled)return false;this.elementSize={width:this.element.outerWidth(),height:this.element.outerHeight()};this.elementOffset=this.element.offset();c=this._normValueFromMouse({x:g.pageX,y:g.pageY});e=this._valueMax()-this._valueMin()+1;i=this;this.handles.each(function(h){var k=Math.abs(c-i.values(h));if(e>k){e=k;f=a(this);b=h}});if(d.range===true&&this.values(1)===d.min){b+=1;f=a(this.handles[b])}if(this._start(g,b)===false)return false; -this._mouseSliding=true;i._handleIndex=b;f.addClass("ui-state-active").focus();d=f.offset();this._clickOffset=!a(g.target).parents().andSelf().is(".ui-slider-handle")?{left:0,top:0}:{left:g.pageX-d.left-f.width()/2,top:g.pageY-d.top-f.height()/2-(parseInt(f.css("borderTopWidth"),10)||0)-(parseInt(f.css("borderBottomWidth"),10)||0)+(parseInt(f.css("marginTop"),10)||0)};this.handles.hasClass("ui-state-hover")||this._slide(g,b,c);return this._animateOff=true},_mouseStart:function(){return true},_mouseDrag:function(g){var d= -this._normValueFromMouse({x:g.pageX,y:g.pageY});this._slide(g,this._handleIndex,d);return false},_mouseStop:function(g){this.handles.removeClass("ui-state-active");this._mouseSliding=false;this._stop(g,this._handleIndex);this._change(g,this._handleIndex);this._clickOffset=this._handleIndex=null;return this._animateOff=false},_detectOrientation:function(){this.orientation=this.options.orientation==="vertical"?"vertical":"horizontal"},_normValueFromMouse:function(g){var d;if(this.orientation==="horizontal"){d= -this.elementSize.width;g=g.x-this.elementOffset.left-(this._clickOffset?this._clickOffset.left:0)}else{d=this.elementSize.height;g=g.y-this.elementOffset.top-(this._clickOffset?this._clickOffset.top:0)}d=g/d;if(d>1)d=1;if(d<0)d=0;if(this.orientation==="vertical")d=1-d;g=this._valueMax()-this._valueMin();return this._trimAlignValue(this._valueMin()+d*g)},_start:function(g,d){var c={handle:this.handles[d],value:this.value()};if(this.options.values&&this.options.values.length){c.value=this.values(d); -c.values=this.values()}return this._trigger("start",g,c)},_slide:function(g,d,c){var e;if(this.options.values&&this.options.values.length){e=this.values(d?0:1);if(this.options.values.length===2&&this.options.range===true&&(d===0&&c>e||d===1&&c1){this.options.values[g]=this._trimAlignValue(d);this._refreshValue();this._change(null,g)}else if(arguments.length)if(a.isArray(arguments[0])){c=this.options.values;e=arguments[0];for(f=0;f=this._valueMax())return this._valueMax();var d=this.options.step>0?this.options.step:1,c=(g-this._valueMin())%d;g-=c;if(Math.abs(c)*2>=d)g+=c>0?d:-d;return parseFloat(g.toFixed(5))},_valueMin:function(){return this.options.min},_valueMax:function(){return this.options.max},_refreshValue:function(){var g= -this.options.range,d=this.options,c=this,e=!this._animateOff?d.animate:false,f,i={},b,h,k,l;if(this.options.values&&this.options.values.length)this.handles.each(function(j){f=(c.values(j)-c._valueMin())/(c._valueMax()-c._valueMin())*100;i[c.orientation==="horizontal"?"left":"bottom"]=f+"%";a(this).stop(1,1)[e?"animate":"css"](i,d.animate);if(c.options.range===true)if(c.orientation==="horizontal"){if(j===0)c.range.stop(1,1)[e?"animate":"css"]({left:f+"%"},d.animate);if(j===1)c.range[e?"animate":"css"]({width:f- -b+"%"},{queue:false,duration:d.animate})}else{if(j===0)c.range.stop(1,1)[e?"animate":"css"]({bottom:f+"%"},d.animate);if(j===1)c.range[e?"animate":"css"]({height:f-b+"%"},{queue:false,duration:d.animate})}b=f});else{h=this.value();k=this._valueMin();l=this._valueMax();f=l!==k?(h-k)/(l-k)*100:0;i[c.orientation==="horizontal"?"left":"bottom"]=f+"%";this.handle.stop(1,1)[e?"animate":"css"](i,d.animate);if(g==="min"&&this.orientation==="horizontal")this.range.stop(1,1)[e?"animate":"css"]({width:f+"%"}, -d.animate);if(g==="max"&&this.orientation==="horizontal")this.range[e?"animate":"css"]({width:100-f+"%"},{queue:false,duration:d.animate});if(g==="min"&&this.orientation==="vertical")this.range.stop(1,1)[e?"animate":"css"]({height:f+"%"},d.animate);if(g==="max"&&this.orientation==="vertical")this.range[e?"animate":"css"]({height:100-f+"%"},{queue:false,duration:d.animate})}}})})(jQuery); -(function(a){function g(d){return function(){var c=this.element.val();d.apply(this,arguments);this._refresh();c!==this.element.val()&&this._trigger("change")}}a.widget("ui.spinner",{version:"1.9pre",defaultElement:"",widgetEventPrefix:"spin",options:{culture:null,incremental:true,max:null,min:null,numberFormat:null,page:10,step:1,change:null,spin:null,start:null,stop:null},_create:function(){this._value(this.element.val(),true);this._draw();this._bind(this._events);this._refresh()},_getCreateOptions:function(){var d= -{},c=this.element;a.each(["min","max","step"],function(e,f){var i=c.attr(f);if(i!==undefined&&i.length)d[f]=i});return d},_events:{keydown:function(d){this._start(d)&&this._keydown(d)&&d.preventDefault()},keyup:"_stop",focus:function(){this.uiSpinner.addClass("ui-state-active");this.previous=this.element.val()},blur:function(d){this._refresh();this.uiSpinner.removeClass("ui-state-active");this.previous!==this.element.val()&&this._trigger("change",d)},mousewheel:function(d,c){if(c){if(!this.spinning&& -!this._start(d))return false;this._spin((c>0?1:-1)*this.options.step,d);clearTimeout(this.mousewheelTimer);this.mousewheelTimer=setTimeout(function(){this.spinning&&this._stop(d)},100);d.preventDefault()}},"mousedown .ui-spinner-button":function(d){d.preventDefault();document.activeElement!==this.element[0]&&this.element.focus();if(this._start(d)!==false)this._repeat(null,a(d.currentTarget).hasClass("ui-spinner-up")?1:-1,d)},"mouseup .ui-spinner-button":"_stop","mouseenter .ui-spinner-button":function(d){if(a(d.currentTarget).hasClass("ui-state-active")){if(this._start(d)=== -false)return false;this._repeat(null,a(d.currentTarget).hasClass("ui-spinner-up")?1:-1,d)}},"mouseleave .ui-spinner-button":"_stop"},_draw:function(){var d=this.uiSpinner=this.element.addClass("ui-spinner-input").attr("autocomplete","off").wrap(this._uiSpinnerHtml()).parent().append(this._buttonHtml());this._hoverable(d);this.element.attr("role","spinbutton");this.buttons=d.find(".ui-spinner-button").attr("tabIndex",-1).button().removeClass("ui-corner-all");this.buttons.height()===d.height()&&d.height()> -0&&d.height(d.height());this.options.disabled&&this.disable()},_keydown:function(d){var c=this.options,e=a.ui.keyCode;switch(d.keyCode){case e.UP:this._repeat(null,1,d);return true;case e.DOWN:this._repeat(null,-1,d);return true;case e.PAGE_UP:this._repeat(null,c.page,d);return true;case e.PAGE_DOWN:this._repeat(null,-c.page,d);return true}return false},_uiSpinnerHtml:function(){return""},_buttonHtml:function(){return""}, -_start:function(d){if(!this.spinning&&this._trigger("start",d)===false)return false;if(!this.counter)this.counter=1;return this.spinning=true},_repeat:function(d,c,e){d=d||500;clearTimeout(this.timer);this.timer=this._delay(function(){this._repeat(40,c,e)},d);this._spin(c*this.options.step,e)},_spin:function(d,c){var e=this.value()||0;if(!this.counter)this.counter=1;e=this._adjustValue(e+d*this._increment(this.counter));if(!this.spinning||this._trigger("spin",c,{value:e})!==false){this._value(e); -this.counter++}},_increment:function(d){var c=this.options.incremental;if(c)return a.isFunction(c)?c(d):Math.floor(d*d*d/5E4-d*d/500+17*d/200+1);return 1},_precision:function(){var d=this._precisionOf(this.options.step);if(this.options.min!==null)d=Math.max(d,this._precisionOf(this.options.min));return d},_precisionOf:function(d){d=d.toString();var c=d.indexOf(".");return c===-1?0:d.length-c-1},_adjustValue:function(d){var c,e=this.options;c=e.min!==null?e.min:0;d=Math.round((d-c)/e.step)*e.step; -d=parseFloat((c+d).toFixed(this._precision()));if(e.max!==null&&d>e.max)return e.max;if(e.min!==null&&d1&&b.href.replace(f,"")===i}}();a.widget("ui.tabs",{version:"1.9pre",options:{active:null,collapsible:false,event:"click",fx:null,activate:null,beforeActivate:null,beforeLoad:null,load:null},_create:function(){var f=this,i=f.options,b=i.active;f.running=false;f.element.addClass("ui-tabs ui-widget ui-widget-content ui-corner-all");f._processTabs();if(b===null){location.hash&& -f.anchors.each(function(h,k){if(k.hash===location.hash){b=h;return false}});if(b===null)b=f.lis.filter(".ui-tabs-active").index();if(b===null||b===-1)b=f.lis.length?0:false}if(b!==false){b=this.lis.eq(b).index();if(b===-1)b=i.collapsible?false:0}i.active=b;if(!i.collapsible&&i.active===false&&this.anchors.length)i.active=0;if(a.isArray(i.disabled))i.disabled=a.unique(i.disabled.concat(a.map(this.lis.filter(".ui-state-disabled"),function(h){return f.lis.index(h)}))).sort();this._setupFx(i.fx);this._refresh(); -this.panels.hide();this.lis.removeClass("ui-tabs-active ui-state-active");if(i.active!==false&&this.anchors.length){this.active=this._findActive(i.active);f._getPanelForTab(this.active).show();this.lis.eq(i.active).addClass("ui-tabs-active ui-state-active");this.load(i.active)}else this.active=a()},_setOption:function(f,i){if(f=="active")this._activate(i);else if(f==="disabled")this._setupDisabled(i);else{this._super("_setOption",f,i);f==="collapsible"&&!i&&this.options.active===false&&this._activate(0); -f==="event"&&this._setupEvents(i);f==="fx"&&this._setupFx(i)}},_tabId:function(f){return a(f).attr("aria-controls")||"ui-tabs-"+ ++d},_sanitizeSelector:function(f){return f?f.replace(/[!"$%&'()*+,.\/:;<=>?@[\]^`{|}~]/g,"\\$&"):""},refresh:function(){var f=this.options,i=this.list.children(":has(a[href])");f.disabled=a.map(i.filter(".ui-state-disabled"),function(b){return i.index(b)});this._processTabs();this._refresh();this.panels.not(this._getPanelForTab(this.active)).hide();if(f.active===false|| -!this.anchors.length){f.active=false;this.active=a()}else if(this.active.length&&!a.contains(this.list[0],this.active[0])){f=f.active-1;this._activate(f>=0?f:0)}else f.active=this.anchors.index(this.active)},_refresh:function(){var f=this.options;this.element.toggleClass("ui-tabs-collapsible",f.collapsible);this.list.addClass("ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all");this.lis.addClass("ui-state-default ui-corner-top");this.panels.addClass("ui-tabs-panel ui-widget-content ui-corner-bottom"); -this._setupDisabled(f.disabled);this._setupEvents(f.event);this.lis.unbind(".tabs");this._focusable(this.lis);this._hoverable(this.lis)},_processTabs:function(){var f=this;this.list=this.element.find("ol,ul").eq(0);this.lis=a(" > li:has(a[href])",this.list);this.anchors=this.lis.map(function(){return a("a",this)[0]});this.panels=a([]);this.anchors.each(function(i,b){var h,k;if(c(b)){h=b.hash;k=f.element.find(f._sanitizeSelector(h))}else{var l=f._tabId(b);h="#"+l;k=f.element.find(h);if(!k.length){k= -f._createPanel(l);k.insertAfter(f.panels[i-1]||f.list)}}if(k.length)f.panels=f.panels.add(k);a(b).attr("aria-controls",h.substring(1))})},_createPanel:function(f){return a("
      ").attr("id",f).addClass("ui-tabs-panel ui-widget-content ui-corner-bottom").data("destroy.tabs",true)},_setupDisabled:function(f){if(a.isArray(f))if(f.length){if(f.length===this.anchors.length)f=true}else f=false;for(var i=0,b;b=this.lis[i];i++)a(b).toggleClass("ui-state-disabled",f===true||a.inArray(i,f)!==-1);this.options.disabled= -f},_setupFx:function(f){if(f)if(a.isArray(f)){this.hideFx=f[0];this.showFx=f[1]}else this.hideFx=this.showFx=f},_resetStyle:function(f,i){!a.support.opacity&&i.opacity&&f[0].style.removeAttribute("filter")},_setupEvents:function(f){this.anchors.unbind(".tabs");f&&this.anchors.bind(f.split(" ").join(".tabs ")+".tabs",a.proxy(this,"_eventHandler"));this.anchors.bind("click.tabs",function(i){i.preventDefault()})},_eventHandler:function(f){var i=this.options,b=this.active,h=a(f.currentTarget),k=h[0]=== -b[0],l=k&&i.collapsible,j=l?a():this._getPanelForTab(h),m=!b.length?a():this._getPanelForTab(b),n=h.closest("li");b={oldTab:b,oldPanel:m,newTab:l?a():h,newPanel:j};f.preventDefault();if(n.hasClass("ui-state-disabled")||n.hasClass("ui-tabs-loading")||this.running||k&&!i.collapsible||this._trigger("beforeActivate",f,b)===false)h[0].blur();else{i.active=l?false:this.anchors.index(h);this.active=k?a():h;this.xhr&&this.xhr.abort();if(!m.length&&!j.length)throw"jQuery UI Tabs: Mismatching fragment identifier."; -if(j.length){this.load(this.anchors.index(h),f);h[0].blur()}this._toggle(f,b)}},_toggle:function(f,i){function b(){k.running=false;k._trigger("activate",f,i)}function h(){i.newTab.closest("li").addClass("ui-tabs-active ui-state-active");if(l.length&&k.showFx)l.animate(k.showFx,k.showFx.duration||"normal",function(){k._resetStyle(a(this),k.showFx);b()});else{l.show();b()}}var k=this,l=i.newPanel,j=i.oldPanel;k.running=true;if(j.length&&k.hideFx)j.animate(k.hideFx,k.hideFx.duration||"normal",function(){i.oldTab.closest("li").removeClass("ui-tabs-active ui-state-active"); -k._resetStyle(a(this),k.hideFx);h()});else{i.oldTab.closest("li").removeClass("ui-tabs-active ui-state-active");j.hide();h()}},_activate:function(f){f=this._findActive(f)[0];if(f!==this.active[0]){f=f||this.active[0];this._eventHandler({target:f,currentTarget:f,preventDefault:a.noop})}},_findActive:function(f){return typeof f==="number"?this.anchors.eq(f):typeof f==="string"?this.anchors.filter("[href$='"+f+"']"):a()},_getIndex:function(f){if(typeof f=="string")f=this.anchors.index(this.anchors.filter("[href$="+ -f+"]"));return f},_destroy:function(){this.xhr&&this.xhr.abort();this.element.removeClass("ui-tabs ui-widget ui-widget-content ui-corner-all ui-tabs-collapsible");this.list.removeClass("ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all");this.anchors.unbind(".tabs").removeData("href.tabs").removeData("load.tabs");this.lis.unbind(".tabs").add(this.panels).each(function(){a.data(this,"destroy.tabs")?a(this).remove():a(this).removeClass("ui-state-default ui-corner-top ui-tabs-active ui-state-active ui-state-disabled ui-tabs-panel ui-widget-content ui-corner-bottom")}); -return this},enable:function(f){var i=this.options.disabled;if(i!==false){if(f===g)i=false;else{f=this._getIndex(f);i=a.isArray(i)?a.map(i,function(b){return b!==f?b:null}):a.map(this.lis,function(b,h){return h!==f?h:null})}this._setupDisabled(i)}},disable:function(f){var i=this.options.disabled;if(i!==true){if(f===g)i=true;else{f=this._getIndex(f);if(a.inArray(f,i)!==-1)return;i=a.isArray(i)?a.merge([f],i).sort():[f]}this._setupDisabled(i)}},load:function(f,i){f=this._getIndex(f);var b=this,h=this.anchors.eq(f), -k=b._getPanelForTab(h),l={tab:h,panel:k};if(!c(h[0])){if(this.xhr=a.ajax({url:h.attr("href"),beforeSend:function(j,m){return b._trigger("beforeLoad",i,a.extend({jqXHR:j,ajaxSettings:m},l))}})){this.lis.eq(f).addClass("ui-tabs-loading");this.xhr.success(function(j){setTimeout(function(){k.html(j);b._trigger("load",i,l)},1)}).complete(function(j,m){setTimeout(function(){m==="abort"&&b.panels.stop(false,true);b.lis.eq(f).removeClass("ui-tabs-loading");j===b.xhr&&delete b.xhr})})}return this}},_getPanelForTab:function(f){return this.element.find(this._sanitizeSelector("#"+ -a(f).attr("aria-controls")))}});if(a.uiBackCompat!==false){a.ui.tabs.prototype._ui=function(f,i){return{tab:f,panel:i,index:this.anchors.index(f)}};(function(f,i){i.url=function(b,h){this.anchors.eq(b).attr("href",h)}})(jQuery,jQuery.ui.tabs.prototype);(function(f,i){f.extend(i.options,{ajaxOptions:null,cache:false});var b=i._create,h=i._setOption,k=i._destroy,l=i.url||f.noop;f.extend(i,{_create:function(){b.call(this);var j=this;this.element.bind("tabsbeforeload.tabs",function(m,n){if(f.data(n.tab[0], -"cache.tabs"))m.preventDefault();else{f.extend(n.ajaxSettings,j.options.ajaxOptions,{error:function(o,p){try{j.options.ajaxOptions.error(o,p,n.tab.closest("li").index(),n.tab[0])}catch(q){}}});n.jqXHR.success(function(){j.options.cache&&f.data(n.tab[0],"cache.tabs",true)})}})},_setOption:function(j,m){j==="cache"&&m===false&&this.anchors.removeData("cache.tabs");h.apply(this,arguments)},_destroy:function(){this.anchors.removeData("cache.tabs");k.call(this)},url:function(j){this.anchors.eq(j).removeData("cache.tabs"); -l.apply(this,arguments)}})})(jQuery,jQuery.ui.tabs.prototype);(function(f,i){i.abort=function(){this.xhr&&this.xhr.abort()}})(jQuery,jQuery.ui.tabs.prototype);a.widget("ui.tabs",a.ui.tabs,{options:{spinner:"Loading…"},_create:function(){this._super("_create");this._bind({tabsbeforeload:function(f,i){if(this.options.spinner){var b=i.tab.find("span"),h=b.html();b.html(this.options.spinner);i.jqXHR.complete(function(){b.html(h)})}}})}});(function(f,i){f.extend(i.options,{enable:null,disable:null}); -var b=i.enable,h=i.disable;i.enable=function(k){var l=this.options,j;if(k&&l.disabled===true||f.isArray(l.disabled)&&f.inArray(k,l.disabled)!==-1)j=true;b.apply(this,arguments);j&&this._trigger("enable",null,this._ui(this.anchors[k],this.panels[k]))};i.disable=function(k){var l=this.options,j;if(k&&l.disabled===false||f.isArray(l.disabled)&&f.inArray(k,l.disabled)===-1)j=true;h.apply(this,arguments);j&&this._trigger("disable",null,this._ui(this.anchors[k],this.panels[k]))}})(jQuery,jQuery.ui.tabs.prototype); -(function(f,i){f.extend(i.options,{add:null,remove:null,tabTemplate:"
    • #{label}
    • "});i.add=function(b,h,k){if(k===g)k=this.anchors.length;var l=this.options;h=f(l.tabTemplate.replace(/#\{href\}/g,b).replace(/#\{label\}/g,h));b=!b.indexOf("#")?b.replace("#",""):this._tabId(h.find("a")[0]);h.addClass("ui-state-default ui-corner-top").data("destroy.tabs",true);h.find("a").attr("aria-controls",b);var j=k>=this.lis.length,m=this.element.find("#"+b);if(!m.length){m= -this._createPanel(b);if(j)k>0?m.insertAfter(this.panels.eq(-1)):m.appendTo(this.element);else m.insertBefore(this.panels[k])}m.addClass("ui-tabs-panel ui-widget-content ui-corner-bottom").hide();j?h.appendTo(this.list):h.insertBefore(this.lis[k]);l.disabled=f.map(l.disabled,function(n){return n>=k?++n:n});this.refresh();this.lis.length===1&&l.active===false&&this.option("active",0);this._trigger("add",null,this._ui(this.anchors[k],this.panels[k]));return this};i.remove=function(b){b=this._getIndex(b); -var h=this.options,k=this.lis.eq(b).remove(),l=this._getPanelForTab(k.find("a[aria-controls]")).remove();if(k.hasClass("ui-tabs-active")&&this.anchors.length>2)this._activate(b+(b+1=b?--j:j});this.refresh();this._trigger("remove",null,this._ui(k.find("a")[0],l[0]));return this}})(jQuery,jQuery.ui.tabs.prototype);(function(f,i){i.length=function(){return this.anchors.length}})(jQuery,jQuery.ui.tabs.prototype); -(function(f,i){f.extend(i.options,{idPrefix:"ui-tabs-"});i._tabId=function(b){return f(b).attr("aria-controls")||b.title&&b.title.replace(/\s/g,"_").replace(/[^\w\u00c0-\uFFFF-]/g,"")||this.options.idPrefix+ ++d}})(jQuery,jQuery.ui.tabs.prototype);(function(f,i){f.extend(i.options,{panelTemplate:"
      "});i._createPanel=function(b){return f(this.options.panelTemplate).attr("id",b).addClass("ui-tabs-panel ui-widget-content ui-corner-bottom").data("destroy.tabs",true)}})(jQuery,jQuery.ui.tabs.prototype); -(function(f,i){var b=i._create,h=i._setOption,k=i._eventHandler;i._create=function(){var l=this.options;if(l.active===null&&l.selected!==g)l.active=l.selected===-1?false:l.selected;b.call(this);l.selected=l.active;if(l.selected===false)l.selected=-1};i._setOption=function(l,j){if(l!=="selected")return h.apply(this,arguments);var m=this.options;h.call(this,"active",j===-1?false:j);m.selected=m.active;if(m.selected===false)m.selected=-1};i._eventHandler=function(){k.apply(this,arguments);this.options.selected= -this.options.active;if(this.options.selected===false)this.options.selected=-1}})(jQuery,jQuery.ui.tabs.prototype);(function(f,i){f.extend(i.options,{show:null,select:null});var b=i._create,h=i._trigger;i._create=function(){b.call(this);this.options.active!==false&&this._trigger("show",null,this._ui(this.active[0],this._getPanelForTab(this.active)[0]))};i._trigger=function(k,l,j){if(!h.apply(this,arguments))return false;if(k==="beforeActivate"&&j.newTab.length)h.call(this,"select",l,{tab:j.newTab[0], -panel:j.newPanel[0],index:j.newTab.closest("li").index()});else k==="activate"&&j.newTab.length&&h.call(this,"show",l,{tab:j.newTab[0],panel:j.newPanel[0],index:j.newTab.closest("li").index()})}})(jQuery,jQuery.ui.tabs.prototype);(function(f,i){i.select=function(b){b=this._getIndex(b);if(b===-1)if(this.options.collapsible&&this.options.selected!==-1)b=this.options.selected;else return;this.anchors.eq(b).trigger(this.options.event+".tabs")}})(jQuery,jQuery.ui.tabs.prototype);var e=0;a.widget("ui.tabs", -a.ui.tabs,{options:{cookie:null},_create:function(){var f=this.options,i;if(f.active==null&&f.cookie){i=parseInt(this._cookie(),10);if(i===-1)i=false;f.active=i}this._super("_create")},_cookie:function(f){var i=[this.cookie||(this.cookie=this.options.cookie.name||"ui-tabs-"+ ++e)];if(arguments.length){i.push(f===false?-1:f);i.push(this.options.cookie)}return a.cookie.apply(null,i)},_refresh:function(){this._super("_refresh");this.options.cookie&&this._cookie(this.options.active,this.options.cookie)}, -_eventHandler:function(){this._superApply("_eventHandler",arguments);this.options.cookie&&this._cookie(this.options.active,this.options.cookie)},_destroy:function(){this._super("_destroy");this.options.cookie&&this._cookie(null,this.options.cookie)}});a.widget("ui.tabs",a.ui.tabs,{_trigger:function(f,i,b){b=a.extend({},b);if(f==="load"){b.panel=b.panel[0];b.tab=b.tab[0]}return this._super("_trigger",f,i,b)}})}})(jQuery); -(function(a){var g=0;a.widget("ui.tooltip",{version:"1.9pre",options:{content:function(){return a(this).attr("title")},hide:true,items:"[title]",position:{my:"left+15 center",at:"right center",collision:"flipfit flipfit"},show:true,tooltipClass:null,close:null,open:null},_create:function(){this._bind({mouseover:"open",focusin:"open"});this.tooltips={}},_setOption:function(d,c){if(d==="disabled"){this[c?"_disable":"_enable"]();this.options[d]=c}else this._super("_setOption",d,c)},_disable:function(){var d= -this;a.each(this.tooltips,function(c,e){var f=a.Event("blur");f.target=f.currentTarget=e[0];d.close(f,true)});this.element.find(this.options.items).andSelf().each(function(){var c=a(this);c.is("[title]")&&c.data("tooltip-title",c.attr("title")).attr("title","")})},_enable:function(){this.element.find(this.options.items).andSelf().each(function(){var d=a(this);d.data("tooltip-title")&&d.attr("title",d.data("tooltip-title"))})},open:function(d){var c,e=this,f=a(d?d.target:this.element).closest(this.options.items); -if(!(!f.length||f.attr("aria-describedby"))){f.data("tooltip-title")||f.data("tooltip-title",f.attr("title"));(c=this.options.content.call(f[0],function(i){setTimeout(function(){e._open(d,f,i)},1)}))&&e._open(d,f,c)}},_open:function(d,c,e){if(e){c.is("[title]")&&c.attr("title","");var f=this._find(c);if(!f.length){f=this._tooltip(c);c.attr("aria-describedby",f.attr("id"))}f.find(".ui-tooltip-content").html(e);f.stop(true).position(a.extend({of:c},this.options.position)).hide();this._show(f,this.options.show); -this._trigger("open",d,{tooltip:f});this._bind(c,{mouseleave:"close",blur:"close",keyup:function(i){if(i.keyCode==a.ui.keyCode.ESCAPE){i=a.Event(i);i.currentTarget=c[0];this.close(i,true)}}})}},close:function(d,c){var e=this,f=a(d?d.currentTarget:this.element),i=this._find(f);if(!(!c&&document.activeElement===f[0])){f.data("tooltip-title")&&f.attr("title",f.data("tooltip-title"));f.removeAttr("aria-describedby");i.stop(true);this._hide(i,this.options.hide,function(){a(this).remove();delete e.tooltips[this.id]}); -f.unbind("mouseleave.tooltip blur.tooltip keyup.tooltip");this._trigger("close",d,{tooltip:i})}},_tooltip:function(d){var c="ui-tooltip-"+g++,e=a("
      ").attr({id:c,role:"tooltip"}).addClass("ui-tooltip ui-widget ui-corner-all ui-widget-content "+(this.options.tooltipClass||""));a("
      ").addClass("ui-tooltip-content").appendTo(e);e.appendTo(document.body);a.fn.bgiframe&&e.bgiframe();this.tooltips[c]=d;return e},_find:function(d){return(d=d.attr("aria-describedby"))?a("#"+d):a()},_destroy:function(){a.each(this.tooltips, -function(d){a("#"+d).remove()})}})})(jQuery); diff --git a/libreplan-webapp/src/main/webapp/jqplot/examples/jquery-ui/js/jquery.effects.blind.js b/libreplan-webapp/src/main/webapp/jqplot/examples/jquery-ui/js/jquery.effects.blind.js deleted file mode 100644 index d75b4f3cd..000000000 --- a/libreplan-webapp/src/main/webapp/jqplot/examples/jquery-ui/js/jquery.effects.blind.js +++ /dev/null @@ -1,80 +0,0 @@ -/* - * jQuery UI Effects Blind 1.9pre - * - * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) - * Dual licensed under the MIT or GPL Version 2 licenses. - * http://jquery.org/license - * - * http://docs.jquery.com/UI/Effects/Blind - * - * Depends: - * jquery.effects.core.js - */ -(function( $, undefined ) { - -var rvertical = /up|down|vertical/, - rpositivemotion = /up|left|vertical|horizontal/; - -$.effects.effect.blind = function( o, done ) { - // Create element - var el = $( this ), - props = [ "position", "top", "bottom", "left", "right", "height", "width" ], - mode = $.effects.setMode( el, o.mode || "hide" ), - direction = o.direction || "up", - vertical = rvertical.test( direction ), - ref = vertical ? "height" : "width", - ref2 = vertical ? "top" : "left", - motion = rpositivemotion.test( direction ), - animation = {}, - show = mode === "show", - wrapper, distance, top; - - // if already wrapped, the wrapper's properties are my property. #6245 - if ( el.parent().is( ".ui-effects-wrapper" ) ) { - $.effects.save( el.parent(), props ); - } else { - $.effects.save( el, props ); - } - el.show(); - top = parseInt(el.css('top'), 10); - wrapper = $.effects.createWrapper( el ).css({ - overflow: "hidden" - }); - - distance = vertical ? wrapper[ ref ]() + top : wrapper[ ref ](); - - animation[ ref ] = show ? distance : 0; - if ( !motion ) { - el - .css( vertical ? "bottom" : "right", 0 ) - .css( vertical ? "top" : "left", "" ) - .css({ position: "absolute" }); - animation[ ref2 ] = show ? 0 : distance; - } - - // start at 0 if we are showing - if ( show ) { - wrapper.css( ref, 0 ); - if ( ! motion ) { - wrapper.css( ref2, distance ); - } - } - - // Animate - wrapper.animate( animation, { - duration: o.duration, - easing: o.easing, - queue: false, - complete: function() { - if ( mode === "hide" ) { - el.hide(); - } - $.effects.restore( el, props ); - $.effects.removeWrapper( el ); - done(); - } - }); - -}; - -})(jQuery); diff --git a/libreplan-webapp/src/main/webapp/jqplot/examples/jquery-ui/js/jquery.effects.blind.min.js b/libreplan-webapp/src/main/webapp/jqplot/examples/jquery-ui/js/jquery.effects.blind.min.js deleted file mode 100644 index 101c15d4e..000000000 --- a/libreplan-webapp/src/main/webapp/jqplot/examples/jquery-ui/js/jquery.effects.blind.min.js +++ /dev/null @@ -1,14 +0,0 @@ -/* - * jQuery UI Effects Blind 1.9pre - * - * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) - * Dual licensed under the MIT or GPL Version 2 licenses. - * http://jquery.org/license - * - * http://docs.jquery.com/UI/Effects/Blind - * - * Depends: - * jquery.effects.core.js - */ -(function(b){var n=/up|down|vertical/,o=/up|left|vertical|horizontal/;b.effects.effect.blind=function(g,p){var a=b(this),i=["position","top","bottom","left","right","height","width"],l=b.effects.setMode(a,g.mode||"hide"),e=g.direction||"up",f=n.test(e),h=f?"height":"width",m=f?"top":"left";e=o.test(e);var j={},k=l==="show",c,d;a.parent().is(".ui-effects-wrapper")?b.effects.save(a.parent(),i):b.effects.save(a,i);a.show();d=parseInt(a.css("top"),10);c=b.effects.createWrapper(a).css({overflow:"hidden"}); -d=f?c[h]()+d:c[h]();j[h]=k?d:0;if(!e){a.css(f?"bottom":"right",0).css(f?"top":"left","").css({position:"absolute"});j[m]=k?0:d}if(k){c.css(h,0);e||c.css(m,d)}c.animate(j,{duration:g.duration,easing:g.easing,queue:false,complete:function(){l==="hide"&&a.hide();b.effects.restore(a,i);b.effects.removeWrapper(a);p()}})}})(jQuery); diff --git a/libreplan-webapp/src/main/webapp/jqplot/examples/jquery-ui/js/jquery.effects.core.js b/libreplan-webapp/src/main/webapp/jqplot/examples/jquery-ui/js/jquery.effects.core.js deleted file mode 100644 index ab9349a8d..000000000 --- a/libreplan-webapp/src/main/webapp/jqplot/examples/jquery-ui/js/jquery.effects.core.js +++ /dev/null @@ -1,890 +0,0 @@ -/* - * jQuery UI Effects 1.9pre - * - * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) - * Dual licensed under the MIT or GPL Version 2 licenses. - * http://jquery.org/license - * - * http://docs.jquery.com/UI/Effects/ - */ -;jQuery.effects || (function($, undefined) { - -var backCompat = $.uiBackCompat !== false; - -$.effects = { - effect: {} -}; - -/******************************************************************************/ -/****************************** COLOR ANIMATIONS ******************************/ -/******************************************************************************/ - -// override the animation for color styles -$.each(["backgroundColor", "borderBottomColor", "borderLeftColor", - "borderRightColor", "borderTopColor", "borderColor", "color", "outlineColor"], -function(i, attr) { - $.fx.step[attr] = function(fx) { - if (!fx.colorInit) { - fx.start = getColor(fx.elem, attr); - fx.end = getRGB(fx.end); - fx.colorInit = true; - } - - fx.elem.style[attr] = "rgb(" + - Math.max(Math.min(parseInt((fx.pos * (fx.end[0] - fx.start[0])) + fx.start[0], 10), 255), 0) + "," + - Math.max(Math.min(parseInt((fx.pos * (fx.end[1] - fx.start[1])) + fx.start[1], 10), 255), 0) + "," + - Math.max(Math.min(parseInt((fx.pos * (fx.end[2] - fx.start[2])) + fx.start[2], 10), 255), 0) + ")"; - }; -}); - -// Color Conversion functions from highlightFade -// By Blair Mitchelmore -// http://jquery.offput.ca/highlightFade/ - -// Parse strings looking for color tuples [255,255,255] -function getRGB(color) { - var result; - - // Check if we're already dealing with an array of colors - if ( color && color.constructor === Array && color.length === 3 ) - return color; - - // Look for rgb(num,num,num) - if (result = /rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/.exec(color)) - return [parseInt(result[1],10), parseInt(result[2],10), parseInt(result[3],10)]; - - // Look for rgb(num%,num%,num%) - if (result = /rgb\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*\)/.exec(color)) - return [parseFloat(result[1])*2.55, parseFloat(result[2])*2.55, parseFloat(result[3])*2.55]; - - // Look for #a0b1c2 - if (result = /#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec(color)) - return [parseInt(result[1],16), parseInt(result[2],16), parseInt(result[3],16)]; - - // Look for #fff - if (result = /#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/.exec(color)) - return [parseInt(result[1]+result[1],16), parseInt(result[2]+result[2],16), parseInt(result[3]+result[3],16)]; - - // Look for rgba(0, 0, 0, 0) == transparent in Safari 3 - if (result = /rgba\(0, 0, 0, 0\)/.exec(color)) - return colors["transparent"]; - - // Otherwise, we're most likely dealing with a named color - return colors[$.trim(color).toLowerCase()]; -} - -function getColor(elem, attr) { - var color; - - do { - color = $.curCSS(elem, attr); - - // Keep going until we find an element that has color, or we hit the body - if ( color != "" && color !== "transparent" || $.nodeName(elem, "body") ) - break; - - attr = "backgroundColor"; - } while ( elem = elem.parentNode ); - - return getRGB(color); -}; - -// Some named colors to work with -// From Interface by Stefan Petre -// http://interface.eyecon.ro/ - -var colors = { - aqua:[0,255,255], - azure:[240,255,255], - beige:[245,245,220], - black:[0,0,0], - blue:[0,0,255], - brown:[165,42,42], - cyan:[0,255,255], - darkblue:[0,0,139], - darkcyan:[0,139,139], - darkgrey:[169,169,169], - darkgreen:[0,100,0], - darkkhaki:[189,183,107], - darkmagenta:[139,0,139], - darkolivegreen:[85,107,47], - darkorange:[255,140,0], - darkorchid:[153,50,204], - darkred:[139,0,0], - darksalmon:[233,150,122], - darkviolet:[148,0,211], - fuchsia:[255,0,255], - gold:[255,215,0], - green:[0,128,0], - indigo:[75,0,130], - khaki:[240,230,140], - lightblue:[173,216,230], - lightcyan:[224,255,255], - lightgreen:[144,238,144], - lightgrey:[211,211,211], - lightpink:[255,182,193], - lightyellow:[255,255,224], - lime:[0,255,0], - magenta:[255,0,255], - maroon:[128,0,0], - navy:[0,0,128], - olive:[128,128,0], - orange:[255,165,0], - pink:[255,192,203], - purple:[128,0,128], - violet:[128,0,128], - red:[255,0,0], - silver:[192,192,192], - white:[255,255,255], - yellow:[255,255,0], - transparent: [255,255,255] -}; - - - -/******************************************************************************/ -/****************************** CLASS ANIMATIONS ******************************/ -/******************************************************************************/ - -var classAnimationActions = [ "add", "remove", "toggle" ], - shorthandStyles = { - border: 1, - borderBottom: 1, - borderColor: 1, - borderLeft: 1, - borderRight: 1, - borderTop: 1, - borderWidth: 1, - margin: 1, - padding: 1 - }, - // prefix used for storing data on .data() - dataSpace = "ec.storage."; - -$.each([ "borderLeftStyle", "borderRightStyle", "borderBottomStyle", "borderTopStyle" ], function( _, prop ) { - $.fx.step[ prop ] = function( fx ) { - if ( fx.end !== "none" && !fx.setAttr || fx.pos === 1 && !fx.setAttr ) { - jQuery.style( fx.elem, prop, fx.end ); - fx.setAttr = true; - } - }; -}); - -function getElementStyles() { - var style = this.ownerDocument.defaultView - ? this.ownerDocument.defaultView.getComputedStyle( this, null ) - : this.currentStyle, - newStyle = {}, - key, - camelCase, - len; - - // webkit enumerates style porperties - if ( style && style.length && style[ 0 ] && style[ style[ 0 ] ] ) { - len = style.length; - while ( len-- ) { - key = style[ len ]; - if ( typeof style[ key ] === "string" ) { - newStyle[ $.camelCase( key ) ] = style[ key ]; - } - } - } else { - for ( key in style ) { - if ( typeof style[ key ] === "string" ) { - newStyle[ key ] = style[ key ]; - } - } - } - - return newStyle; -} - - -function styleDifference( oldStyle, newStyle ) { - var diff = {}, - name, value; - - for ( name in newStyle ) { - value = newStyle[ name ]; - if ( oldStyle[ name ] != value ) { - if ( !shorthandStyles[ name ] ) { - if ( $.fx.step[ name ] || !isNaN( parseFloat( value ) ) ) { - diff[ name ] = value; - } - } - } - } - - return diff; -} - -$.effects.animateClass = function( value, duration, easing, callback ) { - var o = $.speed( duration, easing, callback ); - - return this.queue( function() { - var animated = $( this ), - baseClass = animated.attr( "class" ) || "", - finalClass, - allAnimations = o.children ? animated.find( "*" ).andSelf() : animated; - - // map the animated objects to store the original styles. - allAnimations = allAnimations.map(function() { - var el = $( this ); - return { - el: el, - originalStyleAttr: el.attr( "style" ) || " ", - start: getElementStyles.call( this ) - }; - }); - - // apply class change - $.each( classAnimationActions, function(i, action) { - if ( value[ action ] ) { - animated[ action + "Class" ]( value[ action ] ); - } - }); - finalClass = animated.attr( "class" ); - - // map all animated objects again - calculate new styles and diff - allAnimations = allAnimations.map(function() { - this.end = getElementStyles.call( this.el[ 0 ] ); - this.diff = styleDifference( this.start, this.end ); - return this; - }); - - // apply original class - animated.attr( "class", baseClass ); - - // map all animated objects again - this time collecting a promise - allAnimations = allAnimations.map(function() { - var styleInfo = this, - dfd = $.Deferred(); - - this.el.animate( this.diff, { - duration: o.duration, - easing: o.easing, - queue: false, - complete: function() { - dfd.resolve( styleInfo ); - } - }); - return dfd.promise(); - }); - - // once all animations have completed: - $.when.apply( $, allAnimations.get() ).done(function() { - - // set the final class - animated.attr( "class", finalClass ); - - // for each animated element - $.each( arguments, function() { - if ( typeof this.el.attr( "style" ) === "object" ) { - this.el.attr( "style" ).cssText = ""; - this.el.attr( "style" ).cssText = this.originalStyleAttr; - } else { - this.el.attr( "style", this.originalStyleAttr ); - } - }); - - // this is guarnteed to be there if you use jQuery.speed() - // it also handles dequeuing the next anim... - o.complete.call( animated[ 0 ] ); - }); - }); -}; - -$.fn.extend({ - _addClass: $.fn.addClass, - addClass: function( classNames, speed, easing, callback ) { - return speed ? - $.effects.animateClass.apply( this, [{ add: classNames }, speed, easing, callback ]) : - this._addClass(classNames); - }, - - _removeClass: $.fn.removeClass, - removeClass: function( classNames, speed, easing, callback ) { - return speed ? - $.effects.animateClass.apply( this, [{ remove: classNames }, speed, easing, callback ]) : - this._removeClass(classNames); - }, - - _toggleClass: $.fn.toggleClass, - toggleClass: function( classNames, force, speed, easing, callback ) { - if ( typeof force === "boolean" || force === undefined ) { - if ( !speed ) { - // without speed parameter; - return this._toggleClass( classNames, force ); - } else { - return $.effects.animateClass.apply( this, [( force ? { add:classNames } : { remove:classNames }), speed, easing, callback ]); - } - } else { - // without force parameter; - return $.effects.animateClass.apply( this, [{ toggle: classNames }, force, speed, easing ]); - } - }, - - switchClass: function( remove, add, speed, easing, callback) { - return $.effects.animateClass.apply( this, [{ - add: add, - remove: remove - }, speed, easing, callback ]); - } -}); - - - -/******************************************************************************/ -/*********************************** EFFECTS **********************************/ -/******************************************************************************/ - -$.extend( $.effects, { - version: "1.9pre", - - // Saves a set of properties in a data storage - save: function( element, set ) { - for( var i=0; i < set.length; i++ ) { - if ( set[ i ] !== null ) { - element.data( dataSpace + set[ i ], element[ 0 ].style[ set[ i ] ] ); - } - } - }, - - // Restores a set of previously saved properties from a data storage - restore: function( element, set ) { - for( var i=0; i < set.length; i++ ) { - if ( set[ i ] !== null ) { - element.css( set[ i ], element.data( dataSpace + set[ i ] ) ); - } - } - }, - - setMode: function( el, mode ) { - if (mode === "toggle") { - mode = el.is( ":hidden" ) ? "show" : "hide"; - } - return mode; - }, - - // Translates a [top,left] array into a baseline value - // this should be a little more flexible in the future to handle a string & hash - getBaseline: function( origin, original ) { - var y, x; - switch ( origin[ 0 ] ) { - case "top": y = 0; break; - case "middle": y = 0.5; break; - case "bottom": y = 1; break; - default: y = origin[ 0 ] / original.height; - }; - switch ( origin[ 1 ] ) { - case "left": x = 0; break; - case "center": x = 0.5; break; - case "right": x = 1; break; - default: x = origin[ 1 ] / original.width; - }; - return { - x: x, - y: y - }; - }, - - // Wraps the element around a wrapper that copies position properties - createWrapper: function( element ) { - - // if the element is already wrapped, return it - if ( element.parent().is( ".ui-effects-wrapper" )) { - return element.parent(); - } - - // wrap the element - var props = { - width: element.outerWidth(true), - height: element.outerHeight(true), - "float": element.css( "float" ) - }, - wrapper = $( "
      " ) - .addClass( "ui-effects-wrapper" ) - .css({ - fontSize: "100%", - background: "transparent", - border: "none", - margin: 0, - padding: 0 - }), - // Store the size in case width/height are defined in % - Fixes #5245 - size = { - width: element.width(), - height: element.height() - }, - active = document.activeElement; - - element.wrap( wrapper ); - - // Fixes #7595 - Elements lose focus when wrapped. - if ( element[ 0 ] === active || $.contains( element[ 0 ], active ) ) { - $( active ).focus(); - } - - wrapper = element.parent(); //Hotfix for jQuery 1.4 since some change in wrap() seems to actually loose the reference to the wrapped element - - // transfer positioning properties to the wrapper - if ( element.css( "position" ) === "static" ) { - wrapper.css({ position: "relative" }); - element.css({ position: "relative" }); - } else { - $.extend( props, { - position: element.css( "position" ), - zIndex: element.css( "z-index" ) - }); - $.each([ "top", "left", "bottom", "right" ], function(i, pos) { - props[ pos ] = element.css( pos ); - if ( isNaN( parseInt( props[ pos ], 10 ) ) ) { - props[ pos ] = "auto"; - } - }); - element.css({ - position: "relative", - top: 0, - left: 0, - right: "auto", - bottom: "auto" - }); - } - element.css(size); - - return wrapper.css( props ).show(); - }, - - removeWrapper: function( element ) { - var active = document.activeElement; - - if ( element.parent().is( ".ui-effects-wrapper" ) ) { - element.parent().replaceWith( element ); - - // Fixes #7595 - Elements lose focus when wrapped. - if ( element[ 0 ] === active || $.contains( element[ 0 ], active ) ) { - $( active ).focus(); - } - } - - - return element; - }, - - setTransition: function( element, list, factor, value ) { - value = value || {}; - $.each( list, function(i, x){ - var unit = element.cssUnit( x ); - if ( unit[ 0 ] > 0 ) value[ x ] = unit[ 0 ] * factor + unit[ 1 ]; - }); - return value; - } -}); - -// return an effect options object for the given parameters: -function _normalizeArguments( effect, options, speed, callback ) { - - // short path for passing an effect options object: - if ( $.isPlainObject( effect ) ) { - return effect; - } - - // convert to an object - effect = { effect: effect }; - - // catch (effect) - if ( options === undefined ) { - options = {}; - } - - // catch (effect, callback) - if ( $.isFunction( options ) ) { - callback = options; - speed = null; - options = {}; - } - - // catch (effect, speed, ?) - if ( $.type( options ) === "number" || $.fx.speeds[ options ]) { - callback = speed; - speed = options; - options = {}; - } - - // catch (effect, options, callback) - if ( $.isFunction( speed ) ) { - callback = speed; - speed = null; - } - - // add options to effect - if ( options ) { - $.extend( effect, options ); - } - - speed = speed || options.duration; - effect.duration = $.fx.off ? 0 : typeof speed === "number" - ? speed : speed in $.fx.speeds ? $.fx.speeds[ speed ] : $.fx.speeds._default; - - effect.complete = callback || options.complete; - - return effect; -} - -function standardSpeed( speed ) { - // valid standard speeds - if ( !speed || typeof speed === "number" || $.fx.speeds[ speed ] ) { - return true; - } - - // invalid strings - treat as "normal" speed - if ( typeof speed === "string" && !$.effects.effect[ speed ] ) { - // TODO: remove in 2.0 (#7115) - if ( backCompat && $.effects[ speed ] ) { - return false; - } - return true; - } - - return false; -} - -$.fn.extend({ - effect: function( effect, options, speed, callback ) { - var args = _normalizeArguments.apply( this, arguments ), - mode = args.mode, - queue = args.queue, - effectMethod = $.effects.effect[ args.effect ], - - // DEPRECATED: remove in 2.0 (#7115) - oldEffectMethod = !effectMethod && backCompat && $.effects[ args.effect ]; - - if ( $.fx.off || !( effectMethod || oldEffectMethod ) ) { - // delegate to the original method (e.g., .show()) if possible - if ( mode ) { - return this[ mode ]( args.duration, args.complete ); - } else { - return this.each( function() { - if ( args.complete ) { - args.complete.call( this ); - } - }); - } - } - - function run( next ) { - var elem = $( this ), - complete = args.complete, - mode = args.mode; - - function done() { - if ( $.isFunction( complete ) ) { - complete.call( elem[0] ); - } - if ( $.isFunction( next ) ) { - next(); - } - } - - // if the element is hiddden and mode is hide, - // or element is visible and mode is show - if ( elem.is( ":hidden" ) ? mode === "hide" : mode === "show" ) { - done(); - } else { - effectMethod.call( elem[0], args, done ); - } - } - - // TODO: remove this check in 2.0, effectMethod will always be true - if ( effectMethod ) { - return queue === false ? this.each( run ) : this.queue( queue || "fx", run ); - } else { - // DEPRECATED: remove in 2.0 (#7115) - return oldEffectMethod.call(this, { - options: args, - duration: args.duration, - callback: args.complete, - mode: args.mode - }); - } - }, - - _show: $.fn.show, - show: function( speed ) { - if ( standardSpeed( speed ) ) { - return this._show.apply( this, arguments ); - } else { - var args = _normalizeArguments.apply( this, arguments ); - args.mode = "show"; - return this.effect.call( this, args ); - } - }, - - _hide: $.fn.hide, - hide: function( speed ) { - if ( standardSpeed( speed ) ) { - return this._hide.apply( this, arguments ); - } else { - var args = _normalizeArguments.apply( this, arguments ); - args.mode = "hide"; - return this.effect.call( this, args ); - } - }, - - // jQuery core overloads toggle and creates _toggle - __toggle: $.fn.toggle, - toggle: function( speed ) { - if ( standardSpeed( speed ) || typeof speed === "boolean" || $.isFunction( speed ) ) { - return this.__toggle.apply( this, arguments ); - } else { - var args = _normalizeArguments.apply( this, arguments ); - args.mode = "toggle"; - return this.effect.call( this, args ); - } - }, - - // helper functions - cssUnit: function(key) { - var style = this.css( key ), - val = []; - - $.each( [ "em", "px", "%", "pt" ], function( i, unit ) { - if ( style.indexOf( unit ) > 0 ) - val = [ parseFloat( style ), unit ]; - }); - return val; - } -}); - - - -/******************************************************************************/ -/*********************************** EASING ***********************************/ -/******************************************************************************/ - -/* - * jQuery Easing v1.3 - http://gsgd.co.uk/sandbox/jquery/easing/ - * - * Uses the built in easing capabilities added In jQuery 1.1 - * to offer multiple easing options - * - * TERMS OF USE - jQuery Easing - * - * Open source under the BSD License. - * - * Copyright 2008 George McGinley Smith - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * Redistributions of source code must retain the above copyright notice, this list of - * conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright notice, this list - * of conditions and the following disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * Neither the name of the author nor the names of contributors may be used to endorse - * or promote products derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY - * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE - * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED - * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED - * OF THE POSSIBILITY OF SUCH DAMAGE. - * -*/ - -// t: current time, b: begInnIng value, c: change In value, d: duration -$.easing.jswing = $.easing.swing; - -$.extend( $.easing, { - def: "easeOutQuad", - swing: function ( x, t, b, c, d ) { - return $.easing[ $.easing.def ]( x, t, b, c, d ); - }, - easeInQuad: function ( x, t, b, c, d ) { - return c * ( t /= d ) * t + b; - }, - easeOutQuad: function ( x, t, b, c, d ) { - return -c * ( t /= d ) * ( t - 2 ) + b; - }, - easeInOutQuad: function ( x, t, b, c, d ) { - if ( ( t /= d / 2 ) < 1 ) return c / 2 * t * t + b; - return -c / 2 * ( ( --t ) * ( t-2 ) - 1) + b; - }, - easeInCubic: function ( x, t, b, c, d ) { - return c * ( t /= d ) * t * t + b; - }, - easeOutCubic: function ( x, t, b, c, d ) { - return c * ( ( t = t / d - 1 ) * t * t + 1 ) + b; - }, - easeInOutCubic: function ( x, t, b, c, d ) { - if ( ( t /= d / 2 ) < 1 ) return c / 2 * t * t * t + b; - return c / 2 * ( ( t -= 2 ) * t * t + 2) + b; - }, - easeInQuart: function ( x, t, b, c, d ) { - return c * ( t /= d ) * t * t * t + b; - }, - easeOutQuart: function ( x, t, b, c, d ) { - return -c * ( ( t = t / d - 1 ) * t * t * t - 1) + b; - }, - easeInOutQuart: function ( x, t, b, c, d ) { - if ( (t /= d / 2 ) < 1 ) return c / 2 * t * t * t * t + b; - return -c / 2 * ( ( t -= 2 ) * t * t * t - 2) + b; - }, - easeInQuint: function ( x, t, b, c, d ) { - return c * ( t /= d ) * t * t * t * t + b; - }, - easeOutQuint: function ( x, t, b, c, d ) { - return c * ( ( t = t / d - 1 ) * t * t * t * t + 1) + b; - }, - easeInOutQuint: function ( x, t, b, c, d ) { - if ( ( t /= d / 2 ) < 1 ) return c / 2 * t * t * t * t * t + b; - return c / 2 * ( ( t -= 2 ) * t * t * t * t + 2) + b; - }, - easeInSine: function ( x, t, b, c, d ) { - return -c * Math.cos( t / d * ( Math.PI / 2 ) ) + c + b; - }, - easeOutSine: function ( x, t, b, c, d ) { - return c * Math.sin( t / d * ( Math.PI /2 ) ) + b; - }, - easeInOutSine: function ( x, t, b, c, d ) { - return -c / 2 * ( Math.cos( Math.PI * t / d ) - 1 ) + b; - }, - easeInExpo: function ( x, t, b, c, d ) { - return ( t==0 ) ? b : c * Math.pow( 2, 10 * ( t / d - 1) ) + b; - }, - easeOutExpo: function ( x, t, b, c, d ) { - return ( t==d ) ? b + c : c * ( -Math.pow( 2, -10 * t / d) + 1) + b; - }, - easeInOutExpo: function ( x, t, b, c, d ) { - if ( t==0 ) return b; - if ( t==d ) return b + c; - if ( ( t /= d / 2) < 1) return c / 2 * Math.pow( 2, 10 * (t - 1) ) + b; - return c / 2 * ( -Math.pow( 2, -10 * --t ) + 2 ) + b; - }, - easeInCirc: function ( x, t, b, c, d ) { - return -c * ( Math.sqrt( 1 - ( t /= d ) * t ) - 1 ) + b; - }, - easeOutCirc: function ( x, t, b, c, d ) { - return c * Math.sqrt( 1 - ( t = t / d - 1 ) * t ) + b; - }, - easeInOutCirc: function ( x, t, b, c, d ) { - if ( ( t /= d / 2) < 1 ) return -c / 2 * ( Math.sqrt( 1 - t * t ) - 1 ) + b; - return c / 2 * ( Math.sqrt( 1 - ( t -= 2 ) * t ) + 1 ) + b; - }, - easeInElastic: function ( x, t, b, c, d ) { - var s = 1.70158, - p = d * 0.3, - a = c; - if ( t == 0 ) return b; - if ( ( t /= d ) == 1 ) return b+c; - if ( a < Math.abs( c ) ) { - a = c; - s = p / 4; - } else { - s = p / ( 2 * Math.PI ) * Math.asin( c / a ); - } - return - ( a * Math.pow( 2, 10 * ( t -= 1 ) ) * Math.sin( ( t * d - s) * ( 2 * Math.PI ) / p ) ) + b; - }, - easeOutElastic: function ( x, t, b, c, d ) { - var s = 1.70158, - p = d * 0.3, - a = c; - if ( t == 0 ) return b; - if ( ( t /= d ) == 1 ) return b+c; - if ( a < Math.abs( c ) ) { - a = c; - s = p / 4; - } else { - s = p / ( 2 * Math.PI ) * Math.asin( c / a ); - } - return a * Math.pow( 2, -10 * t ) * Math.sin( ( t * d - s ) * ( 2 * Math.PI ) / p ) + c + b; - }, - easeInOutElastic: function ( x, t, b, c, d ) { - var s = 1.70158, - p = d * ( 0.3 * 1.5 ), - a = c; - if ( t == 0 ) return b; - if ( ( t /= d / 2 ) == 2 ) return b+c; - if ( a < Math.abs( c ) ) { - a = c; - s = p / 4; - } else { - s = p / ( 2 * Math.PI ) * Math.asin( c / a ); - } - if ( t < 1 ) return -.5 * ( a * Math.pow( 2, 10 * ( t -= 1 ) ) * Math.sin( ( t * d - s ) * ( 2 * Math.PI ) / p ) ) + b; - return a * Math.pow( 2, -10 * ( t -= 1 ) ) * Math.sin( ( t * d - s ) * ( 2 * Math.PI ) / p ) *.5 + c + b; - }, - easeInBack: function ( x, t, b, c, d, s ) { - if ( s == undefined ) s = 1.70158; - return c * ( t /= d ) * t * ( ( s+1 ) * t - s ) + b; - }, - easeOutBack: function ( x, t, b, c, d, s ) { - if ( s == undefined ) s = 1.70158; - return c * ( ( t = t / d - 1 ) * t * ( ( s + 1 ) * t + s) + 1) + b; - }, - easeInOutBack: function ( x, t, b, c, d, s ) { - if ( s == undefined ) s = 1.70158; - if ( ( t /= d / 2 ) < 1 ) return c / 2 * ( t * t * ( ( ( s *= 1.525 ) + 1 ) * t - s ) ) + b; - return c / 2 * ( ( t -= 2 ) * t * ( ( ( s *= 1.525 ) + 1 ) * t + s) + 2) + b; - }, - easeInBounce: function ( x, t, b, c, d ) { - return c - $.easing.easeOutBounce( x, d - t, 0, c, d ) + b; - }, - easeOutBounce: function ( x, t, b, c, d ) { - if ( ( t /= d ) < ( 1 / 2.75 ) ) { - return c * ( 7.5625 * t * t ) + b; - } else if ( t < ( 2 / 2.75 ) ) { - return c * ( 7.5625 * ( t -= ( 1.5 / 2.75 ) ) * t + .75 ) + b; - } else if ( t < ( 2.5 / 2.75 ) ) { - return c * ( 7.5625 * ( t -= ( 2.25/ 2.75 ) ) * t + .9375 ) + b; - } else { - return c * ( 7.5625 * ( t -= ( 2.625 / 2.75 ) ) * t + .984375 ) + b; - } - }, - easeInOutBounce: function ( x, t, b, c, d ) { - if ( t < d / 2 ) return $.easing.easeInBounce( x, t * 2, 0, c, d ) * .5 + b; - return $.easing.easeOutBounce( x, t * 2 - d, 0, c, d ) * .5 + c * .5 + b; - } -}); - -/* - * - * TERMS OF USE - EASING EQUATIONS - * - * Open source under the BSD License. - * - * Copyright 2001 Robert Penner - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * Redistributions of source code must retain the above copyright notice, this list of - * conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright notice, this list - * of conditions and the following disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * Neither the name of the author nor the names of contributors may be used to endorse - * or promote products derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY - * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE - * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED - * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED - * OF THE POSSIBILITY OF SUCH DAMAGE. - * - */ - -})(jQuery); diff --git a/libreplan-webapp/src/main/webapp/jqplot/examples/jquery-ui/js/jquery.effects.core.min.js b/libreplan-webapp/src/main/webapp/jqplot/examples/jquery-ui/js/jquery.effects.core.min.js deleted file mode 100644 index 9e92123a7..000000000 --- a/libreplan-webapp/src/main/webapp/jqplot/examples/jquery-ui/js/jquery.effects.core.min.js +++ /dev/null @@ -1,32 +0,0 @@ -/* - * jQuery UI Effects 1.9pre - * - * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) - * Dual licensed under the MIT or GPL Version 2 licenses. - * http://jquery.org/license - * - * http://docs.jquery.com/UI/Effects/ - */ -jQuery.effects||function(f,m){function r(c){var a;if(c&&c.constructor===Array&&c.length===3)return c;if(a=/rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/.exec(c))return[parseInt(a[1],10),parseInt(a[2],10),parseInt(a[3],10)];if(a=/rgb\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*\)/.exec(c))return[parseFloat(a[1])*2.55,parseFloat(a[2])*2.55,parseFloat(a[3])*2.55];if(a=/#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec(c))return[parseInt(a[1], -16),parseInt(a[2],16),parseInt(a[3],16)];if(a=/#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/.exec(c))return[parseInt(a[1]+a[1],16),parseInt(a[2]+a[2],16),parseInt(a[3]+a[3],16)];if(/rgba\(0, 0, 0, 0\)/.exec(c))return s.transparent;return s[f.trim(c).toLowerCase()]}function t(){var c=this.ownerDocument.defaultView?this.ownerDocument.defaultView.getComputedStyle(this,null):this.currentStyle,a={},b,d;if(c&&c.length&&c[0]&&c[c[0]])for(d=c.length;d--;){b=c[d];if(typeof c[b]==="string")a[f.camelCase(b)]=c[b]}else for(b in c)if(typeof c[b]=== -"string")a[b]=c[b];return a}function o(c,a,b,d){if(f.isPlainObject(c))return c;c={effect:c};if(a===m)a={};if(f.isFunction(a)){d=a;b=null;a={}}if(f.type(a)==="number"||f.fx.speeds[a]){d=b;b=a;a={}}if(f.isFunction(b)){d=b;b=null}a&&f.extend(c,a);b=b||a.duration;c.duration=f.fx.off?0:typeof b==="number"?b:b in f.fx.speeds?f.fx.speeds[b]:f.fx.speeds._default;c.complete=d||a.complete;return c}function q(c){if(!c||typeof c==="number"||f.fx.speeds[c])return true;if(typeof c==="string"&&!f.effects.effect[c]){if(u&& -f.effects[c])return false;return true}return false}var u=f.uiBackCompat!==false;f.effects={effect:{}};f.each(["backgroundColor","borderBottomColor","borderLeftColor","borderRightColor","borderTopColor","borderColor","color","outlineColor"],function(c,a){f.fx.step[a]=function(b){if(!b.colorInit){var d;d=b.elem;var e=a,g;do{g=f.curCSS(d,e);if(g!=""&&g!=="transparent"||f.nodeName(d,"body"))break;e="backgroundColor"}while(d=d.parentNode);d=r(g);b.start=d;b.end=r(b.end);b.colorInit=true}b.elem.style[a]= -"rgb("+Math.max(Math.min(parseInt(b.pos*(b.end[0]-b.start[0])+b.start[0],10),255),0)+","+Math.max(Math.min(parseInt(b.pos*(b.end[1]-b.start[1])+b.start[1],10),255),0)+","+Math.max(Math.min(parseInt(b.pos*(b.end[2]-b.start[2])+b.start[2],10),255),0)+")"}});var s={aqua:[0,255,255],azure:[240,255,255],beige:[245,245,220],black:[0,0,0],blue:[0,0,255],brown:[165,42,42],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgrey:[169,169,169],darkgreen:[0,100,0],darkkhaki:[189,183,107],darkmagenta:[139, -0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkviolet:[148,0,211],fuchsia:[255,0,255],gold:[255,215,0],green:[0,128,0],indigo:[75,0,130],khaki:[240,230,140],lightblue:[173,216,230],lightcyan:[224,255,255],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightyellow:[255,255,224],lime:[0,255,0],magenta:[255,0,255],maroon:[128,0,0],navy:[0,0,128],olive:[128,128,0],orange:[255,165,0],pink:[255,192, -203],purple:[128,0,128],violet:[128,0,128],red:[255,0,0],silver:[192,192,192],white:[255,255,255],yellow:[255,255,0],transparent:[255,255,255]},w=["add","remove","toggle"],x={border:1,borderBottom:1,borderColor:1,borderLeft:1,borderRight:1,borderTop:1,borderWidth:1,margin:1,padding:1};f.each(["borderLeftStyle","borderRightStyle","borderBottomStyle","borderTopStyle"],function(c,a){f.fx.step[a]=function(b){if(b.end!=="none"&&!b.setAttr||b.pos===1&&!b.setAttr){jQuery.style(b.elem,a,b.end);b.setAttr= -true}}});f.effects.animateClass=function(c,a,b,d){var e=f.speed(a,b,d);return this.queue(function(){var g=f(this),h=g.attr("class")||"",n,j=e.children?g.find("*").andSelf():g;j=j.map(function(){var k=f(this);return{el:k,originalStyleAttr:k.attr("style")||" ",start:t.call(this)}});f.each(w,function(k,i){if(c[i])g[i+"Class"](c[i])});n=g.attr("class");j=j.map(function(){this.end=t.call(this.el[0]);var k=this.start,i=this.end,v={},l,p;for(l in i){p=i[l];if(k[l]!=p)if(!x[l])if(f.fx.step[l]||!isNaN(parseFloat(p)))v[l]= -p}this.diff=v;return this});g.attr("class",h);j=j.map(function(){var k=this,i=f.Deferred();this.el.animate(this.diff,{duration:e.duration,easing:e.easing,queue:false,complete:function(){i.resolve(k)}});return i.promise()});f.when.apply(f,j.get()).done(function(){g.attr("class",n);f.each(arguments,function(){if(typeof this.el.attr("style")==="object"){this.el.attr("style").cssText="";this.el.attr("style").cssText=this.originalStyleAttr}else this.el.attr("style",this.originalStyleAttr)});e.complete.call(g[0])})})}; -f.fn.extend({_addClass:f.fn.addClass,addClass:function(c,a,b,d){return a?f.effects.animateClass.apply(this,[{add:c},a,b,d]):this._addClass(c)},_removeClass:f.fn.removeClass,removeClass:function(c,a,b,d){return a?f.effects.animateClass.apply(this,[{remove:c},a,b,d]):this._removeClass(c)},_toggleClass:f.fn.toggleClass,toggleClass:function(c,a,b,d,e){return typeof a==="boolean"||a===m?b?f.effects.animateClass.apply(this,[a?{add:c}:{remove:c},b,d,e]):this._toggleClass(c,a):f.effects.animateClass.apply(this, -[{toggle:c},a,b,d])},switchClass:function(c,a,b,d,e){return f.effects.animateClass.apply(this,[{add:a,remove:c},b,d,e])}});f.extend(f.effects,{version:"1.9pre",save:function(c,a){for(var b=0;b
      ").addClass("ui-effects-wrapper").css({fontSize:"100%",background:"transparent",border:"none",margin:0,padding:0}), -d={width:c.width(),height:c.height()},e=document.activeElement;c.wrap(b);if(c[0]===e||f.contains(c[0],e))f(e).focus();b=c.parent();if(c.css("position")==="static"){b.css({position:"relative"});c.css({position:"relative"})}else{f.extend(a,{position:c.css("position"),zIndex:c.css("z-index")});f.each(["top","left","bottom","right"],function(g,h){a[h]=c.css(h);if(isNaN(parseInt(a[h],10)))a[h]="auto"});c.css({position:"relative",top:0,left:0,right:"auto",bottom:"auto"})}c.css(d);return b.css(a).show()}, -removeWrapper:function(c){var a=document.activeElement;if(c.parent().is(".ui-effects-wrapper")){c.parent().replaceWith(c);if(c[0]===a||f.contains(c[0],a))f(a).focus()}return c},setTransition:function(c,a,b,d){d=d||{};f.each(a,function(e,g){var h=c.cssUnit(g);if(h[0]>0)d[g]=h[0]*b+h[1]});return d}});f.fn.extend({effect:function(){function c(h){function n(){f.isFunction(k)&&k.call(j[0]);f.isFunction(h)&&h()}var j=f(this),k=a.complete,i=a.mode;(j.is(":hidden")?i==="hide":i==="show")?n():e.call(j[0], -a,n)}var a=o.apply(this,arguments),b=a.mode,d=a.queue,e=f.effects.effect[a.effect],g=!e&&u&&f.effects[a.effect];if(f.fx.off||!(e||g))return b?this[b](a.duration,a.complete):this.each(function(){a.complete&&a.complete.call(this)});return e?d===false?this.each(c):this.queue(d||"fx",c):g.call(this,{options:a,duration:a.duration,callback:a.complete,mode:a.mode})},_show:f.fn.show,show:function(c){if(q(c))return this._show.apply(this,arguments);else{var a=o.apply(this,arguments);a.mode="show";return this.effect.call(this, -a)}},_hide:f.fn.hide,hide:function(c){if(q(c))return this._hide.apply(this,arguments);else{var a=o.apply(this,arguments);a.mode="hide";return this.effect.call(this,a)}},__toggle:f.fn.toggle,toggle:function(c){if(q(c)||typeof c==="boolean"||f.isFunction(c))return this.__toggle.apply(this,arguments);else{var a=o.apply(this,arguments);a.mode="toggle";return this.effect.call(this,a)}},cssUnit:function(c){var a=this.css(c),b=[];f.each(["em","px","%","pt"],function(d,e){if(a.indexOf(e)>0)b=[parseFloat(a), -e]});return b}});f.easing.jswing=f.easing.swing;f.extend(f.easing,{def:"easeOutQuad",swing:function(c,a,b,d,e){return f.easing[f.easing.def](c,a,b,d,e)},easeInQuad:function(c,a,b,d,e){return d*(a/=e)*a+b},easeOutQuad:function(c,a,b,d,e){return-d*(a/=e)*(a-2)+b},easeInOutQuad:function(c,a,b,d,e){if((a/=e/2)<1)return d/2*a*a+b;return-d/2*(--a*(a-2)-1)+b},easeInCubic:function(c,a,b,d,e){return d*(a/=e)*a*a+b},easeOutCubic:function(c,a,b,d,e){return d*((a=a/e-1)*a*a+1)+b},easeInOutCubic:function(c,a, -b,d,e){if((a/=e/2)<1)return d/2*a*a*a+b;return d/2*((a-=2)*a*a+2)+b},easeInQuart:function(c,a,b,d,e){return d*(a/=e)*a*a*a+b},easeOutQuart:function(c,a,b,d,e){return-d*((a=a/e-1)*a*a*a-1)+b},easeInOutQuart:function(c,a,b,d,e){if((a/=e/2)<1)return d/2*a*a*a*a+b;return-d/2*((a-=2)*a*a*a-2)+b},easeInQuint:function(c,a,b,d,e){return d*(a/=e)*a*a*a*a+b},easeOutQuint:function(c,a,b,d,e){return d*((a=a/e-1)*a*a*a*a+1)+b},easeInOutQuint:function(c,a,b,d,e){if((a/=e/2)<1)return d/2*a*a*a*a*a+b;return d/2* -((a-=2)*a*a*a*a+2)+b},easeInSine:function(c,a,b,d,e){return-d*Math.cos(a/e*(Math.PI/2))+d+b},easeOutSine:function(c,a,b,d,e){return d*Math.sin(a/e*(Math.PI/2))+b},easeInOutSine:function(c,a,b,d,e){return-d/2*(Math.cos(Math.PI*a/e)-1)+b},easeInExpo:function(c,a,b,d,e){return a==0?b:d*Math.pow(2,10*(a/e-1))+b},easeOutExpo:function(c,a,b,d,e){return a==e?b+d:d*(-Math.pow(2,-10*a/e)+1)+b},easeInOutExpo:function(c,a,b,d,e){if(a==0)return b;if(a==e)return b+d;if((a/=e/2)<1)return d/2*Math.pow(2,10*(a-1))+ -b;return d/2*(-Math.pow(2,-10*--a)+2)+b},easeInCirc:function(c,a,b,d,e){return-d*(Math.sqrt(1-(a/=e)*a)-1)+b},easeOutCirc:function(c,a,b,d,e){return d*Math.sqrt(1-(a=a/e-1)*a)+b},easeInOutCirc:function(c,a,b,d,e){if((a/=e/2)<1)return-d/2*(Math.sqrt(1-a*a)-1)+b;return d/2*(Math.sqrt(1-(a-=2)*a)+1)+b},easeInElastic:function(c,a,b,d,e){c=1.70158;var g=e*0.3,h=d;if(a==0)return b;if((a/=e)==1)return b+d;if(h - - - - - Area Chart - - - - - - - - - - - - - -
      - - - - - - - - - - - -
      -
      -
      -
      - -
      
      -  
      -  
      -
      -
      -
      -
      -
      -
      -
      -    
      -    
      -    
      -    
      -
      -
      -
      -
      -  
      -
      -
      -
      -
      -	
      - - - - - - \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/examples/kcp_cdf.html b/libreplan-webapp/src/main/webapp/jqplot/examples/kcp_cdf.html deleted file mode 100644 index 0d5c2698e..000000000 --- a/libreplan-webapp/src/main/webapp/jqplot/examples/kcp_cdf.html +++ /dev/null @@ -1,351 +0,0 @@ - - - - - - Cumulative Density Function Chart - - - - - - - - - - - - - -
      - - - - - - - - - - - - - - - - -
      - -
      - Data Series: -
        -
      • National
      • -
      • Urban
      • -
      • Rural
      • -
      -
      - -
      - Background Color: -
        -
      • Default
      • -
      • Gray
      • -
      -
      - -
      - Line Width: -
        -
      • Thin
      • -
      • Thick
      • -
      -
      - -
      - Grids: -
        -
      • Vertical
      • -
      • Horizontal
      • -
      -
      - -
      - Set lines at: -
        -
      • and
      • -
      • -
      -
      -
      -
      -
      -
      -
      -
      - -
      
      -  
      -  
      -
      -
      -
      -
      -
      -
      -
      -    
      -    
      -    
      -    
      -
      -
      -
      -  
      -  
      -  
      -  
      -  
      -  
      -  
      -
      -
      -
      -
      -	
      - - - - - - \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/examples/kcp_engel.html b/libreplan-webapp/src/main/webapp/jqplot/examples/kcp_engel.html deleted file mode 100644 index 6181ba0a5..000000000 --- a/libreplan-webapp/src/main/webapp/jqplot/examples/kcp_engel.html +++ /dev/null @@ -1,244 +0,0 @@ - - - - - - Engel Curves - - - - - - - - - - - - - -
      - - - - - - - - - - - -
      -
      -
      -
      - -
      
      -  
      -  
      -
      -
      -
      -
      -
      -
      -
      -    
      -    
      -    
      -    
      -
      -
      ->
      -  
      -  
      -  
      -  
      -
      -
      -
      -
      -	
      - - - - - - \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/examples/kcp_lorenz.html b/libreplan-webapp/src/main/webapp/jqplot/examples/kcp_lorenz.html deleted file mode 100644 index 179da5d73..000000000 --- a/libreplan-webapp/src/main/webapp/jqplot/examples/kcp_lorenz.html +++ /dev/null @@ -1,510 +0,0 @@ - - - - - - Lorenz Curves - - - - - - - - - - - - - -
      - - - - - - - - - - - - - - - - -
      - -
      - Data Series: -
        -
      • National
      • -
      • Urban
      • -
      • Rural
      • -
      -
      - -
      - Background Color: -
        -
      • Default
      • -
      • Gray
      • -
      -
      - -
      - Line Width: -
        -
      • Thin
      • -
      • Thick
      • -
      -
      - -
      - Grids: -
        -
      • Vertical
      • -
      • Horizontal
      • -
      -
      - -
      - Set lines at: -
        -
      • and
      • -
      • -
      -
      -
      -
      -
      -
      -
      -
      - -
      
      -  
      -
      -  
      -  
      -
      -
      -
      -
      -
      -
      -
      -    
      -    
      -    
      -    
      -
      -
      ->
      -  
      -  
      -  
      -  
      -  
      -  
      -  
      -
      -
      -
      -
      -	
      - - - - - - \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/examples/kcp_pdf.html b/libreplan-webapp/src/main/webapp/jqplot/examples/kcp_pdf.html deleted file mode 100644 index ca44dac42..000000000 --- a/libreplan-webapp/src/main/webapp/jqplot/examples/kcp_pdf.html +++ /dev/null @@ -1,387 +0,0 @@ - - - - - - Probability Density Function Chart - - - - - - - - - - - - - -
      - - - - - - - - - - - - - - - - -
      - -
      - Data Series: -
        -
      • National
      • -
      • Urban
      • -
      • Rural
      • -
      -
      - -
      - Background Color: -
        -
      • Default
      • -
      • Gray
      • -
      -
      - -
      - Line Width: -
        -
      • Thin
      • -
      • Thick
      • -
      -
      - -
      - Grids: -
        -
      • Vertical
      • -
      • Horizontal
      • -
      -
      - -
      - Set lines at: -
        -
      • and
      • -
      • -
      -
      -
      -
      -
      -
      -
      -
      - -
      
      -  
      -
      - 
      -  
      -
      -
      -
      -
      -
      -
      -
      -    
      -    
      -    
      -    
      -
      -
      ->
      -  
      -  
      -  
      -  
      -  
      -  
      -  
      -
      -
      -
      -
      -	
      - - - - - - \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/examples/kcp_pyramid.html b/libreplan-webapp/src/main/webapp/jqplot/examples/kcp_pyramid.html deleted file mode 100644 index 630ed2d85..000000000 --- a/libreplan-webapp/src/main/webapp/jqplot/examples/kcp_pyramid.html +++ /dev/null @@ -1,580 +0,0 @@ - - - - - - Pyramid Charts - - - - - - - - - - - - - -
      - - - - - - - - - - - - - - - - - -
      - -
      - Axes: - -
      - -
      - Background Color: -
        -
      • Default
      • -
      • Gray
      • -
      -
      - -
      - Pyramid Color: -
        -
      • Green
      • -
      • Blue
      • -
      -
      - -
      - Grids: -
        -
      • Vertical
      • -
      • Horizontal
      • -
      • Only major
      • -
      • Plot Bands
      • -
      -
      - -
      -
        -
      • Gap between bars
      • - -
      • Comparison Line
      • -
      -
      - -
      - - - - - - - - - - - - - -
      Age:
       
      Male:
       
      Female:
       
      Ratio:
       
      -
      -
      -
      -
      -
      -
      -
      - -
      
      -  
      -
      -
      -    
      -
      -
      -
      -
      -
      -
      -
      -    
      -    
      -    
      -    
      -
      -
      -
      -
      -    
      -
      -    
      -    
      -     
      -
      -    
      -    
      -    
      -    
      -
      -
      -
      -
      -	
      - - - - - - \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/examples/kcp_pyramid2.html b/libreplan-webapp/src/main/webapp/jqplot/examples/kcp_pyramid2.html deleted file mode 100644 index ddf6a8d83..000000000 --- a/libreplan-webapp/src/main/webapp/jqplot/examples/kcp_pyramid2.html +++ /dev/null @@ -1,568 +0,0 @@ - - - - - - Pyramid Charts 2 - - - - - - - - - - - - - -
      - - - - - - - - - - - - - - - -
      - -
      - Axes: - -
      - -
      - Background Color: -
        -
      • Default
      • -
      • Gray
      • -
      -
      - -
      - Pyramid Color: -
        -
      • Green
      • -
      • Blue
      • -
      -
      - -
      - Grids: -
        -
      • Vertical
      • -
      • Horizontal
      • -
      • Only major
      • -
      • Plot Bands
      • -
      -
      - -
      -
        -
      • Gap between bars
      • - -
      • Comparison Line
      • -
      -
      - -
      - - - - - - - - - - - - - -
      Age:
       
      Male:
       
      Female:
       
      Ratio:
       
      -
      -
      -
      -
      -
      -
      -
      - -
      
      -  
      -
      -
      -    
      -
      -
      -
      -
      -
      -
      -    
      -    
      -    
      -    
      -
      -
      -
      -
      -    
      -
      -    
      -    
      -     
      -
      -    
      -    
      -    
      -    
      -
      -
      -
      -
      -	
      - - - - - - \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/examples/line-charts.html b/libreplan-webapp/src/main/webapp/jqplot/examples/line-charts.html deleted file mode 100644 index b74a91477..000000000 --- a/libreplan-webapp/src/main/webapp/jqplot/examples/line-charts.html +++ /dev/null @@ -1,193 +0,0 @@ - - - - - - Line Charts and Options - - - - - - - - - - - - - -
      - - - - - - -

      The most basic jqPlot chart takes a series of data and plots a line. No options need to be supplied. Data is passed in as an array of series. A series can be either an array of y values or an array of [x,y] data pairs. If y values only, x values are assigned like 1, 2, 3, ... Note, for this plot you don't need any plugins.

      - -
      - -
      
      -
      -
      -

      The following plot uses a number of options to set the title, add axis labels, and shows how to use the canvasAxisLabelRenderer plugin to provide rotated axis labels.

      - -
      - -
      
      -
      -
      -

      There are numerous line style options to control how the lines and markers are displayed.

      - -
      - -
      
      -
      -  
      -
      -  
      -
      -  
      -
      -
      -
      -
      -
      -
      -
      -
      -    
      -    
      -    
      -    
      -
      -
      -
      -
      -  
      -  
      -
      -
      -
      -
      -	
      - - - - - - \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/examples/mekkoCharts.html b/libreplan-webapp/src/main/webapp/jqplot/examples/mekkoCharts.html deleted file mode 100644 index c80496495..000000000 --- a/libreplan-webapp/src/main/webapp/jqplot/examples/mekkoCharts.html +++ /dev/null @@ -1,269 +0,0 @@ - - - - - - jqPlot Charts and Graphs - - - - - - - - - - - - - -
      - - - - - - -

      Data is specified per bar in the chart. You can specify data as an array of y values, or as an array of [label, value] pairs. Note that labels are used only on the first series. Labels on subsequent series are ignored:

      -
      -bar1 = [['shirts', 8],['hats', 14],['shoes', 6],['gloves', 16],['dolls', 12]];
      -bar2 = [15,6,9,13,6];
      -bar3 = [['grumpy',4],['sneezy',2],['happy',7],['sleepy',9],['doc',7]];
      -
      - -

      If you want to place labels for each bar under the axis, you use the barLabels option on the axes. The bar labels can be styled with the ".jqplot-mekko-barLabel" css class.

      -
      -barLabels = ['Mickey Mouse', 'Donald Duck', 'Goofy'];
      -axes:{xaxis:{barLabels:barLabels}}
      -
      - -
      - -

      You can add a secondary x axes, and the tick spacing of the axes can be separately controlled with the "tickMode" option. "bar" will produce tics at bar boundaries, "even" will produce evenly spaced ticks. If you set the axes max greater than the sum of the data range (the maximum x value), the plot will be padded. Note that you should set the max on both axes to the same value.

      - -
      -axes:{
      -    xaxis:{
      -        barLabels:barLabels,
      -        max: 175
      -    }, 
      -    x2axis:{
      -        show:true, 
      -        tickMode:'even', 
      -        max: 175
      -    }
      -}
      -
      - -

      Here the borders between chart areas have been given a custom color using the "borderColor" option on the series renderer.

      - -
      -    seriesDefaults:{renderer:$.jqplot.MekkoRenderer, rendererOptions: {borderColor: '#dddddd'}}
      -
      - -

      Additionally, the legend can be placed "outside" (the default for a mekko chart) or "inside" of the grid area with the "placement" option on the legend renderer.

      - -
      -legend:{
      -    show:true, 
      -    rendererOptions:{placement: "insideGrid"}, 
      -    location:'e'
      -},
      -
      - -
      - -

      Legend labels can be specified independently of the series with the "labels" option on the legend. These will override any labels specified with the series. There are also options to control the number of rows and number of columns in the legend as well as placement.

      - -

      Here the legend is positioned to the "north" and set to render 1 row tall (number of columns determined automatically). Note that an extra css specification was added to pad the bottom of the title of this chart to give room for the legend above the plot.

      - -
      -legendLabels = ['hotels', 'rides', 'buses', 'instruments', 'totes'];
      -
      -legend:{
      -    show:true, 
      -    location: 'n',
      -    labels: legendLabels,
      -    rendererOptions:{numberRows: 1, placement: "outside"}
      -},    
      -
      - -

      Also, the borders between the chart areas have been turned off with the "showBorders: false" option.

      - -
      -    seriesDefaults:{renderer:$.jqplot.MekkoRenderer, rendererOptions: {showBorders: false}}
      -
      - -
      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      - - - - - - \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/examples/meterGauge.html b/libreplan-webapp/src/main/webapp/jqplot/examples/meterGauge.html deleted file mode 100644 index 21b3510db..000000000 --- a/libreplan-webapp/src/main/webapp/jqplot/examples/meterGauge.html +++ /dev/null @@ -1,179 +0,0 @@ - - - - - - jqPlot Meter Gauge - - - - - - - - - - - - - -
      - - - - - - - - - - -

      A meter gauge plot shows a data value in a speedometer style gauge. The "series" in consists of a single data value that positions the needle on the gauge. The span of the gauge will be automatically determined, or can be set with the "min" and "max" values in the "rendererOptions" of the series. The plot below also specifies a chart title and a "label" for the gauge.

      - -
      - -

      For small gauges, it can be desirable to turn off the tick labels by setting the "showTickLabels" option in the rendererOptions to false. Also, colored interval bands can be specified. The interval ranges are specified as an array of values the "intervals" option and custom colors for each interval can be specified with the "intervalColors" option.

      - -
      - -

      The inner and outer radii of the interval band will automatically adjust when tick Labels are turned on. Also, the gauge minimum and maximum can be specified with the "min" and "max" options in the rendererOptions.

      - -
      - -

      The inner and outer radii of the interval band can also be specified with the "intervalInnerRadius" and "intervalOuterRadius" options. In the plot below, the "labelPosition" option was set to "bottom" to put the gauge label below the plot. The "labelHeightAdjust" option was set to -5 to raise the label slightly (5 pixels) to place it closer to the gauge.

      -

      The gauge automatically resizes to best fit the container. The font size of the tick labels and gauge labels do not size to the container, however. The font size of the tick labels can be controlled by styling the css ".jqplot-meterGauge-ticks" class and the gauge label by the "jqplot-meterGauge-label" class.

      -
      - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      - - - - - - \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/examples/nav.inc b/libreplan-webapp/src/main/webapp/jqplot/examples/nav.inc deleted file mode 100644 index d54a4bf90..000000000 --- a/libreplan-webapp/src/main/webapp/jqplot/examples/nav.inc +++ /dev/null @@ -1,40 +0,0 @@ -
      - Previous Examples Next'; - - ?> -
      diff --git a/libreplan-webapp/src/main/webapp/jqplot/examples/pie-donut-charts.html b/libreplan-webapp/src/main/webapp/jqplot/examples/pie-donut-charts.html deleted file mode 100644 index b615a2d8e..000000000 --- a/libreplan-webapp/src/main/webapp/jqplot/examples/pie-donut-charts.html +++ /dev/null @@ -1,160 +0,0 @@ - - - - - - Pie and Donut Charts - - - - - - - - - - - - - -
      - - - - - - - -

      jqPlot bakes up the best pie and donut charts you've ever tasted! Like bar and filled line plots, pie and donut slices highlight when you mouse over.

      - -
      - -
      
      -
      -

      Too many calories in that pie? Get all the taste without the filling! Highlighting and data labels are still supported. You can even cut out the slices!

      - -
      - -
      
      -
      -

      Coming straight from the same bakery, donut plots have nearly identical options as pie charts.

      - -
      - -
      
      -  
      -
      -
      -
      -
      -
      -
      -
      -
      -
      -
      -
      -
      -    
      -    
      -    
      -    
      -
      -
      -
      -
      -    
      -    
      -
      -
      -
      -
      -	
      - - - - - - \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/examples/pieTest.html b/libreplan-webapp/src/main/webapp/jqplot/examples/pieTest.html deleted file mode 100644 index f215dc847..000000000 --- a/libreplan-webapp/src/main/webapp/jqplot/examples/pieTest.html +++ /dev/null @@ -1,187 +0,0 @@ - - - - - - Pie Charts and Options - - - - - - - - - - - - - -
      - - - - - - - -
      - -
      - -
      - -
      - -
      - -
      - -
      - -
      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      - - - - - - \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/examples/pieTest2.js b/libreplan-webapp/src/main/webapp/jqplot/examples/pieTest2.js deleted file mode 100644 index 91073fe63..000000000 --- a/libreplan-webapp/src/main/webapp/jqplot/examples/pieTest2.js +++ /dev/null @@ -1,80 +0,0 @@ -$(document).ready(function(){ - - $.jqplot.config.enablePlugins = true; - - s1 = [['a',2], ['b',6], ['c',7], ['d',10]]; - s2 = [['a', 4], ['b', 7], ['c', 6], ['d', 3]]; - s3 = [['a', 2], ['b', 1], ['c', 3], ['d', 3]]; - s4 = [['a', 4], ['b', 3], ['c', 2], ['d', 1]]; - - s5 = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]; - - plot1 = $.jqplot('chart1', [s1], { - seriesDefaults:{ - renderer:$.jqplot.PieRenderer - }, - legend: {show:true} - }); - - plot2 = $.jqplot('chart2', [s2], { - seriesDefaults: { - renderer:$.jqplot.PieRenderer, - rendererOptions:{ - sliceMargin: 4, - startAngle: -90 - } - } - }); - - plot3 = $.jqplot('chart3', [s3], { - captureRightClick: true, - seriesDefaults:{ - renderer:$.jqplot.PieRenderer, - shadow: false, - rendererOptions:{ - startAngle: 90, - sliceMargin: 4, - highlightMouseDown: true - } - }, - legend: { - show: true, - location: 'e', - placement: 'outside' - } - }); - - plot5 = $.jqplot('chart5', [s5], { - seriesDefaults:{ - renderer:$.jqplot.PieRenderer - } - }); - - plot6 = $.jqplot('chart6', [[1,2,3,4]]); - - $('#chart1').bind('jqplotDataClick', - function (ev, seriesIndex, pointIndex, data) { - $('#info1').html('series: '+seriesIndex+', point: '+pointIndex+', data: '+data); - } - ); - - $('#chart2').bind('jqplotDataHighlight', - function (ev, seriesIndex, pointIndex, data) { - $('#info2').html('series: '+seriesIndex+', point: '+pointIndex+', data: '+data); - } - ); - - $('#chart2').bind('jqplotDataUnhighlight', - function (ev) { - $('#info2').html('Nothing'); - } - ); - - $('#chart3').bind('jqplotDataRightClick', - function (ev, seriesIndex, pointIndex, data) { - $('#info3').html('series: '+seriesIndex+', point: '+pointIndex+', data: '+data); - } - ); - - $(document).unload(function() {$('*').unbind(); }); -}); \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/examples/pieTest4.html b/libreplan-webapp/src/main/webapp/jqplot/examples/pieTest4.html deleted file mode 100644 index 30ecf4686..000000000 --- a/libreplan-webapp/src/main/webapp/jqplot/examples/pieTest4.html +++ /dev/null @@ -1,258 +0,0 @@ - - - - - - Pie Charts and Options 2 - - - - - - - - - - - - - -
      - - - - - - -
      - -
      
      - 
      -    
      - -
      
      -
      -    
      -
      
      -  
      -    
      -
      
      -
      -    
      -
      
      -
      -    
      -
      
      -
      -    
      -
      
      -
      -    
      -
      
      -
      -    
      -
      
      -
      -    
      -
      
      -
      -
      -
      -
      -
      -
      -
      -
      -
      -
      -
      -
      -
      -
      -
      -
      -
      -
      -
      -
      -
      -
      -
      -
      -
      -
      -
      -
      -    
      -    
      -    
      -    
      -
      -
      -
      -
      -  
      -
      -
      -
      -
      -	
      - - - - - - \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/examples/point-labels.html b/libreplan-webapp/src/main/webapp/jqplot/examples/point-labels.html deleted file mode 100644 index 31003123a..000000000 --- a/libreplan-webapp/src/main/webapp/jqplot/examples/point-labels.html +++ /dev/null @@ -1,193 +0,0 @@ - - - - - - Data Point labels - - - - - - - - - - - - - -
      - - - - - - - -

      The pointLabels plugin places labels on the plot at the data point locations. Labeles can use the series data array or a separate labels array. If using the series data, the last value in the data point array is used as the label by default.

      - -
      - -
      
      -
      -

      Additional data can be added to the series and it will be used for labels. If additional data is provided, each data point must have a value for the label, even if it is "null".

      - -
      - -
      
      - 
      -

      Labels work with Bar charts as well. Here, the Labels have been supplied through the "labels" array on the "pointLabels" option to the series. Also, additional css styling has been provided to the labels.

      - -
      - -
      -
      -
      -
      
      -
      -

      Point labels can be used on stacked bar charts. If no labels array is specified, they will use data from the chart. Values can be displayed individually for each series (stackedValue option is false, the default), or cumulative values for all series can be displayed (stackedValue option is true).

      - -
      - -
      
      -
      -

      Data point labels have an "edgeTolerance" option. This options controls how close the data point label can be to an axis edge and still be drawn. The default of 0 allows labels to touch the axis. Positive values will increase the required distance between the axis and label, negative values will allow labels to overlap axes.

      - -
      - -
      
      -
      -
      -
      -
      -
      -
      -
      -
      -
      -
      -
      -
      -
      -
      -
      -
      -
      -
      -
      -    
      -    
      -    
      -    
      -
      -
      -
      -    
      -    
      -    
      -
      -
      -
      -
      -	
      - - - - - - \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/examples/resizablePlot.html b/libreplan-webapp/src/main/webapp/jqplot/examples/resizablePlot.html deleted file mode 100644 index 1c46db1ea..000000000 --- a/libreplan-webapp/src/main/webapp/jqplot/examples/resizablePlot.html +++ /dev/null @@ -1,196 +0,0 @@ - - - - - - Resizable Plots - - - - - - - - - - - - - -
      - - - - - - - - -

      Plot targets can be placed inside of resizable containers for dynamic plot sizing. The examples here use the jQuery UI package for resizing functionality.

      - - - - -
      -
      -
      -
      -
      - -

      The first plot has good resize performance in Firefox, Safari and other canvas enabled browsers. The plot will resize dynamically with the container. IE performance will be slow since IE doesn't natively support the canvas element.

      - -

      Resizing is handled by binding a handler to the 'resize' event. The handler function replots the plot during resize. Here, the plot targets's height and width must be specified as a percentage of the container and the container must be visible.

      - -

      The event handler looks like:

      -
      -    $('#resizable1').bind('resize', function(event, ui) {
      -        plot1.replot( { resetAxes: true } );
      -    });
      -
      -
      - - -
      - -
      -
      -
      -
      -

      The second plot uses an alternative sizing method that is more responsive in all browsers, especially IE. The differnece? First, the plot target is given a static height and width that will fit inside the resizable container. Then, instead of resizing dynamically with the container, the plots replot() method is called at the end of the resize. When resizing is done, the plot targets hieght and width are set to a percentage of the container's and then the replot method is called.

      - -

      Also, an options object is passed into the replot method. It contains a single option, resetAxes, which, if true, resets all axes so the min, max, numberTicks and tickInterval are recalculated.

      -
      -    $('#resizable2').bind('resizestop', function(event, ui) {
      -        $('#chart2').height($('#resizable2').height()*0.96);
      -        $('#chart2').width($('#resizable2').width()*0.96);
      -        plot2.replot({resetAxes:true});
      -    });
      -
      - -

      You can also pass in option objects to reset specific axes like:

      - -
      -    {resetAxes:['yaxis', 'y2axis']};
      -    
      -    or
      -    
      -    {resetAxes:{yaxis:true, y2axis:true}};
      -
      - -
      - -
      
      -
      -
      -  
      -
      -
      -
      -
      -
      -
      -    
      -    
      -    
      -    
      -
      -
      -
      -
      -  
      -  
      -  
      -  
      -   
      -  
      -
      -
      -
      -	
      - - - - - - \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/examples/rotated-tick-labels.html b/libreplan-webapp/src/main/webapp/jqplot/examples/rotated-tick-labels.html deleted file mode 100644 index ebf8f76d2..000000000 --- a/libreplan-webapp/src/main/webapp/jqplot/examples/rotated-tick-labels.html +++ /dev/null @@ -1,216 +0,0 @@ - - - - - - Rotated Labels and Font Styling - - - - - - - - - - - - - -
      - - - - - - -

      Rotated axis tick labels are possible through the "jqplot.canvasTextRenderer.min.js" and "jqplot.canvasAxisTickRenderer.min.js" plugins. Native canvas font rendering capabilities are used in supported browsers. This includes most recent browsers (including IE 9). In browsers which don't support native canvas font text, text is rendered in the Hershey font.

      - -
      - -
      
      -
      -
      -
      -

      For comparison, here is the same graph with the "fontFamily" and "fontSize" set. If you have a supported browser, you should see a difference in label fonts.

      - -
      - -
      
      -
      - 
      -

      The default positioning applies to either primary or secondary axes and accounts for label rotation to ensure that the labels point to the appropriate bar or tick position.

      - -

      Also note here the use of the "autoscale" option on the y axes. Turning this option on will force the y axes to line up tick marks for consistend grid lines across the grid.

      - -
      - -
      
      -
      -
      -

      You can override the default position by specifying a labelPosition of 'start', 'middle' or 'end'. The results probably are not as pleasing as the default 'auto' setting.

      - -
      - -
      
      -
      -  
      -
      -
      -
      -
      -
      -
      -
      -
      -
      -
      -
      -
      -
      -
      -
      -
      -
      -    
      -    
      -    
      -    
      -
      -
      -
      -
      -  
      -  
      -  
      -  
      -  
      -
      -
      -
      -
      -	
      - - - - - - \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/examples/rotatedTickLabelsZoom.html b/libreplan-webapp/src/main/webapp/jqplot/examples/rotatedTickLabelsZoom.html deleted file mode 100644 index db4a5a364..000000000 --- a/libreplan-webapp/src/main/webapp/jqplot/examples/rotatedTickLabelsZoom.html +++ /dev/null @@ -1,118 +0,0 @@ - - - - - - Date Axes, Rotated Labels and Zooming - - - - - - - - - - - - - -
      - - - -
      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      - - - - - - \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/examples/smoothedLine.html b/libreplan-webapp/src/main/webapp/jqplot/examples/smoothedLine.html deleted file mode 100644 index b92231d7d..000000000 --- a/libreplan-webapp/src/main/webapp/jqplot/examples/smoothedLine.html +++ /dev/null @@ -1,137 +0,0 @@ - - - - - - Smoothed Lines - - - - - - - - - - - - - -
      - - - - - - - - - -
      - -
      
      -  
      -    
      -
      -
      -
      -
      -
      -
      -    
      -    
      -    
      -    
      -
      -
      -
      -    
      -
      -
      -
      -
      -	
      - - - - - - \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/examples/syntaxhighlighter/LGPL-LICENSE b/libreplan-webapp/src/main/webapp/jqplot/examples/syntaxhighlighter/LGPL-LICENSE deleted file mode 100644 index 3f9959fc5..000000000 --- a/libreplan-webapp/src/main/webapp/jqplot/examples/syntaxhighlighter/LGPL-LICENSE +++ /dev/null @@ -1,165 +0,0 @@ - GNU LESSER GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - - This version of the GNU Lesser General Public License incorporates -the terms and conditions of version 3 of the GNU General Public -License, supplemented by the additional permissions listed below. - - 0. Additional Definitions. - - As used herein, "this License" refers to version 3 of the GNU Lesser -General Public License, and the "GNU GPL" refers to version 3 of the GNU -General Public License. - - "The Library" refers to a covered work governed by this License, -other than an Application or a Combined Work as defined below. - - An "Application" is any work that makes use of an interface provided -by the Library, but which is not otherwise based on the Library. -Defining a subclass of a class defined by the Library is deemed a mode -of using an interface provided by the Library. - - A "Combined Work" is a work produced by combining or linking an -Application with the Library. The particular version of the Library -with which the Combined Work was made is also called the "Linked -Version". - - The "Minimal Corresponding Source" for a Combined Work means the -Corresponding Source for the Combined Work, excluding any source code -for portions of the Combined Work that, considered in isolation, are -based on the Application, and not on the Linked Version. - - The "Corresponding Application Code" for a Combined Work means the -object code and/or source code for the Application, including any data -and utility programs needed for reproducing the Combined Work from the -Application, but excluding the System Libraries of the Combined Work. - - 1. Exception to Section 3 of the GNU GPL. - - You may convey a covered work under sections 3 and 4 of this License -without being bound by section 3 of the GNU GPL. - - 2. Conveying Modified Versions. - - If you modify a copy of the Library, and, in your modifications, a -facility refers to a function or data to be supplied by an Application -that uses the facility (other than as an argument passed when the -facility is invoked), then you may convey a copy of the modified -version: - - a) under this License, provided that you make a good faith effort to - ensure that, in the event an Application does not supply the - function or data, the facility still operates, and performs - whatever part of its purpose remains meaningful, or - - b) under the GNU GPL, with none of the additional permissions of - this License applicable to that copy. - - 3. Object Code Incorporating Material from Library Header Files. - - The object code form of an Application may incorporate material from -a header file that is part of the Library. You may convey such object -code under terms of your choice, provided that, if the incorporated -material is not limited to numerical parameters, data structure -layouts and accessors, or small macros, inline functions and templates -(ten or fewer lines in length), you do both of the following: - - a) Give prominent notice with each copy of the object code that the - Library is used in it and that the Library and its use are - covered by this License. - - b) Accompany the object code with a copy of the GNU GPL and this license - document. - - 4. Combined Works. - - You may convey a Combined Work under terms of your choice that, -taken together, effectively do not restrict modification of the -portions of the Library contained in the Combined Work and reverse -engineering for debugging such modifications, if you also do each of -the following: - - a) Give prominent notice with each copy of the Combined Work that - the Library is used in it and that the Library and its use are - covered by this License. - - b) Accompany the Combined Work with a copy of the GNU GPL and this license - document. - - c) For a Combined Work that displays copyright notices during - execution, include the copyright notice for the Library among - these notices, as well as a reference directing the user to the - copies of the GNU GPL and this license document. - - d) Do one of the following: - - 0) Convey the Minimal Corresponding Source under the terms of this - License, and the Corresponding Application Code in a form - suitable for, and under terms that permit, the user to - recombine or relink the Application with a modified version of - the Linked Version to produce a modified Combined Work, in the - manner specified by section 6 of the GNU GPL for conveying - Corresponding Source. - - 1) Use a suitable shared library mechanism for linking with the - Library. A suitable mechanism is one that (a) uses at run time - a copy of the Library already present on the user's computer - system, and (b) will operate properly with a modified version - of the Library that is interface-compatible with the Linked - Version. - - e) Provide Installation Information, but only if you would otherwise - be required to provide such information under section 6 of the - GNU GPL, and only to the extent that such information is - necessary to install and execute a modified version of the - Combined Work produced by recombining or relinking the - Application with a modified version of the Linked Version. (If - you use option 4d0, the Installation Information must accompany - the Minimal Corresponding Source and Corresponding Application - Code. If you use option 4d1, you must provide the Installation - Information in the manner specified by section 6 of the GNU GPL - for conveying Corresponding Source.) - - 5. Combined Libraries. - - You may place library facilities that are a work based on the -Library side by side in a single library together with other library -facilities that are not Applications and are not covered by this -License, and convey such a combined library under terms of your -choice, if you do both of the following: - - a) Accompany the combined library with a copy of the same work based - on the Library, uncombined with any other library facilities, - conveyed under the terms of this License. - - b) Give prominent notice with the combined library that part of it - is a work based on the Library, and explaining where to find the - accompanying uncombined form of the same work. - - 6. Revised Versions of the GNU Lesser General Public License. - - The Free Software Foundation may publish revised and/or new versions -of the GNU Lesser General Public License from time to time. Such new -versions will be similar in spirit to the present version, but may -differ in detail to address new problems or concerns. - - Each version is given a distinguishing version number. If the -Library as you received it specifies that a certain numbered version -of the GNU Lesser General Public License "or any later version" -applies to it, you have the option of following the terms and -conditions either of that published version or of any later version -published by the Free Software Foundation. If the Library as you -received it does not specify a version number of the GNU Lesser -General Public License, you may choose any version of the GNU Lesser -General Public License ever published by the Free Software Foundation. - - If the Library as you received it specifies that a proxy can decide -whether future versions of the GNU Lesser General Public License shall -apply, that proxy's public statement of acceptance of any version is -permanent authorization for you to choose that version for the -Library. \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/examples/syntaxhighlighter/MIT-LICENSE b/libreplan-webapp/src/main/webapp/jqplot/examples/syntaxhighlighter/MIT-LICENSE deleted file mode 100644 index e7c70ba14..000000000 --- a/libreplan-webapp/src/main/webapp/jqplot/examples/syntaxhighlighter/MIT-LICENSE +++ /dev/null @@ -1,20 +0,0 @@ -Copyright (c) 2003, 2004 Jim Weirich - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/libreplan-webapp/src/main/webapp/jqplot/examples/syntaxhighlighter/scripts/shAutoloader.js b/libreplan-webapp/src/main/webapp/jqplot/examples/syntaxhighlighter/scripts/shAutoloader.js deleted file mode 100644 index 4e29bddec..000000000 --- a/libreplan-webapp/src/main/webapp/jqplot/examples/syntaxhighlighter/scripts/shAutoloader.js +++ /dev/null @@ -1,17 +0,0 @@ -/** - * SyntaxHighlighter - * http://alexgorbatchev.com/SyntaxHighlighter - * - * SyntaxHighlighter is donationware. If you are using it, please donate. - * http://alexgorbatchev.com/SyntaxHighlighter/donate.html - * - * @version - * 3.0.83 (July 02 2010) - * - * @copyright - * Copyright (C) 2004-2010 Alex Gorbatchev. - * - * @license - * Dual licensed under the MIT and GPL licenses. - */ -eval(function(p,a,c,k,e,d){e=function(c){return(c35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--){d[e(c)]=k[c]||e(c)}k=[function(e){return d[e]}];e=function(){return'\\w+'};c=1};while(c--){if(k[c]){p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c])}}return p}('(2(){1 h=5;h.I=2(){2 n(c,a){4(1 d=0;d35?String.fromCharCode(a+29):a.toString(36))};if(!"".replace(/^/,String)){while(j--){i[g(j)]=f[j]||g(j)}f=[function(a){return i[a]}];g=function(){return"\\w+"};j=1}while(j--){if(f[j]){h=h.replace(new RegExp("\\b"+g(j)+"\\b","g"),f[j])}}return h}('(2(){1 h=5;h.I=2(){2 n(c,a){4(1 d=0;d[:\\w-\\.]+)', 'xg').exec(code), - result = [] - ; - - if (match.attributes != null) - { - var attributes, - regex = new XRegExp('(? [\\w:\\-\\.]+)' + - '\\s*=\\s*' + - '(? ".*?"|\'.*?\'|\\w+)', - 'xg'); - - while ((attributes = regex.exec(code)) != null) - { - result.push(new constructor(attributes.name, match.index + attributes.index, 'color1')); - result.push(new constructor(attributes.value, match.index + attributes.index + attributes[0].indexOf(attributes.value), 'string')); - } - } - - if (tag != null) - result.push( - new constructor(tag.name, match.index + tag[0].indexOf(tag.name), 'keyword') - ); - - return result; - } - - this.regexList = [ - { regex: new XRegExp('(\\<|<)\\!\\[[\\w\\s]*?\\[(.|\\s)*?\\]\\](\\>|>)', 'gm'), css: 'color2' }, // - { regex: SyntaxHighlighter.regexLib.xmlComments, css: 'comments' }, // - { regex: new XRegExp('(<|<)[\\s\\/\\?]*(\\w+)(?.*?)[\\s\\/\\?]*(>|>)', 'sg'), func: process } - ]; - }; - - Brush.prototype = new SyntaxHighlighter.Highlighter(); - Brush.aliases = ['xml', 'xhtml', 'xslt', 'html']; - - SyntaxHighlighter.brushes.Xml = Brush; - - // CommonJS - typeof(exports) != 'undefined' ? exports.Brush = Brush : null; -})(); diff --git a/libreplan-webapp/src/main/webapp/jqplot/examples/syntaxhighlighter/scripts/shBrushXml.min.js b/libreplan-webapp/src/main/webapp/jqplot/examples/syntaxhighlighter/scripts/shBrushXml.min.js deleted file mode 100644 index a1c959c79..000000000 --- a/libreplan-webapp/src/main/webapp/jqplot/examples/syntaxhighlighter/scripts/shBrushXml.min.js +++ /dev/null @@ -1 +0,0 @@ -(function(){typeof(require)!="undefined"?SyntaxHighlighter=require("shCore").SyntaxHighlighter:null;function a(){function b(f,j){var g=SyntaxHighlighter.Match,i=f[0],d=new XRegExp("(<|<)[\\s\\/\\?]*(?[:\\w-\\.]+)","xg").exec(i),c=[];if(f.attributes!=null){var e,h=new XRegExp("(? [\\w:\\-\\.]+)\\s*=\\s*(? \".*?\"|'.*?'|\\w+)","xg");while((e=h.exec(i))!=null){c.push(new g(e.name,f.index+e.index,"color1"));c.push(new g(e.value,f.index+e.index+e[0].indexOf(e.value),"string"))}}if(d!=null){c.push(new g(d.name,f.index+d[0].indexOf(d.name),"keyword"))}return c}this.regexList=[{regex:new XRegExp("(\\<|<)\\!\\[[\\w\\s]*?\\[(.|\\s)*?\\]\\](\\>|>)","gm"),css:"color2"},{regex:SyntaxHighlighter.regexLib.xmlComments,css:"comments"},{regex:new XRegExp("(<|<)[\\s\\/\\?]*(\\w+)(?.*?)[\\s\\/\\?]*(>|>)","sg"),func:b}]}a.prototype=new SyntaxHighlighter.Highlighter();a.aliases=["xml","xhtml","xslt","html"];SyntaxHighlighter.brushes.Xml=a;typeof(exports)!="undefined"?exports.Brush=a:null})(); \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/examples/syntaxhighlighter/scripts/shCore.js b/libreplan-webapp/src/main/webapp/jqplot/examples/syntaxhighlighter/scripts/shCore.js deleted file mode 100644 index b47b64547..000000000 --- a/libreplan-webapp/src/main/webapp/jqplot/examples/syntaxhighlighter/scripts/shCore.js +++ /dev/null @@ -1,17 +0,0 @@ -/** - * SyntaxHighlighter - * http://alexgorbatchev.com/SyntaxHighlighter - * - * SyntaxHighlighter is donationware. If you are using it, please donate. - * http://alexgorbatchev.com/SyntaxHighlighter/donate.html - * - * @version - * 3.0.83 (July 02 2010) - * - * @copyright - * Copyright (C) 2004-2010 Alex Gorbatchev. - * - * @license - * Dual licensed under the MIT and GPL licenses. - */ -eval(function(p,a,c,k,e,d){e=function(c){return(c35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--){d[e(c)]=k[c]||e(c)}k=[function(e){return d[e]}];e=function(){return'\\w+'};c=1};while(c--){if(k[c]){p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c])}}return p}('K M;I(M)1S 2U("2a\'t 4k M 4K 2g 3l 4G 4H");(6(){6 r(f,e){I(!M.1R(f))1S 3m("3s 15 4R");K a=f.1w;f=M(f.1m,t(f)+(e||""));I(a)f.1w={1m:a.1m,19:a.19?a.19.1a(0):N};H f}6 t(f){H(f.1J?"g":"")+(f.4s?"i":"")+(f.4p?"m":"")+(f.4v?"x":"")+(f.3n?"y":"")}6 B(f,e,a,b){K c=u.L,d,h,g;v=R;5K{O(;c--;){g=u[c];I(a&g.3r&&(!g.2p||g.2p.W(b))){g.2q.12=e;I((h=g.2q.X(f))&&h.P===e){d={3k:g.2b.W(b,h,a),1C:h};1N}}}}5v(i){1S i}5q{v=11}H d}6 p(f,e,a){I(3b.Z.1i)H f.1i(e,a);O(a=a||0;a-1},3d:6(g){e+=g}};c1&&p(e,"")>-1){a=15(J.1m,n.Q.W(t(J),"g",""));n.Q.W(f.1a(e.P),a,6(){O(K c=1;c<14.L-2;c++)I(14[c]===1d)e[c]=1d})}I(J.1w&&J.1w.19)O(K b=1;be.P&&J.12--}H e};I(!D)15.Z.1A=6(f){(f=n.X.W(J,f))&&J.1J&&!f[0].L&&J.12>f.P&&J.12--;H!!f};1r.Z.1C=6(f){M.1R(f)||(f=15(f));I(f.1J){K e=n.1C.1p(J,14);f.12=0;H e}H f.X(J)};1r.Z.Q=6(f,e){K a=M.1R(f),b,c;I(a&&1j e.58()==="3f"&&e.1i("${")===-1&&y)H n.Q.1p(J,14);I(a){I(f.1w)b=f.1w.19}Y f+="";I(1j e==="6")c=n.Q.W(J,f,6(){I(b){14[0]=1f 1r(14[0]);O(K d=0;dd.L-3;){i=1r.Z.1a.W(g,-1)+i;g=1Q.3i(g/10)}H(g?d[g]||"":"$")+i}Y{g=+i;I(g<=d.L-3)H d[g];g=b?p(b,i):-1;H g>-1?d[g+1]:h}})})}I(a&&f.1J)f.12=0;H c};1r.Z.1e=6(f,e){I(!M.1R(f))H n.1e.1p(J,14);K a=J+"",b=[],c=0,d,h;I(e===1d||+e<0)e=5D;Y{e=1Q.3i(+e);I(!e)H[]}O(f=M.3c(f);d=f.X(a);){I(f.12>c){b.U(a.1a(c,d.P));d.L>1&&d.P=e)1N}f.12===d.P&&f.12++}I(c===a.L){I(!n.1A.W(f,"")||h)b.U("")}Y b.U(a.1a(c));H b.L>e?b.1a(0,e):b};M.1h(/\\(\\?#[^)]*\\)/,6(f){H n.1A.W(A,f.2S.1a(f.P+f[0].L))?"":"(?:)"});M.1h(/\\((?!\\?)/,6(){J.19.U(N);H"("});M.1h(/\\(\\?<([$\\w]+)>/,6(f){J.19.U(f[1]);J.2N=R;H"("});M.1h(/\\\\k<([\\w$]+)>/,6(f){K e=p(J.19,f[1]);H e>-1?"\\\\"+(e+1)+(3R(f.2S.3a(f.P+f[0].L))?"":"(?:)"):f[0]});M.1h(/\\[\\^?]/,6(f){H f[0]==="[]"?"\\\\b\\\\B":"[\\\\s\\\\S]"});M.1h(/^\\(\\?([5A]+)\\)/,6(f){J.3d(f[1]);H""});M.1h(/(?:\\s+|#.*)+/,6(f){H n.1A.W(A,f.2S.1a(f.P+f[0].L))?"":"(?:)"},M.1B,6(){H J.2K("x")});M.1h(/\\./,6(){H"[\\\\s\\\\S]"},M.1B,6(){H J.2K("s")})})();1j 2e!="1d"&&(2e.M=M);K 1v=6(){6 r(a,b){a.1l.1i(b)!=-1||(a.1l+=" "+b)}6 t(a){H a.1i("3e")==0?a:"3e"+a}6 B(a){H e.1Y.2A[t(a)]}6 p(a,b,c){I(a==N)H N;K d=c!=R?a.3G:[a.2G],h={"#":"1c",".":"1l"}[b.1o(0,1)]||"3h",g,i;g=h!="3h"?b.1o(1):b.5u();I((a[h]||"").1i(g)!=-1)H a;O(a=0;d&&a\'+c+""});H a}6 n(a,b){a.1e("\\n");O(K c="",d=0;d<50;d++)c+=" ";H a=v(a,6(h){I(h.1i("\\t")==-1)H h;O(K g=0;(g=h.1i("\\t"))!=-1;)h=h.1o(0,g)+c.1o(0,b-g%b)+h.1o(g+1,h.L);H h})}6 x(a){H a.Q(/^\\s+|\\s+$/g,"")}6 D(a,b){I(a.Pb.P)H 1;Y I(a.Lb.L)H 1;H 0}6 y(a,b){6 c(k){H k[0]}O(K d=N,h=[],g=b.2D?b.2D:c;(d=b.1I.X(a))!=N;){K i=g(d,b);I(1j i=="3f")i=[1f e.2L(i,d.P,b.23)];h=h.1O(i)}H h}6 E(a){K b=/(.*)((&1G;|&1y;).*)/;H a.Q(e.3A.3M,6(c){K d="",h=N;I(h=b.X(c)){c=h[1];d=h[2]}H\'\'+c+""+d})}6 z(){O(K a=1E.36("1k"),b=[],c=0;c<1z 4I="1Z://2y.3L.3K/4L/5L"><3J><4N 1Z-4M="5G-5M" 6K="2O/1z; 6J=6I-8" /><1t>6L 1v<3B 1L="25-6M:6Q,6P,6O,6N-6F;6y-2f:#6x;2f:#6w;25-22:6v;2O-3D:3C;">1v3v 3.0.76 (72 73 3x)1Z://3u.2w/1v70 17 6U 71.6T 6X-3x 6Y 6D.6t 61 60 J 1k, 5Z 5R 5V <2R/>5U 5T 5S!\'}},1Y:{2j:N,2A:{}},1U:{},3A:{6n:/\\/\\*[\\s\\S]*?\\*\\//2c,6m:/\\/\\/.*$/2c,6l:/#.*$/2c,6k:/"([^\\\\"\\n]|\\\\.)*"/g,6o:/\'([^\\\\\'\\n]|\\\\.)*\'/g,6p:1f M(\'"([^\\\\\\\\"]|\\\\\\\\.)*"\',"3z"),6s:1f M("\'([^\\\\\\\\\']|\\\\\\\\.)*\'","3z"),6q:/(&1y;|<)!--[\\s\\S]*?--(&1G;|>)/2c,3M:/\\w+:\\/\\/[\\w-.\\/?%&=:@;]*/g,6a:{18:/(&1y;|<)\\?=?/g,1b:/\\?(&1G;|>)/g},69:{18:/(&1y;|<)%=?/g,1b:/%(&1G;|>)/g},6d:{18:/(&1y;|<)\\s*1k.*?(&1G;|>)/2T,1b:/(&1y;|<)\\/\\s*1k\\s*(&1G;|>)/2T}},16:{1H:6(a){6 b(i,k){H e.16.2o(i,k,e.13.1x[k])}O(K c=\'\',d=e.16.2x,h=d.2X,g=0;g";H c},2o:6(a,b,c){H\'<2W>\'+c+""},2b:6(a){K b=a.1F,c=b.1l||"";b=B(p(b,".20",R).1c);K d=6(h){H(h=15(h+"6f(\\\\w+)").X(c))?h[1]:N}("6g");b&&d&&e.16.2x[d].2B(b);a.3N()},2x:{2X:["21","2P"],21:{1H:6(a){I(a.V("2l")!=R)H"";K b=a.V("1t");H e.16.2o(a,"21",b?b:e.13.1x.21)},2B:6(a){a=1E.6j(t(a.1c));a.1l=a.1l.Q("47","")}},2P:{2B:6(){K a="68=0";a+=", 18="+(31.30-33)/2+", 32="+(31.2Z-2Y)/2+", 30=33, 2Z=2Y";a=a.Q(/^,/,"");a=1P.6Z("","38",a);a.2C();K b=a.1E;b.6W(e.13.1x.37);b.6V();a.2C()}}}},35:6(a,b){K c;I(b)c=[b];Y{c=1E.36(e.13.34);O(K d=[],h=0;h(.*?))\\\\]$"),s=1f M("(?<27>[\\\\w-]+)\\\\s*:\\\\s*(?<1T>[\\\\w-%#]+|\\\\[.*?\\\\]|\\".*?\\"|\'.*?\')\\\\s*;?","g");(j=s.X(k))!=N;){K o=j.1T.Q(/^[\'"]|[\'"]$/g,"");I(o!=N&&m.1A(o)){o=m.X(o);o=o.2V.L>0?o.2V.1e(/\\s*,\\s*/):[]}l[j.27]=o}g={1F:g,1n:C(i,l)};g.1n.1D!=N&&d.U(g)}H d},1M:6(a,b){K c=J.35(a,b),d=N,h=e.13;I(c.L!==0)O(K g=0;g")==o-3){m=m.4h(0,o-3);s=R}l=s?m:l}I((i.1t||"")!="")k.1t=i.1t;k.1D=j;d.2Q(k);b=d.2F(l);I((i.1c||"")!="")b.1c=i.1c;i.2G.74(b,i)}}},2E:6(a){w(1P,"4k",6(){e.1M(a)})}};e.2E=e.2E;e.1M=e.1M;e.2L=6(a,b,c){J.1T=a;J.P=b;J.L=a.L;J.23=c;J.1V=N};e.2L.Z.1q=6(){H J.1T};e.4l=6(a){6 b(j,l){O(K m=0;md)1N;Y I(g.P==c.P&&g.L>c.L)a[b]=N;Y I(g.P>=c.P&&g.P\'+c+""},3Q:6(a,b){K c="",d=a.1e("\\n").L,h=2u(J.V("2i-1s")),g=J.V("2z-1s-2t");I(g==R)g=(h+d-1).1q().L;Y I(3R(g)==R)g=0;O(K i=0;i\'+j+"":"")+i)}H a},4f:6(a){H a?"<4a>"+a+"":""},4b:6(a,b){6 c(l){H(l=l?l.1V||g:g)?l+" ":""}O(K d=0,h="",g=J.V("1D",""),i=0;i|&1y;2R\\s*\\/?&1G;/2T;I(e.13.46==R)b=b.Q(h,"\\n");I(e.13.44==R)b=b.Q(h,"");b=b.1e("\\n");h=/^\\s*/;g=4Q;O(K i=0;i0;i++){K k=b[i];I(x(k).L!=0){k=h.X(k);I(k==N){a=a;1N a}g=1Q.4q(k[0].L,g)}}I(g>0)O(i=0;i\'+(J.V("16")?e.16.1H(J):"")+\'<3Z 5z="0" 5H="0" 5J="0">\'+J.4f(J.V("1t"))+"<3T><3P>"+(1u?\'<2d 1g="1u">\'+J.3Q(a)+"":"")+\'<2d 1g="17">\'+b+""},2F:6(a){I(a===N)a="";J.17=a;K b=J.3Y("T");b.3X=J.1H(a);J.V("16")&&w(p(b,".16"),"5c",e.16.2b);J.V("3V-17")&&w(p(b,".17"),"56",f);H b},2Q:6(a){J.1c=""+1Q.5d(1Q.5n()*5k).1q();e.1Y.2A[t(J.1c)]=J;J.1n=C(e.2v,a||{});I(J.V("2k")==R)J.1n.16=J.1n.1u=11},5j:6(a){a=a.Q(/^\\s+|\\s+$/g,"").Q(/\\s+/g,"|");H"\\\\b(?:"+a+")\\\\b"},5f:6(a){J.28={18:{1I:a.18,23:"1k"},1b:{1I:a.1b,23:"1k"},17:1f M("(?<18>"+a.18.1m+")(?<17>.*?)(?<1b>"+a.1b.1m+")","5o")}}};H e}();1j 2e!="1d"&&(2e.1v=1v);',62,441,'||||||function|||||||||||||||||||||||||||||||||||||return|if|this|var|length|XRegExp|null|for|index|replace|true||div|push|getParam|call|exec|else|prototype||false|lastIndex|config|arguments|RegExp|toolbar|code|left|captureNames|slice|right|id|undefined|split|new|class|addToken|indexOf|typeof|script|className|source|params|substr|apply|toString|String|line|title|gutter|SyntaxHighlighter|_xregexp|strings|lt|html|test|OUTSIDE_CLASS|match|brush|document|target|gt|getHtml|regex|global|join|style|highlight|break|concat|window|Math|isRegExp|throw|value|brushes|brushName|space|alert|vars|http|syntaxhighlighter|expandSource|size|css|case|font|Fa|name|htmlScript|dA|can|handler|gm|td|exports|color|in|href|first|discoveredBrushes|light|collapse|object|cache|getButtonHtml|trigger|pattern|getLineHtml|nbsp|numbers|parseInt|defaults|com|items|www|pad|highlighters|execute|focus|func|all|getDiv|parentNode|navigator|INSIDE_CLASS|regexList|hasFlag|Match|useScriptTags|hasNamedCapture|text|help|init|br|input|gi|Error|values|span|list|250|height|width|screen|top|500|tagName|findElements|getElementsByTagName|aboutDialog|_blank|appendChild|charAt|Array|copyAsGlobal|setFlag|highlighter_|string|attachEvent|nodeName|floor|backref|output|the|TypeError|sticky|Za|iterate|freezeTokens|scope|type|textarea|alexgorbatchev|version|margin|2010|005896|gs|regexLib|body|center|align|noBrush|require|childNodes|DTD|xhtml1|head|org|w3|url|preventDefault|container|tr|getLineNumbersHtml|isNaN|userAgent|tbody|isLineHighlighted|quick|void|innerHTML|create|table|links|auto|smart|tab|stripBrs|tabs|bloggerMode|collapsed|plain|getCodeLinesHtml|caption|getMatchesHtml|findMatches|figureOutLineNumbers|removeNestedMatches|getTitleHtml|brushNotHtmlScript|substring|createElement|Highlighter|load|HtmlScript|Brush|pre|expand|multiline|min|Can|ignoreCase|find|blur|extended|toLowerCase|aliases|addEventListener|innerText|textContent|wasn|select|createTextNode|removeChild|option|same|frame|xmlns|dtd|twice|1999|equiv|meta|htmlscript|transitional|1E3|expected|PUBLIC|DOCTYPE|on|W3C|XHTML|TR|EN|Transitional||configured|srcElement|Object|after|run|dblclick|matchChain|valueOf|constructor|default|switch|click|round|execAt|forHtmlScript|token|gimy|functions|getKeywords|1E6|escape|within|random|sgi|another|finally|supply|MSIE|ie|toUpperCase|catch|returnValue|definition|event|border|imsx|constructing|one|Infinity|from|when|Content|cellpadding|flags|cellspacing|try|xhtml|Type|spaces|2930402|hosted_button_id|lastIndexOf|donate|active|development|keep|to|xclick|_s|Xml|please|like|you|paypal|cgi|cmd|webscr|bin|highlighted|scrollbars|aspScriptTags|phpScriptTags|sort|max|scriptScriptTags|toolbar_item|_|command|command_|number|getElementById|doubleQuotedString|singleLinePerlComments|singleLineCComments|multiLineCComments|singleQuotedString|multiLineDoubleQuotedString|xmlComments|alt|multiLineSingleQuotedString|If|https|1em|000|fff|background|5em|xx|bottom|75em|Gorbatchev|large|serif|CDATA|continue|utf|charset|content|About|family|sans|Helvetica|Arial|Geneva|3em|nogutter|Copyright|syntax|close|write|2004|Alex|open|JavaScript|highlighter|July|02|replaceChild|offset|83'.split('|'),0,{})) diff --git a/libreplan-webapp/src/main/webapp/jqplot/examples/syntaxhighlighter/scripts/shCore.min.js b/libreplan-webapp/src/main/webapp/jqplot/examples/syntaxhighlighter/scripts/shCore.min.js deleted file mode 100644 index 0ec483448..000000000 --- a/libreplan-webapp/src/main/webapp/jqplot/examples/syntaxhighlighter/scripts/shCore.min.js +++ /dev/null @@ -1 +0,0 @@ -eval(function(h,b,j,f,g,i){g=function(a){return(a35?String.fromCharCode(a+29):a.toString(36))};if(!"".replace(/^/,String)){while(j--){i[g(j)]=f[j]||g(j)}f=[function(a){return i[a]}];g=function(){return"\\w+"};j=1}while(j--){if(f[j]){h=h.replace(new RegExp("\\b"+g(j)+"\\b","g"),f[j])}}return h}('K M;I(M)1S 2U("2a\'t 4k M 4K 2g 3l 4G 4H");(6(){6 r(f,e){I(!M.1R(f))1S 3m("3s 15 4R");K a=f.1w;f=M(f.1m,t(f)+(e||""));I(a)f.1w={1m:a.1m,19:a.19?a.19.1a(0):N};H f}6 t(f){H(f.1J?"g":"")+(f.4s?"i":"")+(f.4p?"m":"")+(f.4v?"x":"")+(f.3n?"y":"")}6 B(f,e,a,b){K c=u.L,d,h,g;v=R;5K{O(;c--;){g=u[c];I(a&g.3r&&(!g.2p||g.2p.W(b))){g.2q.12=e;I((h=g.2q.X(f))&&h.P===e){d={3k:g.2b.W(b,h,a),1C:h};1N}}}}5v(i){1S i}5q{v=11}H d}6 p(f,e,a){I(3b.Z.1i)H f.1i(e,a);O(a=a||0;a-1},3d:6(g){e+=g}};c1&&p(e,"")>-1){a=15(J.1m,n.Q.W(t(J),"g",""));n.Q.W(f.1a(e.P),a,6(){O(K c=1;c<14.L-2;c++)I(14[c]===1d)e[c]=1d})}I(J.1w&&J.1w.19)O(K b=1;be.P&&J.12--}H e};I(!D)15.Z.1A=6(f){(f=n.X.W(J,f))&&J.1J&&!f[0].L&&J.12>f.P&&J.12--;H!!f};1r.Z.1C=6(f){M.1R(f)||(f=15(f));I(f.1J){K e=n.1C.1p(J,14);f.12=0;H e}H f.X(J)};1r.Z.Q=6(f,e){K a=M.1R(f),b,c;I(a&&1j e.58()==="3f"&&e.1i("${")===-1&&y)H n.Q.1p(J,14);I(a){I(f.1w)b=f.1w.19}Y f+="";I(1j e==="6")c=n.Q.W(J,f,6(){I(b){14[0]=1f 1r(14[0]);O(K d=0;dd.L-3;){i=1r.Z.1a.W(g,-1)+i;g=1Q.3i(g/10)}H(g?d[g]||"":"$")+i}Y{g=+i;I(g<=d.L-3)H d[g];g=b?p(b,i):-1;H g>-1?d[g+1]:h}})})}I(a&&f.1J)f.12=0;H c};1r.Z.1e=6(f,e){I(!M.1R(f))H n.1e.1p(J,14);K a=J+"",b=[],c=0,d,h;I(e===1d||+e<0)e=5D;Y{e=1Q.3i(+e);I(!e)H[]}O(f=M.3c(f);d=f.X(a);){I(f.12>c){b.U(a.1a(c,d.P));d.L>1&&d.P=e)1N}f.12===d.P&&f.12++}I(c===a.L){I(!n.1A.W(f,"")||h)b.U("")}Y b.U(a.1a(c));H b.L>e?b.1a(0,e):b};M.1h(/\\(\\?#[^)]*\\)/,6(f){H n.1A.W(A,f.2S.1a(f.P+f[0].L))?"":"(?:)"});M.1h(/\\((?!\\?)/,6(){J.19.U(N);H"("});M.1h(/\\(\\?<([$\\w]+)>/,6(f){J.19.U(f[1]);J.2N=R;H"("});M.1h(/\\\\k<([\\w$]+)>/,6(f){K e=p(J.19,f[1]);H e>-1?"\\\\"+(e+1)+(3R(f.2S.3a(f.P+f[0].L))?"":"(?:)"):f[0]});M.1h(/\\[\\^?]/,6(f){H f[0]==="[]"?"\\\\b\\\\B":"[\\\\s\\\\S]"});M.1h(/^\\(\\?([5A]+)\\)/,6(f){J.3d(f[1]);H""});M.1h(/(?:\\s+|#.*)+/,6(f){H n.1A.W(A,f.2S.1a(f.P+f[0].L))?"":"(?:)"},M.1B,6(){H J.2K("x")});M.1h(/\\./,6(){H"[\\\\s\\\\S]"},M.1B,6(){H J.2K("s")})})();1j 2e!="1d"&&(2e.M=M);K 1v=6(){6 r(a,b){a.1l.1i(b)!=-1||(a.1l+=" "+b)}6 t(a){H a.1i("3e")==0?a:"3e"+a}6 B(a){H e.1Y.2A[t(a)]}6 p(a,b,c){I(a==N)H N;K d=c!=R?a.3G:[a.2G],h={"#":"1c",".":"1l"}[b.1o(0,1)]||"3h",g,i;g=h!="3h"?b.1o(1):b.5u();I((a[h]||"").1i(g)!=-1)H a;O(a=0;d&&a\'+c+""});H a}6 n(a,b){a.1e("\\n");O(K c="",d=0;d<50;d++)c+=" ";H a=v(a,6(h){I(h.1i("\\t")==-1)H h;O(K g=0;(g=h.1i("\\t"))!=-1;)h=h.1o(0,g)+c.1o(0,b-g%b)+h.1o(g+1,h.L);H h})}6 x(a){H a.Q(/^\\s+|\\s+$/g,"")}6 D(a,b){I(a.Pb.P)H 1;Y I(a.Lb.L)H 1;H 0}6 y(a,b){6 c(k){H k[0]}O(K d=N,h=[],g=b.2D?b.2D:c;(d=b.1I.X(a))!=N;){K i=g(d,b);I(1j i=="3f")i=[1f e.2L(i,d.P,b.23)];h=h.1O(i)}H h}6 E(a){K b=/(.*)((&1G;|&1y;).*)/;H a.Q(e.3A.3M,6(c){K d="",h=N;I(h=b.X(c)){c=h[1];d=h[2]}H\'\'+c+""+d})}6 z(){O(K a=1E.36("1k"),b=[],c=0;c<1z 4I="1Z://2y.3L.3K/4L/5L"><3J><4N 1Z-4M="5G-5M" 6K="2O/1z; 6J=6I-8" /><1t>6L 1v<3B 1L="25-6M:6Q,6P,6O,6N-6F;6y-2f:#6x;2f:#6w;25-22:6v;2O-3D:3C;">1v3v 3.0.76 (72 73 3x)1Z://3u.2w/1v70 17 6U 71.6T 6X-3x 6Y 6D.6t 61 60 J 1k, 5Z 5R 5V <2R/>5U 5T 5S!\'}},1Y:{2j:N,2A:{}},1U:{},3A:{6n:/\\/\\*[\\s\\S]*?\\*\\//2c,6m:/\\/\\/.*$/2c,6l:/#.*$/2c,6k:/"([^\\\\"\\n]|\\\\.)*"/g,6o:/\'([^\\\\\'\\n]|\\\\.)*\'/g,6p:1f M(\'"([^\\\\\\\\"]|\\\\\\\\.)*"\',"3z"),6s:1f M("\'([^\\\\\\\\\']|\\\\\\\\.)*\'","3z"),6q:/(&1y;|<)!--[\\s\\S]*?--(&1G;|>)/2c,3M:/\\w+:\\/\\/[\\w-.\\/?%&=:@;]*/g,6a:{18:/(&1y;|<)\\?=?/g,1b:/\\?(&1G;|>)/g},69:{18:/(&1y;|<)%=?/g,1b:/%(&1G;|>)/g},6d:{18:/(&1y;|<)\\s*1k.*?(&1G;|>)/2T,1b:/(&1y;|<)\\/\\s*1k\\s*(&1G;|>)/2T}},16:{1H:6(a){6 b(i,k){H e.16.2o(i,k,e.13.1x[k])}O(K c=\'\',d=e.16.2x,h=d.2X,g=0;g";H c},2o:6(a,b,c){H\'<2W>\'+c+""},2b:6(a){K b=a.1F,c=b.1l||"";b=B(p(b,".20",R).1c);K d=6(h){H(h=15(h+"6f(\\\\w+)").X(c))?h[1]:N}("6g");b&&d&&e.16.2x[d].2B(b);a.3N()},2x:{2X:["21","2P"],21:{1H:6(a){I(a.V("2l")!=R)H"";K b=a.V("1t");H e.16.2o(a,"21",b?b:e.13.1x.21)},2B:6(a){a=1E.6j(t(a.1c));a.1l=a.1l.Q("47","")}},2P:{2B:6(){K a="68=0";a+=", 18="+(31.30-33)/2+", 32="+(31.2Z-2Y)/2+", 30=33, 2Z=2Y";a=a.Q(/^,/,"");a=1P.6Z("","38",a);a.2C();K b=a.1E;b.6W(e.13.1x.37);b.6V();a.2C()}}}},35:6(a,b){K c;I(b)c=[b];Y{c=1E.36(e.13.34);O(K d=[],h=0;h(.*?))\\\\]$"),s=1f M("(?<27>[\\\\w-]+)\\\\s*:\\\\s*(?<1T>[\\\\w-%#]+|\\\\[.*?\\\\]|\\".*?\\"|\'.*?\')\\\\s*;?","g");(j=s.X(k))!=N;){K o=j.1T.Q(/^[\'"]|[\'"]$/g,"");I(o!=N&&m.1A(o)){o=m.X(o);o=o.2V.L>0?o.2V.1e(/\\s*,\\s*/):[]}l[j.27]=o}g={1F:g,1n:C(i,l)};g.1n.1D!=N&&d.U(g)}H d},1M:6(a,b){K c=J.35(a,b),d=N,h=e.13;I(c.L!==0)O(K g=0;g")==o-3){m=m.4h(0,o-3);s=R}l=s?m:l}I((i.1t||"")!="")k.1t=i.1t;k.1D=j;d.2Q(k);b=d.2F(l);I((i.1c||"")!="")b.1c=i.1c;i.2G.74(b,i)}}},2E:6(a){w(1P,"4k",6(){e.1M(a)})}};e.2E=e.2E;e.1M=e.1M;e.2L=6(a,b,c){J.1T=a;J.P=b;J.L=a.L;J.23=c;J.1V=N};e.2L.Z.1q=6(){H J.1T};e.4l=6(a){6 b(j,l){O(K m=0;md)1N;Y I(g.P==c.P&&g.L>c.L)a[b]=N;Y I(g.P>=c.P&&g.P\'+c+""},3Q:6(a,b){K c="",d=a.1e("\\n").L,h=2u(J.V("2i-1s")),g=J.V("2z-1s-2t");I(g==R)g=(h+d-1).1q().L;Y I(3R(g)==R)g=0;O(K i=0;i\'+j+"":"")+i)}H a},4f:6(a){H a?"<4a>"+a+"":""},4b:6(a,b){6 c(l){H(l=l?l.1V||g:g)?l+" ":""}O(K d=0,h="",g=J.V("1D",""),i=0;i|&1y;2R\\s*\\/?&1G;/2T;I(e.13.46==R)b=b.Q(h,"\\n");I(e.13.44==R)b=b.Q(h,"");b=b.1e("\\n");h=/^\\s*/;g=4Q;O(K i=0;i0;i++){K k=b[i];I(x(k).L!=0){k=h.X(k);I(k==N){a=a;1N a}g=1Q.4q(k[0].L,g)}}I(g>0)O(i=0;i\'+(J.V("16")?e.16.1H(J):"")+\'<3Z 5z="0" 5H="0" 5J="0">\'+J.4f(J.V("1t"))+"<3T><3P>"+(1u?\'<2d 1g="1u">\'+J.3Q(a)+"":"")+\'<2d 1g="17">\'+b+""},2F:6(a){I(a===N)a="";J.17=a;K b=J.3Y("T");b.3X=J.1H(a);J.V("16")&&w(p(b,".16"),"5c",e.16.2b);J.V("3V-17")&&w(p(b,".17"),"56",f);H b},2Q:6(a){J.1c=""+1Q.5d(1Q.5n()*5k).1q();e.1Y.2A[t(J.1c)]=J;J.1n=C(e.2v,a||{});I(J.V("2k")==R)J.1n.16=J.1n.1u=11},5j:6(a){a=a.Q(/^\\s+|\\s+$/g,"").Q(/\\s+/g,"|");H"\\\\b(?:"+a+")\\\\b"},5f:6(a){J.28={18:{1I:a.18,23:"1k"},1b:{1I:a.1b,23:"1k"},17:1f M("(?<18>"+a.18.1m+")(?<17>.*?)(?<1b>"+a.1b.1m+")","5o")}}};H e}();1j 2e!="1d"&&(2e.1v=1v);',62,441,"||||||function|||||||||||||||||||||||||||||||||||||return|if|this|var|length|XRegExp|null|for|index|replace|true||div|push|getParam|call|exec|else|prototype||false|lastIndex|config|arguments|RegExp|toolbar|code|left|captureNames|slice|right|id|undefined|split|new|class|addToken|indexOf|typeof|script|className|source|params|substr|apply|toString|String|line|title|gutter|SyntaxHighlighter|_xregexp|strings|lt|html|test|OUTSIDE_CLASS|match|brush|document|target|gt|getHtml|regex|global|join|style|highlight|break|concat|window|Math|isRegExp|throw|value|brushes|brushName|space|alert|vars|http|syntaxhighlighter|expandSource|size|css|case|font|Fa|name|htmlScript|dA|can|handler|gm|td|exports|color|in|href|first|discoveredBrushes|light|collapse|object|cache|getButtonHtml|trigger|pattern|getLineHtml|nbsp|numbers|parseInt|defaults|com|items|www|pad|highlighters|execute|focus|func|all|getDiv|parentNode|navigator|INSIDE_CLASS|regexList|hasFlag|Match|useScriptTags|hasNamedCapture|text|help|init|br|input|gi|Error|values|span|list|250|height|width|screen|top|500|tagName|findElements|getElementsByTagName|aboutDialog|_blank|appendChild|charAt|Array|copyAsGlobal|setFlag|highlighter_|string|attachEvent|nodeName|floor|backref|output|the|TypeError|sticky|Za|iterate|freezeTokens|scope|type|textarea|alexgorbatchev|version|margin|2010|005896|gs|regexLib|body|center|align|noBrush|require|childNodes|DTD|xhtml1|head|org|w3|url|preventDefault|container|tr|getLineNumbersHtml|isNaN|userAgent|tbody|isLineHighlighted|quick|void|innerHTML|create|table|links|auto|smart|tab|stripBrs|tabs|bloggerMode|collapsed|plain|getCodeLinesHtml|caption|getMatchesHtml|findMatches|figureOutLineNumbers|removeNestedMatches|getTitleHtml|brushNotHtmlScript|substring|createElement|Highlighter|load|HtmlScript|Brush|pre|expand|multiline|min|Can|ignoreCase|find|blur|extended|toLowerCase|aliases|addEventListener|innerText|textContent|wasn|select|createTextNode|removeChild|option|same|frame|xmlns|dtd|twice|1999|equiv|meta|htmlscript|transitional|1E3|expected|PUBLIC|DOCTYPE|on|W3C|XHTML|TR|EN|Transitional||configured|srcElement|Object|after|run|dblclick|matchChain|valueOf|constructor|default|switch|click|round|execAt|forHtmlScript|token|gimy|functions|getKeywords|1E6|escape|within|random|sgi|another|finally|supply|MSIE|ie|toUpperCase|catch|returnValue|definition|event|border|imsx|constructing|one|Infinity|from|when|Content|cellpadding|flags|cellspacing|try|xhtml|Type|spaces|2930402|hosted_button_id|lastIndexOf|donate|active|development|keep|to|xclick|_s|Xml|please|like|you|paypal|cgi|cmd|webscr|bin|highlighted|scrollbars|aspScriptTags|phpScriptTags|sort|max|scriptScriptTags|toolbar_item|_|command|command_|number|getElementById|doubleQuotedString|singleLinePerlComments|singleLineCComments|multiLineCComments|singleQuotedString|multiLineDoubleQuotedString|xmlComments|alt|multiLineSingleQuotedString|If|https|1em|000|fff|background|5em|xx|bottom|75em|Gorbatchev|large|serif|CDATA|continue|utf|charset|content|About|family|sans|Helvetica|Arial|Geneva|3em|nogutter|Copyright|syntax|close|write|2004|Alex|open|JavaScript|highlighter|July|02|replaceChild|offset|83".split("|"),0,{})); \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/examples/syntaxhighlighter/styles/shCore.css b/libreplan-webapp/src/main/webapp/jqplot/examples/syntaxhighlighter/styles/shCore.css deleted file mode 100644 index 34f6864a1..000000000 --- a/libreplan-webapp/src/main/webapp/jqplot/examples/syntaxhighlighter/styles/shCore.css +++ /dev/null @@ -1,226 +0,0 @@ -/** - * SyntaxHighlighter - * http://alexgorbatchev.com/SyntaxHighlighter - * - * SyntaxHighlighter is donationware. If you are using it, please donate. - * http://alexgorbatchev.com/SyntaxHighlighter/donate.html - * - * @version - * 3.0.83 (July 02 2010) - * - * @copyright - * Copyright (C) 2004-2010 Alex Gorbatchev. - * - * @license - * Dual licensed under the MIT and GPL licenses. - */ -.syntaxhighlighter a, -.syntaxhighlighter div, -.syntaxhighlighter code, -.syntaxhighlighter table, -.syntaxhighlighter table td, -.syntaxhighlighter table tr, -.syntaxhighlighter table tbody, -.syntaxhighlighter table thead, -.syntaxhighlighter table caption, -.syntaxhighlighter textarea { - -moz-border-radius: 0 0 0 0 !important; - -webkit-border-radius: 0 0 0 0 !important; - background: none !important; - border: 0 !important; - bottom: auto !important; - float: none !important; - height: auto !important; - left: auto !important; - line-height: 1.1em !important; - margin: 0 !important; - outline: 0 !important; - overflow: visible !important; - padding: 0 !important; - position: static !important; - right: auto !important; - text-align: left !important; - top: auto !important; - vertical-align: baseline !important; - width: auto !important; - box-sizing: content-box !important; - font-family: "Consolas", "Bitstream Vera Sans Mono", "Courier New", Courier, monospace !important; - font-weight: normal !important; - font-style: normal !important; - font-size: 1em !important; - min-height: inherit !important; - min-height: auto !important; -} - -.syntaxhighlighter { - width: 100% !important; - margin: 1em 0 1em 0 !important; - position: relative !important; - overflow: auto !important; - font-size: 1em !important; -} -.syntaxhighlighter.source { - overflow: hidden !important; -} -.syntaxhighlighter .bold { - font-weight: bold !important; -} -.syntaxhighlighter .italic { - font-style: italic !important; -} -.syntaxhighlighter .line { - white-space: pre !important; -} -.syntaxhighlighter table { - width: 100% !important; -} -.syntaxhighlighter table caption { - text-align: left !important; - padding: .5em 0 0.5em 1em !important; -} -.syntaxhighlighter table td.code { - width: 100% !important; -} -.syntaxhighlighter table td.code .container { - position: relative !important; -} -.syntaxhighlighter table td.code .container textarea { - box-sizing: border-box !important; - position: absolute !important; - left: 0 !important; - top: 0 !important; - width: 100% !important; - height: 100% !important; - border: none !important; - background: white !important; - padding-left: 1em !important; - overflow: hidden !important; - white-space: pre !important; -} -.syntaxhighlighter table td.gutter .line { - text-align: right !important; - padding: 0 0.5em 0 1em !important; -} -.syntaxhighlighter table td.code .line { - padding: 0 1em !important; -} -.syntaxhighlighter.nogutter td.code .container textarea, .syntaxhighlighter.nogutter td.code .line { - padding-left: 0em !important; -} -.syntaxhighlighter.show { - display: block !important; -} -.syntaxhighlighter.collapsed table { - display: none !important; -} -.syntaxhighlighter.collapsed .toolbar { - padding: 0.1em 0.8em 0em 0.8em !important; - font-size: 1em !important; - position: static !important; - width: auto !important; - height: auto !important; -} -.syntaxhighlighter.collapsed .toolbar span { - display: inline !important; - margin-right: 1em !important; -} -.syntaxhighlighter.collapsed .toolbar span a { - padding: 0 !important; - display: none !important; -} -.syntaxhighlighter.collapsed .toolbar span a.expandSource { - display: inline !important; -} -.syntaxhighlighter .toolbar { - position: absolute !important; - right: 1px !important; - top: 1px !important; - width: 11px !important; - height: 11px !important; - font-size: 10px !important; - z-index: 10 !important; -} -.syntaxhighlighter .toolbar span.title { - display: inline !important; -} -.syntaxhighlighter .toolbar a { - display: block !important; - text-align: center !important; - text-decoration: none !important; - padding-top: 1px !important; -} -.syntaxhighlighter .toolbar a.expandSource { - display: none !important; -} -.syntaxhighlighter.ie { - font-size: .9em !important; - padding: 1px 0 1px 0 !important; -} -.syntaxhighlighter.ie .toolbar { - line-height: 8px !important; -} -.syntaxhighlighter.ie .toolbar a { - padding-top: 0px !important; -} -.syntaxhighlighter.printing .line.alt1 .content, -.syntaxhighlighter.printing .line.alt2 .content, -.syntaxhighlighter.printing .line.highlighted .number, -.syntaxhighlighter.printing .line.highlighted.alt1 .content, -.syntaxhighlighter.printing .line.highlighted.alt2 .content { - background: none !important; -} -.syntaxhighlighter.printing .line .number { - color: #bbbbbb !important; -} -.syntaxhighlighter.printing .line .content { - color: black !important; -} -.syntaxhighlighter.printing .toolbar { - display: none !important; -} -.syntaxhighlighter.printing a { - text-decoration: none !important; -} -.syntaxhighlighter.printing .plain, .syntaxhighlighter.printing .plain a { - color: black !important; -} -.syntaxhighlighter.printing .comments, .syntaxhighlighter.printing .comments a { - color: #008200 !important; -} -.syntaxhighlighter.printing .string, .syntaxhighlighter.printing .string a { - color: blue !important; -} -.syntaxhighlighter.printing .keyword { - color: #006699 !important; - font-weight: bold !important; -} -.syntaxhighlighter.printing .preprocessor { - color: gray !important; -} -.syntaxhighlighter.printing .variable { - color: #aa7700 !important; -} -.syntaxhighlighter.printing .value { - color: #009900 !important; -} -.syntaxhighlighter.printing .functions { - color: #ff1493 !important; -} -.syntaxhighlighter.printing .constants { - color: #0066cc !important; -} -.syntaxhighlighter.printing .script { - font-weight: bold !important; -} -.syntaxhighlighter.printing .color1, .syntaxhighlighter.printing .color1 a { - color: gray !important; -} -.syntaxhighlighter.printing .color2, .syntaxhighlighter.printing .color2 a { - color: #ff1493 !important; -} -.syntaxhighlighter.printing .color3, .syntaxhighlighter.printing .color3 a { - color: red !important; -} -.syntaxhighlighter.printing .break, .syntaxhighlighter.printing .break a { - color: black !important; -} diff --git a/libreplan-webapp/src/main/webapp/jqplot/examples/syntaxhighlighter/styles/shCore.min.css b/libreplan-webapp/src/main/webapp/jqplot/examples/syntaxhighlighter/styles/shCore.min.css deleted file mode 100644 index a2d3a61f3..000000000 --- a/libreplan-webapp/src/main/webapp/jqplot/examples/syntaxhighlighter/styles/shCore.min.css +++ /dev/null @@ -1 +0,0 @@ -.syntaxhighlighter a,.syntaxhighlighter div,.syntaxhighlighter code,.syntaxhighlighter table,.syntaxhighlighter table td,.syntaxhighlighter table tr,.syntaxhighlighter table tbody,.syntaxhighlighter table thead,.syntaxhighlighter table caption,.syntaxhighlighter textarea{-moz-border-radius:0 0 0 0!important;-webkit-border-radius:0 0 0 0!important;background:none!important;border:0!important;bottom:auto!important;float:none!important;height:auto!important;left:auto!important;line-height:1.1em!important;margin:0!important;outline:0!important;overflow:visible!important;padding:0!important;position:static!important;right:auto!important;text-align:left!important;top:auto!important;vertical-align:baseline!important;width:auto!important;box-sizing:content-box!important;font-family:"Consolas","Bitstream Vera Sans Mono","Courier New",Courier,monospace!important;font-weight:normal!important;font-style:normal!important;font-size:1em!important;min-height:inherit!important;min-height:auto!important;}.syntaxhighlighter{width:100%!important;margin:1em 0 1em 0!important;position:relative!important;overflow:auto!important;font-size:1em!important;}.syntaxhighlighter.source{overflow:hidden!important;}.syntaxhighlighter .bold{font-weight:bold!important;}.syntaxhighlighter .italic{font-style:italic!important;}.syntaxhighlighter .line{white-space:pre!important;}.syntaxhighlighter table{width:100%!important;}.syntaxhighlighter table caption{text-align:left!important;padding:.5em 0 .5em 1em!important;}.syntaxhighlighter table td.code{width:100%!important;}.syntaxhighlighter table td.code .container{position:relative!important;}.syntaxhighlighter table td.code .container textarea{box-sizing:border-box!important;position:absolute!important;left:0!important;top:0!important;width:100%!important;height:100%!important;border:none!important;background:white!important;padding-left:1em!important;overflow:hidden!important;white-space:pre!important;}.syntaxhighlighter table td.gutter .line{text-align:right!important;padding:0 .5em 0 1em!important;}.syntaxhighlighter table td.code .line{padding:0 1em!important;}.syntaxhighlighter.nogutter td.code .container textarea,.syntaxhighlighter.nogutter td.code .line{padding-left:0!important;}.syntaxhighlighter.show{display:block!important;}.syntaxhighlighter.collapsed table{display:none!important;}.syntaxhighlighter.collapsed .toolbar{padding:.1em .8em 0 .8em!important;font-size:1em!important;position:static!important;width:auto!important;height:auto!important;}.syntaxhighlighter.collapsed .toolbar span{display:inline!important;margin-right:1em!important;}.syntaxhighlighter.collapsed .toolbar span a{padding:0!important;display:none!important;}.syntaxhighlighter.collapsed .toolbar span a.expandSource{display:inline!important;}.syntaxhighlighter .toolbar{position:absolute!important;right:1px!important;top:1px!important;width:11px!important;height:11px!important;font-size:10px!important;z-index:10!important;}.syntaxhighlighter .toolbar span.title{display:inline!important;}.syntaxhighlighter .toolbar a{display:block!important;text-align:center!important;text-decoration:none!important;padding-top:1px!important;}.syntaxhighlighter .toolbar a.expandSource{display:none!important;}.syntaxhighlighter.ie{font-size:.9em!important;padding:1px 0 1px 0!important;}.syntaxhighlighter.ie .toolbar{line-height:8px!important;}.syntaxhighlighter.ie .toolbar a{padding-top:0!important;}.syntaxhighlighter.printing .line.alt1 .content,.syntaxhighlighter.printing .line.alt2 .content,.syntaxhighlighter.printing .line.highlighted .number,.syntaxhighlighter.printing .line.highlighted.alt1 .content,.syntaxhighlighter.printing .line.highlighted.alt2 .content{background:none!important;}.syntaxhighlighter.printing .line .number{color:#bbb!important;}.syntaxhighlighter.printing .line .content{color:black!important;}.syntaxhighlighter.printing .toolbar{display:none!important;}.syntaxhighlighter.printing a{text-decoration:none!important;}.syntaxhighlighter.printing .plain,.syntaxhighlighter.printing .plain a{color:black!important;}.syntaxhighlighter.printing .comments,.syntaxhighlighter.printing .comments a{color:#008200!important;}.syntaxhighlighter.printing .string,.syntaxhighlighter.printing .string a{color:blue!important;}.syntaxhighlighter.printing .keyword{color:#069!important;font-weight:bold!important;}.syntaxhighlighter.printing .preprocessor{color:gray!important;}.syntaxhighlighter.printing .variable{color:#a70!important;}.syntaxhighlighter.printing .value{color:#090!important;}.syntaxhighlighter.printing .functions{color:#ff1493!important;}.syntaxhighlighter.printing .constants{color:#06c!important;}.syntaxhighlighter.printing .script{font-weight:bold!important;}.syntaxhighlighter.printing .color1,.syntaxhighlighter.printing .color1 a{color:gray!important;}.syntaxhighlighter.printing .color2,.syntaxhighlighter.printing .color2 a{color:#ff1493!important;}.syntaxhighlighter.printing .color3,.syntaxhighlighter.printing .color3 a{color:red!important;}.syntaxhighlighter.printing .break,.syntaxhighlighter.printing .break a{color:black!important;} \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/examples/syntaxhighlighter/styles/shCoreDefault.css b/libreplan-webapp/src/main/webapp/jqplot/examples/syntaxhighlighter/styles/shCoreDefault.css deleted file mode 100644 index 08f9e10e4..000000000 --- a/libreplan-webapp/src/main/webapp/jqplot/examples/syntaxhighlighter/styles/shCoreDefault.css +++ /dev/null @@ -1,328 +0,0 @@ -/** - * SyntaxHighlighter - * http://alexgorbatchev.com/SyntaxHighlighter - * - * SyntaxHighlighter is donationware. If you are using it, please donate. - * http://alexgorbatchev.com/SyntaxHighlighter/donate.html - * - * @version - * 3.0.83 (July 02 2010) - * - * @copyright - * Copyright (C) 2004-2010 Alex Gorbatchev. - * - * @license - * Dual licensed under the MIT and GPL licenses. - */ -.syntaxhighlighter a, -.syntaxhighlighter div, -.syntaxhighlighter code, -.syntaxhighlighter table, -.syntaxhighlighter table td, -.syntaxhighlighter table tr, -.syntaxhighlighter table tbody, -.syntaxhighlighter table thead, -.syntaxhighlighter table caption, -.syntaxhighlighter textarea { - -moz-border-radius: 0 0 0 0 !important; - -webkit-border-radius: 0 0 0 0 !important; - background: none !important; - border: 0 !important; - bottom: auto !important; - float: none !important; - height: auto !important; - left: auto !important; - line-height: 1.1em !important; - margin: 0 !important; - outline: 0 !important; - overflow: visible !important; - padding: 0 !important; - position: static !important; - right: auto !important; - text-align: left !important; - top: auto !important; - vertical-align: baseline !important; - width: auto !important; - box-sizing: content-box !important; - font-family: "Consolas", "Bitstream Vera Sans Mono", "Courier New", Courier, monospace !important; - font-weight: normal !important; - font-style: normal !important; - font-size: 1em !important; - min-height: inherit !important; - min-height: auto !important; -} - -.syntaxhighlighter { - width: 100% !important; - margin: 1em 0 1em 0 !important; - position: relative !important; - overflow: auto !important; - font-size: 1em !important; -} -.syntaxhighlighter.source { - overflow: hidden !important; -} -.syntaxhighlighter .bold { - font-weight: bold !important; -} -.syntaxhighlighter .italic { - font-style: italic !important; -} -.syntaxhighlighter .line { - white-space: pre !important; -} -.syntaxhighlighter table { - width: 100% !important; -} -.syntaxhighlighter table caption { - text-align: left !important; - padding: .5em 0 0.5em 1em !important; -} -.syntaxhighlighter table td.code { - width: 100% !important; -} -.syntaxhighlighter table td.code .container { - position: relative !important; -} -.syntaxhighlighter table td.code .container textarea { - box-sizing: border-box !important; - position: absolute !important; - left: 0 !important; - top: 0 !important; - width: 100% !important; - height: 100% !important; - border: none !important; - background: white !important; - padding-left: 1em !important; - overflow: hidden !important; - white-space: pre !important; -} -.syntaxhighlighter table td.gutter .line { - text-align: right !important; - padding: 0 0.5em 0 1em !important; -} -.syntaxhighlighter table td.code .line { - padding: 0 1em !important; -} -.syntaxhighlighter.nogutter td.code .container textarea, .syntaxhighlighter.nogutter td.code .line { - padding-left: 0em !important; -} -.syntaxhighlighter.show { - display: block !important; -} -.syntaxhighlighter.collapsed table { - display: none !important; -} -.syntaxhighlighter.collapsed .toolbar { - padding: 0.1em 0.8em 0em 0.8em !important; - font-size: 1em !important; - position: static !important; - width: auto !important; - height: auto !important; -} -.syntaxhighlighter.collapsed .toolbar span { - display: inline !important; - margin-right: 1em !important; -} -.syntaxhighlighter.collapsed .toolbar span a { - padding: 0 !important; - display: none !important; -} -.syntaxhighlighter.collapsed .toolbar span a.expandSource { - display: inline !important; -} -.syntaxhighlighter .toolbar { - position: absolute !important; - right: 1px !important; - top: 1px !important; - width: 11px !important; - height: 11px !important; - font-size: 10px !important; - z-index: 10 !important; -} -.syntaxhighlighter .toolbar span.title { - display: inline !important; -} -.syntaxhighlighter .toolbar a { - display: block !important; - text-align: center !important; - text-decoration: none !important; - padding-top: 1px !important; -} -.syntaxhighlighter .toolbar a.expandSource { - display: none !important; -} -.syntaxhighlighter.ie { - font-size: .9em !important; - padding: 1px 0 1px 0 !important; -} -.syntaxhighlighter.ie .toolbar { - line-height: 8px !important; -} -.syntaxhighlighter.ie .toolbar a { - padding-top: 0px !important; -} -.syntaxhighlighter.printing .line.alt1 .content, -.syntaxhighlighter.printing .line.alt2 .content, -.syntaxhighlighter.printing .line.highlighted .number, -.syntaxhighlighter.printing .line.highlighted.alt1 .content, -.syntaxhighlighter.printing .line.highlighted.alt2 .content { - background: none !important; -} -.syntaxhighlighter.printing .line .number { - color: #bbbbbb !important; -} -.syntaxhighlighter.printing .line .content { - color: black !important; -} -.syntaxhighlighter.printing .toolbar { - display: none !important; -} -.syntaxhighlighter.printing a { - text-decoration: none !important; -} -.syntaxhighlighter.printing .plain, .syntaxhighlighter.printing .plain a { - color: black !important; -} -.syntaxhighlighter.printing .comments, .syntaxhighlighter.printing .comments a { - color: #008200 !important; -} -.syntaxhighlighter.printing .string, .syntaxhighlighter.printing .string a { - color: blue !important; -} -.syntaxhighlighter.printing .keyword { - color: #006699 !important; - font-weight: bold !important; -} -.syntaxhighlighter.printing .preprocessor { - color: gray !important; -} -.syntaxhighlighter.printing .variable { - color: #aa7700 !important; -} -.syntaxhighlighter.printing .value { - color: #009900 !important; -} -.syntaxhighlighter.printing .functions { - color: #ff1493 !important; -} -.syntaxhighlighter.printing .constants { - color: #0066cc !important; -} -.syntaxhighlighter.printing .script { - font-weight: bold !important; -} -.syntaxhighlighter.printing .color1, .syntaxhighlighter.printing .color1 a { - color: gray !important; -} -.syntaxhighlighter.printing .color2, .syntaxhighlighter.printing .color2 a { - color: #ff1493 !important; -} -.syntaxhighlighter.printing .color3, .syntaxhighlighter.printing .color3 a { - color: red !important; -} -.syntaxhighlighter.printing .break, .syntaxhighlighter.printing .break a { - color: black !important; -} - -.syntaxhighlighter { - background-color: white !important; -} -.syntaxhighlighter .line.alt1 { - background-color: white !important; -} -.syntaxhighlighter .line.alt2 { - background-color: white !important; -} -.syntaxhighlighter .line.highlighted.alt1, .syntaxhighlighter .line.highlighted.alt2 { - background-color: #e0e0e0 !important; -} -.syntaxhighlighter .line.highlighted.number { - color: black !important; -} -.syntaxhighlighter table caption { - color: black !important; -} -.syntaxhighlighter .gutter { - color: #afafaf !important; -} -.syntaxhighlighter .gutter .line { - border-right: 3px solid #6ce26c !important; -} -.syntaxhighlighter .gutter .line.highlighted { - background-color: #6ce26c !important; - color: white !important; -} -.syntaxhighlighter.printing .line .content { - border: none !important; -} -.syntaxhighlighter.collapsed { - overflow: visible !important; -} -.syntaxhighlighter.collapsed .toolbar { - color: blue !important; - background: white !important; - border: 1px solid #6ce26c !important; -} -.syntaxhighlighter.collapsed .toolbar a { - color: blue !important; -} -.syntaxhighlighter.collapsed .toolbar a:hover { - color: red !important; -} -.syntaxhighlighter .toolbar { - color: white !important; - background: #6ce26c !important; - border: none !important; -} -.syntaxhighlighter .toolbar a { - color: white !important; -} -.syntaxhighlighter .toolbar a:hover { - color: black !important; -} -.syntaxhighlighter .plain, .syntaxhighlighter .plain a { - color: black !important; -} -.syntaxhighlighter .comments, .syntaxhighlighter .comments a { - color: #008200 !important; -} -.syntaxhighlighter .string, .syntaxhighlighter .string a { - color: blue !important; -} -.syntaxhighlighter .keyword { - color: #006699 !important; -} -.syntaxhighlighter .preprocessor { - color: gray !important; -} -.syntaxhighlighter .variable { - color: #aa7700 !important; -} -.syntaxhighlighter .value { - color: #009900 !important; -} -.syntaxhighlighter .functions { - color: #ff1493 !important; -} -.syntaxhighlighter .constants { - color: #0066cc !important; -} -.syntaxhighlighter .script { - font-weight: bold !important; - color: #006699 !important; - background-color: none !important; -} -.syntaxhighlighter .color1, .syntaxhighlighter .color1 a { - color: gray !important; -} -.syntaxhighlighter .color2, .syntaxhighlighter .color2 a { - color: #ff1493 !important; -} -.syntaxhighlighter .color3, .syntaxhighlighter .color3 a { - color: red !important; -} - -.syntaxhighlighter .keyword { - font-weight: bold !important; -} diff --git a/libreplan-webapp/src/main/webapp/jqplot/examples/syntaxhighlighter/styles/shCoreDefault.min.css b/libreplan-webapp/src/main/webapp/jqplot/examples/syntaxhighlighter/styles/shCoreDefault.min.css deleted file mode 100644 index 0b99c2994..000000000 --- a/libreplan-webapp/src/main/webapp/jqplot/examples/syntaxhighlighter/styles/shCoreDefault.min.css +++ /dev/null @@ -1 +0,0 @@ -.syntaxhighlighter a,.syntaxhighlighter div,.syntaxhighlighter code,.syntaxhighlighter table,.syntaxhighlighter table td,.syntaxhighlighter table tr,.syntaxhighlighter table tbody,.syntaxhighlighter table thead,.syntaxhighlighter table caption,.syntaxhighlighter textarea{-moz-border-radius:0 0 0 0!important;-webkit-border-radius:0 0 0 0!important;background:none!important;border:0!important;bottom:auto!important;float:none!important;height:auto!important;left:auto!important;line-height:1.1em!important;margin:0!important;outline:0!important;overflow:visible!important;padding:0!important;position:static!important;right:auto!important;text-align:left!important;top:auto!important;vertical-align:baseline!important;width:auto!important;box-sizing:content-box!important;font-family:"Consolas","Bitstream Vera Sans Mono","Courier New",Courier,monospace!important;font-weight:normal!important;font-style:normal!important;font-size:1em!important;min-height:inherit!important;min-height:auto!important;}.syntaxhighlighter{width:100%!important;margin:1em 0 1em 0!important;position:relative!important;overflow:auto!important;font-size:1em!important;}.syntaxhighlighter.source{overflow:hidden!important;}.syntaxhighlighter .bold{font-weight:bold!important;}.syntaxhighlighter .italic{font-style:italic!important;}.syntaxhighlighter .line{white-space:pre!important;}.syntaxhighlighter table{width:100%!important;}.syntaxhighlighter table caption{text-align:left!important;padding:.5em 0 .5em 1em!important;}.syntaxhighlighter table td.code{width:100%!important;}.syntaxhighlighter table td.code .container{position:relative!important;}.syntaxhighlighter table td.code .container textarea{box-sizing:border-box!important;position:absolute!important;left:0!important;top:0!important;width:100%!important;height:100%!important;border:none!important;background:white!important;padding-left:1em!important;overflow:hidden!important;white-space:pre!important;}.syntaxhighlighter table td.gutter .line{text-align:right!important;padding:0 .5em 0 1em!important;}.syntaxhighlighter table td.code .line{padding:0 1em!important;}.syntaxhighlighter.nogutter td.code .container textarea,.syntaxhighlighter.nogutter td.code .line{padding-left:0!important;}.syntaxhighlighter.show{display:block!important;}.syntaxhighlighter.collapsed table{display:none!important;}.syntaxhighlighter.collapsed .toolbar{padding:.1em .8em 0 .8em!important;font-size:1em!important;position:static!important;width:auto!important;height:auto!important;}.syntaxhighlighter.collapsed .toolbar span{display:inline!important;margin-right:1em!important;}.syntaxhighlighter.collapsed .toolbar span a{padding:0!important;display:none!important;}.syntaxhighlighter.collapsed .toolbar span a.expandSource{display:inline!important;}.syntaxhighlighter .toolbar{position:absolute!important;right:1px!important;top:1px!important;width:11px!important;height:11px!important;font-size:10px!important;z-index:10!important;}.syntaxhighlighter .toolbar span.title{display:inline!important;}.syntaxhighlighter .toolbar a{display:block!important;text-align:center!important;text-decoration:none!important;padding-top:1px!important;}.syntaxhighlighter .toolbar a.expandSource{display:none!important;}.syntaxhighlighter.ie{font-size:.9em!important;padding:1px 0 1px 0!important;}.syntaxhighlighter.ie .toolbar{line-height:8px!important;}.syntaxhighlighter.ie .toolbar a{padding-top:0!important;}.syntaxhighlighter.printing .line.alt1 .content,.syntaxhighlighter.printing .line.alt2 .content,.syntaxhighlighter.printing .line.highlighted .number,.syntaxhighlighter.printing .line.highlighted.alt1 .content,.syntaxhighlighter.printing .line.highlighted.alt2 .content{background:none!important;}.syntaxhighlighter.printing .line .number{color:#bbb!important;}.syntaxhighlighter.printing .line .content{color:black!important;}.syntaxhighlighter.printing .toolbar{display:none!important;}.syntaxhighlighter.printing a{text-decoration:none!important;}.syntaxhighlighter.printing .plain,.syntaxhighlighter.printing .plain a{color:black!important;}.syntaxhighlighter.printing .comments,.syntaxhighlighter.printing .comments a{color:#008200!important;}.syntaxhighlighter.printing .string,.syntaxhighlighter.printing .string a{color:blue!important;}.syntaxhighlighter.printing .keyword{color:#069!important;font-weight:bold!important;}.syntaxhighlighter.printing .preprocessor{color:gray!important;}.syntaxhighlighter.printing .variable{color:#a70!important;}.syntaxhighlighter.printing .value{color:#090!important;}.syntaxhighlighter.printing .functions{color:#ff1493!important;}.syntaxhighlighter.printing .constants{color:#06c!important;}.syntaxhighlighter.printing .script{font-weight:bold!important;}.syntaxhighlighter.printing .color1,.syntaxhighlighter.printing .color1 a{color:gray!important;}.syntaxhighlighter.printing .color2,.syntaxhighlighter.printing .color2 a{color:#ff1493!important;}.syntaxhighlighter.printing .color3,.syntaxhighlighter.printing .color3 a{color:red!important;}.syntaxhighlighter.printing .break,.syntaxhighlighter.printing .break a{color:black!important;}.syntaxhighlighter{background-color:white!important;}.syntaxhighlighter .line.alt1{background-color:white!important;}.syntaxhighlighter .line.alt2{background-color:white!important;}.syntaxhighlighter .line.highlighted.alt1,.syntaxhighlighter .line.highlighted.alt2{background-color:#e0e0e0!important;}.syntaxhighlighter .line.highlighted.number{color:black!important;}.syntaxhighlighter table caption{color:black!important;}.syntaxhighlighter .gutter{color:#afafaf!important;}.syntaxhighlighter .gutter .line{border-right:3px solid #6ce26c!important;}.syntaxhighlighter .gutter .line.highlighted{background-color:#6ce26c!important;color:white!important;}.syntaxhighlighter.printing .line .content{border:none!important;}.syntaxhighlighter.collapsed{overflow:visible!important;}.syntaxhighlighter.collapsed .toolbar{color:blue!important;background:white!important;border:1px solid #6ce26c!important;}.syntaxhighlighter.collapsed .toolbar a{color:blue!important;}.syntaxhighlighter.collapsed .toolbar a:hover{color:red!important;}.syntaxhighlighter .toolbar{color:white!important;background:#6ce26c!important;border:none!important;}.syntaxhighlighter .toolbar a{color:white!important;}.syntaxhighlighter .toolbar a:hover{color:black!important;}.syntaxhighlighter .plain,.syntaxhighlighter .plain a{color:black!important;}.syntaxhighlighter .comments,.syntaxhighlighter .comments a{color:#008200!important;}.syntaxhighlighter .string,.syntaxhighlighter .string a{color:blue!important;}.syntaxhighlighter .keyword{color:#069!important;}.syntaxhighlighter .preprocessor{color:gray!important;}.syntaxhighlighter .variable{color:#a70!important;}.syntaxhighlighter .value{color:#090!important;}.syntaxhighlighter .functions{color:#ff1493!important;}.syntaxhighlighter .constants{color:#06c!important;}.syntaxhighlighter .script{font-weight:bold!important;color:#069!important;background-color:none!important;}.syntaxhighlighter .color1,.syntaxhighlighter .color1 a{color:gray!important;}.syntaxhighlighter .color2,.syntaxhighlighter .color2 a{color:#ff1493!important;}.syntaxhighlighter .color3,.syntaxhighlighter .color3 a{color:red!important;}.syntaxhighlighter .keyword{font-weight:bold!important;} \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/examples/syntaxhighlighter/styles/shThemeDefault.css b/libreplan-webapp/src/main/webapp/jqplot/examples/syntaxhighlighter/styles/shThemeDefault.css deleted file mode 100644 index 136541172..000000000 --- a/libreplan-webapp/src/main/webapp/jqplot/examples/syntaxhighlighter/styles/shThemeDefault.css +++ /dev/null @@ -1,117 +0,0 @@ -/** - * SyntaxHighlighter - * http://alexgorbatchev.com/SyntaxHighlighter - * - * SyntaxHighlighter is donationware. If you are using it, please donate. - * http://alexgorbatchev.com/SyntaxHighlighter/donate.html - * - * @version - * 3.0.83 (July 02 2010) - * - * @copyright - * Copyright (C) 2004-2010 Alex Gorbatchev. - * - * @license - * Dual licensed under the MIT and GPL licenses. - */ -.syntaxhighlighter { - background-color: white !important; -} -.syntaxhighlighter .line.alt1 { - background-color: white !important; -} -.syntaxhighlighter .line.alt2 { - background-color: white !important; -} -.syntaxhighlighter .line.highlighted.alt1, .syntaxhighlighter .line.highlighted.alt2 { - background-color: #e0e0e0 !important; -} -.syntaxhighlighter .line.highlighted.number { - color: black !important; -} -.syntaxhighlighter table caption { - color: black !important; -} -.syntaxhighlighter .gutter { - color: #afafaf !important; -} -.syntaxhighlighter .gutter .line { - border-right: 3px solid #6ce26c !important; -} -.syntaxhighlighter .gutter .line.highlighted { - background-color: #6ce26c !important; - color: white !important; -} -.syntaxhighlighter.printing .line .content { - border: none !important; -} -.syntaxhighlighter.collapsed { - overflow: visible !important; -} -.syntaxhighlighter.collapsed .toolbar { - color: blue !important; - background: white !important; - border: 1px solid #6ce26c !important; -} -.syntaxhighlighter.collapsed .toolbar a { - color: blue !important; -} -.syntaxhighlighter.collapsed .toolbar a:hover { - color: red !important; -} -.syntaxhighlighter .toolbar { - color: white !important; - background: #6ce26c !important; - border: none !important; -} -.syntaxhighlighter .toolbar a { - color: white !important; -} -.syntaxhighlighter .toolbar a:hover { - color: black !important; -} -.syntaxhighlighter .plain, .syntaxhighlighter .plain a { - color: black !important; -} -.syntaxhighlighter .comments, .syntaxhighlighter .comments a { - color: #008200 !important; -} -.syntaxhighlighter .string, .syntaxhighlighter .string a { - color: blue !important; -} -.syntaxhighlighter .keyword { - color: #006699 !important; -} -.syntaxhighlighter .preprocessor { - color: gray !important; -} -.syntaxhighlighter .variable { - color: #aa7700 !important; -} -.syntaxhighlighter .value { - color: #009900 !important; -} -.syntaxhighlighter .functions { - color: #ff1493 !important; -} -.syntaxhighlighter .constants { - color: #0066cc !important; -} -.syntaxhighlighter .script { - font-weight: bold !important; - color: #006699 !important; - background-color: none !important; -} -.syntaxhighlighter .color1, .syntaxhighlighter .color1 a { - color: gray !important; -} -.syntaxhighlighter .color2, .syntaxhighlighter .color2 a { - color: #ff1493 !important; -} -.syntaxhighlighter .color3, .syntaxhighlighter .color3 a { - color: red !important; -} - -.syntaxhighlighter .keyword { - font-weight: bold !important; -} diff --git a/libreplan-webapp/src/main/webapp/jqplot/examples/syntaxhighlighter/styles/shThemeDefault.min.css b/libreplan-webapp/src/main/webapp/jqplot/examples/syntaxhighlighter/styles/shThemeDefault.min.css deleted file mode 100644 index 57326f47f..000000000 --- a/libreplan-webapp/src/main/webapp/jqplot/examples/syntaxhighlighter/styles/shThemeDefault.min.css +++ /dev/null @@ -1 +0,0 @@ -.syntaxhighlighter{background-color:white!important;}.syntaxhighlighter .line.alt1{background-color:white!important;}.syntaxhighlighter .line.alt2{background-color:white!important;}.syntaxhighlighter .line.highlighted.alt1,.syntaxhighlighter .line.highlighted.alt2{background-color:#e0e0e0!important;}.syntaxhighlighter .line.highlighted.number{color:black!important;}.syntaxhighlighter table caption{color:black!important;}.syntaxhighlighter .gutter{color:#afafaf!important;}.syntaxhighlighter .gutter .line{border-right:3px solid #6ce26c!important;}.syntaxhighlighter .gutter .line.highlighted{background-color:#6ce26c!important;color:white!important;}.syntaxhighlighter.printing .line .content{border:none!important;}.syntaxhighlighter.collapsed{overflow:visible!important;}.syntaxhighlighter.collapsed .toolbar{color:blue!important;background:white!important;border:1px solid #6ce26c!important;}.syntaxhighlighter.collapsed .toolbar a{color:blue!important;}.syntaxhighlighter.collapsed .toolbar a:hover{color:red!important;}.syntaxhighlighter .toolbar{color:white!important;background:#6ce26c!important;border:none!important;}.syntaxhighlighter .toolbar a{color:white!important;}.syntaxhighlighter .toolbar a:hover{color:black!important;}.syntaxhighlighter .plain,.syntaxhighlighter .plain a{color:black!important;}.syntaxhighlighter .comments,.syntaxhighlighter .comments a{color:#008200!important;}.syntaxhighlighter .string,.syntaxhighlighter .string a{color:blue!important;}.syntaxhighlighter .keyword{color:#069!important;}.syntaxhighlighter .preprocessor{color:gray!important;}.syntaxhighlighter .variable{color:#a70!important;}.syntaxhighlighter .value{color:#090!important;}.syntaxhighlighter .functions{color:#ff1493!important;}.syntaxhighlighter .constants{color:#06c!important;}.syntaxhighlighter .script{font-weight:bold!important;color:#069!important;background-color:none!important;}.syntaxhighlighter .color1,.syntaxhighlighter .color1 a{color:gray!important;}.syntaxhighlighter .color2,.syntaxhighlighter .color2 a{color:#ff1493!important;}.syntaxhighlighter .color3,.syntaxhighlighter .color3 a{color:red!important;}.syntaxhighlighter .keyword{font-weight:bold!important;} \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/examples/syntaxhighlighter/styles/shThemejqPlot.css b/libreplan-webapp/src/main/webapp/jqplot/examples/syntaxhighlighter/styles/shThemejqPlot.css deleted file mode 100644 index 9ccf10745..000000000 --- a/libreplan-webapp/src/main/webapp/jqplot/examples/syntaxhighlighter/styles/shThemejqPlot.css +++ /dev/null @@ -1,138 +0,0 @@ -/** - * SyntaxHighlighter - * http://alexgorbatchev.com/SyntaxHighlighter - * - * SyntaxHighlighter is donationware. If you are using it, please donate. - * http://alexgorbatchev.com/SyntaxHighlighter/donate.html - * - * @version - * 3.0.83 (July 02 2010) - * - * @copyright - * Copyright (C) 2004-2010 Alex Gorbatchev. - * - * @license - * Dual licensed under the MIT and GPL licenses. - */ -.syntaxhighlighter { - background-color: transparent !important; -} -.syntaxhighlighter .line.alt1 { - background-color: transparent !important; -} -.syntaxhighlighter .line.alt2 { - background-color: transparent !important; -} -.syntaxhighlighter .line.highlighted.alt1, .syntaxhighlighter .line.highlighted.alt2 { - background-color: #e0e0e0 !important; -} -.syntaxhighlighter .line.highlighted.number { - color: black !important; -} -.syntaxhighlighter table caption { - color: black !important; -} -.syntaxhighlighter .gutter { - color: #afafaf !important; -} -.syntaxhighlighter .gutter .line { - border-right: 3px solid #6ce26c !important; -} -.syntaxhighlighter .gutter .line.highlighted { - background-color: #6ce26c !important; - color: white !important; -} -.syntaxhighlighter.printing .line .content { - border: none !important; -} -.syntaxhighlighter.collapsed { - overflow: visible !important; -} -.syntaxhighlighter.collapsed .toolbar { - color: blue !important; - background: white !important; - border: 1px solid #6ce26c !important; -} -.syntaxhighlighter.collapsed .toolbar a { - color: blue !important; -} -.syntaxhighlighter.collapsed .toolbar a:hover { - color: red !important; -} -.syntaxhighlighter .toolbar { - color: white !important; - background: #6ce26c !important; - border: none !important; -} -.syntaxhighlighter .toolbar a { - color: white !important; -} -.syntaxhighlighter .toolbar a:hover { - color: black !important; -} -.syntaxhighlighter .plain, .syntaxhighlighter .plain a { - color: black !important; -} -.syntaxhighlighter .comments, .syntaxhighlighter .comments a { - color: #008200 !important; -} -.syntaxhighlighter .string, .syntaxhighlighter .string a { - color: blue !important; -} -.syntaxhighlighter .keyword { - color: #006699 !important; -} -.syntaxhighlighter .preprocessor { - color: gray !important; -} -.syntaxhighlighter .variable { - color: #aa7700 !important; -} -.syntaxhighlighter .value { - color: #009900 !important; -} -.syntaxhighlighter .functions { - color: #ff1493 !important; -} -.syntaxhighlighter .constants { - color: #0066cc !important; -} -.syntaxhighlighter .script { - font-weight: bold !important; - color: #006699 !important; - background-color: none !important; -} -.syntaxhighlighter .color1, .syntaxhighlighter .color1 a { - color: gray !important; -} -.syntaxhighlighter .color2, .syntaxhighlighter .color2 a { - color: #ff1493 !important; -} -.syntaxhighlighter .color3, .syntaxhighlighter .color3 a { - color: red !important; -} - -.syntaxhighlighter .keyword { - font-weight: bold !important; -} - -.syntaxhighlighter a, -.syntaxhighlighter div, -.syntaxhighlighter code, -.syntaxhighlighter table, -.syntaxhighlighter table td, -.syntaxhighlighter table tr, -.syntaxhighlighter table tbody, -.syntaxhighlighter table thead, -.syntaxhighlighter table caption, -.syntaxhighlighter textarea { - line-height: 1.3em !important; -} - -div.syntaxhighlighter { - font-size: 0.85em !important; -} - -div.include div.syntaxhighlighter table td.code .line { - margin-top: 0.1em !important; -} diff --git a/libreplan-webapp/src/main/webapp/jqplot/examples/syntaxhighlighter/styles/shThemejqPlot.min.css b/libreplan-webapp/src/main/webapp/jqplot/examples/syntaxhighlighter/styles/shThemejqPlot.min.css deleted file mode 100644 index 20210ff72..000000000 --- a/libreplan-webapp/src/main/webapp/jqplot/examples/syntaxhighlighter/styles/shThemejqPlot.min.css +++ /dev/null @@ -1 +0,0 @@ -.syntaxhighlighter{background-color:transparent!important;}.syntaxhighlighter .line.alt1{background-color:transparent!important;}.syntaxhighlighter .line.alt2{background-color:transparent!important;}.syntaxhighlighter .line.highlighted.alt1,.syntaxhighlighter .line.highlighted.alt2{background-color:#e0e0e0!important;}.syntaxhighlighter .line.highlighted.number{color:black!important;}.syntaxhighlighter table caption{color:black!important;}.syntaxhighlighter .gutter{color:#afafaf!important;}.syntaxhighlighter .gutter .line{border-right:3px solid #6ce26c!important;}.syntaxhighlighter .gutter .line.highlighted{background-color:#6ce26c!important;color:white!important;}.syntaxhighlighter.printing .line .content{border:none!important;}.syntaxhighlighter.collapsed{overflow:visible!important;}.syntaxhighlighter.collapsed .toolbar{color:blue!important;background:white!important;border:1px solid #6ce26c!important;}.syntaxhighlighter.collapsed .toolbar a{color:blue!important;}.syntaxhighlighter.collapsed .toolbar a:hover{color:red!important;}.syntaxhighlighter .toolbar{color:white!important;background:#6ce26c!important;border:none!important;}.syntaxhighlighter .toolbar a{color:white!important;}.syntaxhighlighter .toolbar a:hover{color:black!important;}.syntaxhighlighter .plain,.syntaxhighlighter .plain a{color:black!important;}.syntaxhighlighter .comments,.syntaxhighlighter .comments a{color:#008200!important;}.syntaxhighlighter .string,.syntaxhighlighter .string a{color:blue!important;}.syntaxhighlighter .keyword{color:#069!important;}.syntaxhighlighter .preprocessor{color:gray!important;}.syntaxhighlighter .variable{color:#a70!important;}.syntaxhighlighter .value{color:#090!important;}.syntaxhighlighter .functions{color:#ff1493!important;}.syntaxhighlighter .constants{color:#06c!important;}.syntaxhighlighter .script{font-weight:bold!important;color:#069!important;background-color:none!important;}.syntaxhighlighter .color1,.syntaxhighlighter .color1 a{color:gray!important;}.syntaxhighlighter .color2,.syntaxhighlighter .color2 a{color:#ff1493!important;}.syntaxhighlighter .color3,.syntaxhighlighter .color3 a{color:red!important;}.syntaxhighlighter .keyword{font-weight:bold!important;}.syntaxhighlighter a,.syntaxhighlighter div,.syntaxhighlighter code,.syntaxhighlighter table,.syntaxhighlighter table td,.syntaxhighlighter table tr,.syntaxhighlighter table tbody,.syntaxhighlighter table thead,.syntaxhighlighter table caption,.syntaxhighlighter textarea{line-height:1.3em!important;}div.syntaxhighlighter{font-size:.85em!important;}div.include div.syntaxhighlighter table td.code .line{margin-top:.1em!important;} \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/examples/theming.html b/libreplan-webapp/src/main/webapp/jqplot/examples/theming.html deleted file mode 100644 index 6140feb9c..000000000 --- a/libreplan-webapp/src/main/webapp/jqplot/examples/theming.html +++ /dev/null @@ -1,519 +0,0 @@ - - - - - - Chart Theming - - - - - - - - - - - - - -
      - - - - - - - - -

      jqPlot has basic theming support for commonly styled atributes of plot elements. Upon creation, each plot will have a "themeEngine" that controls modificaition, adding, removing and activating of plot themes. In addition, each plot will have a "Default" theme which corresponds to the styling of the plot at plot creation.

      - -

      Creation of new themes is easy. A "style" object is created with properties for the various plot elements to be styles. Attached to each of those is an ojbect with the actual styling properties. A simple style object might look like:

      - -
      -    gabe = {
      -        series: [
      -            {color: 'rgba(216, 159, 60, 0.4)'},
      -            {color: 'rgba(159, 216, 60, 0.4)'},
      -            {color: 'rgba(60, 159, 216, 0.4)'},
      -        ],
      -        grid: {
      -            backgroundColor: '#DEA493'
      -        }
      -    }
      -
      - -

      This new style would then be added to the plot's themeEngine as a new theme. it can then be activated by calling the plot's activateTheme method.

      -
      -    plot1b.themeEngine.newTheme('gabe', gabe);
      -    plot1b.activateTheme('gabe');
      -
      - -
      -

      Select Theme for area plot: - -

      - -

      Themes can be reused between plots. Here a style object is created and assigned to two different plots. For convenience, the theme is given the same name when added to each plot's themeEngine. Since each plot keeps it's own copy of the theme, the names do not need to be the same. Also note that themes are added as deep copies by value and not by reference. This avoids strange behavior due to the cascading nature of css related styles.

      - -
      -    temp = {
      -        seriesStyles: {
      -            seriesColors: ['red', 'orange', 'yellow', 'green', 'blue', 'indigo'],
      -            highlightColors: ['lightpink', 'lightsalmon', 'lightyellow', 'lightgreen', 'lightblue', 'mediumslateblue']
      -        },
      -        legend: {
      -            fontSize: '8pt'
      -        },
      -        title: {
      -            fontSize: '18pt'
      -        },
      -        grid: {
      -            backgroundColor: 'rgb(211, 233, 195)'
      -        }
      -    };
      -    
      -    plot3.themeEngine.newTheme('uma', temp);
      -    plot5.themeEngine.newTheme('uma', temp);
      -
      - -

      Select Theme for funnel and pie charts at same time: - -

      - -
      - -

      Select Theme for funnel plot: - -

      - -
      - -

      Select Theme for pie chart: - -

      - -

      There are various was to create and edit themes for a plot. Below are two different methods for creating additional themes for a line plot and adding them to the plots themeEngine. Here the axesStyles property is used to supply styling to all axes at one time. A similar property, seriesStyles, exists for styling all series of a plot at one time. Note, neither of these methods is as straightforward as using the newTheme() method of the plots themeEngine, but are included for illustrative purposes.

      - -
       
      -    e1 = plot1.themeEngine;
      -    brass = e1.copy('Default', 'brass');
      -    brass.title.fontFamily = 'Copperplate, Impact';
      -    brass.grid.backgroundColor = "rgb(216, 198, 114)";
      -    brass.grid.drawGridlines = false;
      -    brass.series[0].lineWidth = 6.5;
      -    brass.series[0].markerOptions.show = false;
      -    brass.axesStyles.label.fontFamily = "Copperplate, 'Copperplate Gothic Light', Impact";
      -    brass.axesStyles.ticks.fontFamily = "Copperplate, 'Copperplate Gothic Light', Impact";
      -    brass.axesStyles.label.fontSize = '14pt';
      -    
      -    temp = {
      -        grid: {
      -            backgroundColor: "#593D2B",
      -            gridLineColor: '#E8E8E8',
      -            gridLineWidth: 3
      -        },
      -        title: {
      -            fontFamily: '"Comic Sans MS", cursive',
      -            fontSize: '18pt',
      -            textColor: '#C7CC4E'
      -        },
      -        seriesStyles: {
      -            color: "#DBBCAF",
      -            lineWidth: 8,
      -            markerOptions: {
      -                show: false
      -            }
      -        },
      -        axes: {
      -            xaxis: {
      -                label: {
      -                    fontFamily: '"Comic Sans MS", cursive',
      -                    textColor: '#C7CC4E'
      -                }
      -            }
      -        }
      -    };
      -    
      -    chocolate = plot1.themeEngine.copy('Default', 'chocolate', temp);
      -
      - -
      - -

      Select theme for line chart: - -

      - -

      The example below shows more extensive use of the various styling options to give the chart a rather ugly and dated appearence. Note that, for bar (and funnel, pie and donut charts), highlightColors can be specified as an array of colors which will be applied to each bar individually, as a single string giving a color to apply to all bars, or as an empty array which will force jqPlot to auto calculate highlight colors based on the current bar color.

      - -

      -    oldstyle = {
      -        title: {
      -            fontFamily: 'Times New Roman',
      -            textColor: 'black'
      -        },
      -        axesStyles: {
      -           borderWidth: 0,
      -           ticks: {
      -               fontSize: '12pt',
      -               fontFamily: 'Times New Roman',
      -               textColor: 'black'
      -           },
      -           label: {
      -               fontFamily: 'Times New Roman',
      -               textColor: 'black'
      -           }
      -        },
      -        grid: {
      -            backgroundColor: 'white',
      -            borderWidth: 0,
      -            gridLineColor: 'black',
      -            gridLineWidth: 2,
      -            borderColor: 'black'
      -        },
      -        series: [
      -            {color: 'red', highlightColors: ['aqua', 'black', 'blue', 'fuchsia', 'gray', 'green', 'lime', 'maroon', 'navy', 'olive', 'purple', 'red', 'silver', 'teal', 'white', 'yellow']},
      -            {color: 'green', highlightColors: []},
      -            {color: 'blue', highlightColors: []},
      -            {color: 'yellow', highlightColors: 'rgb(255, 245, 185)'}
      -        ],
      -        legend: {
      -            background: 'white',
      -            textColor: 'black',
      -            fontFamily: 'Times New Roman',
      -            border: '1px solid black'
      -        }
      -    };
      -    
      -    plot2.themeEngine.newTheme('oldstyle', oldstyle);
      -
      - -
      - -

      Select theme for bar chart: - -

      - - -
      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      - - - - - - \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/examples/topbanner.inc b/libreplan-webapp/src/main/webapp/jqplot/examples/topbanner.inc deleted file mode 100644 index 6977d1f99..000000000 --- a/libreplan-webapp/src/main/webapp/jqplot/examples/topbanner.inc +++ /dev/null @@ -1,9 +0,0 @@ - \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/examples/waterfall.html b/libreplan-webapp/src/main/webapp/jqplot/examples/waterfall.html deleted file mode 100644 index 2dfb07c0e..000000000 --- a/libreplan-webapp/src/main/webapp/jqplot/examples/waterfall.html +++ /dev/null @@ -1,162 +0,0 @@ - - - - - - Waterfall Charts - - - - - - - - - - - - - -
      - - - - - - - - -

      Waterfall chart using default bar colors.

      -
      - -

      Waterfall chart using custom colors and "useNegativeColors" set to "false".

      -
      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      - - - - - - \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/examples/waterfall2.html b/libreplan-webapp/src/main/webapp/jqplot/examples/waterfall2.html deleted file mode 100644 index ef3db3036..000000000 --- a/libreplan-webapp/src/main/webapp/jqplot/examples/waterfall2.html +++ /dev/null @@ -1,231 +0,0 @@ - - - - - - Waterfall charts 2 - - - - - - - - - - - - - -
      - - - - - - - - - -
      - -
      - -
      - -
      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      - - - - - - \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/examples/yahooData.js b/libreplan-webapp/src/main/webapp/jqplot/examples/yahooData.js deleted file mode 100644 index 66dcb7490..000000000 --- a/libreplan-webapp/src/main/webapp/jqplot/examples/yahooData.js +++ /dev/null @@ -1,1807 +0,0 @@ -var yahoo=[["2011-10-18",580.19,592.56,577.40,590.51,3800800,590.51], -["2011-10-17",583.72,591.83,578.00,582.41,4008200,582.41], -["2011-10-14",599.47,599.60,587.57,591.68,8529900,591.68], -["2011-10-13",550.03,559.00,548.02,558.99,5639600,558.99], -["2011-10-12",548.13,555.23,544.63,548.50,3177800,548.50], -["2011-10-11",533.46,546.80,533.46,543.18,2853400,543.18], -["2011-10-10",525.18,537.47,523.20,537.17,2322200,537.17], -["2011-10-07",516.83,520.50,510.30,515.12,2855900,515.12], -["2011-10-06",507.50,515.23,502.60,514.71,3424300,514.71], -["2011-10-05",496.35,507.80,480.77,504.70,4534100,504.70], -["2011-10-04",490.03,503.44,480.60,501.90,4158800,501.90], -["2011-10-03",509.85,512.00,495.00,495.52,4474400,495.52], -["2011-09-30",520.21,524.00,514.38,515.04,2723600,515.04], -["2011-09-29",536.04,537.30,519.41,527.50,2906600,527.50], -["2011-09-28",541.50,544.02,527.70,528.84,2263300,528.84], -["2011-09-27",538.20,547.05,536.05,539.34,3010900,539.34], -["2011-09-26",527.25,532.93,513.25,531.89,2634200,531.89], -["2011-09-23",516.56,526.42,514.50,525.51,2777300,525.51], -["2011-09-22",526.25,528.78,514.00,520.66,4400300,520.66], -["2011-09-21",547.69,555.00,538.86,539.20,2514300,539.20], -["2011-09-20",549.40,558.52,542.67,546.63,2779100,546.63], -["2011-09-19",540.35,549.90,535.38,546.67,2468400,546.67], -["2011-09-16",544.80,546.84,543.14,546.68,3534300,546.68], -["2011-09-15",535.50,544.98,534.56,542.56,2960800,542.56], -["2011-09-14",532.59,536.95,525.82,532.07,2694400,532.07], -["2011-09-13",532.00,533.88,523.40,529.52,2354200,529.52], -["2011-09-12",517.96,531.99,517.50,530.12,2670400,530.12], -["2011-09-09",531.40,534.65,521.19,524.85,3268800,524.85], -["2011-09-08",533.80,539.10,531.90,534.96,2380500,534.96], -["2011-09-07",530.45,535.94,527.40,534.03,2755800,534.03], -["2011-09-06",510.80,522.76,510.50,522.18,2715800,522.18], -["2011-09-02",524.47,527.92,520.73,524.84,2401200,524.84], -["2011-09-01",540.75,543.83,531.22,532.50,2415500,532.50], -["2011-08-31",544.74,546.30,536.00,540.96,2693300,540.96], -["2011-08-30",538.19,542.99,530.81,540.70,2989000,540.70], -["2011-08-29",534.56,539.45,533.56,539.08,2335800,539.08], -["2011-08-26",519.99,530.45,513.14,526.86,3596300,526.86], -["2011-08-25",530.38,537.27,518.30,520.04,3293000,520.04], -["2011-08-24",519.33,530.00,517.23,523.29,3594500,523.29], -["2011-08-23",503.50,521.41,499.06,518.82,4346800,518.82], -["2011-08-22",504.00,507.00,494.53,498.17,4905900,498.17], -["2011-08-19",499.34,514.87,490.86,490.92,5410000,490.92], -["2011-08-18",523.47,524.89,500.49,504.88,6290700,504.88], -["2011-08-17",540.03,543.69,530.77,533.15,4055000,533.15], -["2011-08-16",552.43,552.44,530.30,539.00,6939400,539.00], -["2011-08-15",553.43,564.99,546.05,557.23,7144900,557.23], -["2011-08-12",569.50,570.50,560.40,563.77,3154300,563.77], -["2011-08-11",553.82,568.50,548.41,562.13,4830600,562.13], -["2011-08-10",561.38,564.12,547.73,549.01,5369600,549.01], -["2011-08-09",561.00,574.61,541.01,573.41,6469700,573.41], -["2011-08-08",562.98,569.00,544.35,546.02,7496600,546.02], -["2011-08-05",582.54,590.00,562.00,579.04,5929100,579.04], -["2011-08-04",594.50,598.85,577.47,577.52,4914600,577.52], -["2011-08-03",594.27,603.00,583.63,601.17,3825700,601.17], -["2011-08-02",606.00,609.67,591.57,592.40,3200600,592.40], -["2011-08-01",611.22,615.50,599.18,606.77,3966100,606.77], -["2011-07-29",604.23,614.96,603.69,603.69,4137400,603.69], -["2011-07-28",605.19,615.98,603.00,610.94,3108400,610.94], -["2011-07-27",617.18,620.95,604.75,607.22,3934400,607.22], -["2011-07-26",618.05,627.50,617.22,622.52,2342900,622.52], -["2011-07-25",613.36,625.41,613.00,618.98,3131600,618.98], -["2011-07-22",605.39,619.50,604.27,618.23,3528200,618.23], -["2011-07-21",594.03,608.06,594.01,606.99,3469500,606.99], -["2011-07-20",602.18,602.83,595.35,595.35,2227800,595.35], -["2011-07-19",596.14,604.68,595.53,602.55,2967500,602.55], -["2011-07-18",592.49,602.05,592.00,594.94,4468300,594.94], -["2011-07-15",597.50,600.25,588.16,597.62,13732100,597.62], -["2011-07-14",539.12,542.00,526.73,528.94,6594400,528.94], -["2011-07-13",537.00,544.00,536.48,538.26,2790200,538.26], -["2011-07-12",528.16,539.42,526.00,534.01,2841200,534.01], -["2011-07-11",528.18,535.98,525.50,527.28,2839300,527.28], -["2011-07-08",532.95,537.65,527.27,531.99,4770200,531.99], -["2011-07-07",541.00,550.68,535.88,546.60,3935500,546.60], -["2011-07-06",533.50,538.51,533.04,535.36,2695600,535.36], -["2011-07-05",525.30,535.40,525.30,532.44,3849200,532.44], -["2011-07-01",506.74,521.18,506.38,521.03,3636700,521.03], -["2011-06-30",501.99,506.67,501.50,506.38,2428400,506.38], -["2011-06-29",496.54,500.25,492.38,497.57,2343000,497.57], -["2011-06-28",484.02,496.21,484.02,493.65,2715100,493.65], -["2011-06-27",474.00,488.40,473.60,482.80,3444700,482.80], -["2011-06-24",480.68,480.75,473.02,474.88,3805600,474.88], -["2011-06-23",482.13,482.86,473.73,480.22,4801700,480.22], -["2011-06-22",491.45,492.35,486.73,487.01,2407100,487.01], -["2011-06-21",487.19,493.94,484.73,493.00,2765400,493.00], -["2011-06-20",485.00,486.23,479.23,484.58,3028600,484.58], -["2011-06-17",506.18,506.69,484.80,485.02,5245400,485.02], -["2011-06-16",502.81,506.57,496.67,500.37,2757000,500.37], -["2011-06-15",505.03,508.35,500.61,502.95,2073300,502.95], -["2011-06-14",508.15,514.08,506.99,508.37,2341500,508.37], -["2011-06-13",510.00,510.20,502.17,504.73,2427300,504.73], -["2011-06-10",514.08,516.69,509.29,509.51,2439900,509.51], -["2011-06-09",520.00,520.00,515.64,516.73,1689100,516.73], -["2011-06-08",516.53,521.24,515.78,519.17,1653400,519.17], -["2011-06-07",522.89,524.63,518.99,519.03,1907600,519.03], -["2011-06-06",523.54,526.82,519.25,521.06,1942100,521.06], -["2011-06-03",522.00,527.60,521.50,523.08,1748500,523.08], -["2011-06-02",527.57,530.30,522.48,528.06,2204500,528.06], -["2011-06-01",528.04,533.20,525.31,525.60,2955900,525.60], -["2011-05-31",525.00,529.05,523.50,529.02,2687300,529.02], -["2011-05-27",518.48,521.79,516.30,520.90,1745800,520.90], -["2011-05-26",517.70,522.12,515.00,518.13,2118500,518.13], -["2011-05-25",517.33,522.77,517.25,519.67,1301600,519.67], -["2011-05-24",520.37,523.96,518.15,518.26,1888400,518.26], -["2011-05-23",516.60,520.00,513.40,518.39,2252700,518.39], -["2011-05-20",531.80,531.99,523.13,524.03,2317500,524.03], -["2011-05-19",532.73,536.54,529.72,531.25,2468700,531.25], -["2011-05-18",529.54,530.33,525.70,529.81,1953200,529.81], -["2011-05-17",515.43,531.22,515.03,530.46,3303600,530.46], -["2011-05-16",526.31,527.27,516.40,518.42,2958200,518.42], -["2011-05-13",534.61,535.92,529.05,529.55,2108700,529.55], -["2011-05-12",535.24,536.94,530.91,535.05,1400000,535.05], -["2011-05-11",540.14,543.55,533.69,535.45,2338800,535.45], -["2011-05-10",540.00,544.43,537.54,542.66,2042900,542.66], -["2011-05-09",535.00,538.49,531.10,537.68,1948700,537.68], -["2011-05-06",538.15,541.46,535.18,535.30,2056100,535.30], -["2011-05-05",533.86,539.42,531.50,534.27,1997800,534.27], -["2011-05-04",535.17,539.00,533.02,535.79,2117000,535.79], -["2011-05-03",537.13,542.01,529.63,533.89,2081500,533.89], -["2011-05-02",545.70,545.73,537.12,538.56,2133700,538.56], -["2011-04-29",540.00,544.10,538.51,544.10,4200000,544.10], -["2011-04-28",538.06,539.25,534.08,537.97,2037400,537.97], -["2011-04-27",538.00,538.11,534.35,537.76,2298400,537.76], -["2011-04-26",526.52,537.44,525.21,532.82,3535400,532.82], -["2011-04-25",525.25,527.00,522.01,525.05,1630800,525.05], -["2011-04-21",527.49,528.28,522.39,525.10,2470100,525.10], -["2011-04-20",525.90,526.82,521.39,525.73,3060000,525.73], -["2011-04-19",529.95,530.88,520.90,521.53,2684100,521.53], -["2011-04-18",526.42,527.66,519.00,526.84,5039800,526.84], -["2011-04-15",545.29,545.75,530.06,530.70,14043700,530.70], -["2011-04-14",575.19,579.45,572.10,578.51,5456300,578.51], -["2011-04-13",575.51,577.60,571.75,576.28,2069400,576.28], -["2011-04-12",575.00,576.91,568.05,570.61,2085600,570.61], -["2011-04-11",576.20,578.10,573.00,577.37,1858200,577.37], -["2011-04-08",584.89,584.89,578.06,578.16,1901800,578.16], -["2011-04-07",575.73,580.64,574.19,580.00,2531500,580.00], -["2011-04-06",572.18,575.16,568.00,574.18,2668300,574.18], -["2011-04-05",581.08,581.49,565.68,569.09,6047500,569.09], -["2011-04-04",593.00,594.74,583.10,587.68,2054500,587.68], -["2011-04-01",588.76,595.19,588.76,591.80,2613200,591.80], -["2011-03-31",583.00,588.16,581.74,586.76,2029400,586.76], -["2011-03-30",584.38,585.50,580.58,581.84,1422300,581.84], -["2011-03-29",576.00,581.89,573.01,581.73,1604800,581.73], -["2011-03-28",582.07,584.99,574.71,575.36,2218400,575.36], -["2011-03-25",586.88,586.91,579.24,579.74,2858400,579.74], -["2011-03-24",585.43,588.39,578.80,586.89,2098700,586.89], -["2011-03-23",575.19,582.45,572.00,582.16,1816200,582.16], -["2011-03-22",577.27,579.23,572.51,577.32,1886900,577.32], -["2011-03-21",570.22,579.80,569.02,576.50,3020900,576.50], -["2011-03-18",564.64,567.99,559.74,561.06,3298600,561.06], -["2011-03-17",564.48,569.00,560.54,561.36,2899300,561.36], -["2011-03-16",568.01,569.79,551.28,557.10,3798500,557.10], -["2011-03-15",557.50,571.00,555.50,569.56,4005600,569.56], -["2011-03-14",572.80,578.29,568.02,569.99,2816100,569.99], -["2011-03-11",578.22,580.00,573.33,576.71,3032000,576.71], -["2011-03-10",585.44,586.62,579.45,580.30,3128100,580.30], -["2011-03-09",591.00,594.51,585.75,591.77,2151000,591.77], -["2011-03-08",592.93,597.98,590.20,592.31,2284900,592.31], -["2011-03-07",600.55,603.69,587.00,591.66,3462700,591.66], -["2011-03-04",608.33,608.98,600.20,600.62,3011000,600.62], -["2011-03-03",606.38,611.49,605.00,609.56,1945300,609.56], -["2011-03-02",599.80,606.00,595.19,600.79,2026700,600.79], -["2011-03-01",617.78,619.22,599.30,600.76,3323200,600.76], -["2011-02-28",610.00,616.49,608.01,613.40,2281500,613.40], -["2011-02-25",611.86,614.72,609.50,610.04,1932400,610.04], -["2011-02-24",611.39,613.09,601.35,608.82,2711700,608.82], -["2011-02-23",610.33,614.70,604.00,611.32,2889600,611.32], -["2011-02-22",620.03,624.93,607.77,610.21,3639900,610.21], -["2011-02-18",626.00,631.18,624.18,630.08,3217900,630.08], -["2011-02-17",621.25,627.25,620.28,625.26,1478800,625.26], -["2011-02-16",625.63,626.50,622.10,624.22,1684000,624.22], -["2011-02-15",627.32,630.09,623.10,624.15,2092000,624.15], -["2011-02-14",623.34,629.64,620.04,628.15,2128000,628.15], -["2011-02-11",613.79,625.00,613.00,624.50,2589900,624.50], -["2011-02-10",613.90,617.50,611.56,616.44,2334400,616.44], -["2011-02-09",616.87,619.45,612.34,616.50,1842500,616.50], -["2011-02-08",614.93,619.63,614.51,618.38,1694900,618.38], -["2011-02-07",610.16,618.39,609.21,614.29,1799600,614.29], -["2011-02-04",610.15,611.44,606.61,610.98,1550800,610.98], -["2011-02-03",609.48,611.45,606.13,610.15,1495100,610.15], -["2011-02-02",611.00,614.34,607.53,612.00,1760700,612.00], -["2011-02-01",604.49,613.35,603.11,611.04,2745300,611.04], -["2011-01-31",603.60,604.47,595.55,600.36,2804900,600.36], -["2011-01-28",619.07,620.36,599.76,600.99,4231100,600.99], -["2011-01-27",617.89,619.70,613.25,616.79,2019200,616.79], -["2011-01-26",620.33,622.49,615.28,616.50,2038100,616.50], -["2011-01-25",608.20,620.69,606.52,619.91,3646800,619.91], -["2011-01-24",607.57,612.49,601.23,611.08,4599200,611.08], -["2011-01-21",639.58,641.73,611.36,611.83,8904400,611.83], -["2011-01-20",632.21,634.08,623.29,626.77,5485800,626.77], -["2011-01-19",642.12,642.96,629.66,631.75,3406100,631.75], -["2011-01-18",626.06,641.99,625.27,639.63,3617000,639.63], -["2011-01-14",617.40,624.27,617.08,624.18,2365600,624.18], -["2011-01-13",616.97,619.67,614.16,616.69,1334000,616.69], -["2011-01-12",619.35,619.35,614.77,616.87,1632700,616.87], -["2011-01-11",617.71,618.80,614.50,616.01,1439300,616.01], -["2011-01-10",614.80,615.39,608.56,614.21,1579200,614.21], -["2011-01-07",615.91,618.25,610.13,616.44,2101200,616.44], -["2011-01-06",610.68,618.43,610.05,613.50,2057800,613.50], -["2011-01-05",600.07,610.33,600.05,609.07,2532300,609.07], -["2011-01-04",605.62,606.18,600.12,602.12,1824500,602.12], -["2011-01-03",596.48,605.59,596.48,604.35,2365200,604.35], -["2010-12-31",596.74,598.42,592.03,593.97,1539300,593.97], -["2010-12-30",598.00,601.33,597.39,598.86,989500,598.86], -["2010-12-29",602.00,602.41,598.92,601.00,1019200,601.00], -["2010-12-28",602.05,603.87,598.01,598.92,1064800,598.92], -["2010-12-27",602.74,603.78,599.50,602.38,1208100,602.38], -["2010-12-23",605.34,606.00,602.03,604.23,1110800,604.23], -["2010-12-22",604.00,607.00,603.28,605.49,1207500,605.49], -["2010-12-21",598.57,604.72,597.61,603.07,1879500,603.07], -["2010-12-20",594.65,597.88,588.66,595.06,1973300,595.06], -["2010-12-17",591.00,592.56,587.67,590.80,3087100,590.80], -["2010-12-16",592.85,593.77,588.07,591.71,1596900,591.71], -["2010-12-15",594.20,596.45,589.15,590.30,2167700,590.30], -["2010-12-14",597.09,598.29,592.48,594.91,1643300,594.91], -["2010-12-13",597.12,603.00,594.09,594.62,2398500,594.62], -["2010-12-10",593.14,593.99,590.29,592.21,1704700,592.21], -["2010-12-09",593.88,595.58,589.00,591.50,1868900,591.50], -["2010-12-08",591.97,592.52,583.69,590.54,1756900,590.54], -["2010-12-07",591.27,593.00,586.00,587.14,3042200,587.14], -["2010-12-06",580.57,582.00,576.61,578.36,2093800,578.36], -["2010-12-03",569.45,576.48,568.00,573.00,2631200,573.00], -["2010-12-02",568.66,573.33,565.35,571.82,2547900,571.82], -["2010-12-01",563.00,571.57,562.40,564.35,3754100,564.35], -["2010-11-30",574.32,574.32,553.31,555.71,7117400,555.71], -["2010-11-29",589.17,589.80,579.95,582.11,2859700,582.11], -["2010-11-26",590.46,592.98,587.00,590.00,1311100,590.00], -["2010-11-24",587.31,596.60,587.05,594.97,2396400,594.97], -["2010-11-23",587.01,589.01,578.20,583.01,2162600,583.01], -["2010-11-22",587.47,593.44,582.75,591.22,2186600,591.22], -["2010-11-19",597.00,597.89,590.34,590.83,2297500,590.83], -["2010-11-18",589.00,599.98,588.56,596.56,2590000,596.56], -["2010-11-17",585.00,589.50,581.37,583.55,2442500,583.55], -["2010-11-16",592.76,597.89,583.45,583.72,3307400,583.72], -["2010-11-15",603.08,604.00,594.05,595.47,3478900,595.47], -["2010-11-12",613.99,616.90,601.21,603.29,3393000,603.29], -["2010-11-11",619.70,619.85,614.21,617.19,2261600,617.19], -["2010-11-10",622.08,623.00,617.51,622.88,2497000,622.88], -["2010-11-09",630.00,630.85,620.51,624.82,2237200,624.82], -["2010-11-08",624.02,629.49,623.13,626.77,2101300,626.77], -["2010-11-05",623.18,625.49,621.11,625.08,1765700,625.08], -["2010-11-04",624.64,629.92,622.10,624.27,3570800,624.27], -["2010-11-03",617.50,621.83,613.50,620.18,3380500,620.18], -["2010-11-02",618.67,620.00,614.58,615.60,1997600,615.60], -["2010-11-01",615.73,620.66,611.21,615.00,3087100,615.00], -["2010-10-29",617.07,619.00,612.99,613.70,2278300,613.70], -["2010-10-28",620.05,621.00,613.30,618.58,2184300,618.58], -["2010-10-27",615.77,620.00,612.33,616.47,2241900,616.47], -["2010-10-26",613.10,621.23,611.03,618.60,2512900,618.60], -["2010-10-25",615.59,624.74,614.97,616.50,3158400,616.50], -["2010-10-22",611.92,614.82,610.05,612.53,2256100,612.53], -["2010-10-21",611.51,616.00,606.00,611.99,2920500,611.99], -["2010-10-20",608.14,617.38,607.50,607.98,3525100,607.98], -["2010-10-19",608.85,614.82,602.86,607.83,4587900,607.83], -["2010-10-18",600.55,619.69,600.55,617.71,7098200,617.71], -["2010-10-15",599.27,601.64,591.60,601.45,14824800,601.45], -["2010-10-14",544.18,545.25,537.11,540.93,6634100,540.93], -["2010-10-13",547.00,547.49,542.33,543.30,3055600,543.30], -["2010-10-12",540.12,545.99,537.79,541.39,3753600,541.39], -["2010-10-11",538.48,544.60,537.17,538.84,2626300,538.84], -["2010-10-08",532.77,537.60,527.62,536.35,2859200,536.35], -["2010-10-07",536.21,537.20,529.14,530.01,2395800,530.01], -["2010-10-06",539.26,539.95,529.94,534.35,2762300,534.35], -["2010-10-05",528.38,540.00,526.55,538.23,3507100,538.23], -["2010-10-04",524.95,528.25,518.85,522.35,1940500,522.35], -["2010-10-01",530.00,530.62,523.00,525.62,2225000,525.62], -["2010-09-30",529.16,531.87,518.92,525.79,3244100,525.79], -["2010-09-29",527.85,532.94,524.71,527.69,2172200,527.69], -["2010-09-28",533.48,533.59,518.45,527.17,3654700,527.17], -["2010-09-27",528.85,536.85,528.85,530.41,3107400,530.41], -["2010-09-24",521.74,527.83,518.26,527.29,3356900,527.29], -["2010-09-23",514.61,519.69,511.30,513.48,2317400,513.48], -["2010-09-22",512.86,517.78,511.68,516.00,2537100,516.00], -["2010-09-21",509.68,519.98,508.91,513.46,4466300,513.46], -["2010-09-20",492.50,510.41,492.06,508.28,4403500,508.28], -["2010-09-17",483.75,491.20,481.18,490.15,5641600,490.15], -["2010-09-16",479.95,482.45,479.41,481.06,1969500,481.06], -["2010-09-15",479.95,481.89,478.50,480.64,2402800,480.64], -["2010-09-14",482.01,484.75,480.08,480.43,2216500,480.43], -["2010-09-13",480.90,484.35,479.53,482.27,2241500,482.27], -["2010-09-10",479.02,479.79,475.08,476.14,1974300,476.14], -["2010-09-09",477.83,480.40,470.58,476.18,2430600,476.18], -["2010-09-08",465.19,472.50,464.51,470.58,2401800,470.58], -["2010-09-07",464.50,467.59,463.02,464.40,1709900,464.40], -["2010-09-03",470.52,471.88,467.44,470.30,2540400,470.30], -["2010-09-02",462.84,464.43,460.31,463.18,1684200,463.18], -["2010-09-01",454.98,464.94,452.50,460.33,3228300,460.33], -["2010-08-31",450.11,454.87,448.00,450.02,1946800,450.02], -["2010-08-30",459.15,459.76,452.42,452.69,1231400,452.69], -["2010-08-27",452.56,459.99,447.65,458.83,2312400,458.83], -["2010-08-26",456.06,457.26,450.44,450.98,1777000,450.98], -["2010-08-25",450.00,457.81,450.00,454.62,2592100,454.62], -["2010-08-24",457.70,458.37,450.92,451.39,2762700,451.39], -["2010-08-23",461.50,468.25,457.73,464.07,2986200,464.07], -["2010-08-20",467.97,471.59,461.02,462.02,3917600,462.02], -["2010-08-19",481.01,482.51,467.25,467.97,3925000,467.97], -["2010-08-18",490.44,490.87,481.55,482.15,2686400,482.15], -["2010-08-17",488.53,494.70,486.03,490.52,1890700,490.52], -["2010-08-16",483.68,489.87,480.50,485.59,1305000,485.59], -["2010-08-13",489.00,491.19,486.01,486.35,1934700,486.35], -["2010-08-12",483.94,494.75,482.51,492.01,2204600,492.01], -["2010-08-11",497.73,498.00,491.50,491.74,2223000,491.74], -["2010-08-10",502.35,506.00,498.57,503.71,2074000,503.71], -["2010-08-09",502.25,505.50,501.36,505.35,1872200,505.35], -["2010-08-06",505.40,505.74,496.05,500.22,3319500,500.22], -["2010-08-05",505.89,508.60,503.56,508.10,2420400,508.10], -["2010-08-04",492.18,507.00,491.05,506.32,3812500,506.32], -["2010-08-03",490.50,492.46,486.76,489.83,1802300,489.83], -["2010-08-02",488.99,493.28,486.94,490.41,1858700,490.41], -["2010-07-30",479.65,487.36,479.14,484.85,2144100,484.85], -["2010-07-29",485.95,488.88,479.33,484.99,2675500,484.99], -["2010-07-28",494.94,495.25,482.67,484.35,2496000,484.35], -["2010-07-27",490.58,497.50,490.17,492.63,2451200,492.63], -["2010-07-26",489.09,490.75,484.88,488.97,1995200,488.97], -["2010-07-23",480.77,490.59,480.01,490.06,2264400,490.06], -["2010-07-22",483.23,488.98,482.48,484.81,2147700,484.81], -["2010-07-21",484.00,485.70,475.43,477.50,3279600,477.50], -["2010-07-20",461.03,482.99,460.60,481.59,4054500,481.59], -["2010-07-19",461.01,469.65,457.52,466.18,4550300,466.18], -["2010-07-16",469.12,470.56,459.52,459.61,7824800,459.61], -["2010-07-15",491.73,494.70,482.68,494.02,4858200,494.02], -["2010-07-14",489.88,493.83,486.46,491.34,3118000,491.34], -["2010-07-13",482.25,492.99,480.28,489.20,3976300,489.20], -["2010-07-12",472.37,479.44,471.08,475.83,3334400,475.83], -["2010-07-09",471.96,473.26,462.78,467.49,4331500,467.49], -["2010-07-08",453.55,457.33,449.66,456.56,2668900,456.56], -["2010-07-07",438.31,451.29,435.38,450.20,3129700,450.20], -["2010-07-06",444.00,447.67,433.63,436.07,2560100,436.07], -["2010-07-02",441.62,442.28,436.00,436.55,1936000,436.55], -["2010-07-01",445.29,448.40,433.63,439.49,3513600,439.49], -["2010-06-30",454.96,457.83,444.72,444.95,3603200,444.95], -["2010-06-29",463.44,464.55,451.12,454.26,3502100,454.26], -["2010-06-28",472.59,477.55,469.01,472.08,1762300,472.08], -["2010-06-25",477.06,477.65,470.56,472.68,2245200,472.68], -["2010-06-24",479.66,482.75,473.26,475.10,1893600,475.10], -["2010-06-23",486.89,486.89,478.16,482.05,2029100,482.05], -["2010-06-22",489.90,496.60,485.73,486.25,2219700,486.25], -["2010-06-21",499.90,500.97,484.89,488.56,2983500,488.56], -["2010-06-18",502.51,503.47,498.13,500.03,2872900,500.03], -["2010-06-17",503.45,505.87,496.69,500.08,1977300,500.08], -["2010-06-16",496.17,504.00,496.11,501.27,2289300,501.27], -["2010-06-15",483.08,500.40,482.18,497.99,4259600,497.99], -["2010-06-14",494.48,494.50,483.19,483.19,2040400,483.19], -["2010-06-11",482.50,488.71,481.62,488.50,1781700,488.50], -["2010-06-10",480.37,488.50,475.84,487.01,2577900,487.01], -["2010-06-09",487.22,488.88,472.00,474.02,2729000,474.02], -["2010-06-08",487.85,488.84,477.54,484.78,2685100,484.78], -["2010-06-07",499.06,500.91,483.15,485.52,3632700,485.52], -["2010-06-04",499.72,509.25,496.70,498.72,3920300,498.72], -["2010-06-03",495.11,508.00,494.70,505.60,3650700,505.60], -["2010-06-02",486.68,493.87,481.46,493.37,2540800,493.37], -["2010-06-01",480.43,491.06,480.12,482.37,2666800,482.37], -["2010-05-28",492.74,493.45,483.00,485.63,2894800,485.63], -["2010-05-27",484.95,492.31,481.05,490.46,2809100,490.46], -["2010-05-26",482.07,489.76,475.00,475.47,3475600,475.47], -["2010-05-25",468.15,477.45,464.01,477.07,3017400,477.07], -["2010-05-24",480.73,489.79,476.80,477.16,4345600,477.16], -["2010-05-21",469.06,485.00,464.40,472.05,9690800,472.05], -["2010-05-20",485.07,485.58,473.80,475.01,4913300,475.01], -["2010-05-19",496.26,499.44,487.74,494.43,3445700,494.43], -["2010-05-18",510.00,510.97,497.07,498.37,2825500,498.37], -["2010-05-17",506.78,508.36,498.35,507.97,2793800,507.97], -["2010-05-14",509.77,510.99,496.25,507.53,4116000,507.53], -["2010-05-13",516.50,522.00,510.37,510.88,3325800,510.88], -["2010-05-12",512.04,512.04,502.00,505.39,3851800,505.39], -["2010-05-11",515.67,519.88,508.22,509.05,3322600,509.05], -["2010-05-10",513.97,522.82,512.60,521.65,4128000,521.65], -["2010-05-07",499.97,505.32,481.33,493.14,5089000,493.14], -["2010-05-06",508.75,517.52,460.00,498.67,5000100,498.67], -["2010-05-05",500.98,515.72,500.47,509.76,4582200,509.76], -["2010-05-04",526.52,526.74,504.21,506.37,6076300,506.37], -["2010-05-03",526.50,532.92,525.08,530.60,1857800,530.60], -["2010-04-30",531.13,537.68,525.44,525.70,2435400,525.70], -["2010-04-29",533.37,536.50,526.67,532.00,3058900,532.00], -["2010-04-28",532.10,534.83,521.03,529.19,3406100,529.19], -["2010-04-27",528.95,538.33,527.23,529.06,3844700,529.06], -["2010-04-26",544.97,544.99,529.21,531.64,4368800,531.64], -["2010-04-23",547.25,549.32,542.27,544.99,2089400,544.99], -["2010-04-22",552.00,552.50,543.35,547.06,3280700,547.06], -["2010-04-21",556.46,560.25,552.16,554.30,2391500,554.30], -["2010-04-20",554.17,559.66,551.06,555.04,2977400,555.04], -["2010-04-19",548.75,553.99,545.00,550.10,3894000,550.10], -["2010-04-16",563.00,568.81,549.63,550.15,12235500,550.15], -["2010-04-15",592.17,597.84,588.29,595.30,6761800,595.30], -["2010-04-14",590.06,592.34,584.01,589.00,3402700,589.00], -["2010-04-13",572.53,588.88,571.13,586.77,3912300,586.77], -["2010-04-12",567.35,574.00,566.22,572.73,2352400,572.73], -["2010-04-09",567.49,568.77,564.00,566.22,2056600,566.22], -["2010-04-08",563.32,569.85,560.05,567.49,1947500,567.49], -["2010-04-07",567.30,568.75,561.86,563.54,2581000,563.54], -["2010-04-06",569.46,570.89,565.40,568.22,2060100,568.22], -["2010-04-05",570.90,574.88,569.00,571.01,1901500,571.01], -["2010-04-01",571.35,573.45,565.55,568.80,2102700,568.80], -["2010-03-31",565.05,569.74,562.81,567.12,3030800,567.12], -["2010-03-30",562.83,567.63,560.28,566.71,1977900,566.71], -["2010-03-29",563.00,564.72,560.57,562.45,3104500,562.45], -["2010-03-26",565.27,567.39,560.02,562.69,2696200,562.69], -["2010-03-25",559.02,572.00,558.66,562.88,3930900,562.88], -["2010-03-24",545.51,559.85,539.70,557.33,6565200,557.33], -["2010-03-23",557.04,558.31,542.00,549.00,5501300,549.00], -["2010-03-22",556.11,566.85,554.28,557.50,4004800,557.50], -["2010-03-19",566.23,568.00,557.28,560.00,4792400,560.00], -["2010-03-18",564.72,568.44,562.96,566.40,1777200,566.40], -["2010-03-17",568.30,571.45,564.25,565.56,3321600,565.56], -["2010-03-16",561.83,568.42,560.76,565.20,3431500,565.20], -["2010-03-15",566.68,569.45,556.00,563.18,4653900,563.18], -["2010-03-12",588.14,588.28,579.16,579.54,2753400,579.54], -["2010-03-11",574.26,586.21,574.20,581.14,4233300,581.14], -["2010-03-10",563.76,578.50,562.21,576.45,5654900,576.45], -["2010-03-09",559.85,564.66,556.50,560.19,3176600,560.19], -["2010-03-08",564.78,565.18,561.01,562.48,2386400,562.48], -["2010-03-05",561.35,567.67,559.90,564.21,3912200,564.21], -["2010-03-04",546.50,556.13,546.20,554.59,3183800,554.59], -["2010-03-03",542.36,548.12,539.25,545.32,3089400,545.32], -["2010-03-02",535.48,545.66,535.01,541.06,4356800,541.06], -["2010-03-01",529.20,533.29,527.74,532.69,2237900,532.69], -["2010-02-26",527.42,531.75,523.48,526.80,2049300,526.80], -["2010-02-25",527.12,528.49,520.00,526.43,3309200,526.43], -["2010-02-24",533.98,538.44,530.51,531.47,2326600,531.47], -["2010-02-23",543.00,543.63,532.29,535.07,2872600,535.07], -["2010-02-22",547.35,547.50,541.00,542.80,2144600,542.80], -["2010-02-19",540.53,544.03,539.70,540.76,2553100,540.76], -["2010-02-18",537.54,545.01,536.14,543.22,2336900,543.22], -["2010-02-17",542.00,543.40,537.61,538.21,2029700,538.21], -["2010-02-16",536.87,544.13,534.30,541.30,3654400,541.30], -["2010-02-12",532.97,537.15,530.50,533.12,2279700,533.12], -["2010-02-11",533.32,540.49,529.50,536.40,2410000,536.40], -["2010-02-10",534.07,537.79,527.69,534.45,2674500,534.45], -["2010-02-09",539.54,541.53,535.07,536.44,2819600,536.44], -["2010-02-08",532.50,542.00,531.53,533.47,2694300,533.47], -["2010-02-05",528.40,533.50,522.46,531.29,3156000,531.29], -["2010-02-04",537.00,538.00,525.56,526.78,3377700,526.78], -["2010-02-03",528.67,542.10,528.23,540.82,2999100,540.82], -["2010-02-02",534.96,534.96,527.61,531.12,4096200,531.12], -["2010-02-01",534.60,535.81,530.30,533.02,2250800,533.02], -["2010-01-29",538.49,540.99,525.61,529.94,4140500,529.94], -["2010-01-28",544.49,547.00,530.60,534.29,3229100,534.29], -["2010-01-27",541.27,547.65,535.31,542.10,3964400,542.10], -["2010-01-26",537.97,549.60,536.29,542.42,4355500,542.42], -["2010-01-25",546.59,549.88,535.51,540.00,4419900,540.00], -["2010-01-22",564.50,570.60,534.86,550.01,6800400,550.01], -["2010-01-21",583.44,586.82,572.25,582.98,6307700,582.98], -["2010-01-20",585.98,585.98,575.29,580.41,3250700,580.41], -["2010-01-19",581.20,590.42,576.29,587.62,4316700,587.62], -["2010-01-15",593.34,593.56,578.04,580.00,5434500,580.00], -["2010-01-14",583.90,594.20,582.81,589.85,4240100,589.85], -["2010-01-13",576.49,588.38,573.90,587.09,6496600,587.09], -["2010-01-12",597.65,598.16,588.00,590.48,4853300,590.48], -["2010-01-11",604.46,604.46,594.04,601.11,7212900,601.11], -["2010-01-08",592.00,603.25,589.11,602.02,4724300,602.02], -["2010-01-07",609.40,610.00,592.65,594.10,6414300,594.10], -["2010-01-06",625.86,625.86,606.36,608.26,3978700,608.26], -["2010-01-05",627.18,627.84,621.54,623.99,3004700,623.99], -["2010-01-04",626.95,629.51,624.24,626.75,1956200,626.75], -["2009-12-31",624.75,625.40,619.98,619.98,1219800,619.98], -["2009-12-30",618.50,622.73,618.01,622.73,1465600,622.73], -["2009-12-29",624.74,624.84,618.29,619.40,1424800,619.40], -["2009-12-28",621.66,625.99,618.48,622.87,1697900,622.87], -["2009-12-24",612.93,619.52,612.27,618.48,858700,618.48], -["2009-12-23",603.50,612.87,602.85,611.68,2072700,611.68], -["2009-12-22",601.34,601.50,598.85,601.12,1880800,601.12], -["2009-12-21",597.61,599.84,595.67,598.68,2571200,598.68], -["2009-12-18",596.03,598.93,595.00,596.42,3531500,596.42], -["2009-12-17",596.44,597.64,593.76,593.94,2638800,593.94], -["2009-12-16",598.60,600.37,596.64,597.76,2809400,597.76], -["2009-12-15",593.30,596.38,590.99,593.14,2280400,593.14], -["2009-12-14",595.35,597.31,592.61,595.73,1913400,595.73], -["2009-12-11",594.68,594.75,587.73,590.51,1720000,590.51], -["2009-12-10",590.44,594.71,590.41,591.50,1668300,591.50], -["2009-12-09",587.50,589.33,583.58,589.02,1781000,589.02], -["2009-12-08",583.50,590.66,582.00,587.05,1524000,587.05], -["2009-12-07",584.21,588.69,581.00,586.25,1636200,586.25], -["2009-12-04",593.02,594.83,579.18,585.01,2513600,585.01], -["2009-12-03",589.04,591.45,585.00,585.74,1428700,585.74], -["2009-12-02",591.00,593.01,586.22,587.51,1663200,587.51], -["2009-12-01",588.13,591.22,583.00,589.87,2320300,589.87], -["2009-11-30",580.63,583.67,577.11,583.00,1725100,583.00], -["2009-11-27",572.00,582.46,570.97,579.76,1384600,579.76], -["2009-11-25",586.41,587.06,582.69,585.74,1461200,585.74], -["2009-11-24",582.52,584.29,576.54,583.09,1605200,583.09], -["2009-11-23",576.49,586.60,575.86,582.35,2547500,582.35], -["2009-11-20",569.50,571.60,569.40,569.96,2006200,569.96], -["2009-11-19",573.77,574.00,570.00,572.99,2168000,572.99], -["2009-11-18",576.65,578.78,572.07,576.65,1549600,576.65], -["2009-11-17",574.87,577.50,573.72,577.49,1916700,577.49], -["2009-11-16",575.00,576.99,572.78,576.28,2199200,576.28], -["2009-11-13",569.29,572.51,566.61,572.05,1666800,572.05], -["2009-11-12",569.56,572.90,565.50,567.85,1886300,567.85], -["2009-11-11",570.48,573.50,565.86,570.56,2319700,570.56], -["2009-11-10",562.73,568.78,562.00,566.76,2230800,566.76], -["2009-11-09",555.45,562.58,554.23,562.51,2649900,562.51], -["2009-11-06",547.72,551.78,545.50,551.10,1826700,551.10], -["2009-11-05",543.49,549.77,542.66,548.65,1847700,548.65], -["2009-11-04",540.80,545.50,536.42,540.33,2332700,540.33], -["2009-11-03",530.01,537.50,528.30,537.29,2380200,537.29], -["2009-11-02",537.08,539.46,528.24,533.99,3202100,533.99], -["2009-10-30",550.00,550.17,534.24,536.12,3468500,536.12], -["2009-10-29",543.01,551.83,541.00,551.05,2522600,551.05], -["2009-10-28",547.87,550.00,538.25,540.30,2567800,540.30], -["2009-10-27",550.97,554.56,544.16,548.29,3216500,548.29], -["2009-10-26",555.75,561.64,550.89,554.21,2970400,554.21], -["2009-10-23",555.25,557.89,551.20,553.69,2392700,553.69], -["2009-10-22",550.00,555.00,548.00,554.09,2336500,554.09], -["2009-10-21",549.91,559.35,549.00,551.10,3670600,551.10], -["2009-10-20",551.64,552.95,540.70,551.72,4043700,551.72], -["2009-10-19",552.69,553.60,548.73,552.09,3217900,552.09], -["2009-10-16",547.33,554.75,544.53,549.85,8841900,549.85], -["2009-10-15",533.75,536.90,527.27,529.91,6100400,529.91], -["2009-10-14",532.46,535.58,530.00,535.32,3258400,535.32], -["2009-10-13",524.39,527.46,521.38,526.11,3037400,526.11], -["2009-10-12",523.42,525.76,519.32,524.04,3322200,524.04], -["2009-10-09",516.65,521.51,514.50,516.25,2738100,516.25], -["2009-10-08",519.57,523.25,513.34,514.18,4303800,514.18], -["2009-10-07",499.00,518.99,497.81,517.54,4874200,517.54], -["2009-10-06",491.70,499.37,491.70,498.74,2732300,498.74], -["2009-10-05",487.65,492.43,483.34,488.52,2144600,488.52], -["2009-10-02",483.74,491.74,482.60,484.58,2600800,484.58], -["2009-10-01",493.00,496.47,487.00,487.20,2813200,487.20], -["2009-09-30",500.00,500.14,487.24,495.85,3141700,495.85], -["2009-09-29",499.53,499.75,493.01,498.53,2099200,498.53], -["2009-09-28",494.84,501.50,493.30,498.53,1839300,498.53], -["2009-09-25",494.29,499.93,492.00,492.48,2049600,492.48], -["2009-09-24",500.47,501.41,493.00,496.77,2527600,496.77], -["2009-09-23",500.78,507.00,497.71,498.46,2704200,498.46], -["2009-09-22",500.92,501.99,497.81,499.06,3041200,499.06], -["2009-09-21",487.74,498.90,486.22,497.00,2116400,497.00], -["2009-09-18",496.77,496.98,491.23,491.46,3283500,491.46], -["2009-09-17",490.57,497.37,487.15,491.72,4483100,491.72], -["2009-09-16",479.80,489.37,478.48,488.29,2585300,488.29], -["2009-09-15",475.08,478.91,472.71,477.54,2398100,477.54], -["2009-09-14",470.51,476.80,470.05,475.12,1975700,475.12], -["2009-09-11",470.40,473.30,467.63,472.14,1902900,472.14], -["2009-09-10",466.65,470.94,462.00,470.94,2534600,470.94], -["2009-09-09",459.06,466.27,458.80,463.97,2195400,463.97], -["2009-09-08",464.29,466.99,455.84,458.62,2656700,458.62], -["2009-09-04",457.57,462.60,455.78,461.30,1499200,461.30], -["2009-09-03",455.82,458.25,455.00,457.52,1646200,457.52], -["2009-09-02",455.82,458.33,452.59,453.01,1804800,453.01], -["2009-09-01",459.68,466.82,454.42,455.76,2594900,455.76], -["2009-08-31",459.79,461.86,458.00,461.67,1957900,461.67], -["2009-08-28",469.26,472.37,463.38,464.75,1771600,464.75], -["2009-08-27",468.58,468.58,460.73,466.06,1998900,466.06], -["2009-08-26",472.76,473.00,466.70,468.00,1987800,468.00], -["2009-08-25",469.13,474.35,468.72,471.37,2341000,471.37], -["2009-08-24",467.35,470.09,464.42,468.73,2453400,468.73], -["2009-08-21",465.54,466.09,462.65,465.24,3560500,465.24], -["2009-08-20",452.00,462.18,451.23,460.41,3998900,460.41], -["2009-08-19",439.99,445.00,438.56,443.97,2255000,443.97], -["2009-08-18",445.10,447.70,442.32,445.28,2351100,445.28], -["2009-08-17",451.50,451.99,443.12,444.89,2620200,444.89], -["2009-08-14",462.78,463.18,456.89,460.00,1675100,460.00], -["2009-08-13",462.15,464.72,458.91,462.28,1995200,462.28], -["2009-08-12",455.41,461.75,454.92,458.58,2341400,458.58], -["2009-08-11",453.67,457.23,452.38,453.94,1712500,453.94], -["2009-08-10",455.14,458.41,453.79,456.61,1742000,456.61], -["2009-08-07",455.67,459.42,454.99,457.10,2543100,457.10], -["2009-08-06",454.30,454.88,448.53,450.36,2110900,450.36], -["2009-08-05",456.00,456.91,447.88,451.14,2342000,451.14], -["2009-08-04",449.37,454.00,448.43,453.73,2389800,453.73], -["2009-08-03",448.74,453.90,447.64,452.21,2590300,452.21], -["2009-07-31",449.98,452.70,442.43,443.05,2860400,443.05], -["2009-07-30",442.61,451.47,442.61,445.64,3198600,445.64], -["2009-07-29",437.23,437.80,431.89,436.24,1987000,436.24], -["2009-07-28",441.00,442.81,436.10,439.85,2532500,439.85], -["2009-07-27",446.04,446.75,437.61,444.80,2504400,444.80], -["2009-07-24",435.81,450.49,435.00,446.72,3626900,446.72], -["2009-07-23",428.68,441.21,425.50,437.34,3478200,437.34], -["2009-07-22",428.00,430.20,423.50,427.69,2586700,427.69], -["2009-07-21",430.94,431.90,425.72,427.90,2968200,427.90], -["2009-07-20",429.88,432.85,426.25,430.17,3153500,430.17], -["2009-07-17",433.00,435.48,426.70,430.25,6854100,430.25], -["2009-07-16",436.68,445.75,434.10,442.60,6554500,442.60], -["2009-07-15",429.66,438.68,428.49,438.17,3777000,438.17], -["2009-07-14",423.71,426.73,420.87,424.69,2895800,424.69], -["2009-07-13",416.17,424.52,415.18,424.30,4045700,424.30], -["2009-07-10",409.58,417.37,408.70,414.40,2926600,414.40], -["2009-07-09",406.12,414.45,405.80,410.39,3275600,410.39], -["2009-07-08",400.00,406.00,398.06,402.49,3441200,402.49], -["2009-07-07",408.24,409.19,395.98,396.63,3259300,396.63], -["2009-07-06",406.50,410.64,401.66,409.61,2262600,409.61], -["2009-07-02",415.41,415.41,406.81,408.49,2517600,408.49], -["2009-07-01",424.20,426.40,418.15,418.99,2310800,418.99], -["2009-06-30",424.00,427.21,418.22,421.59,2593900,421.59], -["2009-06-29",426.00,427.80,422.24,424.14,2169300,424.14], -["2009-06-26",413.68,428.23,413.11,425.32,3256700,425.32], -["2009-06-25",407.00,415.90,406.51,415.77,3044500,415.77], -["2009-06-24",408.74,412.23,406.56,409.29,2457800,409.29], -["2009-06-23",406.65,408.99,402.55,405.68,2899600,405.68], -["2009-06-22",416.95,417.49,401.89,407.35,4124400,407.35], -["2009-06-19",418.21,420.46,414.58,420.09,4259100,420.09], -["2009-06-18",415.68,418.69,413.00,414.06,3085200,414.06], -["2009-06-17",416.19,419.72,411.56,415.16,3490100,415.16], -["2009-06-16",419.31,421.09,415.42,416.00,3049700,416.00], -["2009-06-15",421.50,421.50,414.00,416.77,3736900,416.77], -["2009-06-12",426.86,427.70,421.21,424.84,2918400,424.84], -["2009-06-11",431.77,433.73,428.37,429.00,2865200,429.00], -["2009-06-10",436.23,437.89,426.67,432.60,3358900,432.60], -["2009-06-09",438.58,440.50,431.76,435.62,3254900,435.62], -["2009-06-08",439.50,440.92,434.12,438.77,3098700,438.77], -["2009-06-05",445.07,447.34,439.46,444.32,3680800,444.32], -["2009-06-04",435.30,441.24,434.50,440.28,3638100,440.28], -["2009-06-03",426.00,432.46,424.00,431.65,3532800,431.65], -["2009-06-02",426.25,429.96,423.40,428.40,2623600,428.40], -["2009-06-01",418.73,429.60,418.53,426.56,3322400,426.56], -["2009-05-29",412.11,417.23,410.70,417.23,2648200,417.23], -["2009-05-28",408.68,411.62,404.61,410.40,2668800,410.40], -["2009-05-27",405.64,411.86,404.81,405.56,3034300,405.56], -["2009-05-26",391.95,405.00,390.00,404.36,3104500,404.36], -["2009-05-22",396.66,398.65,392.00,393.50,1718600,393.50], -["2009-05-21",396.30,402.84,393.84,396.50,2719800,396.50], -["2009-05-20",402.09,405.67,395.00,397.18,2284000,397.18], -["2009-05-19",396.10,401.64,393.00,398.88,2837500,398.88], -["2009-05-18",394.73,397.31,385.40,396.84,3351700,396.84], -["2009-05-15",391.10,394.11,389.09,390.00,3008700,390.00], -["2009-05-14",388.80,392.21,384.69,387.50,2937000,387.50], -["2009-05-13",394.09,396.39,388.35,389.54,2842800,389.54], -["2009-05-12",410.01,410.99,395.11,399.01,3790800,399.01], -["2009-05-11",402.80,412.00,401.20,407.98,2559300,407.98], -["2009-05-08",402.85,410.13,395.00,407.33,3865100,407.33], -["2009-05-07",404.10,404.99,392.50,396.61,2999800,396.61], -["2009-05-06",406.79,408.28,401.00,403.47,2632900,403.47], -["2009-05-05",399.98,405.00,397.25,402.99,2400800,402.99], -["2009-05-04",398.17,402.40,394.79,401.98,3203000,401.98], -["2009-05-01",395.03,397.59,391.55,393.69,2427700,393.69], -["2009-04-30",395.76,403.75,394.80,395.97,4355700,395.97], -["2009-04-29",385.97,394.97,385.83,391.47,3610000,391.47], -["2009-04-28",383.75,389.05,381.54,383.71,2943600,383.71], -["2009-04-27",384.34,389.49,382.75,385.95,2290600,385.95], -["2009-04-24",386.05,393.18,380.50,389.49,3385400,389.49], -["2009-04-23",387.51,389.75,381.11,384.69,2609000,384.69], -["2009-04-22",381.75,390.00,379.01,383.86,3501800,383.86], -["2009-04-21",376.17,384.30,376.10,381.47,3695400,381.47], -["2009-04-20",386.15,390.65,375.89,379.30,4428900,379.30], -["2009-04-17",386.02,399.82,384.81,392.24,10730800,392.24], -["2009-04-16",381.50,392.90,381.02,388.74,10185100,388.74], -["2009-04-15",367.10,381.06,364.16,379.50,4930700,379.50], -["2009-04-14",376.94,376.99,365.60,368.91,3428600,368.91], -["2009-04-13",371.33,379.10,370.30,378.11,3050100,378.11], -["2009-04-09",369.50,374.35,366.25,372.50,3382600,372.50], -["2009-04-08",363.50,365.00,356.21,362.00,2765200,362.00], -["2009-04-07",362.60,363.75,355.31,358.65,3680100,358.65], -["2009-04-06",367.00,369.82,361.40,368.24,3280300,368.24], -["2009-04-03",364.50,371.72,358.00,369.78,3789800,369.78], -["2009-04-02",363.31,369.76,360.32,362.50,4488000,362.50], -["2009-04-01",343.78,355.24,340.61,354.09,3301200,354.09], -["2009-03-31",348.93,353.51,346.18,348.06,3655300,348.06], -["2009-03-30",342.55,343.81,336.05,342.69,3094100,342.69], -["2009-03-27",350.00,352.00,345.47,347.70,3322800,347.70], -["2009-03-26",353.13,359.16,348.50,353.29,6003300,353.29], -["2009-03-25",350.40,351.34,336.25,344.07,4336300,344.07], -["2009-03-24",346.50,353.84,344.00,347.17,3820000,347.17], -["2009-03-23",333.56,349.45,333.03,348.60,4271500,348.60], -["2009-03-20",330.30,332.99,326.34,330.16,4737900,330.16], -["2009-03-19",331.68,336.00,327.38,329.94,4111200,329.94], -["2009-03-18",334.81,340.00,328.05,333.10,5012200,333.10], -["2009-03-17",320.18,335.34,319.09,335.34,4712500,335.34], -["2009-03-16",325.99,329.73,318.59,319.69,4946800,319.69], -["2009-03-13",326.10,327.46,319.03,324.42,3906400,324.42], -["2009-03-12",317.54,325.00,313.65,323.53,5024100,323.53], -["2009-03-11",310.10,320.00,305.71,317.91,5923600,317.91], -["2009-03-10",298.25,310.50,294.25,308.17,6730200,308.17], -["2009-03-09",299.98,306.57,289.45,290.89,6471300,290.89], -["2009-03-06",307.22,310.19,294.25,308.57,7234200,308.57], -["2009-03-05",316.48,319.08,302.64,305.64,6529900,305.64], -["2009-03-04",323.16,329.00,315.38,318.92,7818400,318.92], -["2009-03-03",330.07,333.69,322.35,325.48,6524800,325.48], -["2009-03-02",333.33,340.70,326.00,327.16,5788500,327.16], -["2009-02-27",332.95,343.82,331.11,337.99,5420000,337.99], -["2009-02-26",345.96,352.49,337.16,337.18,5605600,337.18], -["2009-02-25",342.15,352.30,338.92,341.64,6439100,341.64], -["2009-02-24",331.02,349.62,330.89,345.45,6095900,345.45], -["2009-02-23",347.00,349.80,329.55,330.06,5221100,330.06], -["2009-02-20",338.05,348.92,335.00,346.45,6217100,346.45], -["2009-02-19",357.47,359.80,341.41,342.64,4988700,342.64], -["2009-02-18",347.24,353.38,340.52,353.11,6024500,353.11], -["2009-02-17",346.51,347.09,339.69,342.66,5680400,342.66], -["2009-02-13",362.19,362.99,355.23,357.68,4146700,357.68], -["2009-02-12",353.16,363.62,351.48,363.05,5550300,363.05], -["2009-02-11",358.95,365.00,353.00,358.04,5231600,358.04], -["2009-02-10",375.98,377.50,357.89,358.51,7103700,358.51], -["2009-02-09",371.28,381.00,367.30,378.77,4977300,378.77], -["2009-02-06",356.46,373.81,355.44,371.28,7038100,371.28], -["2009-02-05",340.91,355.38,337.00,353.72,7264400,353.72], -["2009-02-04",340.07,354.44,339.17,343.00,6817400,343.00], -["2009-02-03",342.57,343.00,333.83,340.45,6556500,340.45], -["2009-02-02",334.29,345.00,332.00,340.57,5206900,340.57], -["2009-01-30",344.69,348.80,336.00,338.53,4672000,338.53], -["2009-01-29",344.54,345.05,340.11,343.32,7283800,343.32], -["2009-01-28",337.98,352.33,336.31,348.67,7691400,348.67], -["2009-01-27",326.45,333.87,324.27,331.48,4927300,331.48], -["2009-01-26",324.85,328.00,320.56,323.87,4610700,323.87], -["2009-01-23",309.27,331.96,304.22,324.70,10732800,324.70], -["2009-01-22",298.04,309.35,295.15,306.50,8267000,306.50], -["2009-01-21",288.35,303.50,288.35,303.08,4924500,303.08], -["2009-01-20",299.14,299.50,282.75,282.75,5048200,282.75], -["2009-01-16",305.02,308.25,295.70,299.67,5224400,299.67], -["2009-01-15",297.57,303.58,286.79,298.99,5934500,298.99], -["2009-01-14",310.00,313.80,297.75,300.97,5467900,300.97], -["2009-01-13",311.77,320.60,310.39,314.32,4432500,314.32], -["2009-01-12",316.31,318.95,310.23,312.69,3304300,312.69], -["2009-01-09",327.50,327.50,313.40,315.07,4340500,315.07], -["2009-01-08",318.28,325.19,317.34,325.19,3600700,325.19], -["2009-01-07",328.32,330.91,318.75,322.01,4494500,322.01], -["2009-01-06",332.98,340.80,326.39,334.06,6425200,334.06], -["2009-01-05",321.00,331.24,315.00,328.05,4889000,328.05], -["2009-01-02",308.60,321.82,305.50,321.32,3610500,321.32], -["2008-12-31",304.20,311.00,302.61,307.65,2886800,307.65], -["2008-12-30",300.80,306.81,298.71,303.11,3843500,303.11], -["2008-12-29",300.22,301.38,291.58,297.42,3701900,297.42], -["2008-12-26",304.07,305.26,298.31,300.36,1959100,300.36], -["2008-12-24",301.48,306.34,298.38,302.95,1921500,302.95], -["2008-12-23",300.43,303.31,296.67,298.02,3777700,298.02], -["2008-12-22",308.56,309.50,290.63,297.11,3917600,297.11], -["2008-12-19",310.99,317.79,309.00,310.17,5612600,310.17], -["2008-12-18",316.70,320.35,309.11,310.28,4763500,310.28], -["2008-12-17",318.64,322.13,312.42,315.24,5789700,315.24], -["2008-12-16",314.52,329.50,311.27,325.28,7059600,325.28], -["2008-12-15",314.01,318.49,305.11,310.67,6737900,310.67], -["2008-12-12",295.71,316.47,294.00,315.76,5722100,315.76], -["2008-12-11",304.17,312.88,297.80,300.22,6179200,300.22], -["2008-12-10",309.24,314.90,304.51,308.82,5237000,308.82], -["2008-12-09",297.69,318.00,297.01,305.97,6889900,305.97], -["2008-12-08",289.99,309.44,282.00,302.11,8144300,302.11], -["2008-12-05",271.02,284.24,264.02,283.99,6521200,283.99], -["2008-12-04",276.53,283.49,268.77,274.34,4886600,274.34], -["2008-12-03",269.85,281.36,265.34,279.43,5904800,279.43], -["2008-12-02",269.73,277.78,262.58,275.11,5839700,275.11], -["2008-12-01",286.68,287.38,265.98,265.99,5711200,265.99], -["2008-11-28",290.58,296.45,288.28,292.96,2565500,292.96], -["2008-11-26",280.28,295.46,276.20,292.09,6356600,292.09], -["2008-11-25",268.68,286.66,267.32,282.05,10771200,282.05], -["2008-11-24",269.26,269.95,249.01,257.44,10054700,257.44], -["2008-11-21",262.51,269.37,247.30,262.43,10244500,262.43], -["2008-11-20",274.89,282.94,259.04,259.56,9779400,259.56], -["2008-11-19",295.39,300.19,278.58,280.18,7834600,280.18], -["2008-11-18",301.57,303.73,285.35,297.42,8346100,297.42], -["2008-11-17",303.00,310.16,297.95,300.12,7543800,300.12], -["2008-11-14",303.25,324.99,302.56,310.02,9517100,310.02], -["2008-11-13",291.77,313.00,280.00,312.08,13234700,312.08], -["2008-11-12",302.05,312.49,287.76,291.00,10051100,291.00], -["2008-11-11",308.69,316.30,300.52,311.46,10146600,311.46], -["2008-11-10",328.00,329.44,309.47,318.78,8080100,318.78], -["2008-11-07",333.12,341.15,325.33,331.14,4681300,331.14], -["2008-11-06",339.97,344.42,325.81,331.22,8574800,331.22], -["2008-11-05",362.15,368.88,341.31,342.24,6946500,342.24], -["2008-11-04",353.44,372.36,345.50,366.94,7349900,366.94], -["2008-11-03",357.58,362.99,341.43,346.49,5954500,346.49], -["2008-10-31",356.16,371.96,354.27,359.36,7423300,359.36], -["2008-10-30",368.46,372.00,358.37,359.69,7988900,359.69], -["2008-10-29",365.79,371.00,352.37,358.00,9756600,358.00], -["2008-10-28",339.05,369.31,328.51,368.75,8105400,368.75], -["2008-10-27",334.81,343.00,325.60,329.49,6200700,329.49], -["2008-10-24",326.47,350.47,324.74,339.29,7359000,339.29], -["2008-10-23",353.65,358.00,337.99,352.32,6478900,352.32], -["2008-10-22",356.99,369.69,344.00,355.67,6560000,355.67], -["2008-10-21",372.39,383.78,362.00,362.75,5782000,362.75], -["2008-10-20",379.75,380.98,359.59,379.32,6753400,379.32], -["2008-10-17",378.96,386.00,363.55,372.54,14249200,372.54], -["2008-10-16",332.76,356.50,309.44,353.02,16239700,353.02], -["2008-10-15",354.65,359.00,338.83,339.17,6721400,339.17], -["2008-10-14",393.53,394.50,357.00,362.71,7784800,362.71], -["2008-10-13",355.79,381.95,345.75,381.02,8905500,381.02], -["2008-10-10",313.16,341.89,310.30,332.00,10597800,332.00], -["2008-10-09",344.52,348.57,321.67,328.98,8075000,328.98], -["2008-10-08",330.16,358.99,326.11,338.11,11826400,338.11], -["2008-10-07",373.33,374.98,345.37,346.01,11054400,346.01], -["2008-10-06",373.98,375.99,357.16,371.21,11220600,371.21], -["2008-10-03",397.35,412.50,383.07,386.91,7992900,386.91], -["2008-10-02",409.79,409.98,386.00,390.49,5984900,390.49], -["2008-10-01",411.15,416.98,403.10,411.72,6234800,411.72], -["2008-09-30",395.98,425.08,392.32,400.52,3086300,400.52], -["2008-09-29",419.51,423.51,380.71,381.00,10762900,381.00], -["2008-09-26",428.00,437.16,421.03,431.04,5292500,431.04], -["2008-09-25",438.84,450.00,435.98,439.60,5020300,439.60], -["2008-09-24",430.34,445.00,430.11,435.11,4242000,435.11], -["2008-09-23",433.25,440.79,425.72,429.27,5204200,429.27], -["2008-09-22",454.13,454.13,429.00,430.14,4407300,430.14], -["2008-09-19",461.00,462.07,443.28,449.15,10006000,449.15], -["2008-09-18",422.64,439.18,410.50,439.08,8589400,439.08], -["2008-09-17",438.48,439.14,413.44,414.49,9126900,414.49], -["2008-09-16",425.96,449.28,425.49,442.93,6990700,442.93], -["2008-09-15",424.00,441.97,423.71,433.86,6567400,433.86], -["2008-09-12",430.21,441.99,429.00,437.66,6028000,437.66], -["2008-09-11",408.35,435.09,406.38,433.75,6471400,433.75], -["2008-09-10",424.47,424.48,409.68,414.16,6226800,414.16], -["2008-09-09",423.17,432.38,415.00,418.66,7229600,418.66], -["2008-09-08",452.02,452.94,417.55,419.95,9017900,419.95], -["2008-09-05",445.49,452.46,440.08,444.25,4534300,444.25], -["2008-09-04",460.00,463.24,449.40,450.26,4848500,450.26], -["2008-09-03",468.73,474.29,459.58,464.41,4314600,464.41], -["2008-09-02",476.77,482.18,461.42,465.25,6111500,465.25], -["2008-08-29",469.75,471.01,462.33,463.29,3848200,463.29], -["2008-08-28",472.49,476.45,470.33,473.78,3029700,473.78], -["2008-08-27",473.73,474.83,464.84,468.58,4387100,468.58], -["2008-08-26",483.46,483.46,470.59,474.16,3308200,474.16], -["2008-08-25",486.11,497.00,481.50,483.01,2014300,483.01], -["2008-08-22",491.50,494.88,489.48,490.59,2297200,490.59], -["2008-08-21",482.92,489.90,479.27,486.53,3514100,486.53], -["2008-08-20",494.72,496.69,482.57,485.00,3982100,485.00], -["2008-08-19",490.43,498.28,486.63,490.50,3046500,490.50], -["2008-08-18",509.84,510.00,495.51,498.30,3333900,498.30], -["2008-08-15",506.99,510.66,505.50,510.15,3545700,510.15], -["2008-08-14",497.70,507.61,496.29,505.49,2918600,505.49], -["2008-08-13",501.60,503.54,493.88,500.03,3625500,500.03], -["2008-08-12",502.00,506.13,498.00,502.61,2755700,502.61], -["2008-08-11",492.47,508.88,491.78,500.84,4239300,500.84], -["2008-08-08",480.15,495.75,475.69,495.01,3739300,495.01], -["2008-08-07",482.00,484.00,476.41,479.12,2773800,479.12], -["2008-08-06",478.37,489.77,472.51,486.34,3375800,486.34], -["2008-08-05",467.59,480.08,466.33,479.85,3584500,479.85], -["2008-08-04",468.12,473.01,461.90,463.00,2487000,463.00], -["2008-08-01",472.51,473.22,462.50,467.86,3007900,467.86], -["2008-07-31",474.56,480.89,471.44,473.75,2865100,473.75], -["2008-07-30",485.50,486.02,472.81,482.70,3490700,482.70], -["2008-07-29",479.30,487.26,478.00,483.11,2802800,483.11], -["2008-07-28",492.09,492.09,475.13,477.12,3160000,477.12], -["2008-07-25",486.49,493.13,481.50,491.98,3183500,491.98], -["2008-07-24",496.70,496.87,475.62,475.62,3540900,475.62], -["2008-07-23",481.61,497.23,478.10,489.22,4894100,489.22], -["2008-07-22",466.72,480.25,465.60,477.11,4691500,477.11], -["2008-07-21",480.88,484.09,465.70,468.80,5901500,468.80], -["2008-07-18",498.35,498.98,478.19,481.32,11292400,481.32], -["2008-07-17",534.16,537.05,524.50,533.44,8787400,533.44], -["2008-07-16",514.04,536.50,510.60,535.60,4742200,535.60], -["2008-07-15",516.28,527.50,501.10,516.09,6071000,516.09], -["2008-07-14",539.00,540.06,515.45,521.62,4424800,521.62], -["2008-07-11",536.50,539.50,519.43,533.80,4981400,533.80], -["2008-07-10",545.00,549.50,530.72,540.57,4331700,540.57], -["2008-07-09",550.76,555.68,540.73,541.55,4154000,541.55], -["2008-07-08",545.99,555.19,540.00,554.53,4932400,554.53], -["2008-07-07",542.30,549.00,535.60,543.91,4255200,543.91], -["2008-07-03",530.88,539.23,527.50,537.00,2400500,537.00], -["2008-07-02",536.51,540.38,526.06,527.04,4223000,527.04], -["2008-07-01",519.58,536.72,517.00,534.73,4959900,534.73], -["2008-06-30",532.47,538.00,523.06,526.42,3765300,526.42], -["2008-06-27",527.68,530.00,515.09,528.07,5447500,528.07], -["2008-06-26",544.10,544.93,528.26,528.82,5659500,528.82], -["2008-06-25",544.97,557.80,543.67,551.00,4122200,551.00], -["2008-06-24",545.14,551.19,535.10,542.30,4672600,542.30], -["2008-06-23",545.36,553.15,542.02,545.21,3635900,545.21], -["2008-06-20",556.98,556.98,544.51,546.43,5983100,546.43], -["2008-06-19",555.35,563.78,550.81,560.20,5683100,560.20], -["2008-06-18",564.51,568.99,559.16,562.38,3381200,562.38], -["2008-06-17",576.35,578.07,568.38,569.46,3462900,569.46], -["2008-06-16",566.50,579.10,566.50,572.81,3542800,572.81], -["2008-06-13",561.49,575.70,561.34,571.51,6184400,571.51], -["2008-06-12",548.76,558.00,546.88,552.95,5491600,552.95], -["2008-06-11",556.24,557.34,544.46,545.20,3812900,545.20], -["2008-06-10",549.56,558.82,546.78,554.17,3657400,554.17], -["2008-06-09",568.06,570.00,545.40,557.87,5288300,557.87], -["2008-06-06",579.75,580.72,567.00,567.00,4734500,567.00], -["2008-06-05",577.08,588.04,576.21,586.30,3916700,586.30], -["2008-06-04",565.33,578.00,564.55,572.22,3363200,572.22], -["2008-06-03",576.50,580.50,560.61,567.30,4305300,567.30], -["2008-06-02",582.50,583.89,571.27,575.00,3674200,575.00], -["2008-05-30",583.47,589.92,581.30,585.80,3225200,585.80], -["2008-05-29",574.79,585.88,573.20,583.00,4845000,583.00], -["2008-05-28",567.94,571.49,561.10,568.24,4050400,568.24], -["2008-05-27",544.96,562.60,543.85,560.90,3865500,560.90], -["2008-05-23",546.96,553.00,537.81,544.62,4431500,544.62], -["2008-05-22",551.95,554.21,540.25,549.46,5076300,549.46], -["2008-05-21",578.52,581.41,547.89,549.99,6468100,549.99], -["2008-05-20",574.63,582.48,572.91,578.60,3313600,578.60], -["2008-05-19",578.55,588.88,573.52,577.52,5604500,577.52], -["2008-05-16",581.43,584.68,578.32,580.07,4274100,580.07], -["2008-05-15",579.00,582.95,575.61,581.00,4342700,581.00], -["2008-05-14",586.49,591.19,575.25,576.30,4375800,576.30], -["2008-05-13",586.23,587.95,578.55,583.00,5163500,583.00], -["2008-05-12",574.75,586.75,568.91,584.94,4863900,584.94], -["2008-05-09",579.00,585.00,571.30,573.20,4484900,573.20], -["2008-05-08",586.20,589.30,578.91,583.01,5122900,583.01], -["2008-05-07",590.27,599.49,576.43,579.00,6613000,579.00], -["2008-05-06",591.00,592.00,583.00,586.36,4629300,586.36], -["2008-05-05",598.86,599.00,587.13,594.90,6281000,594.90], -["2008-05-02",598.49,602.45,579.30,581.29,6998800,581.29], -["2008-05-01",578.31,594.93,576.97,593.08,6602800,593.08], -["2008-04-30",562.21,584.86,558.47,574.29,7903000,574.29], -["2008-04-29",550.83,563.40,550.01,558.47,4346000,558.47], -["2008-04-28",545.88,556.81,539.00,552.12,4008600,552.12], -["2008-04-25",549.02,553.00,542.73,544.06,4164400,544.06], -["2008-04-24",551.29,554.49,540.02,543.04,4135100,543.04], -["2008-04-23",557.94,559.31,540.95,546.49,4921500,546.49], -["2008-04-22",537.57,560.83,537.56,555.00,7938500,555.00], -["2008-04-21",539.39,542.59,530.29,537.79,7439700,537.79], -["2008-04-18",535.21,547.70,524.77,539.41,18235600,539.41], -["2008-04-17",455.63,459.37,446.52,449.54,13353000,449.54], -["2008-04-16",444.40,458.28,441.00,455.03,7630700,455.03], -["2008-04-15",458.13,459.72,443.72,446.84,4577600,446.84], -["2008-04-14",457.16,457.45,450.15,451.66,3842600,451.66], -["2008-04-11",464.07,467.26,455.01,457.45,4169700,457.45], -["2008-04-10",464.96,473.86,461.85,469.08,5072400,469.08], -["2008-04-09",469.13,472.00,457.54,464.19,6048100,464.19], -["2008-04-08",473.04,474.14,462.01,467.81,4547000,467.81], -["2008-04-07",477.03,485.44,473.53,476.82,5943500,476.82], -["2008-04-04",457.01,477.83,456.20,471.09,5897200,471.09], -["2008-04-03",461.73,463.29,448.13,455.12,6778400,455.12], -["2008-04-02",469.90,475.74,460.39,465.70,5999000,465.70], -["2008-04-01",447.74,466.50,446.87,465.71,6093100,465.71], -["2008-03-31",435.64,442.69,432.01,440.47,4446400,440.47], -["2008-03-28",447.46,453.57,434.31,438.08,4376200,438.08], -["2008-03-27",446.00,448.61,440.49,444.08,5832200,444.08], -["2008-03-26",452.59,462.87,449.29,458.19,5225700,458.19], -["2008-03-25",457.46,457.47,446.00,450.78,5831600,450.78], -["2008-03-24",438.43,465.78,437.72,460.56,6763500,460.56], -["2008-03-20",427.32,435.70,417.50,433.55,9913400,433.55], -["2008-03-19",441.11,447.50,431.67,432.00,6179000,432.00], -["2008-03-18",428.98,440.84,425.53,439.16,7237200,439.16], -["2008-03-17",427.99,433.71,412.11,419.87,7888200,419.87], -["2008-03-14",442.98,449.34,430.62,437.92,6574400,437.92], -["2008-03-13",432.67,446.98,428.78,443.01,7726600,443.01], -["2008-03-12",440.01,447.88,438.07,440.18,6651900,440.18], -["2008-03-11",425.26,440.15,424.65,439.84,8826900,439.84], -["2008-03-10",428.83,431.00,413.04,413.62,7987600,413.62], -["2008-03-07",428.88,440.00,426.24,433.35,8071800,433.35], -["2008-03-06",447.69,453.30,431.18,432.70,7470100,432.70], -["2008-03-05",445.25,454.17,444.00,447.70,7436600,447.70], -["2008-03-04",450.95,453.36,435.78,444.60,13621700,444.60], -["2008-03-03",471.51,472.72,450.11,457.02,7554500,457.02], -["2008-02-29",471.87,479.74,464.65,471.18,9425400,471.18], -["2008-02-28",470.50,479.09,467.36,475.39,6586900,475.39], -["2008-02-27",460.13,475.49,459.64,472.86,10121900,472.86], -["2008-02-26",461.20,466.47,446.85,464.19,23287300,464.19], -["2008-02-25",505.95,506.50,485.74,486.44,8372800,486.44], -["2008-02-22",502.06,509.00,497.55,507.80,5515900,507.80], -["2008-02-21",512.85,513.21,499.50,502.86,5677800,502.86], -["2008-02-20",503.51,511.01,498.82,509.00,6662200,509.00], -["2008-02-19",534.94,535.06,506.50,508.95,6350400,508.95], -["2008-02-15",528.31,532.66,524.33,529.64,5240100,529.64], -["2008-02-14",538.35,541.04,531.00,532.25,6476700,532.25], -["2008-02-13",522.50,534.99,518.69,534.62,6624700,534.62], -["2008-02-12",523.39,530.60,513.03,518.09,6662300,518.09], -["2008-02-11",520.52,523.71,513.40,521.16,5826000,521.16], -["2008-02-08",509.41,517.73,508.70,516.69,6828900,516.69], -["2008-02-07",496.86,514.19,494.76,504.95,7928900,504.95], -["2008-02-06",511.14,511.17,497.93,501.71,7636400,501.71], -["2008-02-05",489.43,509.00,488.52,506.80,11203300,506.80], -["2008-02-04",509.07,512.78,492.55,495.43,13157100,495.43], -["2008-02-01",528.67,536.67,510.00,515.90,17600500,515.90], -["2008-01-31",539.01,573.00,534.29,564.30,14871300,564.30], -["2008-01-30",549.19,560.43,543.51,548.27,7939600,548.27], -["2008-01-29",560.47,561.33,540.67,550.52,6283000,550.52], -["2008-01-28",570.97,572.24,548.60,555.98,5816700,555.98], -["2008-01-25",591.81,595.00,566.18,566.40,6966000,566.40], -["2008-01-24",558.80,579.69,554.14,574.49,9400900,574.49], -["2008-01-23",560.71,568.00,519.00,548.62,16965700,548.62], -["2008-01-22",562.03,597.50,561.20,584.35,9501500,584.35], -["2008-01-18",608.36,609.99,598.45,600.25,8539600,600.25], -["2008-01-17",620.76,625.74,598.01,600.79,8216800,600.79], -["2008-01-16",628.97,639.99,601.93,615.95,10560000,615.95], -["2008-01-15",645.90,649.05,635.38,637.65,5568200,637.65], -["2008-01-14",651.14,657.40,645.25,653.82,4447500,653.82], -["2008-01-11",642.70,649.47,630.11,638.25,4977000,638.25], -["2008-01-10",645.01,657.20,640.11,646.73,6334200,646.73], -["2008-01-09",630.04,653.34,622.51,653.20,6739700,653.20], -["2008-01-08",653.00,659.96,631.00,631.68,5339100,631.68], -["2008-01-07",653.94,662.28,637.35,649.25,6403400,649.25], -["2008-01-04",679.69,680.96,655.00,657.00,5359800,657.00], -["2008-01-03",685.26,686.85,676.52,685.33,3252500,685.33], -["2008-01-02",692.87,697.37,677.73,685.19,4306900,685.19], -["2007-12-31",698.57,702.49,690.58,691.48,2376200,691.48], -["2007-12-28",704.93,707.95,696.54,702.53,2562700,702.53], -["2007-12-27",707.07,716.00,700.74,700.74,2942500,700.74], -["2007-12-26",698.99,713.22,698.21,710.84,2530000,710.84], -["2007-12-24",694.99,700.73,693.06,700.73,1628400,700.73], -["2007-12-21",697.88,699.26,693.24,696.69,5382000,696.69], -["2007-12-20",685.83,691.00,680.61,689.69,4422200,689.69], -["2007-12-19",674.21,679.50,669.00,677.37,4421100,677.37], -["2007-12-18",674.16,676.71,652.50,673.35,7166700,673.35], -["2007-12-17",688.00,695.42,663.67,669.23,5486000,669.23], -["2007-12-14",687.51,699.70,687.26,689.96,3673500,689.96], -["2007-12-13",696.31,697.62,681.21,694.05,5040800,694.05], -["2007-12-12",714.00,714.32,688.50,699.35,6159100,699.35], -["2007-12-11",719.94,720.99,698.78,699.20,6139100,699.20], -["2007-12-10",715.99,724.80,714.00,718.42,3856200,718.42], -["2007-12-07",714.99,718.00,710.50,714.87,3852100,714.87], -["2007-12-06",697.80,716.56,697.01,715.26,4909000,715.26], -["2007-12-05",692.73,698.93,687.50,698.51,4209600,698.51], -["2007-12-04",678.31,692.00,677.12,684.16,4231800,684.16], -["2007-12-03",691.01,695.00,681.14,681.53,4325100,681.53], -["2007-11-30",711.00,711.06,682.11,693.00,7895500,693.00], -["2007-11-29",690.75,702.79,687.77,697.00,6208000,697.00], -["2007-11-28",682.11,694.30,672.14,692.26,7916500,692.26], -["2007-11-27",674.80,676.43,650.26,673.57,8904500,673.57], -["2007-11-26",680.20,693.40,665.00,666.00,6790100,666.00], -["2007-11-23",670.00,678.28,668.11,676.70,2738700,676.70], -["2007-11-21",643.77,669.97,642.08,660.52,7013500,660.52], -["2007-11-20",636.48,659.10,632.87,648.54,9840600,648.54], -["2007-11-19",629.59,636.77,618.50,625.85,5527400,625.85], -["2007-11-16",633.94,635.49,616.02,633.63,9042800,633.63], -["2007-11-15",638.57,647.50,624.00,629.65,6967700,629.65], -["2007-11-14",673.28,675.49,636.27,641.68,8094700,641.68], -["2007-11-13",644.99,660.92,632.07,660.55,8426100,660.55], -["2007-11-12",657.74,669.93,626.21,632.07,10227300,632.07], -["2007-11-09",675.78,681.88,661.21,663.97,11388100,663.97], -["2007-11-08",734.60,734.89,677.18,693.84,16512200,693.84], -["2007-11-07",741.13,747.24,723.14,732.94,8252900,732.94], -["2007-11-06",737.56,741.79,725.00,741.79,8436300,741.79], -["2007-11-05",706.99,730.23,706.07,725.65,8883700,725.65], -["2007-11-02",710.51,713.58,697.34,711.25,5841500,711.25], -["2007-11-01",702.79,713.72,701.78,703.21,6527200,703.21], -["2007-10-31",700.69,707.00,696.04,707.00,6876800,707.00], -["2007-10-30",677.51,699.91,677.51,694.77,6900600,694.77], -["2007-10-29",677.77,680.00,672.09,679.23,3066300,679.23], -["2007-10-26",674.03,676.54,668.06,674.60,3353900,674.60], -["2007-10-25",678.68,678.97,663.55,668.51,5795500,668.51], -["2007-10-24",672.71,677.47,659.56,675.82,7404200,675.82], -["2007-10-23",661.25,677.60,660.00,675.77,6793700,675.77], -["2007-10-22",638.67,655.00,636.28,650.75,6664400,650.75], -["2007-10-19",654.56,658.49,643.23,644.71,15789000,644.71], -["2007-10-18",635.41,641.37,628.50,639.62,12289200,639.62], -["2007-10-17",630.45,634.00,621.59,633.48,6030500,633.48], -["2007-10-16",618.49,625.92,611.99,616.00,6025300,616.00], -["2007-10-15",638.47,639.86,615.55,620.11,6943800,620.11], -["2007-10-12",623.98,638.40,618.24,637.39,6823700,637.39], -["2007-10-11",633.64,641.41,609.00,622.00,11799000,622.00], -["2007-10-10",621.36,625.68,616.80,625.39,5385600,625.39], -["2007-10-09",615.11,623.78,608.39,615.18,8767800,615.18], -["2007-10-08",595.00,610.26,593.95,609.62,5028000,609.62], -["2007-10-05",587.11,596.00,587.01,594.05,5068700,594.05], -["2007-10-04",585.09,585.09,577.06,579.03,2986700,579.03], -["2007-10-03",586.25,588.99,580.36,584.02,3879500,584.02], -["2007-10-02",583.38,596.81,580.01,584.39,7067500,584.39], -["2007-10-01",569.97,584.35,569.61,582.55,4711300,582.55], -["2007-09-28",567.00,569.55,564.12,567.27,2639500,567.27], -["2007-09-27",571.73,571.74,565.78,567.50,2056300,567.50], -["2007-09-26",570.40,571.79,563.81,568.16,3346100,568.16], -["2007-09-25",564.00,569.56,562.86,569.00,2730600,569.00], -["2007-09-24",561.00,571.46,560.00,568.02,5297000,568.02], -["2007-09-21",556.34,560.79,552.83,560.10,8011700,560.10], -["2007-09-20",547.00,556.80,546.03,552.83,5525000,552.83], -["2007-09-19",539.27,549.45,538.86,546.85,5526900,546.85], -["2007-09-18",526.52,537.25,524.27,535.27,4215700,535.27], -["2007-09-17",526.53,529.28,524.07,525.30,2197500,525.30], -["2007-09-14",523.20,530.27,522.22,528.75,2764900,528.75], -["2007-09-13",524.06,527.21,523.22,524.78,1891100,524.78], -["2007-09-12",520.53,527.98,519.00,522.65,2986000,522.65], -["2007-09-11",516.99,521.65,515.73,521.33,2703600,521.33], -["2007-09-10",521.28,522.07,510.88,514.48,3225800,514.48], -["2007-09-07",517.86,521.24,516.80,519.35,3663600,519.35], -["2007-09-06",529.36,529.83,518.24,523.52,3625900,523.52], -["2007-09-05",523.40,529.48,522.25,527.80,3312900,527.80], -["2007-09-04",515.02,528.00,514.62,525.15,3693700,525.15], -["2007-08-31",513.10,516.50,511.47,515.25,2977600,515.25], -["2007-08-30",512.36,515.40,510.58,511.40,2651700,511.40], -["2007-08-29",507.84,513.30,507.23,512.88,2549300,512.88], -["2007-08-28",511.53,514.98,505.79,506.40,3273900,506.40], -["2007-08-27",514.43,517.45,511.40,513.26,2325100,513.26], -["2007-08-24",512.61,515.55,508.50,515.00,2472700,515.00], -["2007-08-23",516.00,516.13,507.00,512.19,3076700,512.19], -["2007-08-22",509.96,516.25,509.25,512.75,3252700,512.75], -["2007-08-21",498.94,508.16,497.77,506.61,3610600,506.61], -["2007-08-20",502.46,502.56,496.00,497.92,2697300,497.92], -["2007-08-17",497.44,501.00,491.65,500.04,5479400,500.04], -["2007-08-16",492.02,496.43,480.46,491.52,8645600,491.52], -["2007-08-15",509.00,511.69,496.71,497.55,5409500,497.55], -["2007-08-14",515.72,517.40,508.00,508.60,3633700,508.60], -["2007-08-13",519.54,519.75,513.03,515.50,3179300,515.50], -["2007-08-10",510.18,518.72,505.63,515.75,5875200,515.75], -["2007-08-09",520.80,526.82,514.63,514.73,4846500,514.73], -["2007-08-08",519.34,525.78,517.09,525.78,4068800,525.78], -["2007-08-07",509.75,519.88,509.04,516.02,4264300,516.02], -["2007-08-06",503.00,510.15,502.50,510.00,3651500,510.00], -["2007-08-03",510.05,513.20,503.00,503.00,3176200,503.00], -["2007-08-02",513.72,514.99,509.00,511.01,3154900,511.01], -["2007-08-01",510.50,516.51,508.14,512.94,4421500,512.94], -["2007-07-31",520.23,520.44,510.00,510.00,4270500,510.00], -["2007-07-30",512.92,519.34,510.50,516.11,3963300,516.11], -["2007-07-27",508.53,516.62,505.50,511.89,5509100,511.89], -["2007-07-26",508.74,512.59,498.88,508.00,6883400,508.00], -["2007-07-25",516.98,517.02,505.56,509.76,5545000,509.76], -["2007-07-24",509.30,518.69,507.11,514.00,5572100,514.00], -["2007-07-23",519.01,520.00,512.15,512.51,6356700,512.51], -["2007-07-20",511.90,523.18,509.50,520.12,17772300,520.12], -["2007-07-19",553.46,553.52,542.24,548.59,11127200,548.59], -["2007-07-18",553.89,554.50,543.81,549.50,6080000,549.50], -["2007-07-17",555.04,557.73,552.38,555.00,4328600,555.00], -["2007-07-16",550.30,558.58,549.31,552.99,6599500,552.99], -["2007-07-13",547.91,552.67,547.25,552.16,5237100,552.16], -["2007-07-12",545.86,547.32,540.22,545.33,3441600,545.33], -["2007-07-11",543.61,546.50,540.01,544.47,3309300,544.47], -["2007-07-10",543.79,547.00,541.65,543.34,3856000,543.34], -["2007-07-09",543.00,548.74,540.26,542.56,3729800,542.56], -["2007-07-06",541.25,543.87,538.73,539.40,2747000,539.40], -["2007-07-05",535.56,544.40,532.15,541.63,4942900,541.63], -["2007-07-03",531.06,534.40,527.50,534.34,1871800,534.34], -["2007-07-02",525.49,531.85,524.20,530.38,3487600,530.38], -["2007-06-29",526.02,527.40,519.46,522.70,3880600,522.70], -["2007-06-28",524.88,529.50,523.80,525.01,4168400,525.01], -["2007-06-27",525.00,527.99,519.56,526.29,6123100,526.29], -["2007-06-26",532.73,533.20,526.24,530.26,5689500,530.26], -["2007-06-25",528.98,534.99,523.38,527.42,7925000,527.42], -["2007-06-22",516.42,524.99,516.10,524.98,7203700,524.98], -["2007-06-21",510.98,515.29,506.28,514.11,4409700,514.11], -["2007-06-20",516.96,518.75,509.06,509.97,4338200,509.97], -["2007-06-19",514.01,517.25,511.54,514.31,4355300,514.31], -["2007-06-18",506.18,516.00,504.24,515.20,4835900,515.20], -["2007-06-15",508.19,509.00,501.23,505.89,6174100,505.89], -["2007-06-14",505.38,505.88,501.70,502.84,4621200,502.84], -["2007-06-13",507.09,508.54,498.69,505.24,7034000,505.24], -["2007-06-12",508.71,511.67,503.17,504.77,6419500,504.77], -["2007-06-11",514.02,518.25,510.00,511.34,4647700,511.34], -["2007-06-08",516.20,519.64,509.46,515.49,6358200,515.49], -["2007-06-07",519.75,526.50,512.51,515.06,10630500,515.06], -["2007-06-06",516.75,520.78,515.26,518.25,7886700,518.25], -["2007-06-05",509.75,519.00,506.61,518.84,10447100,518.84], -["2007-06-04",497.91,510.51,497.59,507.07,7101000,507.07], -["2007-06-01",501.00,505.02,497.93,500.40,4799000,500.40], -["2007-05-31",500.56,508.78,497.06,497.91,8924300,497.91], -["2007-05-30",484.50,498.84,483.00,498.60,7245800,498.60], -["2007-05-29",485.00,491.80,484.00,487.11,5218000,487.11], -["2007-05-25",479.70,484.95,477.27,483.52,5348500,483.52], -["2007-05-24",475.15,479.20,471.50,474.33,4173600,474.33], -["2007-05-23",480.82,483.41,473.75,473.97,5060200,473.97], -["2007-05-22",473.00,479.01,473.00,475.86,3839000,475.86], -["2007-05-21",469.53,479.20,466.72,470.60,6159300,470.60], -["2007-05-18",472.03,472.70,469.75,470.32,3695900,470.32], -["2007-05-17",472.46,475.22,470.81,470.96,4660600,470.96], -["2007-05-16",462.00,473.14,459.02,472.61,6554200,472.61], -["2007-05-15",461.96,462.54,457.41,458.00,4119000,458.00], -["2007-05-14",465.48,467.51,460.00,461.78,3872700,461.78], -["2007-05-11",461.83,467.00,461.00,466.74,2944100,466.74], -["2007-05-10",467.04,469.49,461.02,461.47,3686300,461.47], -["2007-05-09",466.15,471.73,463.88,469.25,3889900,469.25], -["2007-05-08",466.13,468.17,464.73,466.81,2905100,466.81], -["2007-05-07",472.14,472.82,466.47,467.27,3020100,467.27], -["2007-05-04",470.12,474.84,465.88,471.12,3950000,471.12], -["2007-05-03",466.22,474.07,465.29,473.23,3594200,473.23], -["2007-05-02",468.65,471.08,465.73,465.78,3062700,465.78], -["2007-05-01",472.19,472.81,464.17,469.00,3658200,469.00], -["2007-04-30",479.15,481.35,471.38,471.38,3641200,471.38], -["2007-04-27",480.07,482.40,478.33,479.01,2925700,479.01], -["2007-04-26",478.10,484.45,477.11,481.18,4124900,481.18], -["2007-04-25",480.00,481.37,476.11,477.99,3966800,477.99], -["2007-04-24",478.61,479.98,475.55,477.53,3694700,477.53], -["2007-04-23",480.10,485.00,478.26,479.08,5674600,479.08], -["2007-04-20",490.52,492.50,482.02,482.48,12161500,482.48], -["2007-04-19",474.50,481.95,469.59,471.65,11009600,471.65], -["2007-04-18",471.26,479.90,469.53,476.01,5670500,476.01], -["2007-04-17",473.80,476.39,471.60,472.80,3210100,472.80], -["2007-04-16",468.46,476.99,468.15,474.27,5077900,474.27], -["2007-04-13",468.45,468.77,463.36,466.29,2794800,466.29], -["2007-04-12",464.00,468.00,462.24,467.39,2707900,467.39], -["2007-04-11",466.06,469.40,462.61,464.53,3812000,464.53], -["2007-04-10",467.09,470.79,465.16,466.50,2979300,466.50], -["2007-04-09",472.98,473.00,465.59,468.21,3062100,468.21], -["2007-04-05",471.30,472.09,469.62,471.51,2715800,471.51], -["2007-04-04",472.14,473.00,469.58,471.02,3778800,471.02], -["2007-04-03",464.05,474.25,464.00,472.60,6501800,472.60], -["2007-04-02",457.76,458.53,452.12,458.53,3448500,458.53], -["2007-03-30",462.10,463.40,456.14,458.16,3380200,458.16], -["2007-03-29",464.55,466.00,455.00,460.92,3988500,460.92], -["2007-03-28",461.87,465.44,460.15,461.88,4591600,461.88], -["2007-03-27",463.55,465.23,460.34,463.62,3741200,463.62], -["2007-03-26",460.55,465.00,455.62,465.00,4710300,465.00], -["2007-03-23",461.45,463.39,457.08,461.83,4111300,461.83], -["2007-03-22",455.61,462.17,452.53,462.04,5680700,462.04], -["2007-03-21",445.30,456.57,445.21,456.55,5798300,456.55], -["2007-03-20",445.79,447.60,443.60,445.28,3421500,445.28], -["2007-03-19",443.25,448.50,440.63,447.23,5197700,447.23], -["2007-03-16",445.65,446.70,439.89,440.85,5659100,440.85], -["2007-03-15",447.86,449.82,443.94,446.19,3944200,446.19], -["2007-03-14",443.23,448.66,439.00,448.00,8016900,448.00], -["2007-03-13",450.11,451.93,442.83,443.03,6377300,443.03], -["2007-03-12",452.57,455.25,451.11,454.75,3465400,454.75], -["2007-03-09",458.00,458.40,450.10,452.96,4977700,452.96], -["2007-03-08",459.22,465.50,454.10,454.72,5362800,454.72], -["2007-03-07",462.69,463.14,454.29,455.64,6534100,455.64], -["2007-03-06",447.47,459.00,447.38,457.55,7533700,457.55], -["2007-03-05",437.02,445.50,437.00,440.95,6355100,440.95], -["2007-03-02",445.11,448.70,438.68,438.68,6583600,438.68], -["2007-03-01",442.67,452.42,440.00,448.23,8685200,448.23], -["2007-02-28",450.41,453.67,443.04,449.45,8032300,449.45], -["2007-02-27",455.00,459.80,447.17,448.77,9312800,448.77], -["2007-02-26",472.83,475.25,463.75,464.93,3969900,464.93], -["2007-02-23",475.75,476.95,467.80,470.62,3882600,470.62], -["2007-02-22",478.69,484.24,474.39,475.85,5743900,475.85], -["2007-02-21",469.84,478.68,467.74,475.86,5640600,475.86], -["2007-02-20",468.47,472.75,464.71,472.10,4067600,472.10], -["2007-02-16",462.80,470.15,462.06,469.94,6177000,469.94], -["2007-02-15",466.00,466.13,460.72,461.47,4042400,461.47], -["2007-02-14",460.00,469.13,459.22,465.93,5698800,465.93], -["2007-02-13",459.15,462.78,457.26,459.10,4062600,459.10], -["2007-02-12",460.68,462.39,455.02,458.29,5754500,458.29], -["2007-02-09",471.65,472.68,461.50,461.89,4858600,461.89], -["2007-02-08",468.05,473.75,465.15,471.03,4076700,471.03], -["2007-02-07",473.82,474.35,468.78,470.01,4119800,470.01], -["2007-02-06",468.10,473.30,467.26,471.48,5321900,471.48], -["2007-02-05",477.50,478.00,466.19,467.16,7206900,467.16], -["2007-02-02",482.61,485.00,477.81,481.50,6286500,481.50], -["2007-02-01",506.00,506.01,481.53,481.75,15658700,481.75], -["2007-01-31",496.49,505.00,495.51,501.50,12206100,501.50], -["2007-01-30",494.00,498.00,491.22,494.32,4180500,494.32], -["2007-01-29",498.00,498.75,490.50,492.47,4775700,492.47], -["2007-01-26",490.93,497.90,487.03,495.84,5496500,495.84], -["2007-01-25",501.00,504.50,485.66,488.09,6368500,488.09], -["2007-01-24",484.45,499.54,483.29,499.07,6059300,499.07], -["2007-01-23",480.79,484.75,477.29,479.05,4665500,479.05], -["2007-01-22",492.50,492.65,478.50,480.84,5404300,480.84], -["2007-01-19",487.98,490.76,486.74,489.75,4978300,489.75], -["2007-01-18",494.52,496.48,487.43,487.83,5932000,487.83], -["2007-01-17",503.39,507.77,494.38,497.28,6699100,497.28], -["2007-01-16",507.55,513.00,503.30,504.28,7568900,504.28], -["2007-01-12",501.99,505.00,500.00,505.00,4473700,505.00], -["2007-01-11",497.20,501.75,496.18,499.72,7208200,499.72], -["2007-01-10",484.43,493.55,482.04,489.46,5968500,489.46], -["2007-01-09",485.45,488.25,481.20,485.50,5381400,485.50], -["2007-01-08",487.69,489.87,482.20,483.58,4754400,483.58], -["2007-01-05",482.50,487.50,478.11,487.19,6872100,487.19], -["2007-01-04",469.00,483.95,468.35,483.26,7887600,483.26], -["2007-01-03",466.00,476.66,461.11,467.59,7706500,467.59], -["2006-12-29",462.10,464.47,459.86,460.48,2559200,460.48], -["2006-12-28",467.12,468.58,462.25,462.56,3116200,462.56], -["2006-12-27",460.00,468.08,459.10,468.03,4231500,468.03], -["2006-12-26",456.52,459.47,454.59,457.53,2074300,457.53], -["2006-12-22",457.50,458.64,452.73,455.58,3988300,455.58], -["2006-12-21",464.18,465.25,452.34,456.20,6953300,456.20], -["2006-12-20",470.00,471.50,462.33,462.90,4367800,462.90], -["2006-12-19",461.72,469.31,458.50,468.63,6587000,468.63], -["2006-12-18",482.51,482.74,460.72,462.80,8016600,462.80], -["2006-12-15",482.64,484.11,479.84,480.30,5190800,480.30], -["2006-12-14",480.25,483.75,477.26,482.12,4748900,482.12], -["2006-12-13",484.69,485.50,477.02,478.99,4662100,478.99], -["2006-12-12",483.85,486.36,480.28,481.78,4181000,481.78], -["2006-12-11",484.92,488.90,483.80,483.93,3263400,483.93], -["2006-12-08",481.94,488.60,480.00,484.11,3974900,484.11], -["2006-12-07",490.23,491.80,482.42,482.64,4664300,482.64], -["2006-12-06",486.96,492.40,484.52,488.71,4450300,488.71], -["2006-12-05",487.40,489.44,484.89,487.00,4103000,487.00], -["2006-12-04",483.00,487.43,479.35,484.85,4899900,484.85], -["2006-12-01",485.98,488.39,478.50,480.80,5631400,480.80], -["2006-11-30",484.19,490.40,481.55,484.81,5577500,484.81], -["2006-11-29",494.24,494.74,482.25,484.65,6315300,484.65], -["2006-11-28",481.13,489.86,477.03,489.50,7797600,489.50], -["2006-11-27",501.37,501.78,484.75,484.75,7324700,484.75], -["2006-11-24",504.50,507.50,504.00,505.00,1732700,505.00], -["2006-11-22",510.97,513.00,505.78,508.01,4500700,508.01], -["2006-11-21",496.54,510.00,495.83,509.65,8427500,509.65], -["2006-11-20",498.40,498.40,492.65,495.05,5124500,495.05], -["2006-11-17",493.25,499.66,493.00,498.79,5511000,498.79], -["2006-11-16",495.00,497.68,492.56,495.90,5092600,495.90], -["2006-11-15",493.43,499.85,491.93,491.93,8370700,491.93], -["2006-11-14",480.70,489.95,480.50,489.30,7223400,489.30], -["2006-11-13",474.90,481.17,474.14,481.03,4341900,481.03], -["2006-11-10",473.78,474.72,470.29,473.55,2796700,473.55], -["2006-11-09",476.50,479.49,471.86,472.63,4879200,472.63], -["2006-11-08",470.35,481.74,468.60,475.00,7965000,475.00], -["2006-11-07",476.95,479.02,471.77,472.57,4897100,472.57], -["2006-11-06",473.77,479.66,472.33,476.95,4991500,476.95], -["2006-11-03",472.23,473.75,465.06,471.80,4907700,471.80], -["2006-11-02",467.50,473.73,466.38,469.91,5236700,469.91], -["2006-11-01",478.76,479.13,465.26,467.50,5426300,467.50], -["2006-10-31",478.06,482.16,473.84,476.39,6285400,476.39], -["2006-10-30",474.82,480.46,470.01,476.57,6563100,476.57], -["2006-10-27",483.90,485.24,472.49,475.20,6604000,475.20], -["2006-10-26",487.68,491.96,484.20,485.10,7031700,485.10], -["2006-10-25",477.49,488.50,475.11,486.60,9187500,486.60], -["2006-10-24",476.28,477.86,471.41,473.31,8660200,473.31], -["2006-10-23",462.28,484.64,460.37,480.78,15104500,480.78], -["2006-10-20",458.99,460.10,453.59,459.67,11647900,459.67], -["2006-10-19",420.23,429.50,419.57,426.06,11503500,426.06], -["2006-10-18",422.99,424.75,417.50,419.31,6017300,419.31], -["2006-10-17",420.30,423.75,416.70,420.64,5211000,420.64], -["2006-10-16",427.70,429.20,421.34,421.75,4319400,421.75], -["2006-10-13",427.76,429.50,425.56,427.30,3622500,427.30], -["2006-10-12",428.56,429.68,424.00,427.44,4844000,427.44], -["2006-10-11",425.02,429.91,423.76,426.50,5635400,426.50], -["2006-10-10",431.56,437.85,422.39,426.65,9788600,426.65], -["2006-10-09",424.80,431.95,423.42,429.00,7583300,429.00], -["2006-10-06",410.22,421.91,409.75,420.50,7336500,420.50], -["2006-10-05",414.70,418.24,410.86,411.81,5789800,411.81], -["2006-10-04",404.97,415.77,403.05,415.70,6661800,415.70], -["2006-10-03",401.29,406.46,398.19,404.04,5464700,404.04], -["2006-10-02",401.90,406.00,400.80,401.44,3651900,401.44], -["2006-09-29",405.13,405.62,401.41,401.90,3310900,401.90], -["2006-09-28",404.08,406.98,400.54,403.58,5107400,403.58], -["2006-09-27",406.30,411.22,402.37,402.92,5876700,402.92], -["2006-09-26",405.50,407.68,401.77,406.87,5289400,406.87], -["2006-09-25",405.58,409.45,402.50,403.98,5737300,403.98], -["2006-09-22",404.98,407.45,401.36,403.78,4649600,403.78], -["2006-09-21",400.30,408.45,399.86,406.85,10692100,406.85], -["2006-09-20",407.10,407.39,394.62,397.00,9147800,397.00], -["2006-09-19",415.46,415.49,392.74,403.81,14292900,403.81], -["2006-09-18",410.00,418.69,409.47,414.69,7106700,414.69], -["2006-09-15",407.48,410.05,406.74,409.88,7838200,409.88], -["2006-09-14",404.30,406.28,401.93,403.98,5366100,403.98], -["2006-09-13",395.15,406.76,395.10,406.57,9768200,406.57], -["2006-09-12",385.00,392.73,384.88,391.90,5442200,391.90], -["2006-09-11",378.26,384.69,377.77,384.09,4529200,384.09], -["2006-09-08",376.72,380.79,376.72,377.85,3083400,377.85], -["2006-09-07",379.39,381.75,377.40,378.49,3842000,378.49], -["2006-09-06",382.10,383.19,379.66,380.14,3724100,380.14], -["2006-09-05",379.87,385.40,377.44,384.36,4074300,384.36], -["2006-09-01",380.99,381.28,377.19,378.60,2672900,378.60], -["2006-08-31",381.49,382.15,378.20,378.53,2959900,378.53], -["2006-08-30",379.21,384.65,378.51,380.75,4044400,380.75], -["2006-08-29",380.78,382.32,377.20,378.95,4460000,378.95], -["2006-08-28",375.61,380.95,375.00,380.95,4164000,380.95], -["2006-08-25",373.08,375.32,372.50,373.26,2466700,373.26], -["2006-08-24",374.44,376.40,372.26,373.73,3482500,373.73], -["2006-08-23",377.64,378.27,372.66,373.43,3642300,373.43], -["2006-08-22",377.73,379.26,374.84,378.29,4164100,378.29], -["2006-08-21",378.10,379.00,375.22,377.30,4023300,377.30], -["2006-08-18",386.31,387.09,380.75,383.36,4952200,383.36], -["2006-08-17",386.39,390.00,383.92,385.80,5080200,385.80], -["2006-08-16",383.48,388.45,382.12,387.72,5853200,387.72], -["2006-08-15",374.11,381.67,372.60,380.97,6698200,380.97], -["2006-08-14",371.50,375.13,368.67,369.43,4968300,369.43], -["2006-08-11",374.40,375.28,368.00,368.50,3766500,368.50], -["2006-08-10",373.88,377.67,372.46,374.20,4261900,374.20], -["2006-08-09",382.80,384.68,376.36,376.94,4311000,376.94], -["2006-08-08",382.82,384.50,379.09,381.00,5743200,381.00], -["2006-08-07",371.50,379.73,371.15,377.95,3946900,377.95], -["2006-08-04",379.56,380.68,371.75,373.85,5095200,373.85], -["2006-08-03",364.98,377.91,363.36,375.39,6327000,375.39], -["2006-08-02",375.60,377.17,365.20,367.23,7097800,367.23], -["2006-08-01",385.11,385.77,375.51,375.51,5463200,375.51], -["2006-07-31",388.00,389.17,383.31,386.60,4595300,386.60], -["2006-07-28",382.00,389.56,381.73,388.12,4083600,388.12], -["2006-07-27",387.37,387.49,377.95,382.40,5641100,382.40], -["2006-07-26",388.20,391.91,383.00,385.50,5531900,385.50], -["2006-07-25",385.02,391.31,383.80,389.36,5761100,389.36], -["2006-07-24",392.82,393.89,381.21,390.90,8086100,390.90], -["2006-07-21",386.14,391.75,377.69,390.11,11754600,390.11], -["2006-07-20",404.28,404.44,385.66,387.12,12538700,387.12], -["2006-07-19",395.01,401.14,394.66,399.00,8518500,399.00], -["2006-07-18",409.75,410.57,397.74,403.05,8536800,403.05], -["2006-07-17",404.63,411.00,403.72,407.89,5811900,407.89], -["2006-07-14",410.33,411.49,398.61,403.50,7552100,403.50], -["2006-07-13",414.00,418.34,406.83,408.83,6924500,408.83], -["2006-07-12",422.09,422.74,416.73,417.25,4906700,417.25], -["2006-07-11",418.51,425.05,413.03,424.56,5971300,424.56], -["2006-07-10",423.44,425.23,416.38,418.20,4436400,418.20], -["2006-07-07",426.05,427.89,415.88,420.45,6041900,420.45], -["2006-07-06",423.38,425.38,421.98,423.19,3687100,423.19], -["2006-07-05",421.52,422.80,415.64,421.46,4985600,421.46], -["2006-07-03",420.04,423.77,419.45,423.20,2156700,423.20], -["2006-06-30",415.60,419.33,412.33,419.33,6258000,419.33], -["2006-06-29",407.99,418.20,405.82,417.81,6658200,417.81], -["2006-06-28",404.01,406.48,401.13,406.11,3710500,406.11], -["2006-06-27",405.71,408.00,401.01,402.32,4107100,402.32], -["2006-06-26",406.75,408.30,403.25,404.22,3551200,404.22], -["2006-06-23",402.76,409.75,400.74,404.86,5314800,404.86], -["2006-06-22",401.58,406.00,388.00,399.95,5911900,399.95], -["2006-06-21",391.06,404.00,389.75,402.13,8744400,402.13], -["2006-06-20",388.03,391.87,386.51,387.17,4039900,387.17], -["2006-06-19",390.85,394.80,386.98,388.14,7633100,388.14], -["2006-06-16",389.10,390.93,388.00,390.70,5304600,390.70], -["2006-06-15",386.62,392.25,383.00,391.00,6785700,391.00], -["2006-06-14",389.83,391.10,378.52,384.39,7772000,384.39], -["2006-06-13",380.90,387.00,378.12,386.52,7659100,386.52], -["2006-06-12",388.34,390.49,381.00,381.54,5019100,381.54], -["2006-06-09",392.19,395.43,385.35,386.57,6157500,386.57], -["2006-06-08",387.75,394.27,378.59,393.30,10359500,393.30], -["2006-06-07",393.24,394.86,386.50,386.51,8911300,386.51], -["2006-06-06",376.58,390.00,376.30,389.99,10259800,389.99], -["2006-06-05",376.18,381.45,374.15,374.44,5558500,374.44], -["2006-06-02",386.84,387.08,377.45,379.44,6386400,379.44], -["2006-06-01",373.54,382.99,371.60,382.62,6278000,382.62], -["2006-05-31",373.80,378.25,366.78,371.82,7981300,371.82], -["2006-05-30",378.28,381.00,371.45,371.94,4316000,371.94], -["2006-05-26",384.55,385.88,380.03,381.35,3667000,381.35], -["2006-05-25",379.08,383.00,372.31,382.99,8194600,382.99], -["2006-05-24",377.35,383.44,371.61,381.25,9553800,381.25], -["2006-05-23",374.21,383.88,373.56,375.58,8983000,375.58], -["2006-05-22",367.85,373.03,365.25,370.95,8604400,370.95], -["2006-05-19",373.28,374.50,360.57,370.02,11398200,370.02], -["2006-05-18",378.78,381.81,370.71,370.99,5835000,370.99], -["2006-05-17",370.61,379.84,370.22,374.50,10643800,374.50], -["2006-05-16",375.99,376.86,369.89,371.30,6491100,371.30], -["2006-05-15",375.93,380.15,368.25,376.20,8590100,376.20], -["2006-05-12",383.54,384.87,373.55,374.13,10087600,374.13], -["2006-05-11",403.42,404.71,384.98,387.00,8892800,387.00], -["2006-05-10",408.31,411.71,401.86,402.98,6187200,402.98], -["2006-05-09",395.70,409.00,393.75,408.80,9140600,408.80], -["2006-05-08",395.11,397.12,390.05,394.78,5118600,394.78], -["2006-05-05",397.60,400.68,391.78,394.30,6065000,394.30], -["2006-05-04",395.03,398.87,392.21,394.75,4652000,394.75], -["2006-05-03",396.35,401.50,390.88,394.17,8072200,394.17], -["2006-05-02",401.08,402.49,388.40,394.80,13104300,394.80], -["2006-05-01",418.47,419.44,398.55,398.90,10361200,398.90], -["2006-04-28",418.63,425.73,416.30,417.94,7421300,417.94], -["2006-04-27",422.91,426.91,419.39,420.03,8337900,420.03], -["2006-04-26",427.74,430.04,423.53,425.97,7277800,425.97], -["2006-04-25",439.63,441.04,426.00,427.16,9569000,427.16], -["2006-04-24",439.40,444.70,436.52,440.50,8836400,440.50], -["2006-04-21",448.90,450.72,436.17,437.10,22551300,437.10], -["2006-04-20",411.01,416.00,408.20,415.00,12271500,415.00], -["2006-04-19",412.57,413.64,406.73,410.50,6781700,410.50], -["2006-04-18",407.93,409.83,401.50,404.24,8137600,404.24], -["2006-04-17",403.45,412.50,400.84,406.82,8259500,406.82], -["2006-04-13",408.63,409.76,400.50,402.16,6552900,402.16], -["2006-04-12",409.00,411.33,405.19,408.95,6017000,408.95], -["2006-04-11",416.42,419.10,406.22,409.66,11107200,409.66], -["2006-04-10",407.08,417.17,405.25,416.38,9320100,416.38], -["2006-04-07",412.41,412.85,404.02,406.16,7025900,406.16], -["2006-04-06",406.49,413.89,405.43,411.18,8598500,411.18], -["2006-04-05",408.20,414.57,402.82,407.99,13410500,407.99], -["2006-04-04",389.90,404.90,388.14,404.34,15715700,404.34], -["2006-04-03",389.53,392.47,387.93,389.70,8122700,389.70], -["2006-03-31",388.74,391.87,384.03,390.00,36521400,390.00], -["2006-03-30",389.19,393.50,383.61,388.44,14711700,388.44], -["2006-03-29",379.94,399.00,379.51,394.98,19027500,394.98], -["2006-03-28",371.71,377.86,371.17,377.20,8945800,377.20], -["2006-03-27",367.09,371.71,365.00,369.69,7023700,369.69], -["2006-03-24",368.62,370.09,362.51,365.80,15180600,365.80], -["2006-03-23",342.35,345.75,340.20,341.89,7434700,341.89], -["2006-03-22",339.75,344.10,337.50,340.22,7596000,340.22], -["2006-03-21",350.01,351.66,339.08,339.92,9831100,339.92], -["2006-03-20",342.34,350.09,341.54,348.19,10407600,348.19], -["2006-03-17",338.80,341.78,334.93,339.79,8551700,339.79], -["2006-03-16",348.61,348.75,337.90,338.77,10016700,338.77], -["2006-03-15",350.77,352.30,340.53,344.50,12768800,344.50], -["2006-03-14",337.14,352.37,332.62,351.16,18450700,351.16], -["2006-03-13",340.93,346.10,335.45,337.06,13642400,337.06], -["2006-03-10",343.50,344.50,331.55,337.50,19325600,337.50], -["2006-03-09",355.39,358.53,341.50,343.00,13910400,343.00], -["2006-03-08",353.93,360.03,350.54,353.88,11745600,353.88], -["2006-03-07",365.02,368.45,358.15,364.45,10378800,364.45], -["2006-03-06",380.91,383.40,367.14,368.10,8939700,368.10], -["2006-03-03",384.30,387.24,375.76,378.18,11962000,378.18], -["2006-03-02",364.28,381.10,362.20,376.45,18330300,376.45], -["2006-03-01",368.56,369.45,361.30,364.80,12061200,364.80], -["2006-02-28",393.20,397.54,338.51,362.62,39437600,362.62], -["2006-02-27",381.27,391.70,380.28,390.38,10212200,390.38], -["2006-02-24",377.30,380.07,373.49,377.40,6484300,377.40], -["2006-02-23",365.61,381.24,365.39,378.07,12551600,378.07], -["2006-02-22",367.15,368.95,363.86,365.49,6476200,365.49], -["2006-02-21",366.44,373.54,365.11,366.59,8686000,366.59], -["2006-02-17",369.86,372.14,363.62,368.75,14320200,368.75], -["2006-02-16",345.67,367.00,344.49,366.46,21315500,366.46], -["2006-02-15",341.27,346.00,337.83,342.38,12947000,342.38], -["2006-02-14",345.33,351.69,342.40,343.32,14654000,343.32], -["2006-02-13",346.64,350.60,341.89,345.70,19717800,345.70], -["2006-02-10",361.95,364.50,353.14,362.61,15223500,362.61], -["2006-02-09",371.20,374.40,356.11,358.77,11912400,358.77], -["2006-02-08",368.48,370.69,354.67,369.08,20804100,369.08], -["2006-02-07",382.99,383.70,363.35,367.92,16630200,367.92], -["2006-02-06",385.31,389.90,379.56,385.10,8940400,385.10], -["2006-02-03",393.62,393.90,372.57,381.55,18281800,381.55], -["2006-02-02",403.82,406.50,395.98,396.04,11807700,396.04], -["2006-02-01",389.03,402.00,387.52,401.78,27122500,401.78], -["2006-01-31",430.57,439.60,423.97,432.66,22066000,432.66], -["2006-01-30",429.23,433.28,425.00,426.82,8588900,426.82], -["2006-01-27",435.00,438.22,428.98,433.49,8452200,433.49], -["2006-01-26",439.54,439.99,423.56,434.27,12926100,434.27], -["2006-01-25",451.26,454.23,429.22,433.00,18739800,433.00], -["2006-01-24",436.03,444.95,434.48,443.03,15464600,443.03], -["2006-01-23",407.38,428.39,405.73,427.50,22741400,427.50], -["2006-01-20",438.70,440.03,394.74,399.46,41116700,399.46], -["2006-01-19",451.17,453.49,433.00,436.45,14537300,436.45], -["2006-01-18",447.30,457.36,443.25,444.91,20485700,444.91], -["2006-01-17",463.06,469.90,462.53,467.11,8270300,467.11], -["2006-01-13",464.31,466.89,461.61,466.25,7656600,466.25], -["2006-01-12",473.72,474.99,461.50,463.63,10125300,463.63], -["2006-01-11",471.27,475.11,469.18,471.63,9007400,471.63], -["2006-01-10",464.42,470.25,462.04,469.76,9097100,469.76], -["2006-01-09",466.41,473.40,460.94,466.90,12791900,466.90], -["2006-01-06",456.87,470.50,453.24,465.66,17756900,465.66], -["2006-01-05",446.00,451.55,441.50,451.24,10808300,451.24], -["2006-01-04",443.90,448.96,439.75,445.24,15286400,445.24], -["2006-01-03",422.52,435.67,418.22,435.23,13121200,435.23], -["2005-12-30",417.27,418.21,413.74,414.86,7587100,414.86], -["2005-12-29",427.98,428.73,419.17,420.15,6945800,420.15], -["2005-12-28",424.34,427.78,421.26,426.69,7117900,426.69], -["2005-12-27",431.86,431.86,422.76,424.64,6702800,424.64], -["2005-12-23",432.15,432.50,428.78,430.93,4595100,430.93], -["2005-12-22",431.77,432.86,425.93,432.04,7546600,432.04], -["2005-12-21",433.55,436.86,420.71,426.33,11221900,426.33], -["2005-12-20",427.86,432.20,424.67,429.74,10084700,429.74], -["2005-12-19",432.20,446.21,420.11,424.60,21936800,424.60], -["2005-12-16",425.34,432.50,422.75,430.15,16330500,430.15], -["2005-12-15",419.11,423.14,416.50,422.55,6045800,422.55], -["2005-12-14",417.04,419.73,415.49,418.96,6630400,418.96], -["2005-12-13",412.50,418.00,411.64,417.49,8157000,417.49], -["2005-12-12",414.63,415.21,409.95,412.61,6950100,412.61], -["2005-12-09",415.00,415.78,408.56,409.20,7643400,409.20], -["2005-12-08",405.30,410.65,402.64,410.65,8910100,410.65], -["2005-12-07",406.16,406.70,399.01,404.22,11665900,404.22], -["2005-12-06",408.70,416.41,401.70,404.54,15114700,404.54], -["2005-12-05",417.00,417.50,404.28,405.85,10289400,405.85], -["2005-12-02",416.94,419.53,413.86,417.70,7543500,417.70], -["2005-12-01",409.20,415.44,408.29,414.09,9744900,414.09], -["2005-11-30",404.26,408.45,395.56,404.91,15596600,404.91], -["2005-11-29",424.46,426.40,402.14,403.54,21495800,403.54], -["2005-11-28",429.82,431.24,422.44,423.48,11008400,423.48], -["2005-11-25",425.78,428.75,425.30,428.62,4840100,428.62], -["2005-11-23",417.04,424.72,415.78,422.86,10085000,422.86], -["2005-11-22",408.65,417.31,406.23,416.47,9596000,416.47], -["2005-11-21",399.17,409.98,393.49,409.36,10335100,409.36], -["2005-11-18",403.49,404.50,399.85,400.21,7025700,400.21], -["2005-11-17",401.80,403.81,399.53,403.45,9212200,403.45], -["2005-11-16",396.20,398.85,394.11,398.15,8695200,398.15], -["2005-11-15",394.38,397.00,390.95,392.80,8624900,392.80], -["2005-11-14",392.12,398.22,391.53,396.97,7807900,396.97], -["2005-11-11",395.12,396.90,388.85,390.40,7063900,390.40], -["2005-11-10",378.36,391.35,377.43,391.10,9128700,391.10], -["2005-11-09",386.67,388.29,378.03,379.15,10466900,379.15], -["2005-11-08",394.25,395.59,388.58,389.90,7897500,389.90], -["2005-11-07",395.10,397.47,392.15,395.03,9591500,395.03], -["2005-11-04",389.98,391.79,385.45,390.43,8824900,390.43], -["2005-11-03",382.41,386.58,381.38,385.95,7448400,385.95], -["2005-11-02",381.70,385.00,377.17,379.68,10565400,379.68], -["2005-11-01",371.86,383.90,369.01,379.38,16356100,379.38], -["2005-10-31",360.24,374.75,359.51,372.14,14342900,372.14], -["2005-10-28",355.27,358.95,355.02,358.17,5903500,358.17], -["2005-10-27",356.60,357.09,351.68,353.06,5134400,353.06], -["2005-10-26",346.28,356.00,346.19,355.44,8907500,355.44], -["2005-10-25",345.78,347.40,342.86,346.91,6878300,346.91], -["2005-10-24",343.37,349.30,342.19,348.65,9431700,348.65], -["2005-10-21",345.80,346.43,333.00,339.90,22892400,339.90], -["2005-10-20",309.99,311.13,301.21,303.20,13911700,303.20], -["2005-10-19",304.00,309.87,303.96,308.70,7010700,308.70], -["2005-10-18",304.96,307.96,302.74,303.28,7077800,303.28], -["2005-10-17",297.50,305.20,294.56,305.00,7566700,305.00], -["2005-10-14",299.90,300.23,292.54,296.14,8519100,296.14], -["2005-10-13",302.00,302.00,290.68,297.44,10567700,297.44], -["2005-10-12",305.20,307.19,299.00,300.97,9306200,300.97], -["2005-10-11",310.61,312.65,304.86,306.10,8542600,306.10], -["2005-10-10",313.31,314.82,309.15,310.65,5572200,310.65], -["2005-10-07",314.79,316.67,310.54,312.99,6770300,312.99], -["2005-10-06",314.14,314.48,310.09,312.75,7993800,312.75], -["2005-10-05",312.69,314.90,308.00,310.71,8328400,310.71], -["2005-10-04",319.95,321.28,310.74,311.00,9144300,311.00], -["2005-10-03",313.63,320.11,312.79,318.68,9160300,318.68], -["2005-09-30",314.22,317.50,312.29,316.46,9151300,316.46], -["2005-09-29",306.68,310.72,306.08,309.62,5613800,309.62], -["2005-09-28",314.22,315.10,305.60,306.00,7997400,306.00], -["2005-09-27",314.95,318.41,313.38,313.94,6873100,313.94], -["2005-09-26",319.50,320.95,312.56,314.28,9894400,314.28], -["2005-09-23",313.00,317.21,312.59,315.36,8483800,315.36], -["2005-09-22",311.50,319.22,310.17,311.37,13006400,311.37], -["2005-09-21",308.41,313.76,305.96,311.90,10119700,311.90], -["2005-09-20",306.15,311.30,305.23,307.91,9351000,307.91], -["2005-09-19",301.00,306.00,300.71,303.79,5761900,303.79], -["2005-09-16",304.02,304.50,299.87,300.20,7579800,300.20], -["2005-09-15",299.52,306.75,297.91,302.62,15466200,302.62], -["2005-09-14",308.73,313.28,300.30,303.00,11275800,303.00], -["2005-09-13",309.00,315.53,306.17,311.68,10299900,311.68], -["2005-09-12",301.75,311.42,301.00,309.74,10386500,309.74], -["2005-09-09",297.28,299.10,296.56,299.09,4390500,299.09], -["2005-09-08",294.83,299.28,293.36,295.39,6613300,295.39], -["2005-09-07",285.89,295.50,285.28,294.87,7499500,294.87], -["2005-09-06",289.00,289.39,286.80,287.11,4212300,287.11], -["2005-09-02",286.51,289.99,286.44,288.45,3434500,288.45], -["2005-09-01",285.91,287.50,285.00,286.25,2742100,286.25], -["2005-08-31",288.23,288.50,284.36,286.00,5034000,286.00], -["2005-08-30",287.39,289.51,285.88,287.27,4792000,287.27], -["2005-08-29",282.24,289.12,282.24,288.45,5903000,288.45], -["2005-08-26",283.48,285.02,282.66,283.58,3755300,283.58], -["2005-08-25",282.55,284.00,279.97,282.59,4376600,282.59], -["2005-08-24",277.57,284.75,276.45,282.57,8593100,282.57], -["2005-08-23",276.16,279.74,274.12,279.58,5821700,279.58], -["2005-08-22",281.24,281.47,273.35,274.01,6813000,274.01], -["2005-08-19",280.99,281.45,279.62,280.00,5542900,280.00], -["2005-08-18",275.91,280.50,275.00,279.99,11872800,279.99], -["2005-08-17",285.51,286.57,284.00,285.10,3883300,285.10], -["2005-08-16",284.88,287.79,283.34,285.65,7109200,285.65], -["2005-08-15",289.80,292.77,283.77,284.00,8174700,284.00], -["2005-08-12",283.36,290.20,281.64,289.72,6585900,289.72], -["2005-08-11",285.89,286.58,280.62,284.05,7514900,284.05], -["2005-08-10",291.30,292.33,284.88,285.68,6879000,285.68], -["2005-08-09",291.96,292.68,288.51,291.57,5779300,291.57], -["2005-08-08",293.60,295.65,290.49,291.25,4481800,291.25], -["2005-08-05",297.50,298.51,291.31,292.35,5939700,292.35], -["2005-08-04",295.55,299.00,295.25,297.73,5236500,297.73], -["2005-08-03",298.00,299.72,295.60,297.30,5930600,297.30], -["2005-08-02",291.60,299.52,291.12,299.19,7290200,299.19], -["2005-08-01",288.12,292.50,288.10,291.61,5662400,291.61], -["2005-07-29",292.14,292.84,286.99,287.76,8363300,287.76], -["2005-07-28",297.41,297.41,293.28,293.50,5925600,293.50], -["2005-07-27",297.74,298.23,292.40,296.93,7217900,296.93], -["2005-07-26",295.01,298.00,292.09,296.09,9816900,296.09], -["2005-07-25",302.39,303.29,294.96,295.85,9658800,295.85], -["2005-07-22",306.37,309.25,296.33,302.40,23386800,302.40], -["2005-07-21",314.05,317.80,311.21,313.94,19789400,313.94], -["2005-07-20",305.57,312.61,301.80,312.00,14310400,312.00], -["2005-07-19",302.10,310.35,301.80,309.90,12621400,309.90], -["2005-07-18",300.00,301.90,297.75,299.54,6207800,299.54], -["2005-07-15",301.24,303.40,299.78,301.19,8438400,301.19], -["2005-07-14",305.34,306.75,300.07,300.89,10667700,300.89], -["2005-07-13",292.51,299.24,292.10,298.86,11437900,298.86], -["2005-07-12",293.39,294.40,290.93,291.78,5864900,291.78], -["2005-07-11",296.40,296.60,291.02,293.35,8390300,293.35], -["2005-07-08",296.25,297.50,294.05,296.23,7457600,296.23], -["2005-07-07",289.39,295.80,288.51,295.54,10672100,295.54], -["2005-07-06",297.30,297.60,291.38,291.52,8000300,291.52], -["2005-07-05",292.10,295.98,290.23,295.71,7494000,295.71], -["2005-07-01",295.04,296.24,289.22,291.25,9227600,291.25], -["2005-06-30",294.34,298.93,291.04,294.15,15094400,294.15], -["2005-06-29",302.50,304.38,292.15,292.72,18298700,292.72], -["2005-06-28",306.28,309.25,302.00,302.00,19036500,302.00], -["2005-06-27",298.90,304.47,293.86,304.10,17802900,304.10], -["2005-06-24",290.90,298.00,289.58,297.25,17771200,297.25], -["2005-06-23",288.00,294.81,286.50,289.71,14056400,289.71], -["2005-06-22",289.67,292.32,288.67,289.30,10474000,289.30], -["2005-06-21",288.07,290.30,284.97,287.84,15132300,287.84], -["2005-06-20",276.09,287.67,271.73,286.70,21024700,286.70], -["2005-06-17",279.00,280.30,275.90,280.30,10434400,280.30], -["2005-06-16",274.26,278.30,273.07,277.44,12462400,277.44], -["2005-06-15",275.00,277.30,267.43,274.80,20883100,274.80], -["2005-06-14",278.59,281.24,277.75,278.35,10091900,278.35], -["2005-06-13",279.82,284.19,276.52,282.75,12803200,282.75], -["2005-06-10",286.99,287.28,280.02,282.50,12696600,282.50], -["2005-06-09",284.72,288.50,280.56,286.31,16441100,286.31], -["2005-06-08",292.85,293.19,278.00,279.56,25700900,279.56], -["2005-06-07",297.10,299.59,290.30,293.12,24323000,293.12], -["2005-06-06",282.39,293.75,281.83,290.94,22525900,290.94], -["2005-06-03",286.79,289.30,277.41,280.26,18782300,280.26], -["2005-06-02",288.73,289.78,284.60,287.90,17974100,287.90], -["2005-06-01",283.20,292.89,282.02,288.00,35191700,288.00], -["2005-05-31",269.43,278.40,269.37,277.27,22236800,277.27], -["2005-05-27",260.46,266.05,259.25,266.00,12184100,266.00], -["2005-05-26",260.96,263.76,258.30,259.20,13546600,259.20], -["2005-05-25",252.73,260.98,250.63,260.81,18057900,260.81], -["2005-05-24",256.96,265.44,253.50,256.00,29043100,256.00], -["2005-05-23",243.16,258.10,242.71,255.45,21388300,255.45], -["2005-05-20",241.21,241.67,239.65,241.61,8163500,241.61], -["2005-05-19",240.34,241.17,238.27,239.18,9716500,239.18], -["2005-05-18",233.61,239.97,233.52,239.16,12312000,239.16], -["2005-05-17",230.56,233.45,230.20,233.13,7808900,233.13], -["2005-05-16",229.68,231.62,228.57,231.05,5681400,231.05], -["2005-05-13",229.18,231.09,227.32,229.24,7415500,229.24], -["2005-05-12",230.81,232.23,228.20,228.72,8948200,228.72], -["2005-05-11",228.97,231.98,227.93,231.29,11478800,231.29], -["2005-05-10",225.47,227.80,224.72,227.80,6345800,227.80], -["2005-05-09",228.00,228.50,225.43,226.02,5536800,226.02], -["2005-05-06",228.40,229.25,226.47,228.02,6763900,228.02], -["2005-05-05",228.62,228.62,225.88,226.98,7509600,226.98], -["2005-05-04",227.23,229.88,227.00,228.50,12083500,228.50], -["2005-05-03",221.85,228.15,221.32,226.19,17780200,226.19], -["2005-05-02",222.05,223.70,220.21,222.29,9767400,222.29], -["2005-04-29",221.91,222.25,217.82,220.00,9170200,220.00], -["2005-04-28",219.50,222.08,217.71,219.45,8682800,219.45], -["2005-04-27",217.99,220.85,216.74,219.78,10264800,219.78], -["2005-04-26",220.22,222.00,218.29,218.75,17272000,218.75], -["2005-04-25",217.82,224.74,217.52,223.53,19840000,223.53], -["2005-04-22",222.90,224.00,214.26,215.81,33205100,215.81], -["2005-04-21",200.42,205.00,199.32,204.22,17751900,204.22], -["2005-04-20",198.58,200.50,195.91,198.10,15451500,198.10], -["2005-04-19",189.33,192.00,188.03,191.40,8430000,191.40], -["2005-04-18",184.58,187.88,183.49,186.97,6550300,186.97], -["2005-04-15",190.10,190.34,184.66,185.00,11577400,185.00], -["2005-04-14",193.27,194.36,190.10,191.45,6152700,191.45], -["2005-04-13",193.47,194.32,189.73,192.93,6555800,192.93], -["2005-04-12",193.00,194.42,189.41,193.96,7319600,193.96], -["2005-04-11",193.09,194.80,192.32,193.23,5410500,193.23], -["2005-04-08",193.69,195.10,191.45,192.05,5116600,192.05], -["2005-04-07",188.78,194.62,188.64,193.76,9692200,193.76], -["2005-04-06",189.24,189.65,187.58,189.22,5252600,189.22], -["2005-04-05",187.73,190.26,187.57,188.57,8736700,188.57], -["2005-04-04",179.95,185.32,179.84,185.29,8076400,185.29], -["2005-04-01",181.76,182.95,179.99,180.04,6182000,180.04], -["2005-03-31",177.95,181.39,177.64,180.51,6768600,180.51], -["2005-03-30",180.64,181.45,179.60,180.45,6236100,180.45], -["2005-03-29",181.05,183.28,178.07,179.57,6473000,179.57], -["2005-03-28",181.68,184.80,180.95,181.42,8738000,181.42], -["2005-03-24",180.70,180.86,179.20,179.25,3705200,179.25], -["2005-03-23",177.97,180.24,177.97,178.98,4845000,178.98], -["2005-03-22",181.18,181.94,177.85,178.60,5631700,178.60], -["2005-03-21",179.27,182.17,177.25,180.88,7483700,180.88], -["2005-03-18",178.81,180.40,178.31,180.04,7090000,180.04], -["2005-03-17",177.13,179.64,175.80,179.29,8260600,179.29], -["2005-03-16",176.70,178.61,175.01,175.60,7106300,175.60], -["2005-03-15",175.30,180.00,174.21,178.61,10422100,178.61], -["2005-03-14",178.33,178.40,172.57,174.99,11146600,174.99], -["2005-03-11",180.44,180.95,177.15,177.80,8028300,177.80], -["2005-03-10",181.01,181.20,177.40,179.98,10960500,179.98], -["2005-03-09",184.21,184.65,180.16,181.35,11360400,181.35], -["2005-03-08",189.10,189.85,184.97,185.20,8046100,185.20], -["2005-03-07",187.78,189.60,187.03,188.81,8667400,188.81], -["2005-03-04",186.70,187.25,185.07,185.90,6774100,185.90], -["2005-03-03",186.13,187.75,184.31,187.01,7608600,187.01], -["2005-03-02",185.95,187.67,184.36,185.18,7285500,185.18], -["2005-03-01",189.29,189.75,182.00,186.06,9311200,186.06], -["2005-02-28",186.00,189.87,185.85,187.99,7818400,187.99], -["2005-02-25",189.15,189.92,185.51,185.87,9973500,185.87], -["2005-02-24",183.37,189.85,182.23,188.89,25814300,188.89], -["2005-02-23",193.30,194.48,188.66,193.95,15586000,193.95], -["2005-02-22",196.50,198.90,190.39,191.37,13483700,191.37], -["2005-02-18",198.51,198.84,196.66,197.95,8485900,197.95], -["2005-02-17",197.83,199.75,196.81,197.90,10414400,197.90], -["2005-02-16",194.70,199.33,194.30,198.41,16532300,198.41], -["2005-02-15",193.60,199.84,193.08,195.23,25782800,195.23], -["2005-02-14",182.85,193.08,181.00,192.99,38562200,192.99], -["2005-02-11",186.66,192.32,186.07,187.40,13116000,187.40], -["2005-02-10",191.97,192.21,185.25,187.98,18982700,187.98], -["2005-02-09",200.76,201.60,189.46,191.58,17171500,191.58], -["2005-02-08",196.96,200.02,194.53,198.64,11480000,198.64], -["2005-02-07",205.26,206.40,195.51,196.03,12960400,196.03], -["2005-02-04",206.47,207.75,202.60,204.36,14819300,204.36], -["2005-02-03",205.99,213.37,205.81,210.86,12988100,210.86], -["2005-02-02",215.55,216.80,203.66,205.96,32799300,205.96], -["2005-02-01",194.38,196.66,190.63,191.90,18839000,191.90], -["2005-01-31",193.69,196.36,191.72,195.62,9596700,195.62], -["2005-01-28",190.02,194.70,186.34,190.34,12208200,190.34], -["2005-01-27",188.76,188.86,185.20,188.08,6627400,188.08], -["2005-01-26",179.27,189.41,179.15,189.24,12307900,189.24], -["2005-01-25",181.94,182.24,176.29,177.12,10659200,177.12], -["2005-01-24",188.69,189.33,180.32,180.72,14022700,180.72], -["2005-01-21",194.54,195.36,188.12,188.28,9258400,188.28], -["2005-01-20",192.50,196.25,192.00,193.92,9001600,193.92], -["2005-01-19",204.65,205.30,196.71,197.30,11257700,197.30], -["2005-01-18",200.97,205.02,198.66,203.90,13172600,203.90], -["2005-01-14",196.00,200.01,194.13,199.97,9640300,199.97], -["2005-01-13",195.38,197.39,194.05,195.33,6849400,195.33], -["2005-01-12",194.33,195.93,190.50,195.38,8177800,195.38], -["2005-01-11",195.62,197.71,193.18,193.54,6958700,193.54], -["2005-01-10",194.50,198.10,191.83,195.06,7539600,195.06], -["2005-01-07",190.64,194.25,188.78,193.85,9662900,193.85], -["2005-01-06",195.08,195.90,187.72,188.55,10387100,188.55], -["2005-01-05",193.45,196.90,192.23,193.51,8236600,193.51], -["2005-01-04",201.40,202.93,193.48,194.50,13755900,194.50], -["2005-01-03",197.40,203.64,195.46,202.71,15844200,202.71], -["2004-12-31",199.23,199.88,192.56,192.79,7668500,192.79], -["2004-12-30",192.97,198.23,191.85,197.60,5904300,197.60], -["2004-12-29",191.78,193.52,191.78,192.90,2678100,192.90], -["2004-12-28",192.11,193.55,191.01,192.76,4145800,192.76], -["2004-12-27",189.15,193.30,189.10,191.91,6104100,191.91], -["2004-12-23",187.45,188.60,186.00,187.90,3614600,187.90], -["2004-12-22",183.90,186.85,183.01,186.30,3907000,186.30], -["2004-12-21",186.31,187.88,183.40,183.75,5516300,183.75], -["2004-12-20",182.00,188.46,181.87,185.02,9834500,185.02], -["2004-12-17",176.76,180.50,176.55,180.08,7386200,180.08], -["2004-12-16",176.95,180.49,175.95,176.47,8572800,176.47], -["2004-12-15",177.99,180.69,176.66,179.78,11471000,179.78], -["2004-12-14",171.00,178.82,169.60,178.69,11088400,178.69], -["2004-12-13",172.17,173.18,169.45,170.45,4818600,170.45], -["2004-12-10",173.43,174.88,171.29,171.65,4317200,171.65], -["2004-12-09",170.25,173.50,168.47,173.43,7654000,173.43], -["2004-12-08",170.35,173.68,168.73,169.98,7541800,169.98], -["2004-12-07",176.00,176.20,170.55,171.43,6870900,171.43], -["2004-12-06",179.13,180.70,176.02,176.29,6254000,176.29], -["2004-12-03",179.95,181.06,177.60,180.40,5869200,180.40], -["2004-12-02",179.90,181.51,178.55,179.40,6260900,179.40], -["2004-12-01",181.95,182.50,179.55,179.96,7864100,179.96], -["2004-11-30",180.71,183.00,180.25,181.98,7700000,181.98], -["2004-11-29",180.36,182.95,177.51,181.05,10666600,181.05], -["2004-11-26",175.80,180.03,175.32,179.39,6480100,179.39], -["2004-11-24",174.82,177.21,172.51,174.76,15281000,174.76], -["2004-11-23",167.97,170.83,166.50,167.52,12413300,167.52], -["2004-11-22",164.47,169.50,161.31,165.10,12368200,165.10], -["2004-11-19",169.10,169.98,166.52,169.40,8769300,169.40], -["2004-11-18",170.29,174.42,165.73,167.54,16629600,167.54], -["2004-11-17",169.02,177.50,169.00,172.50,18132900,172.50], -["2004-11-16",177.50,179.47,170.83,172.54,20917400,172.54], -["2004-11-15",180.45,188.32,178.75,184.87,11901500,184.87], -["2004-11-12",185.23,189.80,177.40,182.00,16746100,182.00], -["2004-11-11",169.13,183.75,167.57,183.02,14985500,183.02], -["2004-11-10",170.67,172.52,166.33,167.86,10644000,167.86], -["2004-11-09",174.10,175.20,165.27,168.70,11064200,168.70], -["2004-11-08",170.93,175.44,169.40,172.55,11191800,172.55], -["2004-11-05",181.98,182.30,168.55,169.35,19833100,169.35], -["2004-11-04",188.44,190.40,183.35,184.70,14409600,184.70], -["2004-11-03",198.18,201.60,190.75,191.67,13888700,191.67], -["2004-11-02",198.78,199.25,193.34,194.87,11346300,194.87], -["2004-11-01",193.55,197.67,191.27,196.03,12224900,196.03], -["2004-10-29",198.89,199.95,190.60,190.64,21162500,190.64], -["2004-10-28",186.68,194.39,185.60,193.30,14846800,193.30], -["2004-10-27",182.72,189.52,181.77,185.97,13356500,185.97], -["2004-10-26",186.34,192.64,180.00,181.80,22307100,181.80], -["2004-10-25",176.40,194.43,172.55,187.40,32764200,187.40], -["2004-10-22",170.54,180.17,164.08,172.43,36891900,172.43], -["2004-10-21",144.40,150.13,141.62,149.38,14589500,149.38], -["2004-10-20",148.03,148.99,139.60,140.49,11372700,140.49], -["2004-10-19",150.50,152.40,147.35,147.94,9064000,147.94], -["2004-10-18",143.20,149.20,141.21,149.16,7025200,149.16], -["2004-10-15",144.93,145.50,141.95,144.11,6604000,144.11], -["2004-10-14",141.01,142.38,138.56,142.00,5226300,142.00], -["2004-10-13",143.32,143.55,140.08,140.90,9893000,140.90], -["2004-10-12",134.44,137.61,133.40,137.40,5838600,137.40], -["2004-10-11",137.00,138.86,133.85,135.26,5241300,135.26], -["2004-10-08",138.72,139.68,137.02,137.73,5540300,137.73], -["2004-10-07",136.92,139.88,136.55,138.85,7064600,138.85], -["2004-10-06",137.55,138.45,136.00,137.08,6697400,137.08], -["2004-10-05",134.66,138.53,132.24,138.37,7494100,138.37], -["2004-10-04",135.25,136.87,134.03,135.06,6517900,135.06], -["2004-10-01",130.80,134.24,128.90,132.58,7570000,132.58], -["2004-09-30",129.90,132.30,129.00,129.60,6885900,129.60], -["2004-09-29",126.70,135.02,126.23,131.08,15273500,131.08], -["2004-09-28",121.30,127.40,120.21,126.86,8473000,126.86], -["2004-09-27",119.56,120.88,117.80,118.26,3536600,118.26], -["2004-09-24",120.94,124.10,119.76,119.83,4566300,119.83], -["2004-09-23",118.84,122.63,117.02,120.82,4272100,120.82], -["2004-09-22",117.40,119.67,116.81,118.38,3794400,118.38], -["2004-09-21",119.81,120.42,117.51,117.84,3618000,117.84], -["2004-09-20",116.95,121.60,116.77,119.36,5319700,119.36], -["2004-09-17",114.42,117.49,113.55,117.49,4741000,117.49], -["2004-09-16",112.34,115.80,111.65,113.97,4637800,113.97], -["2004-09-15",110.56,114.23,110.20,112.00,5361900,112.00], -["2004-09-14",107.45,112.00,106.79,111.49,5419900,111.49], -["2004-09-13",106.63,108.41,106.46,107.50,3926000,107.50], -["2004-09-10",101.60,106.56,101.30,105.33,4353800,105.33], -["2004-09-09",102.53,102.71,101.00,102.31,2032900,102.31], -["2004-09-08",100.74,103.03,100.50,102.30,2495300,102.30], -["2004-09-07",101.01,102.00,99.61,101.58,2926700,101.58], -["2004-09-03",100.95,101.74,99.32,100.01,2578800,100.01], -["2004-09-02",99.19,102.37,98.94,101.51,7566900,101.51], -["2004-09-01",102.70,102.97,99.67,100.25,4573700,100.25], -["2004-08-31",102.30,103.71,102.16,102.37,2461400,102.37], -["2004-08-30",105.28,105.49,102.01,102.01,2601000,102.01], -["2004-08-27",108.10,108.62,105.69,106.15,3109000,106.15], -["2004-08-26",104.95,107.95,104.66,107.91,3551000,107.91], -["2004-08-25",104.96,108.00,103.88,106.00,4598900,106.00], -["2004-08-24",111.24,111.60,103.57,104.87,7631300,104.87], -["2004-08-23",110.75,113.48,109.05,109.40,9137200,109.40], -["2004-08-20",101.01,109.08,100.50,108.31,11428600,108.31], -["2004-08-19",100.00,104.06,95.96,100.34,22351900,100.34] -]; \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/examples/yahooData.min.js b/libreplan-webapp/src/main/webapp/jqplot/examples/yahooData.min.js deleted file mode 100644 index 11da48a80..000000000 --- a/libreplan-webapp/src/main/webapp/jqplot/examples/yahooData.min.js +++ /dev/null @@ -1 +0,0 @@ -var yahoo=[["2011-10-18",580.19,592.56,577.4,590.51,3800800,590.51],["2011-10-17",583.72,591.83,578,582.41,4008200,582.41],["2011-10-14",599.47,599.6,587.57,591.68,8529900,591.68],["2011-10-13",550.03,559,548.02,558.99,5639600,558.99],["2011-10-12",548.13,555.23,544.63,548.5,3177800,548.5],["2011-10-11",533.46,546.8,533.46,543.18,2853400,543.18],["2011-10-10",525.18,537.47,523.2,537.17,2322200,537.17],["2011-10-07",516.83,520.5,510.3,515.12,2855900,515.12],["2011-10-06",507.5,515.23,502.6,514.71,3424300,514.71],["2011-10-05",496.35,507.8,480.77,504.7,4534100,504.7],["2011-10-04",490.03,503.44,480.6,501.9,4158800,501.9],["2011-10-03",509.85,512,495,495.52,4474400,495.52],["2011-09-30",520.21,524,514.38,515.04,2723600,515.04],["2011-09-29",536.04,537.3,519.41,527.5,2906600,527.5],["2011-09-28",541.5,544.02,527.7,528.84,2263300,528.84],["2011-09-27",538.2,547.05,536.05,539.34,3010900,539.34],["2011-09-26",527.25,532.93,513.25,531.89,2634200,531.89],["2011-09-23",516.56,526.42,514.5,525.51,2777300,525.51],["2011-09-22",526.25,528.78,514,520.66,4400300,520.66],["2011-09-21",547.69,555,538.86,539.2,2514300,539.2],["2011-09-20",549.4,558.52,542.67,546.63,2779100,546.63],["2011-09-19",540.35,549.9,535.38,546.67,2468400,546.67],["2011-09-16",544.8,546.84,543.14,546.68,3534300,546.68],["2011-09-15",535.5,544.98,534.56,542.56,2960800,542.56],["2011-09-14",532.59,536.95,525.82,532.07,2694400,532.07],["2011-09-13",532,533.88,523.4,529.52,2354200,529.52],["2011-09-12",517.96,531.99,517.5,530.12,2670400,530.12],["2011-09-09",531.4,534.65,521.19,524.85,3268800,524.85],["2011-09-08",533.8,539.1,531.9,534.96,2380500,534.96],["2011-09-07",530.45,535.94,527.4,534.03,2755800,534.03],["2011-09-06",510.8,522.76,510.5,522.18,2715800,522.18],["2011-09-02",524.47,527.92,520.73,524.84,2401200,524.84],["2011-09-01",540.75,543.83,531.22,532.5,2415500,532.5],["2011-08-31",544.74,546.3,536,540.96,2693300,540.96],["2011-08-30",538.19,542.99,530.81,540.7,2989000,540.7],["2011-08-29",534.56,539.45,533.56,539.08,2335800,539.08],["2011-08-26",519.99,530.45,513.14,526.86,3596300,526.86],["2011-08-25",530.38,537.27,518.3,520.04,3293000,520.04],["2011-08-24",519.33,530,517.23,523.29,3594500,523.29],["2011-08-23",503.5,521.41,499.06,518.82,4346800,518.82],["2011-08-22",504,507,494.53,498.17,4905900,498.17],["2011-08-19",499.34,514.87,490.86,490.92,5410000,490.92],["2011-08-18",523.47,524.89,500.49,504.88,6290700,504.88],["2011-08-17",540.03,543.69,530.77,533.15,4055000,533.15],["2011-08-16",552.43,552.44,530.3,539,6939400,539],["2011-08-15",553.43,564.99,546.05,557.23,7144900,557.23],["2011-08-12",569.5,570.5,560.4,563.77,3154300,563.77],["2011-08-11",553.82,568.5,548.41,562.13,4830600,562.13],["2011-08-10",561.38,564.12,547.73,549.01,5369600,549.01],["2011-08-09",561,574.61,541.01,573.41,6469700,573.41],["2011-08-08",562.98,569,544.35,546.02,7496600,546.02],["2011-08-05",582.54,590,562,579.04,5929100,579.04],["2011-08-04",594.5,598.85,577.47,577.52,4914600,577.52],["2011-08-03",594.27,603,583.63,601.17,3825700,601.17],["2011-08-02",606,609.67,591.57,592.4,3200600,592.4],["2011-08-01",611.22,615.5,599.18,606.77,3966100,606.77],["2011-07-29",604.23,614.96,603.69,603.69,4137400,603.69],["2011-07-28",605.19,615.98,603,610.94,3108400,610.94],["2011-07-27",617.18,620.95,604.75,607.22,3934400,607.22],["2011-07-26",618.05,627.5,617.22,622.52,2342900,622.52],["2011-07-25",613.36,625.41,613,618.98,3131600,618.98],["2011-07-22",605.39,619.5,604.27,618.23,3528200,618.23],["2011-07-21",594.03,608.06,594.01,606.99,3469500,606.99],["2011-07-20",602.18,602.83,595.35,595.35,2227800,595.35],["2011-07-19",596.14,604.68,595.53,602.55,2967500,602.55],["2011-07-18",592.49,602.05,592,594.94,4468300,594.94],["2011-07-15",597.5,600.25,588.16,597.62,13732100,597.62],["2011-07-14",539.12,542,526.73,528.94,6594400,528.94],["2011-07-13",537,544,536.48,538.26,2790200,538.26],["2011-07-12",528.16,539.42,526,534.01,2841200,534.01],["2011-07-11",528.18,535.98,525.5,527.28,2839300,527.28],["2011-07-08",532.95,537.65,527.27,531.99,4770200,531.99],["2011-07-07",541,550.68,535.88,546.6,3935500,546.6],["2011-07-06",533.5,538.51,533.04,535.36,2695600,535.36],["2011-07-05",525.3,535.4,525.3,532.44,3849200,532.44],["2011-07-01",506.74,521.18,506.38,521.03,3636700,521.03],["2011-06-30",501.99,506.67,501.5,506.38,2428400,506.38],["2011-06-29",496.54,500.25,492.38,497.57,2343000,497.57],["2011-06-28",484.02,496.21,484.02,493.65,2715100,493.65],["2011-06-27",474,488.4,473.6,482.8,3444700,482.8],["2011-06-24",480.68,480.75,473.02,474.88,3805600,474.88],["2011-06-23",482.13,482.86,473.73,480.22,4801700,480.22],["2011-06-22",491.45,492.35,486.73,487.01,2407100,487.01],["2011-06-21",487.19,493.94,484.73,493,2765400,493],["2011-06-20",485,486.23,479.23,484.58,3028600,484.58],["2011-06-17",506.18,506.69,484.8,485.02,5245400,485.02],["2011-06-16",502.81,506.57,496.67,500.37,2757000,500.37],["2011-06-15",505.03,508.35,500.61,502.95,2073300,502.95],["2011-06-14",508.15,514.08,506.99,508.37,2341500,508.37],["2011-06-13",510,510.2,502.17,504.73,2427300,504.73],["2011-06-10",514.08,516.69,509.29,509.51,2439900,509.51],["2011-06-09",520,520,515.64,516.73,1689100,516.73],["2011-06-08",516.53,521.24,515.78,519.17,1653400,519.17],["2011-06-07",522.89,524.63,518.99,519.03,1907600,519.03],["2011-06-06",523.54,526.82,519.25,521.06,1942100,521.06],["2011-06-03",522,527.6,521.5,523.08,1748500,523.08],["2011-06-02",527.57,530.3,522.48,528.06,2204500,528.06],["2011-06-01",528.04,533.2,525.31,525.6,2955900,525.6],["2011-05-31",525,529.05,523.5,529.02,2687300,529.02],["2011-05-27",518.48,521.79,516.3,520.9,1745800,520.9],["2011-05-26",517.7,522.12,515,518.13,2118500,518.13],["2011-05-25",517.33,522.77,517.25,519.67,1301600,519.67],["2011-05-24",520.37,523.96,518.15,518.26,1888400,518.26],["2011-05-23",516.6,520,513.4,518.39,2252700,518.39],["2011-05-20",531.8,531.99,523.13,524.03,2317500,524.03],["2011-05-19",532.73,536.54,529.72,531.25,2468700,531.25],["2011-05-18",529.54,530.33,525.7,529.81,1953200,529.81],["2011-05-17",515.43,531.22,515.03,530.46,3303600,530.46],["2011-05-16",526.31,527.27,516.4,518.42,2958200,518.42],["2011-05-13",534.61,535.92,529.05,529.55,2108700,529.55],["2011-05-12",535.24,536.94,530.91,535.05,1400000,535.05],["2011-05-11",540.14,543.55,533.69,535.45,2338800,535.45],["2011-05-10",540,544.43,537.54,542.66,2042900,542.66],["2011-05-09",535,538.49,531.1,537.68,1948700,537.68],["2011-05-06",538.15,541.46,535.18,535.3,2056100,535.3],["2011-05-05",533.86,539.42,531.5,534.27,1997800,534.27],["2011-05-04",535.17,539,533.02,535.79,2117000,535.79],["2011-05-03",537.13,542.01,529.63,533.89,2081500,533.89],["2011-05-02",545.7,545.73,537.12,538.56,2133700,538.56],["2011-04-29",540,544.1,538.51,544.1,4200000,544.1],["2011-04-28",538.06,539.25,534.08,537.97,2037400,537.97],["2011-04-27",538,538.11,534.35,537.76,2298400,537.76],["2011-04-26",526.52,537.44,525.21,532.82,3535400,532.82],["2011-04-25",525.25,527,522.01,525.05,1630800,525.05],["2011-04-21",527.49,528.28,522.39,525.1,2470100,525.1],["2011-04-20",525.9,526.82,521.39,525.73,3060000,525.73],["2011-04-19",529.95,530.88,520.9,521.53,2684100,521.53],["2011-04-18",526.42,527.66,519,526.84,5039800,526.84],["2011-04-15",545.29,545.75,530.06,530.7,14043700,530.7],["2011-04-14",575.19,579.45,572.1,578.51,5456300,578.51],["2011-04-13",575.51,577.6,571.75,576.28,2069400,576.28],["2011-04-12",575,576.91,568.05,570.61,2085600,570.61],["2011-04-11",576.2,578.1,573,577.37,1858200,577.37],["2011-04-08",584.89,584.89,578.06,578.16,1901800,578.16],["2011-04-07",575.73,580.64,574.19,580,2531500,580],["2011-04-06",572.18,575.16,568,574.18,2668300,574.18],["2011-04-05",581.08,581.49,565.68,569.09,6047500,569.09],["2011-04-04",593,594.74,583.1,587.68,2054500,587.68],["2011-04-01",588.76,595.19,588.76,591.8,2613200,591.8],["2011-03-31",583,588.16,581.74,586.76,2029400,586.76],["2011-03-30",584.38,585.5,580.58,581.84,1422300,581.84],["2011-03-29",576,581.89,573.01,581.73,1604800,581.73],["2011-03-28",582.07,584.99,574.71,575.36,2218400,575.36],["2011-03-25",586.88,586.91,579.24,579.74,2858400,579.74],["2011-03-24",585.43,588.39,578.8,586.89,2098700,586.89],["2011-03-23",575.19,582.45,572,582.16,1816200,582.16],["2011-03-22",577.27,579.23,572.51,577.32,1886900,577.32],["2011-03-21",570.22,579.8,569.02,576.5,3020900,576.5],["2011-03-18",564.64,567.99,559.74,561.06,3298600,561.06],["2011-03-17",564.48,569,560.54,561.36,2899300,561.36],["2011-03-16",568.01,569.79,551.28,557.1,3798500,557.1],["2011-03-15",557.5,571,555.5,569.56,4005600,569.56],["2011-03-14",572.8,578.29,568.02,569.99,2816100,569.99],["2011-03-11",578.22,580,573.33,576.71,3032000,576.71],["2011-03-10",585.44,586.62,579.45,580.3,3128100,580.3],["2011-03-09",591,594.51,585.75,591.77,2151000,591.77],["2011-03-08",592.93,597.98,590.2,592.31,2284900,592.31],["2011-03-07",600.55,603.69,587,591.66,3462700,591.66],["2011-03-04",608.33,608.98,600.2,600.62,3011000,600.62],["2011-03-03",606.38,611.49,605,609.56,1945300,609.56],["2011-03-02",599.8,606,595.19,600.79,2026700,600.79],["2011-03-01",617.78,619.22,599.3,600.76,3323200,600.76],["2011-02-28",610,616.49,608.01,613.4,2281500,613.4],["2011-02-25",611.86,614.72,609.5,610.04,1932400,610.04],["2011-02-24",611.39,613.09,601.35,608.82,2711700,608.82],["2011-02-23",610.33,614.7,604,611.32,2889600,611.32],["2011-02-22",620.03,624.93,607.77,610.21,3639900,610.21],["2011-02-18",626,631.18,624.18,630.08,3217900,630.08],["2011-02-17",621.25,627.25,620.28,625.26,1478800,625.26],["2011-02-16",625.63,626.5,622.1,624.22,1684000,624.22],["2011-02-15",627.32,630.09,623.1,624.15,2092000,624.15],["2011-02-14",623.34,629.64,620.04,628.15,2128000,628.15],["2011-02-11",613.79,625,613,624.5,2589900,624.5],["2011-02-10",613.9,617.5,611.56,616.44,2334400,616.44],["2011-02-09",616.87,619.45,612.34,616.5,1842500,616.5],["2011-02-08",614.93,619.63,614.51,618.38,1694900,618.38],["2011-02-07",610.16,618.39,609.21,614.29,1799600,614.29],["2011-02-04",610.15,611.44,606.61,610.98,1550800,610.98],["2011-02-03",609.48,611.45,606.13,610.15,1495100,610.15],["2011-02-02",611,614.34,607.53,612,1760700,612],["2011-02-01",604.49,613.35,603.11,611.04,2745300,611.04],["2011-01-31",603.6,604.47,595.55,600.36,2804900,600.36],["2011-01-28",619.07,620.36,599.76,600.99,4231100,600.99],["2011-01-27",617.89,619.7,613.25,616.79,2019200,616.79],["2011-01-26",620.33,622.49,615.28,616.5,2038100,616.5],["2011-01-25",608.2,620.69,606.52,619.91,3646800,619.91],["2011-01-24",607.57,612.49,601.23,611.08,4599200,611.08],["2011-01-21",639.58,641.73,611.36,611.83,8904400,611.83],["2011-01-20",632.21,634.08,623.29,626.77,5485800,626.77],["2011-01-19",642.12,642.96,629.66,631.75,3406100,631.75],["2011-01-18",626.06,641.99,625.27,639.63,3617000,639.63],["2011-01-14",617.4,624.27,617.08,624.18,2365600,624.18],["2011-01-13",616.97,619.67,614.16,616.69,1334000,616.69],["2011-01-12",619.35,619.35,614.77,616.87,1632700,616.87],["2011-01-11",617.71,618.8,614.5,616.01,1439300,616.01],["2011-01-10",614.8,615.39,608.56,614.21,1579200,614.21],["2011-01-07",615.91,618.25,610.13,616.44,2101200,616.44],["2011-01-06",610.68,618.43,610.05,613.5,2057800,613.5],["2011-01-05",600.07,610.33,600.05,609.07,2532300,609.07],["2011-01-04",605.62,606.18,600.12,602.12,1824500,602.12],["2011-01-03",596.48,605.59,596.48,604.35,2365200,604.35],["2010-12-31",596.74,598.42,592.03,593.97,1539300,593.97],["2010-12-30",598,601.33,597.39,598.86,989500,598.86],["2010-12-29",602,602.41,598.92,601,1019200,601],["2010-12-28",602.05,603.87,598.01,598.92,1064800,598.92],["2010-12-27",602.74,603.78,599.5,602.38,1208100,602.38],["2010-12-23",605.34,606,602.03,604.23,1110800,604.23],["2010-12-22",604,607,603.28,605.49,1207500,605.49],["2010-12-21",598.57,604.72,597.61,603.07,1879500,603.07],["2010-12-20",594.65,597.88,588.66,595.06,1973300,595.06],["2010-12-17",591,592.56,587.67,590.8,3087100,590.8],["2010-12-16",592.85,593.77,588.07,591.71,1596900,591.71],["2010-12-15",594.2,596.45,589.15,590.3,2167700,590.3],["2010-12-14",597.09,598.29,592.48,594.91,1643300,594.91],["2010-12-13",597.12,603,594.09,594.62,2398500,594.62],["2010-12-10",593.14,593.99,590.29,592.21,1704700,592.21],["2010-12-09",593.88,595.58,589,591.5,1868900,591.5],["2010-12-08",591.97,592.52,583.69,590.54,1756900,590.54],["2010-12-07",591.27,593,586,587.14,3042200,587.14],["2010-12-06",580.57,582,576.61,578.36,2093800,578.36],["2010-12-03",569.45,576.48,568,573,2631200,573],["2010-12-02",568.66,573.33,565.35,571.82,2547900,571.82],["2010-12-01",563,571.57,562.4,564.35,3754100,564.35],["2010-11-30",574.32,574.32,553.31,555.71,7117400,555.71],["2010-11-29",589.17,589.8,579.95,582.11,2859700,582.11],["2010-11-26",590.46,592.98,587,590,1311100,590],["2010-11-24",587.31,596.6,587.05,594.97,2396400,594.97],["2010-11-23",587.01,589.01,578.2,583.01,2162600,583.01],["2010-11-22",587.47,593.44,582.75,591.22,2186600,591.22],["2010-11-19",597,597.89,590.34,590.83,2297500,590.83],["2010-11-18",589,599.98,588.56,596.56,2590000,596.56],["2010-11-17",585,589.5,581.37,583.55,2442500,583.55],["2010-11-16",592.76,597.89,583.45,583.72,3307400,583.72],["2010-11-15",603.08,604,594.05,595.47,3478900,595.47],["2010-11-12",613.99,616.9,601.21,603.29,3393000,603.29],["2010-11-11",619.7,619.85,614.21,617.19,2261600,617.19],["2010-11-10",622.08,623,617.51,622.88,2497000,622.88],["2010-11-09",630,630.85,620.51,624.82,2237200,624.82],["2010-11-08",624.02,629.49,623.13,626.77,2101300,626.77],["2010-11-05",623.18,625.49,621.11,625.08,1765700,625.08],["2010-11-04",624.64,629.92,622.1,624.27,3570800,624.27],["2010-11-03",617.5,621.83,613.5,620.18,3380500,620.18],["2010-11-02",618.67,620,614.58,615.6,1997600,615.6],["2010-11-01",615.73,620.66,611.21,615,3087100,615],["2010-10-29",617.07,619,612.99,613.7,2278300,613.7],["2010-10-28",620.05,621,613.3,618.58,2184300,618.58],["2010-10-27",615.77,620,612.33,616.47,2241900,616.47],["2010-10-26",613.1,621.23,611.03,618.6,2512900,618.6],["2010-10-25",615.59,624.74,614.97,616.5,3158400,616.5],["2010-10-22",611.92,614.82,610.05,612.53,2256100,612.53],["2010-10-21",611.51,616,606,611.99,2920500,611.99],["2010-10-20",608.14,617.38,607.5,607.98,3525100,607.98],["2010-10-19",608.85,614.82,602.86,607.83,4587900,607.83],["2010-10-18",600.55,619.69,600.55,617.71,7098200,617.71],["2010-10-15",599.27,601.64,591.6,601.45,14824800,601.45],["2010-10-14",544.18,545.25,537.11,540.93,6634100,540.93],["2010-10-13",547,547.49,542.33,543.3,3055600,543.3],["2010-10-12",540.12,545.99,537.79,541.39,3753600,541.39],["2010-10-11",538.48,544.6,537.17,538.84,2626300,538.84],["2010-10-08",532.77,537.6,527.62,536.35,2859200,536.35],["2010-10-07",536.21,537.2,529.14,530.01,2395800,530.01],["2010-10-06",539.26,539.95,529.94,534.35,2762300,534.35],["2010-10-05",528.38,540,526.55,538.23,3507100,538.23],["2010-10-04",524.95,528.25,518.85,522.35,1940500,522.35],["2010-10-01",530,530.62,523,525.62,2225000,525.62],["2010-09-30",529.16,531.87,518.92,525.79,3244100,525.79],["2010-09-29",527.85,532.94,524.71,527.69,2172200,527.69],["2010-09-28",533.48,533.59,518.45,527.17,3654700,527.17],["2010-09-27",528.85,536.85,528.85,530.41,3107400,530.41],["2010-09-24",521.74,527.83,518.26,527.29,3356900,527.29],["2010-09-23",514.61,519.69,511.3,513.48,2317400,513.48],["2010-09-22",512.86,517.78,511.68,516,2537100,516],["2010-09-21",509.68,519.98,508.91,513.46,4466300,513.46],["2010-09-20",492.5,510.41,492.06,508.28,4403500,508.28],["2010-09-17",483.75,491.2,481.18,490.15,5641600,490.15],["2010-09-16",479.95,482.45,479.41,481.06,1969500,481.06],["2010-09-15",479.95,481.89,478.5,480.64,2402800,480.64],["2010-09-14",482.01,484.75,480.08,480.43,2216500,480.43],["2010-09-13",480.9,484.35,479.53,482.27,2241500,482.27],["2010-09-10",479.02,479.79,475.08,476.14,1974300,476.14],["2010-09-09",477.83,480.4,470.58,476.18,2430600,476.18],["2010-09-08",465.19,472.5,464.51,470.58,2401800,470.58],["2010-09-07",464.5,467.59,463.02,464.4,1709900,464.4],["2010-09-03",470.52,471.88,467.44,470.3,2540400,470.3],["2010-09-02",462.84,464.43,460.31,463.18,1684200,463.18],["2010-09-01",454.98,464.94,452.5,460.33,3228300,460.33],["2010-08-31",450.11,454.87,448,450.02,1946800,450.02],["2010-08-30",459.15,459.76,452.42,452.69,1231400,452.69],["2010-08-27",452.56,459.99,447.65,458.83,2312400,458.83],["2010-08-26",456.06,457.26,450.44,450.98,1777000,450.98],["2010-08-25",450,457.81,450,454.62,2592100,454.62],["2010-08-24",457.7,458.37,450.92,451.39,2762700,451.39],["2010-08-23",461.5,468.25,457.73,464.07,2986200,464.07],["2010-08-20",467.97,471.59,461.02,462.02,3917600,462.02],["2010-08-19",481.01,482.51,467.25,467.97,3925000,467.97],["2010-08-18",490.44,490.87,481.55,482.15,2686400,482.15],["2010-08-17",488.53,494.7,486.03,490.52,1890700,490.52],["2010-08-16",483.68,489.87,480.5,485.59,1305000,485.59],["2010-08-13",489,491.19,486.01,486.35,1934700,486.35],["2010-08-12",483.94,494.75,482.51,492.01,2204600,492.01],["2010-08-11",497.73,498,491.5,491.74,2223000,491.74],["2010-08-10",502.35,506,498.57,503.71,2074000,503.71],["2010-08-09",502.25,505.5,501.36,505.35,1872200,505.35],["2010-08-06",505.4,505.74,496.05,500.22,3319500,500.22],["2010-08-05",505.89,508.6,503.56,508.1,2420400,508.1],["2010-08-04",492.18,507,491.05,506.32,3812500,506.32],["2010-08-03",490.5,492.46,486.76,489.83,1802300,489.83],["2010-08-02",488.99,493.28,486.94,490.41,1858700,490.41],["2010-07-30",479.65,487.36,479.14,484.85,2144100,484.85],["2010-07-29",485.95,488.88,479.33,484.99,2675500,484.99],["2010-07-28",494.94,495.25,482.67,484.35,2496000,484.35],["2010-07-27",490.58,497.5,490.17,492.63,2451200,492.63],["2010-07-26",489.09,490.75,484.88,488.97,1995200,488.97],["2010-07-23",480.77,490.59,480.01,490.06,2264400,490.06],["2010-07-22",483.23,488.98,482.48,484.81,2147700,484.81],["2010-07-21",484,485.7,475.43,477.5,3279600,477.5],["2010-07-20",461.03,482.99,460.6,481.59,4054500,481.59],["2010-07-19",461.01,469.65,457.52,466.18,4550300,466.18],["2010-07-16",469.12,470.56,459.52,459.61,7824800,459.61],["2010-07-15",491.73,494.7,482.68,494.02,4858200,494.02],["2010-07-14",489.88,493.83,486.46,491.34,3118000,491.34],["2010-07-13",482.25,492.99,480.28,489.2,3976300,489.2],["2010-07-12",472.37,479.44,471.08,475.83,3334400,475.83],["2010-07-09",471.96,473.26,462.78,467.49,4331500,467.49],["2010-07-08",453.55,457.33,449.66,456.56,2668900,456.56],["2010-07-07",438.31,451.29,435.38,450.2,3129700,450.2],["2010-07-06",444,447.67,433.63,436.07,2560100,436.07],["2010-07-02",441.62,442.28,436,436.55,1936000,436.55],["2010-07-01",445.29,448.4,433.63,439.49,3513600,439.49],["2010-06-30",454.96,457.83,444.72,444.95,3603200,444.95],["2010-06-29",463.44,464.55,451.12,454.26,3502100,454.26],["2010-06-28",472.59,477.55,469.01,472.08,1762300,472.08],["2010-06-25",477.06,477.65,470.56,472.68,2245200,472.68],["2010-06-24",479.66,482.75,473.26,475.1,1893600,475.1],["2010-06-23",486.89,486.89,478.16,482.05,2029100,482.05],["2010-06-22",489.9,496.6,485.73,486.25,2219700,486.25],["2010-06-21",499.9,500.97,484.89,488.56,2983500,488.56],["2010-06-18",502.51,503.47,498.13,500.03,2872900,500.03],["2010-06-17",503.45,505.87,496.69,500.08,1977300,500.08],["2010-06-16",496.17,504,496.11,501.27,2289300,501.27],["2010-06-15",483.08,500.4,482.18,497.99,4259600,497.99],["2010-06-14",494.48,494.5,483.19,483.19,2040400,483.19],["2010-06-11",482.5,488.71,481.62,488.5,1781700,488.5],["2010-06-10",480.37,488.5,475.84,487.01,2577900,487.01],["2010-06-09",487.22,488.88,472,474.02,2729000,474.02],["2010-06-08",487.85,488.84,477.54,484.78,2685100,484.78],["2010-06-07",499.06,500.91,483.15,485.52,3632700,485.52],["2010-06-04",499.72,509.25,496.7,498.72,3920300,498.72],["2010-06-03",495.11,508,494.7,505.6,3650700,505.6],["2010-06-02",486.68,493.87,481.46,493.37,2540800,493.37],["2010-06-01",480.43,491.06,480.12,482.37,2666800,482.37],["2010-05-28",492.74,493.45,483,485.63,2894800,485.63],["2010-05-27",484.95,492.31,481.05,490.46,2809100,490.46],["2010-05-26",482.07,489.76,475,475.47,3475600,475.47],["2010-05-25",468.15,477.45,464.01,477.07,3017400,477.07],["2010-05-24",480.73,489.79,476.8,477.16,4345600,477.16],["2010-05-21",469.06,485,464.4,472.05,9690800,472.05],["2010-05-20",485.07,485.58,473.8,475.01,4913300,475.01],["2010-05-19",496.26,499.44,487.74,494.43,3445700,494.43],["2010-05-18",510,510.97,497.07,498.37,2825500,498.37],["2010-05-17",506.78,508.36,498.35,507.97,2793800,507.97],["2010-05-14",509.77,510.99,496.25,507.53,4116000,507.53],["2010-05-13",516.5,522,510.37,510.88,3325800,510.88],["2010-05-12",512.04,512.04,502,505.39,3851800,505.39],["2010-05-11",515.67,519.88,508.22,509.05,3322600,509.05],["2010-05-10",513.97,522.82,512.6,521.65,4128000,521.65],["2010-05-07",499.97,505.32,481.33,493.14,5089000,493.14],["2010-05-06",508.75,517.52,460,498.67,5000100,498.67],["2010-05-05",500.98,515.72,500.47,509.76,4582200,509.76],["2010-05-04",526.52,526.74,504.21,506.37,6076300,506.37],["2010-05-03",526.5,532.92,525.08,530.6,1857800,530.6],["2010-04-30",531.13,537.68,525.44,525.7,2435400,525.7],["2010-04-29",533.37,536.5,526.67,532,3058900,532],["2010-04-28",532.1,534.83,521.03,529.19,3406100,529.19],["2010-04-27",528.95,538.33,527.23,529.06,3844700,529.06],["2010-04-26",544.97,544.99,529.21,531.64,4368800,531.64],["2010-04-23",547.25,549.32,542.27,544.99,2089400,544.99],["2010-04-22",552,552.5,543.35,547.06,3280700,547.06],["2010-04-21",556.46,560.25,552.16,554.3,2391500,554.3],["2010-04-20",554.17,559.66,551.06,555.04,2977400,555.04],["2010-04-19",548.75,553.99,545,550.1,3894000,550.1],["2010-04-16",563,568.81,549.63,550.15,12235500,550.15],["2010-04-15",592.17,597.84,588.29,595.3,6761800,595.3],["2010-04-14",590.06,592.34,584.01,589,3402700,589],["2010-04-13",572.53,588.88,571.13,586.77,3912300,586.77],["2010-04-12",567.35,574,566.22,572.73,2352400,572.73],["2010-04-09",567.49,568.77,564,566.22,2056600,566.22],["2010-04-08",563.32,569.85,560.05,567.49,1947500,567.49],["2010-04-07",567.3,568.75,561.86,563.54,2581000,563.54],["2010-04-06",569.46,570.89,565.4,568.22,2060100,568.22],["2010-04-05",570.9,574.88,569,571.01,1901500,571.01],["2010-04-01",571.35,573.45,565.55,568.8,2102700,568.8],["2010-03-31",565.05,569.74,562.81,567.12,3030800,567.12],["2010-03-30",562.83,567.63,560.28,566.71,1977900,566.71],["2010-03-29",563,564.72,560.57,562.45,3104500,562.45],["2010-03-26",565.27,567.39,560.02,562.69,2696200,562.69],["2010-03-25",559.02,572,558.66,562.88,3930900,562.88],["2010-03-24",545.51,559.85,539.7,557.33,6565200,557.33],["2010-03-23",557.04,558.31,542,549,5501300,549],["2010-03-22",556.11,566.85,554.28,557.5,4004800,557.5],["2010-03-19",566.23,568,557.28,560,4792400,560],["2010-03-18",564.72,568.44,562.96,566.4,1777200,566.4],["2010-03-17",568.3,571.45,564.25,565.56,3321600,565.56],["2010-03-16",561.83,568.42,560.76,565.2,3431500,565.2],["2010-03-15",566.68,569.45,556,563.18,4653900,563.18],["2010-03-12",588.14,588.28,579.16,579.54,2753400,579.54],["2010-03-11",574.26,586.21,574.2,581.14,4233300,581.14],["2010-03-10",563.76,578.5,562.21,576.45,5654900,576.45],["2010-03-09",559.85,564.66,556.5,560.19,3176600,560.19],["2010-03-08",564.78,565.18,561.01,562.48,2386400,562.48],["2010-03-05",561.35,567.67,559.9,564.21,3912200,564.21],["2010-03-04",546.5,556.13,546.2,554.59,3183800,554.59],["2010-03-03",542.36,548.12,539.25,545.32,3089400,545.32],["2010-03-02",535.48,545.66,535.01,541.06,4356800,541.06],["2010-03-01",529.2,533.29,527.74,532.69,2237900,532.69],["2010-02-26",527.42,531.75,523.48,526.8,2049300,526.8],["2010-02-25",527.12,528.49,520,526.43,3309200,526.43],["2010-02-24",533.98,538.44,530.51,531.47,2326600,531.47],["2010-02-23",543,543.63,532.29,535.07,2872600,535.07],["2010-02-22",547.35,547.5,541,542.8,2144600,542.8],["2010-02-19",540.53,544.03,539.7,540.76,2553100,540.76],["2010-02-18",537.54,545.01,536.14,543.22,2336900,543.22],["2010-02-17",542,543.4,537.61,538.21,2029700,538.21],["2010-02-16",536.87,544.13,534.3,541.3,3654400,541.3],["2010-02-12",532.97,537.15,530.5,533.12,2279700,533.12],["2010-02-11",533.32,540.49,529.5,536.4,2410000,536.4],["2010-02-10",534.07,537.79,527.69,534.45,2674500,534.45],["2010-02-09",539.54,541.53,535.07,536.44,2819600,536.44],["2010-02-08",532.5,542,531.53,533.47,2694300,533.47],["2010-02-05",528.4,533.5,522.46,531.29,3156000,531.29],["2010-02-04",537,538,525.56,526.78,3377700,526.78],["2010-02-03",528.67,542.1,528.23,540.82,2999100,540.82],["2010-02-02",534.96,534.96,527.61,531.12,4096200,531.12],["2010-02-01",534.6,535.81,530.3,533.02,2250800,533.02],["2010-01-29",538.49,540.99,525.61,529.94,4140500,529.94],["2010-01-28",544.49,547,530.6,534.29,3229100,534.29],["2010-01-27",541.27,547.65,535.31,542.1,3964400,542.1],["2010-01-26",537.97,549.6,536.29,542.42,4355500,542.42],["2010-01-25",546.59,549.88,535.51,540,4419900,540],["2010-01-22",564.5,570.6,534.86,550.01,6800400,550.01],["2010-01-21",583.44,586.82,572.25,582.98,6307700,582.98],["2010-01-20",585.98,585.98,575.29,580.41,3250700,580.41],["2010-01-19",581.2,590.42,576.29,587.62,4316700,587.62],["2010-01-15",593.34,593.56,578.04,580,5434500,580],["2010-01-14",583.9,594.2,582.81,589.85,4240100,589.85],["2010-01-13",576.49,588.38,573.9,587.09,6496600,587.09],["2010-01-12",597.65,598.16,588,590.48,4853300,590.48],["2010-01-11",604.46,604.46,594.04,601.11,7212900,601.11],["2010-01-08",592,603.25,589.11,602.02,4724300,602.02],["2010-01-07",609.4,610,592.65,594.1,6414300,594.1],["2010-01-06",625.86,625.86,606.36,608.26,3978700,608.26],["2010-01-05",627.18,627.84,621.54,623.99,3004700,623.99],["2010-01-04",626.95,629.51,624.24,626.75,1956200,626.75],["2009-12-31",624.75,625.4,619.98,619.98,1219800,619.98],["2009-12-30",618.5,622.73,618.01,622.73,1465600,622.73],["2009-12-29",624.74,624.84,618.29,619.4,1424800,619.4],["2009-12-28",621.66,625.99,618.48,622.87,1697900,622.87],["2009-12-24",612.93,619.52,612.27,618.48,858700,618.48],["2009-12-23",603.5,612.87,602.85,611.68,2072700,611.68],["2009-12-22",601.34,601.5,598.85,601.12,1880800,601.12],["2009-12-21",597.61,599.84,595.67,598.68,2571200,598.68],["2009-12-18",596.03,598.93,595,596.42,3531500,596.42],["2009-12-17",596.44,597.64,593.76,593.94,2638800,593.94],["2009-12-16",598.6,600.37,596.64,597.76,2809400,597.76],["2009-12-15",593.3,596.38,590.99,593.14,2280400,593.14],["2009-12-14",595.35,597.31,592.61,595.73,1913400,595.73],["2009-12-11",594.68,594.75,587.73,590.51,1720000,590.51],["2009-12-10",590.44,594.71,590.41,591.5,1668300,591.5],["2009-12-09",587.5,589.33,583.58,589.02,1781000,589.02],["2009-12-08",583.5,590.66,582,587.05,1524000,587.05],["2009-12-07",584.21,588.69,581,586.25,1636200,586.25],["2009-12-04",593.02,594.83,579.18,585.01,2513600,585.01],["2009-12-03",589.04,591.45,585,585.74,1428700,585.74],["2009-12-02",591,593.01,586.22,587.51,1663200,587.51],["2009-12-01",588.13,591.22,583,589.87,2320300,589.87],["2009-11-30",580.63,583.67,577.11,583,1725100,583],["2009-11-27",572,582.46,570.97,579.76,1384600,579.76],["2009-11-25",586.41,587.06,582.69,585.74,1461200,585.74],["2009-11-24",582.52,584.29,576.54,583.09,1605200,583.09],["2009-11-23",576.49,586.6,575.86,582.35,2547500,582.35],["2009-11-20",569.5,571.6,569.4,569.96,2006200,569.96],["2009-11-19",573.77,574,570,572.99,2168000,572.99],["2009-11-18",576.65,578.78,572.07,576.65,1549600,576.65],["2009-11-17",574.87,577.5,573.72,577.49,1916700,577.49],["2009-11-16",575,576.99,572.78,576.28,2199200,576.28],["2009-11-13",569.29,572.51,566.61,572.05,1666800,572.05],["2009-11-12",569.56,572.9,565.5,567.85,1886300,567.85],["2009-11-11",570.48,573.5,565.86,570.56,2319700,570.56],["2009-11-10",562.73,568.78,562,566.76,2230800,566.76],["2009-11-09",555.45,562.58,554.23,562.51,2649900,562.51],["2009-11-06",547.72,551.78,545.5,551.1,1826700,551.1],["2009-11-05",543.49,549.77,542.66,548.65,1847700,548.65],["2009-11-04",540.8,545.5,536.42,540.33,2332700,540.33],["2009-11-03",530.01,537.5,528.3,537.29,2380200,537.29],["2009-11-02",537.08,539.46,528.24,533.99,3202100,533.99],["2009-10-30",550,550.17,534.24,536.12,3468500,536.12],["2009-10-29",543.01,551.83,541,551.05,2522600,551.05],["2009-10-28",547.87,550,538.25,540.3,2567800,540.3],["2009-10-27",550.97,554.56,544.16,548.29,3216500,548.29],["2009-10-26",555.75,561.64,550.89,554.21,2970400,554.21],["2009-10-23",555.25,557.89,551.2,553.69,2392700,553.69],["2009-10-22",550,555,548,554.09,2336500,554.09],["2009-10-21",549.91,559.35,549,551.1,3670600,551.1],["2009-10-20",551.64,552.95,540.7,551.72,4043700,551.72],["2009-10-19",552.69,553.6,548.73,552.09,3217900,552.09],["2009-10-16",547.33,554.75,544.53,549.85,8841900,549.85],["2009-10-15",533.75,536.9,527.27,529.91,6100400,529.91],["2009-10-14",532.46,535.58,530,535.32,3258400,535.32],["2009-10-13",524.39,527.46,521.38,526.11,3037400,526.11],["2009-10-12",523.42,525.76,519.32,524.04,3322200,524.04],["2009-10-09",516.65,521.51,514.5,516.25,2738100,516.25],["2009-10-08",519.57,523.25,513.34,514.18,4303800,514.18],["2009-10-07",499,518.99,497.81,517.54,4874200,517.54],["2009-10-06",491.7,499.37,491.7,498.74,2732300,498.74],["2009-10-05",487.65,492.43,483.34,488.52,2144600,488.52],["2009-10-02",483.74,491.74,482.6,484.58,2600800,484.58],["2009-10-01",493,496.47,487,487.2,2813200,487.2],["2009-09-30",500,500.14,487.24,495.85,3141700,495.85],["2009-09-29",499.53,499.75,493.01,498.53,2099200,498.53],["2009-09-28",494.84,501.5,493.3,498.53,1839300,498.53],["2009-09-25",494.29,499.93,492,492.48,2049600,492.48],["2009-09-24",500.47,501.41,493,496.77,2527600,496.77],["2009-09-23",500.78,507,497.71,498.46,2704200,498.46],["2009-09-22",500.92,501.99,497.81,499.06,3041200,499.06],["2009-09-21",487.74,498.9,486.22,497,2116400,497],["2009-09-18",496.77,496.98,491.23,491.46,3283500,491.46],["2009-09-17",490.57,497.37,487.15,491.72,4483100,491.72],["2009-09-16",479.8,489.37,478.48,488.29,2585300,488.29],["2009-09-15",475.08,478.91,472.71,477.54,2398100,477.54],["2009-09-14",470.51,476.8,470.05,475.12,1975700,475.12],["2009-09-11",470.4,473.3,467.63,472.14,1902900,472.14],["2009-09-10",466.65,470.94,462,470.94,2534600,470.94],["2009-09-09",459.06,466.27,458.8,463.97,2195400,463.97],["2009-09-08",464.29,466.99,455.84,458.62,2656700,458.62],["2009-09-04",457.57,462.6,455.78,461.3,1499200,461.3],["2009-09-03",455.82,458.25,455,457.52,1646200,457.52],["2009-09-02",455.82,458.33,452.59,453.01,1804800,453.01],["2009-09-01",459.68,466.82,454.42,455.76,2594900,455.76],["2009-08-31",459.79,461.86,458,461.67,1957900,461.67],["2009-08-28",469.26,472.37,463.38,464.75,1771600,464.75],["2009-08-27",468.58,468.58,460.73,466.06,1998900,466.06],["2009-08-26",472.76,473,466.7,468,1987800,468],["2009-08-25",469.13,474.35,468.72,471.37,2341000,471.37],["2009-08-24",467.35,470.09,464.42,468.73,2453400,468.73],["2009-08-21",465.54,466.09,462.65,465.24,3560500,465.24],["2009-08-20",452,462.18,451.23,460.41,3998900,460.41],["2009-08-19",439.99,445,438.56,443.97,2255000,443.97],["2009-08-18",445.1,447.7,442.32,445.28,2351100,445.28],["2009-08-17",451.5,451.99,443.12,444.89,2620200,444.89],["2009-08-14",462.78,463.18,456.89,460,1675100,460],["2009-08-13",462.15,464.72,458.91,462.28,1995200,462.28],["2009-08-12",455.41,461.75,454.92,458.58,2341400,458.58],["2009-08-11",453.67,457.23,452.38,453.94,1712500,453.94],["2009-08-10",455.14,458.41,453.79,456.61,1742000,456.61],["2009-08-07",455.67,459.42,454.99,457.1,2543100,457.1],["2009-08-06",454.3,454.88,448.53,450.36,2110900,450.36],["2009-08-05",456,456.91,447.88,451.14,2342000,451.14],["2009-08-04",449.37,454,448.43,453.73,2389800,453.73],["2009-08-03",448.74,453.9,447.64,452.21,2590300,452.21],["2009-07-31",449.98,452.7,442.43,443.05,2860400,443.05],["2009-07-30",442.61,451.47,442.61,445.64,3198600,445.64],["2009-07-29",437.23,437.8,431.89,436.24,1987000,436.24],["2009-07-28",441,442.81,436.1,439.85,2532500,439.85],["2009-07-27",446.04,446.75,437.61,444.8,2504400,444.8],["2009-07-24",435.81,450.49,435,446.72,3626900,446.72],["2009-07-23",428.68,441.21,425.5,437.34,3478200,437.34],["2009-07-22",428,430.2,423.5,427.69,2586700,427.69],["2009-07-21",430.94,431.9,425.72,427.9,2968200,427.9],["2009-07-20",429.88,432.85,426.25,430.17,3153500,430.17],["2009-07-17",433,435.48,426.7,430.25,6854100,430.25],["2009-07-16",436.68,445.75,434.1,442.6,6554500,442.6],["2009-07-15",429.66,438.68,428.49,438.17,3777000,438.17],["2009-07-14",423.71,426.73,420.87,424.69,2895800,424.69],["2009-07-13",416.17,424.52,415.18,424.3,4045700,424.3],["2009-07-10",409.58,417.37,408.7,414.4,2926600,414.4],["2009-07-09",406.12,414.45,405.8,410.39,3275600,410.39],["2009-07-08",400,406,398.06,402.49,3441200,402.49],["2009-07-07",408.24,409.19,395.98,396.63,3259300,396.63],["2009-07-06",406.5,410.64,401.66,409.61,2262600,409.61],["2009-07-02",415.41,415.41,406.81,408.49,2517600,408.49],["2009-07-01",424.2,426.4,418.15,418.99,2310800,418.99],["2009-06-30",424,427.21,418.22,421.59,2593900,421.59],["2009-06-29",426,427.8,422.24,424.14,2169300,424.14],["2009-06-26",413.68,428.23,413.11,425.32,3256700,425.32],["2009-06-25",407,415.9,406.51,415.77,3044500,415.77],["2009-06-24",408.74,412.23,406.56,409.29,2457800,409.29],["2009-06-23",406.65,408.99,402.55,405.68,2899600,405.68],["2009-06-22",416.95,417.49,401.89,407.35,4124400,407.35],["2009-06-19",418.21,420.46,414.58,420.09,4259100,420.09],["2009-06-18",415.68,418.69,413,414.06,3085200,414.06],["2009-06-17",416.19,419.72,411.56,415.16,3490100,415.16],["2009-06-16",419.31,421.09,415.42,416,3049700,416],["2009-06-15",421.5,421.5,414,416.77,3736900,416.77],["2009-06-12",426.86,427.7,421.21,424.84,2918400,424.84],["2009-06-11",431.77,433.73,428.37,429,2865200,429],["2009-06-10",436.23,437.89,426.67,432.6,3358900,432.6],["2009-06-09",438.58,440.5,431.76,435.62,3254900,435.62],["2009-06-08",439.5,440.92,434.12,438.77,3098700,438.77],["2009-06-05",445.07,447.34,439.46,444.32,3680800,444.32],["2009-06-04",435.3,441.24,434.5,440.28,3638100,440.28],["2009-06-03",426,432.46,424,431.65,3532800,431.65],["2009-06-02",426.25,429.96,423.4,428.4,2623600,428.4],["2009-06-01",418.73,429.6,418.53,426.56,3322400,426.56],["2009-05-29",412.11,417.23,410.7,417.23,2648200,417.23],["2009-05-28",408.68,411.62,404.61,410.4,2668800,410.4],["2009-05-27",405.64,411.86,404.81,405.56,3034300,405.56],["2009-05-26",391.95,405,390,404.36,3104500,404.36],["2009-05-22",396.66,398.65,392,393.5,1718600,393.5],["2009-05-21",396.3,402.84,393.84,396.5,2719800,396.5],["2009-05-20",402.09,405.67,395,397.18,2284000,397.18],["2009-05-19",396.1,401.64,393,398.88,2837500,398.88],["2009-05-18",394.73,397.31,385.4,396.84,3351700,396.84],["2009-05-15",391.1,394.11,389.09,390,3008700,390],["2009-05-14",388.8,392.21,384.69,387.5,2937000,387.5],["2009-05-13",394.09,396.39,388.35,389.54,2842800,389.54],["2009-05-12",410.01,410.99,395.11,399.01,3790800,399.01],["2009-05-11",402.8,412,401.2,407.98,2559300,407.98],["2009-05-08",402.85,410.13,395,407.33,3865100,407.33],["2009-05-07",404.1,404.99,392.5,396.61,2999800,396.61],["2009-05-06",406.79,408.28,401,403.47,2632900,403.47],["2009-05-05",399.98,405,397.25,402.99,2400800,402.99],["2009-05-04",398.17,402.4,394.79,401.98,3203000,401.98],["2009-05-01",395.03,397.59,391.55,393.69,2427700,393.69],["2009-04-30",395.76,403.75,394.8,395.97,4355700,395.97],["2009-04-29",385.97,394.97,385.83,391.47,3610000,391.47],["2009-04-28",383.75,389.05,381.54,383.71,2943600,383.71],["2009-04-27",384.34,389.49,382.75,385.95,2290600,385.95],["2009-04-24",386.05,393.18,380.5,389.49,3385400,389.49],["2009-04-23",387.51,389.75,381.11,384.69,2609000,384.69],["2009-04-22",381.75,390,379.01,383.86,3501800,383.86],["2009-04-21",376.17,384.3,376.1,381.47,3695400,381.47],["2009-04-20",386.15,390.65,375.89,379.3,4428900,379.3],["2009-04-17",386.02,399.82,384.81,392.24,10730800,392.24],["2009-04-16",381.5,392.9,381.02,388.74,10185100,388.74],["2009-04-15",367.1,381.06,364.16,379.5,4930700,379.5],["2009-04-14",376.94,376.99,365.6,368.91,3428600,368.91],["2009-04-13",371.33,379.1,370.3,378.11,3050100,378.11],["2009-04-09",369.5,374.35,366.25,372.5,3382600,372.5],["2009-04-08",363.5,365,356.21,362,2765200,362],["2009-04-07",362.6,363.75,355.31,358.65,3680100,358.65],["2009-04-06",367,369.82,361.4,368.24,3280300,368.24],["2009-04-03",364.5,371.72,358,369.78,3789800,369.78],["2009-04-02",363.31,369.76,360.32,362.5,4488000,362.5],["2009-04-01",343.78,355.24,340.61,354.09,3301200,354.09],["2009-03-31",348.93,353.51,346.18,348.06,3655300,348.06],["2009-03-30",342.55,343.81,336.05,342.69,3094100,342.69],["2009-03-27",350,352,345.47,347.7,3322800,347.7],["2009-03-26",353.13,359.16,348.5,353.29,6003300,353.29],["2009-03-25",350.4,351.34,336.25,344.07,4336300,344.07],["2009-03-24",346.5,353.84,344,347.17,3820000,347.17],["2009-03-23",333.56,349.45,333.03,348.6,4271500,348.6],["2009-03-20",330.3,332.99,326.34,330.16,4737900,330.16],["2009-03-19",331.68,336,327.38,329.94,4111200,329.94],["2009-03-18",334.81,340,328.05,333.1,5012200,333.1],["2009-03-17",320.18,335.34,319.09,335.34,4712500,335.34],["2009-03-16",325.99,329.73,318.59,319.69,4946800,319.69],["2009-03-13",326.1,327.46,319.03,324.42,3906400,324.42],["2009-03-12",317.54,325,313.65,323.53,5024100,323.53],["2009-03-11",310.1,320,305.71,317.91,5923600,317.91],["2009-03-10",298.25,310.5,294.25,308.17,6730200,308.17],["2009-03-09",299.98,306.57,289.45,290.89,6471300,290.89],["2009-03-06",307.22,310.19,294.25,308.57,7234200,308.57],["2009-03-05",316.48,319.08,302.64,305.64,6529900,305.64],["2009-03-04",323.16,329,315.38,318.92,7818400,318.92],["2009-03-03",330.07,333.69,322.35,325.48,6524800,325.48],["2009-03-02",333.33,340.7,326,327.16,5788500,327.16],["2009-02-27",332.95,343.82,331.11,337.99,5420000,337.99],["2009-02-26",345.96,352.49,337.16,337.18,5605600,337.18],["2009-02-25",342.15,352.3,338.92,341.64,6439100,341.64],["2009-02-24",331.02,349.62,330.89,345.45,6095900,345.45],["2009-02-23",347,349.8,329.55,330.06,5221100,330.06],["2009-02-20",338.05,348.92,335,346.45,6217100,346.45],["2009-02-19",357.47,359.8,341.41,342.64,4988700,342.64],["2009-02-18",347.24,353.38,340.52,353.11,6024500,353.11],["2009-02-17",346.51,347.09,339.69,342.66,5680400,342.66],["2009-02-13",362.19,362.99,355.23,357.68,4146700,357.68],["2009-02-12",353.16,363.62,351.48,363.05,5550300,363.05],["2009-02-11",358.95,365,353,358.04,5231600,358.04],["2009-02-10",375.98,377.5,357.89,358.51,7103700,358.51],["2009-02-09",371.28,381,367.3,378.77,4977300,378.77],["2009-02-06",356.46,373.81,355.44,371.28,7038100,371.28],["2009-02-05",340.91,355.38,337,353.72,7264400,353.72],["2009-02-04",340.07,354.44,339.17,343,6817400,343],["2009-02-03",342.57,343,333.83,340.45,6556500,340.45],["2009-02-02",334.29,345,332,340.57,5206900,340.57],["2009-01-30",344.69,348.8,336,338.53,4672000,338.53],["2009-01-29",344.54,345.05,340.11,343.32,7283800,343.32],["2009-01-28",337.98,352.33,336.31,348.67,7691400,348.67],["2009-01-27",326.45,333.87,324.27,331.48,4927300,331.48],["2009-01-26",324.85,328,320.56,323.87,4610700,323.87],["2009-01-23",309.27,331.96,304.22,324.7,10732800,324.7],["2009-01-22",298.04,309.35,295.15,306.5,8267000,306.5],["2009-01-21",288.35,303.5,288.35,303.08,4924500,303.08],["2009-01-20",299.14,299.5,282.75,282.75,5048200,282.75],["2009-01-16",305.02,308.25,295.7,299.67,5224400,299.67],["2009-01-15",297.57,303.58,286.79,298.99,5934500,298.99],["2009-01-14",310,313.8,297.75,300.97,5467900,300.97],["2009-01-13",311.77,320.6,310.39,314.32,4432500,314.32],["2009-01-12",316.31,318.95,310.23,312.69,3304300,312.69],["2009-01-09",327.5,327.5,313.4,315.07,4340500,315.07],["2009-01-08",318.28,325.19,317.34,325.19,3600700,325.19],["2009-01-07",328.32,330.91,318.75,322.01,4494500,322.01],["2009-01-06",332.98,340.8,326.39,334.06,6425200,334.06],["2009-01-05",321,331.24,315,328.05,4889000,328.05],["2009-01-02",308.6,321.82,305.5,321.32,3610500,321.32],["2008-12-31",304.2,311,302.61,307.65,2886800,307.65],["2008-12-30",300.8,306.81,298.71,303.11,3843500,303.11],["2008-12-29",300.22,301.38,291.58,297.42,3701900,297.42],["2008-12-26",304.07,305.26,298.31,300.36,1959100,300.36],["2008-12-24",301.48,306.34,298.38,302.95,1921500,302.95],["2008-12-23",300.43,303.31,296.67,298.02,3777700,298.02],["2008-12-22",308.56,309.5,290.63,297.11,3917600,297.11],["2008-12-19",310.99,317.79,309,310.17,5612600,310.17],["2008-12-18",316.7,320.35,309.11,310.28,4763500,310.28],["2008-12-17",318.64,322.13,312.42,315.24,5789700,315.24],["2008-12-16",314.52,329.5,311.27,325.28,7059600,325.28],["2008-12-15",314.01,318.49,305.11,310.67,6737900,310.67],["2008-12-12",295.71,316.47,294,315.76,5722100,315.76],["2008-12-11",304.17,312.88,297.8,300.22,6179200,300.22],["2008-12-10",309.24,314.9,304.51,308.82,5237000,308.82],["2008-12-09",297.69,318,297.01,305.97,6889900,305.97],["2008-12-08",289.99,309.44,282,302.11,8144300,302.11],["2008-12-05",271.02,284.24,264.02,283.99,6521200,283.99],["2008-12-04",276.53,283.49,268.77,274.34,4886600,274.34],["2008-12-03",269.85,281.36,265.34,279.43,5904800,279.43],["2008-12-02",269.73,277.78,262.58,275.11,5839700,275.11],["2008-12-01",286.68,287.38,265.98,265.99,5711200,265.99],["2008-11-28",290.58,296.45,288.28,292.96,2565500,292.96],["2008-11-26",280.28,295.46,276.2,292.09,6356600,292.09],["2008-11-25",268.68,286.66,267.32,282.05,10771200,282.05],["2008-11-24",269.26,269.95,249.01,257.44,10054700,257.44],["2008-11-21",262.51,269.37,247.3,262.43,10244500,262.43],["2008-11-20",274.89,282.94,259.04,259.56,9779400,259.56],["2008-11-19",295.39,300.19,278.58,280.18,7834600,280.18],["2008-11-18",301.57,303.73,285.35,297.42,8346100,297.42],["2008-11-17",303,310.16,297.95,300.12,7543800,300.12],["2008-11-14",303.25,324.99,302.56,310.02,9517100,310.02],["2008-11-13",291.77,313,280,312.08,13234700,312.08],["2008-11-12",302.05,312.49,287.76,291,10051100,291],["2008-11-11",308.69,316.3,300.52,311.46,10146600,311.46],["2008-11-10",328,329.44,309.47,318.78,8080100,318.78],["2008-11-07",333.12,341.15,325.33,331.14,4681300,331.14],["2008-11-06",339.97,344.42,325.81,331.22,8574800,331.22],["2008-11-05",362.15,368.88,341.31,342.24,6946500,342.24],["2008-11-04",353.44,372.36,345.5,366.94,7349900,366.94],["2008-11-03",357.58,362.99,341.43,346.49,5954500,346.49],["2008-10-31",356.16,371.96,354.27,359.36,7423300,359.36],["2008-10-30",368.46,372,358.37,359.69,7988900,359.69],["2008-10-29",365.79,371,352.37,358,9756600,358],["2008-10-28",339.05,369.31,328.51,368.75,8105400,368.75],["2008-10-27",334.81,343,325.6,329.49,6200700,329.49],["2008-10-24",326.47,350.47,324.74,339.29,7359000,339.29],["2008-10-23",353.65,358,337.99,352.32,6478900,352.32],["2008-10-22",356.99,369.69,344,355.67,6560000,355.67],["2008-10-21",372.39,383.78,362,362.75,5782000,362.75],["2008-10-20",379.75,380.98,359.59,379.32,6753400,379.32],["2008-10-17",378.96,386,363.55,372.54,14249200,372.54],["2008-10-16",332.76,356.5,309.44,353.02,16239700,353.02],["2008-10-15",354.65,359,338.83,339.17,6721400,339.17],["2008-10-14",393.53,394.5,357,362.71,7784800,362.71],["2008-10-13",355.79,381.95,345.75,381.02,8905500,381.02],["2008-10-10",313.16,341.89,310.3,332,10597800,332],["2008-10-09",344.52,348.57,321.67,328.98,8075000,328.98],["2008-10-08",330.16,358.99,326.11,338.11,11826400,338.11],["2008-10-07",373.33,374.98,345.37,346.01,11054400,346.01],["2008-10-06",373.98,375.99,357.16,371.21,11220600,371.21],["2008-10-03",397.35,412.5,383.07,386.91,7992900,386.91],["2008-10-02",409.79,409.98,386,390.49,5984900,390.49],["2008-10-01",411.15,416.98,403.1,411.72,6234800,411.72],["2008-09-30",395.98,425.08,392.32,400.52,3086300,400.52],["2008-09-29",419.51,423.51,380.71,381,10762900,381],["2008-09-26",428,437.16,421.03,431.04,5292500,431.04],["2008-09-25",438.84,450,435.98,439.6,5020300,439.6],["2008-09-24",430.34,445,430.11,435.11,4242000,435.11],["2008-09-23",433.25,440.79,425.72,429.27,5204200,429.27],["2008-09-22",454.13,454.13,429,430.14,4407300,430.14],["2008-09-19",461,462.07,443.28,449.15,10006000,449.15],["2008-09-18",422.64,439.18,410.5,439.08,8589400,439.08],["2008-09-17",438.48,439.14,413.44,414.49,9126900,414.49],["2008-09-16",425.96,449.28,425.49,442.93,6990700,442.93],["2008-09-15",424,441.97,423.71,433.86,6567400,433.86],["2008-09-12",430.21,441.99,429,437.66,6028000,437.66],["2008-09-11",408.35,435.09,406.38,433.75,6471400,433.75],["2008-09-10",424.47,424.48,409.68,414.16,6226800,414.16],["2008-09-09",423.17,432.38,415,418.66,7229600,418.66],["2008-09-08",452.02,452.94,417.55,419.95,9017900,419.95],["2008-09-05",445.49,452.46,440.08,444.25,4534300,444.25],["2008-09-04",460,463.24,449.4,450.26,4848500,450.26],["2008-09-03",468.73,474.29,459.58,464.41,4314600,464.41],["2008-09-02",476.77,482.18,461.42,465.25,6111500,465.25],["2008-08-29",469.75,471.01,462.33,463.29,3848200,463.29],["2008-08-28",472.49,476.45,470.33,473.78,3029700,473.78],["2008-08-27",473.73,474.83,464.84,468.58,4387100,468.58],["2008-08-26",483.46,483.46,470.59,474.16,3308200,474.16],["2008-08-25",486.11,497,481.5,483.01,2014300,483.01],["2008-08-22",491.5,494.88,489.48,490.59,2297200,490.59],["2008-08-21",482.92,489.9,479.27,486.53,3514100,486.53],["2008-08-20",494.72,496.69,482.57,485,3982100,485],["2008-08-19",490.43,498.28,486.63,490.5,3046500,490.5],["2008-08-18",509.84,510,495.51,498.3,3333900,498.3],["2008-08-15",506.99,510.66,505.5,510.15,3545700,510.15],["2008-08-14",497.7,507.61,496.29,505.49,2918600,505.49],["2008-08-13",501.6,503.54,493.88,500.03,3625500,500.03],["2008-08-12",502,506.13,498,502.61,2755700,502.61],["2008-08-11",492.47,508.88,491.78,500.84,4239300,500.84],["2008-08-08",480.15,495.75,475.69,495.01,3739300,495.01],["2008-08-07",482,484,476.41,479.12,2773800,479.12],["2008-08-06",478.37,489.77,472.51,486.34,3375800,486.34],["2008-08-05",467.59,480.08,466.33,479.85,3584500,479.85],["2008-08-04",468.12,473.01,461.9,463,2487000,463],["2008-08-01",472.51,473.22,462.5,467.86,3007900,467.86],["2008-07-31",474.56,480.89,471.44,473.75,2865100,473.75],["2008-07-30",485.5,486.02,472.81,482.7,3490700,482.7],["2008-07-29",479.3,487.26,478,483.11,2802800,483.11],["2008-07-28",492.09,492.09,475.13,477.12,3160000,477.12],["2008-07-25",486.49,493.13,481.5,491.98,3183500,491.98],["2008-07-24",496.7,496.87,475.62,475.62,3540900,475.62],["2008-07-23",481.61,497.23,478.1,489.22,4894100,489.22],["2008-07-22",466.72,480.25,465.6,477.11,4691500,477.11],["2008-07-21",480.88,484.09,465.7,468.8,5901500,468.8],["2008-07-18",498.35,498.98,478.19,481.32,11292400,481.32],["2008-07-17",534.16,537.05,524.5,533.44,8787400,533.44],["2008-07-16",514.04,536.5,510.6,535.6,4742200,535.6],["2008-07-15",516.28,527.5,501.1,516.09,6071000,516.09],["2008-07-14",539,540.06,515.45,521.62,4424800,521.62],["2008-07-11",536.5,539.5,519.43,533.8,4981400,533.8],["2008-07-10",545,549.5,530.72,540.57,4331700,540.57],["2008-07-09",550.76,555.68,540.73,541.55,4154000,541.55],["2008-07-08",545.99,555.19,540,554.53,4932400,554.53],["2008-07-07",542.3,549,535.6,543.91,4255200,543.91],["2008-07-03",530.88,539.23,527.5,537,2400500,537],["2008-07-02",536.51,540.38,526.06,527.04,4223000,527.04],["2008-07-01",519.58,536.72,517,534.73,4959900,534.73],["2008-06-30",532.47,538,523.06,526.42,3765300,526.42],["2008-06-27",527.68,530,515.09,528.07,5447500,528.07],["2008-06-26",544.1,544.93,528.26,528.82,5659500,528.82],["2008-06-25",544.97,557.8,543.67,551,4122200,551],["2008-06-24",545.14,551.19,535.1,542.3,4672600,542.3],["2008-06-23",545.36,553.15,542.02,545.21,3635900,545.21],["2008-06-20",556.98,556.98,544.51,546.43,5983100,546.43],["2008-06-19",555.35,563.78,550.81,560.2,5683100,560.2],["2008-06-18",564.51,568.99,559.16,562.38,3381200,562.38],["2008-06-17",576.35,578.07,568.38,569.46,3462900,569.46],["2008-06-16",566.5,579.1,566.5,572.81,3542800,572.81],["2008-06-13",561.49,575.7,561.34,571.51,6184400,571.51],["2008-06-12",548.76,558,546.88,552.95,5491600,552.95],["2008-06-11",556.24,557.34,544.46,545.2,3812900,545.2],["2008-06-10",549.56,558.82,546.78,554.17,3657400,554.17],["2008-06-09",568.06,570,545.4,557.87,5288300,557.87],["2008-06-06",579.75,580.72,567,567,4734500,567],["2008-06-05",577.08,588.04,576.21,586.3,3916700,586.3],["2008-06-04",565.33,578,564.55,572.22,3363200,572.22],["2008-06-03",576.5,580.5,560.61,567.3,4305300,567.3],["2008-06-02",582.5,583.89,571.27,575,3674200,575],["2008-05-30",583.47,589.92,581.3,585.8,3225200,585.8],["2008-05-29",574.79,585.88,573.2,583,4845000,583],["2008-05-28",567.94,571.49,561.1,568.24,4050400,568.24],["2008-05-27",544.96,562.6,543.85,560.9,3865500,560.9],["2008-05-23",546.96,553,537.81,544.62,4431500,544.62],["2008-05-22",551.95,554.21,540.25,549.46,5076300,549.46],["2008-05-21",578.52,581.41,547.89,549.99,6468100,549.99],["2008-05-20",574.63,582.48,572.91,578.6,3313600,578.6],["2008-05-19",578.55,588.88,573.52,577.52,5604500,577.52],["2008-05-16",581.43,584.68,578.32,580.07,4274100,580.07],["2008-05-15",579,582.95,575.61,581,4342700,581],["2008-05-14",586.49,591.19,575.25,576.3,4375800,576.3],["2008-05-13",586.23,587.95,578.55,583,5163500,583],["2008-05-12",574.75,586.75,568.91,584.94,4863900,584.94],["2008-05-09",579,585,571.3,573.2,4484900,573.2],["2008-05-08",586.2,589.3,578.91,583.01,5122900,583.01],["2008-05-07",590.27,599.49,576.43,579,6613000,579],["2008-05-06",591,592,583,586.36,4629300,586.36],["2008-05-05",598.86,599,587.13,594.9,6281000,594.9],["2008-05-02",598.49,602.45,579.3,581.29,6998800,581.29],["2008-05-01",578.31,594.93,576.97,593.08,6602800,593.08],["2008-04-30",562.21,584.86,558.47,574.29,7903000,574.29],["2008-04-29",550.83,563.4,550.01,558.47,4346000,558.47],["2008-04-28",545.88,556.81,539,552.12,4008600,552.12],["2008-04-25",549.02,553,542.73,544.06,4164400,544.06],["2008-04-24",551.29,554.49,540.02,543.04,4135100,543.04],["2008-04-23",557.94,559.31,540.95,546.49,4921500,546.49],["2008-04-22",537.57,560.83,537.56,555,7938500,555],["2008-04-21",539.39,542.59,530.29,537.79,7439700,537.79],["2008-04-18",535.21,547.7,524.77,539.41,18235600,539.41],["2008-04-17",455.63,459.37,446.52,449.54,13353000,449.54],["2008-04-16",444.4,458.28,441,455.03,7630700,455.03],["2008-04-15",458.13,459.72,443.72,446.84,4577600,446.84],["2008-04-14",457.16,457.45,450.15,451.66,3842600,451.66],["2008-04-11",464.07,467.26,455.01,457.45,4169700,457.45],["2008-04-10",464.96,473.86,461.85,469.08,5072400,469.08],["2008-04-09",469.13,472,457.54,464.19,6048100,464.19],["2008-04-08",473.04,474.14,462.01,467.81,4547000,467.81],["2008-04-07",477.03,485.44,473.53,476.82,5943500,476.82],["2008-04-04",457.01,477.83,456.2,471.09,5897200,471.09],["2008-04-03",461.73,463.29,448.13,455.12,6778400,455.12],["2008-04-02",469.9,475.74,460.39,465.7,5999000,465.7],["2008-04-01",447.74,466.5,446.87,465.71,6093100,465.71],["2008-03-31",435.64,442.69,432.01,440.47,4446400,440.47],["2008-03-28",447.46,453.57,434.31,438.08,4376200,438.08],["2008-03-27",446,448.61,440.49,444.08,5832200,444.08],["2008-03-26",452.59,462.87,449.29,458.19,5225700,458.19],["2008-03-25",457.46,457.47,446,450.78,5831600,450.78],["2008-03-24",438.43,465.78,437.72,460.56,6763500,460.56],["2008-03-20",427.32,435.7,417.5,433.55,9913400,433.55],["2008-03-19",441.11,447.5,431.67,432,6179000,432],["2008-03-18",428.98,440.84,425.53,439.16,7237200,439.16],["2008-03-17",427.99,433.71,412.11,419.87,7888200,419.87],["2008-03-14",442.98,449.34,430.62,437.92,6574400,437.92],["2008-03-13",432.67,446.98,428.78,443.01,7726600,443.01],["2008-03-12",440.01,447.88,438.07,440.18,6651900,440.18],["2008-03-11",425.26,440.15,424.65,439.84,8826900,439.84],["2008-03-10",428.83,431,413.04,413.62,7987600,413.62],["2008-03-07",428.88,440,426.24,433.35,8071800,433.35],["2008-03-06",447.69,453.3,431.18,432.7,7470100,432.7],["2008-03-05",445.25,454.17,444,447.7,7436600,447.7],["2008-03-04",450.95,453.36,435.78,444.6,13621700,444.6],["2008-03-03",471.51,472.72,450.11,457.02,7554500,457.02],["2008-02-29",471.87,479.74,464.65,471.18,9425400,471.18],["2008-02-28",470.5,479.09,467.36,475.39,6586900,475.39],["2008-02-27",460.13,475.49,459.64,472.86,10121900,472.86],["2008-02-26",461.2,466.47,446.85,464.19,23287300,464.19],["2008-02-25",505.95,506.5,485.74,486.44,8372800,486.44],["2008-02-22",502.06,509,497.55,507.8,5515900,507.8],["2008-02-21",512.85,513.21,499.5,502.86,5677800,502.86],["2008-02-20",503.51,511.01,498.82,509,6662200,509],["2008-02-19",534.94,535.06,506.5,508.95,6350400,508.95],["2008-02-15",528.31,532.66,524.33,529.64,5240100,529.64],["2008-02-14",538.35,541.04,531,532.25,6476700,532.25],["2008-02-13",522.5,534.99,518.69,534.62,6624700,534.62],["2008-02-12",523.39,530.6,513.03,518.09,6662300,518.09],["2008-02-11",520.52,523.71,513.4,521.16,5826000,521.16],["2008-02-08",509.41,517.73,508.7,516.69,6828900,516.69],["2008-02-07",496.86,514.19,494.76,504.95,7928900,504.95],["2008-02-06",511.14,511.17,497.93,501.71,7636400,501.71],["2008-02-05",489.43,509,488.52,506.8,11203300,506.8],["2008-02-04",509.07,512.78,492.55,495.43,13157100,495.43],["2008-02-01",528.67,536.67,510,515.9,17600500,515.9],["2008-01-31",539.01,573,534.29,564.3,14871300,564.3],["2008-01-30",549.19,560.43,543.51,548.27,7939600,548.27],["2008-01-29",560.47,561.33,540.67,550.52,6283000,550.52],["2008-01-28",570.97,572.24,548.6,555.98,5816700,555.98],["2008-01-25",591.81,595,566.18,566.4,6966000,566.4],["2008-01-24",558.8,579.69,554.14,574.49,9400900,574.49],["2008-01-23",560.71,568,519,548.62,16965700,548.62],["2008-01-22",562.03,597.5,561.2,584.35,9501500,584.35],["2008-01-18",608.36,609.99,598.45,600.25,8539600,600.25],["2008-01-17",620.76,625.74,598.01,600.79,8216800,600.79],["2008-01-16",628.97,639.99,601.93,615.95,10560000,615.95],["2008-01-15",645.9,649.05,635.38,637.65,5568200,637.65],["2008-01-14",651.14,657.4,645.25,653.82,4447500,653.82],["2008-01-11",642.7,649.47,630.11,638.25,4977000,638.25],["2008-01-10",645.01,657.2,640.11,646.73,6334200,646.73],["2008-01-09",630.04,653.34,622.51,653.2,6739700,653.2],["2008-01-08",653,659.96,631,631.68,5339100,631.68],["2008-01-07",653.94,662.28,637.35,649.25,6403400,649.25],["2008-01-04",679.69,680.96,655,657,5359800,657],["2008-01-03",685.26,686.85,676.52,685.33,3252500,685.33],["2008-01-02",692.87,697.37,677.73,685.19,4306900,685.19],["2007-12-31",698.57,702.49,690.58,691.48,2376200,691.48],["2007-12-28",704.93,707.95,696.54,702.53,2562700,702.53],["2007-12-27",707.07,716,700.74,700.74,2942500,700.74],["2007-12-26",698.99,713.22,698.21,710.84,2530000,710.84],["2007-12-24",694.99,700.73,693.06,700.73,1628400,700.73],["2007-12-21",697.88,699.26,693.24,696.69,5382000,696.69],["2007-12-20",685.83,691,680.61,689.69,4422200,689.69],["2007-12-19",674.21,679.5,669,677.37,4421100,677.37],["2007-12-18",674.16,676.71,652.5,673.35,7166700,673.35],["2007-12-17",688,695.42,663.67,669.23,5486000,669.23],["2007-12-14",687.51,699.7,687.26,689.96,3673500,689.96],["2007-12-13",696.31,697.62,681.21,694.05,5040800,694.05],["2007-12-12",714,714.32,688.5,699.35,6159100,699.35],["2007-12-11",719.94,720.99,698.78,699.2,6139100,699.2],["2007-12-10",715.99,724.8,714,718.42,3856200,718.42],["2007-12-07",714.99,718,710.5,714.87,3852100,714.87],["2007-12-06",697.8,716.56,697.01,715.26,4909000,715.26],["2007-12-05",692.73,698.93,687.5,698.51,4209600,698.51],["2007-12-04",678.31,692,677.12,684.16,4231800,684.16],["2007-12-03",691.01,695,681.14,681.53,4325100,681.53],["2007-11-30",711,711.06,682.11,693,7895500,693],["2007-11-29",690.75,702.79,687.77,697,6208000,697],["2007-11-28",682.11,694.3,672.14,692.26,7916500,692.26],["2007-11-27",674.8,676.43,650.26,673.57,8904500,673.57],["2007-11-26",680.2,693.4,665,666,6790100,666],["2007-11-23",670,678.28,668.11,676.7,2738700,676.7],["2007-11-21",643.77,669.97,642.08,660.52,7013500,660.52],["2007-11-20",636.48,659.1,632.87,648.54,9840600,648.54],["2007-11-19",629.59,636.77,618.5,625.85,5527400,625.85],["2007-11-16",633.94,635.49,616.02,633.63,9042800,633.63],["2007-11-15",638.57,647.5,624,629.65,6967700,629.65],["2007-11-14",673.28,675.49,636.27,641.68,8094700,641.68],["2007-11-13",644.99,660.92,632.07,660.55,8426100,660.55],["2007-11-12",657.74,669.93,626.21,632.07,10227300,632.07],["2007-11-09",675.78,681.88,661.21,663.97,11388100,663.97],["2007-11-08",734.6,734.89,677.18,693.84,16512200,693.84],["2007-11-07",741.13,747.24,723.14,732.94,8252900,732.94],["2007-11-06",737.56,741.79,725,741.79,8436300,741.79],["2007-11-05",706.99,730.23,706.07,725.65,8883700,725.65],["2007-11-02",710.51,713.58,697.34,711.25,5841500,711.25],["2007-11-01",702.79,713.72,701.78,703.21,6527200,703.21],["2007-10-31",700.69,707,696.04,707,6876800,707],["2007-10-30",677.51,699.91,677.51,694.77,6900600,694.77],["2007-10-29",677.77,680,672.09,679.23,3066300,679.23],["2007-10-26",674.03,676.54,668.06,674.6,3353900,674.6],["2007-10-25",678.68,678.97,663.55,668.51,5795500,668.51],["2007-10-24",672.71,677.47,659.56,675.82,7404200,675.82],["2007-10-23",661.25,677.6,660,675.77,6793700,675.77],["2007-10-22",638.67,655,636.28,650.75,6664400,650.75],["2007-10-19",654.56,658.49,643.23,644.71,15789000,644.71],["2007-10-18",635.41,641.37,628.5,639.62,12289200,639.62],["2007-10-17",630.45,634,621.59,633.48,6030500,633.48],["2007-10-16",618.49,625.92,611.99,616,6025300,616],["2007-10-15",638.47,639.86,615.55,620.11,6943800,620.11],["2007-10-12",623.98,638.4,618.24,637.39,6823700,637.39],["2007-10-11",633.64,641.41,609,622,11799000,622],["2007-10-10",621.36,625.68,616.8,625.39,5385600,625.39],["2007-10-09",615.11,623.78,608.39,615.18,8767800,615.18],["2007-10-08",595,610.26,593.95,609.62,5028000,609.62],["2007-10-05",587.11,596,587.01,594.05,5068700,594.05],["2007-10-04",585.09,585.09,577.06,579.03,2986700,579.03],["2007-10-03",586.25,588.99,580.36,584.02,3879500,584.02],["2007-10-02",583.38,596.81,580.01,584.39,7067500,584.39],["2007-10-01",569.97,584.35,569.61,582.55,4711300,582.55],["2007-09-28",567,569.55,564.12,567.27,2639500,567.27],["2007-09-27",571.73,571.74,565.78,567.5,2056300,567.5],["2007-09-26",570.4,571.79,563.81,568.16,3346100,568.16],["2007-09-25",564,569.56,562.86,569,2730600,569],["2007-09-24",561,571.46,560,568.02,5297000,568.02],["2007-09-21",556.34,560.79,552.83,560.1,8011700,560.1],["2007-09-20",547,556.8,546.03,552.83,5525000,552.83],["2007-09-19",539.27,549.45,538.86,546.85,5526900,546.85],["2007-09-18",526.52,537.25,524.27,535.27,4215700,535.27],["2007-09-17",526.53,529.28,524.07,525.3,2197500,525.3],["2007-09-14",523.2,530.27,522.22,528.75,2764900,528.75],["2007-09-13",524.06,527.21,523.22,524.78,1891100,524.78],["2007-09-12",520.53,527.98,519,522.65,2986000,522.65],["2007-09-11",516.99,521.65,515.73,521.33,2703600,521.33],["2007-09-10",521.28,522.07,510.88,514.48,3225800,514.48],["2007-09-07",517.86,521.24,516.8,519.35,3663600,519.35],["2007-09-06",529.36,529.83,518.24,523.52,3625900,523.52],["2007-09-05",523.4,529.48,522.25,527.8,3312900,527.8],["2007-09-04",515.02,528,514.62,525.15,3693700,525.15],["2007-08-31",513.1,516.5,511.47,515.25,2977600,515.25],["2007-08-30",512.36,515.4,510.58,511.4,2651700,511.4],["2007-08-29",507.84,513.3,507.23,512.88,2549300,512.88],["2007-08-28",511.53,514.98,505.79,506.4,3273900,506.4],["2007-08-27",514.43,517.45,511.4,513.26,2325100,513.26],["2007-08-24",512.61,515.55,508.5,515,2472700,515],["2007-08-23",516,516.13,507,512.19,3076700,512.19],["2007-08-22",509.96,516.25,509.25,512.75,3252700,512.75],["2007-08-21",498.94,508.16,497.77,506.61,3610600,506.61],["2007-08-20",502.46,502.56,496,497.92,2697300,497.92],["2007-08-17",497.44,501,491.65,500.04,5479400,500.04],["2007-08-16",492.02,496.43,480.46,491.52,8645600,491.52],["2007-08-15",509,511.69,496.71,497.55,5409500,497.55],["2007-08-14",515.72,517.4,508,508.6,3633700,508.6],["2007-08-13",519.54,519.75,513.03,515.5,3179300,515.5],["2007-08-10",510.18,518.72,505.63,515.75,5875200,515.75],["2007-08-09",520.8,526.82,514.63,514.73,4846500,514.73],["2007-08-08",519.34,525.78,517.09,525.78,4068800,525.78],["2007-08-07",509.75,519.88,509.04,516.02,4264300,516.02],["2007-08-06",503,510.15,502.5,510,3651500,510],["2007-08-03",510.05,513.2,503,503,3176200,503],["2007-08-02",513.72,514.99,509,511.01,3154900,511.01],["2007-08-01",510.5,516.51,508.14,512.94,4421500,512.94],["2007-07-31",520.23,520.44,510,510,4270500,510],["2007-07-30",512.92,519.34,510.5,516.11,3963300,516.11],["2007-07-27",508.53,516.62,505.5,511.89,5509100,511.89],["2007-07-26",508.74,512.59,498.88,508,6883400,508],["2007-07-25",516.98,517.02,505.56,509.76,5545000,509.76],["2007-07-24",509.3,518.69,507.11,514,5572100,514],["2007-07-23",519.01,520,512.15,512.51,6356700,512.51],["2007-07-20",511.9,523.18,509.5,520.12,17772300,520.12],["2007-07-19",553.46,553.52,542.24,548.59,11127200,548.59],["2007-07-18",553.89,554.5,543.81,549.5,6080000,549.5],["2007-07-17",555.04,557.73,552.38,555,4328600,555],["2007-07-16",550.3,558.58,549.31,552.99,6599500,552.99],["2007-07-13",547.91,552.67,547.25,552.16,5237100,552.16],["2007-07-12",545.86,547.32,540.22,545.33,3441600,545.33],["2007-07-11",543.61,546.5,540.01,544.47,3309300,544.47],["2007-07-10",543.79,547,541.65,543.34,3856000,543.34],["2007-07-09",543,548.74,540.26,542.56,3729800,542.56],["2007-07-06",541.25,543.87,538.73,539.4,2747000,539.4],["2007-07-05",535.56,544.4,532.15,541.63,4942900,541.63],["2007-07-03",531.06,534.4,527.5,534.34,1871800,534.34],["2007-07-02",525.49,531.85,524.2,530.38,3487600,530.38],["2007-06-29",526.02,527.4,519.46,522.7,3880600,522.7],["2007-06-28",524.88,529.5,523.8,525.01,4168400,525.01],["2007-06-27",525,527.99,519.56,526.29,6123100,526.29],["2007-06-26",532.73,533.2,526.24,530.26,5689500,530.26],["2007-06-25",528.98,534.99,523.38,527.42,7925000,527.42],["2007-06-22",516.42,524.99,516.1,524.98,7203700,524.98],["2007-06-21",510.98,515.29,506.28,514.11,4409700,514.11],["2007-06-20",516.96,518.75,509.06,509.97,4338200,509.97],["2007-06-19",514.01,517.25,511.54,514.31,4355300,514.31],["2007-06-18",506.18,516,504.24,515.2,4835900,515.2],["2007-06-15",508.19,509,501.23,505.89,6174100,505.89],["2007-06-14",505.38,505.88,501.7,502.84,4621200,502.84],["2007-06-13",507.09,508.54,498.69,505.24,7034000,505.24],["2007-06-12",508.71,511.67,503.17,504.77,6419500,504.77],["2007-06-11",514.02,518.25,510,511.34,4647700,511.34],["2007-06-08",516.2,519.64,509.46,515.49,6358200,515.49],["2007-06-07",519.75,526.5,512.51,515.06,10630500,515.06],["2007-06-06",516.75,520.78,515.26,518.25,7886700,518.25],["2007-06-05",509.75,519,506.61,518.84,10447100,518.84],["2007-06-04",497.91,510.51,497.59,507.07,7101000,507.07],["2007-06-01",501,505.02,497.93,500.4,4799000,500.4],["2007-05-31",500.56,508.78,497.06,497.91,8924300,497.91],["2007-05-30",484.5,498.84,483,498.6,7245800,498.6],["2007-05-29",485,491.8,484,487.11,5218000,487.11],["2007-05-25",479.7,484.95,477.27,483.52,5348500,483.52],["2007-05-24",475.15,479.2,471.5,474.33,4173600,474.33],["2007-05-23",480.82,483.41,473.75,473.97,5060200,473.97],["2007-05-22",473,479.01,473,475.86,3839000,475.86],["2007-05-21",469.53,479.2,466.72,470.6,6159300,470.6],["2007-05-18",472.03,472.7,469.75,470.32,3695900,470.32],["2007-05-17",472.46,475.22,470.81,470.96,4660600,470.96],["2007-05-16",462,473.14,459.02,472.61,6554200,472.61],["2007-05-15",461.96,462.54,457.41,458,4119000,458],["2007-05-14",465.48,467.51,460,461.78,3872700,461.78],["2007-05-11",461.83,467,461,466.74,2944100,466.74],["2007-05-10",467.04,469.49,461.02,461.47,3686300,461.47],["2007-05-09",466.15,471.73,463.88,469.25,3889900,469.25],["2007-05-08",466.13,468.17,464.73,466.81,2905100,466.81],["2007-05-07",472.14,472.82,466.47,467.27,3020100,467.27],["2007-05-04",470.12,474.84,465.88,471.12,3950000,471.12],["2007-05-03",466.22,474.07,465.29,473.23,3594200,473.23],["2007-05-02",468.65,471.08,465.73,465.78,3062700,465.78],["2007-05-01",472.19,472.81,464.17,469,3658200,469],["2007-04-30",479.15,481.35,471.38,471.38,3641200,471.38],["2007-04-27",480.07,482.4,478.33,479.01,2925700,479.01],["2007-04-26",478.1,484.45,477.11,481.18,4124900,481.18],["2007-04-25",480,481.37,476.11,477.99,3966800,477.99],["2007-04-24",478.61,479.98,475.55,477.53,3694700,477.53],["2007-04-23",480.1,485,478.26,479.08,5674600,479.08],["2007-04-20",490.52,492.5,482.02,482.48,12161500,482.48],["2007-04-19",474.5,481.95,469.59,471.65,11009600,471.65],["2007-04-18",471.26,479.9,469.53,476.01,5670500,476.01],["2007-04-17",473.8,476.39,471.6,472.8,3210100,472.8],["2007-04-16",468.46,476.99,468.15,474.27,5077900,474.27],["2007-04-13",468.45,468.77,463.36,466.29,2794800,466.29],["2007-04-12",464,468,462.24,467.39,2707900,467.39],["2007-04-11",466.06,469.4,462.61,464.53,3812000,464.53],["2007-04-10",467.09,470.79,465.16,466.5,2979300,466.5],["2007-04-09",472.98,473,465.59,468.21,3062100,468.21],["2007-04-05",471.3,472.09,469.62,471.51,2715800,471.51],["2007-04-04",472.14,473,469.58,471.02,3778800,471.02],["2007-04-03",464.05,474.25,464,472.6,6501800,472.6],["2007-04-02",457.76,458.53,452.12,458.53,3448500,458.53],["2007-03-30",462.1,463.4,456.14,458.16,3380200,458.16],["2007-03-29",464.55,466,455,460.92,3988500,460.92],["2007-03-28",461.87,465.44,460.15,461.88,4591600,461.88],["2007-03-27",463.55,465.23,460.34,463.62,3741200,463.62],["2007-03-26",460.55,465,455.62,465,4710300,465],["2007-03-23",461.45,463.39,457.08,461.83,4111300,461.83],["2007-03-22",455.61,462.17,452.53,462.04,5680700,462.04],["2007-03-21",445.3,456.57,445.21,456.55,5798300,456.55],["2007-03-20",445.79,447.6,443.6,445.28,3421500,445.28],["2007-03-19",443.25,448.5,440.63,447.23,5197700,447.23],["2007-03-16",445.65,446.7,439.89,440.85,5659100,440.85],["2007-03-15",447.86,449.82,443.94,446.19,3944200,446.19],["2007-03-14",443.23,448.66,439,448,8016900,448],["2007-03-13",450.11,451.93,442.83,443.03,6377300,443.03],["2007-03-12",452.57,455.25,451.11,454.75,3465400,454.75],["2007-03-09",458,458.4,450.1,452.96,4977700,452.96],["2007-03-08",459.22,465.5,454.1,454.72,5362800,454.72],["2007-03-07",462.69,463.14,454.29,455.64,6534100,455.64],["2007-03-06",447.47,459,447.38,457.55,7533700,457.55],["2007-03-05",437.02,445.5,437,440.95,6355100,440.95],["2007-03-02",445.11,448.7,438.68,438.68,6583600,438.68],["2007-03-01",442.67,452.42,440,448.23,8685200,448.23],["2007-02-28",450.41,453.67,443.04,449.45,8032300,449.45],["2007-02-27",455,459.8,447.17,448.77,9312800,448.77],["2007-02-26",472.83,475.25,463.75,464.93,3969900,464.93],["2007-02-23",475.75,476.95,467.8,470.62,3882600,470.62],["2007-02-22",478.69,484.24,474.39,475.85,5743900,475.85],["2007-02-21",469.84,478.68,467.74,475.86,5640600,475.86],["2007-02-20",468.47,472.75,464.71,472.1,4067600,472.1],["2007-02-16",462.8,470.15,462.06,469.94,6177000,469.94],["2007-02-15",466,466.13,460.72,461.47,4042400,461.47],["2007-02-14",460,469.13,459.22,465.93,5698800,465.93],["2007-02-13",459.15,462.78,457.26,459.1,4062600,459.1],["2007-02-12",460.68,462.39,455.02,458.29,5754500,458.29],["2007-02-09",471.65,472.68,461.5,461.89,4858600,461.89],["2007-02-08",468.05,473.75,465.15,471.03,4076700,471.03],["2007-02-07",473.82,474.35,468.78,470.01,4119800,470.01],["2007-02-06",468.1,473.3,467.26,471.48,5321900,471.48],["2007-02-05",477.5,478,466.19,467.16,7206900,467.16],["2007-02-02",482.61,485,477.81,481.5,6286500,481.5],["2007-02-01",506,506.01,481.53,481.75,15658700,481.75],["2007-01-31",496.49,505,495.51,501.5,12206100,501.5],["2007-01-30",494,498,491.22,494.32,4180500,494.32],["2007-01-29",498,498.75,490.5,492.47,4775700,492.47],["2007-01-26",490.93,497.9,487.03,495.84,5496500,495.84],["2007-01-25",501,504.5,485.66,488.09,6368500,488.09],["2007-01-24",484.45,499.54,483.29,499.07,6059300,499.07],["2007-01-23",480.79,484.75,477.29,479.05,4665500,479.05],["2007-01-22",492.5,492.65,478.5,480.84,5404300,480.84],["2007-01-19",487.98,490.76,486.74,489.75,4978300,489.75],["2007-01-18",494.52,496.48,487.43,487.83,5932000,487.83],["2007-01-17",503.39,507.77,494.38,497.28,6699100,497.28],["2007-01-16",507.55,513,503.3,504.28,7568900,504.28],["2007-01-12",501.99,505,500,505,4473700,505],["2007-01-11",497.2,501.75,496.18,499.72,7208200,499.72],["2007-01-10",484.43,493.55,482.04,489.46,5968500,489.46],["2007-01-09",485.45,488.25,481.2,485.5,5381400,485.5],["2007-01-08",487.69,489.87,482.2,483.58,4754400,483.58],["2007-01-05",482.5,487.5,478.11,487.19,6872100,487.19],["2007-01-04",469,483.95,468.35,483.26,7887600,483.26],["2007-01-03",466,476.66,461.11,467.59,7706500,467.59],["2006-12-29",462.1,464.47,459.86,460.48,2559200,460.48],["2006-12-28",467.12,468.58,462.25,462.56,3116200,462.56],["2006-12-27",460,468.08,459.1,468.03,4231500,468.03],["2006-12-26",456.52,459.47,454.59,457.53,2074300,457.53],["2006-12-22",457.5,458.64,452.73,455.58,3988300,455.58],["2006-12-21",464.18,465.25,452.34,456.2,6953300,456.2],["2006-12-20",470,471.5,462.33,462.9,4367800,462.9],["2006-12-19",461.72,469.31,458.5,468.63,6587000,468.63],["2006-12-18",482.51,482.74,460.72,462.8,8016600,462.8],["2006-12-15",482.64,484.11,479.84,480.3,5190800,480.3],["2006-12-14",480.25,483.75,477.26,482.12,4748900,482.12],["2006-12-13",484.69,485.5,477.02,478.99,4662100,478.99],["2006-12-12",483.85,486.36,480.28,481.78,4181000,481.78],["2006-12-11",484.92,488.9,483.8,483.93,3263400,483.93],["2006-12-08",481.94,488.6,480,484.11,3974900,484.11],["2006-12-07",490.23,491.8,482.42,482.64,4664300,482.64],["2006-12-06",486.96,492.4,484.52,488.71,4450300,488.71],["2006-12-05",487.4,489.44,484.89,487,4103000,487],["2006-12-04",483,487.43,479.35,484.85,4899900,484.85],["2006-12-01",485.98,488.39,478.5,480.8,5631400,480.8],["2006-11-30",484.19,490.4,481.55,484.81,5577500,484.81],["2006-11-29",494.24,494.74,482.25,484.65,6315300,484.65],["2006-11-28",481.13,489.86,477.03,489.5,7797600,489.5],["2006-11-27",501.37,501.78,484.75,484.75,7324700,484.75],["2006-11-24",504.5,507.5,504,505,1732700,505],["2006-11-22",510.97,513,505.78,508.01,4500700,508.01],["2006-11-21",496.54,510,495.83,509.65,8427500,509.65],["2006-11-20",498.4,498.4,492.65,495.05,5124500,495.05],["2006-11-17",493.25,499.66,493,498.79,5511000,498.79],["2006-11-16",495,497.68,492.56,495.9,5092600,495.9],["2006-11-15",493.43,499.85,491.93,491.93,8370700,491.93],["2006-11-14",480.7,489.95,480.5,489.3,7223400,489.3],["2006-11-13",474.9,481.17,474.14,481.03,4341900,481.03],["2006-11-10",473.78,474.72,470.29,473.55,2796700,473.55],["2006-11-09",476.5,479.49,471.86,472.63,4879200,472.63],["2006-11-08",470.35,481.74,468.6,475,7965000,475],["2006-11-07",476.95,479.02,471.77,472.57,4897100,472.57],["2006-11-06",473.77,479.66,472.33,476.95,4991500,476.95],["2006-11-03",472.23,473.75,465.06,471.8,4907700,471.8],["2006-11-02",467.5,473.73,466.38,469.91,5236700,469.91],["2006-11-01",478.76,479.13,465.26,467.5,5426300,467.5],["2006-10-31",478.06,482.16,473.84,476.39,6285400,476.39],["2006-10-30",474.82,480.46,470.01,476.57,6563100,476.57],["2006-10-27",483.9,485.24,472.49,475.2,6604000,475.2],["2006-10-26",487.68,491.96,484.2,485.1,7031700,485.1],["2006-10-25",477.49,488.5,475.11,486.6,9187500,486.6],["2006-10-24",476.28,477.86,471.41,473.31,8660200,473.31],["2006-10-23",462.28,484.64,460.37,480.78,15104500,480.78],["2006-10-20",458.99,460.1,453.59,459.67,11647900,459.67],["2006-10-19",420.23,429.5,419.57,426.06,11503500,426.06],["2006-10-18",422.99,424.75,417.5,419.31,6017300,419.31],["2006-10-17",420.3,423.75,416.7,420.64,5211000,420.64],["2006-10-16",427.7,429.2,421.34,421.75,4319400,421.75],["2006-10-13",427.76,429.5,425.56,427.3,3622500,427.3],["2006-10-12",428.56,429.68,424,427.44,4844000,427.44],["2006-10-11",425.02,429.91,423.76,426.5,5635400,426.5],["2006-10-10",431.56,437.85,422.39,426.65,9788600,426.65],["2006-10-09",424.8,431.95,423.42,429,7583300,429],["2006-10-06",410.22,421.91,409.75,420.5,7336500,420.5],["2006-10-05",414.7,418.24,410.86,411.81,5789800,411.81],["2006-10-04",404.97,415.77,403.05,415.7,6661800,415.7],["2006-10-03",401.29,406.46,398.19,404.04,5464700,404.04],["2006-10-02",401.9,406,400.8,401.44,3651900,401.44],["2006-09-29",405.13,405.62,401.41,401.9,3310900,401.9],["2006-09-28",404.08,406.98,400.54,403.58,5107400,403.58],["2006-09-27",406.3,411.22,402.37,402.92,5876700,402.92],["2006-09-26",405.5,407.68,401.77,406.87,5289400,406.87],["2006-09-25",405.58,409.45,402.5,403.98,5737300,403.98],["2006-09-22",404.98,407.45,401.36,403.78,4649600,403.78],["2006-09-21",400.3,408.45,399.86,406.85,10692100,406.85],["2006-09-20",407.1,407.39,394.62,397,9147800,397],["2006-09-19",415.46,415.49,392.74,403.81,14292900,403.81],["2006-09-18",410,418.69,409.47,414.69,7106700,414.69],["2006-09-15",407.48,410.05,406.74,409.88,7838200,409.88],["2006-09-14",404.3,406.28,401.93,403.98,5366100,403.98],["2006-09-13",395.15,406.76,395.1,406.57,9768200,406.57],["2006-09-12",385,392.73,384.88,391.9,5442200,391.9],["2006-09-11",378.26,384.69,377.77,384.09,4529200,384.09],["2006-09-08",376.72,380.79,376.72,377.85,3083400,377.85],["2006-09-07",379.39,381.75,377.4,378.49,3842000,378.49],["2006-09-06",382.1,383.19,379.66,380.14,3724100,380.14],["2006-09-05",379.87,385.4,377.44,384.36,4074300,384.36],["2006-09-01",380.99,381.28,377.19,378.6,2672900,378.6],["2006-08-31",381.49,382.15,378.2,378.53,2959900,378.53],["2006-08-30",379.21,384.65,378.51,380.75,4044400,380.75],["2006-08-29",380.78,382.32,377.2,378.95,4460000,378.95],["2006-08-28",375.61,380.95,375,380.95,4164000,380.95],["2006-08-25",373.08,375.32,372.5,373.26,2466700,373.26],["2006-08-24",374.44,376.4,372.26,373.73,3482500,373.73],["2006-08-23",377.64,378.27,372.66,373.43,3642300,373.43],["2006-08-22",377.73,379.26,374.84,378.29,4164100,378.29],["2006-08-21",378.1,379,375.22,377.3,4023300,377.3],["2006-08-18",386.31,387.09,380.75,383.36,4952200,383.36],["2006-08-17",386.39,390,383.92,385.8,5080200,385.8],["2006-08-16",383.48,388.45,382.12,387.72,5853200,387.72],["2006-08-15",374.11,381.67,372.6,380.97,6698200,380.97],["2006-08-14",371.5,375.13,368.67,369.43,4968300,369.43],["2006-08-11",374.4,375.28,368,368.5,3766500,368.5],["2006-08-10",373.88,377.67,372.46,374.2,4261900,374.2],["2006-08-09",382.8,384.68,376.36,376.94,4311000,376.94],["2006-08-08",382.82,384.5,379.09,381,5743200,381],["2006-08-07",371.5,379.73,371.15,377.95,3946900,377.95],["2006-08-04",379.56,380.68,371.75,373.85,5095200,373.85],["2006-08-03",364.98,377.91,363.36,375.39,6327000,375.39],["2006-08-02",375.6,377.17,365.2,367.23,7097800,367.23],["2006-08-01",385.11,385.77,375.51,375.51,5463200,375.51],["2006-07-31",388,389.17,383.31,386.6,4595300,386.6],["2006-07-28",382,389.56,381.73,388.12,4083600,388.12],["2006-07-27",387.37,387.49,377.95,382.4,5641100,382.4],["2006-07-26",388.2,391.91,383,385.5,5531900,385.5],["2006-07-25",385.02,391.31,383.8,389.36,5761100,389.36],["2006-07-24",392.82,393.89,381.21,390.9,8086100,390.9],["2006-07-21",386.14,391.75,377.69,390.11,11754600,390.11],["2006-07-20",404.28,404.44,385.66,387.12,12538700,387.12],["2006-07-19",395.01,401.14,394.66,399,8518500,399],["2006-07-18",409.75,410.57,397.74,403.05,8536800,403.05],["2006-07-17",404.63,411,403.72,407.89,5811900,407.89],["2006-07-14",410.33,411.49,398.61,403.5,7552100,403.5],["2006-07-13",414,418.34,406.83,408.83,6924500,408.83],["2006-07-12",422.09,422.74,416.73,417.25,4906700,417.25],["2006-07-11",418.51,425.05,413.03,424.56,5971300,424.56],["2006-07-10",423.44,425.23,416.38,418.2,4436400,418.2],["2006-07-07",426.05,427.89,415.88,420.45,6041900,420.45],["2006-07-06",423.38,425.38,421.98,423.19,3687100,423.19],["2006-07-05",421.52,422.8,415.64,421.46,4985600,421.46],["2006-07-03",420.04,423.77,419.45,423.2,2156700,423.2],["2006-06-30",415.6,419.33,412.33,419.33,6258000,419.33],["2006-06-29",407.99,418.2,405.82,417.81,6658200,417.81],["2006-06-28",404.01,406.48,401.13,406.11,3710500,406.11],["2006-06-27",405.71,408,401.01,402.32,4107100,402.32],["2006-06-26",406.75,408.3,403.25,404.22,3551200,404.22],["2006-06-23",402.76,409.75,400.74,404.86,5314800,404.86],["2006-06-22",401.58,406,388,399.95,5911900,399.95],["2006-06-21",391.06,404,389.75,402.13,8744400,402.13],["2006-06-20",388.03,391.87,386.51,387.17,4039900,387.17],["2006-06-19",390.85,394.8,386.98,388.14,7633100,388.14],["2006-06-16",389.1,390.93,388,390.7,5304600,390.7],["2006-06-15",386.62,392.25,383,391,6785700,391],["2006-06-14",389.83,391.1,378.52,384.39,7772000,384.39],["2006-06-13",380.9,387,378.12,386.52,7659100,386.52],["2006-06-12",388.34,390.49,381,381.54,5019100,381.54],["2006-06-09",392.19,395.43,385.35,386.57,6157500,386.57],["2006-06-08",387.75,394.27,378.59,393.3,10359500,393.3],["2006-06-07",393.24,394.86,386.5,386.51,8911300,386.51],["2006-06-06",376.58,390,376.3,389.99,10259800,389.99],["2006-06-05",376.18,381.45,374.15,374.44,5558500,374.44],["2006-06-02",386.84,387.08,377.45,379.44,6386400,379.44],["2006-06-01",373.54,382.99,371.6,382.62,6278000,382.62],["2006-05-31",373.8,378.25,366.78,371.82,7981300,371.82],["2006-05-30",378.28,381,371.45,371.94,4316000,371.94],["2006-05-26",384.55,385.88,380.03,381.35,3667000,381.35],["2006-05-25",379.08,383,372.31,382.99,8194600,382.99],["2006-05-24",377.35,383.44,371.61,381.25,9553800,381.25],["2006-05-23",374.21,383.88,373.56,375.58,8983000,375.58],["2006-05-22",367.85,373.03,365.25,370.95,8604400,370.95],["2006-05-19",373.28,374.5,360.57,370.02,11398200,370.02],["2006-05-18",378.78,381.81,370.71,370.99,5835000,370.99],["2006-05-17",370.61,379.84,370.22,374.5,10643800,374.5],["2006-05-16",375.99,376.86,369.89,371.3,6491100,371.3],["2006-05-15",375.93,380.15,368.25,376.2,8590100,376.2],["2006-05-12",383.54,384.87,373.55,374.13,10087600,374.13],["2006-05-11",403.42,404.71,384.98,387,8892800,387],["2006-05-10",408.31,411.71,401.86,402.98,6187200,402.98],["2006-05-09",395.7,409,393.75,408.8,9140600,408.8],["2006-05-08",395.11,397.12,390.05,394.78,5118600,394.78],["2006-05-05",397.6,400.68,391.78,394.3,6065000,394.3],["2006-05-04",395.03,398.87,392.21,394.75,4652000,394.75],["2006-05-03",396.35,401.5,390.88,394.17,8072200,394.17],["2006-05-02",401.08,402.49,388.4,394.8,13104300,394.8],["2006-05-01",418.47,419.44,398.55,398.9,10361200,398.9],["2006-04-28",418.63,425.73,416.3,417.94,7421300,417.94],["2006-04-27",422.91,426.91,419.39,420.03,8337900,420.03],["2006-04-26",427.74,430.04,423.53,425.97,7277800,425.97],["2006-04-25",439.63,441.04,426,427.16,9569000,427.16],["2006-04-24",439.4,444.7,436.52,440.5,8836400,440.5],["2006-04-21",448.9,450.72,436.17,437.1,22551300,437.1],["2006-04-20",411.01,416,408.2,415,12271500,415],["2006-04-19",412.57,413.64,406.73,410.5,6781700,410.5],["2006-04-18",407.93,409.83,401.5,404.24,8137600,404.24],["2006-04-17",403.45,412.5,400.84,406.82,8259500,406.82],["2006-04-13",408.63,409.76,400.5,402.16,6552900,402.16],["2006-04-12",409,411.33,405.19,408.95,6017000,408.95],["2006-04-11",416.42,419.1,406.22,409.66,11107200,409.66],["2006-04-10",407.08,417.17,405.25,416.38,9320100,416.38],["2006-04-07",412.41,412.85,404.02,406.16,7025900,406.16],["2006-04-06",406.49,413.89,405.43,411.18,8598500,411.18],["2006-04-05",408.2,414.57,402.82,407.99,13410500,407.99],["2006-04-04",389.9,404.9,388.14,404.34,15715700,404.34],["2006-04-03",389.53,392.47,387.93,389.7,8122700,389.7],["2006-03-31",388.74,391.87,384.03,390,36521400,390],["2006-03-30",389.19,393.5,383.61,388.44,14711700,388.44],["2006-03-29",379.94,399,379.51,394.98,19027500,394.98],["2006-03-28",371.71,377.86,371.17,377.2,8945800,377.2],["2006-03-27",367.09,371.71,365,369.69,7023700,369.69],["2006-03-24",368.62,370.09,362.51,365.8,15180600,365.8],["2006-03-23",342.35,345.75,340.2,341.89,7434700,341.89],["2006-03-22",339.75,344.1,337.5,340.22,7596000,340.22],["2006-03-21",350.01,351.66,339.08,339.92,9831100,339.92],["2006-03-20",342.34,350.09,341.54,348.19,10407600,348.19],["2006-03-17",338.8,341.78,334.93,339.79,8551700,339.79],["2006-03-16",348.61,348.75,337.9,338.77,10016700,338.77],["2006-03-15",350.77,352.3,340.53,344.5,12768800,344.5],["2006-03-14",337.14,352.37,332.62,351.16,18450700,351.16],["2006-03-13",340.93,346.1,335.45,337.06,13642400,337.06],["2006-03-10",343.5,344.5,331.55,337.5,19325600,337.5],["2006-03-09",355.39,358.53,341.5,343,13910400,343],["2006-03-08",353.93,360.03,350.54,353.88,11745600,353.88],["2006-03-07",365.02,368.45,358.15,364.45,10378800,364.45],["2006-03-06",380.91,383.4,367.14,368.1,8939700,368.1],["2006-03-03",384.3,387.24,375.76,378.18,11962000,378.18],["2006-03-02",364.28,381.1,362.2,376.45,18330300,376.45],["2006-03-01",368.56,369.45,361.3,364.8,12061200,364.8],["2006-02-28",393.2,397.54,338.51,362.62,39437600,362.62],["2006-02-27",381.27,391.7,380.28,390.38,10212200,390.38],["2006-02-24",377.3,380.07,373.49,377.4,6484300,377.4],["2006-02-23",365.61,381.24,365.39,378.07,12551600,378.07],["2006-02-22",367.15,368.95,363.86,365.49,6476200,365.49],["2006-02-21",366.44,373.54,365.11,366.59,8686000,366.59],["2006-02-17",369.86,372.14,363.62,368.75,14320200,368.75],["2006-02-16",345.67,367,344.49,366.46,21315500,366.46],["2006-02-15",341.27,346,337.83,342.38,12947000,342.38],["2006-02-14",345.33,351.69,342.4,343.32,14654000,343.32],["2006-02-13",346.64,350.6,341.89,345.7,19717800,345.7],["2006-02-10",361.95,364.5,353.14,362.61,15223500,362.61],["2006-02-09",371.2,374.4,356.11,358.77,11912400,358.77],["2006-02-08",368.48,370.69,354.67,369.08,20804100,369.08],["2006-02-07",382.99,383.7,363.35,367.92,16630200,367.92],["2006-02-06",385.31,389.9,379.56,385.1,8940400,385.1],["2006-02-03",393.62,393.9,372.57,381.55,18281800,381.55],["2006-02-02",403.82,406.5,395.98,396.04,11807700,396.04],["2006-02-01",389.03,402,387.52,401.78,27122500,401.78],["2006-01-31",430.57,439.6,423.97,432.66,22066000,432.66],["2006-01-30",429.23,433.28,425,426.82,8588900,426.82],["2006-01-27",435,438.22,428.98,433.49,8452200,433.49],["2006-01-26",439.54,439.99,423.56,434.27,12926100,434.27],["2006-01-25",451.26,454.23,429.22,433,18739800,433],["2006-01-24",436.03,444.95,434.48,443.03,15464600,443.03],["2006-01-23",407.38,428.39,405.73,427.5,22741400,427.5],["2006-01-20",438.7,440.03,394.74,399.46,41116700,399.46],["2006-01-19",451.17,453.49,433,436.45,14537300,436.45],["2006-01-18",447.3,457.36,443.25,444.91,20485700,444.91],["2006-01-17",463.06,469.9,462.53,467.11,8270300,467.11],["2006-01-13",464.31,466.89,461.61,466.25,7656600,466.25],["2006-01-12",473.72,474.99,461.5,463.63,10125300,463.63],["2006-01-11",471.27,475.11,469.18,471.63,9007400,471.63],["2006-01-10",464.42,470.25,462.04,469.76,9097100,469.76],["2006-01-09",466.41,473.4,460.94,466.9,12791900,466.9],["2006-01-06",456.87,470.5,453.24,465.66,17756900,465.66],["2006-01-05",446,451.55,441.5,451.24,10808300,451.24],["2006-01-04",443.9,448.96,439.75,445.24,15286400,445.24],["2006-01-03",422.52,435.67,418.22,435.23,13121200,435.23],["2005-12-30",417.27,418.21,413.74,414.86,7587100,414.86],["2005-12-29",427.98,428.73,419.17,420.15,6945800,420.15],["2005-12-28",424.34,427.78,421.26,426.69,7117900,426.69],["2005-12-27",431.86,431.86,422.76,424.64,6702800,424.64],["2005-12-23",432.15,432.5,428.78,430.93,4595100,430.93],["2005-12-22",431.77,432.86,425.93,432.04,7546600,432.04],["2005-12-21",433.55,436.86,420.71,426.33,11221900,426.33],["2005-12-20",427.86,432.2,424.67,429.74,10084700,429.74],["2005-12-19",432.2,446.21,420.11,424.6,21936800,424.6],["2005-12-16",425.34,432.5,422.75,430.15,16330500,430.15],["2005-12-15",419.11,423.14,416.5,422.55,6045800,422.55],["2005-12-14",417.04,419.73,415.49,418.96,6630400,418.96],["2005-12-13",412.5,418,411.64,417.49,8157000,417.49],["2005-12-12",414.63,415.21,409.95,412.61,6950100,412.61],["2005-12-09",415,415.78,408.56,409.2,7643400,409.2],["2005-12-08",405.3,410.65,402.64,410.65,8910100,410.65],["2005-12-07",406.16,406.7,399.01,404.22,11665900,404.22],["2005-12-06",408.7,416.41,401.7,404.54,15114700,404.54],["2005-12-05",417,417.5,404.28,405.85,10289400,405.85],["2005-12-02",416.94,419.53,413.86,417.7,7543500,417.7],["2005-12-01",409.2,415.44,408.29,414.09,9744900,414.09],["2005-11-30",404.26,408.45,395.56,404.91,15596600,404.91],["2005-11-29",424.46,426.4,402.14,403.54,21495800,403.54],["2005-11-28",429.82,431.24,422.44,423.48,11008400,423.48],["2005-11-25",425.78,428.75,425.3,428.62,4840100,428.62],["2005-11-23",417.04,424.72,415.78,422.86,10085000,422.86],["2005-11-22",408.65,417.31,406.23,416.47,9596000,416.47],["2005-11-21",399.17,409.98,393.49,409.36,10335100,409.36],["2005-11-18",403.49,404.5,399.85,400.21,7025700,400.21],["2005-11-17",401.8,403.81,399.53,403.45,9212200,403.45],["2005-11-16",396.2,398.85,394.11,398.15,8695200,398.15],["2005-11-15",394.38,397,390.95,392.8,8624900,392.8],["2005-11-14",392.12,398.22,391.53,396.97,7807900,396.97],["2005-11-11",395.12,396.9,388.85,390.4,7063900,390.4],["2005-11-10",378.36,391.35,377.43,391.1,9128700,391.1],["2005-11-09",386.67,388.29,378.03,379.15,10466900,379.15],["2005-11-08",394.25,395.59,388.58,389.9,7897500,389.9],["2005-11-07",395.1,397.47,392.15,395.03,9591500,395.03],["2005-11-04",389.98,391.79,385.45,390.43,8824900,390.43],["2005-11-03",382.41,386.58,381.38,385.95,7448400,385.95],["2005-11-02",381.7,385,377.17,379.68,10565400,379.68],["2005-11-01",371.86,383.9,369.01,379.38,16356100,379.38],["2005-10-31",360.24,374.75,359.51,372.14,14342900,372.14],["2005-10-28",355.27,358.95,355.02,358.17,5903500,358.17],["2005-10-27",356.6,357.09,351.68,353.06,5134400,353.06],["2005-10-26",346.28,356,346.19,355.44,8907500,355.44],["2005-10-25",345.78,347.4,342.86,346.91,6878300,346.91],["2005-10-24",343.37,349.3,342.19,348.65,9431700,348.65],["2005-10-21",345.8,346.43,333,339.9,22892400,339.9],["2005-10-20",309.99,311.13,301.21,303.2,13911700,303.2],["2005-10-19",304,309.87,303.96,308.7,7010700,308.7],["2005-10-18",304.96,307.96,302.74,303.28,7077800,303.28],["2005-10-17",297.5,305.2,294.56,305,7566700,305],["2005-10-14",299.9,300.23,292.54,296.14,8519100,296.14],["2005-10-13",302,302,290.68,297.44,10567700,297.44],["2005-10-12",305.2,307.19,299,300.97,9306200,300.97],["2005-10-11",310.61,312.65,304.86,306.1,8542600,306.1],["2005-10-10",313.31,314.82,309.15,310.65,5572200,310.65],["2005-10-07",314.79,316.67,310.54,312.99,6770300,312.99],["2005-10-06",314.14,314.48,310.09,312.75,7993800,312.75],["2005-10-05",312.69,314.9,308,310.71,8328400,310.71],["2005-10-04",319.95,321.28,310.74,311,9144300,311],["2005-10-03",313.63,320.11,312.79,318.68,9160300,318.68],["2005-09-30",314.22,317.5,312.29,316.46,9151300,316.46],["2005-09-29",306.68,310.72,306.08,309.62,5613800,309.62],["2005-09-28",314.22,315.1,305.6,306,7997400,306],["2005-09-27",314.95,318.41,313.38,313.94,6873100,313.94],["2005-09-26",319.5,320.95,312.56,314.28,9894400,314.28],["2005-09-23",313,317.21,312.59,315.36,8483800,315.36],["2005-09-22",311.5,319.22,310.17,311.37,13006400,311.37],["2005-09-21",308.41,313.76,305.96,311.9,10119700,311.9],["2005-09-20",306.15,311.3,305.23,307.91,9351000,307.91],["2005-09-19",301,306,300.71,303.79,5761900,303.79],["2005-09-16",304.02,304.5,299.87,300.2,7579800,300.2],["2005-09-15",299.52,306.75,297.91,302.62,15466200,302.62],["2005-09-14",308.73,313.28,300.3,303,11275800,303],["2005-09-13",309,315.53,306.17,311.68,10299900,311.68],["2005-09-12",301.75,311.42,301,309.74,10386500,309.74],["2005-09-09",297.28,299.1,296.56,299.09,4390500,299.09],["2005-09-08",294.83,299.28,293.36,295.39,6613300,295.39],["2005-09-07",285.89,295.5,285.28,294.87,7499500,294.87],["2005-09-06",289,289.39,286.8,287.11,4212300,287.11],["2005-09-02",286.51,289.99,286.44,288.45,3434500,288.45],["2005-09-01",285.91,287.5,285,286.25,2742100,286.25],["2005-08-31",288.23,288.5,284.36,286,5034000,286],["2005-08-30",287.39,289.51,285.88,287.27,4792000,287.27],["2005-08-29",282.24,289.12,282.24,288.45,5903000,288.45],["2005-08-26",283.48,285.02,282.66,283.58,3755300,283.58],["2005-08-25",282.55,284,279.97,282.59,4376600,282.59],["2005-08-24",277.57,284.75,276.45,282.57,8593100,282.57],["2005-08-23",276.16,279.74,274.12,279.58,5821700,279.58],["2005-08-22",281.24,281.47,273.35,274.01,6813000,274.01],["2005-08-19",280.99,281.45,279.62,280,5542900,280],["2005-08-18",275.91,280.5,275,279.99,11872800,279.99],["2005-08-17",285.51,286.57,284,285.1,3883300,285.1],["2005-08-16",284.88,287.79,283.34,285.65,7109200,285.65],["2005-08-15",289.8,292.77,283.77,284,8174700,284],["2005-08-12",283.36,290.2,281.64,289.72,6585900,289.72],["2005-08-11",285.89,286.58,280.62,284.05,7514900,284.05],["2005-08-10",291.3,292.33,284.88,285.68,6879000,285.68],["2005-08-09",291.96,292.68,288.51,291.57,5779300,291.57],["2005-08-08",293.6,295.65,290.49,291.25,4481800,291.25],["2005-08-05",297.5,298.51,291.31,292.35,5939700,292.35],["2005-08-04",295.55,299,295.25,297.73,5236500,297.73],["2005-08-03",298,299.72,295.6,297.3,5930600,297.3],["2005-08-02",291.6,299.52,291.12,299.19,7290200,299.19],["2005-08-01",288.12,292.5,288.1,291.61,5662400,291.61],["2005-07-29",292.14,292.84,286.99,287.76,8363300,287.76],["2005-07-28",297.41,297.41,293.28,293.5,5925600,293.5],["2005-07-27",297.74,298.23,292.4,296.93,7217900,296.93],["2005-07-26",295.01,298,292.09,296.09,9816900,296.09],["2005-07-25",302.39,303.29,294.96,295.85,9658800,295.85],["2005-07-22",306.37,309.25,296.33,302.4,23386800,302.4],["2005-07-21",314.05,317.8,311.21,313.94,19789400,313.94],["2005-07-20",305.57,312.61,301.8,312,14310400,312],["2005-07-19",302.1,310.35,301.8,309.9,12621400,309.9],["2005-07-18",300,301.9,297.75,299.54,6207800,299.54],["2005-07-15",301.24,303.4,299.78,301.19,8438400,301.19],["2005-07-14",305.34,306.75,300.07,300.89,10667700,300.89],["2005-07-13",292.51,299.24,292.1,298.86,11437900,298.86],["2005-07-12",293.39,294.4,290.93,291.78,5864900,291.78],["2005-07-11",296.4,296.6,291.02,293.35,8390300,293.35],["2005-07-08",296.25,297.5,294.05,296.23,7457600,296.23],["2005-07-07",289.39,295.8,288.51,295.54,10672100,295.54],["2005-07-06",297.3,297.6,291.38,291.52,8000300,291.52],["2005-07-05",292.1,295.98,290.23,295.71,7494000,295.71],["2005-07-01",295.04,296.24,289.22,291.25,9227600,291.25],["2005-06-30",294.34,298.93,291.04,294.15,15094400,294.15],["2005-06-29",302.5,304.38,292.15,292.72,18298700,292.72],["2005-06-28",306.28,309.25,302,302,19036500,302],["2005-06-27",298.9,304.47,293.86,304.1,17802900,304.1],["2005-06-24",290.9,298,289.58,297.25,17771200,297.25],["2005-06-23",288,294.81,286.5,289.71,14056400,289.71],["2005-06-22",289.67,292.32,288.67,289.3,10474000,289.3],["2005-06-21",288.07,290.3,284.97,287.84,15132300,287.84],["2005-06-20",276.09,287.67,271.73,286.7,21024700,286.7],["2005-06-17",279,280.3,275.9,280.3,10434400,280.3],["2005-06-16",274.26,278.3,273.07,277.44,12462400,277.44],["2005-06-15",275,277.3,267.43,274.8,20883100,274.8],["2005-06-14",278.59,281.24,277.75,278.35,10091900,278.35],["2005-06-13",279.82,284.19,276.52,282.75,12803200,282.75],["2005-06-10",286.99,287.28,280.02,282.5,12696600,282.5],["2005-06-09",284.72,288.5,280.56,286.31,16441100,286.31],["2005-06-08",292.85,293.19,278,279.56,25700900,279.56],["2005-06-07",297.1,299.59,290.3,293.12,24323000,293.12],["2005-06-06",282.39,293.75,281.83,290.94,22525900,290.94],["2005-06-03",286.79,289.3,277.41,280.26,18782300,280.26],["2005-06-02",288.73,289.78,284.6,287.9,17974100,287.9],["2005-06-01",283.2,292.89,282.02,288,35191700,288],["2005-05-31",269.43,278.4,269.37,277.27,22236800,277.27],["2005-05-27",260.46,266.05,259.25,266,12184100,266],["2005-05-26",260.96,263.76,258.3,259.2,13546600,259.2],["2005-05-25",252.73,260.98,250.63,260.81,18057900,260.81],["2005-05-24",256.96,265.44,253.5,256,29043100,256],["2005-05-23",243.16,258.1,242.71,255.45,21388300,255.45],["2005-05-20",241.21,241.67,239.65,241.61,8163500,241.61],["2005-05-19",240.34,241.17,238.27,239.18,9716500,239.18],["2005-05-18",233.61,239.97,233.52,239.16,12312000,239.16],["2005-05-17",230.56,233.45,230.2,233.13,7808900,233.13],["2005-05-16",229.68,231.62,228.57,231.05,5681400,231.05],["2005-05-13",229.18,231.09,227.32,229.24,7415500,229.24],["2005-05-12",230.81,232.23,228.2,228.72,8948200,228.72],["2005-05-11",228.97,231.98,227.93,231.29,11478800,231.29],["2005-05-10",225.47,227.8,224.72,227.8,6345800,227.8],["2005-05-09",228,228.5,225.43,226.02,5536800,226.02],["2005-05-06",228.4,229.25,226.47,228.02,6763900,228.02],["2005-05-05",228.62,228.62,225.88,226.98,7509600,226.98],["2005-05-04",227.23,229.88,227,228.5,12083500,228.5],["2005-05-03",221.85,228.15,221.32,226.19,17780200,226.19],["2005-05-02",222.05,223.7,220.21,222.29,9767400,222.29],["2005-04-29",221.91,222.25,217.82,220,9170200,220],["2005-04-28",219.5,222.08,217.71,219.45,8682800,219.45],["2005-04-27",217.99,220.85,216.74,219.78,10264800,219.78],["2005-04-26",220.22,222,218.29,218.75,17272000,218.75],["2005-04-25",217.82,224.74,217.52,223.53,19840000,223.53],["2005-04-22",222.9,224,214.26,215.81,33205100,215.81],["2005-04-21",200.42,205,199.32,204.22,17751900,204.22],["2005-04-20",198.58,200.5,195.91,198.1,15451500,198.1],["2005-04-19",189.33,192,188.03,191.4,8430000,191.4],["2005-04-18",184.58,187.88,183.49,186.97,6550300,186.97],["2005-04-15",190.1,190.34,184.66,185,11577400,185],["2005-04-14",193.27,194.36,190.1,191.45,6152700,191.45],["2005-04-13",193.47,194.32,189.73,192.93,6555800,192.93],["2005-04-12",193,194.42,189.41,193.96,7319600,193.96],["2005-04-11",193.09,194.8,192.32,193.23,5410500,193.23],["2005-04-08",193.69,195.1,191.45,192.05,5116600,192.05],["2005-04-07",188.78,194.62,188.64,193.76,9692200,193.76],["2005-04-06",189.24,189.65,187.58,189.22,5252600,189.22],["2005-04-05",187.73,190.26,187.57,188.57,8736700,188.57],["2005-04-04",179.95,185.32,179.84,185.29,8076400,185.29],["2005-04-01",181.76,182.95,179.99,180.04,6182000,180.04],["2005-03-31",177.95,181.39,177.64,180.51,6768600,180.51],["2005-03-30",180.64,181.45,179.6,180.45,6236100,180.45],["2005-03-29",181.05,183.28,178.07,179.57,6473000,179.57],["2005-03-28",181.68,184.8,180.95,181.42,8738000,181.42],["2005-03-24",180.7,180.86,179.2,179.25,3705200,179.25],["2005-03-23",177.97,180.24,177.97,178.98,4845000,178.98],["2005-03-22",181.18,181.94,177.85,178.6,5631700,178.6],["2005-03-21",179.27,182.17,177.25,180.88,7483700,180.88],["2005-03-18",178.81,180.4,178.31,180.04,7090000,180.04],["2005-03-17",177.13,179.64,175.8,179.29,8260600,179.29],["2005-03-16",176.7,178.61,175.01,175.6,7106300,175.6],["2005-03-15",175.3,180,174.21,178.61,10422100,178.61],["2005-03-14",178.33,178.4,172.57,174.99,11146600,174.99],["2005-03-11",180.44,180.95,177.15,177.8,8028300,177.8],["2005-03-10",181.01,181.2,177.4,179.98,10960500,179.98],["2005-03-09",184.21,184.65,180.16,181.35,11360400,181.35],["2005-03-08",189.1,189.85,184.97,185.2,8046100,185.2],["2005-03-07",187.78,189.6,187.03,188.81,8667400,188.81],["2005-03-04",186.7,187.25,185.07,185.9,6774100,185.9],["2005-03-03",186.13,187.75,184.31,187.01,7608600,187.01],["2005-03-02",185.95,187.67,184.36,185.18,7285500,185.18],["2005-03-01",189.29,189.75,182,186.06,9311200,186.06],["2005-02-28",186,189.87,185.85,187.99,7818400,187.99],["2005-02-25",189.15,189.92,185.51,185.87,9973500,185.87],["2005-02-24",183.37,189.85,182.23,188.89,25814300,188.89],["2005-02-23",193.3,194.48,188.66,193.95,15586000,193.95],["2005-02-22",196.5,198.9,190.39,191.37,13483700,191.37],["2005-02-18",198.51,198.84,196.66,197.95,8485900,197.95],["2005-02-17",197.83,199.75,196.81,197.9,10414400,197.9],["2005-02-16",194.7,199.33,194.3,198.41,16532300,198.41],["2005-02-15",193.6,199.84,193.08,195.23,25782800,195.23],["2005-02-14",182.85,193.08,181,192.99,38562200,192.99],["2005-02-11",186.66,192.32,186.07,187.4,13116000,187.4],["2005-02-10",191.97,192.21,185.25,187.98,18982700,187.98],["2005-02-09",200.76,201.6,189.46,191.58,17171500,191.58],["2005-02-08",196.96,200.02,194.53,198.64,11480000,198.64],["2005-02-07",205.26,206.4,195.51,196.03,12960400,196.03],["2005-02-04",206.47,207.75,202.6,204.36,14819300,204.36],["2005-02-03",205.99,213.37,205.81,210.86,12988100,210.86],["2005-02-02",215.55,216.8,203.66,205.96,32799300,205.96],["2005-02-01",194.38,196.66,190.63,191.9,18839000,191.9],["2005-01-31",193.69,196.36,191.72,195.62,9596700,195.62],["2005-01-28",190.02,194.7,186.34,190.34,12208200,190.34],["2005-01-27",188.76,188.86,185.2,188.08,6627400,188.08],["2005-01-26",179.27,189.41,179.15,189.24,12307900,189.24],["2005-01-25",181.94,182.24,176.29,177.12,10659200,177.12],["2005-01-24",188.69,189.33,180.32,180.72,14022700,180.72],["2005-01-21",194.54,195.36,188.12,188.28,9258400,188.28],["2005-01-20",192.5,196.25,192,193.92,9001600,193.92],["2005-01-19",204.65,205.3,196.71,197.3,11257700,197.3],["2005-01-18",200.97,205.02,198.66,203.9,13172600,203.9],["2005-01-14",196,200.01,194.13,199.97,9640300,199.97],["2005-01-13",195.38,197.39,194.05,195.33,6849400,195.33],["2005-01-12",194.33,195.93,190.5,195.38,8177800,195.38],["2005-01-11",195.62,197.71,193.18,193.54,6958700,193.54],["2005-01-10",194.5,198.1,191.83,195.06,7539600,195.06],["2005-01-07",190.64,194.25,188.78,193.85,9662900,193.85],["2005-01-06",195.08,195.9,187.72,188.55,10387100,188.55],["2005-01-05",193.45,196.9,192.23,193.51,8236600,193.51],["2005-01-04",201.4,202.93,193.48,194.5,13755900,194.5],["2005-01-03",197.4,203.64,195.46,202.71,15844200,202.71],["2004-12-31",199.23,199.88,192.56,192.79,7668500,192.79],["2004-12-30",192.97,198.23,191.85,197.6,5904300,197.6],["2004-12-29",191.78,193.52,191.78,192.9,2678100,192.9],["2004-12-28",192.11,193.55,191.01,192.76,4145800,192.76],["2004-12-27",189.15,193.3,189.1,191.91,6104100,191.91],["2004-12-23",187.45,188.6,186,187.9,3614600,187.9],["2004-12-22",183.9,186.85,183.01,186.3,3907000,186.3],["2004-12-21",186.31,187.88,183.4,183.75,5516300,183.75],["2004-12-20",182,188.46,181.87,185.02,9834500,185.02],["2004-12-17",176.76,180.5,176.55,180.08,7386200,180.08],["2004-12-16",176.95,180.49,175.95,176.47,8572800,176.47],["2004-12-15",177.99,180.69,176.66,179.78,11471000,179.78],["2004-12-14",171,178.82,169.6,178.69,11088400,178.69],["2004-12-13",172.17,173.18,169.45,170.45,4818600,170.45],["2004-12-10",173.43,174.88,171.29,171.65,4317200,171.65],["2004-12-09",170.25,173.5,168.47,173.43,7654000,173.43],["2004-12-08",170.35,173.68,168.73,169.98,7541800,169.98],["2004-12-07",176,176.2,170.55,171.43,6870900,171.43],["2004-12-06",179.13,180.7,176.02,176.29,6254000,176.29],["2004-12-03",179.95,181.06,177.6,180.4,5869200,180.4],["2004-12-02",179.9,181.51,178.55,179.4,6260900,179.4],["2004-12-01",181.95,182.5,179.55,179.96,7864100,179.96],["2004-11-30",180.71,183,180.25,181.98,7700000,181.98],["2004-11-29",180.36,182.95,177.51,181.05,10666600,181.05],["2004-11-26",175.8,180.03,175.32,179.39,6480100,179.39],["2004-11-24",174.82,177.21,172.51,174.76,15281000,174.76],["2004-11-23",167.97,170.83,166.5,167.52,12413300,167.52],["2004-11-22",164.47,169.5,161.31,165.1,12368200,165.1],["2004-11-19",169.1,169.98,166.52,169.4,8769300,169.4],["2004-11-18",170.29,174.42,165.73,167.54,16629600,167.54],["2004-11-17",169.02,177.5,169,172.5,18132900,172.5],["2004-11-16",177.5,179.47,170.83,172.54,20917400,172.54],["2004-11-15",180.45,188.32,178.75,184.87,11901500,184.87],["2004-11-12",185.23,189.8,177.4,182,16746100,182],["2004-11-11",169.13,183.75,167.57,183.02,14985500,183.02],["2004-11-10",170.67,172.52,166.33,167.86,10644000,167.86],["2004-11-09",174.1,175.2,165.27,168.7,11064200,168.7],["2004-11-08",170.93,175.44,169.4,172.55,11191800,172.55],["2004-11-05",181.98,182.3,168.55,169.35,19833100,169.35],["2004-11-04",188.44,190.4,183.35,184.7,14409600,184.7],["2004-11-03",198.18,201.6,190.75,191.67,13888700,191.67],["2004-11-02",198.78,199.25,193.34,194.87,11346300,194.87],["2004-11-01",193.55,197.67,191.27,196.03,12224900,196.03],["2004-10-29",198.89,199.95,190.6,190.64,21162500,190.64],["2004-10-28",186.68,194.39,185.6,193.3,14846800,193.3],["2004-10-27",182.72,189.52,181.77,185.97,13356500,185.97],["2004-10-26",186.34,192.64,180,181.8,22307100,181.8],["2004-10-25",176.4,194.43,172.55,187.4,32764200,187.4],["2004-10-22",170.54,180.17,164.08,172.43,36891900,172.43],["2004-10-21",144.4,150.13,141.62,149.38,14589500,149.38],["2004-10-20",148.03,148.99,139.6,140.49,11372700,140.49],["2004-10-19",150.5,152.4,147.35,147.94,9064000,147.94],["2004-10-18",143.2,149.2,141.21,149.16,7025200,149.16],["2004-10-15",144.93,145.5,141.95,144.11,6604000,144.11],["2004-10-14",141.01,142.38,138.56,142,5226300,142],["2004-10-13",143.32,143.55,140.08,140.9,9893000,140.9],["2004-10-12",134.44,137.61,133.4,137.4,5838600,137.4],["2004-10-11",137,138.86,133.85,135.26,5241300,135.26],["2004-10-08",138.72,139.68,137.02,137.73,5540300,137.73],["2004-10-07",136.92,139.88,136.55,138.85,7064600,138.85],["2004-10-06",137.55,138.45,136,137.08,6697400,137.08],["2004-10-05",134.66,138.53,132.24,138.37,7494100,138.37],["2004-10-04",135.25,136.87,134.03,135.06,6517900,135.06],["2004-10-01",130.8,134.24,128.9,132.58,7570000,132.58],["2004-09-30",129.9,132.3,129,129.6,6885900,129.6],["2004-09-29",126.7,135.02,126.23,131.08,15273500,131.08],["2004-09-28",121.3,127.4,120.21,126.86,8473000,126.86],["2004-09-27",119.56,120.88,117.8,118.26,3536600,118.26],["2004-09-24",120.94,124.1,119.76,119.83,4566300,119.83],["2004-09-23",118.84,122.63,117.02,120.82,4272100,120.82],["2004-09-22",117.4,119.67,116.81,118.38,3794400,118.38],["2004-09-21",119.81,120.42,117.51,117.84,3618000,117.84],["2004-09-20",116.95,121.6,116.77,119.36,5319700,119.36],["2004-09-17",114.42,117.49,113.55,117.49,4741000,117.49],["2004-09-16",112.34,115.8,111.65,113.97,4637800,113.97],["2004-09-15",110.56,114.23,110.2,112,5361900,112],["2004-09-14",107.45,112,106.79,111.49,5419900,111.49],["2004-09-13",106.63,108.41,106.46,107.5,3926000,107.5],["2004-09-10",101.6,106.56,101.3,105.33,4353800,105.33],["2004-09-09",102.53,102.71,101,102.31,2032900,102.31],["2004-09-08",100.74,103.03,100.5,102.3,2495300,102.3],["2004-09-07",101.01,102,99.61,101.58,2926700,101.58],["2004-09-03",100.95,101.74,99.32,100.01,2578800,100.01],["2004-09-02",99.19,102.37,98.94,101.51,7566900,101.51],["2004-09-01",102.7,102.97,99.67,100.25,4573700,100.25],["2004-08-31",102.3,103.71,102.16,102.37,2461400,102.37],["2004-08-30",105.28,105.49,102.01,102.01,2601000,102.01],["2004-08-27",108.1,108.62,105.69,106.15,3109000,106.15],["2004-08-26",104.95,107.95,104.66,107.91,3551000,107.91],["2004-08-25",104.96,108,103.88,106,4598900,106],["2004-08-24",111.24,111.6,103.57,104.87,7631300,104.87],["2004-08-23",110.75,113.48,109.05,109.4,9137200,109.4],["2004-08-20",101.01,109.08,100.5,108.31,11428600,108.31],["2004-08-19",100,104.06,95.96,100.34,22351900,100.34]]; \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/examples/zoom1.html b/libreplan-webapp/src/main/webapp/jqplot/examples/zoom1.html deleted file mode 100644 index 664ee375d..000000000 --- a/libreplan-webapp/src/main/webapp/jqplot/examples/zoom1.html +++ /dev/null @@ -1,149 +0,0 @@ - - - - - - Zooming - - - - - - - - - - - - - -
      - - - - - - - - - - -
      -
      - - - - - - - - - - - - - - - - - - - - - - - - - - -
      - - - - - - \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/examples/zoomOptions.html b/libreplan-webapp/src/main/webapp/jqplot/examples/zoomOptions.html deleted file mode 100644 index a3a579ef5..000000000 --- a/libreplan-webapp/src/main/webapp/jqplot/examples/zoomOptions.html +++ /dev/null @@ -1,176 +0,0 @@ - - - - - - Zoom Options - - - - - - - - - - - - - -
      - - - - - - - -

      Zooming has been enhanced to maintain plot zoom while the mouse moves over the entire document, not just the plot. Two new options have been added to the cursor plugin to further enhance zooming:

      - -
      -
      constrainOutsideZoom
      -
      True to limit the resulting zoom area to the edges of grid, even if the cursor is outside of the grid. That is, you can't expand the axis ranges by moving the cursor outside of the plot area when this is true. If set to false, you can effectively zoom out by mousing outside of the plot region. Default false.
      -
      showTooltipOutsideZoom
      -
      True to keep showing and updating the tooltip even when the cursor is outside of the plot area. Not applicable if zoomOutsidePlot is false. Default false
      -
      - -

      The fist plot demonstrates the default functionality where you can move the mouse off of the plot while zooming but the actual area zoomed will not extend beyond the axes.

      -
      -
      - -
      
      -
      -

      The second plot sets constrainOutsideZoom to false, so zooming will not only function when the mouse is outside of the plot, but the zoom range will be extended to the mouse position outside of the grid.

      -
      -
      - -
      
      -
      -

      The third plot is like the third, but showTooltipOutsideZoom is true and the tooltip is set to follow the mouse, so you have an idea of what your range is while zooming.

      -
      -
      - -
      
      -
      -
      -  
      -  
      -  
      -
      -
      -
      -
      -
      -
      -    
      -    
      -    
      -    
      -
      -
      -
      -  
      -  
      -  
      -
      -
      -
      -	
      - - - - - - \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/examples/zoomProxy.html b/libreplan-webapp/src/main/webapp/jqplot/examples/zoomProxy.html deleted file mode 100644 index ff88f6058..000000000 --- a/libreplan-webapp/src/main/webapp/jqplot/examples/zoomProxy.html +++ /dev/null @@ -1,110 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - -
      - -
      -
      - - - -
      - - - - \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/jqplot/examples/zooming.html b/libreplan-webapp/src/main/webapp/jqplot/examples/zooming.html deleted file mode 100644 index 4bb360268..000000000 --- a/libreplan-webapp/src/main/webapp/jqplot/examples/zooming.html +++ /dev/null @@ -1,209 +0,0 @@ - - - - - - Plot Zooming and Cursor Control - - - - - - - - - - - - - -
      - - - - - - - - -

      The cursor plugin also enables plot zooming functionality. Click and drag on the plot to zoom. Double click to reset.

      - -

      You can disable the double click zoom reset. The cursor plugin also extends the plot object with a resetZoom() method which can be called from user code or other html element (a button for example) to reset the plot zoom.

      - -
      - - -
      
      -
      -
      -

      Plot zooming also works will multiple axes. The following plot uses 3 large datasets.

      -
      - -
      
      -
      -
      -
      -
      -
      -
      -
      -
      -
      -
      -
      -
      -    
      -    
      -    
      -    
      -
      -
      -
      -    
      -    
      -
      -
      -
      -
      -	
      - - - - - - \ No newline at end of file From 801ffc456e2cd721c06a3d50cb0129c8cde779ab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jacobo=20Aragunde=20P=C3=A9rez?= Date: Sat, 28 Apr 2012 13:08:28 +0200 Subject: [PATCH 059/108] Remove code attribute from OrderElementTemplate entity and from DB. FEA: ItEr76S26RemoveExternalCodeFromTemplates --- .../templates/entities/OrderElementTemplate.java | 9 --------- .../src/main/resources/db.changelog-1.3.xml | 12 ++++++++++++ .../src/main/resources/db.changelog.xml | 1 + .../business/templates/entities/Templates.hbm.xml | 1 - 4 files changed, 13 insertions(+), 10 deletions(-) create mode 100644 libreplan-business/src/main/resources/db.changelog-1.3.xml diff --git a/libreplan-business/src/main/java/org/libreplan/business/templates/entities/OrderElementTemplate.java b/libreplan-business/src/main/java/org/libreplan/business/templates/entities/OrderElementTemplate.java index c94d95535..cb1002bc6 100644 --- a/libreplan-business/src/main/java/org/libreplan/business/templates/entities/OrderElementTemplate.java +++ b/libreplan-business/src/main/java/org/libreplan/business/templates/entities/OrderElementTemplate.java @@ -354,14 +354,6 @@ public abstract class OrderElementTemplate extends BaseEntity implements this.deadlineAsDaysFromBeginning = days; } - public String getCode() { - return getInfoComponent().getCode(); - } - - public void setCode(String code) { - getInfoComponent().setCode(code); - } - public String getDescription() { return getInfoComponent().getDescription(); } @@ -384,7 +376,6 @@ public abstract class OrderElementTemplate extends BaseEntity implements } protected void copyTo(OrderElementTemplate result) { - result.setCode(getCode()); result.setName(getName()); result.setDescription(getDescription()); result.setDeadlineAsDaysFromBeginning(getDeadlineAsDaysFromBeginning()); diff --git a/libreplan-business/src/main/resources/db.changelog-1.3.xml b/libreplan-business/src/main/resources/db.changelog-1.3.xml new file mode 100644 index 000000000..628b98a07 --- /dev/null +++ b/libreplan-business/src/main/resources/db.changelog-1.3.xml @@ -0,0 +1,12 @@ + + + + + Remove column code in order_element_template table + + + + diff --git a/libreplan-business/src/main/resources/db.changelog.xml b/libreplan-business/src/main/resources/db.changelog.xml index 0ace5ccf8..5011d0a53 100644 --- a/libreplan-business/src/main/resources/db.changelog.xml +++ b/libreplan-business/src/main/resources/db.changelog.xml @@ -10,5 +10,6 @@ + diff --git a/libreplan-business/src/main/resources/org/libreplan/business/templates/entities/Templates.hbm.xml b/libreplan-business/src/main/resources/org/libreplan/business/templates/entities/Templates.hbm.xml index 04ee58d8c..f64091ca5 100644 --- a/libreplan-business/src/main/resources/org/libreplan/business/templates/entities/Templates.hbm.xml +++ b/libreplan-business/src/main/resources/org/libreplan/business/templates/entities/Templates.hbm.xml @@ -12,7 +12,6 @@ - From 47ccb4d2576512bfb392520b84828312d577a842 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jacobo=20Aragunde=20P=C3=A9rez?= Date: Sat, 28 Apr 2012 13:18:38 +0200 Subject: [PATCH 060/108] Remove code attribute from templates finder. The column still exists but it is left blank. TODO: remove the column. FEA: ItEr76S26RemoveExternalCodeFromTemplates --- .../web/common/components/finders/TemplateFinder.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/libreplan-webapp/src/main/java/org/libreplan/web/common/components/finders/TemplateFinder.java b/libreplan-webapp/src/main/java/org/libreplan/web/common/components/finders/TemplateFinder.java index 92d69663b..f4eec6d6e 100644 --- a/libreplan-webapp/src/main/java/org/libreplan/web/common/components/finders/TemplateFinder.java +++ b/libreplan-webapp/src/main/java/org/libreplan/web/common/components/finders/TemplateFinder.java @@ -79,7 +79,7 @@ public abstract class TemplateFinder extends } protected String extractStringFor(T template) { - return template.getName() + " (" + template.getCode() + ")"; + return template.getName(); } @Override @@ -92,7 +92,6 @@ public abstract class TemplateFinder extends protected void generateColumnsForRenderer(Listitem item, T template) { final Listcell codeCell = new Listcell(); - codeCell.setLabel(template.getCode()); codeCell.setParent(item); codeCell.setStyle("width:200px"); From 56c07b049338f131942a8392012b67e2f490399e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jacobo=20Aragunde=20P=C3=A9rez?= Date: Sat, 28 Apr 2012 13:19:54 +0200 Subject: [PATCH 061/108] Remove code column from template tree. FEA: ItEr76S26RemoveExternalCodeFromTemplates --- .../libreplan/web/templates/TemplatesTree.java | 2 -- .../web/templates/TemplatesTreeComponent.java | 1 - .../web/templates/TemplatesTreeController.java | 17 +---------------- 3 files changed, 1 insertion(+), 19 deletions(-) diff --git a/libreplan-webapp/src/main/java/org/libreplan/web/templates/TemplatesTree.java b/libreplan-webapp/src/main/java/org/libreplan/web/templates/TemplatesTree.java index cbecc7752..bfc5a405f 100644 --- a/libreplan-webapp/src/main/java/org/libreplan/web/templates/TemplatesTree.java +++ b/libreplan-webapp/src/main/java/org/libreplan/web/templates/TemplatesTree.java @@ -40,7 +40,6 @@ public class TemplatesTree extends EntitiesTree { protected OrderElementTemplate createNewElement() { OrderLineTemplate result = OrderLineTemplate.createNew(); result.setName(_("New template")); - result.setCode(_("New code")); result.setDescription(_("New Description")); return result; } @@ -49,7 +48,6 @@ public class TemplatesTree extends EntitiesTree { protected OrderElementTemplate createNewElement(String name, int hours) { OrderLineTemplate result = OrderLineTemplate.createNew(); result.setName(name); - result.setCode(_("New code")); result.setDescription(_("New Description")); result.setWorkHours(hours); return result; diff --git a/libreplan-webapp/src/main/java/org/libreplan/web/templates/TemplatesTreeComponent.java b/libreplan-webapp/src/main/java/org/libreplan/web/templates/TemplatesTreeComponent.java index 4ac0e0a55..9e6c3de8b 100644 --- a/libreplan-webapp/src/main/java/org/libreplan/web/templates/TemplatesTreeComponent.java +++ b/libreplan-webapp/src/main/java/org/libreplan/web/templates/TemplatesTreeComponent.java @@ -77,7 +77,6 @@ public class TemplatesTreeComponent extends TreeComponent { List result = new ArrayList(); result.add(schedulingStateColumn); - result.add(codeColumn); result.add(nameAndDescriptionColumn); result.add(new TemplatesTreeColumn(_("Hours"), "hours") { diff --git a/libreplan-webapp/src/main/java/org/libreplan/web/templates/TemplatesTreeController.java b/libreplan-webapp/src/main/java/org/libreplan/web/templates/TemplatesTreeController.java index ff01ec038..79dbe7054 100644 --- a/libreplan-webapp/src/main/java/org/libreplan/web/templates/TemplatesTreeController.java +++ b/libreplan-webapp/src/main/java/org/libreplan/web/templates/TemplatesTreeController.java @@ -114,22 +114,7 @@ public class TemplatesTreeController extends @Override protected void addCodeCell(final OrderElementTemplate element) { - Textbox textBoxCode = new Textbox(); - Util.bind(textBoxCode, new Util.Getter() { - @Override - public String get() { - return element.getCode(); - } - }, new Util.Setter() { - - @Override - public void set(String value) { - element.setCode(value); - } - }); - textBoxCode.setConstraint("no empty:" - + _("cannot be null or empty")); - addCell(textBoxCode); + //empty because templates don't have code attribute } void addInitCell(final OrderElementTemplate currentElement) { From 83cb6cceec7a6042d1b76e4d71d91726127cb468 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jacobo=20Aragunde=20P=C3=A9rez?= Date: Sat, 28 Apr 2012 13:20:43 +0200 Subject: [PATCH 062/108] Removed code attribute at template level. FEA: ItEr76S26RemoveExternalCodeFromTemplates --- .../src/main/webapp/templates/_editTemplate.zul | 7 ------- .../src/main/webapp/templates/_listTemplates.zul | 2 -- 2 files changed, 9 deletions(-) diff --git a/libreplan-webapp/src/main/webapp/templates/_editTemplate.zul b/libreplan-webapp/src/main/webapp/templates/_editTemplate.zul index 09e1617d9..497f4f031 100644 --- a/libreplan-webapp/src/main/webapp/templates/_editTemplate.zul +++ b/libreplan-webapp/src/main/webapp/templates/_editTemplate.zul @@ -63,13 +63,6 @@ - -