From 6c75bb913c7d9896c92e831f058561a66c4d39d9 Mon Sep 17 00:00:00 2001 From: Jakub Dubrovsky Date: Sun, 1 Jul 2012 07:27:08 +0200 Subject: [PATCH] init --- .gitignore | 1 + README.md | 16 + action/layerFolder_add.php | 10 + action/layerFolder_remove.php | 10 + action/layerFolder_update.php | 9 + action/layerPublic_add.php | 10 + action/layerStyle_add.php | 11 + action/layerStyle_remove.php | 12 + action/layerStyle_update.php | 12 + action/layer_add.php | 9 + action/layer_remove.php | 11 + action/layer_update.php | 11 + action/layer_updateLayersFromPostgis.php | 11 + action/login.php | 10 + action/logout.php | 8 + action/pgCol_add.php | 12 + action/pgCol_remove.php | 12 + action/pgItem_insert_bio.php | 34 + action/pgItem_remove.php | 25 + action/pgItem_update.php | 53 + action/pgItem_update_bio.php | 55 + action/plan_add.php | 11 + action/plan_remove.php | 10 + action/plan_update.php | 10 + action/user_add.php | 10 + action/user_remove.php | 10 + action/user_update.php | 11 + api/README.md | 122 + api/index.php | 14 + api/sld.php | 13 + cron/layer_importGeoserver.php | 7 + data/plan.template.html | 241 + favicon.ico | Bin 0 -> 13909 bytes index.php | 157 + install/README.md | 39 + install/disable.php | 8 + install/enable.php | 17 + install/enabled | 1 + install/ready.php | 42 + install/settings.php | 175 + install/settings_update.php | 19 + lib/php/GeoserverAPI.php | 141 + lib/php/GeoserverAPILigeo.php | 30 + lib/php/LGAPI.php | 444 ++ lib/php/LGConnect.php | 76 + lib/php/LGForm.php | 89 + lib/php/LGFormElement.php | 32 + lib/php/LGFormItem.php | 54 + lib/php/LGFormManager.php | 82 + lib/php/LGInstall.php | 133 + lib/php/LGLayer.php | 87 + lib/php/LGLayerCol.php | 35 + lib/php/LGLayerColManager.php | 111 + lib/php/LGLayerFolder.php | 48 + lib/php/LGLayerManager.php | 428 ++ lib/php/LGLayerStyle.php | 40 + lib/php/LGLayerStyleManager.php | 129 + lib/php/LGPlan.php | 52 + lib/php/LGPlanManager.php | 187 + lib/php/LGPlanPrivilege.php | 32 + lib/php/LGRESTClient.php | 107 + lib/php/LGSystemUser.php | 85 + lib/php/LGUser.php | 102 + lib/php/LGUserManager.php | 63 + lib/php/LGlang.php | 27 + lib/php/dump.sql | 433 ++ lib/php/main.lib.php | 41 + login.php | 42 + module/README.md | 0 module/proxy/README.md | 2 + module/proxy/api/print.php | 245 + module/proxy/api/proxyGFI.php | 31 + module/proxy/api/proxyWMS.php | 64 + module/proxy/img/meritko.png | Bin 0 -> 857 bytes module/proxy/lib/php/LGConnect.php | 76 + module/proxy/lib/php/main.lib.php | 29 + module/proxy/settings/module.php | 10 + module/viewer/.gitignore | 1 + module/viewer/README.md | 2 + module/viewer/example/index.html | 241 + module/viewer/img/area_off.png | Bin 0 -> 1804 bytes module/viewer/img/area_on.png | Bin 0 -> 1830 bytes module/viewer/img/blank.gif | Bin 0 -> 42 bytes module/viewer/img/cloud-popup-relative.png | Bin 0 -> 2564 bytes module/viewer/img/collapse.png | Bin 0 -> 1289 bytes module/viewer/img/cs/about.png | Bin 0 -> 4289 bytes module/viewer/img/cs/editor.png | Bin 0 -> 4285 bytes module/viewer/img/cs/info.png | Bin 0 -> 1577 bytes module/viewer/img/cs/layers.png | Bin 0 -> 3138 bytes module/viewer/img/cs/legend.png | Bin 0 -> 3658 bytes module/viewer/img/cs/login.png | Bin 0 -> 2269 bytes module/viewer/img/cs/measurement.png | Bin 0 -> 3376 bytes module/viewer/img/cs/print.png | Bin 0 -> 1724 bytes module/viewer/img/cs_w/about.png | Bin 0 -> 3525 bytes module/viewer/img/cs_w/biotopy.png | Bin 0 -> 6882 bytes module/viewer/img/cs_w/editor.png | Bin 0 -> 4285 bytes module/viewer/img/cs_w/info.png | Bin 0 -> 1677 bytes module/viewer/img/cs_w/layers.png | Bin 0 -> 3236 bytes module/viewer/img/cs_w/legend.png | Bin 0 -> 3783 bytes module/viewer/img/cs_w/login.png | Bin 0 -> 2397 bytes module/viewer/img/cs_w/measurement.png | Bin 0 -> 3377 bytes module/viewer/img/cs_w/print.png | Bin 0 -> 1642 bytes module/viewer/img/del.png | Bin 0 -> 1298 bytes module/viewer/img/distance_off.png | Bin 0 -> 1479 bytes module/viewer/img/distance_on.png | Bin 0 -> 1545 bytes module/viewer/img/down.png | Bin 0 -> 318 bytes module/viewer/img/download.png | Bin 0 -> 1383 bytes module/viewer/img/drag-rectangle-off.png | Bin 0 -> 1780 bytes module/viewer/img/drag-rectangle-on.png | Bin 0 -> 1795 bytes module/viewer/img/east-mini.png | Bin 0 -> 360 bytes module/viewer/img/editing_tool_bar.png | Bin 0 -> 2222 bytes module/viewer/img/en_w/biotopy.png | Bin 0 -> 5684 bytes module/viewer/img/en_w/editor.png | Bin 0 -> 3815 bytes module/viewer/img/en_w/info.png | Bin 0 -> 3379 bytes module/viewer/img/en_w/layers.png | Bin 0 -> 4563 bytes module/viewer/img/en_w/legend.png | Bin 0 -> 5196 bytes module/viewer/img/en_w/login.png | Bin 0 -> 4897 bytes module/viewer/img/en_w/measurement.png | Bin 0 -> 4655 bytes module/viewer/img/en_w/print.png | Bin 0 -> 4271 bytes module/viewer/img/expand.png | Bin 0 -> 1296 bytes module/viewer/img/ico_ext_audio.png | Bin 0 -> 2356 bytes module/viewer/img/ico_ext_doc.jpg | Bin 0 -> 676 bytes module/viewer/img/ico_ext_doc.png | Bin 0 -> 2595 bytes module/viewer/img/ico_ext_img.png | Bin 0 -> 2236 bytes module/viewer/img/ico_ext_other.png | Bin 0 -> 1699 bytes module/viewer/img/ico_ext_pdf.png | Bin 0 -> 2687 bytes module/viewer/img/ico_ext_video.png | Bin 0 -> 2562 bytes module/viewer/img/ico_ext_xls.png | Bin 0 -> 2454 bytes module/viewer/img/ico_ext_zip.png | Bin 0 -> 2681 bytes module/viewer/img/kn_off.png | Bin 0 -> 1546 bytes module/viewer/img/kn_on.png | Bin 0 -> 1542 bytes module/viewer/img/layer-switcher-maximize.png | Bin 0 -> 1314 bytes module/viewer/img/layer-switcher-minimize.png | Bin 0 -> 1328 bytes module/viewer/img/loading.gif | Bin 0 -> 1359 bytes module/viewer/img/marker-blue.png | Bin 0 -> 992 bytes module/viewer/img/marker-gold.png | Bin 0 -> 831 bytes module/viewer/img/marker-green.png | Bin 0 -> 967 bytes module/viewer/img/marker.png | Bin 0 -> 606 bytes module/viewer/img/meritko.png | Bin 0 -> 857 bytes module/viewer/img/metadata.png | Bin 0 -> 1304 bytes module/viewer/img/minus.png | Bin 0 -> 238 bytes module/viewer/img/navigation_history.png | Bin 0 -> 2317 bytes module/viewer/img/north-mini.png | Bin 0 -> 359 bytes module/viewer/img/obdelnik.png | Bin 0 -> 358 bytes module/viewer/img/opacity.png | Bin 0 -> 199 bytes module/viewer/img/pan-off.png | Bin 0 -> 705 bytes module/viewer/img/pan-on.png | Bin 0 -> 714 bytes module/viewer/img/plus.png | Bin 0 -> 247 bytes .../img/prettyPhoto/dark_rounded/btnNext.png | Bin 0 -> 1411 bytes .../prettyPhoto/dark_rounded/btnPrevious.png | Bin 0 -> 1442 bytes .../dark_rounded/contentPattern.png | Bin 0 -> 130 bytes .../dark_rounded/default_thumbnail.gif | Bin 0 -> 227 bytes .../img/prettyPhoto/dark_rounded/loader.gif | Bin 0 -> 2545 bytes .../img/prettyPhoto/dark_rounded/sprite.png | Bin 0 -> 4076 bytes .../img/prettyPhoto/dark_square/btnNext.png | Bin 0 -> 1411 bytes .../prettyPhoto/dark_square/btnPrevious.png | Bin 0 -> 1442 bytes .../dark_square/contentPattern.png | Bin 0 -> 121 bytes .../dark_square/default_thumbnail.gif | Bin 0 -> 227 bytes .../img/prettyPhoto/dark_square/loader.gif | Bin 0 -> 2545 bytes .../img/prettyPhoto/dark_square/sprite.png | Bin 0 -> 3507 bytes .../img/prettyPhoto/default/default_thumb.png | Bin 0 -> 1537 bytes .../viewer/img/prettyPhoto/default/loader.gif | Bin 0 -> 6331 bytes .../viewer/img/prettyPhoto/default/sprite.png | Bin 0 -> 6682 bytes .../img/prettyPhoto/default/sprite_next.png | Bin 0 -> 1358 bytes .../img/prettyPhoto/default/sprite_prev.png | Bin 0 -> 1376 bytes .../img/prettyPhoto/default/sprite_x.png | Bin 0 -> 1097 bytes .../img/prettyPhoto/default/sprite_y.png | Bin 0 -> 1162 bytes .../img/prettyPhoto/facebook/btnNext.png | Bin 0 -> 845 bytes .../img/prettyPhoto/facebook/btnPrevious.png | Bin 0 -> 828 bytes .../facebook/contentPatternBottom.png | Bin 0 -> 142 bytes .../facebook/contentPatternLeft.png | Bin 0 -> 137 bytes .../facebook/contentPatternRight.png | Bin 0 -> 136 bytes .../facebook/contentPatternTop.png | Bin 0 -> 142 bytes .../facebook/default_thumbnail.gif | Bin 0 -> 227 bytes .../img/prettyPhoto/facebook/loader.gif | Bin 0 -> 2545 bytes .../img/prettyPhoto/facebook/sprite.png | Bin 0 -> 4227 bytes .../img/prettyPhoto/light_rounded/btnNext.png | Bin 0 -> 1411 bytes .../prettyPhoto/light_rounded/btnPrevious.png | Bin 0 -> 1442 bytes .../light_rounded/default_thumbnail.gif | Bin 0 -> 227 bytes .../img/prettyPhoto/light_rounded/loader.gif | Bin 0 -> 2545 bytes .../img/prettyPhoto/light_rounded/sprite.png | Bin 0 -> 4099 bytes .../img/prettyPhoto/light_square/btnNext.png | Bin 0 -> 1411 bytes .../prettyPhoto/light_square/btnPrevious.png | Bin 0 -> 1442 bytes .../light_square/default_thumbnail.gif | Bin 0 -> 227 bytes .../img/prettyPhoto/light_square/loader.gif | Bin 0 -> 2545 bytes .../img/prettyPhoto/light_square/sprite.png | Bin 0 -> 3507 bytes module/viewer/img/progressbar.gif | Bin 0 -> 10819 bytes module/viewer/img/query_mode_off.png | Bin 0 -> 1794 bytes module/viewer/img/query_mode_on.png | Bin 0 -> 1827 bytes module/viewer/img/queryable.png | Bin 0 -> 322 bytes module/viewer/img/remove_point_off.png | Bin 0 -> 1612 bytes module/viewer/img/remove_point_on.png | Bin 0 -> 1461 bytes module/viewer/img/save_features_off.png | Bin 0 -> 354 bytes module/viewer/img/save_features_on.png | Bin 0 -> 361 bytes module/viewer/img/slider.png | Bin 0 -> 303 bytes module/viewer/img/south-mini.png | Bin 0 -> 356 bytes module/viewer/img/style/0.png | Bin 0 -> 737 bytes module/viewer/img/style/10.png | Bin 0 -> 737 bytes module/viewer/img/style/11.png | Bin 0 -> 714 bytes module/viewer/img/style/12.png | Bin 0 -> 1176 bytes module/viewer/img/style/13.png | Bin 0 -> 6435 bytes module/viewer/img/style/14.png | Bin 0 -> 797 bytes module/viewer/img/style/16.png | Bin 0 -> 806 bytes module/viewer/img/style/17.png | Bin 0 -> 822 bytes module/viewer/img/style/18.png | Bin 0 -> 785 bytes module/viewer/img/style/19.png | Bin 0 -> 818 bytes module/viewer/img/style/2.png | Bin 0 -> 797 bytes module/viewer/img/style/20.png | Bin 0 -> 754 bytes module/viewer/img/style/21.png | Bin 0 -> 714 bytes module/viewer/img/style/22.png | Bin 0 -> 726 bytes module/viewer/img/style/23.png | Bin 0 -> 737 bytes module/viewer/img/style/24.png | Bin 0 -> 804 bytes module/viewer/img/style/25.png | Bin 0 -> 6140 bytes module/viewer/img/style/26.png | Bin 0 -> 716 bytes module/viewer/img/style/27.png | Bin 0 -> 19112 bytes module/viewer/img/style/28.png | Bin 0 -> 1757 bytes module/viewer/img/style/29.png | Bin 0 -> 1640 bytes module/viewer/img/style/33.png | Bin 0 -> 1757 bytes module/viewer/img/style/34.png | Bin 0 -> 1757 bytes module/viewer/img/style/35.png | Bin 0 -> 1757 bytes module/viewer/img/style/36.png | Bin 0 -> 1757 bytes module/viewer/img/style/37.png | Bin 0 -> 1757 bytes module/viewer/img/style/38.png | Bin 0 -> 1640 bytes module/viewer/img/style/7.png | Bin 0 -> 6343 bytes module/viewer/img/style/8.png | Bin 0 -> 791 bytes module/viewer/img/style/9.png | Bin 0 -> 792 bytes module/viewer/img/up.png | Bin 0 -> 290 bytes module/viewer/img/west-mini.png | Bin 0 -> 360 bytes module/viewer/img/white.png | Bin 0 -> 134 bytes module/viewer/img/zoom-minus-mini.png | Bin 0 -> 340 bytes module/viewer/img/zoom-plus-mini.png | Bin 0 -> 349 bytes module/viewer/img/zoom-world-mini.png | Bin 0 -> 1742 bytes module/viewer/img/zoom_out_off.png | Bin 0 -> 1754 bytes module/viewer/img/zoom_out_on.png | Bin 0 -> 1783 bytes module/viewer/img/zoombar.png | Bin 0 -> 243 bytes module/viewer/lib/css/prettyPhoto.css | 170 + module/viewer/lib/css/style.css | 696 +++ module/viewer/lib/js/defs/EPSG102067.js | 1 + module/viewer/lib/js/defs/EPSG102757.js | 1 + module/viewer/lib/js/defs/EPSG102758.js | 1 + module/viewer/lib/js/defs/EPSG21781.js | 1 + module/viewer/lib/js/defs/EPSG26591.js | 1 + module/viewer/lib/js/defs/EPSG26912.js | 1 + module/viewer/lib/js/defs/EPSG27200.js | 5 + module/viewer/lib/js/defs/EPSG27563.js | 1 + module/viewer/lib/js/defs/EPSG41001.js | 1 + module/viewer/lib/js/defs/EPSG4139.js | 1 + module/viewer/lib/js/defs/EPSG4181.js | 1 + module/viewer/lib/js/defs/EPSG42304.js | 1 + module/viewer/lib/js/defs/EPSG4272.js | 1 + module/viewer/lib/js/defs/EPSG4302.js | 2 + module/viewer/lib/js/defs/EPSG900913.js | 5 + module/viewer/lib/js/defs/EPSG900913.txt | 11 + module/viewer/lib/js/defs/GOOGLE.js | 2 + module/viewer/lib/js/jquery.js | 18 + module/viewer/lib/js/jquery.url.js | 159 + module/viewer/lib/js/jtree/_demo/_dump.sql | 20 + .../js/jtree/_demo/_inc/__mysql_errors.log | 91 + .../js/jtree/_demo/_inc/class._database.php | 146 + .../js/jtree/_demo/_inc/class._database_i.php | 152 + .../lib/js/jtree/_demo/_inc/class.tree.php | 602 +++ module/viewer/lib/js/jtree/_demo/_install.txt | 6 + module/viewer/lib/js/jtree/_demo/config.php | 14 + module/viewer/lib/js/jtree/_demo/file.png | Bin 0 -> 392 bytes module/viewer/lib/js/jtree/_demo/folder.png | Bin 0 -> 583 bytes module/viewer/lib/js/jtree/_demo/index.html | 461 ++ module/viewer/lib/js/jtree/_demo/root.png | Bin 0 -> 628 bytes module/viewer/lib/js/jtree/_demo/server.php | 69 + module/viewer/lib/js/jtree/_docs/!style.css | 48 + module/viewer/lib/js/jtree/_docs/_drive.png | Bin 0 -> 628 bytes .../viewer/lib/js/jtree/_docs/_html_data.html | 2 + .../viewer/lib/js/jtree/_docs/_json_data.json | 4 + .../lib/js/jtree/_docs/_search_data.json | 6 + .../lib/js/jtree/_docs/_search_result.json | 1 + .../viewer/lib/js/jtree/_docs/_xml_flat.xml | 12 + .../viewer/lib/js/jtree/_docs/_xml_nest.xml | 18 + .../viewer/lib/js/jtree/_docs/checkbox.html | 171 + .../lib/js/jtree/_docs/contextmenu.html | 121 + module/viewer/lib/js/jtree/_docs/cookies.html | 97 + module/viewer/lib/js/jtree/_docs/core.html | 689 +++ module/viewer/lib/js/jtree/_docs/crrm.html | 316 ++ module/viewer/lib/js/jtree/_docs/dnd.html | 199 + module/viewer/lib/js/jtree/_docs/hotkeys.html | 82 + .../viewer/lib/js/jtree/_docs/html_data.html | 175 + module/viewer/lib/js/jtree/_docs/index.html | 86 + .../viewer/lib/js/jtree/_docs/json_data.html | 249 + .../viewer/lib/js/jtree/_docs/languages.html | 152 + module/viewer/lib/js/jtree/_docs/logo.png | Bin 0 -> 6217 bytes module/viewer/lib/js/jtree/_docs/search.html | 153 + module/viewer/lib/js/jtree/_docs/sort.html | 85 + .../lib/js/jtree/_docs/syntax/!script.js | 2232 ++++++++ .../lib/js/jtree/_docs/syntax/!style.css | 511 ++ .../lib/js/jtree/_docs/syntax/clipboard.swf | Bin 0 -> 1361 bytes .../viewer/lib/js/jtree/_docs/syntax/help.png | Bin 0 -> 786 bytes .../lib/js/jtree/_docs/syntax/magnifier.png | Bin 0 -> 615 bytes .../js/jtree/_docs/syntax/page_white_code.png | Bin 0 -> 603 bytes .../js/jtree/_docs/syntax/page_white_copy.png | Bin 0 -> 309 bytes .../lib/js/jtree/_docs/syntax/printer.png | Bin 0 -> 731 bytes .../lib/js/jtree/_docs/syntax/wrapping.png | Bin 0 -> 631 bytes .../lib/js/jtree/_docs/themeroller.html | 107 + module/viewer/lib/js/jtree/_docs/themes.html | 127 + module/viewer/lib/js/jtree/_docs/types.html | 178 + module/viewer/lib/js/jtree/_docs/ui.html | 197 + module/viewer/lib/js/jtree/_docs/unique.html | 85 + .../viewer/lib/js/jtree/_docs/xml_data.html | 218 + .../viewer/lib/js/jtree/_lib/jquery.cookie.js | 96 + .../lib/js/jtree/_lib/jquery.hotkeys.js | 99 + module/viewer/lib/js/jtree/_lib/jquery.js | 18 + module/viewer/lib/js/jtree/jquery.jstree.js | 4551 +++++++++++++++++ .../viewer/lib/js/jtree/themes/apple/bg.jpg | Bin 0 -> 331 bytes module/viewer/lib/js/jtree/themes/apple/d.png | Bin 0 -> 7765 bytes .../lib/js/jtree/themes/apple/dot_for_ie.gif | Bin 0 -> 43 bytes .../lib/js/jtree/themes/apple/style.css | 61 + .../lib/js/jtree/themes/apple/throbber.gif | Bin 0 -> 1849 bytes .../viewer/lib/js/jtree/themes/classic/d.gif | Bin 0 -> 3003 bytes .../viewer/lib/js/jtree/themes/classic/d.png | Bin 0 -> 7535 bytes .../js/jtree/themes/classic/dot_for_ie.gif | Bin 0 -> 43 bytes .../lib/js/jtree/themes/classic/style.css | 76 + .../lib/js/jtree/themes/classic/throbber.gif | Bin 0 -> 1849 bytes .../lib/js/jtree/themes/default-rtl/d.gif | Bin 0 -> 2872 bytes .../lib/js/jtree/themes/default-rtl/d.png | Bin 0 -> 7459 bytes .../lib/js/jtree/themes/default-rtl/dots.gif | Bin 0 -> 132 bytes .../lib/js/jtree/themes/default-rtl/style.css | 84 + .../js/jtree/themes/default-rtl/throbber.gif | Bin 0 -> 1849 bytes .../viewer/lib/js/jtree/themes/default/d.gif | Bin 0 -> 2944 bytes .../viewer/lib/js/jtree/themes/default/d.png | Bin 0 -> 7635 bytes .../lib/js/jtree/themes/default/style.css | 72 + .../lib/js/jtree/themes/default/throbber.gif | Bin 0 -> 1849 bytes module/viewer/lib/js/ligeo.js | 1671 ++++++ module/viewer/lib/js/ligeoabout.js | 23 + module/viewer/lib/js/ligeobaselayers.js | 86 + module/viewer/lib/js/ligeobiotopy.js | 124 + module/viewer/lib/js/ligeoeditor.js | 356 ++ module/viewer/lib/js/ligeoinfo.js | 389 ++ module/viewer/lib/js/ligeolayers.js | 35 + module/viewer/lib/js/ligeolegend.js | 57 + module/viewer/lib/js/ligeologin.js | 25 + module/viewer/lib/js/ligeomeasurement.js | 153 + module/viewer/lib/js/ligeoprint.js | 205 + module/viewer/lib/js/main.js | 4 + module/viewer/lib/js/openlayers/OpenLayers.js | 2553 +++++++++ .../doc_config/Data/ClassHierarchy.nd | Bin 0 -> 30562 bytes .../doc_config/Data/ConfigFileInfo.nd | 1 + .../js/openlayers/doc_config/Data/FileInfo.nd | 289 ++ .../doc_config/Data/ImageFileInfo.nd | Bin 0 -> 216 bytes .../doc_config/Data/ImageReferenceTable.nd | Bin 0 -> 252 bytes .../openlayers/doc_config/Data/IndexInfo.nd | Bin 0 -> 267 bytes .../doc_config/Data/PreviousMenuState.nd | Bin 0 -> 23441 bytes .../doc_config/Data/PreviousSettings.nd | Bin 0 -> 115 bytes .../openlayers/doc_config/Data/SymbolTable.nd | Bin 0 -> 974754 bytes .../js/openlayers/doc_config/Languages.txt | 113 + .../lib/js/openlayers/doc_config/Menu.txt | 480 ++ .../lib/js/openlayers/doc_config/OL.css | 20 + .../lib/js/openlayers/doc_config/Topics.txt | 102 + .../lib/js/openlayers/img/add_point_off.png | Bin 0 -> 1616 bytes .../lib/js/openlayers/img/add_point_on.png | Bin 0 -> 1464 bytes module/viewer/lib/js/openlayers/img/blank.gif | Bin 0 -> 42 bytes .../viewer/lib/js/openlayers/img/cancel.png | Bin 0 -> 480 bytes module/viewer/lib/js/openlayers/img/close.gif | Bin 0 -> 1078 bytes .../openlayers/img/cloud-popup-relative.png | Bin 0 -> 2564 bytes .../js/openlayers/img/drag-rectangle-off.png | Bin 0 -> 1202 bytes .../js/openlayers/img/drag-rectangle-on.png | Bin 0 -> 1218 bytes .../lib/js/openlayers/img/draw_line_off.png | Bin 0 -> 1567 bytes .../lib/js/openlayers/img/draw_line_on.png | Bin 0 -> 1399 bytes .../lib/js/openlayers/img/draw_point_off.png | Bin 0 -> 1612 bytes .../lib/js/openlayers/img/draw_point_on.png | Bin 0 -> 1460 bytes .../js/openlayers/img/draw_polygon_off.png | Bin 0 -> 1546 bytes .../lib/js/openlayers/img/draw_polygon_on.png | Bin 0 -> 1407 bytes .../lib/js/openlayers/img/east-mini.png | Bin 0 -> 451 bytes .../js/openlayers/img/editing_tool_bar.png | Bin 0 -> 3901 bytes .../img/layer-switcher-maximize.png | Bin 0 -> 451 bytes .../img/layer-switcher-minimize.png | Bin 0 -> 249 bytes .../lib/js/openlayers/img/marker-blue.png | Bin 0 -> 992 bytes .../lib/js/openlayers/img/marker-gold.png | Bin 0 -> 831 bytes .../lib/js/openlayers/img/marker-green.png | Bin 0 -> 967 bytes .../viewer/lib/js/openlayers/img/marker.png | Bin 0 -> 606 bytes .../js/openlayers/img/measuring-stick-off.png | Bin 0 -> 3343 bytes .../js/openlayers/img/measuring-stick-on.png | Bin 0 -> 3816 bytes .../js/openlayers/img/move_feature_off.png | Bin 0 -> 1543 bytes .../lib/js/openlayers/img/move_feature_on.png | Bin 0 -> 1379 bytes .../js/openlayers/img/navigation_history.png | Bin 0 -> 7021 bytes .../lib/js/openlayers/img/north-mini.png | Bin 0 -> 484 bytes .../viewer/lib/js/openlayers/img/options.png | Bin 0 -> 327 bytes .../openlayers/img/overview_replacement.gif | Bin 0 -> 79 bytes .../js/openlayers/img/pan-panel-NOALPHA.png | Bin 0 -> 566 bytes .../lib/js/openlayers/img/pan-panel.png | Bin 0 -> 1287 bytes .../viewer/lib/js/openlayers/img/pan_off.png | Bin 0 -> 1696 bytes .../viewer/lib/js/openlayers/img/pan_on.png | Bin 0 -> 1568 bytes .../js/openlayers/img/panning-hand-off.png | Bin 0 -> 3875 bytes .../lib/js/openlayers/img/panning-hand-on.png | Bin 0 -> 3977 bytes .../js/openlayers/img/remove_point_off.png | Bin 0 -> 1612 bytes .../lib/js/openlayers/img/remove_point_on.png | Bin 0 -> 1464 bytes module/viewer/lib/js/openlayers/img/ruler.png | Bin 0 -> 1211 bytes .../js/openlayers/img/save_features_off.png | Bin 0 -> 357 bytes .../js/openlayers/img/save_features_on.png | Bin 0 -> 364 bytes .../viewer/lib/js/openlayers/img/slider.png | Bin 0 -> 285 bytes .../lib/js/openlayers/img/south-mini.png | Bin 0 -> 481 bytes .../lib/js/openlayers/img/view_next_off.png | Bin 0 -> 1644 bytes .../lib/js/openlayers/img/view_next_on.png | Bin 0 -> 1686 bytes .../js/openlayers/img/view_previous_off.png | Bin 0 -> 1553 bytes .../js/openlayers/img/view_previous_on.png | Bin 0 -> 1592 bytes .../lib/js/openlayers/img/west-mini.png | Bin 0 -> 453 bytes .../lib/js/openlayers/img/zoom-minus-mini.png | Bin 0 -> 359 bytes .../js/openlayers/img/zoom-panel-NOALPHA.png | Bin 0 -> 1173 bytes .../lib/js/openlayers/img/zoom-panel.png | Bin 0 -> 1624 bytes .../lib/js/openlayers/img/zoom-plus-mini.png | Bin 0 -> 489 bytes .../lib/js/openlayers/img/zoom-world-mini.png | Bin 0 -> 1072 bytes .../viewer/lib/js/openlayers/img/zoombar.png | Bin 0 -> 463 bytes .../js/openlayers/lib/Firebug/errorIcon.png | Bin 0 -> 457 bytes .../lib/js/openlayers/lib/Firebug/firebug.css | 209 + .../js/openlayers/lib/Firebug/firebug.html | 23 + .../lib/js/openlayers/lib/Firebug/firebug.js | 674 +++ .../lib/js/openlayers/lib/Firebug/firebugx.js | 9 + .../js/openlayers/lib/Firebug/infoIcon.png | Bin 0 -> 524 bytes .../lib/js/openlayers/lib/Firebug/license.txt | 30 + .../lib/js/openlayers/lib/Firebug/readme.txt | 13 + .../js/openlayers/lib/Firebug/warningIcon.png | Bin 0 -> 516 bytes .../lib/js/openlayers/lib/Gears/gears_init.js | 88 + .../lib/OpenLayers/BaseTypes/Bounds.js | 681 +++ .../lib/OpenLayers/BaseTypes/Class.js | 116 + .../lib/OpenLayers/BaseTypes/Element.js | 251 + .../lib/OpenLayers/BaseTypes/LonLat.js | 190 + .../lib/OpenLayers/BaseTypes/Pixel.js | 125 + .../lib/OpenLayers/BaseTypes/Size.js | 85 + .../lib/OpenLayers/Control/ArgParser.js | 166 + .../lib/OpenLayers/Control/Attribution.js | 97 + .../lib/OpenLayers/Control/Button.js | 44 + .../lib/OpenLayers/Control/DragFeature.js | 303 ++ module/viewer/lib/js/openlayers/readme.txt | 21 + .../theme/default/img/add_point_off.png | Bin 0 -> 1616 bytes .../theme/default/img/add_point_on.png | Bin 0 -> 1464 bytes .../js/openlayers/theme/default/img/blank.gif | Bin 0 -> 42 bytes .../js/openlayers/theme/default/img/close.gif | Bin 0 -> 1078 bytes .../default/img/cloud-popup-relative.png | Bin 0 -> 2564 bytes .../theme/default/img/drag-rectangle-off.png | Bin 0 -> 1202 bytes .../theme/default/img/drag-rectangle-on.png | Bin 0 -> 1218 bytes .../theme/default/img/draw_line_off.png | Bin 0 -> 1567 bytes .../theme/default/img/draw_line_on.png | Bin 0 -> 1399 bytes .../theme/default/img/draw_point_off.png | Bin 0 -> 1612 bytes .../theme/default/img/draw_point_on.png | Bin 0 -> 1460 bytes .../theme/default/img/draw_polygon_off.png | Bin 0 -> 1546 bytes .../theme/default/img/draw_polygon_on.png | Bin 0 -> 1407 bytes .../theme/default/img/editing_tool_bar.png | Bin 0 -> 3901 bytes .../theme/default/img/move_feature_off.png | Bin 0 -> 1543 bytes .../theme/default/img/move_feature_on.png | Bin 0 -> 1379 bytes .../theme/default/img/navigation_history.png | Bin 0 -> 7021 bytes .../default/img/overview_replacement.gif | Bin 0 -> 79 bytes .../theme/default/img/pan-panel-NOALPHA.png | Bin 0 -> 566 bytes .../theme/default/img/pan-panel.png | Bin 0 -> 1287 bytes .../openlayers/theme/default/img/pan_off.png | Bin 0 -> 1696 bytes .../openlayers/theme/default/img/pan_on.png | Bin 0 -> 1568 bytes .../theme/default/img/panning-hand-off.png | Bin 0 -> 3875 bytes .../theme/default/img/panning-hand-on.png | Bin 0 -> 3977 bytes .../theme/default/img/remove_point_off.png | Bin 0 -> 1612 bytes .../theme/default/img/remove_point_on.png | Bin 0 -> 1464 bytes .../js/openlayers/theme/default/img/ruler.png | Bin 0 -> 1211 bytes .../theme/default/img/save_features_off.png | Bin 0 -> 357 bytes .../theme/default/img/save_features_on.png | Bin 0 -> 364 bytes .../theme/default/img/view_next_off.png | Bin 0 -> 1644 bytes .../theme/default/img/view_next_on.png | Bin 0 -> 1686 bytes .../theme/default/img/view_previous_off.png | Bin 0 -> 1553 bytes .../theme/default/img/view_previous_on.png | Bin 0 -> 1592 bytes .../theme/default/img/zoom-panel-NOALPHA.png | Bin 0 -> 1173 bytes .../theme/default/img/zoom-panel.png | Bin 0 -> 1624 bytes .../lib/js/openlayers/theme/default/style.css | 246 + module/viewer/lib/js/openlayers/wms.cfg | 36 + .../lib/js/prettyPhoto/jquery-1.3.2.min.js | 19 + .../lib/js/prettyPhoto/jquery-1.4.4.min.js | 167 + .../lib/js/prettyPhoto/jquery-1.6.1.min.js | 18 + .../lib/js/prettyPhoto/jquery.prettyPhoto.js | 81 + module/viewer/lib/js/proj4js-compressed.js | 208 + module/viewer/lib/js/projCode/aea.js | 149 + module/viewer/lib/js/projCode/aeqd.js | 75 + module/viewer/lib/js/projCode/cass.js | 162 + module/viewer/lib/js/projCode/cea.js | 85 + module/viewer/lib/js/projCode/eqc.js | 42 + module/viewer/lib/js/projCode/eqdc.js | 140 + module/viewer/lib/js/projCode/equi.js | 72 + module/viewer/lib/js/projCode/gauss.js | 44 + module/viewer/lib/js/projCode/gnom.js | 116 + module/viewer/lib/js/projCode/gstmerc.js | 52 + module/viewer/lib/js/projCode/laea.js | 357 ++ module/viewer/lib/js/projCode/lcc.js | 148 + module/viewer/lib/js/projCode/merc.js | 115 + module/viewer/lib/js/projCode/mill.js | 68 + module/viewer/lib/js/projCode/moll.js | 100 + module/viewer/lib/js/projCode/nzmg.js | 286 ++ module/viewer/lib/js/projCode/omerc.js | 256 + module/viewer/lib/js/projCode/ortho.js | 110 + module/viewer/lib/js/projCode/poly.js | 157 + module/viewer/lib/js/projCode/sinu.js | 79 + module/viewer/lib/js/projCode/somerc.js | 110 + module/viewer/lib/js/projCode/stere.js | 246 + module/viewer/lib/js/projCode/sterea.js | 56 + module/viewer/lib/js/projCode/tmerc.js | 141 + module/viewer/lib/js/projCode/utm.js | 43 + module/viewer/lib/js/projCode/vandg.js | 137 + module/viewer/lib/php/empty | 0 module/viewer/proxy.php | 25 + module/viewer/proxyAPI.php | 52 + module/viewer/proxyGFI.php | 29 + module/viewer/proxyWFS.php | 62 + module/viewer/settings.php | 16 + module/viewer/settings/module.php | 22 + page/README.md | 2 + page/layerStyle_edit.php | 28 + page/layerStyles_edit/index.php | 129 + page/layers_edit/index.php | 402 ++ page/layers_public/index.php | 121 + page/pg_biotopy/GFI.php | 60 + page/pg_biotopy/ek_hodnota.php | 168 + page/pg_biotopy/hosp.php | 342 ++ page/pg_biotopy/hosp_info.html | 14 + page/pg_biotopy/spol.php | 334 ++ page/pg_edit/index.php | 197 + page/plan_edit/index.php | 119 + page/plan_edit/plan_edit_centerMap/map.php | 109 + page/user_account/index.php | 22 + page/users_edit/index.php | 91 + proxy.php | 171 + proxyPrint.php | 50 + settings/module.php | 10 + style/main.css | 609 +++ 523 files changed, 36225 insertions(+) create mode 100644 .gitignore create mode 100644 README.md create mode 100644 action/layerFolder_add.php create mode 100644 action/layerFolder_remove.php create mode 100644 action/layerFolder_update.php create mode 100644 action/layerPublic_add.php create mode 100644 action/layerStyle_add.php create mode 100644 action/layerStyle_remove.php create mode 100644 action/layerStyle_update.php create mode 100644 action/layer_add.php create mode 100644 action/layer_remove.php create mode 100644 action/layer_update.php create mode 100644 action/layer_updateLayersFromPostgis.php create mode 100644 action/login.php create mode 100644 action/logout.php create mode 100644 action/pgCol_add.php create mode 100644 action/pgCol_remove.php create mode 100644 action/pgItem_insert_bio.php create mode 100644 action/pgItem_remove.php create mode 100644 action/pgItem_update.php create mode 100644 action/pgItem_update_bio.php create mode 100644 action/plan_add.php create mode 100644 action/plan_remove.php create mode 100644 action/plan_update.php create mode 100644 action/user_add.php create mode 100644 action/user_remove.php create mode 100644 action/user_update.php create mode 100644 api/README.md create mode 100644 api/index.php create mode 100644 api/sld.php create mode 100644 cron/layer_importGeoserver.php create mode 100644 data/plan.template.html create mode 100644 favicon.ico create mode 100644 index.php create mode 100644 install/README.md create mode 100644 install/disable.php create mode 100644 install/enable.php create mode 100644 install/enabled create mode 100644 install/ready.php create mode 100644 install/settings.php create mode 100644 install/settings_update.php create mode 100644 lib/php/GeoserverAPI.php create mode 100644 lib/php/GeoserverAPILigeo.php create mode 100644 lib/php/LGAPI.php create mode 100644 lib/php/LGConnect.php create mode 100644 lib/php/LGForm.php create mode 100644 lib/php/LGFormElement.php create mode 100644 lib/php/LGFormItem.php create mode 100644 lib/php/LGFormManager.php create mode 100644 lib/php/LGInstall.php create mode 100644 lib/php/LGLayer.php create mode 100644 lib/php/LGLayerCol.php create mode 100644 lib/php/LGLayerColManager.php create mode 100644 lib/php/LGLayerFolder.php create mode 100644 lib/php/LGLayerManager.php create mode 100644 lib/php/LGLayerStyle.php create mode 100644 lib/php/LGLayerStyleManager.php create mode 100644 lib/php/LGPlan.php create mode 100644 lib/php/LGPlanManager.php create mode 100644 lib/php/LGPlanPrivilege.php create mode 100644 lib/php/LGRESTClient.php create mode 100644 lib/php/LGSystemUser.php create mode 100644 lib/php/LGUser.php create mode 100644 lib/php/LGUserManager.php create mode 100644 lib/php/LGlang.php create mode 100644 lib/php/dump.sql create mode 100644 lib/php/main.lib.php create mode 100644 login.php create mode 100644 module/README.md create mode 100644 module/proxy/README.md create mode 100644 module/proxy/api/print.php create mode 100644 module/proxy/api/proxyGFI.php create mode 100644 module/proxy/api/proxyWMS.php create mode 100644 module/proxy/img/meritko.png create mode 100644 module/proxy/lib/php/LGConnect.php create mode 100644 module/proxy/lib/php/main.lib.php create mode 100644 module/proxy/settings/module.php create mode 100644 module/viewer/.gitignore create mode 100644 module/viewer/README.md create mode 100644 module/viewer/example/index.html create mode 100644 module/viewer/img/area_off.png create mode 100644 module/viewer/img/area_on.png create mode 100644 module/viewer/img/blank.gif create mode 100644 module/viewer/img/cloud-popup-relative.png create mode 100644 module/viewer/img/collapse.png create mode 100644 module/viewer/img/cs/about.png create mode 100644 module/viewer/img/cs/editor.png create mode 100644 module/viewer/img/cs/info.png create mode 100644 module/viewer/img/cs/layers.png create mode 100644 module/viewer/img/cs/legend.png create mode 100644 module/viewer/img/cs/login.png create mode 100644 module/viewer/img/cs/measurement.png create mode 100644 module/viewer/img/cs/print.png create mode 100644 module/viewer/img/cs_w/about.png create mode 100644 module/viewer/img/cs_w/biotopy.png create mode 100644 module/viewer/img/cs_w/editor.png create mode 100644 module/viewer/img/cs_w/info.png create mode 100644 module/viewer/img/cs_w/layers.png create mode 100644 module/viewer/img/cs_w/legend.png create mode 100644 module/viewer/img/cs_w/login.png create mode 100644 module/viewer/img/cs_w/measurement.png create mode 100644 module/viewer/img/cs_w/print.png create mode 100644 module/viewer/img/del.png create mode 100644 module/viewer/img/distance_off.png create mode 100644 module/viewer/img/distance_on.png create mode 100644 module/viewer/img/down.png create mode 100644 module/viewer/img/download.png create mode 100644 module/viewer/img/drag-rectangle-off.png create mode 100644 module/viewer/img/drag-rectangle-on.png create mode 100644 module/viewer/img/east-mini.png create mode 100644 module/viewer/img/editing_tool_bar.png create mode 100644 module/viewer/img/en_w/biotopy.png create mode 100644 module/viewer/img/en_w/editor.png create mode 100644 module/viewer/img/en_w/info.png create mode 100644 module/viewer/img/en_w/layers.png create mode 100644 module/viewer/img/en_w/legend.png create mode 100644 module/viewer/img/en_w/login.png create mode 100644 module/viewer/img/en_w/measurement.png create mode 100644 module/viewer/img/en_w/print.png create mode 100644 module/viewer/img/expand.png create mode 100644 module/viewer/img/ico_ext_audio.png create mode 100644 module/viewer/img/ico_ext_doc.jpg create mode 100644 module/viewer/img/ico_ext_doc.png create mode 100644 module/viewer/img/ico_ext_img.png create mode 100644 module/viewer/img/ico_ext_other.png create mode 100644 module/viewer/img/ico_ext_pdf.png create mode 100644 module/viewer/img/ico_ext_video.png create mode 100644 module/viewer/img/ico_ext_xls.png create mode 100644 module/viewer/img/ico_ext_zip.png create mode 100644 module/viewer/img/kn_off.png create mode 100644 module/viewer/img/kn_on.png create mode 100644 module/viewer/img/layer-switcher-maximize.png create mode 100644 module/viewer/img/layer-switcher-minimize.png create mode 100644 module/viewer/img/loading.gif create mode 100644 module/viewer/img/marker-blue.png create mode 100644 module/viewer/img/marker-gold.png create mode 100644 module/viewer/img/marker-green.png create mode 100644 module/viewer/img/marker.png create mode 100644 module/viewer/img/meritko.png create mode 100644 module/viewer/img/metadata.png create mode 100644 module/viewer/img/minus.png create mode 100644 module/viewer/img/navigation_history.png create mode 100644 module/viewer/img/north-mini.png create mode 100644 module/viewer/img/obdelnik.png create mode 100644 module/viewer/img/opacity.png create mode 100644 module/viewer/img/pan-off.png create mode 100644 module/viewer/img/pan-on.png create mode 100644 module/viewer/img/plus.png create mode 100644 module/viewer/img/prettyPhoto/dark_rounded/btnNext.png create mode 100644 module/viewer/img/prettyPhoto/dark_rounded/btnPrevious.png create mode 100644 module/viewer/img/prettyPhoto/dark_rounded/contentPattern.png create mode 100644 module/viewer/img/prettyPhoto/dark_rounded/default_thumbnail.gif create mode 100644 module/viewer/img/prettyPhoto/dark_rounded/loader.gif create mode 100644 module/viewer/img/prettyPhoto/dark_rounded/sprite.png create mode 100644 module/viewer/img/prettyPhoto/dark_square/btnNext.png create mode 100644 module/viewer/img/prettyPhoto/dark_square/btnPrevious.png create mode 100644 module/viewer/img/prettyPhoto/dark_square/contentPattern.png create mode 100644 module/viewer/img/prettyPhoto/dark_square/default_thumbnail.gif create mode 100644 module/viewer/img/prettyPhoto/dark_square/loader.gif create mode 100644 module/viewer/img/prettyPhoto/dark_square/sprite.png create mode 100644 module/viewer/img/prettyPhoto/default/default_thumb.png create mode 100644 module/viewer/img/prettyPhoto/default/loader.gif create mode 100644 module/viewer/img/prettyPhoto/default/sprite.png create mode 100644 module/viewer/img/prettyPhoto/default/sprite_next.png create mode 100644 module/viewer/img/prettyPhoto/default/sprite_prev.png create mode 100644 module/viewer/img/prettyPhoto/default/sprite_x.png create mode 100644 module/viewer/img/prettyPhoto/default/sprite_y.png create mode 100644 module/viewer/img/prettyPhoto/facebook/btnNext.png create mode 100644 module/viewer/img/prettyPhoto/facebook/btnPrevious.png create mode 100644 module/viewer/img/prettyPhoto/facebook/contentPatternBottom.png create mode 100644 module/viewer/img/prettyPhoto/facebook/contentPatternLeft.png create mode 100644 module/viewer/img/prettyPhoto/facebook/contentPatternRight.png create mode 100644 module/viewer/img/prettyPhoto/facebook/contentPatternTop.png create mode 100644 module/viewer/img/prettyPhoto/facebook/default_thumbnail.gif create mode 100644 module/viewer/img/prettyPhoto/facebook/loader.gif create mode 100644 module/viewer/img/prettyPhoto/facebook/sprite.png create mode 100644 module/viewer/img/prettyPhoto/light_rounded/btnNext.png create mode 100644 module/viewer/img/prettyPhoto/light_rounded/btnPrevious.png create mode 100644 module/viewer/img/prettyPhoto/light_rounded/default_thumbnail.gif create mode 100644 module/viewer/img/prettyPhoto/light_rounded/loader.gif create mode 100644 module/viewer/img/prettyPhoto/light_rounded/sprite.png create mode 100644 module/viewer/img/prettyPhoto/light_square/btnNext.png create mode 100644 module/viewer/img/prettyPhoto/light_square/btnPrevious.png create mode 100644 module/viewer/img/prettyPhoto/light_square/default_thumbnail.gif create mode 100644 module/viewer/img/prettyPhoto/light_square/loader.gif create mode 100644 module/viewer/img/prettyPhoto/light_square/sprite.png create mode 100644 module/viewer/img/progressbar.gif create mode 100644 module/viewer/img/query_mode_off.png create mode 100644 module/viewer/img/query_mode_on.png create mode 100644 module/viewer/img/queryable.png create mode 100644 module/viewer/img/remove_point_off.png create mode 100644 module/viewer/img/remove_point_on.png create mode 100644 module/viewer/img/save_features_off.png create mode 100644 module/viewer/img/save_features_on.png create mode 100644 module/viewer/img/slider.png create mode 100644 module/viewer/img/south-mini.png create mode 100644 module/viewer/img/style/0.png create mode 100644 module/viewer/img/style/10.png create mode 100644 module/viewer/img/style/11.png create mode 100644 module/viewer/img/style/12.png create mode 100644 module/viewer/img/style/13.png create mode 100644 module/viewer/img/style/14.png create mode 100644 module/viewer/img/style/16.png create mode 100644 module/viewer/img/style/17.png create mode 100644 module/viewer/img/style/18.png create mode 100644 module/viewer/img/style/19.png create mode 100644 module/viewer/img/style/2.png create mode 100644 module/viewer/img/style/20.png create mode 100644 module/viewer/img/style/21.png create mode 100644 module/viewer/img/style/22.png create mode 100644 module/viewer/img/style/23.png create mode 100644 module/viewer/img/style/24.png create mode 100644 module/viewer/img/style/25.png create mode 100644 module/viewer/img/style/26.png create mode 100644 module/viewer/img/style/27.png create mode 100644 module/viewer/img/style/28.png create mode 100644 module/viewer/img/style/29.png create mode 100644 module/viewer/img/style/33.png create mode 100644 module/viewer/img/style/34.png create mode 100644 module/viewer/img/style/35.png create mode 100644 module/viewer/img/style/36.png create mode 100644 module/viewer/img/style/37.png create mode 100644 module/viewer/img/style/38.png create mode 100644 module/viewer/img/style/7.png create mode 100644 module/viewer/img/style/8.png create mode 100644 module/viewer/img/style/9.png create mode 100644 module/viewer/img/up.png create mode 100644 module/viewer/img/west-mini.png create mode 100644 module/viewer/img/white.png create mode 100644 module/viewer/img/zoom-minus-mini.png create mode 100644 module/viewer/img/zoom-plus-mini.png create mode 100644 module/viewer/img/zoom-world-mini.png create mode 100644 module/viewer/img/zoom_out_off.png create mode 100644 module/viewer/img/zoom_out_on.png create mode 100644 module/viewer/img/zoombar.png create mode 100644 module/viewer/lib/css/prettyPhoto.css create mode 100644 module/viewer/lib/css/style.css create mode 100644 module/viewer/lib/js/defs/EPSG102067.js create mode 100644 module/viewer/lib/js/defs/EPSG102757.js create mode 100644 module/viewer/lib/js/defs/EPSG102758.js create mode 100644 module/viewer/lib/js/defs/EPSG21781.js create mode 100644 module/viewer/lib/js/defs/EPSG26591.js create mode 100644 module/viewer/lib/js/defs/EPSG26912.js create mode 100644 module/viewer/lib/js/defs/EPSG27200.js create mode 100644 module/viewer/lib/js/defs/EPSG27563.js create mode 100644 module/viewer/lib/js/defs/EPSG41001.js create mode 100644 module/viewer/lib/js/defs/EPSG4139.js create mode 100644 module/viewer/lib/js/defs/EPSG4181.js create mode 100644 module/viewer/lib/js/defs/EPSG42304.js create mode 100644 module/viewer/lib/js/defs/EPSG4272.js create mode 100644 module/viewer/lib/js/defs/EPSG4302.js create mode 100644 module/viewer/lib/js/defs/EPSG900913.js create mode 100644 module/viewer/lib/js/defs/EPSG900913.txt create mode 100644 module/viewer/lib/js/defs/GOOGLE.js create mode 100644 module/viewer/lib/js/jquery.js create mode 100644 module/viewer/lib/js/jquery.url.js create mode 100644 module/viewer/lib/js/jtree/_demo/_dump.sql create mode 100644 module/viewer/lib/js/jtree/_demo/_inc/__mysql_errors.log create mode 100644 module/viewer/lib/js/jtree/_demo/_inc/class._database.php create mode 100644 module/viewer/lib/js/jtree/_demo/_inc/class._database_i.php create mode 100644 module/viewer/lib/js/jtree/_demo/_inc/class.tree.php create mode 100644 module/viewer/lib/js/jtree/_demo/_install.txt create mode 100644 module/viewer/lib/js/jtree/_demo/config.php create mode 100644 module/viewer/lib/js/jtree/_demo/file.png create mode 100644 module/viewer/lib/js/jtree/_demo/folder.png create mode 100644 module/viewer/lib/js/jtree/_demo/index.html create mode 100644 module/viewer/lib/js/jtree/_demo/root.png create mode 100644 module/viewer/lib/js/jtree/_demo/server.php create mode 100644 module/viewer/lib/js/jtree/_docs/!style.css create mode 100644 module/viewer/lib/js/jtree/_docs/_drive.png create mode 100644 module/viewer/lib/js/jtree/_docs/_html_data.html create mode 100644 module/viewer/lib/js/jtree/_docs/_json_data.json create mode 100644 module/viewer/lib/js/jtree/_docs/_search_data.json create mode 100644 module/viewer/lib/js/jtree/_docs/_search_result.json create mode 100644 module/viewer/lib/js/jtree/_docs/_xml_flat.xml create mode 100644 module/viewer/lib/js/jtree/_docs/_xml_nest.xml create mode 100644 module/viewer/lib/js/jtree/_docs/checkbox.html create mode 100644 module/viewer/lib/js/jtree/_docs/contextmenu.html create mode 100644 module/viewer/lib/js/jtree/_docs/cookies.html create mode 100644 module/viewer/lib/js/jtree/_docs/core.html create mode 100644 module/viewer/lib/js/jtree/_docs/crrm.html create mode 100644 module/viewer/lib/js/jtree/_docs/dnd.html create mode 100644 module/viewer/lib/js/jtree/_docs/hotkeys.html create mode 100644 module/viewer/lib/js/jtree/_docs/html_data.html create mode 100644 module/viewer/lib/js/jtree/_docs/index.html create mode 100644 module/viewer/lib/js/jtree/_docs/json_data.html create mode 100644 module/viewer/lib/js/jtree/_docs/languages.html create mode 100644 module/viewer/lib/js/jtree/_docs/logo.png create mode 100644 module/viewer/lib/js/jtree/_docs/search.html create mode 100644 module/viewer/lib/js/jtree/_docs/sort.html create mode 100644 module/viewer/lib/js/jtree/_docs/syntax/!script.js create mode 100644 module/viewer/lib/js/jtree/_docs/syntax/!style.css create mode 100644 module/viewer/lib/js/jtree/_docs/syntax/clipboard.swf create mode 100644 module/viewer/lib/js/jtree/_docs/syntax/help.png create mode 100644 module/viewer/lib/js/jtree/_docs/syntax/magnifier.png create mode 100644 module/viewer/lib/js/jtree/_docs/syntax/page_white_code.png create mode 100644 module/viewer/lib/js/jtree/_docs/syntax/page_white_copy.png create mode 100644 module/viewer/lib/js/jtree/_docs/syntax/printer.png create mode 100644 module/viewer/lib/js/jtree/_docs/syntax/wrapping.png create mode 100644 module/viewer/lib/js/jtree/_docs/themeroller.html create mode 100644 module/viewer/lib/js/jtree/_docs/themes.html create mode 100644 module/viewer/lib/js/jtree/_docs/types.html create mode 100644 module/viewer/lib/js/jtree/_docs/ui.html create mode 100644 module/viewer/lib/js/jtree/_docs/unique.html create mode 100644 module/viewer/lib/js/jtree/_docs/xml_data.html create mode 100644 module/viewer/lib/js/jtree/_lib/jquery.cookie.js create mode 100644 module/viewer/lib/js/jtree/_lib/jquery.hotkeys.js create mode 100644 module/viewer/lib/js/jtree/_lib/jquery.js create mode 100644 module/viewer/lib/js/jtree/jquery.jstree.js create mode 100644 module/viewer/lib/js/jtree/themes/apple/bg.jpg create mode 100644 module/viewer/lib/js/jtree/themes/apple/d.png create mode 100644 module/viewer/lib/js/jtree/themes/apple/dot_for_ie.gif create mode 100644 module/viewer/lib/js/jtree/themes/apple/style.css create mode 100644 module/viewer/lib/js/jtree/themes/apple/throbber.gif create mode 100644 module/viewer/lib/js/jtree/themes/classic/d.gif create mode 100644 module/viewer/lib/js/jtree/themes/classic/d.png create mode 100644 module/viewer/lib/js/jtree/themes/classic/dot_for_ie.gif create mode 100644 module/viewer/lib/js/jtree/themes/classic/style.css create mode 100644 module/viewer/lib/js/jtree/themes/classic/throbber.gif create mode 100644 module/viewer/lib/js/jtree/themes/default-rtl/d.gif create mode 100644 module/viewer/lib/js/jtree/themes/default-rtl/d.png create mode 100644 module/viewer/lib/js/jtree/themes/default-rtl/dots.gif create mode 100644 module/viewer/lib/js/jtree/themes/default-rtl/style.css create mode 100644 module/viewer/lib/js/jtree/themes/default-rtl/throbber.gif create mode 100644 module/viewer/lib/js/jtree/themes/default/d.gif create mode 100644 module/viewer/lib/js/jtree/themes/default/d.png create mode 100644 module/viewer/lib/js/jtree/themes/default/style.css create mode 100644 module/viewer/lib/js/jtree/themes/default/throbber.gif create mode 100644 module/viewer/lib/js/ligeo.js create mode 100644 module/viewer/lib/js/ligeoabout.js create mode 100644 module/viewer/lib/js/ligeobaselayers.js create mode 100644 module/viewer/lib/js/ligeobiotopy.js create mode 100644 module/viewer/lib/js/ligeoeditor.js create mode 100644 module/viewer/lib/js/ligeoinfo.js create mode 100644 module/viewer/lib/js/ligeolayers.js create mode 100644 module/viewer/lib/js/ligeolegend.js create mode 100644 module/viewer/lib/js/ligeologin.js create mode 100644 module/viewer/lib/js/ligeomeasurement.js create mode 100644 module/viewer/lib/js/ligeoprint.js create mode 100644 module/viewer/lib/js/main.js create mode 100644 module/viewer/lib/js/openlayers/OpenLayers.js create mode 100644 module/viewer/lib/js/openlayers/doc_config/Data/ClassHierarchy.nd create mode 100644 module/viewer/lib/js/openlayers/doc_config/Data/ConfigFileInfo.nd create mode 100644 module/viewer/lib/js/openlayers/doc_config/Data/FileInfo.nd create mode 100644 module/viewer/lib/js/openlayers/doc_config/Data/ImageFileInfo.nd create mode 100644 module/viewer/lib/js/openlayers/doc_config/Data/ImageReferenceTable.nd create mode 100644 module/viewer/lib/js/openlayers/doc_config/Data/IndexInfo.nd create mode 100644 module/viewer/lib/js/openlayers/doc_config/Data/PreviousMenuState.nd create mode 100644 module/viewer/lib/js/openlayers/doc_config/Data/PreviousSettings.nd create mode 100644 module/viewer/lib/js/openlayers/doc_config/Data/SymbolTable.nd create mode 100644 module/viewer/lib/js/openlayers/doc_config/Languages.txt create mode 100644 module/viewer/lib/js/openlayers/doc_config/Menu.txt create mode 100644 module/viewer/lib/js/openlayers/doc_config/OL.css create mode 100644 module/viewer/lib/js/openlayers/doc_config/Topics.txt create mode 100644 module/viewer/lib/js/openlayers/img/add_point_off.png create mode 100644 module/viewer/lib/js/openlayers/img/add_point_on.png create mode 100644 module/viewer/lib/js/openlayers/img/blank.gif create mode 100644 module/viewer/lib/js/openlayers/img/cancel.png create mode 100644 module/viewer/lib/js/openlayers/img/close.gif create mode 100644 module/viewer/lib/js/openlayers/img/cloud-popup-relative.png create mode 100644 module/viewer/lib/js/openlayers/img/drag-rectangle-off.png create mode 100644 module/viewer/lib/js/openlayers/img/drag-rectangle-on.png create mode 100644 module/viewer/lib/js/openlayers/img/draw_line_off.png create mode 100644 module/viewer/lib/js/openlayers/img/draw_line_on.png create mode 100644 module/viewer/lib/js/openlayers/img/draw_point_off.png create mode 100644 module/viewer/lib/js/openlayers/img/draw_point_on.png create mode 100644 module/viewer/lib/js/openlayers/img/draw_polygon_off.png create mode 100644 module/viewer/lib/js/openlayers/img/draw_polygon_on.png create mode 100644 module/viewer/lib/js/openlayers/img/east-mini.png create mode 100644 module/viewer/lib/js/openlayers/img/editing_tool_bar.png create mode 100644 module/viewer/lib/js/openlayers/img/layer-switcher-maximize.png create mode 100644 module/viewer/lib/js/openlayers/img/layer-switcher-minimize.png create mode 100644 module/viewer/lib/js/openlayers/img/marker-blue.png create mode 100644 module/viewer/lib/js/openlayers/img/marker-gold.png create mode 100644 module/viewer/lib/js/openlayers/img/marker-green.png create mode 100644 module/viewer/lib/js/openlayers/img/marker.png create mode 100644 module/viewer/lib/js/openlayers/img/measuring-stick-off.png create mode 100644 module/viewer/lib/js/openlayers/img/measuring-stick-on.png create mode 100644 module/viewer/lib/js/openlayers/img/move_feature_off.png create mode 100644 module/viewer/lib/js/openlayers/img/move_feature_on.png create mode 100644 module/viewer/lib/js/openlayers/img/navigation_history.png create mode 100644 module/viewer/lib/js/openlayers/img/north-mini.png create mode 100644 module/viewer/lib/js/openlayers/img/options.png create mode 100644 module/viewer/lib/js/openlayers/img/overview_replacement.gif create mode 100644 module/viewer/lib/js/openlayers/img/pan-panel-NOALPHA.png create mode 100644 module/viewer/lib/js/openlayers/img/pan-panel.png create mode 100644 module/viewer/lib/js/openlayers/img/pan_off.png create mode 100644 module/viewer/lib/js/openlayers/img/pan_on.png create mode 100644 module/viewer/lib/js/openlayers/img/panning-hand-off.png create mode 100644 module/viewer/lib/js/openlayers/img/panning-hand-on.png create mode 100644 module/viewer/lib/js/openlayers/img/remove_point_off.png create mode 100644 module/viewer/lib/js/openlayers/img/remove_point_on.png create mode 100644 module/viewer/lib/js/openlayers/img/ruler.png create mode 100644 module/viewer/lib/js/openlayers/img/save_features_off.png create mode 100644 module/viewer/lib/js/openlayers/img/save_features_on.png create mode 100644 module/viewer/lib/js/openlayers/img/slider.png create mode 100644 module/viewer/lib/js/openlayers/img/south-mini.png create mode 100644 module/viewer/lib/js/openlayers/img/view_next_off.png create mode 100644 module/viewer/lib/js/openlayers/img/view_next_on.png create mode 100644 module/viewer/lib/js/openlayers/img/view_previous_off.png create mode 100644 module/viewer/lib/js/openlayers/img/view_previous_on.png create mode 100644 module/viewer/lib/js/openlayers/img/west-mini.png create mode 100644 module/viewer/lib/js/openlayers/img/zoom-minus-mini.png create mode 100644 module/viewer/lib/js/openlayers/img/zoom-panel-NOALPHA.png create mode 100644 module/viewer/lib/js/openlayers/img/zoom-panel.png create mode 100644 module/viewer/lib/js/openlayers/img/zoom-plus-mini.png create mode 100644 module/viewer/lib/js/openlayers/img/zoom-world-mini.png create mode 100644 module/viewer/lib/js/openlayers/img/zoombar.png create mode 100644 module/viewer/lib/js/openlayers/lib/Firebug/errorIcon.png create mode 100644 module/viewer/lib/js/openlayers/lib/Firebug/firebug.css create mode 100644 module/viewer/lib/js/openlayers/lib/Firebug/firebug.html create mode 100644 module/viewer/lib/js/openlayers/lib/Firebug/firebug.js create mode 100644 module/viewer/lib/js/openlayers/lib/Firebug/firebugx.js create mode 100644 module/viewer/lib/js/openlayers/lib/Firebug/infoIcon.png create mode 100644 module/viewer/lib/js/openlayers/lib/Firebug/license.txt create mode 100644 module/viewer/lib/js/openlayers/lib/Firebug/readme.txt create mode 100644 module/viewer/lib/js/openlayers/lib/Firebug/warningIcon.png create mode 100644 module/viewer/lib/js/openlayers/lib/Gears/gears_init.js create mode 100644 module/viewer/lib/js/openlayers/lib/OpenLayers/BaseTypes/Bounds.js create mode 100644 module/viewer/lib/js/openlayers/lib/OpenLayers/BaseTypes/Class.js create mode 100644 module/viewer/lib/js/openlayers/lib/OpenLayers/BaseTypes/Element.js create mode 100644 module/viewer/lib/js/openlayers/lib/OpenLayers/BaseTypes/LonLat.js create mode 100644 module/viewer/lib/js/openlayers/lib/OpenLayers/BaseTypes/Pixel.js create mode 100644 module/viewer/lib/js/openlayers/lib/OpenLayers/BaseTypes/Size.js create mode 100644 module/viewer/lib/js/openlayers/lib/OpenLayers/Control/ArgParser.js create mode 100644 module/viewer/lib/js/openlayers/lib/OpenLayers/Control/Attribution.js create mode 100644 module/viewer/lib/js/openlayers/lib/OpenLayers/Control/Button.js create mode 100644 module/viewer/lib/js/openlayers/lib/OpenLayers/Control/DragFeature.js create mode 100644 module/viewer/lib/js/openlayers/readme.txt create mode 100644 module/viewer/lib/js/openlayers/theme/default/img/add_point_off.png create mode 100644 module/viewer/lib/js/openlayers/theme/default/img/add_point_on.png create mode 100644 module/viewer/lib/js/openlayers/theme/default/img/blank.gif create mode 100644 module/viewer/lib/js/openlayers/theme/default/img/close.gif create mode 100644 module/viewer/lib/js/openlayers/theme/default/img/cloud-popup-relative.png create mode 100644 module/viewer/lib/js/openlayers/theme/default/img/drag-rectangle-off.png create mode 100644 module/viewer/lib/js/openlayers/theme/default/img/drag-rectangle-on.png create mode 100644 module/viewer/lib/js/openlayers/theme/default/img/draw_line_off.png create mode 100644 module/viewer/lib/js/openlayers/theme/default/img/draw_line_on.png create mode 100644 module/viewer/lib/js/openlayers/theme/default/img/draw_point_off.png create mode 100644 module/viewer/lib/js/openlayers/theme/default/img/draw_point_on.png create mode 100644 module/viewer/lib/js/openlayers/theme/default/img/draw_polygon_off.png create mode 100644 module/viewer/lib/js/openlayers/theme/default/img/draw_polygon_on.png create mode 100644 module/viewer/lib/js/openlayers/theme/default/img/editing_tool_bar.png create mode 100644 module/viewer/lib/js/openlayers/theme/default/img/move_feature_off.png create mode 100644 module/viewer/lib/js/openlayers/theme/default/img/move_feature_on.png create mode 100644 module/viewer/lib/js/openlayers/theme/default/img/navigation_history.png create mode 100644 module/viewer/lib/js/openlayers/theme/default/img/overview_replacement.gif create mode 100644 module/viewer/lib/js/openlayers/theme/default/img/pan-panel-NOALPHA.png create mode 100644 module/viewer/lib/js/openlayers/theme/default/img/pan-panel.png create mode 100644 module/viewer/lib/js/openlayers/theme/default/img/pan_off.png create mode 100644 module/viewer/lib/js/openlayers/theme/default/img/pan_on.png create mode 100644 module/viewer/lib/js/openlayers/theme/default/img/panning-hand-off.png create mode 100644 module/viewer/lib/js/openlayers/theme/default/img/panning-hand-on.png create mode 100644 module/viewer/lib/js/openlayers/theme/default/img/remove_point_off.png create mode 100644 module/viewer/lib/js/openlayers/theme/default/img/remove_point_on.png create mode 100644 module/viewer/lib/js/openlayers/theme/default/img/ruler.png create mode 100644 module/viewer/lib/js/openlayers/theme/default/img/save_features_off.png create mode 100644 module/viewer/lib/js/openlayers/theme/default/img/save_features_on.png create mode 100644 module/viewer/lib/js/openlayers/theme/default/img/view_next_off.png create mode 100644 module/viewer/lib/js/openlayers/theme/default/img/view_next_on.png create mode 100644 module/viewer/lib/js/openlayers/theme/default/img/view_previous_off.png create mode 100644 module/viewer/lib/js/openlayers/theme/default/img/view_previous_on.png create mode 100644 module/viewer/lib/js/openlayers/theme/default/img/zoom-panel-NOALPHA.png create mode 100644 module/viewer/lib/js/openlayers/theme/default/img/zoom-panel.png create mode 100644 module/viewer/lib/js/openlayers/theme/default/style.css create mode 100644 module/viewer/lib/js/openlayers/wms.cfg create mode 100644 module/viewer/lib/js/prettyPhoto/jquery-1.3.2.min.js create mode 100644 module/viewer/lib/js/prettyPhoto/jquery-1.4.4.min.js create mode 100644 module/viewer/lib/js/prettyPhoto/jquery-1.6.1.min.js create mode 100644 module/viewer/lib/js/prettyPhoto/jquery.prettyPhoto.js create mode 100644 module/viewer/lib/js/proj4js-compressed.js create mode 100644 module/viewer/lib/js/projCode/aea.js create mode 100644 module/viewer/lib/js/projCode/aeqd.js create mode 100644 module/viewer/lib/js/projCode/cass.js create mode 100644 module/viewer/lib/js/projCode/cea.js create mode 100644 module/viewer/lib/js/projCode/eqc.js create mode 100644 module/viewer/lib/js/projCode/eqdc.js create mode 100644 module/viewer/lib/js/projCode/equi.js create mode 100644 module/viewer/lib/js/projCode/gauss.js create mode 100644 module/viewer/lib/js/projCode/gnom.js create mode 100644 module/viewer/lib/js/projCode/gstmerc.js create mode 100644 module/viewer/lib/js/projCode/laea.js create mode 100644 module/viewer/lib/js/projCode/lcc.js create mode 100644 module/viewer/lib/js/projCode/merc.js create mode 100644 module/viewer/lib/js/projCode/mill.js create mode 100644 module/viewer/lib/js/projCode/moll.js create mode 100644 module/viewer/lib/js/projCode/nzmg.js create mode 100644 module/viewer/lib/js/projCode/omerc.js create mode 100644 module/viewer/lib/js/projCode/ortho.js create mode 100644 module/viewer/lib/js/projCode/poly.js create mode 100644 module/viewer/lib/js/projCode/sinu.js create mode 100644 module/viewer/lib/js/projCode/somerc.js create mode 100644 module/viewer/lib/js/projCode/stere.js create mode 100644 module/viewer/lib/js/projCode/sterea.js create mode 100644 module/viewer/lib/js/projCode/tmerc.js create mode 100644 module/viewer/lib/js/projCode/utm.js create mode 100644 module/viewer/lib/js/projCode/vandg.js create mode 100644 module/viewer/lib/php/empty create mode 100644 module/viewer/proxy.php create mode 100644 module/viewer/proxyAPI.php create mode 100644 module/viewer/proxyGFI.php create mode 100644 module/viewer/proxyWFS.php create mode 100644 module/viewer/settings.php create mode 100644 module/viewer/settings/module.php create mode 100644 page/README.md create mode 100644 page/layerStyle_edit.php create mode 100644 page/layerStyles_edit/index.php create mode 100644 page/layers_edit/index.php create mode 100644 page/layers_public/index.php create mode 100644 page/pg_biotopy/GFI.php create mode 100644 page/pg_biotopy/ek_hodnota.php create mode 100644 page/pg_biotopy/hosp.php create mode 100644 page/pg_biotopy/hosp_info.html create mode 100644 page/pg_biotopy/spol.php create mode 100644 page/pg_edit/index.php create mode 100644 page/plan_edit/index.php create mode 100644 page/plan_edit/plan_edit_centerMap/map.php create mode 100644 page/user_account/index.php create mode 100644 page/users_edit/index.php create mode 100644 proxy.php create mode 100644 proxyPrint.php create mode 100644 settings/module.php create mode 100644 style/main.css diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..00495dc --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +/nbproject \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..fd0d6e7 --- /dev/null +++ b/README.md @@ -0,0 +1,16 @@ +# Mapito + +Mapito is opensource project for editing and sharing spatial data. It is map manager, which create new map portal with any WMS layers in a few seconds. +Mapito is made available under a BSD-license. + + +## Getting Mapito + +Mapito is available at https://github.com/jkdubr/Mapito. + +## Requirments + +PHP, MySQL, PostGIS, Geoserver + +## Installing Mapito + diff --git a/action/layerFolder_add.php b/action/layerFolder_add.php new file mode 100644 index 0000000..654d9f8 --- /dev/null +++ b/action/layerFolder_add.php @@ -0,0 +1,10 @@ +addLayerFolder($_POST); + +header("Location: ".$_SERVER["HTTP_REFERER"]); +?> \ No newline at end of file diff --git a/action/layerFolder_remove.php b/action/layerFolder_remove.php new file mode 100644 index 0000000..b87ad67 --- /dev/null +++ b/action/layerFolder_remove.php @@ -0,0 +1,10 @@ +removeLayerFolder($_GET["layerFolderId"]); + +header("Location: ".$_SERVER["HTTP_REFERER"]); +?> \ No newline at end of file diff --git a/action/layerFolder_update.php b/action/layerFolder_update.php new file mode 100644 index 0000000..d7264ba --- /dev/null +++ b/action/layerFolder_update.php @@ -0,0 +1,9 @@ +updateLayerFolder($_POST); + +header("Location: ".$_SERVER["HTTP_REFERER"]); +?> \ No newline at end of file diff --git a/action/layerPublic_add.php b/action/layerPublic_add.php new file mode 100644 index 0000000..e7f71f8 --- /dev/null +++ b/action/layerPublic_add.php @@ -0,0 +1,10 @@ +addLayerPublicToPlan($_POST['layerId'], $_POST['planId']); + +header("Location: " . $_SERVER["HTTP_REFERER"]); +?> \ No newline at end of file diff --git a/action/layerStyle_add.php b/action/layerStyle_add.php new file mode 100644 index 0000000..11a65a3 --- /dev/null +++ b/action/layerStyle_add.php @@ -0,0 +1,11 @@ +addStyle($_REQUEST); + +header("Location: " . $_SERVER["HTTP_REFERER"]); +?> \ No newline at end of file diff --git a/action/layerStyle_remove.php b/action/layerStyle_remove.php new file mode 100644 index 0000000..e1b9ac1 --- /dev/null +++ b/action/layerStyle_remove.php @@ -0,0 +1,12 @@ +removeStyle($_REQUEST['layerStyleId']); + +header("Location: " . $_SERVER["HTTP_REFERER"]); +?> \ No newline at end of file diff --git a/action/layerStyle_update.php b/action/layerStyle_update.php new file mode 100644 index 0000000..e15c8e7 --- /dev/null +++ b/action/layerStyle_update.php @@ -0,0 +1,12 @@ +updateStyle($_REQUEST); + +header("Location: " . $_SERVER["HTTP_REFERER"]); +?> \ No newline at end of file diff --git a/action/layer_add.php b/action/layer_add.php new file mode 100644 index 0000000..4a1b5ca --- /dev/null +++ b/action/layer_add.php @@ -0,0 +1,9 @@ +addLayer($_POST); +header("Location: ".$_SERVER["HTTP_REFERER"]); +?> \ No newline at end of file diff --git a/action/layer_remove.php b/action/layer_remove.php new file mode 100644 index 0000000..145cf48 --- /dev/null +++ b/action/layer_remove.php @@ -0,0 +1,11 @@ +removeLayer($_GET["layerId"]); + +header("Location: ".$_SERVER["HTTP_REFERER"]); +?> \ No newline at end of file diff --git a/action/layer_update.php b/action/layer_update.php new file mode 100644 index 0000000..a1c0c0d --- /dev/null +++ b/action/layer_update.php @@ -0,0 +1,11 @@ +updateLayer($_POST); + +header("Location: ".$_SERVER["HTTP_REFERER"]); +?> \ No newline at end of file diff --git a/action/layer_updateLayersFromPostgis.php b/action/layer_updateLayersFromPostgis.php new file mode 100644 index 0000000..21b649d --- /dev/null +++ b/action/layer_updateLayersFromPostgis.php @@ -0,0 +1,11 @@ +updateLayersFromPostgis($_GET['planId']); + +header("Location: " . $_SERVER["HTTP_REFERER"]); +?> \ No newline at end of file diff --git a/action/login.php b/action/login.php new file mode 100644 index 0000000..710f613 --- /dev/null +++ b/action/login.php @@ -0,0 +1,10 @@ +login($_POST["mail"], $_POST["password"]); + + +header("Location: ".$_SERVER["HTTP_REFERER"]); + +?> diff --git a/action/logout.php b/action/logout.php new file mode 100644 index 0000000..ecf6e8c --- /dev/null +++ b/action/logout.php @@ -0,0 +1,8 @@ +logout(); +header("Location: ../index.php"); + +?> diff --git a/action/pgCol_add.php b/action/pgCol_add.php new file mode 100644 index 0000000..9356cdf --- /dev/null +++ b/action/pgCol_add.php @@ -0,0 +1,12 @@ +addCol($_POST["planId"], $_POST["layerId"], $_POST["colName"], $_POST["colType"]); + + + +header("Location: " . $_SERVER["HTTP_REFERER"]); +?> \ No newline at end of file diff --git a/action/pgCol_remove.php b/action/pgCol_remove.php new file mode 100644 index 0000000..afc88be --- /dev/null +++ b/action/pgCol_remove.php @@ -0,0 +1,12 @@ +removeCol($_POST["planId"], $_POST["layerId"], $_POST["colName"]); + +header("Location: " . $_SERVER["HTTP_REFERER"]); +?> \ No newline at end of file diff --git a/action/pgItem_insert_bio.php b/action/pgItem_insert_bio.php new file mode 100644 index 0000000..3221b8f --- /dev/null +++ b/action/pgItem_insert_bio.php @@ -0,0 +1,34 @@ +getPrivilegeForPlan($plan->planId) > 1) { + $dbname = 'ligeo_' . $plan->name; + + $pgsql_conn = pg_connect("host=" . $GLOBALS["LGSettings"]->postgis_host . " dbname=" . $dbname . " user=" . $GLOBALS["LGSettings"]->postgis_user . " password=" . $GLOBALS["LGSettings"]->postgis_pass . ""); + if (!$pgsql_conn) { + die("Error in connection: " . pg_last_error()); + } + + + + + + $sql = 'INSERT INTO ' . $_GET["dbtab"] . ' ("group",name,editable_svd,editable_title,hyp_max)' . ' VALUES (\'' . $_GET["group"] . '\', \'ostatni\',1,1,(SELECT hyp_max FROM '. $_GET["dbtab"] . ' WHERE "group" = \'' . $_GET["group"] .'\' GROUP BY hyp_max))'. ' ;'; + + $results = pg_query($pgsql_conn, $sql); + +//vypocitej update + + + pg_close($pgsql_conn); +} + +header("Location: " . $_SERVER["HTTP_REFERER"]); +?> \ No newline at end of file diff --git a/action/pgItem_remove.php b/action/pgItem_remove.php new file mode 100644 index 0000000..ebc7d93 --- /dev/null +++ b/action/pgItem_remove.php @@ -0,0 +1,25 @@ +getPrivilegeForPlan($plan->planId) > 1) { + $dbname = 'ligeo_' . $plan->name; + + $pgsql_conn = pg_connect("host=" . $GLOBALS["LGSettings"]->postgis_host . " dbname=" . $dbname . " user=" . $GLOBALS["LGSettings"]->postgis_user . " password=" . $GLOBALS["LGSettings"]->postgis_pass . ""); + if (!$pgsql_conn) { + die("Error in connection: " . pg_last_error()); + } + + $sql = 'delete from ' . secure($_GET["dbtab"]) . ' where gid = ' . (int) $_GET["gid"] . ' ;'; + + $results = pg_query($pgsql_conn, $sql); + + + pg_close($pgsql_conn); +} + +header("Location: " . $_SERVER["HTTP_REFERER"]); +?> \ No newline at end of file diff --git a/action/pgItem_update.php b/action/pgItem_update.php new file mode 100644 index 0000000..dce0427 --- /dev/null +++ b/action/pgItem_update.php @@ -0,0 +1,53 @@ +getPrivilegeForPlan($plan->planId) > 1) { + $dbname = 'ligeo_' . $plan->name; + + + $pgsql_conn = pg_connect("host=" . $GLOBALS["LGSettings"]->postgis_host . " dbname=" . $dbname . " user=" . $GLOBALS["LGSettings"]->postgis_user . " password=" . $GLOBALS["LGSettings"]->postgis_pass . ""); + if (!$pgsql_conn) { + die("Error in connection: " . pg_last_error()); + } + + + + $v = mydb_query('select * from layerWPS where layerId =' . $plan->planId . ' '); + $z = $v->fetch_array(); + + $wps = json_encode($z['content']); + + + $results = pg_query($pgsql_conn, 'SELECT * FROM ' . secure($_POST["dbtab"]) . ' LIMIT 1 ;'); + $sqlArray = array(); + for ($gt = 0; $gt < pg_num_fields($results); $gt++) { + if (pg_field_type($results, $gt) == "geometry") { + + } elseif ($_FILES[pg_field_name($results, $gt)]["tmp_name"]) { + @mkdir('../../data/plan/' . $plan->planId . '/'); + $filePath = 'data/plan/' . $plan->planId . '/' . time() . '.' . $_FILES[pg_field_name($results, $gt)]["name"]; + file_put_contents('../../' . $filePath, file_get_contents($_FILES[pg_field_name($results, $gt)]["tmp_name"])); + + $sqlArray[] = '"' . pg_field_name($results, $gt) . '"=\'' . $GLOBALS["LGSettings"]->map_url . $filePath . '\''; + } else { + $sqlArray[] = '"' . pg_field_name($results, $gt) . '"=\'' . secure($_POST[pg_field_name($results, $gt)]) . '\''; + } + } + $sql = 'UPDATE ' . secure($_POST["dbtab"]) . ' SET ' . implode(",", $sqlArray) . ' WHERE gid=' . (int) $_POST["gid"] . ' ;'; + //echo $sql; + $results = pg_query($pgsql_conn, $sql); + + + //vypocitej update + + + pg_close($pgsql_conn); +} + +header("Location: " . $_SERVER["HTTP_REFERER"]); +?> \ No newline at end of file diff --git a/action/pgItem_update_bio.php b/action/pgItem_update_bio.php new file mode 100644 index 0000000..0c95d78 --- /dev/null +++ b/action/pgItem_update_bio.php @@ -0,0 +1,55 @@ +getPrivilegeForPlan($plan->planId) > 1) { + $dbname = 'ligeo_' . $plan->name; + + + $pgsql_conn = pg_connect("host=" . $GLOBALS["LGSettings"]->postgis_host . " dbname=" . $dbname . " user=" . $GLOBALS["LGSettings"]->postgis_user . " password=" . $GLOBALS["LGSettings"]->postgis_pass . ""); + if (!$pgsql_conn) { + die("Error in connection: " . pg_last_error()); + } + + + + $v = mydb_query('select * from layerWPS where layerId =' . $plan->planId . ' '); + $z = $v->fetch_array(); + + $wps = json_encode($z['content']); + + + $results = pg_query($pgsql_conn, 'SELECT * FROM ' . secure($_POST["dbtab"]) . ' LIMIT 1 ;'); + $sqlArray = array(); + for ($gt = 0; $gt < pg_num_fields($results); $gt++) { + if (pg_field_type($results, $gt) == "geometry") { + + } elseif ($_FILES[pg_field_name($results, $gt)]["tmp_name"]) { + @mkdir('../../data/plan/' . $plan->planId . '/'); + $filePath = 'data/plan/' . $plan->planId . '/' . time() . '.' . $_FILES[pg_field_name($results, $gt)]["name"]; + file_put_contents('../../' . $filePath, file_get_contents($_FILES[pg_field_name($results, $gt)]["tmp_name"])); + + $sqlArray[] = '"' . pg_field_name($results, $gt) . '"=\'' . $GLOBALS["LGSettings"]->map_url . $filePath . '\''; + } elseif (secure($_POST[pg_field_name($results, $gt)]) == "") { + + } else { + $sqlArray[] = '"' . pg_field_name($results, $gt) . '"=\'' . secure($_POST[pg_field_name($results, $gt)]) . '\''; + } + } + $sql = 'UPDATE ' . secure($_POST["dbtab"]) . ' SET ' . implode(",", $sqlArray) . ' WHERE gid=' . (int) $_POST["gid"] . ' ;'; +//echo $sql; + $results = pg_query($pgsql_conn, $sql); + + +//vypocitej update + + + pg_close($pgsql_conn); +} + +header("Location: " . $_SERVER["HTTP_REFERER"]); +?> \ No newline at end of file diff --git a/action/plan_add.php b/action/plan_add.php new file mode 100644 index 0000000..eaa638e --- /dev/null +++ b/action/plan_add.php @@ -0,0 +1,11 @@ +addPlan($_POST); + + +header("Location: ".$_SERVER["HTTP_REFERER"]); +?> \ No newline at end of file diff --git a/action/plan_remove.php b/action/plan_remove.php new file mode 100644 index 0000000..36f39ee --- /dev/null +++ b/action/plan_remove.php @@ -0,0 +1,10 @@ +removePlan($_GET["planId"]); + +header("Location: ".$_SERVER["HTTP_REFERER"]); +?> \ No newline at end of file diff --git a/action/plan_update.php b/action/plan_update.php new file mode 100644 index 0000000..5aaae09 --- /dev/null +++ b/action/plan_update.php @@ -0,0 +1,10 @@ +updatePlan($_POST); + +header("Location: ".$_SERVER["HTTP_REFERER"]); +?> \ No newline at end of file diff --git a/action/user_add.php b/action/user_add.php new file mode 100644 index 0000000..cd4554b --- /dev/null +++ b/action/user_add.php @@ -0,0 +1,10 @@ +addUser($_POST); + +header("Location: ".$_SERVER["HTTP_REFERER"]); +?> \ No newline at end of file diff --git a/action/user_remove.php b/action/user_remove.php new file mode 100644 index 0000000..127ec39 --- /dev/null +++ b/action/user_remove.php @@ -0,0 +1,10 @@ +removeUser($_GET["userId"]); + +header("Location: ".$_SERVER["HTTP_REFERER"]); +?> \ No newline at end of file diff --git a/action/user_update.php b/action/user_update.php new file mode 100644 index 0000000..3098c75 --- /dev/null +++ b/action/user_update.php @@ -0,0 +1,11 @@ +updateUser($_POST); + +header("Location: ".$_SERVER["HTTP_REFERER"]); +?> \ No newline at end of file diff --git a/api/README.md b/api/README.md new file mode 100644 index 0000000..abbb688 --- /dev/null +++ b/api/README.md @@ -0,0 +1,122 @@ + + + + LiGeo | API + + + + +

API description

+ +

API URL: http://ligeo.mostar.cz/admin/api?json=[JSON format]

+

+ JSON format: + {"request":"[function]","userHash":[user hash],"param":{[params and values]}} +

+

function: function name

+

user hash: user's session id

+

params and values: list "param name":"value","param name2":"value2",

+
+ example: http://ligeo.mostar.cz/admin/api/?json={%22request%22:%22layersForJSTree%22,%22userHash%22:%22d3d6bf4f91c68668b36df1ab45297b19%22,%22param%22:{%22planId%22:9}} +
+

Output is mostly in JSON format

+

Functions

+ +

layer.forJSTree

+ params: planId +

+ Return JSON info about plan. JSON is optimalized for JS library JSTree. +

+ +

layer.list

+ param: planId +

+ Return JSON info about plan. +

+ +

layer.basic

+ param: layerIds +

+ Return basic information about layer. +

+ +

form.detail

+ param: formId +

+ Return information about form. +

+ +

form.list

+ params: none +

+ Return list of user's form with basic description. +

+ +

form.byPlan.list

+ param: planId +

+ Return list of the layers for plan +

+ +

form.collectPOST

+ param: formId +

+ Save date from the form to the PostGIS database. +

+ +

form.upload

+ param: formId +

+ Upload file into form's layer folder. Return URL of the uploaded file. +

+ +

user.login

+ params: mail,password +

+ Sign in user. Return [user hash]. +

+ + +

user.logout

+ params: none +

+ Log out user. +

+ +

user.hash

+ params: none + + +

style.sld

+ param: layerId +

+ Return SLD style for the layer. +

+ +

plan.list

+ params: none +

+ Return list of user's plan with basic description. +

+ +

plan.public.list

+ params: none +

+ Return list of all public plans with basic description. +

+ +

plan.public.kml

+ params: none +

+ Return list of all public plans with basic description in KML. +

+ +

plan.detail

+ param->name +

+ Return detail information about plan. +

+ + + + diff --git a/api/index.php b/api/index.php new file mode 100644 index 0000000..8806caa --- /dev/null +++ b/api/index.php @@ -0,0 +1,14 @@ +requestJSON($_REQUEST["json"]); + +echo($api->result()); + +//print_r($_SESSION); + +?> \ No newline at end of file diff --git a/api/sld.php b/api/sld.php new file mode 100644 index 0000000..77677f1 --- /dev/null +++ b/api/sld.php @@ -0,0 +1,13 @@ +styleSld($_REQUEST["layerId"])); + +?> \ No newline at end of file diff --git a/cron/layer_importGeoserver.php b/cron/layer_importGeoserver.php new file mode 100644 index 0000000..3e558ca --- /dev/null +++ b/cron/layer_importGeoserver.php @@ -0,0 +1,7 @@ + diff --git a/data/plan.template.html b/data/plan.template.html new file mode 100644 index 0000000..201f21c --- /dev/null +++ b/data/plan.template.html @@ -0,0 +1,241 @@ + + + + + Mapito + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + \ No newline at end of file diff --git a/favicon.ico b/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..c3340e644f2c3cae0bcf69dda1954c5219ae4134 GIT binary patch literal 13909 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 literal 0 HcmV?d00001 diff --git a/index.php b/index.php new file mode 100644 index 0000000..ab60d13 --- /dev/null +++ b/index.php @@ -0,0 +1,157 @@ + + + + + + Mapito | Admin + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + isUser()) { + ?> + + +
+ +
+

Mapito admin

+
+ +
+
+ isEnabled() && $user->isPrivilegeSuperAdmin()) { + echo("Setup page is enable. Due to security, you should disable public setup page in settings"); + } + ?> + +
+ +
+ +
+ + +
+
+ +
+ + +
+ + + \ No newline at end of file diff --git a/install/README.md b/install/README.md new file mode 100644 index 0000000..de0f5d9 --- /dev/null +++ b/install/README.md @@ -0,0 +1,39 @@ + + * + * + * dneska moc nepařím na iPadu a jak jsem produktivní :) Už jsem to vymyslel, ještě to dodělat. Vím že jsme se moc nestihli bavit o vrtulníku, ale měli bychom mít nejdřív uzavřenou jednu kapitolu, než se vrhneme na další. + + na netu jsem našel knížku o vývoje v GITu (https://github.s3.amazonaws.com/media/progit.en.pdf), už jsem si jí nahrál do kindla, + + + Vývoj Ligea + bude probihat rozdelen na moduly, vývoj se presune na github + ???nejak je nutno distribuovat mezi moduly skripty z /lib/php/ + + + Instalace Ligea + (*) Uživatel si stáhne z GITHUBU ligeo manager - na webu budeme mít návod, jak to rozbehnout na openshiftu - tzn uzivatel akorát zkopíruje příkazy do terminálu + při prvním zobrazení php stránky (index.php) se detekuje nenainstalovaný systém (není settings/main.php) + (*) zobrazí se form, po vyplnění bude vygenerován soubor settings.php + nainstaluje se MySQL + (*) uživatel si vybere, které chce nainstalovat moduly (nekde na netu je nutne mit seznam modulu - zatim staci mit napevno v ligeo) + z githubu se stahne ligeo-viewer do slozky /install/temp/ + rozbali se do slozky /module + stahnou se pripadne dalsi moduly + nainstaluji se moduly (zkopiruje se do nich nastaveni z ligeo) + + (*) interakce uživatele + + -dále stojí za přečtení toto https://openshift.redhat.com/community/blogs/how-to-create-an-openshift-github-quick-start-project + + */ +?> diff --git a/install/disable.php b/install/disable.php new file mode 100644 index 0000000..df28704 --- /dev/null +++ b/install/disable.php @@ -0,0 +1,8 @@ +disable(); +?> +Setup page is disabled. \ No newline at end of file diff --git a/install/enable.php b/install/enable.php new file mode 100644 index 0000000..d443129 --- /dev/null +++ b/install/enable.php @@ -0,0 +1,17 @@ +isPrivilegeSuperAdmin()) { + + $LGInstall = new LGInstall(); + $LGInstall->enable(); + ?> + Setup page is enabled, you can configure Mapito + diff --git a/install/enabled b/install/enabled new file mode 100644 index 0000000..56a6051 --- /dev/null +++ b/install/enabled @@ -0,0 +1 @@ +1 \ No newline at end of file diff --git a/install/ready.php b/install/ready.php new file mode 100644 index 0000000..6d2d4d8 --- /dev/null +++ b/install/ready.php @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + +
+
+

+ Congratulation +

+
+
+ +

Mapito server is ready to use.

+ + +

Your new login is your email, your password is your email.

+ +

Enjoy map example

+ +

Go to admin page

+
+
+ + + \ No newline at end of file diff --git a/install/settings.php b/install/settings.php new file mode 100644 index 0000000..38b5bd5 --- /dev/null +++ b/install/settings.php @@ -0,0 +1,175 @@ +isEnabled()) { + exit("Editing is disabled. You can enabled it in settings."); +} + +$settings_domain = str_replace('install/settings.php', '', 'http://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI']); + +// +$map_url = $settings_domain . 'module/viewer/'; +$admin_url = $settings_domain; +?> + + + + + + + + + + + + + + + + +
+
+

+ Mapito - first step +

+
+
+
+
+
+ + +
+
+
+
+
+ + +
+
+
+
+ + +
+
+
+
+ + +
+
+
+
+ + +
+
+
+
+
+ + +
+
+
+
+ + +
+
+
+
+ + +
+
+
+
+
+ + +
+
+
+
+ + +
+
+
+
+ + +
+
+
+
+
+ + +
+
+
+
+ + +
+
+ + + + + +
+ +
+
+ + \ No newline at end of file diff --git a/install/settings_update.php b/install/settings_update.php new file mode 100644 index 0000000..241b98e --- /dev/null +++ b/install/settings_update.php @@ -0,0 +1,19 @@ +isEnabled()){ + $LGInstall->createSettings($_POST); + $LGInstall->installMySQL(); + $LGInstall->installModules(); + $LGInstall->sendMailAfterInstall($_POST["mail"],$_POST["admin_url"]); + header('Location: ready.php'); + +}else{ + exit("Editing is disabled. You can enabled it in settings."); +} +?> \ No newline at end of file diff --git a/lib/php/GeoserverAPI.php b/lib/php/GeoserverAPI.php new file mode 100644 index 0000000..7d47dca --- /dev/null +++ b/lib/php/GeoserverAPI.php @@ -0,0 +1,141 @@ +rest = new LGRestClient($root_url, $user_name, $password); + } + + function createWorkspace($name) { + $temp->workspace->name = $name; + + $this->rest->createRequest('workspaces', 'POST', json_encode($temp), 'json', array("Accept:application/json")); + return $this->rest->sendRequest(); + } + + function removeWorkspace($name) { + $this->rest->createRequest('workspaces/' . $name, 'DELETE'); + return $this->rest->sendRequest(); + } + + function createDatastore($name, $workspaceName) { + + $tempCon->host = $GLOBALS["LGSettings"]->postgis_host; + $tempCon->port = 5432; + $tempCon->database = $name; + $tempCon->user = $GLOBALS["LGSettings"]->postgis_user; + $tempCon->passwd = $GLOBALS["LGSettings"]->postgis_pass; + $tempCon->dbtype = "postgis"; + + + $temp->dataStore->name = $name; + $temp->dataStore->connectionParameters = $tempCon; + + $this->rest->createRequest('workspaces/' . $workspaceName . '/datastores', 'POST', json_encode($temp), 'json', array("Accept:application/json")); + return $this->rest->sendRequest(); + } + + function removeDatastore($name, $workspaceName) { + + $this->rest->createRequest('workspaces/' . $workspaceName . '/datastores/' . $name, 'DELETE'); + return $this->rest->sendRequest(); + } + + function getDatastoresInWorkspace($workspaceName) { + $this->rest->createRequest('workspaces/' . $workspaceName . '/datastores', 'GET', '', '', array("Accept:application/json")); + return $this->rest->sendRequest(); + } + + function getDatastore($workspaceName, $datastoreName) { + $this->rest->createRequest('workspaces/' . $workspaceName . '/datastores/' . $datastoreName, 'GET', '', '', array("Accept:application/json")); + return $this->rest->sendRequest(); + } + + function getWorkspaces() { + $this->rest->createRequest('workspaces', 'GET', '', '', array("Accept:application/json")); + return $this->rest->sendRequest(); + } + + function getWorkspace($workspaceName) { + $this->rest->createRequest('workspaces/' . $workspaceName, 'GET', '', '', array("Accept:application/json")); + return $this->rest->sendRequest(); + } + + function getLayers($workspaceName, $datastoreName) { + $this->rest->createRequest('workspaces/' . $workspaceName . '/datastores/' . $datastoreName . '/featuretypes', 'GET', '', '', array("Accept:application/json")); + return json_decode($this->rest->sendRequest()); + } + + function createLayer($workspaceName, $datastoreName, $layerName, $layerTitle, $layerSrs="EPSG:4326") { + + $temp->featureType->name = $layerName; + $temp->featureType->nativeName = $layerName; + $temp->featureType->title = $layerTitle; + $temp->featureType->srs = $layerSrs; + + $this->rest->createRequest('workspaces/' . $workspaceName . '/datastores/' . $datastoreName . '/featuretypes', 'POST', json_encode($temp), 'json', array("Accept:application/json")); + return $this->rest->sendRequest(); + } + + function getLayer($workspaceName, $datastoreName, $layerName) { + $this->rest->createRequest('workspaces/' . $workspaceName . '/datastores/' . $datastoreName . '/featuretypes/' . $layerName, 'GET', '', '', array("Accept:application/json")); + return json_decode($this->rest->sendRequest()); + } + + function removeLayer($workspaceName, $datastoreName, $layerName) { + + $this->rest->createRequest('workspaces/' . $workspaceName . '/datastores/' . $datastoreName . '/featuretypes/' . $layerName, 'DELETE'); + return $this->rest->sendRequest(); + } + + function createCoverage($workspaceName, $coverageName) { + + $temp->coverageStore->name = $coverageName; + $temp->coverageStore->workspace = $workspaceName; + $temp->coverageStore->enabled = "true"; + + $this->rest->createRequest('workspaces/' . $workspaceName . '/coveragestores', 'POST', json_encode($temp), 'json', array("Accept:application/json")); + $this->rest->sendRequest(); + + $temp = "file:/home/ligeo_data/" . $coverageName . ".tif"; + + $this->rest->createRequest('workspaces/' . $workspaceName . '/coveragestores/' . $coverageName . '/external.geotiff', 'PUT', $temp, 'json', array("Accept:text/plain")); + $this->rest->sendRequest(); + } + + function removeCoverage($name, $workspaceName) { + + $this->rest->createRequest('workspaces/' . $workspaceName . '/coveragestores/' . $name . '?recurse=true', 'DELETE'); + return $this->rest->sendRequest(); + } + + function reloadServer() { + $this->rest->createRequest('reload',"POST"); + return $this->rest->sendRequest(); + } + +} + +?> \ No newline at end of file diff --git a/lib/php/GeoserverAPILigeo.php b/lib/php/GeoserverAPILigeo.php new file mode 100644 index 0000000..0e4bfcb --- /dev/null +++ b/lib/php/GeoserverAPILigeo.php @@ -0,0 +1,30 @@ +wmsUrl = $GLOBALS["LGSettings"]->geoserver_url."/wms?"; + $this->api = new GeoserverAPI($GLOBALS["LGSettings"]->geoserver_url . 'rest', $GLOBALS["LGSettings"]->geoserver_user, $GLOBALS["LGSettings"]->geoserver_pass); + } + +} +?> \ No newline at end of file diff --git a/lib/php/LGAPI.php b/lib/php/LGAPI.php new file mode 100644 index 0000000..e233ae6 --- /dev/null +++ b/lib/php/LGAPI.php @@ -0,0 +1,444 @@ +request = json_decode(str_replace('\"', '"', $json)); + + if ($this->request->userHash || $this->request->request == "user.login") { + $this->user = new LGUser(); + $this->user->hash($this->request->userHash); + } + } + + /** + * Vsechny vrstvy ve skolzkach daneho planu + * + * @param type $planId + * @return string + */ + function layerList($planId) { + + + + $temp = array(); + $layerManager = new LGLayerManager($this->user); + foreach ($layerManager->getLayerFoldersByPlan($planId) as $layerFolderId) { + $folder = ""; + $layerFolder = new LGLayerFolder($layerFolderId, $this->user->isUser()); + + $folder->data = $layerFolder->title; + $folder->state = "open"; + + foreach ($layerFolder->layers as $layerId) { + $layer = new LGLayer($layerId); + $item->url = $layer->url; + $item->attr->id = $layer->namespace . ":" . $layer->name; + $item->data = $layer->title; + $item->opacity = $layer->opacity; + $item->palete = $layer->palete; + $item->type = $layer->type; + $item->legendImage = $layer->legendImageUrl; + + $folder->children[] = $item; + } + + + + + $temp[] = $folder; + } + return $temp; + } + + function layerForJSTree($planId) { + $temp = array(); + $zIndexs = array(); + + $layerManager = new LGLayerManager($this->user); + foreach ($layerManager->getLayerFoldersByPlan($planId) as $layerFolderId) { + $folder = ""; + $layerFolder = new LGLayerFolder($layerFolderId, ($this->user ? $this->user->systemUser->privilegeForPlan($planId) : FALSE)); + + if (count($layerFolder->layers)) { + $folder->data = $layerFolder->title; + $folder->state = "open"; + + foreach ($layerFolder->layers as $layerId) { + unset($item); + + + $layer = new LGLayer($layerId); + + if ($layer->isActive) { + $layerStyle = new LGLayerStyle($layer->layerStyleId); + + $item->url = $layer->url; + $item->attr->id = ($layer->namespace ? ($layer->namespace . ":") : "") . $layer->name; + $item->attr->class = ($layer->visibility ? "jstree-checked" : "jstree-unchecked"); + $item->data = $layer->title; + $item->opacity = $layer->opacity / 10; + $item->format = $layer->format; + $item->palete = $layer->palete; + $item->type = $layer->type; + $item->legendImage = $layer->legendImageUrl; + $item->queryable = $layer->queryable; + $item->inLegend = $layer->isInLegend; + $item->printable = $layer->printable; + $item->transparent = (bool)$layer->transparent; + $item->visibility = $layer->visibility; + $item->isLockedForGeometry = $layer->isLockedForGeometry; + $item->layerId = $layer->layerId; + $item->layerStyleId = ($layerStyle->contentFormated ? $layerStyle->layerStyleId : 0); + + switch ($layer->type) { + case 'RASTR': + $zIndexBasic = 1; + break; + case 'MULTIPOLYGON': + $zIndexBasic = 100; + break; + case 'LINESTRING': + $zIndexBasic = 200; + break; + case 'POINT': + $zIndexBasic = 300; + break; + + default: + break; + } + $zIndex = $zIndexBasic + $layer->rank; + while (in_array($zIndex, $zIndexs)) { + $zIndex++; + } + $zIndexs[] = $zIndex; + $item->zIndex = $zIndex; + + $folder->children[] = $item; + } + } + $temp[] = $folder; + } + } + return $temp; + } + + /** + * + * @param type $planId + * @param type $layerName + * @param type $layerFolder + * @param type $layerType + */ + function layerAdd($planId, $layerName, $layerFolderId, $layerType) { + $temp["layerFolderId"] = $layerFolderId; + $temp["type"] = $layerType; + $temp["planId"] = $planId; + $temp["name"] = $layerName; + $temp["title"] = $layerName; + $temp["url"] = $GLOBALS["LGSettings"]->admin_url . "/module/proxy/api/proxyWMS.php?"; + $temp["isLockedGeometry"] = 0; + + $layerManager = new LGLayerManager($this->user); + $layerManager->createLayerOnDB($temp); + + + $geoserverApi = new GeoserverAPILigeo(); + $geoserverApi->api->reloadServer(); + } + + function formDetail($formId) { + $form = new LGForm($formId); + return $form->toDictionaryWithFormElements(); + } + + function formsByPlan($planId) { + $temp = array(); + + $formManager = new LGFormManager($this->user); + foreach ($formManager->getFormsByPlan($planId) as $formId) { + $form = new LGForm($formId); + $temp[] = $form->toDictionary(); + } + return $temp; + } + + function formList() { + $temp = array(); + + $formManager = new LGFormManager($this->user); + foreach ($formManager->getForms() as $formId) { + $form = new LGForm($formId); + $temp[] = $form->toDictionary(); + } + return $temp; + } + + function formCollectPOST($formId) { + $layerManager = new LGLayerManager($this->user); + $temp->save = $layerManager->collectDataFromForm($formId, $_POST); + return $temp->save; + } + + function formUpload($formId) { + $layerManager = new LGLayerManager($this->user); + return $layerManager->uploadFile($formId); + } + + function getCapabilities() { + /** + * ted potrebuji: + * 1/ plány, na které mám právo edit/view + * 2/ vrstvy daných plánů (dle přihlášení dám private/public vrstvy) + * 3/ formuláře dané vrstvy (dám jen pro právo edit) + * + * 4/ uložit data z form + * 5/ dát form data + * + * ?json={"request":"form","param":{"formId":8}} + * + * ?json={"request":"getCapabilities"} + * + * /?json={%22request%22:%22layersForJSTree%22,%22param%22:{%22planId%22:22}} + * + * + * */ + $temp->about = "About service..."; + + $req->name = "form"; + + $param->name = "formId"; + $param->type = "int"; + + $req->param[] = $param; + + $temp->request[] = $req; + + return $temp; + } + + function userLogin($mail, $password) { +// $this->user = new LGUser(); + $temp = array(); + $temp["userHash"] = $this->user->login($mail, $password); + if (!$temp["userHash"]) + $temp["err"] = "login"; + return $temp; + } + + function userHash() { + $temp = array(); + $temp["userHash"] = $this->user->userHash; + $temp["name"] = $this->user->systemUser->title; + + return $temp; + } + + function userLogout() { + $this->user->logout(); + } + + function planDetail($planName) { + $v = mydb_query('select planId from plan where name="' . secure($planName) . '";'); + $z = $v->fetch_array(); + $plan = new LGPlan($z['planId']); + + $temp->title = $plan->title; + $temp->planId = $plan->planId; + $temp->txt = $plan->txt; + $temp->mapCenterLat = $plan->mapCenterLat; + $temp->mapCenterLon = $plan->mapCenterLon; + $temp->mapZoom = $plan->mapZoom; + $temp->privilege = ($this->user ? $this->user->getPrivilegeForPlan($plan->planId) : 0); + + return $temp; + } + + function styleSld($layerId) { + + // file_put_contents("out.txt",gmdate("M d Y H:i:s", time()), FILE_APPEND); + + $v = mydb_query('select s.contentFormated as content,if(l.namespace!="",concat(l.namespace,":",l.name),l.name) as name from layer as l, layerStyle as s where l.layerStyleId=s.layerStyleId and l.layerId= ' . (int) $layerId . ';'); + if ($z = $v->fetch_array()) { + return htmlspecialchars_decode(sprintf($z['content'], $z['name']), ENT_QUOTES); + } + } + + function planList() { + $temp = array(); + $planManager = new LGPlanManager($user); + foreach ($planManager->getPlans() as $planId) { + $plan = new LGPlan($planId); + + $item->name = $plan->name; + $item->title = $plan->title; + $item->planId = $plan->planId; + $item->mapCenterLat = $plan->mapCenterLat; + $item->mapCenterLon = $plan->mapCenterLon; + $item->mapZoom = $plan->mapZoom; + + $temp[] = $item; + } + return $temp; + } + + function planPublicList() { + $temp = array(); + $planManager = new LGPlanManager($user); + foreach ($planManager->getPlansPublic() as $planId) { + $plan = new LGPlan($planId); + + $item->name = $plan->name; + $item->title = $plan->title; + $item->planId = $plan->planId; + $item->mapCenterLat = $plan->mapCenterLat; + $item->mapCenterLon = $plan->mapCenterLon; + $item->mapZoom = $plan->mapZoom; + + $temp[] = $item; + } + return $temp; + } + + function planPublicKML() { + $temp = array(); + $planManager = new LGPlanManager($user); + foreach ($planManager->getPlansPublic() as $planId) { + $plan = new LGPlan($planId); + + $item->name = $plan->name; + $item->title = $plan->title; + $item->planId = $plan->planId; + $item->mapCenterLat = $plan->mapCenterLat; + $item->mapCenterLon = $plan->mapCenterLon; + $item->mapZoom = $plan->mapZoom; + + $temp[] = $item; + } + return $temp; + } + + function layerBasic($layerIds) { + $temp = array(); + foreach ($layerIds as $layerId) { + + $layer = new LGLayer($layerId); + $item->id = ($layer->namespace ? ($layer->namespace . ":") : "") . $layer->name; + $item->opacity = $layer->opacity; + $item->url = $layer->url; + $item->layerId = $layerId; + + $temp[] = $item; + unset($item); + } + + return $temp; + } + + function result() { + $res = array(); + + switch ($this->request->request) { + case "layer.forJSTree": + $res = $this->layerForJSTree($this->request->param->planId); + break; + case "layer.list": + $res = $this->layerList($this->request->param->planId); + break; + case "layer.basic": + $res = $this->layerBasic($this->request->param->layerIds); + break; + case "layer.add": + $res = $this->layerAdd($this->request->param->planId, $this->request->param->layerName, $this->request->param->folderId, $this->request->param->layerType); + break; + + + case "form.detail": + $res = $this->formDetail($this->request->param->formId); + break; + case "form.list": + $res = $this->formList(); + break; + case "form.byPlan.list": + $res = $this->formsByPlan($this->request->param->planId); + break; + case "form.collectPOST": + $res = $this->formCollectPOST($this->request->param->formId); + break; + case "form.upload": + $res = $this->formUpload($this->request->param->formId); + break; + + + case "user.login": + $res = $this->userLogin($this->request->param->mail, $this->request->param->password); + break; + case "user.logout": + $res = $this->userLogout(); + break; + case "user.hash": + $res = $this->userHash(); + break; + + + case "style.sld": + $res = $this->styleSld($this->request->param->layerId); + break; + + + case "plan.list": + $res = $this->planList(); + break; + case "plan.public.list": + $res = $this->planPublicList(); + break; + case "plan.public.kml": + $res = $this->planPublicKML(); + break; + case "plan.detail": + $res = $this->planDetail($this->request->param->name); + break; + + + default: + $res = $this->getCapabilities(); + break; + } + $this->resultJSON($res); + + if (is_string($res)) { + return $res; + } else { + return $this->resultJSON($res); + } + } + + function resultJSON($res) { + + return str_replace('\/', '/', json_encode($res)); + } + +} + +?> \ No newline at end of file diff --git a/lib/php/LGConnect.php b/lib/php/LGConnect.php new file mode 100644 index 0000000..f9bdc04 --- /dev/null +++ b/lib/php/LGConnect.php @@ -0,0 +1,76 @@ +db_host, $GLOBALS["LGSettings"]->db_user, $GLOBALS["LGSettings"]->db_pass, $GLOBALS["LGSettings"]->db_name); + +if ($mysqli->connect_error) { + die('Connect Error (' . $mysqli->connect_errno . ') ' + . $mysqli->connect_error); +} +$GLOBALS["db_mysqli"]->query('SET NAMES "utf8" COLLATE "utf8_czech_ci"'); + +/** + * + * @param String $query + * @return mysqli_result + */ +function mydb_query($query) { + $er = 0; + $v = mysqli_query($GLOBALS['db_mysqli'], $query); + if (($er && mysqli_error($GLOBALS['db_mysqli']))) { + echo(mysqli_error($GLOBALS['db_mysqli']) . '
' . $query); + } + return $v; +} + +function mydb_insert_id() { + return mysqli_insert_id($GLOBALS['db_mysqli']); +} + +function mydb_insertValuesInTab($array, $tabName) { + mydb_query('insert into ' . $tabName . ' set ' . mydb_sqlValuesInTab($array, $tabName) . ';'); + return mydb_insert_id(); +} + +function mydb_updateValuesInTab($array, $tabName) { + mydb_query('update ' . $tabName . ' set ' . mydb_sqlValuesInTab($array, $tabName) . ' where `' . $tabName . 'Id`=' . (int) $array[$tabName . 'Id'] . ';'); + return mydb_insert_id(); +} + +function mydb_sqlValuesInTab($array, $tabName) { + $sqlArray = array(); + $v = mydb_query('SELECT data_type,column_name,COLUMN_KEY FROM information_schema.`COLUMNS` WHERE TABLE_SCHEMA="' . $GLOBALS['LGSettings']->db_name . '" and table_name="' . $tabName . '" and column_name in("' . implode('","', array_keys($array)) . '");'); + while ($z = $v->fetch_array()) { + $sqlArray[] = '`' . $z['column_name'] . '`="' . secure($array[$z['column_name']], $z['data_type']) . '"'; + } + return (count($sqlArray) ? implode(',', $sqlArray) : ''); +} + +function pg_tableInfo($TABLE, $DBCON) { + $s = "SELECT a.attname AS name, t.typname AS type, a.attlen AS size, a.atttypmod AS len, a.attstorage AS i + FROM pg_attribute a , pg_class c, pg_type t + WHERE c.relname = '$TABLE' + AND a.attrelid = c.oid AND a.atttypid = t.oid"; + + if ($r = pg_query($DBCON, $s)) { + $i = 0; + while ($q = pg_fetch_assoc($r)) { + if ($q["type"] != "tid" && $q["type"] != "xid" && $q["type"] != "oid" && $q["type"] != "cid") { + $name = $q["name"]; + $a[$name]["type"] = $q["type"]; + $a[$name]["name"] = $name; + if ($q["len"] < 0 && $q["i"] != "x") { + // in case of digits if needed ... (+1 for negative values) + $a[$name]["len"] = (strlen(pow(2, ($q["size"] * 8))) + 1); + } else { + $a[$name]["len"] = $q["len"]; + } + $a[$name]["size"] = $q["size"]; + $i++; + } + } + return $a; + } + return null; +} + +?> \ No newline at end of file diff --git a/lib/php/LGForm.php b/lib/php/LGForm.php new file mode 100644 index 0000000..1459730 --- /dev/null +++ b/lib/php/LGForm.php @@ -0,0 +1,89 @@ +fetch_array()) { + $this->formId = $z['formId']; + $this->layerId = $z['layerId']; + $this->title = $z['title']; + $this->txt = $z['txt']; + $this->autoupdate = $z['autoupdate']; + } + } + + function getFormItems() { + $temp = array(); + $v = mydb_query('select formItemId from formItem where formId=' . (int) $this->formId . ' ;'); + + while ($z = $v->fetch_array()) { + $temp[] = $z['formItemId']; + } + + return $temp; + } + + function addFormItem($array) { + mydb_query('INSERT INTO `formItem` set `title`="' . $array['title'] . '", `name`="' . $array['name'] . '", `placeholder`="' . $array['placeholder'] . '", `type`="' . $array['type'] . '", `default`="' . $array['default'] . '", `required`="' . (int) $array['required'] . '", `options`="' . $array['options'] . '", `formId`="' . (int) $array['formId'] . '", `formItemId`="' . (int) $array['formItemId'] . '";'); + } + + function updateFormItem($array) { + mydb_query('update `formItem` set `title`="' . $array['title'] . '", `name`="' . $array['name'] . '", `placeholder`="' . $array['placeholder'] . '", `type`="' . $array['type'] . '", `default`="' . $array['default'] . '", `required`="' . (int) $array['required'] . '", `options`="' . $array['options'] . '", `formId`="' . (int) $array['formId'] . '" where `formItemId`="' . (int) $array['formItemId'] . '";'); + } + + function removeFormItem($formItemId) { + mydb_query('delete from `formItem` where `formItemId`="' . (int) $formItemId . '";'); + } + + function toDictionaryWithFormElements() { + $temp = array(); + $v = mydb_query('select formItemId from formItem where formId=' . (int) $this->formId . ' ;'); + + while ($z = $v->fetch_array()) { + $formItem = new LGFormItem($z['formItemId']); + $temp[] = $formItem->toDictionary(); + } + + return $temp; + } + + /* + function collectData($jsonData, $userId) { + mydb_query('insert into formData set userId=' . (int) $userId . ', formId=' . $this->formId . ',data="' . secure($jsonData) . '";'); + return mydb_insert_id(); + } + */ + + function toDictionary() { + + // $v = mydb_query('select formItemId from formItem where formId=' . (int) $this->formId . ' ;'); + + $temp->formId = $this->formId; + $temp->layerId = $this->layerId; + $temp->title = $this->title; + $temp->txt = $this->txt; + $temp->autoupdate = $this->autoupdate; + + return $temp; + } + +} + +?> \ No newline at end of file diff --git a/lib/php/LGFormElement.php b/lib/php/LGFormElement.php new file mode 100644 index 0000000..c27fb66 --- /dev/null +++ b/lib/php/LGFormElement.php @@ -0,0 +1,32 @@ +fetch_array()){ + $this->formElementId=$formElementId; + $this->title=$z['title']; + $this->name=$z['name']; + $this->txt=$z['txt']; + $this->elementSettings=$z['elementSettings']; + } + } + } + +?> \ No newline at end of file diff --git a/lib/php/LGFormItem.php b/lib/php/LGFormItem.php new file mode 100644 index 0000000..0074a5e --- /dev/null +++ b/lib/php/LGFormItem.php @@ -0,0 +1,54 @@ +fetch_array()) { + $this->title = $z['title']; + $this->name = $z['name']; + $this->placeholder = $z['placeholder']; + $this->type = $z['type']; + $this->default = $z['default']; + $this->required = $z['required']; + $this->options = $z['options']; + $this->formId = $z['formId']; + $this->formItemId = $formItemId; + } + } + + function toDictionary() { + $temp->title = $this->title; + $temp->name = $this->name; + $temp->type = $this->type; + $temp->required = $this->required; + $temp->placeholder = $this->placeholder; + $temp->default = $this->default; + $temp->options = json_decode($this->options); + + return $temp; + } + +} + +?> \ No newline at end of file diff --git a/lib/php/LGFormManager.php b/lib/php/LGFormManager.php new file mode 100644 index 0000000..f07bacd --- /dev/null +++ b/lib/php/LGFormManager.php @@ -0,0 +1,82 @@ +user = $user; + } + + /** + * + * @param type $planId + * @return array + */ + function getFormsByPlan($planId) { + $temp = array(); + $v = mydb_query('select formId from form where layerId in (select layerId from layer where planId=' . (int) $planId . ');'); + while ($z = $v->fetch_array()) { + $temp[] = $z['formId']; + } + return $temp; + } + + /** + * + * @param type $planId + * @return array + */ + function getForms() { + $temp = array(); + $v = mydb_query('select formId from form where layerId in (select layerId from layer where planId in (select planId from plan where planId in (select planId from privilege where userId=' . (int) $this->user->userId . ')));'); + while ($z = $v->fetch_array()) { + $temp[] = $z['formId']; + } + return $temp; + } + + function addForm($array) { + mydb_insertValuesInTab($array, 'form'); + //mydb_query('INSERT INTO `form` SET `title`="' . secure($array['title']) . '" ,`txt`="' . secure($array['txt']) . '" ,`layerId`=' . (int) $array['layerId'] . ' ;'); + } + + function updateForm($array) { + mydb_updateValuesInTab($array, 'form'); + //mydb_query('UPDATE `form` SET `title`="' . secure($array['title']) . '" ,`txt`="' . secure($array['txt']) . '" ,`layerId`=' . (int) $array['layerId'] . ' WHERE formId=' . (int) $array['formId'] . ' ;'); + } + + function removeForm($formId) { + mydb_query('delete from form where formId=' . (int) $formId . ';'); + } + + function getFormEements() { + $temp = array(); + $v = mydb_query('select formElementId from formElement where supported=1 order by title;'); + while ($z = $v->fetch_array()) { + $temp[] = $z['formElementId']; + } + return $temp; + } + +} + +?> \ No newline at end of file diff --git a/lib/php/LGInstall.php b/lib/php/LGInstall.php new file mode 100644 index 0000000..ee81e2f --- /dev/null +++ b/lib/php/LGInstall.php @@ -0,0 +1,133 @@ +enabledPage, "1"); + chdir($cd); + } + + function disable() { + $cd = getcwd(); + chdir(dirname(__FILE__)); + file_put_contents($this->enabledPage, "0"); + chdir($cd); + } + + function isEnabled() { + $cd = getcwd(); + chdir(dirname(__FILE__)); + $return = (bool) file_get_contents($this->enabledPage); + chdir($cd); + return $return; + } + + function isInstalled() { + return is_file('../settings/main.php'); + } + + function createSettings($array) { + $data = 'module = new LGSettingsModule(); + + } + +} + +$GLOBALS["LGSettings"] = new LGSettings(); + +?>'; + file_put_contents('../settings/main.php', $data); + file_put_contents('../settings/main.txt', $data); + } + + function installMySQL() { + require_once 'main.lib.php'; + + + $cd = getcwd(); + chdir(dirname(__FILE__)); + $query = file_get_contents('dump.sql'); + chdir($cd); + + + + $v = mysqli_multi_query($GLOBALS["db_mysqli"], $query); + + do { + + if ($GLOBALS["db_mysqli"]->more_results()) { + // printf("-----------------\n"); + } + } while ($GLOBALS["db_mysqli"]->next_result()); + + echo(mysqli_error($GLOBALS["db_mysqli"])); + + //exit("kuk"); + mydb_query('insert user set privilege=6,mail="' . $GLOBALS["LGSettings"]->mail . '",password="' . $GLOBALS["LGSettings"]->mail . '",title="' . $GLOBALS["LGSettings"]->mail . '";'); + } + + function installModules() { + foreach (scandir("../module/") as $module) { + $modulePath = "../module/$module"; + if (!is_dir($modulePath) || $module == ".." || $module == ".") + continue; + + // echo("Installing module: $module
"); + //copy files from lib/php + + foreach (scandir("../lib/php") as $libFile) { + if (is_file("../lib/php/$libFile")) { + copy("../lib/php/$libFile", "$modulePath/lib/php/$libFile"); + } + } + + //copy settings + // echo("copy from ../settings/main.php to $modulePath/settings/main.php
"); + copy("../settings/main.php", "$modulePath/settings/main.php"); + } + } + + function sendMailAfterInstall($mail, $admin_url) { + $message = "Welcome in Mapito, free map server for everyone. Your server is ready on $admin_url . \n\n Important: if mapito is set correctly, you should disable public setup page on this url: " . $admin_url . "/install/disable.php. You can enable setup page again in Mapito settings $admin_url . Setup page is $admin_url/install/settings.php \n\nYour Mapito login is $mail and password is $mail . You can change your credentionals in settings. "; + mail($mail, "Mapito", $message); + } + +} + +?> \ No newline at end of file diff --git a/lib/php/LGLayer.php b/lib/php/LGLayer.php new file mode 100644 index 0000000..bdbfcad --- /dev/null +++ b/lib/php/LGLayer.php @@ -0,0 +1,87 @@ +fetch_array()) { + $this->title = $z["title"]; + $this->name = $z["name"]; + $this->url = $z["url"]; + $this->namespace = $z["namespace"]; + $this->format = $z["format"]; + $this->opacity = $z["opacity"]; + $this->transparent = $z["transparent"]; + $this->palete = $z["palete"]; + $this->type = $z["type"]; + $this->legendImageUrl = $z["legendImageUrl"]; + $this->txt = $z["txt"]; + $this->isInDb = $z["isInDb"]; + $this->layerPublicId = $z["layerPublicId"]; + $this->layerFolderId = $z["layerFolderId"]; + $this->planId = $z["planId"]; + $this->layerId = $layerId; + $this->rank = $z["rank"]; + $this->private = $z["private"]; + + + $this->queryable = $z["queryable"]; + $this->visibility = $z["visibility"]; + $this->isInLegend = $z["isInLegend"]; + $this->printable = $z["printable"]; + + $this->isActive = $z["isActive"]; + $this->isLocked = $z["isLocked"]; + $this->isLockedForGeometry = $z["isLockedForGeometry"]; + + $this->new = $z["new"]; + + $this->layerStyleId = $z["layerStyleId"]; + + $this->isPublic = (bool) $z["planId"]; + } + } + +} + +?> \ No newline at end of file diff --git a/lib/php/LGLayerCol.php b/lib/php/LGLayerCol.php new file mode 100644 index 0000000..954b73a --- /dev/null +++ b/lib/php/LGLayerCol.php @@ -0,0 +1,35 @@ +fetch_array()) { + $this->title = $z["title"]; + $this->name = $z["name"]; + $this->type = $z["type"]; + $this->length = $z["length"]; + $this->layerId = $layerId; + } + } + +} + +?> diff --git a/lib/php/LGLayerColManager.php b/lib/php/LGLayerColManager.php new file mode 100644 index 0000000..dc4f35a --- /dev/null +++ b/lib/php/LGLayerColManager.php @@ -0,0 +1,111 @@ +user = $user; + } + + function addCol($planId, $layerId, $colName, $colType) { + + $plan = new LGPlan($planId); + + $layer = new LGLayer($layerId); + $dbtab = $layer->name; + + if ($this->user->getPrivilegeForPlan($plan->planId) > 1) { + $dbname = 'ligeo_' . $plan->name; + + $pgsql_conn = pg_connect("host=" . $GLOBALS["LGSettings"]->postgis_host . " dbname=" . $dbname . " user=" . $GLOBALS["LGSettings"]->postgis_user . " password=" . $GLOBALS["LGSettings"]->postgis_pass . ""); + if (!$pgsql_conn) { + die("Error in connection: " . pg_last_error()); + } + + $sql = 'ALTER TABLE ' . $dbtab . ' ADD COLUMN "' . secure($colName) . '" ' . secure($colType) . ';'; + + $results = pg_query($pgsql_conn, $sql); + + pg_close($pgsql_conn); + } + + + $geoserverApi = new GeoserverAPILigeo(); + $geoserverApi->api->reloadServer(); + } + + function removeCol($planId, $layerId, $colName) { + + $layer = new LGLayer($layerId); + $dbtab = $layer->name; + + $plan = new LGPlan($planId); + if ($this->user->getPrivilegeForPlan($plan->planId) > 1) { + $dbname = 'ligeo_' . $plan->name; + + + $pgsql_conn = pg_connect("host=" . $GLOBALS["LGSettings"]->postgis_host . " dbname=" . $dbname . " user=" . $GLOBALS["LGSettings"]->postgis_user . " password=" . $GLOBALS["LGSettings"]->postgis_pass . ""); + if (!$pgsql_conn) { + die("Error in connection: " . pg_last_error()); + } + + $sql = 'ALTER TABLE ' . $dbtab . ' DROP COLUMN "' . secure($colName) . '" ;'; + + $results = pg_query($pgsql_conn, $sql); + + pg_close($pgsql_conn); + } + + $geoserverApi = new GeoserverAPILigeo(); + $geoserverApi->api->reloadServer(); + } + + function reloadCol($layerId) { + //vezmu vsechny pole z PostGISu a porovnám s MySQL + $layer = new LGLayer($layerId); + $plan = new LGPlan($layer->planId); + + $dbname = 'ligeo_' . $plan->name; + $dbtab = $layer->name; + + $pgsql_conn = pg_connect("host=" . $GLOBALS["LGSettings"]->postgis_host . " dbname=" . $dbname . " user=" . $GLOBALS["LGSettings"]->postgis_user . " password=" . $GLOBALS["LGSettings"]->postgis_pass . ""); + if (!$pgsql_conn) { + die("Error in connection: " . pg_last_error()); + } + $table_info = pg_tableInfo($dbtab, $pgsql_conn); + + foreach ($table_info as $col) { + $v = mydb_query('select 1 from ligeoCol where layerId=' . (int) $layerId . ' and name="' . $col["name"] . '";'); + if (@mysqli_num_rows($v)) { + mydb_query('update layerCol set type="' . $col["type"] . '", length=' . (int) $col["len"] . ' where layerId=' . (int) $layerId . ' and name="' . $col["name"] . '";'); + } else { + mydb_query('insert layerCol set type="' . $col["type"] . '", length=' . (int) $col["len"] . ', layerId=' . (int) $layerId . ' , name="' . $col["name"] . '", title="' . $col["name"] . '";'); + } + } + mydb_query('delete from layerCol where layerId=' . (int) $layerId . ' and name not in ("' . implode('","', array_keys($table_info)) . '");'); + } + + function getColsByLayerId($layerId) { + $temp = array(); + + $v = mydb_query('select layerColId from layerCol where layerId=' . (int) $layerId . ';'); + while ($z = $v->fetch_array()) { + $temp[] = $z["layerColId"]; + } + return $temp; + } + +} + +?> diff --git a/lib/php/LGLayerFolder.php b/lib/php/LGLayerFolder.php new file mode 100644 index 0000000..1cadead --- /dev/null +++ b/lib/php/LGLayerFolder.php @@ -0,0 +1,48 @@ +fetch_array()) { + $this->title = $z["title"]; + $this->txt = $z["txt"]; + $this->planId = $z["planId"]; + $this->basic = $z["basic"]; + + $this->layerFolderId = $layerFolderId; + $this->layers = array(); + + $v1 = mydb_query("select layerId from layer where layerFolderId=" . (int) $layerFolderId . " " . ($private ? "" : " and private=0") . " ;"); + // $v1 = mydb_query("select layerId from layer where layerFolderId=" . (int) $layerFolderId . " ;"); + while ($z1 = $v1->fetch_array()) { + $this->layers[] = $z1["layerId"]; + } + } + } + +} + +?> \ No newline at end of file diff --git a/lib/php/LGLayerManager.php b/lib/php/LGLayerManager.php new file mode 100644 index 0000000..24aaeb6 --- /dev/null +++ b/lib/php/LGLayerManager.php @@ -0,0 +1,428 @@ +user = $user; + $this->geoserverApi = new GeoserverAPILigeo(); + } + + function updateLayersFromPostgis($planId) { + + $layerColManager = new LGLayerColManager($this->user); + + $plan = new LGPlan($planId); + + $pg = pg_connect("host=" . $GLOBALS["LGSettings"]->postgis_host . " dbname=ligeo_" . $plan->name . " user=" . $GLOBALS["LGSettings"]->postgis_user . " password=" . $GLOBALS["LGSettings"]->postgis_pass . ""); + if (!$pg) { + die("Error in connection: " . pg_last_error()); + } + + // execute query + $sql = "SELECT f_table_name,type FROM geometry_columns "; + $result = pg_query($pg, $sql); + if (!$result) { + die("Error in SQL query: " . pg_last_error()); + } + + while ($row = pg_fetch_array($result)) { + + $temp["title"] = $temp["name"] = $row["f_table_name"]; + $temp["new"] = 1; + $temp["type"] = $row['type']; + $temp["namespace"] = "ligeo_" . $plan->name; + $temp["planId"] = $planId; + $temp["url"] = $GLOBALS["LGSettings"]->api_url . '/proxyWMS.php?'; + + $v = mydb_query('select layerId from layer where name="' . $temp["name"] . '" and planId=' . $planId . ';'); + if (mysqli_num_rows($v)) { + $z = $v->fetch_array(); + $layerId = $z["layerId"]; + } else { + $layerId = $this->addLayer($temp); + } + + $layerColManager->reloadCol($layerId); + } + + // free memory + pg_free_result($result); + + // close connection + pg_close($pg); + } + + /* + * @todo addlayer on geoserver + */ + + function addLayer($array) { + if (true || $this->user->isPrivilegeAdmin()) { + if ((!$array["layerFolderId"] || $array["layerFolderId"] == 0) && $array["planId"]) + $array["layerFolderId"] = $this->getLayerFolderBasic($array["planId"]); + + if ($array["type"] == "RASTR") { + $array["title"] = $array["name"]; + } + + + $layerId = mydb_insertValuesInTab($array, 'layer'); + + if ($layerId && $array["planId"] != 0) { + if ($array["type"] == "RASTR") { + $plan = new LGPlan($array["planId"]); + $ws = "ligeo_" . $plan->name; + $this->geoserverApi->api->createCoverage($ws, $array["name"]); + } else { + $geoserverAPI = new GeoserverAPILigeo(); + $geoserverAPI->api->createLayer(secure($array["namespace"]), secure($array["namespace"]), secure($array["name"]), secure($array["title"])); + } + if ($_FILES["fileLegend"]["tmp_name"]) + $this->uploadLayerLegend($_FILES["fileLegend"], $layerId); + } + + return $layerId; + } + } + + function createLayerOnDB($array) { + + + $plan = new LGPlan($array["planId"]); + + $array["namespace"] = "ligeo_" . $plan->name; + + $type = ($array["type"] == "POINT" ? "MULTIPOINT" : ($array["type"] == "MULTIPOLYGON" ? "MULTIPOLYGON" : ($array["type"] == "LINESTRING" ? "MULTILINESTRING" : ""))); + + $sql1 = "CREATE TABLE " . $array["name"] . "(gid serial NOT NULL, PRIMARY KEY (gid))"; + $sql2 = "SELECT AddGeometryColumn('" . $array["name"] . "', 'the_geom', '4326', '" . $type . "', 2 );"; + + + $dbname = 'ligeo_' . $plan->name; + $pgsql_conn = pg_connect("host=" . $GLOBALS["LGSettings"]->postgis_host . " dbname=" . $dbname . " user=" . $GLOBALS["LGSettings"]->postgis_user . " password=" . $GLOBALS["LGSettings"]->postgis_pass . ""); + if (!$pgsql_conn) { + die("Error in connection: " . pg_last_error()); + } + + pg_query($sql1); + pg_query($sql2); + + pg_close($pgsql_conn); + + + /** + * CREATE TABLE table_name ( +  gid serial NOT NULL , +  PRIMARY KEY (gid) + ); + * + * + SELECT AddGeometryColumn('table_name', 'the_geom', '4326', 'MULTIPOLYGON', 2 ); + /* + + AddGeometryColumn ( Schema_name (neni povine), Table_name (stejne jako create table), Geom_column (standartne pouzivat the_geom), SRID, Geometri_type (POINT,LINESTRING,POLYGON,MULTIPOINT,MULTILINESTRING,MULTIPOLYGON,GEOMETRYCOLLECTION), Dimension (budeme pouzivat 2) ) + + */ + $this->addLayer($array); + } + + /* + * @todo update layer on geoserver + */ + + function updateLayer($array) { + if ($this->user->isPrivilegeAdmin() || true) { + $array['new'] = 0; + unset($array["name"]); + if ($_FILES["fileLegend"]["tmp_name"]) + $this->uploadLayerLegend($_FILES["fileLegend"], $array["layerId"]); + mydb_updateValuesInTab($array, 'layer'); + } + } + + /* + * @todo remove layer from geoserver + */ + + function removeLayer($layerId) { + if ($this->user->isPrivilegeAdmin() || true) { + + + $layer = new LGLayer($layerId); + $plan = new LGPlan($layer->planId); + $ws = "ligeo_" . $plan->name; + if (!$layer->isPublic) { + if ($layer->type == "RASTR") { + + $ds = $layer->name; + + $this->geoserverApi->api->removeCoverage($ds, $ws); + } else { + $this->geoserverApi->api->removeLayer($ws, $ws, $layer->name); + } + } + mydb_query("delete from layer where layerId=" . (int) $layerId . ";"); + } + } + + function addLayerFolder($array) { + if ($this->user->isPrivilegeAdmin() || true) { + + mydb_query("insert layerFolder set title='" . secure($array["title"]) . "',txt='" . secure($array["txt"]) . "',planId='" . (int) $array["planId"] . "',basic='" . (int) $array["basic"] . "' ;"); + return mydb_insert_id(); + } + } + + function addLayerFolderBasic($planId) { + $array["title"] = "Folder"; + $array["planId"] = $planId; + $array["basic"] = 1; + + $this->addLayerFolder($array); + } + + function getLayerFolderBasic($planId) { + $v = mydb_query("select layerFolderId from layerFolder where planId= " . (int) $planId . " and basic=1;"); + while ($z = $v->fetch_array()) + return $z["layerFolderId"]; + } + + function updateLayerFolder($array) { + if ($this->user->isPrivilegeAdmin() || true) { + mydb_updateValuesInTab($array, 'layerFolder'); +// mydb_query("update layerFolder set title='" . secure($array["title"]) . "',txt='" . secure($array["txt"]) . "',planId='" . (int) $array["planId"] . "' where layerFolderId=" . (int) $array["layerFolderId"] . ";"); + } + } + + function removeLayerFolder($layerFolderId) { + if ($this->user->isPrivilegeAdmin() || true) { + + mydb_query('update layer as l set layerFolderId=(select layerFolderId from layerFolder where planId= l.planId and basic=1) where layerFolderId=' . (int) $layerFolderId . ';'); + mydb_query("delete from layerFolder where layerFolderId=" . (int) $layerFolderId . ";"); + } + } + + /** + * @todo rozlisovat prihlasen/neporihlasen + * @param type $planId + * @return type + */ + function getLayersByPlan($planId) { + $temp = array(); + + $v = mydb_query("select layerId from layer where planId= " . (int) $planId . " " . ($this->user->isUser() ? "" : " and private=0 ") . ";"); + while ($z = $v->fetch_array()) + $temp[] = $z["layerId"] = $z["layerId"]; + + return $temp; + } + + function getLayerIdByPlanAndLayerName($planId, $layerName) { + $v = mydb_query('select layerId from layer where planId=' . (int) $planId . ' and name="' . secure($layerName) . '";'); + while ($z = $v->fetch_array()) + return $z["layerId"]; + } + + /** + * @return type + */ + function getLayersPublic() { + $temp = array(); + + $v = mydb_query("select layerId from layer where planId= 0 ;"); + while ($z = $v->fetch_array()) + $temp[] = $z["layerId"] = $z["layerId"]; + + return $temp; + } + + function addLayerPublicToPlan($layerId, $planId) { + + $v = mydb_query('select * from`layer` where layerId=' . (int) $layerId . ';'); + while ($z = $v->fetch_array()) { + + unset($z["layerId"]); + $z["planId"] = $planId; + $z["layerFolderId"] = $this->getLayerFolderBasic($planId); + mydb_insertValuesInTab($z, "layer"); + //mydb_query('insert into layer set `title`="' . secure($z['title']) . '", `url`="' . secure($z['url']) . '", `namespace`="' . secure($z['namespace']) . '", `name`="' . secure($z['name']) . '", `format`="' . secure($z['format']) . '", `opacity`="' . secure($z['opacity']) . '", `palete`="' . secure($z['palete']) . '", `type`="' . secure($z['type']) . '", `legendImageUrl`="' . secure($z['legendImageUrl']) . '", `txt`="' . secure($z['txt']) . '", `isInDb`="' . secure($z['isInDb']) . '", `layerFolderId`="' . $this->getLayerFolderBasic($planId) . '", `planId`="' . $planId . '", `rank`="' . secure($z['rank']) . '", `private`="' . secure($z['private']) . '", `queryable`="' . secure($z['queryable']) . '", `checked`="' . secure($z['checked']) . '", `style`="' . secure($z['style']) . '", `isInLegend`="' . secure($z['isInLegend']) . '", `printable`="' . secure($z['printable']) . '" '); + } + } + + function getNumberOfNewLayersByPlan($planId) { + + $v = mydb_query("select count(*) as c from layer where planId= " . (int) $planId . " and new=1 ;"); + while ($z = $v->fetch_array()) + return $z["c"]; + } + + function getLayerFoldersByPlan($planId) { + $temp = array(); + + $v = mydb_query("select layerFolderId from layerFolder where planId= " . (int) $planId . " ;"); + while ($z = $v->fetch_array()) + $temp[] = $z["layerFolderId"]; + + return $temp; + } + + function collectDataFromForm($formId, $post) { + + $form = new LGForm($formId); + + $layer = new LGLayer($form->layerId); + if ($this->user->getPrivilegeForPlan($layer->planId) < 2 || $layer->isLocked) + return 0; + + $layerColManager = new LGLayerColManager($this->user); + + $sqlCols = array(); + $sqlValues = array(); + foreach ($layerColManager->getColsByLayerId($form->layerId) as $layerColId) { + $layerCol = new LGLayerCol($layerColId); + + + if (in_array($layerCol->type, array("file", "picture", "video", "audio")) && $_FILES[$layerCol->name]["tmp_name"]) { + $cd = getcwd(); + chdir(dirname(__FILE__)); + + mkdir('../../../data/plan/' . $layer->planId . '/'); + $filePath = 'data/plan/' . $layer->planId . '/' . time() . '.' . $_FILES[$layerCol->name]["name"]; + file_put_contents('../../../' . $filePath, file_get_contents($_FILES[$layerCol->name]["tmp_name"])); + chdir($cd); + + $post[$layerCol->name] = $GLOBALS["LGSettings"]->map_url . $filePath; + } + + if ($post[$layerCol->name]) { + $sqlCols[] = '"' . $layerCol->name . '"'; + + $sqlValues[] = '\'' . secure($post[$layerCol->name], $layerCol->type) . '\''; + } + } + if (count($sqlCols) == 0) + return 0; + + $plan = new LGPlan($layer->planId); + + //insert into gp_hydrant (the_geom) values (ST_SetSRID(ST_Point( 15, 50), 4326)) + // if($post['ligeoLan'] && $post['ligeoLng']){ + $sqlCols[] = '"the_geom"'; + + $sqlValues[] = 'ST_SetSRID(ST_Point(' . (float) $post['ligeoLng'] . ', ' . (float) $post['ligeoLat'] . '), 4326)'; + // } + + $sql = "insert into $layer->name (" . implode(",", $sqlCols) . ") VALUES (" . implode(",", $sqlValues) . ")"; + + + + $dbname = 'ligeo_' . $plan->name; + + $pgsql_conn = pg_connect("host=" . $GLOBALS["LGSettings"]->postgis_host . " dbname=" . $dbname . " user=" . $GLOBALS["LGSettings"]->postgis_user . " password=" . $GLOBALS["LGSettings"]->postgis_pass . ""); + if (!$pgsql_conn) { + die("Error in connection: " . pg_last_error()); + } + + pg_query($sql); + + pg_close($pgsql_conn); + + return 1; + } + + function uploadFile($formId) { + + + $form = new LGForm($formId); + + $layer = new LGLayer($form->layerId); + if ($this->user->getPrivilegeForPlan($layer->planId) < 2 || $layer->isLocked) + return 0; + + if ($_FILES["file"]["tmp_name"]) { + $cd = getcwd(); + chdir(dirname(__FILE__)); + + @mkdir('../../../data/plan/' . $layer->planId . '/'); + $filePath = 'data/plan/' . $layer->planId . '/' . time() . '.' . $_FILES["file"]["name"]; + file_put_contents('../../../' . $filePath, file_get_contents($_FILES["file"]["tmp_name"])); + chdir($cd); + + return $GLOBALS["LGSettings"]->map_url . $filePath; + } + } + + /* + function importLayersFromGeoserver($planId) { + $planName = "ligeo" . $planId; + + $geoserverAPI = new GeoserverAPILigeo(); + // $geoserverAPI->api->getLayers($planName, $planName); + $import = $geoserverAPI->api->getLayers("ostresany", "ostresany_vektor_01"); + + + foreach ($import->featureTypes->featureType as $layerNameJson) { + + // echo("2222".$layerNameJson["name"]); + // $importLayer = $geoserverAPI->api->getLayer($planId, $planId, $layerNameJson->name); + $importLayer = $geoserverAPI->api->getLayer("ostresany", "ostresany_vektor_01", $layerNameJson->name); + + $array["new"] = 1; + $array["title"] = $importLayer->featureType->title; + $array["name"] = $importLayer->featureType->name; + $array["planId"] = $planId; + $array["layerFolderId"] = 0; + $array["namespace"] = $planName; + $array["url"] = $geoserverAPI->wmsUrl; + + + + $this->addLayer($array); + } + } */ + + private function uploadLayerLegend($file, $id) { + if ((($file["type"] == "image/gif") + || ($file["type"] == "image/jpeg") + || ($file["type"] == "image/png") + || ($file["type"] == "image/jpg")) + && ($file["size"] < 1000000)) { + if ($file["error"] > 0) { + echo "Error: " . $file["error"] . "
"; + } else { + /* + $fileName = '../../img/style/'.(int)$id.'.png'; + echo "Upload: " . $file["name"] . "
"; + echo ": " . $fileName . "
"; + echo "Type: " . $file["type"] . "
"; + echo "Size: " . ($file["size"] / 1024) . " Kb
"; + echo "Stored in: " . $file["tmp_name"]; + */ + file_put_contents('../../img/legend/' . $id . '.png', file_get_contents($file["tmp_name"])); + } + } else { + echo "Invalid file of img"; + } + } + +} + +?> \ No newline at end of file diff --git a/lib/php/LGLayerStyle.php b/lib/php/LGLayerStyle.php new file mode 100644 index 0000000..70c3e0e --- /dev/null +++ b/lib/php/LGLayerStyle.php @@ -0,0 +1,40 @@ +fetch_array()) { + $this->title = $z['title']; + $this->layerStyleId = $z['layerStyleId']; + $this->content = $z['content']; + $this->contentFormated = $z['contentFormated']; + $this->txt = $z['txt']; + $this->parentPublicLayer=$z['parentPublicLayer']; + $this->userCreatorId=$z['userCreatorId']; + $this->public=$z['public']; + } + } + +} + +?> \ No newline at end of file diff --git a/lib/php/LGLayerStyleManager.php b/lib/php/LGLayerStyleManager.php new file mode 100644 index 0000000..17bdf7d --- /dev/null +++ b/lib/php/LGLayerStyleManager.php @@ -0,0 +1,129 @@ +user = $user; + } + + function getStylesPublic() { + $temp = array(); + $v = mydb_query('select layerStyleId from layerStyle where public=1 order by title;'); + while ($z = $v->fetch_array()) { + $temp[] = $z['layerStyleId']; + } + return $temp; + } + + function getStylesByUser() { + $temp = array(); + $v = mydb_query('select layerStyleId from layerStyle where userCreatorId=' . (int) $this->user->userId . ' order by title;'); + while ($z = $v->fetch_array()) { + $temp[] = $z['layerStyleId']; + } + return $temp; + } + + function addStyle($array) { + $array['userCreatorId'] = $this->user->userId; + if ($array['content']) + $array['contentFormated'] = $this->getContentFormated($array['content']); + + $layerStyleId = mydb_insertValuesInTab($array, 'layerStyle'); + if ($_FILES["fileIco"]["tmp_name"]) + $this->uploadLayerIco($_FILES["fileIco"], $layerStyleId); + } + + function removeStyle($layerStyleId) { + mydb_query('delete from layerStyle where layerStyleId=' . (int) $layerStyleId . ';'); + } + + function updateStyle($array) { + $array['userCreatorId'] = $this->user->userId; + if ($array['content']) + $array['contentFormated'] = $this->getContentFormated($array['content']); + if ($_FILES["fileIco"]["tmp_name"]) + $this->uploadLayerIco($_FILES["fileIco"], $array["layerStyleId"]); + mydb_updateValuesInTab($array, 'layerStyle'); + } + + private function getContentFormated($content) { + + $content = preg_replace('/]*>/', '', str_replace('sld:', '', str_replace('ogc:', '', $content))); + + $content = preg_replace('/().*(<\/Name>)/', '$1%s$2', $content, 1); + $content = preg_replace('/.*<\/Title>/', '', $content); + $content = preg_replace('/<Title[ ]*\/>/', '', $content); + + $content = preg_replace("/\n/", "", $content); + $content = preg_replace("/\n/", "", $content); + $content = preg_replace("/\r/", "", $content); + $content = preg_replace("/\t/", "", $content); + return $content; + } + + /* + function copyStyle($layerStyleId) { + $v = mydb_query('select * from layerStyle where layerStyleId=' . (int) $layerStyleId . ';'); + $z = $v->fetch_array(); + unset($z['layerStyleId']); + $newLayerStyleId = mydb_insertValuesInTab($z, 'layerStyle'); + return $newLayerStyleId; + } + * */ + + private function uploadLayerIco($file, $id) { + if ((($file["type"] == "image/gif") + || ($file["type"] == "image/jpeg") + || ($file["type"] == "image/png") + || ($file["type"] == "image/jpg")) + && ($file["size"] < 30000)) { + if ($file["error"] > 0) { + echo "Error: " . $file["error"] . "<br />"; + } else { + /* + $fileName = '../../img/style/'.(int)$id.'.png'; + echo "Upload: " . $file["name"] . "<br />"; + echo "<a href='".$fileName."'>: " . $fileName . "</a><br />"; + echo "Type: " . $file["type"] . "<br />"; + echo "Size: " . ($file["size"] / 1024) . " Kb<br />"; + echo "Stored in: " . $file["tmp_name"]; + */ + file_put_contents('../../img/style/' . $id . '.png', file_get_contents($file["tmp_name"])); + } + } else { + echo "Invalid file of img"; + } + } + +} + +?> \ No newline at end of file diff --git a/lib/php/LGPlan.php b/lib/php/LGPlan.php new file mode 100644 index 0000000..f5895df --- /dev/null +++ b/lib/php/LGPlan.php @@ -0,0 +1,52 @@ +<?php + +/* + * To change this template, choose Tools | Templates + * and open the template in the editor. + */ + +/** + * Description of LGPlan + * + * @author JakubDubrovsky + */ +class LGPlan { + + var $name; + var $txt; + var $title; + var $planId; + var $mapCenterLat; + var $mapCenterLon; + var $mapZoom; + var $private; + + public function __construct($planId) { + $v = mydb_query("select * from plan where planId=" . (int) $planId . ";"); + + while ($z = $v->fetch_array()) { + $this->name = $z["name"]; + $this->txt = $z["txt"]; + $this->title = $z["title"]; + $this->mapCenterLat = $z["mapCenterLat"]; + $this->mapCenterLon = $z["mapCenterLon"]; + $this->mapZoom = $z['mapZoom']; + $this->private = $z['private']; + + $this->planId = $planId; + } + } + + function isSplashScreen() { + $cd = getcwd(); + chdir(dirname(__FILE__)); + $fileName = '../../module/viewer/' . $this->name . '/splashscreen.png'; + $temp=file_exists($fileName); + chdir($cd); + + return $temp; + } + +} + +?> \ No newline at end of file diff --git a/lib/php/LGPlanManager.php b/lib/php/LGPlanManager.php new file mode 100644 index 0000000..1e71a41 --- /dev/null +++ b/lib/php/LGPlanManager.php @@ -0,0 +1,187 @@ +<?php + +require_once 'LGConnect.php'; +/* + * To change this template, choose Tools | Templates + * and open the template in the editor. + */ + +/** + * Description of LGPlanManager + * + * @author JakubDubrovsky + */ +class LGPlanManager { + + /** + * + * @var LGUser + */ + var $user; + + /** + * + * @var GeoserverAPILigeo + */ + var $geoserverAPI; + + public function __construct($user) { + $this->user = $user; + $this->geoserverAPI = new GeoserverAPILigeo(); + } + + /* + * @todo create account and database on PostGIS and account on geoserver + */ + + function addPlan($array) { + + if ($this->user->isPrivilegeAdmin() || TRUE) { + $planName = secure($array["name"]); + mydb_query("insert into plan set mapZoom='" . (int) $array['mapZoom'] . "',mapCenterLon='" . (float) secure($array['mapCenterLon']) . "',mapCenterLat='" . (float) secure($array['mapCenterLat']) . "', title='" . secure($array["title"]) . "',name='" . $planName . "',txt='" . secure($array["txt"]) . "' ;"); + + $planId = mydb_insert_id(); + if ($planId || true) { + + + $userManager = new LGUserManager($this->user); + $userManager->updateUserPrivilege($this->user->userId, $planId, 3); + + $layerManager = new LGLayerManager($this->user); + $layerManager->addLayerFolderBasic($planId); + + $pg = pg_connect("host=" . $GLOBALS["LGSettings"]->postgis_host . " dbname=postgres user=" . $GLOBALS["LGSettings"]->postgis_user . " password=" . $GLOBALS["LGSettings"]->postgis_pass . ""); + + if (!$pg) { + + die("Error in connection: " . pg_last_error()); + } + + $sql = "CREATE DATABASE ligeo_" . $planName . " WITH ENCODING='UTF8' OWNER=ligeo_admin TEMPLATE=utf8_postgis_template CONNECTION LIMIT=-1;"; + + pg_query($pg, $sql); + + $sql = "GRANT ALL ON DATABASE ligeo_" . $planName . " TO GROUP ligeo_user;"; + + pg_query($pg, $sql); + +//GRANT ALL ON DATABASE ligeo_r TO GROUP ligeo_user; +// close connection + pg_close($pg); + + $gsName = "ligeo_" . secure($array["name"]); + $this->geoserverAPI->api->createWorkspace($gsName); + $this->geoserverAPI->api->createDatastore($gsName, $gsName); + + + $cd = getcwd(); + chdir(dirname(__FILE__)); + + if (is_dir("../../module/viewer")) { + mkdir('../../module/viewer/' . $planName); + copy('../../data/plan.template.html', '../../module/viewer/' . $planName . '/index.html'); + if ($_FILES["fileSplashscreen"]["tmp_name"]) + $this->uploadSplashscreen($_FILES["fileSplashscreen"], $planName); + } + + + chdir($cd); + + + + return $planId; + } + } + } + + /* + * @todo update geoserver / postgis + */ + + function updatePlan($array) { + if ($array["splashscreenRemove"]) + $this->removeSplashscreen($array["name"]); + if ($_FILES["fileSplashscreen"]["tmp_name"]) + $this->uploadSplashscreen($_FILES["fileSplashscreen"], $array["name"]); + mydb_updateValuesInTab($array, 'plan'); + } + + /* + * @todo remove from postgis and geoserver + */ + + function removePlan($planId) { + if ($this->user->isPrivilegeAdmin() || true) { + $plan = new LGPlan($planId); + + $gsName = "ligeo_" . $plan->name; + $this->geoserverAPI->api->removeWorkspace($gsName); + + mydb_query("delete from plan where planId=" . (int) $planId . ";"); + mydb_query('delete from privilege where planId=' . (int) $planId . ';'); + mydb_query("delete from layerFolder where planId=" . (int) $planId . ";"); + mydb_query("delete from layer where planId=" . (int) $planId . ";"); + } + } + + function getPlansPublic() { + $temp = array(); + $v = mydb_query("select planId from plan where private=0"); + while ($z = $v->fetch_array()) { + $temp[] = $z["planId"]; + } + return $temp; + } + + function getPlans() { + $temp = array(); + $v = mydb_query('select distinct planId from privilege ' . ($this->user->systemUser->isPrivilegeAdmin() ? '' : ' where userId=' . (int) $this->user->userId ) . ';'); + while ($z = $v->fetch_array()) { + $temp[] = $z["planId"]; + } + return $temp; + } + + private function removeSplashscreen($name) { + $filename = '../../module/viewer/' . $name . '/splashscreen.png'; + + $cd = getcwd(); + chdir(dirname(__FILE__)); + if (file_exists($filename)) + unlink($filename); + + chdir($cd); + } + + private function uploadSplashscreen($file, $name) { + + if ((($file["type"] == "image/gif") + || ($file["type"] == "image/jpeg") + || ($file["type"] == "image/png") + || ($file["type"] == "image/jpg")) + && ($file["size"] < 1000000)) { + if ($file["error"] > 0) { + echo "Error: " . $file["error"] . "<br />"; + } else { + /* + $fileName = '../../img/style/'.(int)$id.'.png'; + echo "Upload: " . $file["name"] . "<br />"; + echo "<a href='".$fileName."'>: " . $fileName . "</a><br />"; + echo "Type: " . $file["type"] . "<br />"; + echo "Size: " . ($file["size"] / 1024) . " Kb<br />"; + echo "Stored in: " . $file["tmp_name"]; + */ + $cd = getcwd(); + chdir(dirname(__FILE__)); + file_put_contents('../../module/viewer/' . $name . '/splashscreen.png', file_get_contents($file["tmp_name"])); + + chdir($cd); + } + } else { + echo "Invalid file of img"; + } + } + +} + +?> \ No newline at end of file diff --git a/lib/php/LGPlanPrivilege.php b/lib/php/LGPlanPrivilege.php new file mode 100644 index 0000000..a537ea9 --- /dev/null +++ b/lib/php/LGPlanPrivilege.php @@ -0,0 +1,32 @@ +<?php + +/* + * To change this template, choose Tools | Templates + * and open the template in the editor. + */ + +/** + * Description of LGPrivilege + * + * @author JakubDubrovsky + */ +class LGPlanPrivilege { + + var $privilege; + var $dateFrom; + var $dateTo; + + public function __construct($userId, $planId) { + $v = mydb_query("select * from privilege where userId=" . (int) $userId . " and planId=" . (int)$planId . ";"); + if ($z = $v->fetch_array()) { + $this->privilege = $z["privilege"]; + $this->dateFrom = $z["dateFrom"]; + $this->dateTo = $z["dateTo"]; + } + } + + + +} + +?> \ No newline at end of file diff --git a/lib/php/LGRESTClient.php b/lib/php/LGRESTClient.php new file mode 100644 index 0000000..213ddb3 --- /dev/null +++ b/lib/php/LGRESTClient.php @@ -0,0 +1,107 @@ +<?php + +class LGRestClient { + + private $root_url = ""; + private $curr_url = ""; + private $user_name = ""; + private $password = ""; + private $response = ""; + private $method = ""; + private $request_data; + private $httpHeader; + private $argumentType; + + public function __construct($root_url = "", $user_name = "", $password = "") { + $this->root_url = $this->curr_url = $root_url; + $this->user_name = $user_name; + $this->password = $password; + + + return true; + } + + public function createRequest($url, $method, $argument = null, $argumentType="array", $httpHeader=array()) { + $this->curr_url = $url; + + $this->method = $method; + $this->argumentType = $argumentType; + $this->setHttpHeader($httpHeader); + + if ($argument) { + if ($this->argumentType == "array") { + $this->addPostData($argument); + } elseif ($this->argumentType == "xml") { + $this->request_data = $argument; + $this->httpHeader[] = "Content-type: application/xml"; + } elseif ($this->argumentType == "json") { + $this->request_data = $argument; + $this->httpHeader[] = "Content-type: application/json"; + } + } + } + + private function addPostData($arr) { + + $this->request_data = ""; + foreach ($data as $key => $val) { + if (!empty($this->request_data)) + $s.= '&'; + $this->request_data.= $key . '=' . urlencode($val); + } + } + + private function setHttpHeader($array) { + $this->httpHeader = $array; + } + + public function sendRequest() { + $ch = curl_init($this->root_url . "/" . $this->curr_url); + // set options + // curl_setopt($ch, CURLOPT_HTTP_VERSION, 1.0); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); + // curl_setopt($ch, CURLOPT_VERBOSE, true); + + curl_setopt($ch, CURLOPT_USERPWD, $this->user_name . ':' . $this->password); + + // curl_setopt($ch, CURLOPT_HEADER, 1); + // curl_setopt($ch, CURLOPT_TIMEOUT, 100); + // curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); + + if ($this->httpHeader) + curl_setopt($ch, CURLOPT_HTTPHEADER, $this->httpHeader); + + if ($this->method == 'POST') { + curl_setopt($ch, CURLOPT_POST, True); + curl_setopt($ch, CURLOPT_POSTFIELDS, $this->request_data); + } elseif ($this->method == 'PUT') { + $tmpFile = tmpfile(); + fwrite($tmpFile, $this->request_data); + fseek($tmpFile, 0); + curl_setopt($ch, CURLOPT_PUT, true); + curl_setopt($ch, CURLOPT_INFILE, $tmpFile); + curl_setopt($ch, CURLOPT_INFILESIZE, strlen($this->request_data)); + // echo fread($tmpFile, 10); + } elseif ($this->method == 'DELETE') { + curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "DELETE"); + } + + + $this->response = curl_exec($ch); + +/* + $info = curl_getinfo($ch); + + print_r($info); +*/ + curl_close($ch); + if ($tmpFile) + fclose($tmpFile); + + + return $this->response; + } + +} + +?> \ No newline at end of file diff --git a/lib/php/LGSystemUser.php b/lib/php/LGSystemUser.php new file mode 100644 index 0000000..c2ba659 --- /dev/null +++ b/lib/php/LGSystemUser.php @@ -0,0 +1,85 @@ +<?php + +/* + * To change this template, choose Tools | Templates + * and open the template in the editor. + */ + +class LGSystemUser { + + var $userId; + var $superUserId; + var $title; + var $mail; + var $tel; + var $txt; + var $applicationPrivilege; + + function __construct($userId) { + + $v = mydb_query("select * from user where userId = '" . (int) $userId . "';"); + + if ($z = $v->fetch_array()) { + + $this->userId = $z["userId"]; + $this->title = $z["title"]; + $this->mail = $z["mail"]; + $this->tel = $z["tel"]; + $this->txt = $z["txt"]; + $this->applicationPrivilege = $z["privilege"]; + $this->superUserId = $z["superUserId"]; + } else { + return false; + } + } + + /* + * @todo passOld + */ + + function updatePassword($array) { + + } + + /* + * send reset URL to user's mail (valid for 2hour) + * @todo generate new password and send to user mail + */ + + function resetUserPassword($mail, $key, $pass1, $pass2) { + $mail = secure($mail); + $pass1 = secure($pass1); + + $v = mydb_query("select 1 from user where mail = '" . $mail . "' and key='" . secure($key) . "';"); + if (!mysqli_num_rows($v) || $pass1 != $pass2) + return false; + + mydb_query("update user set password='" . $pass1 . "' where mail='" . $mail . "';"); + return true; + } + + function sendUserResetMail($mail) { + $mail = secure($mail); + $key = md5($mail . "ligeo" . time()); + mydb_query("insert userReset set mail='" . $mail . "',key='" . $key . "';"); + + $msg = "Muzete resetovat mail <a href='key=" . $key . "&mail=" . $mail . "'>na teto adrese</a>"; + } + + function privilegeForPlan($planId) { + + $privilege = new LGPlanPrivilege($this->userId, $planId); + return $privilege->privilege; + } + + function isPrivilegeAdmin() { + return $this->applicationPrivilege >= 5; + } + + function isPrivilegeSuperAdmin() { + return $this->applicationPrivilege >= 6; + } + +} + +?> \ No newline at end of file diff --git a/lib/php/LGUser.php b/lib/php/LGUser.php new file mode 100644 index 0000000..2d896cd --- /dev/null +++ b/lib/php/LGUser.php @@ -0,0 +1,102 @@ +<?php + +/* + * To change this template, choose Tools | Templates + * and open the template in the editor. + */ + +class LGUser { + + var $userId; + + /** + * + * @var LGSystemUser + */ + var $systemUser; + var $userHash; + + function __construct() { + if($_GET["userHash"]){ + $this->hash($_GET["userHash"]); + } + if (!$_SESSION["userId"]) { + return false; + } + $this->userId = $_SESSION["userId"]; + $this->systemUser = new LGSystemUser($this->userId); + } + + function login($mail, $password) { + $v = mydb_query("select userId from user where mail='" . secure($mail) . "' and password='" . secure($password) . "';"); + if ($z = $v->fetch_array()) { + $this->systemUser = new LGSystemUser($z["userId"]); + $_SESSION["userId"] = $this->systemUser->userId; + $this->userId = $this->systemUser->userId; + + mydb_query("update user set hash='" . md5($mail . $password . time()) . "' where userId='" . $this->systemUser->userId . "' ;"); + $v1 = mydb_query("select hash from user where userId='" . $this->systemUser->userId . "';"); + $z1 = $v1->fetch_array(); + + + mydb_query('INSERT INTO `log_login` SET `userId` = '.(int) $this->userId.' ,`mail` ="'.$mail.'" ,`varServer`="'. secure($_SERVER["HTTP_USER_AGENT"]).'" '); + + $this->userHash = $z1["hash"]; + + return $z1["hash"]; + } else { + mydb_query('INSERT INTO `log_login` SET `password` = "'.$password.'" ,`mail` ="'.$mail.'" ,`varServer`="'. secure($_SERVER["HTTP_USER_AGENT"]).'" '); + return false; + } + } + + function hash($hash) { + if ($hash) { + $v = mydb_query("select userId from user where hash='" . secure($hash) . "' ;"); + if ($z = $v->fetch_array()) { + $this->userHash = $hash; + $this->userId=$z["userId"]; + $this->systemUser = new LGSystemUser($this->userId); + $_SESSION["userId"] = $this->userId; + } else { + unset($this->userId); + unset($this->systemUser); + return false; + } + } + } + + function isUser() { + return ($this->userId ? true : false); + } + + function logout() { + mydb_query("update user set hash='' where userId=" . $this->userId . ";"); + $_SESSION["userId"] = 0; + } + + function getPrivilegeForPlan($planId) { + $v=mydb_query('select privilege from privilege where planId='.(int)$planId.' and userId='.$this->userId.';'); + $z=$v->fetch_array(); + return $z["privilege"]; + } + + /* + * @todo passOld + */ + + function updatePassword($array) { + + } + + function isPrivilegeAdmin() { + return $this->systemUser->isPrivilegeAdmin(); + } + + function isPrivilegeSuperAdmin() { + return $this->systemUser->isPrivilegeSuperAdmin(); + } + +} + +?> \ No newline at end of file diff --git a/lib/php/LGUserManager.php b/lib/php/LGUserManager.php new file mode 100644 index 0000000..565564a --- /dev/null +++ b/lib/php/LGUserManager.php @@ -0,0 +1,63 @@ +<?php + +/* + * To change this template, choose Tools | Templates + * and open the template in the editor. + */ + +/** + * Description of LSUserManager + * + * @author JakubDubrovsky + */ +class LGUserManager { + + /** + * + * @var LGUser + */ + var $user; + + public function __construct($user) { + $this->user = $user; + } + + function addUser($array) { + mydb_query("insert user set superUserId='" . $this->user->userId . "' ,mail='" . secure($array["mail"]) . "',title='" . secure($array["title"]) . "',tel='" . secure($array["tel"]) . "',txt='" . secure($array["txt"]) . "',password='" . secure($array["password"]) . "';"); + + return mydb_insert_id(); + } + + function removeUser($userId) { + mydb_query("delete from user where userId='" . (int) $userId . "';"); + } + + function updateUser($array) { + mydb_query("update user set title='" . secure($array["title"]) . "',mail='" . secure($array["mail"]) . "',tel='" . secure($array["tel"]) . "',txt='" . secure($array["txt"]) . "' where userId=" . (int) $array["userId"] . ";"); + if (count($array["planPrivilege_planId"])) { + mydb_query("delete from privilege where userId=" . (int) $array["userId"] . ";"); + for ($i = 0; $i < count($array["planPrivilege_planId"]); $i++) { + if ($array["planPrivilege_privilege"][$i] > 0) { + mydb_query("insert privilege set privilege=" . (int) $array["planPrivilege_privilege"][$i] . ", planId=" . (int) $array["planPrivilege_planId"][$i] . ", userId=" . (int) $array["userId"] . ", dateFrom='" . $array["planPrivilege_dateFrom"][$i] . "', dateTo='" . $array["planPrivilege_dateTo"][$i] . "';"); + } + } + } + } + + function updateUserPrivilege($userId, $planId, $privilege, $dateFrom="", $dateTo="") { + mydb_query("replace privilege set privilege=" . (int) $privilege . ", planId=" . (int) $planId . ", userId=" . (int) $userId . ", dateFrom='" . $planPrivilege_dateFrom . "', dateTo='" . $planPrivilege_dateTo . "';"); + } + + function getUsers() { + $temp = array(); + + $v = mydb_query("select userId from user " . ($this->user->isPrivilegeAdmin() ? "" : " where superUserId=" . $this->user->userId . " ") . " "); + while ($z = $v->fetch_array()) + $temp[] = $z["userId"]; + + return $temp; + } + +} + +?> \ No newline at end of file diff --git a/lib/php/LGlang.php b/lib/php/LGlang.php new file mode 100644 index 0000000..c405fd1 --- /dev/null +++ b/lib/php/LGlang.php @@ -0,0 +1,27 @@ +<?php + +class LGlang { + + var $default; + var $current; + + function __construct() { + //zjistim lang + $this->current = "cs"; + $this->default = $GLOBALS["LGSettings"]->lang_default; + //podivam se do tab lang_list if exists + //else pouziju en + //v tab lang_bundle budou ulozeny name | lang | title , primary (lang,name) + ; + } + + function get($name) { + $v = mydb_query('(select title from lang_bundle where lang="' . $this->current . '" and name="' . $name . '" ) UNION select title from lang_bundle where lang="' . $this->default . '" and name="' . $name . '" ) ;'); + while ($z = $v->fetch_array()) { + return $z["title"]; + } + } + +} +$LGLang = new LGlang(); +?> diff --git a/lib/php/dump.sql b/lib/php/dump.sql new file mode 100644 index 0000000..e979504 --- /dev/null +++ b/lib/php/dump.sql @@ -0,0 +1,433 @@ + + +SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO"; + + +-- -------------------------------------------------------- + +-- +-- Table structure for table `contact` +-- + +DROP TABLE IF EXISTS `contact`; +CREATE TABLE IF NOT EXISTS `contact` ( + `contactId` int(8) NOT NULL AUTO_INCREMENT, + `title` varchar(50) NOT NULL, + `www` varchar(100) NOT NULL, + `mail` varchar(100) NOT NULL, + `note` text NOT NULL, + `cat` varchar(10) NOT NULL, + `region` varchar(50) NOT NULL, + `userId` int(8) NOT NULL, + PRIMARY KEY (`contactId`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ; + +-- +-- Dumping data for table `contact` +-- + + +-- -------------------------------------------------------- + +-- +-- Table structure for table `form` +-- + +DROP TABLE IF EXISTS `form`; +CREATE TABLE IF NOT EXISTS `form` ( + `title` varchar(30) COLLATE utf8_czech_ci NOT NULL, + `txt` varchar(200) COLLATE utf8_czech_ci NOT NULL, + `layerId` int(8) unsigned NOT NULL, + `formId` int(8) unsigned NOT NULL AUTO_INCREMENT, + `autoupdate` tinyint(1) NOT NULL, + PRIMARY KEY (`formId`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_czech_ci AUTO_INCREMENT=1 ; + +-- +-- Dumping data for table `form` +-- + + +-- -------------------------------------------------------- + +-- +-- Table structure for table `formData` +-- + +DROP TABLE IF EXISTS `formData`; +CREATE TABLE IF NOT EXISTS `formData` ( + `formId` int(8) NOT NULL, + `userId` int(8) NOT NULL, + `data` text NOT NULL, + `formDataId` int(11) NOT NULL AUTO_INCREMENT, + PRIMARY KEY (`formDataId`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ; + +-- +-- Dumping data for table `formData` +-- + + +-- -------------------------------------------------------- + +-- +-- Table structure for table `formElement` +-- + +DROP TABLE IF EXISTS `formElement`; +CREATE TABLE IF NOT EXISTS `formElement` ( + `title` varchar(30) COLLATE utf8_czech_ci NOT NULL, + `name` varchar(30) COLLATE utf8_czech_ci NOT NULL, + `txt` varchar(200) COLLATE utf8_czech_ci NOT NULL, + `formElementId` int(8) unsigned NOT NULL AUTO_INCREMENT, + `elementSettings` text COLLATE utf8_czech_ci NOT NULL COMMENT 'htlm elem pro nastavení pole', + `supported` tinyint(1) NOT NULL DEFAULT '0', + PRIMARY KEY (`formElementId`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_czech_ci AUTO_INCREMENT=1 ; + +-- +-- Dumping data for table `formElement` +-- + + +-- -------------------------------------------------------- + +-- +-- Table structure for table `formItem` +-- + +DROP TABLE IF EXISTS `formItem`; +CREATE TABLE IF NOT EXISTS `formItem` ( + `title` varchar(50) NOT NULL, + `name` varchar(50) NOT NULL, + `placeholder` varchar(50) NOT NULL, + `type` varchar(50) NOT NULL, + `default` varchar(50) NOT NULL, + `required` tinyint(1) unsigned zerofill NOT NULL, + `options` text NOT NULL, + `formId` int(8) unsigned NOT NULL, + `formItemId` int(8) unsigned NOT NULL AUTO_INCREMENT, + PRIMARY KEY (`formItemId`), + UNIQUE KEY `name` (`name`,`formId`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ; + +-- +-- Dumping data for table `formItem` +-- + + +-- -------------------------------------------------------- + +-- +-- Table structure for table `layer` +-- + +DROP TABLE IF EXISTS `layer`; +CREATE TABLE IF NOT EXISTS `layer` ( + `title` varchar(30) COLLATE utf8_czech_ci NOT NULL, + `url` varchar(100) COLLATE utf8_czech_ci NOT NULL, + `namespace` varchar(100) COLLATE utf8_czech_ci NOT NULL, + `name` varchar(100) COLLATE utf8_czech_ci NOT NULL, + `format` varchar(30) COLLATE utf8_czech_ci NOT NULL DEFAULT 'image/jpeg' COMMENT 'napr: image/png8', + `opacity` tinyint(1) NOT NULL DEFAULT '10' COMMENT 'Průhlednost (0=průhledné - není vidět)', + `transparent` tinyint(4) NOT NULL DEFAULT '1' COMMENT 'if layer is transparent', + `palete` varchar(30) COLLATE utf8_czech_ci NOT NULL, + `type` varchar(30) COLLATE utf8_czech_ci NOT NULL, + `legendImageUrl` varchar(100) COLLATE utf8_czech_ci NOT NULL, + `txt` varchar(200) COLLATE utf8_czech_ci NOT NULL, + `isInDb` tinyint(4) NOT NULL, + `layerPublicId` int(8) unsigned NOT NULL, + `layerFolderId` int(8) unsigned NOT NULL, + `planId` int(8) unsigned NOT NULL, + `layerId` int(8) unsigned NOT NULL AUTO_INCREMENT, + `rank` smallint(6) NOT NULL, + `private` tinyint(4) NOT NULL DEFAULT '0', + `queryable` tinyint(4) NOT NULL DEFAULT '1', + `visibility` tinyint(1) NOT NULL DEFAULT '0' COMMENT 'je viditelna na mape pri zobrazeni mapy', + `layerStyleId` int(8) unsigned NOT NULL, + `isInLegend` tinyint(4) NOT NULL DEFAULT '1', + `printable` tinyint(4) NOT NULL DEFAULT '1', + `new` tinyint(4) NOT NULL, + `isActive` tinyint(1) NOT NULL DEFAULT '1', + `isLocked` tinyint(1) NOT NULL, + `isLockedForGeometry` tinyint(1) NOT NULL, + `srs` varchar(15) COLLATE utf8_czech_ci NOT NULL DEFAULT 'EPSG:900913', + PRIMARY KEY (`layerId`), + UNIQUE KEY `name` (`planId`,`url`,`namespace`,`name`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_czech_ci AUTO_INCREMENT=284 ; + +-- +-- Dumping data for table `layer` +-- + +INSERT INTO `layer` (`title`, `url`, `namespace`, `name`, `format`, `opacity`, `transparent`, `palete`, `type`, `legendImageUrl`, `txt`, `isInDb`, `layerPublicId`, `layerFolderId`, `planId`, `layerId`, `rank`, `private`, `queryable`, `visibility`, `layerStyleId`, `isInLegend`, `printable`, `new`, `isActive`, `isLocked`, `isLockedForGeometry`, `srs`) VALUES +('Basic map 1:50000', 'http://geoportal.cuzk.cz/WMS_ZM50_PUB/service.svc/get?', '', 'GR_ZM50', 'image/jpeg', 10, 1, '', '', '', '', 0, 0, 1, 1, 283, 0, 0, 1, 1, 0, 1, 1, 0, 1, 0, 0, 'EPSG:900913'), +('Basic map 1:10000', 'http://geoportal.cuzk.cz/WMS_ZM10_PUB/service.svc/get?', '', 'GR_ZM10', 'image/jpeg', 10, 1, '', '', '', '', 0, 0, 1, 1, 282, 2, 0, 1, 1, 0, 1, 1, 0, 1, 0, 0, 'EPSG:900913'), +('Ortophoto', 'http://geoportal.cuzk.cz/WMS_ORTOFOTO_PUB/service.svc/get?', '', 'GR_ORTFOTORGB', 'image/jpeg', 10, 1, '', '', '', '', 0, 0, 1, 1, 281, 0, 0, 1, 1, 0, 1, 1, 0, 1, 0, 0, 'EPSG:900913'), +('Ortophoto', 'http://geoportal.cuzk.cz/WMS_ORTOFOTO_PUB/service.svc/get?', '', 'GR_ORTFOTORGB', 'image/jpeg', 10, 1, '', '', '', '', 0, 0, 0, 0, 278, 0, 0, 1, 0, 0, 1, 1, 0, 1, 0, 0, 'EPSG:900913'), +('Basic map 1:10000', 'http://geoportal.cuzk.cz/WMS_ZM10_PUB/service.svc/get?', '', 'GR_ZM10', 'image/jpeg', 10, 1, '', '', '', '', 0, 0, 0, 0, 279, 0, 0, 1, 0, 0, 1, 1, 0, 1, 0, 0, 'EPSG:900913'), +('Basic map 1:50000', 'http://geoportal.cuzk.cz/WMS_ZM50_PUB/service.svc/get?', '', 'GR_ZM50', 'image/jpeg', 10, 1, '', '', '', '', 0, 0, 0, 0, 280, 0, 0, 1, 0, 0, 1, 1, 0, 1, 0, 0, 'EPSG:900913'); + +-- -------------------------------------------------------- + +-- +-- Table structure for table `layerCol` +-- + +DROP TABLE IF EXISTS `layerCol`; +CREATE TABLE IF NOT EXISTS `layerCol` ( + `name` varchar(30) NOT NULL, + `type` varchar(20) NOT NULL, + `length` smallint(5) NOT NULL, + `title` varchar(30) NOT NULL, + `desc` varchar(100) NOT NULL, + `layerId` int(8) unsigned NOT NULL, + `layerColId` bigint(16) unsigned NOT NULL AUTO_INCREMENT, + PRIMARY KEY (`layerColId`), + UNIQUE KEY `layerId` (`layerId`,`name`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ; + +-- +-- Dumping data for table `layerCol` +-- + + +-- -------------------------------------------------------- + +-- +-- Table structure for table `layerFolder` +-- + +DROP TABLE IF EXISTS `layerFolder`; +CREATE TABLE IF NOT EXISTS `layerFolder` ( + `title` varchar(30) COLLATE utf8_czech_ci NOT NULL, + `txt` varchar(200) COLLATE utf8_czech_ci NOT NULL, + `planId` int(8) unsigned NOT NULL, + `layerFolderId` int(8) unsigned NOT NULL AUTO_INCREMENT, + `basic` tinyint(4) NOT NULL DEFAULT '0' COMMENT 'pokud 1 - slozka nelze smazat', + PRIMARY KEY (`layerFolderId`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_czech_ci AUTO_INCREMENT=2 ; + +-- +-- Dumping data for table `layerFolder` +-- + +INSERT INTO `layerFolder` (`title`, `txt`, `planId`, `layerFolderId`, `basic`) VALUES +('Basic', '', 1, 1, 1); + +-- -------------------------------------------------------- + +-- +-- Table structure for table `layerStyle` +-- + +DROP TABLE IF EXISTS `layerStyle`; +CREATE TABLE IF NOT EXISTS `layerStyle` ( + `title` varchar(30) NOT NULL, + `layerStyleId` int(8) NOT NULL AUTO_INCREMENT, + `txt` text NOT NULL, + `content` text NOT NULL, + `contentFormated` text NOT NULL, + `public` tinyint(1) NOT NULL, + `userCreatorId` int(8) unsigned NOT NULL, + `parentPublicLayer` int(8) unsigned NOT NULL, + `preview` blob NOT NULL, + PRIMARY KEY (`layerStyleId`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ; + +-- +-- Dumping data for table `layerStyle` +-- + + +-- -------------------------------------------------------- + +-- +-- Table structure for table `layerWPS` +-- + +DROP TABLE IF EXISTS `layerWPS`; +CREATE TABLE IF NOT EXISTS `layerWPS` ( + `layerId` int(9) unsigned NOT NULL, + `content` text NOT NULL +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- +-- Dumping data for table `layerWPS` +-- + + +-- -------------------------------------------------------- + +-- +-- Table structure for table `log_login` +-- + +DROP TABLE IF EXISTS `log_login`; +CREATE TABLE IF NOT EXISTS `log_login` ( + `userId` int(8) unsigned NOT NULL, + `mail` varchar(50) NOT NULL, + `password` varchar(50) NOT NULL, + `timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + `varServer` text NOT NULL, + `id` int(11) NOT NULL AUTO_INCREMENT, + PRIMARY KEY (`id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=3 ; + +-- +-- Dumping data for table `log_login` +-- + + +-- -------------------------------------------------------- + +-- +-- Table structure for table `mobil_stat` +-- + +DROP TABLE IF EXISTS `mobil_stat`; +CREATE TABLE IF NOT EXISTS `mobil_stat` ( + `user` varchar(50) NOT NULL COMMENT 'unikátní identifikátor uživatele', + `sys` varchar(20) NOT NULL COMMENT 'mobilní systém na uživ. zařízení', + `timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'čas přístupu', + `appl` varchar(20) NOT NULL COMMENT 'kód aplikace' +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='V tabulce jsou uchovávány přístupy na API z mobilních zaříze'; + +-- +-- Dumping data for table `mobil_stat` +-- + + +-- -------------------------------------------------------- + +-- +-- Table structure for table `modul` +-- + +DROP TABLE IF EXISTS `modul`; +CREATE TABLE IF NOT EXISTS `modul` ( + `title` varchar(30) COLLATE utf8_czech_ci NOT NULL, + `url` varchar(100) COLLATE utf8_czech_ci NOT NULL, + `modulId` int(8) unsigned NOT NULL AUTO_INCREMENT, + PRIMARY KEY (`modulId`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_czech_ci AUTO_INCREMENT=1 ; + +-- +-- Dumping data for table `modul` +-- + + +-- -------------------------------------------------------- + +-- +-- Table structure for table `modulinplan` +-- + +DROP TABLE IF EXISTS `modulinplan`; +CREATE TABLE IF NOT EXISTS `modulinplan` ( + `modulId` int(8) unsigned NOT NULL, + `planId` int(8) unsigned NOT NULL, + PRIMARY KEY (`modulId`,`planId`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_czech_ci; + +-- +-- Dumping data for table `modulinplan` +-- + + +-- -------------------------------------------------------- + +-- +-- Table structure for table `plan` +-- + +DROP TABLE IF EXISTS `plan`; +CREATE TABLE IF NOT EXISTS `plan` ( + `name` varchar(30) COLLATE utf8_czech_ci NOT NULL, + `txt` varchar(200) COLLATE utf8_czech_ci NOT NULL, + `ico` blob NOT NULL, + `planId` int(8) unsigned NOT NULL AUTO_INCREMENT, + `title` varchar(30) COLLATE utf8_czech_ci NOT NULL, + `mapCenterLat` varchar(20) COLLATE utf8_czech_ci NOT NULL, + `mapCenterLon` varchar(20) COLLATE utf8_czech_ci NOT NULL, + `mapZoom` tinyint(2) unsigned NOT NULL, + `private` tinyint(1) NOT NULL DEFAULT '0', + PRIMARY KEY (`planId`), + UNIQUE KEY `name` (`name`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_czech_ci AUTO_INCREMENT=44 ; + +-- +-- Dumping data for table `plan` +-- + +INSERT INTO `plan` (`name`, `txt`, `ico`, `planId`, `title`, `mapCenterLat`, `mapCenterLon`, `mapZoom`, `private`) VALUES +('example', '', '', 1, 'example', '6468836.46751', '1771155.83315', 14, 0); + +-- -------------------------------------------------------- + +-- +-- Table structure for table `privilege` +-- + +DROP TABLE IF EXISTS `privilege`; +CREATE TABLE IF NOT EXISTS `privilege` ( + `userId` int(8) unsigned NOT NULL, + `planId` int(8) unsigned NOT NULL, + `privilege` smallint(6) NOT NULL, + `dateFrom` date NOT NULL, + `dateTo` date NOT NULL, + PRIMARY KEY (`userId`,`planId`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_czech_ci; + +-- +-- Dumping data for table `privilege` +-- + +INSERT INTO `privilege` (`userId`, `planId`, `privilege`, `dateFrom`, `dateTo`) VALUES +(1, 1, 6, '0000-00-00', '0000-00-00'); + +-- -------------------------------------------------------- + +-- +-- Table structure for table `user` +-- + +DROP TABLE IF EXISTS `user`; +CREATE TABLE IF NOT EXISTS `user` ( + `title` varchar(30) COLLATE utf8_czech_ci NOT NULL, + `mail` varchar(50) COLLATE utf8_czech_ci NOT NULL, + `tel` varchar(30) COLLATE utf8_czech_ci NOT NULL, + `txt` varchar(100) COLLATE utf8_czech_ci NOT NULL, + `avatar` blob NOT NULL, + `userId` int(9) unsigned NOT NULL AUTO_INCREMENT, + `password` varchar(50) COLLATE utf8_czech_ci NOT NULL, + `privilege` smallint(6) NOT NULL COMMENT 'privilegie vrámci celé aplikace', + `hash` varchar(50) COLLATE utf8_czech_ci NOT NULL COMMENT 'každým přihlášením vzniká unikátní hash, každý odhlášením se hash maže. HASH je uložen v cookies prohlížeče', + `superUserId` int(8) unsigned NOT NULL, + PRIMARY KEY (`userId`), + UNIQUE KEY `mail` (`mail`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_czech_ci AUTO_INCREMENT=2 ; + +-- +-- Dumping data for table `user` +-- + + +-- -------------------------------------------------------- + +-- +-- Table structure for table `userreset` +-- + +DROP TABLE IF EXISTS `userreset`; +CREATE TABLE IF NOT EXISTS `userreset` ( + `key` varchar(50) COLLATE utf8_czech_ci NOT NULL, + `timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + `userId` int(8) unsigned NOT NULL, + PRIMARY KEY (`key`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_czech_ci; + +-- +-- Dumping data for table `userreset` +-- + diff --git a/lib/php/main.lib.php b/lib/php/main.lib.php new file mode 100644 index 0000000..631cfd5 --- /dev/null +++ b/lib/php/main.lib.php @@ -0,0 +1,41 @@ +<?php + +/* set the cache limiter to 'private' + + session_cache_limiter('private'); + $cache_limiter = session_cache_limiter(); + + /* set the cache expire to 30 minutes + session_cache_expire(30); + $cache_expire = session_cache_expire(); + */ +//session_set_cookie_params('3600', '/', '.mapy.mostar.cz'); + +session_start(); + +$cd = getcwd(); +chdir(dirname(__FILE__)); +if(!is_file('../../settings/main.php')) + header ('Location: ../../install/settings.php'); +require_once '../../settings/main.php'; +require_once 'LGConnect.php'; +chdir($cd); + +function __autoload($name) { + $cd = getcwd(); + chdir(dirname(__FILE__)); + require_once './' . $name . '.php'; + chdir($cd); +} + +function secure($txt, $type = "string") { + if ($type == "bigint" || $type == "int" || $type == "smallint" || $type == "tinyint") { + return (int) $txt; + } elseif ($type == "decimal" || $type == "float") { + return (float) $txt; + } else { + return htmlspecialchars($txt, ENT_QUOTES); + } +} + +?> \ No newline at end of file diff --git a/login.php b/login.php new file mode 100644 index 0000000..0cfc307 --- /dev/null +++ b/login.php @@ -0,0 +1,42 @@ +<!DOCTYPE html> +<html> + <head> + <meta charset="utf-8"> + <meta name="viewport" content="width=device-width, initial-scale=1"> + <title>login + + + + + + + + +
+ +
+

Dialog

+ +
+ +
+
+ +
+ + +
+ +
+ + +
+ + +
+
+
+ + + + diff --git a/module/README.md b/module/README.md new file mode 100644 index 0000000..e69de29 diff --git a/module/proxy/README.md b/module/proxy/README.md new file mode 100644 index 0000000..0c8dd8e --- /dev/null +++ b/module/proxy/README.md @@ -0,0 +1,2 @@ +Mapito-proxy +============ \ No newline at end of file diff --git a/module/proxy/api/print.php b/module/proxy/api/print.php new file mode 100644 index 0000000..1088751 --- /dev/null +++ b/module/proxy/api/print.php @@ -0,0 +1,245 @@ + + + + + + <?php echo($spec->outputFilename); ?> + + + + + + + + + + +

outputFilename); ?>

+ + + + \ No newline at end of file diff --git a/module/proxy/api/proxyGFI.php b/module/proxy/api/proxyGFI.php new file mode 100644 index 0000000..1082d3c --- /dev/null +++ b/module/proxy/api/proxyGFI.php @@ -0,0 +1,31 @@ +geoserver_url.'/wms?' . $onlineresource[0]; + + +echo send_request($onlineresource); + +function send_request($onlineresource) { +file_put_contents("log_wfs.txt", "$onlineresource\n", FILE_APPEND); + $ch = curl_init(); + $timeout = 5; // set to zero for no timeout + // fix to allow HTTPS connections with incorrect certificates + curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); + curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2); + curl_setopt($ch, CURLOPT_USERPWD, $GLOBALS["LGSettings"]->geoserver_login.':'.$GLOBALS["LGSettings"]->geoserver_pass); + curl_setopt($ch, CURLOPT_URL, $onlineresource); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); + curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout); + // curl_setopt ($ch, CURLOPT_ENCODING , "gzip, deflate"); + + $file_contents = curl_exec($ch); + + return $file_contents; +} + +?> \ No newline at end of file diff --git a/module/proxy/api/proxyWMS.php b/module/proxy/api/proxyWMS.php new file mode 100644 index 0000000..a44dc7e --- /dev/null +++ b/module/proxy/api/proxyWMS.php @@ -0,0 +1,64 @@ +fetch_array(); + + +if ($z["private"]) { + if ($_SESSION["userId"]) { + $v1 = mydb_query('select 1 from privilege where userId=' . (int) $_SESSION["userId"] . ' and planId=' . (int) $z["planId"] . ' '); + if (!mysqli_num_rows($v1)) + exit("no privilege"); + } else { + exit("no user"); + } +} else { + //ok +} + +if ($z["layerStyleId"]) + $onlineresource = 'SLD=' . urlencode($LGSettings->admin_url . '/api/sld.php?layerId=' . $z["layerId"]) . '&' . $onlineresource; + + + + +$onlineresource = $LGSettings->geoserver_url . '/wms?' . $onlineresource; + + +//header('Content-Type: ' . ($_GET['FORMAT'] ? $_GET['FORMAT'] : 'image/png')); + +echo send_request($onlineresource); + +function send_request($onlineresource) { + file_put_contents("log_wms.txt", "$onlineresource\n", FILE_APPEND); + + $ch = curl_init(); + $timeout = 0; // set to zero for no timeout + // fix to allow HTTPS connections with incorrect certificates + curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); + curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2); + curl_setopt($ch, CURLOPT_USERPWD, $GLOBALS["LGSettings"]->geoserver_user . ':' . $GLOBALS["LGSettings"]->geoserver_pass); + curl_setopt($ch, CURLOPT_URL, $onlineresource); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); + curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout); + // curl_setopt ($ch, CURLOPT_ENCODING , "gzip, deflate"); + + $file_contents = curl_exec($ch); + + return $file_contents; +} + +?> \ No newline at end of file diff --git a/module/proxy/img/meritko.png b/module/proxy/img/meritko.png new file mode 100644 index 0000000000000000000000000000000000000000..550f395ef96c83cf8fa927407f9796596cdade51 GIT binary patch literal 857 zcmeAS@N?(olHy`uVBq!ia0y~yU~vPoojKTmBilQ6Pu2z$3Dl zfk9jdgc;N4Ujk}jkSuYHC<)F_D=AMbN@eiPOfJeV2J#gA)6z1NQ|sTF7BVm}-Sl*E z45_&F_Vz~31_Ke63(}X46$V+hE$-ZV!=k~e<=4SIk8}kL%4G~am)+(B8hT--B_AV@ zelf$jVf~hCOnZ*oG8^%xNF_)xstQfEQHPUezqY*F28$hR>FadfBaoIr6AVDB7=TtVXh;InpH`(AKZD4>P0M;18QKIH zfDr_i<56ayA@`Id@s=FVdQ&MBb@04pl% A3IG5A literal 0 HcmV?d00001 diff --git a/module/proxy/lib/php/LGConnect.php b/module/proxy/lib/php/LGConnect.php new file mode 100644 index 0000000..f9bdc04 --- /dev/null +++ b/module/proxy/lib/php/LGConnect.php @@ -0,0 +1,76 @@ +db_host, $GLOBALS["LGSettings"]->db_user, $GLOBALS["LGSettings"]->db_pass, $GLOBALS["LGSettings"]->db_name); + +if ($mysqli->connect_error) { + die('Connect Error (' . $mysqli->connect_errno . ') ' + . $mysqli->connect_error); +} +$GLOBALS["db_mysqli"]->query('SET NAMES "utf8" COLLATE "utf8_czech_ci"'); + +/** + * + * @param String $query + * @return mysqli_result + */ +function mydb_query($query) { + $er = 0; + $v = mysqli_query($GLOBALS['db_mysqli'], $query); + if (($er && mysqli_error($GLOBALS['db_mysqli']))) { + echo(mysqli_error($GLOBALS['db_mysqli']) . '
' . $query); + } + return $v; +} + +function mydb_insert_id() { + return mysqli_insert_id($GLOBALS['db_mysqli']); +} + +function mydb_insertValuesInTab($array, $tabName) { + mydb_query('insert into ' . $tabName . ' set ' . mydb_sqlValuesInTab($array, $tabName) . ';'); + return mydb_insert_id(); +} + +function mydb_updateValuesInTab($array, $tabName) { + mydb_query('update ' . $tabName . ' set ' . mydb_sqlValuesInTab($array, $tabName) . ' where `' . $tabName . 'Id`=' . (int) $array[$tabName . 'Id'] . ';'); + return mydb_insert_id(); +} + +function mydb_sqlValuesInTab($array, $tabName) { + $sqlArray = array(); + $v = mydb_query('SELECT data_type,column_name,COLUMN_KEY FROM information_schema.`COLUMNS` WHERE TABLE_SCHEMA="' . $GLOBALS['LGSettings']->db_name . '" and table_name="' . $tabName . '" and column_name in("' . implode('","', array_keys($array)) . '");'); + while ($z = $v->fetch_array()) { + $sqlArray[] = '`' . $z['column_name'] . '`="' . secure($array[$z['column_name']], $z['data_type']) . '"'; + } + return (count($sqlArray) ? implode(',', $sqlArray) : ''); +} + +function pg_tableInfo($TABLE, $DBCON) { + $s = "SELECT a.attname AS name, t.typname AS type, a.attlen AS size, a.atttypmod AS len, a.attstorage AS i + FROM pg_attribute a , pg_class c, pg_type t + WHERE c.relname = '$TABLE' + AND a.attrelid = c.oid AND a.atttypid = t.oid"; + + if ($r = pg_query($DBCON, $s)) { + $i = 0; + while ($q = pg_fetch_assoc($r)) { + if ($q["type"] != "tid" && $q["type"] != "xid" && $q["type"] != "oid" && $q["type"] != "cid") { + $name = $q["name"]; + $a[$name]["type"] = $q["type"]; + $a[$name]["name"] = $name; + if ($q["len"] < 0 && $q["i"] != "x") { + // in case of digits if needed ... (+1 for negative values) + $a[$name]["len"] = (strlen(pow(2, ($q["size"] * 8))) + 1); + } else { + $a[$name]["len"] = $q["len"]; + } + $a[$name]["size"] = $q["size"]; + $i++; + } + } + return $a; + } + return null; +} + +?> \ No newline at end of file diff --git a/module/proxy/lib/php/main.lib.php b/module/proxy/lib/php/main.lib.php new file mode 100644 index 0000000..73f5012 --- /dev/null +++ b/module/proxy/lib/php/main.lib.php @@ -0,0 +1,29 @@ + \ No newline at end of file diff --git a/module/proxy/settings/module.php b/module/proxy/settings/module.php new file mode 100644 index 0000000..9d92633 --- /dev/null +++ b/module/proxy/settings/module.php @@ -0,0 +1,10 @@ + diff --git a/module/viewer/.gitignore b/module/viewer/.gitignore new file mode 100644 index 0000000..14bc68c --- /dev/null +++ b/module/viewer/.gitignore @@ -0,0 +1 @@ +/nbproject/private/ \ No newline at end of file diff --git a/module/viewer/README.md b/module/viewer/README.md new file mode 100644 index 0000000..7643c3e --- /dev/null +++ b/module/viewer/README.md @@ -0,0 +1,2 @@ +Mapito-Viewer +============= \ No newline at end of file diff --git a/module/viewer/example/index.html b/module/viewer/example/index.html new file mode 100644 index 0000000..201f21c --- /dev/null +++ b/module/viewer/example/index.html @@ -0,0 +1,241 @@ + + + + + Mapito + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + \ No newline at end of file diff --git a/module/viewer/img/area_off.png b/module/viewer/img/area_off.png new file mode 100644 index 0000000000000000000000000000000000000000..85b4afa1349eb62f12789392f9a3bab8ad497256 GIT binary patch literal 1804 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`GjEX7WqAsj$Z!;#Vf4nJ zaD4z_MyE9a>QWe}Xi&D$;i?WOTH_Q70%@G8tiSYHY zO3u&KO9Uy=tH>>2u(7WwNKDR7Em25HP0!4;RZ>t;P*TWDu~iB;^)>Jx2u>_f@Jh^6Ffvy#GB5xVMpnk=Km>FQ z7%16s0co3}lr*a#7dNP#K%T8qMoCG5mA-y?dAVM>v0i>ry1t>MrKP@sk-m|UE>MMT zab;dfVufyAu`tKo-FP)N_diaEtPap@9bs zM*WJ!0)0b01AVy3K#ev)K`ZB?)WnkfqLBRj96Pk=P;d@5wgKrxQG~D+p+D6nu_VKEjt+vp<%@wyMN%G`Znl?u~OdoI4{pn3Gh4T)B#hy7ZTKWF@T^@?k$ z2sbykjI6Apk_Z>;%z5+Fx|Dhhj}-Da$Q(aX*mF%PnI|f{N#VhpH$Jsmfo8Ksua`dk z_b+bN*=19_R4XegCe+yJ&-FXr_Pp{@rs_E<3ciTCgdTP|(-X0SZV_<0L zXf;R4X_AVVKwF~!I{#cNV`FEoo40Q>ClnS={QS9CO&skQt{rAvr19w6w`)#T zbNPP%{%vD#Klx;ehFJHut}RS!zdm3{=3y{5H=lAkb=O_JsO)Ler{BDJ^Wl>xElC?Q z7>~`6`@5fIi4a3fe7v!}z5nW~N#*6@4O6Fz_VxGAoHc7xt;eL4f&;hRx;T2>n2#4` zY>i^b$<1Xnu(CS!=FOV9osEot_3B&JtXsEf=gyPAepyZRO0{S(Jhsnnsk+1XnXPh7e*X>R*{+gJbn|A#+UpTy+yEXQ%%D`3sV;OXk;vd$@?2>>)( BRnPzc literal 0 HcmV?d00001 diff --git a/module/viewer/img/area_on.png b/module/viewer/img/area_on.png new file mode 100644 index 0000000000000000000000000000000000000000..cdc950e28fdbf381b155c0e36f262b93858718a2 GIT binary patch literal 1830 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 literal 0 HcmV?d00001 diff --git a/module/viewer/img/collapse.png b/module/viewer/img/collapse.png new file mode 100644 index 0000000000000000000000000000000000000000..786457493785e876b1f06ad07419d64deecdc216 GIT binary patch literal 1289 zcmcIkO=uHA6y9PeX{6BhApRU2R|Fx=&h92{nq`yPW?PeDVr`;EFFM_wBulbC>`vWn zDI(%QkAgQZUi<+;6mOoyi$X!LCojGAASm|YQK+*?nzTjq)M0jh9^d!gn{VFEgZbk5 z!N~Cl!!U#SoU#zi!58kQqw{@pl};gdI$sXcwi?#%)BS**yXG>?;gR6$Ti>|-n_`B^ zOodbm7bMj(IHXyNnDY&rktcl{sSQlPBChFXngsx`K-bdj)v*F!u(Pn ziE&O$imBxIC@3KU=8y@*BoKL?4x$uK(oU0UH8vBWv+QV9X+fFo#H714TPMVpAoM(s z^WvQ4)S!?`r64atQH)VU%w0AK@?)lZy6t4gkAhv*(QTqzCJ6kZMQe$qSvCmNZJom* zyBo-KJK|9pp^t1Ra6IgKrbL+VO0rC@{w|Jf+js}R5 zRV5yBFte|wFTOolq?lY@nJS-sxUv3bfZ@ZT_uuB;ZHIpTx}uNV;BhFreNO3n{p_jw z<&^h4`lx=WACms)i_xLs4^M90nP%|gV_$!K%zj$iIx{qTnLBZ5XpQ=0@-s!{)%4A~ Fe*if%OX&ar literal 0 HcmV?d00001 diff --git a/module/viewer/img/cs/about.png b/module/viewer/img/cs/about.png new file mode 100644 index 0000000000000000000000000000000000000000..e558a6343a860dca0ecd14340b714e41d9986a66 GIT binary patch literal 4289 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 literal 0 HcmV?d00001 diff --git a/module/viewer/img/cs/info.png b/module/viewer/img/cs/info.png new file mode 100644 index 0000000000000000000000000000000000000000..dae7ca541a8aa7a511a722d22c2373d082af72c2 GIT binary patch literal 1577 zcmV+^2G;qBP)WgN%9&wK5%F3WwXDB_KHCMX_=Vi}$oqp6vu zd6YRrj?FkRW`~n`rK6b|<}sxvqLfGIc+`q`B8Z470~w;giW}@MF1zjZ>yOGo1zwKq zkH+uJ^T+OfpYP}W{hsH2-gklLdah?ACTAd1PMF=0)d~=sN3c7YQ}nNNYd4{&_Sb^k zywj(1lYjVjYox$859}f*y7!9Q2Vh2%z~}Qy`AungBEU5Z%os3Kr+I3!EI2y;HP?GV z5l(?`9@s^MZf*Tt887#J{DR~r5>XF3(5jg$47=UVL{a>mF;*n+{tqNuarwFAu_YPX ze0i~PH4D6gQ?-jY(IsK^y#{@9LFw65N$WOTk8121tK2n+jPf20pk-ja*oGCW2Z9Op zSe-6d%L?GA(ZSQl4}GJj0wLW19BeRGw$+7|j)l2p=3t(yyJF@drKzf7>aJ~jHTg$3 zDZX021hENoMti6|j>%=WNJPX{S6BOAEi=s@Jn>C)*FYc2NZq>PnL?kufMqK_PgO_~ z&5j#!LC)X2Q=y(LUpJRX0IpRSWzDjiOHM>20M_~;t$57~LLo9mb3 zUo6W`ThoCTr8<8X+*&C#Z3d4yroE!tk)AEsl^U$wk#c0=q?g7wy^LB~wPN`NwZupx zarF)*2V!8vx%tt|Wt*)xt1K~cxw5VH?HTI|iMPAB`tD-@o*rrh2YI7^zZdSrM|WKl z;x3+%%av_)Wep9fvN}8)@+c(0T_G@y-I9x=Gs`e3)x{V{F8g0mW$CZ&(w4t+bo1;k zC)2;28zJYHZ8cHp5Qn4KQ_gBIRJPfo)sM`{(J598XrDoJDZp-T{Xmj}FV*FjZM8OK z=eZ+aZyYG{e1kq00pDG|#g!XtFf%HQ{4{P97$}%xC&j0S$BloBvF_D!tjF}p@=q@? zK|!3@@ZcpSfpG+YI6)#NNCYq%5*Fe-zxTt*Pv*+D`o&jgS*UA_S>Wn#4r2`W?i+5U zZ%XQ2T69xburk@A_G|0>X6?sr7xT~Z+Ye=p2e7|M;NERL-{{+UkV3}B3iI zJx9)9%1)!e`*ti>C~#ZFlLbsfU5^CW&Gk2o8I2{Lys28-o9Zj(>}U~iO7qH{PjedCRa>U;+B2*ly>^O zMUe#+76kQ;!+@CK2=HhP05Dmqkagt}ZfB&yOR!+|q8XQGjZw$2LF+9|uCTWB#n}lH zqI)?xPNdJTx~wpp7$jfkG=5)rYRdUHbbl!XR?=Vj88eO)B2OR9i7l?Uurkh8 zV;W+!)jS&3inDS1HzXGOXq4pJCWJoSp7KtM!3HAlrMrJV(aN_YNdlwEQK6Lb*>pO+ z>wP-CD~S$om`_XM`;(VSAVKLx5wljE*k3~4EiV~>-bMo#Z#$V4&|@TVf|@wS6VGwP za~yGuC&nwuBXls$TYbQg`J1uc<*2Pj9hm@7R89VcNf}ztX>h-x_xT2kYAT%?1O1{aXOgS!aWI*JgtmKrny+Nn&aVrHrx4rsO@> b|66|oW|C(JBKd7I00000NkvXXu0mjfI}G|@ literal 0 HcmV?d00001 diff --git a/module/viewer/img/cs/layers.png b/module/viewer/img/cs/layers.png new file mode 100644 index 0000000000000000000000000000000000000000..b5f909db26bcf3c86cfda76c25e624efb29c4f94 GIT binary patch literal 3138 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 c?f<>~8~AB5ZE5Z+jiE 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 SCH}Gi0000C@t-AD)|5V8>1IGn}?hkzv^ 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 literal 0 HcmV?d00001 diff --git a/module/viewer/img/cs_w/biotopy.png b/module/viewer/img/cs_w/biotopy.png new file mode 100644 index 0000000000000000000000000000000000000000..b7c2e52a77d45d69b0d725c2c63ffc0c1d98a2a4 GIT binary patch literal 6882 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 literal 0 HcmV?d00001 diff --git a/module/viewer/img/cs_w/editor.png b/module/viewer/img/cs_w/editor.png new file mode 100644 index 0000000000000000000000000000000000000000..6fcc22a084270370821675a791a25bffd2a3da8f GIT binary patch literal 4285 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 literal 0 HcmV?d00001 diff --git a/module/viewer/img/cs_w/info.png b/module/viewer/img/cs_w/info.png new file mode 100644 index 0000000000000000000000000000000000000000..e14562ab9b9104635ed38bc9ff1a664dd9fa30d5 GIT binary patch literal 1677 zcmV;826Fj{P)TiXVJNqozhhaM@CjP?RE4Z7mO5=mTm?yW4$sx4Sz# zbB`YcY-Bq-?P^Sn|75<*z32Y!z31F>&kVr-`mc*9HO{ZxHD9aY?;$|wXa<)g+1)$I zTG{Z}wTZvB@k)j^i{Y8)?!V?{gHEyAu-aaK20q>2{sjQkj|glw3S-Ax4WQviwP46H zX@L+lBx_Ry`v>B`9d7Xy=>%?6;P$fvzzFe=80_{-Pdh$puoEPTu`rwnApvXKK+|Y! z|1l}9q-={*EBz)~0g}4uBJl<(?All!N*larI5k5AoEFIoT~J+LG*F`kfz-4;p-aFl>27=uHWkRlx;R>Cak#Qiae8EfKT_e4Y&ib2ll*lYrh(BTC%Tl=05mxU86e? z#in*IR&1z!3o!X4|8|wGc9vJybs!?*vmgB&C|l*sRbw~0TsTyO=s50=MHb~-%p%7M z)R-yyxO9!v4nP+Uw|xSoIX4v9D&`kYyzq_!Wod&aT8&lfmdu!?(J*)Y3QCh92gP6 z7mmwKZC-zKyZ6mOL01KYU}|iNlxbh>x=bK=B{G(@ALWQBNzAL|=t);qxkn9964GZ>LJlHn%xVvPP+fhOoXT!=HO&zD4T0jtv!-mSD9MM{zdRN=B9WZ{;7$uX zuhMnDb&O^SC3M)Gkr`&@+KezRQxD^_3>h|C_>(&}?dcB=%FT?4JNCV_VC03sqni)> zbMCJDx)}ypMUnt1}G3dxd!xIMCc1-up{W1;a<)kayg;)qwo}l#66P1BKBa4&rf6J-!MFr*nMu6FAFb6L?7uT)Kber& zhn#$%u|q*&3%U!5|k1(J>^03CemB;rP+d4|HtX@k5s_9%n~<1D*c4P@<=q zF!t?leua}gp+H=gYX3S`$^_zYIOzBBnPoX<{ZmsXnP=o$jbn5g%Ev^OIPH#vTDpTj z`a{vpwJ(UGUwXe+g0D!7gdY(#eUAw#TjjxZ#`hzh{rapfZw|sRh zKCjZX*5PoZf4~1R>s_U5{d~K*}2z@A#VBVm^7zySB2WKQ+%{( z9=qFqsfMEjI(oxUeV`pX`UYAeQMuQk8Lj3r3dieet%|^X+!W*V%_#`Zup#a@Eq3q8zy9GV9el zLxZ^h(3T23tWWHYFD+J+#>i0u^(XqUFBn@t6bb;af8)ab$YAWry+8Lv0RZxB83HH4 z_*76uFaTVLc}fTnibnE4ob<-3A0C1{1g!vp~9W*j+^-5TyxQ{erte?`9o X?a~jFd)Lx~00000NkvXXu0mjfqq`lo literal 0 HcmV?d00001 diff --git a/module/viewer/img/cs_w/layers.png b/module/viewer/img/cs_w/layers.png new file mode 100644 index 0000000000000000000000000000000000000000..6d7848886632b64b0e91d354ae59403a523ebe1e GIT binary patch literal 3236 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 WbY2_M01A8n0000V6x#?wLXiTs zhF;scwAXb}M61@Tg6Nu#wgPgs<)PND+EUxPERmPILIQ*UAt(fdkOUI)&XCt+CX;!e z$KLl3gz`ux6T(_|t$X|ZZ`SXe-{<_!*}vcZ?Y#&1m;SGdL^9^Sx-U!6@K5nPG`Hhi zmZ+zrE8bTAhw0MIHX+iDF=n;h{j=R8%j;QrxJxSd{R&&J@Ma1w*TV8#fPGsY)A9BJ}nKOeFH@d)unUX;erFiShveU=$a(l{SSc8r@od zP-6A%zK-*auD!uv;LVbCi!Vn51^OwO3tu@FBkFrefqj1O&9=NPTX@eI(-;ON4iG#+ zC>_UE&+m#B*e7_#OIvhtM)Rt1!z_;x0#)x+W^ju|`4T7Gfh%w>c`1z#L%s62eG?HxzAA1z&ey!Oe-(hWP# z&tLs{#q!^6uMC*lvtgbQ5HWaFlEdq$rJ+5fe@wx07kiZ zgI0hnGx&p|j{x4FD8pjZfG5bx%iF?dFV8nvjp|gDz(JHL1diM?kwkvgU~QMX12is1 zgVD+6#o7P0JDDSxnigjOWelRi!W3LhL%R=CGvl!MzKm7$uGm8vBa==n|G|W*0MO;A_3d8x0&)$Auyt!`fL$1u?M44V({iq@8%zWC=&utaJ;Hh z1|cU7u9@3i+2DS4!;Y#@Q>PD-OwsNN;$n*@8dl#C13)my-d?}6>boy2o|u(2!UBad zl-D{@aI&?qP1Ab_01m8~_X&A@Z}qXt&L<5TeoRnQdhQt)zi7qq$%6vlQmb=T6%5x1 z{F}q#^|NG3L+#zcLMn>C-m_*wpUce!wlDP-y{UXshBf(Iy{o3trJ8em-2(%*x&8Om zHrtiYV7Jq&fUut%tEjl~phU|t1QbFp21Qd1Cv*x%wbsHy#1(DL90=TyMkE=bRdEQ06*PAGSb2@Jp}x)cp`_KUFR{;xYG4hhY+JFg*k1JM?ys5| z?Wdzx6w3B~-NF|Bs%UGTZHxMjfak8*m-pG>x@*&hHz2asE7MUqYcWlo63$Z-&A(;(&b(pI@^Y2n~on{xw*Wf zxzmR^-$}*TRMXRQUMn&W32d`5E-g+s-E35&{8BeI7uJ4M?(dir6vb_lOd%@_9)Iwy z(-+;d*6*z9cWn9}91{T8tVkM+nX}bcbb${jtivM7;UB1MlWsIN#_# zA<7g<79F8HOO6KIZ?ngT_18KHk6#K=h<)a9wyju`peLi%0*9cefFmTTrE0$s7yfph z%j1_qi~%OSN=rGx(#PXHk*Xy}pIbOF3jk^y9zQ41JJ8U(gVp|!^uWmE7!AkB6aeS0 z+Gb5j!K4i9&r)M`FzQrrI0HC+$#p1Zx-Y8PDRM*a4(+dQ_Fzn^83v8;gX?WpqZ(t= zOfc$HXzB7}U4Dfl;1gHoFS&JL*OwwU^c?%kd)vof4M_$bp`}~ zNMdzuUhk&KRRtK`lhyd8CxV8IZB!sJYzf!$^Ib z7xurO@drZkr)sa{95T4aB|Y=E!;NeEvug;QUf0&U?)gPox`*yg(QP?Wf23&R{BShj zp^D_ZUa+d9qK$<`g+0BYv}*3l`wh|DIMi)pMrC@ixzi7|io<>56DJTA#z%8w#8*A{ z<^2Z6OCu=H^_fmgp%#--^TzZsSC&iG7&R!RQLUXKf{i9&(}R=KeykGuPA7v_P|eIr z5=N)Q003IL{FLzWfT=VfI5}1~Cy$JcNwjETF{lxiC>-5>oUZNmpRRKr?)8YT?SJ?Cm4kuz4}GI>%(ELy z8)_Y%z7Hh6mBZ<0FMs@Xd(Mje)9wg(vAyU|7hC@c4T}o9*xJL&Yn`mB+0DEGkzHNh zba_JTC##E(XWNRSI&AJYooqJ7`BF|U%uI~|WemH&YGI!h*PZG1ihBrH2LsGTo$%oN zdq&Lu`P@uC-lV~d35oaa_^N3XfU4UDmtnut+WdgLJi(+{zxe)iq$e6Vo?%!t;QkwWl=ZlMl2@S&9qtfh1xK!j0ziKL5`{5g zM~gE60O;|HARITeqXF3Mw6@i=qsHOExM60*n>0^l+qM|5za%ej3$NnovZe#f@U8jwNjEI`BF|0&d71+=p1IVGSyNI-TD&2*-4)EeYS(K7 zOde$gM+hFAoQ$cNagP9as{DZ+PDb7mjl0tZ?$aW@#?UoM9krVbmBrMo3pZD z+0DKqMjQys-m~>C^w;b~qv~c42xGT2fDyrtF5fR--&}t0ZBqddMuQrSyk{sr?x+Sn zxL&z8f#dlX4O-O<21dO>xg_KZY${oQW$s;I`%*84)v3_HRcN2*x+CE1*Y;(MPBQLY zwqX2($s=RI7{k{Wo!GRi>S%9UXaRt*EgFD2Rg-V_fwgmo{$GLxZx()B z+2p=uq!yiau$fpLxaFu`+c8;e^WGp0v`1Zk`AOHW;{{VIFxi$O)&o=-7002ovPDHLkV1hu_PTBwf literal 0 HcmV?d00001 diff --git a/module/viewer/img/cs_w/login.png b/module/viewer/img/cs_w/login.png new file mode 100644 index 0000000000000000000000000000000000000000..b49bc102477ffb6612b6b96c29e2bfc0073f919e GIT binary patch literal 2397 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 W*xYt_bp%-GGI+ZBxvX4nJ zaD4z_MyE9a>QWe}Xi&D$;i?WOTH_Q70%@G8tiSYHY zO3u&KO9Uy=tH>>2u(7WwNKDR7Em25HP0!4;RZ>t;P*TWDu~iB;^)>Jx2u>_f@Jh^6Ffvy#GB5xVMpnk=Km>FQ z7%16s0co3}lr*a#7dNP#K%T8qMoCG5mA-y?dAVM>v0i>ry1t>MrKP@sk-m|UE>MMT zab;dfVufyAu`tKo-FP)N_diaEtPap@9bs zM*WJ!0)0b01AVy3K#ev)K`ZB?)WnkfqLBRj96Pk=P;d@5wgKrxQG~D+p+D6nu_VKEjt+vp<%@wyMyU#;+yBTtExo-DRK8X)FdsaZT_KsjU~a;5%_gxXgH*L`O;#H(9Xj;v zzSg5xJ+mk9{(ew;`1gos~UW@b4bUi{wD`a1*WnJ)Ag~xeW=Brx4Ye z++L`yVURws{VMB5NB4~XyvNmD95P)$yibWvzZnv`nD7gu(w7%3|r%F&j05+A+Gll-_w!CqJ)PT8`Rk-X>yw9aZ+}|ebID%08R$v|Pgg&ebxsLQ E0KF)4761SM literal 0 HcmV?d00001 diff --git a/module/viewer/img/download.png b/module/viewer/img/download.png new file mode 100644 index 0000000000000000000000000000000000000000..92f29bfc1da51996c9a39cb7c2b33e059d6b0e59 GIT binary patch literal 1383 zcmeAS@N?(olHy`uVBq!ia0vp^d_c^@!3HFQ8hUO4DVAa<&kznEsNqQI0P;BtJR*x3 z7`Q%wFr(8NlNmrki4xa{lHmNblJdl&R0hYC{G?O`x6Go{^8BLgV*kzZen2&1AT`cK zsfi_-`FRQ;{wt)MJZ`kK`w4kJAph~ zrHqo20xNy}^73-Ma$~*xqI7*jOG`_A10#JSBVC{h-Qvo;lEez#ykcdDAuw}XQj3#| zG7G@r1u{1=DZjMDR!IqD5gb50mskL|D6beAc)(!PuShJ=H`FuGhno!4Xaf|q0>?yt zQAmD%jvZQrDL4lk+kkYUC_>nZ(4Xp(SdwZ73=a!kLn9yxF)*|;F}5-^h(gj2QG}-5 zH$NpatrClNQzI)wBdB&HMNsWF`k;V73K(#xgZzXhu0SBbQj+1}RZv=#1CExIWc}2f z)ZEm(l44+(8KQ<+O0rd2eo<~>iCt!HVtT56L0-CzK0*+$`yj3cCJSJ))Q6`_nA71= zNfQPl+-YJw#86sVlCfI51z3D6^K@|x(U{mf(U9+u0gr3Epm#N=nLu@3aG0K}^`+Yt z?mZmm8jc$Xgs%$?_?L3L?w4oX4nJ zaD4z_MyE9xV%QuQiw3m9zdD+&^mvr|hHl2X$%^K6wA z6cm&cGE;1o!cBb*d<&dYGcrA@ic*8C{6dnevXd=SlRtPXT0Z zVp4u-iLH_n$Rap^dM>d5Zc$z_H1L4Is9%v-pl_&Wpbs}0sL=)}Xysg#npl!w6q28x zV+ZlRTV_#ed45rLv4V53u?q!pi6yCa!0@opH8j#SG72#=wlc7^GBJok z(hpIDrrkF`B{QuOi*{opD?=lwb|ghm?Kb+LfItcuaHxa)geFcXz*3Uo;Z;ytlmm{I zlw|$XoYdUZypm#Im>HsmSxT~1T7FS(Vu@X5Zen_>enDQkjXpvUulpdb1||z&vebvC zOPJH)QAra9BHU?WJj761TEaN>sxGKF0Tm9x`DrEPiAAXlXerizv%DVz15>D{i(`mK z=iRCMy{i&Mj@f@-eRpBYsdtYa1ZZ&V^E3BsEzs!Ruf(Ipyz$%z2}zaE8~4#et7=*dGX!;`3JV; zda4Lb@>{Mt*UwvNqQLEK?$Wb5zD#*+apZAf=h37ft*J)}Wp?h|IdSn~WguUu|M<~D znV03?k~9AXEtxW@x0m6( z&s}eNa$a8F%a@rtrysp}!xMY`V(Hu*v+n1WH7D2gPnr@0wC2gfhmO1MuG_O`PeeZ<+F)=4Te%z?BwC&cD{~i(?EC#-lKYuPh_0*`pzrVyvmSNkrZ3aBe zQ>TiGiHmcxFgde+@x6HYvT%NWKF_UBot>ODcK0tlb6C%Gy>#ckeQJ|WPViBCSz?uw zpU+%SP;lVP8J^(a;44|CG1p~d9Tx^X`0!yu+3w!gyMFww<2ii5fTtwZ{j!P8`Q-BQ z=}rp`tQ_s;U$3!~?{#bb__46*pu+0at9A7Cjm^xCJ$a%s)vGl?!^LjCywv4=)faNi zQj3d)&wths>vmBR+;vy)`}gl6-L61Q-rn9Jt3w&|^!3?=YsCytZ*tL8T^ZsPv~r5Z z(j%L61O=5QcD#B2{`AR{ooCLU=kLjmXN`9>k(#=7tLdSK1`i8n?A^O}pVz*>v+mu! zo4I`X@-0!iQESDlt*uoipPYC5+mVuxN#&}|A9B0@xdL^SACg!6!L$F*=|A#6xbMZ+ V?U`1UQVUFk44$rjF6*2UngAFmR{a0~ literal 0 HcmV?d00001 diff --git a/module/viewer/img/drag-rectangle-on.png b/module/viewer/img/drag-rectangle-on.png new file mode 100644 index 0000000000000000000000000000000000000000..e8089101022f2bc3e260d5d8bb06c5a7563c90d7 GIT binary patch literal 1795 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`GjEX7WqAsj$Z!;#Vf4nJ zaD4z_MyE9xV%QuQiw3m9zdD+&^mvr|hHl2X$%^K6wA z6cm&cGE;1o!cBb*d<&dYGcrA@ic*8C{6dnevXd=SlRtPXT0Z zVp4u-iLH_n$Rap^dM>d5Zc$z_H1L4Is9%v-pl_&Wpbs}0sL=)}Xysg#npl!w6q28x zV+ZlRTV_#ed45rLv4V53u?q!pi6yCa!0@opH8j#SG72#=wlc7^GBJok z(hpIDrrkF`B{QuOi*{opD?=lwb|ghm?Kb+LfItcuaHxa)geFcXz*3Uo;Z;ytlmm{I zlw|$XoYdUZypm#Im>HsmSxT~1T7FS(Vu@X5Zen_>enDQkjXpvUulpdb1||z&vebvC zOPJH)QAra9BHU?WJj761TEaN>sxGKF0Tm9x`DrEPiAAXlXerizv%DVz15=8pi(`mK z=hbO@y%kBPU-4S-geE^LvYFmt4hsT_ik0^@4O?<$5M3e^W(~*dy^N>Sf=@9!z2cCb8|2K zBcFfn`SYT+Ap380!~5TpPCs1|q2skNVoHpj`o8z&-_QD777={-`9#|0NhedDeE1NM zwRP5=yLV3>JlL3GBzZDzbI|ImN!PdXT{cmbWH;q;zIOe3WNd6|P0gIFt*1_(=DvLS z@|4r5diwgBQ@!rozh5pt@%?WhSHbM;Y#$#V0~?#3=aqBj&0DleYtnZdu&=%NZsN5)u*$Q@tKq@U44YR`Nkr$@j8>@8r#!jaOaO z`dT$NZ8PVAXV27jt=qh1%aJ>GWM(ZZWjXS0k=x>fuU~5`edPS|{rhAO6|1h}Rvd>X z+`b*1mX@|br#o%)$!pid7@ii*oH$Xit*vdxjvWd-hu_Is^d0{9&(7c9za`PbXr{~c z(vn#B&`=Rq#V)0?^72BN<<$+jx4o1mK6v%2Yu`S*OD|1MpFXXlr#H!Ksf3KolRtmv zY}{y=bNgLI+tF_aFJ2T}8r1ptadOP{)UvW^+qav`$;sWgaYJFQ-{uV)8d4*f3TkWb z%3WDE*_Gw|=OYF@nj&058X`c(M;m{amXjwvZ{EH=*=woN&lIGP@)Kl!{T-s%TmN>-LvSXkJtb3c_Gw4Xfw oxt{qJXZ@A`|4)Zh)#g^R_rzKosOBD=3rv#?p00i_>zopr0LTbkPyhe` literal 0 HcmV?d00001 diff --git a/module/viewer/img/east-mini.png b/module/viewer/img/east-mini.png new file mode 100644 index 0000000000000000000000000000000000000000..518ecb33830596f2a126d4cccb8e8b9d6ef70221 GIT binary patch literal 360 zcmeAS@N?(olHy`uVBq!ia0vp^LLkh+1|-AI^@Rf|mSQK*5Dp-y;YjHK@;M7UB8wRq zxPc0}g%~g0t@{HMlrM3OC<)F_D=AMbN@eg(OfJgLO-;#6RB+2IN-fVX$}U#0*qU*v z0;u%9r;B5VMeo`v-hD?DcwD%zaO+KBR#|<=wEaO0-!aqfp3ASUeRz3o$`Q6`{@Wrf zlWuJ5)l_A0SSz|UY=)%AqgWM3p|mpn(4))@L0%Spk5wz(>R#-7FMc95Etny^NAP*& zqHA3*p5!lGC4R+mZ`rld++$vv3YCp+x=-iKHVCb4N^85_R4G{KF=Ne}kJr=k)#T1w z_B+1!ROa}Qn5}z)ca~%szY*^%$GE)QCvW0Z^Pb(FaNkZ?knuxxHlL8-l%NHx0pbRA)GEzg)e4vJ1yUroZiV4DX~*{n}{noCfqNgQu&X%Q~loCIBQa Bib?u6mhjk@p)q3}W3r8ko~iTx^8N+yJ?Gwg&gb59?mg%8x#waW?5~Lmoe}~7K-AjG z+=-j>xeh)G;zqTRtvPN2MVMN<96fq;dI3HU06ZBEFc*s-KYkp1=WKpI{Jy`jyT{qz z+hlMKx4*2h*^Kd>Ll%p*!aCU8m|tC^udghutt>K@mPo8a`XZH1o1iVs;@1yp3!moZ z<~FI-RO&$W%E9zxZz26)cl6HqC~0J@t}Yga1B*zpd=_V#b)BOD6??>!;OAYz@ zx<@Ws#g0sRc-lwMqau(N(L-2&|4|p`VJD}EkdUCDpx_{cX6UkV2+I%QVd^$u>e{d7 zMfLJ@f;!K^VB>Dr9nRWLCmI<6fq=EOnE@2~0{|cpZ7G!@b#-<4$&*r2{Sp!sSy@?- z@SxO*;{ecikQh$9qk+*h>rF}1ps!weyH%!0RJFgMav*mKy)}NBtj92zdanoZI%AnYK98%MF)k4 zDY^uO1^_y`V2C~#0$C_#o&^BD32So`7x$F@Job$dOPQYfF!#&Cr+F^phND*fhp)dH z(uk@{3@Pd^B{+^nUXHx1I~&NOZXw`GFrJ~%QL$7?K=mZJZP2XbQVF9SPF)n-Q<(*M zCLd@|m3l62{$(OxCICaSV=T34F|XtVNJ_^Z5`2`sytOX8G}uUR>`?Srx7-`n9!%A5 zZAf2zBw#guNyM&6uz;t?U0J4~H5fcyH*oJY!Ca?$w$Y&}REuJ4KLOK{{B9#~-tP%5 zdw{lcmS>eLmWd3~Q>>{OYYfQRws{rG*KgR6wbuIWTkG06@-;06RLs5Gy953@Sg**v z4WfI2h+grrMw2gcsT0gud__x31%7t=6r_hI5Opw>eM7HG0+{3B zRSs-ERqKRdyv(<=qQgz!^=^)R48};p*Q;l*WmTCycFM|#D$UobqqpPZ=P`Hn`TUa~ z3D5Iw5p!`&=?b#p2~BBh#1oO7-aCUD$OKGny`6$RlUX4Kud7`nCwB8%f!)$~Ma_62 zvWLY9BFCE~F~db-+P)32oJ=XzTp3pU#W@fnJkQCmXLt8$dPVM>214w?P^z7y5Wq2! z6+eRL(=4jHP|r)~(U3dcYTl^a^1K(HHK{IGOi8U2TNC6SkS_ zO{5+(v%eS6@3uLR{E31PKR;yPI(@3ZMAdR7`)1lOyo{V3%U50m6M@uj$6Ru&+&y)5 zoh49}9k=z`N&N5w;%i(DJmk$u0qZI8*uUx8)z2vjv3&l%dIpAt3MB(lsX3$L4|G*` zC-v*Y6h238jmBGO;kF7eafR2dVA{&A*7dIBHdVFblo=1%!Nwpd+p)d&->+(A?X&5# z&ext6zW?^cXi^>q>lHm8=&>TS!w8T`b!UicmVgHu|9lsRl44=LGV2Gu+hPu<<53$k zSPcesPYD8n+FaX47|oZPXrj&fDB8-oD=s!Flt$^B&5IhwF|Da3XN=;%ZZ5D2mNsUm z9nbN%q1X1RT1SR3J6AddndrbiY7JQakV{ML??)3Iv=(1CeW$n-e!%SEgLhU(>FKp;NbC!y;pEKS<}0^_&$$_- z?>+Qs}2plX!%UvS$r%iiUDs*M>OB{${CQ^!0Ph*EIK!fxFm|qARiPb zB*|Nf1-2k|aHyic#0BpDM?t6ItBS5mURWgUAyk<+Gwc8%lh2^v6OnlQ5BLqcAGB@| z7U?TAKEQWVWV%YbMwx1&FB! z6d}i`5+>|g5t7gS5txX#jdJ%a8Zl#cR`s)-YRM}OKNpvCfZb~eek%?@;lL+bl73{a z8j%MgLp=cz=(tS|oDp0m!MK7)OoRVWJ{O?!tA_ipxC37RSHVpf#_^b<1Vr$C5JHEj z1W_R#z#$9d8lpME<`*P-0b+A&8YyFo+eK)CA0T~{RtJ~RI$^+?xXLx2Re4g?uVW{2uPl=KN) z^nM~4CQJ3a(vrGop2D`18Zq9lxREt{6e5(j#J1yoV`$}nzxBM^zKT4R|C_gZ^%*7A z4QPWQ6Zvr3_Rsv-u8eTU>KJzVlZ09!V)oQ*e+Q3fsnTb1bIET7Y)(`zW+f^U8(X0O zA}RUKcQ? literal 0 HcmV?d00001 diff --git a/module/viewer/img/en_w/biotopy.png b/module/viewer/img/en_w/biotopy.png new file mode 100644 index 0000000000000000000000000000000000000000..c224e17ba55186078c657976ea2c85b92b311b69 GIT binary patch literal 5684 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 literal 0 HcmV?d00001 diff --git a/module/viewer/img/en_w/info.png b/module/viewer/img/en_w/info.png new file mode 100644 index 0000000000000000000000000000000000000000..c8822d787454b1a5ff5c4752a6893adc27961922 GIT binary patch literal 3379 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 TSyZUL00000NkvXXu0mjf9>1M( literal 0 HcmV?d00001 diff --git a/module/viewer/img/en_w/measurement.png b/module/viewer/img/en_w/measurement.png new file mode 100644 index 0000000000000000000000000000000000000000..a2e114ee8f18975ec901c86145e470b51b54941e GIT binary patch literal 4655 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 literal 0 HcmV?d00001 diff --git a/module/viewer/img/en_w/print.png b/module/viewer/img/en_w/print.png new file mode 100644 index 0000000000000000000000000000000000000000..3132e36ebb3d347857c940a8fb57aa20c144210c GIT binary patch literal 4271 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 RDwF^K002ovPDHLkV1i%nNcR8$ literal 0 HcmV?d00001 diff --git a/module/viewer/img/expand.png b/module/viewer/img/expand.png new file mode 100644 index 0000000000000000000000000000000000000000..a1a5297418556a0be0fb30288d514c272c921814 GIT binary patch literal 1296 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 literal 0 HcmV?d00001 diff --git a/module/viewer/img/ico_ext_doc.png b/module/viewer/img/ico_ext_doc.png new file mode 100644 index 0000000000000000000000000000000000000000..d8c0ef5bdbb705927a24cf60d55115e476de89ea GIT binary patch literal 2595 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 KMNUMnLSTYN;8M8& literal 0 HcmV?d00001 diff --git a/module/viewer/img/ico_ext_other.png b/module/viewer/img/ico_ext_other.png new file mode 100644 index 0000000000000000000000000000000000000000..668d1f7c01d77e5819a08038d01dd4b53c6ecc41 GIT binary patch literal 1699 zcmV;U23+}xP)~wf!Z{Exc?~flpmMvSxe)#a=)vH(S zC#W1J_(kaPN%nT-+uDs$-R5`Iuam^@$K8UtgNhrfgX~P3djJ; zKYjZ2vuDpdwR^0-`4ixxD zj~;#S;DKWvYU*J}4lTQ`ATzSFvvt)^7{mOCX1vFa9TO8%6q$}fixw>kqoJYU&Ye4w z6~&QyAv!DqMn*;o3JTu8fA4W}a?+8R2k8$VK17e_&!5-V*P|uZEHm5N+jWCTTw7aP zUtb?Yp*TVoj3f#+ViaAqYE@@vCqhr2JmG)y=FR%`>tO<1{O8Y~m8RH%0|x}Bz*J7$ z-Me?2o0|pUOGF8dRb;>(6SI4y``fo~rL?xTUcY{wyfG?uG1DVn3re_|X*oizD_5=% zQBZzWa|@Es0=l+_6z!_(XN+B4T~$?8rb>7BRTgAqG^*a--b5nNH*ellnt_DUmWYI4DkX38bXDa_8EJxfe&Xa&m9&`@$o#HovyxFBdRDJk(4a|)owVnE?%1ScOs zrB|nPrE?Jr%rv~}xN9x`BwUovFTD#C??9uX}WS#6LLW06Y$9oR7;IIWI+%tb)siT znwH}|IMe1pWuC5d?2C&feXh%yhyRotH>C>lfff*nwJq@4(nfhy{ zv|~1Qeu6?4$pS<(AaMT}u=}NwVv*NKIyyRfdU}ZF2K&|y4-dnU+;q`fwrufCAGYg7 zLEluzfUBrl;>C;S&!5L8UM7ho^+S{p6jWPVD~?d$h=6y~rcG+8 zj+4a?iXErGM0AtTlB8$OoVk4Ya#Y8Fyks=(UAuNAp9=j6>KRhnflpJ027u@%Mh`lu z&SQGe5Ee4a8{k7gF0&*!W`F_#rO$2hCVO_BtE;QQQ44A%lq02^ZpZ>01rG5%+CZSX z-#$NKZng@>peSa5%JmCM`Q&y7Kp!U4BP+;C__hcIlaq}NW_CX~>PoRx=b^PMDT;yx zlK}p~!9m57P^!(v|3fzN6?I93+V!&-w3ZfzpMko%IsqYt>kzLrC~}4QCqqrjCvSO> zAS>6tef#tWN2Z}E8a+G`iigkwyvBBdpcRtq*GR#s*_u*03a@R}H@Js8-X?b)+Os01@mW#PimB>HKLTp%z~ zn(*MgW5*6RFyOna2?MC(ntO;d?=a_)BS(C$rCEvw{205DaFQ-=3tKZ6=ER8;p?2KH zXfywzRyxiMJPgNvk7{aaNI?fHX*IVH(uq)>7^?dZ)o+WtE6Y&fV`!snA`!{#3wH@2 z2jV!bmoHylxNu?r{{3!HsNPj t)CdxAF=WwAe2j;|W9L*#48PHu&3~oXq&)QrDm?%I002ovPDHLkV1m8aCUXD) literal 0 HcmV?d00001 diff --git a/module/viewer/img/ico_ext_pdf.png b/module/viewer/img/ico_ext_pdf.png new file mode 100644 index 0000000000000000000000000000000000000000..76c53d89833ed5ccb52d9a427db1baa8aa5000f0 GIT binary patch literal 2687 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 Y0;~naCv6pX!vFvP07*qoM6N<$f&#YcT>t<8 literal 0 HcmV?d00001 diff --git a/module/viewer/img/ico_ext_xls.png b/module/viewer/img/ico_ext_xls.png new file mode 100644 index 0000000000000000000000000000000000000000..80f221c8b7ff0f305872df424b1d2005394a7b1e GIT binary patch literal 2454 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 ss3~GYOk;<{907*qoM6N<$f}%XmrvLx| literal 0 HcmV?d00001 diff --git a/module/viewer/img/layer-switcher-maximize.png b/module/viewer/img/layer-switcher-maximize.png new file mode 100644 index 0000000000000000000000000000000000000000..96e4d7f7f6b6070dfda87e7561eeb8c04547471a GIT binary patch literal 1314 zcmcIkO=uHA6yBCvV`{2GTZ;&etDuJ_`;)aX%Wi6$v^HYW&;%O=q1)X_x+d9OcBjoY zdJv_cC-I<2L6BB2QuI)~d8nQQd-C9+g17o}5Cuhwhw5ySCT$Ttb(r7B_r3S#o5$Qt z#7}$N2iycfc%p-mVZ65CA-J0HoSB?ChnFU+FPd`UcEzRKz~^1Y;CYK6+~1th&^OQB z!R`!) z$x=KemvVAYA$vk@!R9f!0FeajLSD0YTO`XqdAxVb6bZ@@loQEbCm2Y_5+JOb5O6-m zE7N`saNRyOzy<@|T_7nTa7NMq8vra#z zPM}(=UQRMh=FlYYTr zZUWV#*7-0ZAsE7Xob)oRm*G-0!!v%KWiD*sS3q0nFyrbb)e& z*dR<~i7?Ee!?k!yMx6K1~rEQ(CQJS;#BSy(e>vu29SXLPe5p^#dTvXC;gtU%R` z|IDwFH7*NWmQ<}S*Hf=O<+g0iTYt_KlMfR!+~?mTOD&gX^N*M3>4l4&X}6TV z9yV@G5_`d^t3<=v{^1%sljzs*tCGwZ%f zd|GgC9LK|_c^Ty#l7fbyqma`mp{t-tat2~B1XF2MqyYdlNGl?JzCG*=YkoMK4vy(C zIu?n^V;R}2&|N;OP~ZtT2eAYSxvXmN1(7as@?>wC85)#aa7LuN&0ruN9squ%L*RC> zcG>B219yjm^Kf2I#|aRXFgPWtfb#&(=_C`!yF8?mWJ-AjFV$H&Q3h+#;A&=f?YKZmq|8w0??54w1(421tzaFghsGP z(`KM*t6Wafs)1CaA|8>EDM%W_I-E?EnE(Z1eZ**kxfna9icCi?qrbSQIsG*MyvTbL{SpwB^^@RD)!8a zwg~aL9SU^E;>8~y7j4%-)2@}dE8<$hw$zGk4YS9XNqVAh-};%(_b=-|MGu}W9%y;a z+${X6qb?x{t@W?gH|{+Wy!B;nq4n#l#Pa-fvp8RDUVl)Gv_HBL$ z*7awtv(oFCqV2l9iJE!xEp+_*>Nv_;Ogvb8yzt@OohjV?w&C*br4{|z;+u!&mq&$q KBY~$qiHScT?qn|j literal 0 HcmV?d00001 diff --git a/module/viewer/img/loading.gif b/module/viewer/img/loading.gif new file mode 100644 index 0000000000000000000000000000000000000000..1bb002f0fc4e949ec0b74e767385f39ecb7895d5 GIT binary patch literal 1359 zcmcJP{ZCVO6oWMl=zv|^JXBYoeDst^g}R7=Xsc#z-VGI5;>rH`mwKH#RmlJv|)?h5GyZgTdgyz`)eh)RQMq z#>dAeCMNFQy*o2A6Ap);J$p7XGSc4Oe&WQ5+1c5yuCBJWwg(R$csw4j*E>8s+|tt0 z+S=;(`(M6%+1=eeKR*xtpF-!^IsSH2&x^vJ&0CVG6( zY85kURB^by)*`IK*m0Q4eCQ~^;@IVsFVW*>E}asOF+@qp)-y~>A+_==l*OTH5^1Sl zS3%c|F)r-##v`s6(`QvIUOtb7BSwacQ^0XC46!)(c0QGh#~QAhOZ9XdGQfCe0R@K* zG~B0;$G5s?^Pg9}D2RkZOmchbA>By0If?vLP*D*4qvwaqDV}|!J}p(%=XziMi%+UN z-*BouD_BEOT788pmieCsyj5j5b@!Qjk&B&6^IHu1^C~&42iq>iUwS0(VOb2P^W5=k zb|Go^*RC_Rh=V`vyC=JtwK)r0b$`i5M&eBD&Evb+6dELSm~yXQ8M+w+Ub^q{> zIF&8VyOA*@eZ6J@pnBkF2q2StyT(=(VT)32Kw`&eB%s?9lgWejB$DqGktt3FnUM3EB>}8x zCq!90I-2y)i=A%eD2nr0WG!WSX_-^T+N&+EG%Fb)srPdcd&`{_XVoHfOJ})moe)@S zeh+kyeV|FQ0X~+POrRKz0Q5zvghbOQ&|x;dR99~mFEZ8(nH6s!1%Usb-sWhE(i{%A z25L^0i@Cj}cLY3@nt-pBSLu~?7i2kwswLj{2s2s<_V`MqEBB`-<6>Jj&2hwD9Zig~ z)-KF-R*RWOoqTiC5s5%rl#s$l=|##nXdEDn>an7NA4dgOa|Oq=o8&S}JxHxxyhoJD zL&xJg=q2eQ0_LTuP7hcP^@Y7H!WR$cI3IDuhi|24FL&~*EAye;^-_VvLLf0z6Glh* zDG3-2hGKVW-$1cmi*+C+nX99B8>`FwP3GahGcv8J^CjmNnwlVZYe@6(lx5Y9O=ppM zp8A~Q)5y2hx=7Pn11xW13J+I1ste*sR{@*pauiY^H@cM?gVdK|j93V!y+wO9*^_z5HgG4^L3z7V}jyi~oH9jX1^@s6-qmI800004b3#c}2nYxW zd>{!xLrWaJ zX<&2cGVi$Fn;O%iVYe{MyHLDr%-V2_xvjO8>z;f5pY!~B(I&gQXWOOv!Sm+#{eC~^ zJUq`iKM)b-TL3BqpV$ImaY6q141yr;lH{Pea?K`7_J_s*Z1~qu0LA{m!uFEVGNt}R znvO>`+EI6&0->-b`9mK7@XeNGlYpFJj6Eg$Ll>UdxOLG>)yD#&C_m6L_eXI0#8z!& zu1$!F8;$qHqacvFaI5b6@xO_~hUwT#g>XhkGhuXc*9~3CGgmyh8KM+`BnLs9qpZ9#&tn=Y;?3`BhMuV=B3A$aB1&=YwtpKxV$BS! zEZ>Nl!{6bBEe$x(m_{HJ&VzmvJ8ZeGeTj&!1G!h~VMz}5)_wGIXvwliJ-6spzuoIW zW8_)IHnkN*G!6j5lt@Iw#QD)gORZKg5kOnhPL(@${S+_<3IL8{9=qG~W45;|SrG8% zwJ7~QbZ5|Y?WXDd94HYPmZ`oIJGo2c+?^9>Xc;70_UeYNR1*=O6*>uyXEWnH*E^c| zOl^8yjvg{Och3`1=S(dR3IL|AyxIQ6K~q;JJb}XlX{3^8EK^r%y>w3~5#0tTcBQSs z^w4nb)3;Q|vGx+tp9Mn!z%;V^QpwZK=+G}Y{mx`7{V{sCpSasRTXt3`5sh)zZHRwX zqfYg-?0sB3vtKv=IULW=dQK<+xUSte*ne}P=hoK%fUnNJXK-@Q5z(!=a)nINs^TTf zv%BBFN|GF$08sp&rzsI35G=a3AY5XAvF-oMh@O1g$9EK2H literal 0 HcmV?d00001 diff --git a/module/viewer/img/marker-gold.png b/module/viewer/img/marker-gold.png new file mode 100644 index 0000000000000000000000000000000000000000..2ff9ec52813915962a1f15d9b481cb769b102d18 GIT binary patch literal 831 zcmV-F1Hk-=P)X1^@s6-qmI800004b3#c}2nYxW zdR7i=X zm0L(uQ51&1J>KS=IZl?TU6ANPJtT>sX4w@Xirx%_Uc%}vgDw!1LJ*};FA<>_71o1g zqy>seJ(OK2%Y>whsZl`}1fy)6GdeRms|Ot!ouf{=;D6cs-{1Kci?cT(!gK=GL`PEv z%#FxDogq4kBHfOemxE8&=mj>+7z!lBJ7`?Bl>V+JL^_a$3S^FfN4HZ7MEw^O$Z=@& z9N5i(w|xW{)X&FAZU&~)pbbc!77D1iSc;tnW_`tYSg3~IBc+G&>vsBq{7IoeveUuS z%ryGHH%|@>RZ9)BAPFNMK{8wfWIY zSic*J&%??c;Bs60_U5BjuRwq#8*sU&moHU!5i4`u0~qvzXAo=(9=2FRYwtt%SAO`1 zC<_iLJHd(RdL2HDhu09@J|aU${Cokgj`>7X^7XWHBDN3nDS{&W)8qk-eTDNFbA3i}=0sWooOO6^*n z%Jt4B98pn|16^)dl82|y#TF514c)U%G>b@G?;koY-6Akm$`j}D28OAf2n<53ZmINm z2cADKt^fHqcM;u=3z%nhJ}l|zhuTHBU2*|$_#PA%V|slY6_MYTZA@`VCuwoGI~vEQ zyjn`YY4DcOdHnZt5*x#@%~`mEz~3#1)4&8WX8cA0F^10f#>x@s{#^_hI#*`>@Buqh z7vO$=1JUgC0SU8)iU>}FXUT~SDn(%={)nJJdTb2UQw=9n{{ZUlb)-Lb_=Nxf002ov JPDHLkV1l45bA|u_ literal 0 HcmV?d00001 diff --git a/module/viewer/img/marker-green.png b/module/viewer/img/marker-green.png new file mode 100644 index 0000000000000000000000000000000000000000..17168f1b91a857283440eb923328ff7743c276d8 GIT binary patch literal 967 zcmV;&133JNP)X1^@s6-qmI800004b3#c}2nYxW zdd3EAu<8`J~$<(~h1 z_s%`%%mERh(gN_DqAEWE*tR8oC4u5oj%j|)+WGR%f*#N_0ABppPynH->Z+gX8|!o7 z+hK}4j?j_5BV;^j*t%cu0pQyxmMsHHj4`%P59skd2lmvo_p}?TuCDqP=N8fXZm<1t z^5I>cy6g#M zjMW=KW1z0FuDRnvM|Eg>$P>8MW`3W+`M1y8!V*!jB;F&U{3?_&_KF_Rqx+BUf1aP&HHF>Z$?c+ zji)AICMebw6VjC@71wby!MdQ_@xl&I@zjkeL|%(v=zAa!=jfxAwAzXB!AW zodV$d?4#_1QFFAs3;>J|j-$wnaPkhA!jQa?^n{N6G=|J{CgnQrmkJS)$cc{lC-FSb zmEWT2%_gXZ3eB&9Bw^P}yUH}e5{Pz1ZJydz7aI~TMoChwSC^EuMev9rtweX zgP!>@;t{65mAY_taXTJz?!%I9O)g|lsa^FNJuGTM09(-&$AzS zj(1)?b5+=j-p`wwNFiY+3L+;?digz}L^KXU^x7BKgoh92G1DrF;s-?Zc*{@#5SHjl zTucB)=z~EX1^@s6-qmI800004b3#c}2nYxW zd6c?p#-Cf+QT2KTX1f`>b zC?beZC{j?wrHCR_+vb-xYI7ZuU|X73hi7~4mvirP&bdMe8VUQlxPz@t`5PI!7)=rl z^DD`BoM;=0Y?`S(EPWsZ!c#&Yg(TzXYzc~^y?o8FT&w`A`a(EPl;Ir)8$uE5;cABH z$p+Y3trEuhon#4TYCAx@EViEnDHh&M-PZ6~OJwiTCuHHm#>E+wACV}@TWtc@r-Py;;F7l0rV1bY=hjXZ@ zg_7azO;+ncbF5^TY-LOBPgD3&133LJoNX=b(-f0ARyG1lgahO|Ip5Bb-ku;oy8${; z4rd0jw!V{YuAC%a1BilQ6Pu2z$3Dl zfk9jdgc;N4Ujk}jkSuYHC<)F_D=AMbN@eiPOfJeV2J#gA)6z1NQ|sTF7BVm}-Sl*E z45_&F_Vz~31_Ke63(}X46$V+hE$-ZV!=k~e<=4SIk8}kL%4G~am)+(B8hT--B_AV@ zelf$jVf~hCOnZ*oG8^%xNF_)xstQfEQHPUezqY*F28$hR>FadfBaoIr6AVDB7=TtVXh;InpH`(AKZD4>P0M;18QKIH zfDr_i<56ayA@`Id@s=FVdQ&MBb@04pl% A3IG5A literal 0 HcmV?d00001 diff --git a/module/viewer/img/metadata.png b/module/viewer/img/metadata.png new file mode 100644 index 0000000000000000000000000000000000000000..0e398c37e21ca34e8b13496407c4a9fab6c885ce GIT binary patch literal 1304 zcmcIkO=uHA7~Qs7YOq$ThO`7ij=GqHg%ME=9pqFEGrRzK9&*DUzH=PS zbjU^IQ&&XU&;rO62{@X`L`NJG$z@DH0hd%g#sUCXpeiwT`h1E@nF&0vPSz}(t)+8v ztt>|rb|mhLIwB=&m>}S272Ot{80%?@bnk{C3p@xZ$Jj>2`P39h7#0Sh0PmN%U{ypAO^#9(qg>9#(i{+T1rvONE6MR^ee{B6Jm-GR;$%O zH5f3g667P12;>AP2!4w2+lx9uj$gM=HAJ>_By7u;YI=UTx~O0*kQmFliCUw1IApdG z>2}jRY9n-z3HbmATgsFer9si_gkj|jqZ03E7)WG;QJ1*`)Xv)GV+j!)r+y6kd4bLx z$BUt$$a6E>_zh48J!L3raj}yw1VxV0BTf1?P?H{ot`Xae@mzP$)DZ{&F-(zLewhna z#cPWqLtMcc)`?9$<9B+d$YRm3G(_U6hDsQkdMOIq!GG4*sG432dM#n=UT&4%YUQqM z+P?3Kd_#0MldOF8*Xi$LIw_6j&eYeJ`2$Pb{+^Fd2MXxhli!24mEM^n*AC_*Yxm@{ z_3jPnnO5o9Kr6M?uAi4zyDz+)edk!emezafVD0pyH=pvEFK-Xu`TSZz(&K?!o6O0< VS@Fi)=6jlgNsgzb7h`jG{{oDdRQdn_ literal 0 HcmV?d00001 diff --git a/module/viewer/img/minus.png b/module/viewer/img/minus.png new file mode 100644 index 0000000000000000000000000000000000000000..86b04e951749b5fe3907445781e7f3cf71addeff GIT binary patch literal 238 zcmeAS@N?(olHy`uVBq!ia0vp^JRr=$1|-8uW1a&kmSQK*5Dp-y;YjHK@;M7UB8wRq zxITa|qthCb89+g?64!_l=c3falFa-(g^{Y@wXw1B z;E^LO8nNl;<|L*#K6?<%V?3o(<@xe*&^QK9S3j3^P6(PbUR;$v|D8C0wSvR{Cr^^e`Z{N~>8obTN8JLi1A z@60zhCxCZ&2Vpk>hr{jg_TmHqN!7jhZD2mS`PFG4w#wbTL-1gHfk(5!db`vsTn^;w z*z^Q5s|7wr3ePY_n4d3;FAvPPUVI0Q441*{+rcReRqu}Sd?g_K31D3waG(vB>V#ZhREj*b*6Oo3rr;9)C2AyyzN zTd{oKT9Du4a4I3bI^-Xm-e!G^$2f=ra{+uf*wSdW zG&qFDV9{wTm>Ka7e$DAUxSs?~5S(}i4%@BLHQI+h>0+&fQf4WXKd2B2)utm>`g(ilcNqpGcgluG7#U#t1W zWy>?9sOae1zx-kb)=y?s`hy3SEGMVJKD2;Wx7XYF z_7t5|h~MgV$i^(VZ#l-NH8-mO!k1_TG<*Axeu&O5Ej7C|nmGORDPJJimXeavJU-Ja zXf24GcW)b>;y9RZGrG{&IGZ&6b5XO+k+dHxXJ==vi~9-&AJ<&F<_1@2QAWkoufJyU zcsy%EykWmalNGqvY0#WVtQs91rL?RZpw|w?$1p04^iLb%x6UmsEj30pgl@qRvog3f zg~91e2JYVz6F)A$nV-)*1f}1*7v*5Ce>N|#R7-|&xcU%+zrX)}i%U&SAJ0`9b@*Hi zQl+JFBO@aND|{{%0UyZQxO&JsD=RCeeLOiWEf2&P8yjmsd6v5`FF${;chNUxgRLUQ zcqf6*V8jZAdb~OltyZhKI<}jYtNiZ zOH0u|S))t_%lbb$-LcL%!WHWJPhcZOZ|aL)aylIFH2*f$BRVWb92;%g#{cgE-nt+6Zqxw zUDKTebv72R39~_4!hk|hyK^`I_3hQGJSQiok@4|^CqEB86Q$YwFdHHMy}Ue~S9gk6 z*LCyenQwfoyWh-g$M`PU#RZU}y$GNd?^uZHUM-a>5o8ma&F+0D%jVXEg@EO(S!>_?=TKMK`Fp*LDtc!K z`Fhz+bz@UgOIurL`Mq8^p!XjY6(Zf-7JtM#)q z&S^hca!dU@m3^b9XJ}%g=?il0XyX0jorPYOQkCjbJQ<}DsW7}b3o#v3{|2}2i7q`Q ziCIb6d(f`)ztg?j*!Te&8CI}ciE3$pVR%sczg0VjqWj-{{_WR BP0|1W literal 0 HcmV?d00001 diff --git a/module/viewer/img/north-mini.png b/module/viewer/img/north-mini.png new file mode 100644 index 0000000000000000000000000000000000000000..ca423f2338c4d00512b2018474d029484585aac6 GIT binary patch literal 359 zcmeAS@N?(olHy`uVBq!ia0vp^LLkh+1|-AI^@Rf|mSQK*5Dp-y;YjHK@;M7UB8wRq zxPc0}g%~g0t@{HMlrM3OC<)F_D=AMbN@eg(OfJgLO-;#6RB+2IN-fVX$}U#0*qU*v z0;u$!r;B5VMep7zj(sf(0kvgerJ9DP3%ig@Co+VQlJT&i~+S6HirPF)P zyfxapChwVax2tMW;9l!n`I33x_IJ(mdmFmRz4}?=KBk{9O;1`f&zXMB)iT{nbB1Kv zHQzn<@|MrFZ%$U3mO4?t;rMLhL$4>zSoTunFYEn<9ml^NO;h{~^eKa3NdIV}fBF%}28J25#Ns67hgu%tWs zIx;Y9?C1WI$O`1M1^9%x0_nFhD)%&F!Z|`p8Wia4ib~HQrPkI?Q zbAT{sq5Xl-cd~|CKJVJ~=6>02uNygLv(Kh&zDZ@OdZz8y<884yQ-yxK+pf#Rr=t#Z O6@#a%pUXO@geCyrhJvL4 literal 0 HcmV?d00001 diff --git a/module/viewer/img/opacity.png b/module/viewer/img/opacity.png new file mode 100644 index 0000000000000000000000000000000000000000..9e378c78668872a45b317887f43a21569cbe0c1f GIT binary patch literal 199 zcmeAS@N?(olHy`uVBq!ia0vp^OhC-T!3HEf_T+>BDVAa<&kznEsNqQI0P;BtJR*x3 z7`Q%wFr(8NlNmrki4xa{lHmNblJdl&R0hYC{G?O`x6Go{^8BLgV*kzZen2&1AT`cK zsfi_-`FRQ0>aE92PAur9Xs}a hqxZu^gGXip3>^LJD^Aqa9tSFC@O1TaS?83{1OPs(HxB>+ literal 0 HcmV?d00001 diff --git a/module/viewer/img/pan-off.png b/module/viewer/img/pan-off.png new file mode 100644 index 0000000000000000000000000000000000000000..fb053ff0f6b270829263c50b7603d03614e3bdad GIT binary patch literal 705 zcmV;y0zUnTP)^mq8@Dd}3+ntS z^D|tRZl&!~K_f*F1EN%@iD16&Y#K3|(R79m%-tpT-E+9-yn7!bB7A4?Z$A--qKkux%RvcG=AolYy=ZnqT%q*kk`tJNydc%KIzcs`$3mdj=H5QvBn)UmGXr9>j3 z?qdWJ06?i!>gc-OIG#ZLw7|olT8w>^m*tWe(euA@4 zgUKUej2Y2rR4NvW7!HSsL?Yv-r>C9qJ`ae9EX%@nyM<|*J~>?11!D}Z>w<{DIR_De zF$U8#VVWi!$2sn9|6@9xwzJtRO(v7J>$-S-ef8;7sZ@xF0{_3gy&)Ehsk*M;`D8t0 zoXuuGr1izc1%kX`j3E|_sfJ1K&)dmlQaM8UO-Pb7Ua!}8`xra& zuMFD#{XIF3gI=!}deF`i)a&)mVzFomA;39@Wm(>;fFw!d$H&K$tK#gk(=@G}N~IJb z1Y}u;EXxo=;PUcP{rLDe2@ZsO4>V0{=W;n3jYe(DvJi5lOKomWbPHUhEEdfC>7A=WCkTfpe%B??P?N6D{ zaNRFRmkKqd6k3I%G|(o3QFGts1rn2*z{3MsBr|jFz30rG2{R0Xa6)hZa2$u7g4{Gs z5>7#!1TUEh06s1c?Zsj-5Cj2}$priT9=qKR0CZWFT>$z~0>dzf zh*0L~cDrPnX6gBcVNj-mSl3#uW{=0?`!X{0dOg?kyjnC$X477+R)a&LII~0e zzOP+hU%N?;+yDTeY1+v5{ed84{TBoQjAeV0bB-_!wLIff65ZU~*q-MNTCEnQ($ zZgfb_7=vY5Q5=Xd7E~$~+}_^e`T1FwBq?QlDgY7DcDu!9vq2b!DLJAj0%HtO6oH5! z2m*)*j4^~^h%gMX-|w^4C12j(--nGxgWlfWhEWvZ>FFt@)7{-25mD~<*Vk8wqUid* z-$}`O7;!$IKghCd=V^U*c7{A}7-JAc(G7y2b2yfo9dEJE&(EQvD0YVF7f6!y^7Hf4 zNpi%<^g&|6Fq6$c-4F5j`1or#7akS;et)!FF7G+#I6prJ09ckqapuR!ff9$^VzC%j zt5utG4qexw>pD2+xV*e{zrVkapF?FTh=ZuAO0(H)xZQ4XadF|snirw4g4mOfkB{Y@wXw1B z;E^LO8nNl;<|L*#K6?<%V?2d(x{6-(#;gPE5fdz5EIah$#JQzs*k*X%@LAT!`@-zu hRfn7>hLdKQFlcU83{G67(+f10!PC{xWt~$(699TdQF;IX literal 0 HcmV?d00001 diff --git a/module/viewer/img/prettyPhoto/dark_rounded/btnNext.png b/module/viewer/img/prettyPhoto/dark_rounded/btnNext.png new file mode 100644 index 0000000000000000000000000000000000000000..b28c1ef3d595d5af9db1f2a4378cfd64407ed5c0 GIT binary patch literal 1411 zcmV-}1$_F6P)$9a05|MJUF0->4SGK<7F5TJ=lWKN6+&IhzfIXTxP_BAUYSlC~k)ya96~A ztE!1Fs3@{uSCwU7suGg-Dqm*4{6%~bnXhbax0`G>8;y^TlaJ!y=Z$>*$bCxrnvF(o z`x+M)R}d8y<%*4sb=vKA7v=~-N$_0n-ZRLqHxCaF-bMz>;maqN%k>M_92kbLQc)rz zB8pyLU&UAqOwrNN6cZCek&%%UV)*w#qa-FKlGEv|W5{3m+Nvr57=wC&(2ff5mzNh( z17JKGEL7k>2JHbJV~7v<&GHpkvnUX*@G!g&=-b;{j2C0X$H#{?xZRXAJPcs=9iF5m z$;ezRVzj2FM&MRfRz${TF_i##NF31cG^#Z`@cilNNv;SVRNO-;YUtmzPp;pO=?M$H&KXa&kgtWo0s6lPBgmI5?pE{Cs(iF?a`l;~DyD zeo-f&{o>+6-iK$tg6sHliqT3V>L zx0mkj?xbHsLxUI=K#h%!R99C=xw*MwjGUYtIy^k2!oou8>FJR^X=!QH*48EpNJ&YN zz7-V})Y{rg#l^)k2J7^-2D?WJrFf_^uu26000%G@R$X09v$M0`^;N^cP^fA+Q(jhM zR905f>guZ8WBY@$Q1eGn3BF&S-6IO?Hdx z>uV}0DWR^eF6oE&U>w5J%A>2v)`ghfQje?W0Dg6KC9&Gv+$?R{&z#uwe4u1DKR++| z0`pl5JPg3TzCNn2uNR5JkaKf$B7Z_1&}6(^FbrUZ(Z+b=uwC z6(A&3NPBN@PmI#h(ILt+GyQw^>CHgU3XH4^;Dv>Sz>|8Qt(jZ55^YOLN}|opO-W|v z)`SB2*4EZaaw;z`7Z10$w~KTUvj`0&EQiD4JrpU!n-28IYLy5594xT8W%)a>_yR`3 z4uAv%?*STd2moYs%#XI6ogI-V+As$Uv9+}&&z6>!Bm^*iV`GB~3JU1x=tz`+@o0Yw z+J^WV9UU#@iT~smWm{7`EZfx7BohS#jDGsnrH2m_UXQDI4>Bu&@Eaf)XZ|(~k9jZ_ z_ZWxq`emr|Xzc63$X|%rJll+IY;0_V?|(O6W`YCeEnxjf(UTDFL-@J*W=y-;YJV`; zte&CGf|v^iSUrL(V1rF)A^YGM9v(j6)c=JS`mZnWV1WUv&|&|TH8L{d9vmF}hxfbR z82m3^-_rhKSS4+OhpU&ZpOyf34Gj(b&6|EdCyLJu@m1w&8bCiKt?{ei;p}BIk$v;W z;K0BD2qXDg#@j>#gM45R2lxBQbC~&$0rR=di9ZMN#~@dC2t52le+>RFzyR~BA^19M RLBjw5002ovPDHLkV1n=}nO*<@ literal 0 HcmV?d00001 diff --git a/module/viewer/img/prettyPhoto/dark_rounded/btnPrevious.png b/module/viewer/img/prettyPhoto/dark_rounded/btnPrevious.png new file mode 100644 index 0000000000000000000000000000000000000000..e0cd9c49af7fe2f6ab694843bdd3b90ce9217cb3 GIT binary patch literal 1442 zcmV;T1zq}yP)DPR}?-yIFE=Eh>D`1 zxDZ4LPAETaM%Rg1tJM?Bq#w*j8W7$G%8Lw&qL>a zCw-c0=k{xpz@y)ROWmrvb?SWQJHxHA4-E}n(SMgP*YTP@kUTy+|!o71v*0Uj9&rU)Awvb?t|yrluuz?lkGJ^!4>Q=_3#Yh7?%3ySpO=mYhx}U&DY{ ztyUfuiv?p_UHazs_V(+RmX<#~!COX0NBtf&z+PNj(ACuyg9R|V-7WxmjW|KE>|Uds z@STc?cg@YsKf-UK&-yU{K0Q69%gakX4+sdLz`#JA)xX(ON1M&Y_pk=Ql>x3!!mdfe z!^0^!IG908e&ZRJBWj|fqrXs78-l{_=_v@jjIfe|ffq^G2m?4m^pL_e6dJiF1qN%N zN7iBv{W#*>#30@cz{pcPr!(of7J!S2ium5d#02Y>wRk`5Q93?XY=7I{-o9Wrc}-P4 zijR+f<+;7RJ8Nysxo|~Jaii!%Fot>rm`FYk+ zS69dHT3lRYgFQtzUOxh`I6)W|z%w&5?&_^S2ghNqocjra(~1+%0Vc$oy}iBE*4D=J zf`S5W8<5G#N$Tn8;ro!p#6)%$WMgB4Iy*brNyEd#%-Ht!Hs$8#((&;zr$TIOEG;Z7 z@LUWu*&qh%L!_jnsm&{8?^!)!Wk?@MMb%{ePRf%0|=@*@(HY=il?Tga{EH4qxvIv(ca)R=-l7m z=dj0mge~-X6I1W@6l_i33LLtW&2z{I<5w2)1HBr?f(#o-m~a)XCyiluc>E>604H)GzA+XomH+?%07*qoM6N<$f}$awVgLXD literal 0 HcmV?d00001 diff --git a/module/viewer/img/prettyPhoto/dark_rounded/contentPattern.png b/module/viewer/img/prettyPhoto/dark_rounded/contentPattern.png new file mode 100644 index 0000000000000000000000000000000000000000..e5a047c3a7efb0f8085e0b70523299af00a5dbd6 GIT binary patch literal 130 zcmeAS@N?(olHy`uVBq!ia0vp^A|TAc1|)ksWqE;=WQl7;NpOBzNqJ&XDuZK6ep0G} zXKrG8YEWuoN@d~6R2!fo6;Bt(kcwMLDG3QT&O5jsIO33Mko90i<6^cxDT}NJ0fqt! a2NIKlt||NsBb%*?E=uIA+AG%zrD`0!y=R1_N<+vm@pjg5^ZBqW4{ zgcKDO=ggUN^5n@6A3hv7aNygwZyp{VGiT1cdi82iQIVXS9M~i*gyK&Yu&54*1lh^J znxLT2my$UzW7WEx*ZT@|&X?rguUPlK=KX)mqpTdl9&9X0-U1vFe5XV=OIC<1TA^wB zAR@v0R&G+mkFG;kP93Sa$EGmNNLpZ-!L!AgPrAh9_7P-L(M E0LAB0sQ>@~ literal 0 HcmV?d00001 diff --git a/module/viewer/img/prettyPhoto/dark_rounded/loader.gif b/module/viewer/img/prettyPhoto/dark_rounded/loader.gif new file mode 100644 index 0000000000000000000000000000000000000000..50820eedd904647a76c4c2c1d830d4339588c08d GIT binary patch literal 2545 zcma*pYg7~I83*u}xzA)~n25ScZ5t-T5>nU=30MS$Xhdjjt5TMMW#9(@)N1wHw{N#>*%A~K6dfI%mzSs0>1;MzQc{x1WQvWAEi5cd zO-&6A4ejdcYHV!G&dwej90WgkdA*fGvWCM(P; z$dsjIrxfkWO-cJGD`!tG@Op!gxcHQxYYW#Q0eW60s};c7^ldElX7vkaqh-b(7r4^0 z+UAb0ZSr75<*E5h0II=##CBs?6qZq|wUb!3#%m$M1s7pTB@&S06@9Ay z-h5f_b9-#xd~c$}>EX+VI*I%()}0TCh#*z{qN+;rk#%*HM(Q=fSuu34zchyM3e)?`6^f~$^~ z0L(`R@{+Sb&Lw^rQ0mE&rsN{19?LGi8VEttI=`{N-icg!PPcINvze}`ss#~~E`&+u zLbM5e>i*sa;(5N^{?)@C{Y}}!YN8g;6QZ;cANQNPJ-Nt=h#5XnucjTE3{bk)~0FmXzWdpB5>Zy)m`E2tm_CcnpIfqNU+@bKQydj=IwV zTyutJD5yo*h7Dj4WQ}P<9L%LeFnacSCsO3N5pIvX4hH0%iP-$*y7rv*%*Qc)j;EmW z-mi|`{kHYCazV_H3nL>$47PQ#5YXQnr$}wI&wcr@=kZ1#eg!+#&@)Bc1U9(*cd`I# z%)^=g#F56s=CvHdJ@QPLEeg)N^*V4>aPW!^n{-oJw+~n{T?uQnOqQ|67o&Wra3kj~ zmAZ3|x(4m>=2n}t+vbOyw4bh&GstNhHdGB?2pRx>gF^$ChIy<0=d!7qV$XlP6VHk`U}S=M5)om<(f8q3iQk zYG|Bgahee;Ls{S0WIffD*~Y^)CSUQw@&j#Wd|^??$zfXtW(Iw7j+Mq=5o)@5yFgtY z3d6oYdc1APw%)G~Jcuq~0;(?G6F#?AES#&0E{T>)Z(k{t*WY&5I+E?QMtN(E4RVvz zdn~6azL}H7T6ge<>4C;SBcmS4vGe}t%wNr?EeYZhrui~;S7~?-@1Vh(fyEDV=&7N3M|fReKPNa}sSNhdVs+rpOitDW8pX6l>^lDsUvo$c$X?+;-k zG}O%~)wtgxWGV2;RxP_8XXXx8BXs$Cg*s|OzZ>l4@i1EsFPWdKUR<%xPVd;b{N)E( z$%oEzXyux%p7u8;eZu-R#`m3yF=G{BRn@k#=4Ph;;2|T5OA@2^m%^fO2fwRgw@R{( zIO9xB;5jah#gmjV0q*WR$wrlG*GZ+}?36LEVopx8&UoR5|FP2X(gg*>F2Q`DOOWzT zKy$O1#JGKIqQfYwpC&#w#q@DPqW?2e#VL|C9rwWEFAWIx{OQyh2QiYjN9*YZVSoMS zFA84%7}x9g)1Aex=0uh3IjS_3TZ$cycqP0)!%# zOBK66#7X}`IVZ(={4$W>L=h`Z1T4#AR|_aHZ=cBtyvh4h;coJH!AS0chIeuLuVE;J zMU;zXpKv4ew*ej2mcLgY77c0rcaD7i-OHBM_w!bI7sLh;$kU&9zltxt1OD2qL|J;&bhtXwqAHM6xRf*yD4ofPQO{_whBa&Y*iCFs_G=IgnfD{l3X!rx368LCX1Vtw#^VR1=jt|2}Q-YZ8)R$_o? zXe&>PWnSYgc3wT8Sa({7?q-O!oyI_c#1%&XjP`}73A_%VXfsOf$8jS`uD`Yq!wLCq zId#TxPJTy@wTF!w78H#BZ=C+$RSaM?39k!c*vN7#tXBU3;O}dHT^_;L4G+E)eAx!e z$jjz9$B$QQ^7DdOx|rFAG2&g6TUH)%6sqBDIU>PP0|HTYo)Bxj(VK#x1f+}5(H#tw zbb4iqfOZ2a4yFe~)DXD?&}9Ik^#%!PL|Z?cDZK2Tl4%H^Jh*rZTQDq<@>&LjL8>&bmbP;{9$V1f72|-IC6J*aS0@jCMCW#2N6=@ z4`AZpxsaAsVQ@O2`+(k0w?jjrokZ16XhMUc+v!dQ8ajnupX>w}bRm9Xw)Di6(Qq#i K>KdTlt$zd2^$V2% literal 0 HcmV?d00001 diff --git a/module/viewer/img/prettyPhoto/dark_rounded/sprite.png b/module/viewer/img/prettyPhoto/dark_rounded/sprite.png new file mode 100644 index 0000000000000000000000000000000000000000..fb8c0f83d715aec1014b77f0b44002a07a635052 GIT binary patch literal 4076 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 RLBjw5002ovPDHLkV1n=}nO*<@ literal 0 HcmV?d00001 diff --git a/module/viewer/img/prettyPhoto/dark_square/btnPrevious.png b/module/viewer/img/prettyPhoto/dark_square/btnPrevious.png new file mode 100644 index 0000000000000000000000000000000000000000..e0cd9c49af7fe2f6ab694843bdd3b90ce9217cb3 GIT binary patch literal 1442 zcmV;T1zq}yP)DPR}?-yIFE=Eh>D`1 zxDZ4LPAETaM%Rg1tJM?Bq#w*j8W7$G%8Lw&qL>a zCw-c0=k{xpz@y)ROWmrvb?SWQJHxHA4-E}n(SMgP*YTP@kUTy+|!o71v*0Uj9&rU)Awvb?t|yrluuz?lkGJ^!4>Q=_3#Yh7?%3ySpO=mYhx}U&DY{ ztyUfuiv?p_UHazs_V(+RmX<#~!COX0NBtf&z+PNj(ACuyg9R|V-7WxmjW|KE>|Uds z@STc?cg@YsKf-UK&-yU{K0Q69%gakX4+sdLz`#JA)xX(ON1M&Y_pk=Ql>x3!!mdfe z!^0^!IG908e&ZRJBWj|fqrXs78-l{_=_v@jjIfe|ffq^G2m?4m^pL_e6dJiF1qN%N zN7iBv{W#*>#30@cz{pcPr!(of7J!S2ium5d#02Y>wRk`5Q93?XY=7I{-o9Wrc}-P4 zijR+f<+;7RJ8Nysxo|~Jaii!%Fot>rm`FYk+ zS69dHT3lRYgFQtzUOxh`I6)W|z%w&5?&_^S2ghNqocjra(~1+%0Vc$oy}iBE*4D=J zf`S5W8<5G#N$Tn8;ro!p#6)%$WMgB4Iy*brNyEd#%-Ht!Hs$8#((&;zr$TIOEG;Z7 z@LUWu*&qh%L!_jnsm&{8?^!)!Wk?@MMb%{ePRf%0|=@*@(HY=il?Tga{EH4qxvIv(ca)R=-l7m z=dj0mge~-X6I1W@6l_i33LLtW&2z{I<5w2)1HBr?f(#o-m~a)XCyiluc>E>604H)GzA+XomH+?%07*qoM6N<$f}$awVgLXD literal 0 HcmV?d00001 diff --git a/module/viewer/img/prettyPhoto/dark_square/contentPattern.png b/module/viewer/img/prettyPhoto/dark_square/contentPattern.png new file mode 100644 index 0000000000000000000000000000000000000000..7b50aff880e57ea386400d763dbddf82fff72be6 GIT binary patch literal 121 zcmeAS@N?(olHy`uVBq!ia0vp^AT}2V8<6ZZI=>f4NtU=qlmzFem6RtIr7}3CIKlt||NsBb%*?E=uIA+AG%zrD`0!y=R1_N<+vm@pjg5^ZBqW4{ zgcKDO=ggUN^5n@6A3hv7aNygwZyp{VGiT1cdi82iQIVXS9M~i*gyK&Yu&54*1lh^J znxLT2my$UzW7WEx*ZT@|&X?rguUPlK=KX)mqpTdl9&9X0-U1vFe5XV=OIC<1TA^wB zAR@v0R&G+mkFG;kP93Sa$EGmNNLpZ-!L!AgPrAh9_7P-L(M E0LAB0sQ>@~ literal 0 HcmV?d00001 diff --git a/module/viewer/img/prettyPhoto/dark_square/loader.gif b/module/viewer/img/prettyPhoto/dark_square/loader.gif new file mode 100644 index 0000000000000000000000000000000000000000..50820eedd904647a76c4c2c1d830d4339588c08d GIT binary patch literal 2545 zcma*pYg7~I83*u}xzA)~n25ScZ5t-T5>nU=30MS$Xhdjjt5TMMW#9(@)N1wHw{N#>*%A~K6dfI%mzSs0>1;MzQc{x1WQvWAEi5cd zO-&6A4ejdcYHV!G&dwej90WgkdA*fGvWCM(P; z$dsjIrxfkWO-cJGD`!tG@Op!gxcHQxYYW#Q0eW60s};c7^ldElX7vkaqh-b(7r4^0 z+UAb0ZSr75<*E5h0II=##CBs?6qZq|wUb!3#%m$M1s7pTB@&S06@9Ay z-h5f_b9-#xd~c$}>EX+VI*I%()}0TCh#*z{qN+;rk#%*HM(Q=fSuu34zchyM3e)?`6^f~$^~ z0L(`R@{+Sb&Lw^rQ0mE&rsN{19?LGi8VEttI=`{N-icg!PPcINvze}`ss#~~E`&+u zLbM5e>i*sa;(5N^{?)@C{Y}}!YN8g;6QZ;cANQNPJ-Nt=h#5XnucjTE3{bk)~0FmXzWdpB5>Zy)m`E2tm_CcnpIfqNU+@bKQydj=IwV zTyutJD5yo*h7Dj4WQ}P<9L%LeFnacSCsO3N5pIvX4hH0%iP-$*y7rv*%*Qc)j;EmW z-mi|`{kHYCazV_H3nL>$47PQ#5YXQnr$}wI&wcr@=kZ1#eg!+#&@)Bc1U9(*cd`I# z%)^=g#F56s=CvHdJ@QPLEeg)N^*V4>aPW!^n{-oJw+~n{T?uQnOqQ|67o&Wra3kj~ zmAZ3|x(4m>=2n}t+vbOyw4bh&GstNhHdGB?2pRx>gF^$ChIy<0=d!7qV$XlP6VHk`U}S=M5)om<(f8q3iQk zYG|Bgahee;Ls{S0WIffD*~Y^)CSUQw@&j#Wd|^??$zfXtW(Iw7j+Mq=5o)@5yFgtY z3d6oYdc1APw%)G~Jcuq~0;(?G6F#?AES#&0E{T>)Z(k{t*WY&5I+E?QMtN(E4RVvz zdn~6azL}H7T6ge<>4C;SBcmS4vGe}t%wNr?EeYZhrui~;S7~?-@1Vh(fyEDV=&7N3M|fReKPNa}sSNhdVs+rpOitDW8pX6l>^lDsUvo$c$X?+;-k zG}O%~)wtgxWGV2;RxP_8XXXx8BXs$Cg*s|OzZ>l4@i1EsFPWdKUR<%xPVd;b{N)E( z$%oEzXyux%p7u8;eZu-R#`m3yF=G{BRn@k#=4Ph;;2|T5OA@2^m%^fO2fwRgw@R{( zIO9xB;5jah#gmjV0q*WR$wrlG*GZ+}?36LEVopx8&UoR5|FP2X(gg*>F2Q`DOOWzT zKy$O1#JGKIqQfYwpC&#w#q@DPqW?2e#VL|C9rwWEFAWIx{OQyh2QiYjN9*YZVSoMS zFA84%7}x9g)1Aex=0uh3IjS_3TZ$cycqP0)!%# zOBK66#7X}`IVZ(={4$W>L=h`Z1T4#AR|_aHZ=cBtyvh4h;coJH!AS0chIeuLuVE;J zMU;zXpKv4ew*ej2mcLgY77c0rcaD7i-OHBM_w!bI7sLh;$kU&9zltxt1OD2qL|J;&bhtXwqAHM6xRf*yD4ofPQO{_whBa&Y*iCFs_G=IgnfD{l3X!rx368LCX1Vtw#^VR1=jt|2}Q-YZ8)R$_o? zXe&>PWnSYgc3wT8Sa({7?q-O!oyI_c#1%&XjP`}73A_%VXfsOf$8jS`uD`Yq!wLCq zId#TxPJTy@wTF!w78H#BZ=C+$RSaM?39k!c*vN7#tXBU3;O}dHT^_;L4G+E)eAx!e z$jjz9$B$QQ^7DdOx|rFAG2&g6TUH)%6sqBDIU>PP0|HTYo)Bxj(VK#x1f+}5(H#tw zbb4iqfOZ2a4yFe~)DXD?&}9Ik^#%!PL|Z?cDZK2Tl4%H^Jh*rZTQDq<@>&LjL8>&bmbP;{9$V1f72|-IC6J*aS0@jCMCW#2N6=@ z4`AZpxsaAsVQ@O2`+(k0w?jjrokZ16XhMUc+v!dQ8ajnupX>w}bRm9Xw)Di6(Qq#i K>KdTlt$zd2^$V2% literal 0 HcmV?d00001 diff --git a/module/viewer/img/prettyPhoto/dark_square/sprite.png b/module/viewer/img/prettyPhoto/dark_square/sprite.png new file mode 100644 index 0000000000000000000000000000000000000000..4fe354752455e070ebb56f42a60fc2233de45bd7 GIT binary patch literal 3507 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 literal 0 HcmV?d00001 diff --git a/module/viewer/img/prettyPhoto/default/default_thumb.png b/module/viewer/img/prettyPhoto/default/default_thumb.png new file mode 100644 index 0000000000000000000000000000000000000000..1a26e4b16e18db9e0979a6ba5ecb9e1e1c8753e5 GIT binary patch literal 1537 zcmeAS@N?(olHy`uVBq!ia0vp^MnJ5{!2~2lDSr z1<%~X^wgl##FWaylc_cg49rTIArU1JzCKpT`MG+DAT@dwxdlMo3=B5*6$OdO*{LN8 zNvY|XdA3ULckfqH$V{%1*XSQL?vFu&J;D8jzb> zlBiITo0C^;Rbi_HHrEQs1_|pcDS(xfWZNo192Makpx~Tel&WB=XP}#GU}m6TW~gUq zY+`P1uA^XNU}&IkV5Dzoq-$tyWo%?+V4wg6Nh+i#(Mch>H3D2mX;thjEr=FDs+o0^GXscbn}XpVJ5hw7AF^F7L;V>=P7_pOiaoz zEwNPsx)kDt+yc06!V;*iRM zRQ;gT;{4L0WMIUlDTAykuyQU+O)SYT3dzsUfrVl~Mt(_taYlZDf^)E`f^TASW*&$S zR`2U;<(XGpl9-pA>gi&u1T;Y}Gc(1?#n{Qv$p(%8_*)y>$@ z#MQtErq?AuximL5uLPzy1)RB67F)=Cl-0%Nhmu^a?8hh0T^w9mUDEGv?>K8d)wzGgml>(n6(8(9 zLQ`Ch#S2apT=}rXs&X^0zh+&mx?FYr+U#jM&p!XmF}n>!Z>NQKA5GdC6{|P> z^2;lGmp8sGkxst-wyf7pS!InB58L6Yy>5IL4?h&>bP;&9@TlG|3th49u+^emt$*tN zdmg^;Yue+sIBvao_fZ+XX8WkksIZaiEUTJwq;9`_|M4e% zU3SxfhI=h7TH7ymYDPlEe(|R&oOc4=Tn{~SQG5F739G|ai+gJ%H$D6tw`B5(cf0TQ zMeSQrGMz2Vdufo~bZrr?n>pY77p~A!)0y}y{i;}wfugc`t-_fUBcP+T=39SO2rAyM zpBeR{cwfc~^WP~(GtWH#{IOzAA6KcOi{#|)d*A-5U(7KJ_WW~CWlPlBh`km&eN;Yr ze*d=iV1mNYPKgAk?cU2TKQG#Tn^!UG#jPb_t8c#j=Aht^HeXct(m@_MzIGpHwe!p8 zh!q6S|9RMhqy4Z_zyFd{qnS+y6__V7r5~zU$aB4H_t}UePj+sp+n(Sm=$UCEHRW^V z8NEkWUY10-N(yVbS7mfI82S`kd;k4t!q0_`SEsVE@%8Myap6pg^V0upjEa2XseZE? z#Fl;wZnjw7z%enSq+%NHRp;%&a~@9m^r+^be~*WvxYNc}&6gKXPYY_Umg(lx+a^@* y;MyFr{@1hJHY$01i`>iV{`=Qlt`e)`G+_9kRR3W^dd`1Pq3r4E=d#Wzp$PyqQ%Md0 literal 0 HcmV?d00001 diff --git a/module/viewer/img/prettyPhoto/default/loader.gif b/module/viewer/img/prettyPhoto/default/loader.gif new file mode 100644 index 0000000000000000000000000000000000000000..35d397c9e430c2ee8f1d95d8fe47da79a399e746 GIT binary patch literal 6331 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 literal 0 HcmV?d00001 diff --git a/module/viewer/img/prettyPhoto/default/sprite_prev.png b/module/viewer/img/prettyPhoto/default/sprite_prev.png new file mode 100644 index 0000000000000000000000000000000000000000..1ee486514b9c4b3b36381fb0a3ecc3fe3a9f93ca GIT binary patch literal 1376 zcmeAS@N?(olHy`uVBq!ia0vp^(m*W7!3HGnN~S&oQj#UE5hcO-X(i=}MX3yqDfvmM z3ZA)%>8U}fi7AzZCsS=07?{&CLn2Bde0{8v^Ko2Tt~skz|cV7z)0WFNY~KZ%Gk)tz(4^Clz_GsrKDK}xwt{?0`hE?GD=Dctn~HE z%ggo3jrH=2()A53EiFN27#ZmTRp=I1=9MH?=;jqG!%T2VElw`VEGWs$&r<-In3$Ab zT4JjNbScCOxdpzyaD(%Tp#cR9GX09g0)0b01O41wkiWpHi%Wu15zfG>x;Uh=AXPso zwK%`DC>aHCFybnZQU%%yG$2F3nBNEAe!(RRYTBrDUd98JJrb z7#fLwm{}MaS~$5GxtTec8X6j#Sr}Lvz|6p=*TvY$(85Px?R(JoBXH0dq_dFl$J7T(M(dV4UFT;uunK>&^82S%(5dj_qH< z=*S}&*wSLt6i`q!QRxTIxr2f63j((D&Glk4bUrY>phW8*BX?6W+sOqktDKkpQupx5 zXVR6ue5HEf1!nmc?&=yMi}nq)%8Sz3BLd=JXKh?K+7<-V*=#&TPw-;cK67S}GK<|Nij=gN9YBUX)mA zh;Wt6nYpa?jR{w8>=%xtco;q0>$PNpn+{JB>CZJBh}qL}?smVM58)0;KA0$JUrYeg;& z`Zd*yb!iaiy4OwuEEavuaqHW^R{1VJZ{q8`Htg`n3YU!$NAk8euX}wXZ+pqCT^BPJ z#OS&6*%zD7^m$=gy7{Jy)!buA8xPd&ci$S-yVv~VhnTftC!T*6wD6m-=uw2vEBzb) zJAUTw+1zqA^5CK6cbK&!IHc6)T`_#r`{L{G&(>L4)9l6MnRpmD^*T?NvsT^(m3f}7 KelF{r5}E+5_2k|F literal 0 HcmV?d00001 diff --git a/module/viewer/img/prettyPhoto/default/sprite_x.png b/module/viewer/img/prettyPhoto/default/sprite_x.png new file mode 100644 index 0000000000000000000000000000000000000000..d4433ab0d6933357b0e91f6fc72662f1bda39f51 GIT binary patch literal 1097 zcmbVLO;6N77_MS)MM;nwo`!OD+nJVacbl!qZo9GxMY61M6Jla%XW0hYsqNr)@gitU zylOlc4<0o}{R2vrqcPk(8T|()dhl$R?gx4x7@ee@d1v0|dB5*3E?gQNIXA*_+-P;q zsIh&UePU)f{cnx$v2B8y4Z1{{v~5S2n{~+w236l)#WifZof{u;k>iG%UcEsZ*1YBr zU$9dhA@M_o=D6Za657rhreFoHdV$V=fAfw9o~!d$a~8D1GH!Wun-N~xT&O#nYfi!C zXD)zZqA>y=QyV1ydJt=g&Ubk=c22KF9&}acn$Gu}YFLY)Od-qNm-<7vZO%>`ip1QBDbm4j7r}YlXSjCX{d=}yWJMrvOuC$5fuuBltYrT zOd}h20%|AOAf6g97&vw!FQgs`K+0&ZkPWKy%+p>7erQ<-#6jFo6ibI+L$%|2C&Xe6$7CaNSUs9k12D_o(S}k*=8bka@>o&qb%Qt?J`QNr(0TSE zxSp#)l!pkZ(@>S5l1C_Csz?>3ltV~X@~{909EV|*ilM4T-jGeDgpdjIrcx=$NHQxj znl_;{z*d8p+JS=yc0Fddk1ZdG)yfgJDT(TYtPeV1u|+6}TO{cS;gKmB`?-2V?{#)EVtouJX6PYt&+8lp0%ixN2V0t`geI^_X4-VMGL~Jy6 zKR$WN#;Q{_X6wo4Z(nB5a^TF+ZXNu3_4DNLbMD@?Q;%;wd+_qd&iL`t#Y|>vIrDXA v@AlYOS2{KcPTc)Bp*T@``(m<(x-<2j`?UP<(dqds5yw{5Trggju5a%Hri)27 literal 0 HcmV?d00001 diff --git a/module/viewer/img/prettyPhoto/default/sprite_y.png b/module/viewer/img/prettyPhoto/default/sprite_y.png new file mode 100644 index 0000000000000000000000000000000000000000..7786ab5128c53a952830a3494898ee3ff5d00cf2 GIT binary patch literal 1162 zcmc&!O;6N77_K29hOj@tkHe%~Jh1IdcemX(RKjk%vg#r(E3SzeN;}Io&`xb<*+OD4 z+)VVuMg0+qSCJ@*7xCcT-$25F5O2ik?iM`|OuRTrJM&K8=Xt;Te0JtWX5{h+$8nkJ zv{7ff&YsPS!|Z*0^0~^kOVn)AInttCE5zKCLl!Zpde#!IW6N24@)b{T+)&GHG-a)@DJOgcuYAn6;q{fs6!{ z%PWd94kU=62qh6oS)^z=NrMm!7SF7OPD`sBm4PiL>3o~gKoiAow<~mW0tuHyq^fGd zAxT-Lk&V`TYQ$>O)M}^1el$oFOPLs3frtbs zdR`J&PdlP@{M(H)wWG#bfWrIa4knWWu5;SJWJm z%t{XBO(><`@kg_ySF8h*<7w+N;dFSg&n6~J zMq}&NO*U2^s>W0!{&DdAedZY)<@R3ff7{#MeyEL&yty`H>_4?0tak3+^Tzp;f5#1RUtWw}*f@CfG5I@G%^BluX<_phuCz@w literal 0 HcmV?d00001 diff --git a/module/viewer/img/prettyPhoto/facebook/btnNext.png b/module/viewer/img/prettyPhoto/facebook/btnNext.png new file mode 100644 index 0000000000000000000000000000000000000000..e809c3b64219468c4c744a4d4f086460ee6c8d6f GIT binary patch literal 845 zcmV-T1G4;yP)*<*4T)FKQHep0ar5R4IgX^MaUqaei9+gx zK#oWha#RSUqSL<~3WaX<08-Gx({VYS&ijjti?_uR@~-8hZnyh^-|xRkG^9)>qkKN! zl-KJu5DVD?g=ju>xm?$Xh5WNRfWqOh&EardB^DA(E|(8RqtR)b&DNLlZLpn(p$eGi z`&orTF|@qAJk2o7i&QGLOI##dQYw|htE;OsCX;E5SV%0DN;Q&9CZ9}9OsI*4#8Ru( zs`d5t$3~-Zgjh%{jYc!Jv9U2@Fc^l3g~ZZowHMRr^dp^4H$*HXmR_&dE-fvYh=wc_ z3Pro!zDX=(u~^)J?Id2QRE~*+q-lEBVzIU=>}-WHNh1mRj|C z{RryGSG}%2dIs5OG>&IyXXA-Pf+n(PJ^^_=p4YKhtVrbXN3+>v=jP@Tkw~P_@2sjT zkSxnK1A)L=Fc{1u5vVJW3kwTxA&MW7NQ7^ieW(jp1wGI&cw?UNjUh#S6ZTw zv=GQ`i9&7*fyB)~dlCbzaP#I3d4f*+W2B^a+`I*CAvtuW2}tDH;^r%83popX4~!3$ z21E#lBbNccM_ivBiM@4iz~BDKto|Fa71itLv{we-TU_n~*cW_|z`dHEQ5#*7zXcco X7c=PvI!UA-00000NkvXXu0mjfDKUXP literal 0 HcmV?d00001 diff --git a/module/viewer/img/prettyPhoto/facebook/btnPrevious.png b/module/viewer/img/prettyPhoto/facebook/btnPrevious.png new file mode 100644 index 0000000000000000000000000000000000000000..0812542cccfdfd9d1644ed721516c00fc6a03c24 GIT binary patch literal 828 zcmV-C1H=4@P)-u>SFdGE)KMkDk;;yCW4W(C*+z6Lgc zFY;|dX$bxTZi7F9Ykb?Ev7Z9+0(b#Di=?A%@H+V0SwP+b-vz6X^fUlhz#FH5w1aOW z>FYhXjK+9>tc(C6K29qsq!R2vYzeYKq^0;HM*iEn3dyhunl7I|_Lf8F%zmrz~qC>8(u37?tz=A@d z;A9Eu^ZBm8EZ(OHC@SRA($eKGUEgAT#MYKR>U_=krgrTCLzGCqW>sR_j!;SbU_@ z>9k_30n{Na7RzL*R9Z9`40^Fva;lIflj&T!Tz+UY8fV1ZkEuc?lS!M|Y!>~BMitWI z@l@*ddPCNbolfTfwv9}q(b$$PBv!N8+;=z}nO3W{BU?zUTCMgIKwq}o?OoYIVpXfv zzTIwr-tBh3%N7!Ab91xja=BjgdcD4o;|hL2|JNaXZ*Om3tyYI+an&jm3OjJ0e1)N8 zm#)W^%jH_j%gdR;U~nK?NUT&U)mT|s$sU4a3yBqv$LqmhFgF|yN3w;)T3cJIg~Q=> zSOkYO`kz1&5zOWX$XY6pBwI)T3Gl0cf_{;tYag+xA0&`1Mj=}ykXwvGZjnIZVxV2d z06REt5=gvZR~UnQgX1RMC#&dK5s<{S!N)sRu@ZhTcfdAuRQ4h@;f#9=euwxvJ2}?Y zy#{|B_b~9cW8qbFRO5p`9$yjx>@&E_r{*VgLY3ri0R{lIBCT m-o+D*vL38xWMObn^tomvpcVhX~C5P hfz0h)jSP%z43bA#R32EIs{v|b@O1TaS?83{1OPdrCnx{_ literal 0 HcmV?d00001 diff --git a/module/viewer/img/prettyPhoto/facebook/contentPatternRight.png b/module/viewer/img/prettyPhoto/facebook/contentPatternRight.png new file mode 100644 index 0000000000000000000000000000000000000000..76e50d0f5c6a8d0ee5f69b82493d94805f93d47b GIT binary patch literal 136 zcmeAS@N?(olHy`uVBq!ia0vp^A|TAc1|)ksWqE;=WQl7;NpOBzNqJ&XDuZK6ep0G} zXKrG8YEWuoN@d~6R2!foEl(H6kcwMLfB0E=SQwO*la-k#HgqC} m{yP{*X)b2tGiPRG;$g@#WM60<^5zjxFN3G6pUXO@geCwXd?|PU literal 0 HcmV?d00001 diff --git a/module/viewer/img/prettyPhoto/facebook/default_thumbnail.gif b/module/viewer/img/prettyPhoto/facebook/default_thumbnail.gif new file mode 100644 index 0000000000000000000000000000000000000000..2b1280f32756805aaa557cea32c70b05a2aa46b4 GIT binary patch literal 227 zcmZ?wbhEHbG-6O>IKlt||NsBb%*?E=uIA+AG%zrD`0!y=R1_N<+vm@pjg5^ZBqW4{ zgcKDO=ggUN^5n@6A3hv7aNygwZyp{VGiT1cdi82iQIVXS9M~i*gyK&Yu&54*1lh^J znxLT2my$UzW7WEx*ZT@|&X?rguUPlK=KX)mqpTdl9&9X0-U1vFe5XV=OIC<1TA^wB zAR@v0R&G+mkFG;kP93Sa$EGmNNLpZ-!L!AgPrAh9_7P-L(M E0LAB0sQ>@~ literal 0 HcmV?d00001 diff --git a/module/viewer/img/prettyPhoto/facebook/loader.gif b/module/viewer/img/prettyPhoto/facebook/loader.gif new file mode 100644 index 0000000000000000000000000000000000000000..7ac990cf04f2323f9723518bfd72ce102222cefa GIT binary patch literal 2545 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
",j.shrinkWrapBlocks=a.offsetWidth!==2),a.innerHTML="
t
",n=a.getElementsByTagName("td"),r=n[0].offsetHeight===0,n[0].style.display="",n[1].style.display="none",j.reliableHiddenOffsets=r&&n[0].offsetHeight===0,a.innerHTML="",c.defaultView&&c.defaultView.getComputedStyle&&(i=c.createElement("div"),i.style.width="0",i.style.marginRight="0",a.appendChild(i),j.reliableMarginRight=(parseInt((c.defaultView.getComputedStyle(i,null)||{marginRight:0}).marginRight,10)||0)===0),l.innerHTML="",b.removeChild(l);if(a.attachEvent)for(q in{submit:1,change:1,focusin:1})p="on"+q,r=p in a,r||(a.setAttribute(p,"return;"),r=typeof a[p]=="function"),j[q+"Bubbles"]=r;return j}(),f.boxModel=f.support.boxModel;var i=/^(?:\{.*\}|\[.*\])$/,j=/([a-z])([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=f.expando,h=typeof c=="string",i,j=a.nodeType,k=j?f.cache:a,l=j?a[f.expando]:a[f.expando]&&f.expando;if((!l||e&&l&&!k[l][g])&&h&&d===b)return;l||(j?a[f.expando]=l=++f.uuid:l=f.expando),k[l]||(k[l]={},j||(k[l].toJSON=f.noop));if(typeof c=="object"||typeof c=="function")e?k[l][g]=f.extend(k[l][g],c):k[l]=f.extend(k[l],c);i=k[l],e&&(i[g]||(i[g]={}),i=i[g]),d!==b&&(i[f.camelCase(c)]=d);if(c==="events"&&!i[c])return i[g]&&i[g].events;return h?i[f.camelCase(c)]:i}},removeData:function(b,c,d){if(!!f.acceptData(b)){var e=f.expando,g=b.nodeType,h=g?f.cache:b,i=g?b[f.expando]:f.expando;if(!h[i])return;if(c){var j=d?h[i][e]:h[i];if(j){delete j[c];if(!l(j))return}}if(d){delete h[i][e];if(!l(h[i]))return}var k=h[i][e];f.support.deleteExpando||h!=a?delete h[i]:h[i]=null,k?(h[i]={},g||(h[i].toJSON=f.noop),h[i][e]=k):g&&(f.support.deleteExpando?delete b[f.expando]:b.removeAttribute?b.removeAttribute(f.expando):b[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-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;return(e.value||"").replace(p,"")}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=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);c=j&&f.attrFix[c]||c,i=f.attrHooks[c],i||(!t.test(c)||typeof d!="boolean"&&d!==b&&d.toLowerCase()!==c.toLowerCase()?v&&(f.nodeName(a,"form")||u.test(c))&&(i=v):i=w);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)return i.get(a,c);h=a.getAttribute(c);return h===null?b:h},removeAttr:function(a,b){var c;a.nodeType===1&&(b=f.attrFix[b]||b,f.support.getSetAttribute?a.removeAttribute(b):(f.attr(a,b,""),a.removeAttributeNode(a.getAttributeNode(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}}},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}}},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);c=i&&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))!==b?g:a[c]},propHooks:{}}),w={get:function(a,c){return a[f.propFix[c]||c]?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]=b),a.setAttribute(c,c.toLowerCase()));return c}},f.attrHooks.value={get:function(a,b){if(v&&f.nodeName(a,"button"))return v.get(a,b);return a.value},set:function(a,b,c){if(v&&f.nodeName(a,"button"))return v.set(a,b,c);a.value=b}},f.support.getSetAttribute||(f.attrFix=f.propFix,v=f.attrHooks.name=f.valHooks.button={get:function(a,c){var d;d=a.getAttributeNode(c);return d&&d.nodeValue!==""?d.nodeValue:b},set:function(a,b,c){var d=a.getAttributeNode(c);if(d){d.nodeValue=b;return 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)}})),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 x=Object.prototype.hasOwnProperty,y=/\.(.*)$/,z=/^(?:textarea|input|select)$/i,A=/\./g,B=/ /g,C=/[^\w\s.|`]/g,D=function(a){return a.replace(C,"\\$&")};f.event={add:function(a,c,d,e){if(a.nodeType!==3&&a.nodeType!==8){if(d===!1)d=E;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=E);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(),D).join("\\.(?:.*\\.)?")+"(\\.|$)")),p=t[h];if(!p)continue;if(!d){for(j=0;j=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?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-1?f.map(a.options,function(a){return a.selected}).join("-"):"":f.nodeName(a,"select")&&(c=a.selectedIndex);return c},K=function(c){var d=c.target,e,g;if(!!z.test(d.nodeName)&&!d.readOnly){e=f._data(d,"_change_data"),g=J(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:K,beforedeactivate:K,click:function(a){var b=a.target,c=f.nodeName(b,"input")?b.type:"";(c==="radio"||c==="checkbox"||f.nodeName(b,"select"))&&K.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")&&K.call(this,a)},beforeactivate:function(a){var b=a.target;f._data(b,"_change_data",J(b))}},setup:function(a,b){if(this.type==="file")return!1;for(var c in I)f.event.add(this,c+".specialChange",I[c]);return z.test(this.nodeName)},teardown:function(a){f.event.remove(this,".specialChange");return z.test(this.nodeName)}},I=f.event.special.change.filters,I.focus=I.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;i0?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;g0){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+~,(\[\\]+)+|[>+~])(\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;b0},k.find=function(a,b,c){var d;if(!a)return[];for(var e=0,f=l.order.length;e":function(a,b){var c,d=typeof b=="string",e=0,f=a.length;if(d&&!j.test(b)){b=b.toLowerCase();for(;e=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 bc[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=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",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.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="

";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="
";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;g0)for(h=g;h0: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-1:f(g).is(h))&&c.push({selector:i,elem:g,level:k});g=g.parentNode,k++}}return c}var l=U.test(a)||typeof a!="string"?f(a,b||this.context):0;for(d=0,e=this.length;d-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||typeof a=="string")return f.inArray(this[0],a?f(a):this.parent().children());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(W(c[0])||W(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=T.call(arguments);P.test(a)||(d=c),d&&typeof d=="string"&&(e=f.filter(d,e)),e=this.length>1&&!V[a]?f.unique(e):e,(this.length>1||R.test(d))&&Q.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 Y=/ jQuery\d+="(?:\d+|null)"/g,Z=/^\s+/,$=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,_=/<([\w:]+)/,ba=/",""],legend:[1,"
","
"],thead:[1,"","
"],tr:[2,"","
"],td:[3,"","
"],col:[2,"","
"],area:[1,"",""],_default:[0,"",""]};bg.optgroup=bg.option,bg.tbody=bg.tfoot=bg.colgroup=bg.caption=bg.thead,bg.th=bg.td,f.support.htmlSerialize||(bg._default=[1,"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(Y,""):null;if(typeof a=="string"&&!bc.test(a)&&(f.support.leadingWhitespace||!Z.test(a))&&!bg[(_.exec(a)||["",""])[1].toLowerCase()]){a=a.replace($,"<$1>");try{for(var c=0,d=this.length;c1&&l0?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)){bj(a,d),e=bk(a),g=bk(d);for(h=0;e[h];++h)bj(e[h],g[h])}if(b){bi(a,d);if(c){e=bk(a),g=bk(d);for(h=0;e[h];++h)bi(e[h],g[h])}}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(!bb.test(k))k=b.createTextNode(k);else{k=k.replace($,"<$1>");var l=(_.exec(k)||["",""])[1].toLowerCase(),m=bg[l]||bg._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=ba.test(k),q=l==="table"&&!p?o.firstChild&&o.firstChild.childNodes:m[1]===""&&!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&&Z.test(k)&&o.insertBefore(b.createTextNode(Z.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=0)return b+"px"}}}),f.support.opacity||(f.cssHooks.opacity={get:function(a,b){return bp.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;c.zoom=1;var e=f.isNaN(b)?"":"alpha(opacity="+b*100+")",g=d&&d.filter||c.filter||"";c.filter=bo.test(g)?g.replace(bo,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=bz(a,"margin-right","marginRight"):c=a.style.marginRight});return c}})}),c.defaultView&&c.defaultView.getComputedStyle&&(bA=function(a,c){var d,e,g;c=c.replace(br,"-$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&&(bB=function(a,b){var c,d=a.currentStyle&&a.currentStyle[b],e=a.runtimeStyle&&a.runtimeStyle[b],f=a.style;!bs.test(d)&&bt.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}),bz=bA||bB,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 bE=/%20/g,bF=/\[\]$/,bG=/\r?\n/g,bH=/#.*$/,bI=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,bJ=/^(?:color|date|datetime|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,bK=/^(?:about|app|app\-storage|.+\-extension|file|widget):$/,bL=/^(?:GET|HEAD)$/,bM=/^\/\//,bN=/\?/,bO=/)<[^<]*)*<\/script>/gi,bP=/^(?:select|textarea)/i,bQ=/\s+/,bR=/([?&])_=[^&]*/,bS=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,bT=f.fn.load,bU={},bV={},bW,bX;try{bW=e.href}catch(bY){bW=c.createElement("a"),bW.href="",bW=bW.href}bX=bS.exec(bW.toLowerCase())||[],f.fn.extend({load:function(a,c,d){if(typeof a!="string"&&bT)return bT.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("
").append(c.replace(bO,"")).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||bP.test(this.nodeName)||bJ.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(bG,"\r\n")}}):{name:b.name,value:c.replace(bG,"\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?f.extend(!0,a,f.ajaxSettings,b):(b=a,a=f.extend(!0,f.ajaxSettings,b));for(var c in{context:1,url:1})c in b?a[c]=b[c]:c in f.ajaxSettings&&(a[c]=f.ajaxSettings[c]);return a},ajaxSettings:{url:bW,isLocal:bK.test(bX[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","*":"*/*"},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}},ajaxPrefilter:bZ(bU),ajaxTransport:bZ(bV),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?4:0;var o,r,u,w=l?ca(d,v,l):b,x,y;if(a>=200&&a<300||a===304){if(d.ifModified){if(x=v.getResponseHeader("Last-Modified"))f.lastModified[k]=x;if(y=v.getResponseHeader("Etag"))f.etag[k]=y}if(a===304)c="notmodified",o=!0;else try{r=cb(d,w),c="success",o=!0}catch(z){c="parsererror",u=z}}else{u=c;if(!c||a)c="error",a<0&&(a=0)}v.status=a,v.statusText=c,o?h.resolveWith(e,[r,c,v]):h.rejectWith(e,[v,c,u]),v.statusCode(j),j=b,t&&g.trigger("ajax"+(o?"Success":"Error"),[v,d,o?r:u]),i.resolveWith(e,[v,c]),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=bI.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(bH,"").replace(bM,bX[1]+"//"),d.dataTypes=f.trim(d.dataType||"*").toLowerCase().split(bQ),d.crossDomain==null&&(r=bS.exec(d.url.toLowerCase()),d.crossDomain=!(!r||r[1]==bX[1]&&r[2]==bX[2]&&(r[3]||(r[1]==="http:"?80:443))==(bX[3]||(bX[1]==="http:"?80:443)))),d.data&&d.processData&&typeof d.data!="string"&&(d.data=f.param(d.data,d.traditional)),b$(bU,d,c,v);if(s===2)return!1;t=d.global,d.type=d.type.toUpperCase(),d.hasContent=!bL.test(d.type),t&&f.active++===0&&f.event.trigger("ajaxStart");if(!d.hasContent){d.data&&(d.url+=(bN.test(d.url)?"&":"?")+d.data),k=d.url;if(d.cache===!1){var x=f.now(),y=d.url.replace(bR,"$1_="+x);d.url=y+(y===d.url?(bN.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]!=="*"?", */*; 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=b$(bV,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){status<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)b_(g,a[g],c,e);return d.join("&").replace(bE,"+")}}),f.extend({active:0,lastModified:{},etag:{}});var cc=f.now(),cd=/(\=)\?(&|$)|\?\?/i;f.ajaxSetup({jsonp:"callback",jsonpCallback:function(){return f.expando+"_"+cc++}}),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&&(cd.test(b.url)||e&&cd.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(cd,l),b.url===j&&(e&&(k=k.replace(cd,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 ce=a.ActiveXObject?function(){for(var a in cg)cg[a](0,1)}:!1,cf=0,cg;f.ajaxSettings.xhr=a.ActiveXObject?function(){return!this.isLocal&&ch()||ci()}:ch,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,ce&&delete cg[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=++cf,ce&&(cg||(cg={},f(a).unload(ce)),cg[i]=d),h.onreadystatechange=d)},abort:function(){d&&d(0,1)}}}});var cj={},ck,cl,cm=/^(?:toggle|show|hide)$/,cn=/^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,co,cp=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]],cq,cr=a.webkitRequestAnimationFrame||a.mozRequestAnimationFrame||a.oRequestAnimationFrame;f.fn.extend({show:function(a,b,c){var d,e;if(a||a===0)return this.animate(cu("show",3),a,b,c);for(var g=0,h=this.length;g=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
";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=cx.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&&!cx.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=cy(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=cy(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(){return this[0]?parseFloat(f.css(this[0],d,"padding")):null},f.fn["outer"+c]=function(a){return this[0]?parseFloat(f.css(this[0],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];return e.document.compatMode==="CSS1Compat"&&g||e.document.body["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 h=f.css(e,d),i=parseFloat(h);return f.isNaN(i)?h:i}return this.css(d,typeof a=="string"?a:a+"px")}}),a.jQuery=a.$=f})(window); \ No newline at end of file diff --git a/module/viewer/lib/js/jquery.url.js b/module/viewer/lib/js/jquery.url.js new file mode 100644 index 0000000..69e0921 --- /dev/null +++ b/module/viewer/lib/js/jquery.url.js @@ -0,0 +1,159 @@ +// JQuery URL Parser plugin - https://github.com/allmarkedup/jQuery-URL-Parser +// Written by Mark Perkins, mark@allmarkedup.com +// License: http://unlicense.org/ (i.e. do what you want with it!) + +;(function($, undefined) { + + var tag2attr = { + a : 'href', + img : 'src', + form : 'action', + base : 'href', + script : 'src', + iframe : 'src', + link : 'href' + }, + + key = ["source","protocol","authority","userInfo","user","password","host","port","relative","path","directory","file","query","fragment"], // keys available to query + + aliases = { "anchor" : "fragment" }, // aliases for backwards compatability + + parser = { + strict : /^(?:([^:\/?#]+):)?(?:\/\/((?:(([^:@]*):?([^:@]*))?@)?([^:\/?#]*)(?::(\d*))?))?((((?:[^?#\/]*\/)*)([^?#]*))(?:\?([^#]*))?(?:#(.*))?)/, //less intuitive, more accurate to the specs + loose : /^(?:(?![^:@]+:[^:@\/]*@)([^:\/?#.]+):)?(?:\/\/)?((?:(([^:@]*):?([^:@]*))?@)?([^:\/?#]*)(?::(\d*))?)(((\/(?:[^?#](?![^?#\/]*\.[^?#\/.]+(?:[?#]|$)))*\/?)?([^?#\/]*))(?:\?([^#]*))?(?:#(.*))?)/ // more intuitive, fails on relative paths and deviates from specs + }, + + querystring_parser = /(?:^|&|;)([^&=;]*)=?([^&;]*)/g, // supports both ampersand and semicolon-delimted query string key/value pairs + + fragment_parser = /(?:^|&|;)([^&=;]*)=?([^&;]*)/g; // supports both ampersand and semicolon-delimted fragment key/value pairs + + function parseUri( url, strictMode ) + { + var str = decodeURI( url ), + res = parser[ strictMode || false ? "strict" : "loose" ].exec( str ), + uri = { attr : {}, param : {}, seg : {} }, + i = 14; + + while ( i-- ) + { + uri.attr[ key[i] ] = res[i] || ""; + } + + // build query and fragment parameters + + uri.param['query'] = {}; + uri.param['fragment'] = {}; + + uri.attr['query'].replace( querystring_parser, function ( $0, $1, $2 ){ + if ($1) + { + uri.param['query'][$1] = $2; + } + }); + + uri.attr['fragment'].replace( fragment_parser, function ( $0, $1, $2 ){ + if ($1) + { + uri.param['fragment'][$1] = $2; + } + }); + + // split path and fragement into segments + + uri.seg['path'] = uri.attr.path.replace(/^\/+|\/+$/g,'').split('/'); + + uri.seg['fragment'] = uri.attr.fragment.replace(/^\/+|\/+$/g,'').split('/'); + + // compile a 'base' domain attribute + + uri.attr['base'] = uri.attr.host ? uri.attr.protocol+"://"+uri.attr.host + (uri.attr.port ? ":"+uri.attr.port : '') : ''; + + return uri; + }; + + function getAttrName( elm ) + { + var tn = elm.tagName; + if ( tn !== undefined ) return tag2attr[tn.toLowerCase()]; + return tn; + } + + $.fn.url = function( strictMode ) + { + var url = ''; + + if ( this.length ) + { + url = $(this).attr( getAttrName(this[0]) ) || ''; + } + + return $.url( url, strictMode ); + }; + + $.url = function( url, strictMode ) + { + if ( arguments.length === 1 && url === true ) + { + strictMode = true; + url = undefined; + } + + strictMode = strictMode || false; + url = url || window.location.toString(); + + return { + + data : parseUri(url, strictMode), + + // get various attributes from the URI + attr : function( attr ) + { + attr = aliases[attr] || attr; + return attr !== undefined ? this.data.attr[attr] : this.data.attr; + }, + + // return query string parameters + param : function( param ) + { + return param !== undefined ? this.data.param.query[param] : this.data.param.query; + }, + + // return fragment parameters + fparam : function( param ) + { + return param !== undefined ? this.data.param.fragment[param] : this.data.param.fragment; + }, + + // return path segments + segment : function( seg ) + { + if ( seg === undefined ) + { + return this.data.seg.path; + } + else + { + seg = seg < 0 ? this.data.seg.path.length + seg : seg - 1; // negative segments count from the end + return this.data.seg.path[seg]; + } + }, + + // return fragment segments + fsegment : function( seg ) + { + if ( seg === undefined ) + { + return this.data.seg.fragment; + } + else + { + seg = seg < 0 ? this.data.seg.fragment.length + seg : seg - 1; // negative segments count from the end + return this.data.seg.fragment[seg]; + } + } + + }; + + }; + +})(jQuery); \ No newline at end of file diff --git a/module/viewer/lib/js/jtree/_demo/_dump.sql b/module/viewer/lib/js/jtree/_demo/_dump.sql new file mode 100644 index 0000000..c4a32a8 --- /dev/null +++ b/module/viewer/lib/js/jtree/_demo/_dump.sql @@ -0,0 +1,20 @@ +CREATE TABLE IF NOT EXISTS `tree` ( + `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, + `parent_id` bigint(20) unsigned NOT NULL, + `position` bigint(20) unsigned NOT NULL, + `left` bigint(20) unsigned NOT NULL, + `right` bigint(20) unsigned NOT NULL, + `level` bigint(20) unsigned NOT NULL, + `title` text CHARACTER SET utf8 COLLATE utf8_unicode_ci, + `type` varchar(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=13 ; + +INSERT INTO `tree` (`id`, `parent_id`, `position`, `left`, `right`, `level`, `title`, `type`) VALUES +(1, 0, 2, 1, 14, 0, 'ROOT', ''), +(2, 1, 0, 2, 11, 1, 'C:', 'drive'), +(3, 2, 0, 3, 6, 2, '_demo', 'folder'), +(4, 3, 0, 4, 5, 3, 'index.html', 'default'), +(5, 2, 1, 7, 10, 2, '_docs', 'folder'), +(6, 1, 1, 12, 13, 1, 'D:', 'drive'), +(12, 5, 0, 8, 9, 3, 'zmei.html', 'default'); diff --git a/module/viewer/lib/js/jtree/_demo/_inc/__mysql_errors.log b/module/viewer/lib/js/jtree/_demo/_inc/__mysql_errors.log new file mode 100644 index 0000000..247fa07 --- /dev/null +++ b/module/viewer/lib/js/jtree/_demo/_inc/__mysql_errors.log @@ -0,0 +1,91 @@ +[2011-11-02 17:15:36] Connection error: Access denied for user 'root'@'localhost' (using password: NO) <> +[2011-11-02 17:15:36] Could node connect for query: SELECT `id` , `parent_id` , `position` , `left` , `right` , `level` , `title` , `type` FROM `tree` WHERE `parent_id` = 1 ORDER BY `position` ASC <> +[2011-11-02 17:15:36] No query pending <> +[2011-11-02 17:15:36] TRUNCATE TABLE `tree` <> +[2011-11-02 17:15:36] INSERT INTO `tree` (`id`, `parent_id`, `position`, `left`, `right`, `level` ) VALUES (1, 0, 0, 1, 2, 0 ) <> +[2011-11-02 17:15:36] SELECT `id` , `parent_id` , `position` , `left` , `right` , `level` , `title` , `type` FROM `tree` WHERE `id` = 0 <> +[2011-11-02 17:15:36] No query pending <> +[2011-11-02 17:15:36] nf: no result set <> +[2011-11-02 17:15:36] SELECT `id` , `parent_id` , `position` , `left` , `right` , `level` , `title` , `type` FROM `tree` WHERE `parent_id` = 0 ORDER BY `position` ASC <> +[2011-11-02 17:15:36] No query pending <> +[2011-11-02 17:15:36] SELECT `id` , `parent_id` , `position` , `left` , `right` , `level` , `title` , `type` FROM `tree` WHERE `id` = 1 <> +[2011-11-02 17:15:36] No query pending <> +[2011-11-02 17:15:36] nf: no result set <> +[2011-11-02 17:15:36] SELECT `id` , `parent_id` , `position` , `left` , `right` , `level` , `title` , `type` FROM `tree` WHERE `parent_id` = 1 ORDER BY `position` ASC <> +[2011-11-02 17:15:36] No query pending <> +[2011-11-02 17:15:36] UPDATE `tree` SET `position` = `position` + 1 WHERE `parent_id` = 1 AND `position` >= 0 AND `id` NOT IN (-1) <> +[2011-11-02 17:15:36] UPDATE `tree` SET `left` = `left` + 2 WHERE `left` >= 1 AND `id` NOT IN (-1) <> +[2011-11-02 17:15:36] UPDATE `tree` SET `right` = `right` + 2 WHERE `right` >= 1 AND `id` NOT IN (-1) <> +[2011-11-02 17:15:36] INSERT INTO `tree` (`parent_id`, `position`, `left`, `right`, `level` ) VALUES (1, 0, 1, 2, 1) <> +[2011-11-02 17:15:36] SELECT `id` , `parent_id` , `position` , `left` , `right` , `level` , `title` , `type` FROM `tree` WHERE `id` = 0 <> +[2011-11-02 17:15:36] No query pending <> +[2011-11-02 17:15:36] nf: no result set <> +[2011-11-02 17:15:36] SELECT `id` , `parent_id` , `position` , `left` , `right` , `level` , `title` , `type` FROM `tree` WHERE `parent_id` = 0 ORDER BY `position` ASC <> +[2011-11-02 17:15:36] No query pending <> +[2011-11-02 17:15:36] SELECT `id` , `parent_id` , `position` , `left` , `right` , `level` , `title` , `type` FROM `tree` WHERE `id` = 1 <> +[2011-11-02 17:15:36] No query pending <> +[2011-11-02 17:15:36] nf: no result set <> +[2011-11-02 17:15:36] SELECT `id` , `parent_id` , `position` , `left` , `right` , `level` , `title` , `type` FROM `tree` WHERE `parent_id` = 1 ORDER BY `position` ASC <> +[2011-11-02 17:15:36] No query pending <> +[2011-11-02 17:15:36] UPDATE `tree` SET `position` = `position` + 1 WHERE `parent_id` = 1 AND `position` >= 0 AND `id` NOT IN (-1) <> +[2011-11-02 17:15:36] UPDATE `tree` SET `left` = `left` + 2 WHERE `left` >= 1 AND `id` NOT IN (-1) <> +[2011-11-02 17:15:36] UPDATE `tree` SET `right` = `right` + 2 WHERE `right` >= 1 AND `id` NOT IN (-1) <> +[2011-11-02 17:15:36] INSERT INTO `tree` (`parent_id`, `position`, `left`, `right`, `level` ) VALUES (1, 0, 1, 2, 1) <> +[2011-11-02 17:15:36] SELECT `id` , `parent_id` , `position` , `left` , `right` , `level` , `title` , `type` FROM `tree` WHERE `id` = 0 <> +[2011-11-02 17:15:36] No query pending <> +[2011-11-02 17:15:36] nf: no result set <> +[2011-11-02 17:15:36] SELECT `id` , `parent_id` , `position` , `left` , `right` , `level` , `title` , `type` FROM `tree` WHERE `parent_id` = 0 ORDER BY `position` ASC <> +[2011-11-02 17:15:36] No query pending <> +[2011-11-02 17:15:36] SELECT `id` , `parent_id` , `position` , `left` , `right` , `level` , `title` , `type` FROM `tree` WHERE `id` = 2 <> +[2011-11-02 17:15:36] No query pending <> +[2011-11-02 17:15:36] nf: no result set <> +[2011-11-02 17:15:36] SELECT `id` , `parent_id` , `position` , `left` , `right` , `level` , `title` , `type` FROM `tree` WHERE `parent_id` = 2 ORDER BY `position` ASC <> +[2011-11-02 17:15:36] No query pending <> +[2011-11-02 17:15:36] UPDATE `tree` SET `position` = `position` + 1 WHERE `parent_id` = 2 AND `position` >= 0 AND `id` NOT IN (-1) <> +[2011-11-02 17:15:36] UPDATE `tree` SET `left` = `left` + 2 WHERE `left` >= 1 AND `id` NOT IN (-1) <> +[2011-11-02 17:15:36] UPDATE `tree` SET `right` = `right` + 2 WHERE `right` >= 1 AND `id` NOT IN (-1) <> +[2011-11-02 17:15:36] INSERT INTO `tree` (`parent_id`, `position`, `left`, `right`, `level` ) VALUES (2, 0, 1, 2, 1) <> +[2011-11-02 17:15:36] SELECT `id` , `parent_id` , `position` , `left` , `right` , `level` , `title` , `type` FROM `tree` WHERE `id` = 0 <> +[2011-11-02 17:15:36] No query pending <> +[2011-11-02 17:15:36] nf: no result set <> +[2011-11-02 17:15:36] SELECT `id` , `parent_id` , `position` , `left` , `right` , `level` , `title` , `type` FROM `tree` WHERE `parent_id` = 0 ORDER BY `position` ASC <> +[2011-11-02 17:15:36] No query pending <> +[2011-11-02 17:15:36] SELECT `id` , `parent_id` , `position` , `left` , `right` , `level` , `title` , `type` FROM `tree` WHERE `id` = 2 <> +[2011-11-02 17:15:36] No query pending <> +[2011-11-02 17:15:36] nf: no result set <> +[2011-11-02 17:15:36] SELECT `id` , `parent_id` , `position` , `left` , `right` , `level` , `title` , `type` FROM `tree` WHERE `parent_id` = 2 ORDER BY `position` ASC <> +[2011-11-02 17:15:36] No query pending <> +[2011-11-02 17:15:36] UPDATE `tree` SET `position` = `position` + 1 WHERE `parent_id` = 2 AND `position` >= 0 AND `id` NOT IN (-1) <> +[2011-11-02 17:15:36] UPDATE `tree` SET `left` = `left` + 2 WHERE `left` >= 1 AND `id` NOT IN (-1) <> +[2011-11-02 17:15:36] UPDATE `tree` SET `right` = `right` + 2 WHERE `right` >= 1 AND `id` NOT IN (-1) <> +[2011-11-02 17:15:36] INSERT INTO `tree` (`parent_id`, `position`, `left`, `right`, `level` ) VALUES (2, 0, 1, 2, 1) <> +[2011-11-02 17:15:36] SELECT `id` , `parent_id` , `position` , `left` , `right` , `level` , `title` , `type` FROM `tree` WHERE `id` = 0 <> +[2011-11-02 17:15:36] No query pending <> +[2011-11-02 17:15:36] nf: no result set <> +[2011-11-02 17:15:36] SELECT `id` , `parent_id` , `position` , `left` , `right` , `level` , `title` , `type` FROM `tree` WHERE `parent_id` = 0 ORDER BY `position` ASC <> +[2011-11-02 17:15:36] No query pending <> +[2011-11-02 17:15:36] SELECT `id` , `parent_id` , `position` , `left` , `right` , `level` , `title` , `type` FROM `tree` WHERE `id` = 4 <> +[2011-11-02 17:15:36] No query pending <> +[2011-11-02 17:15:36] nf: no result set <> +[2011-11-02 17:15:36] SELECT `id` , `parent_id` , `position` , `left` , `right` , `level` , `title` , `type` FROM `tree` WHERE `parent_id` = 4 ORDER BY `position` ASC <> +[2011-11-02 17:15:36] No query pending <> +[2011-11-02 17:15:36] UPDATE `tree` SET `position` = `position` + 1 WHERE `parent_id` = 4 AND `position` >= 0 AND `id` NOT IN (-1) <> +[2011-11-02 17:15:36] UPDATE `tree` SET `left` = `left` + 2 WHERE `left` >= 1 AND `id` NOT IN (-1) <> +[2011-11-02 17:15:36] UPDATE `tree` SET `right` = `right` + 2 WHERE `right` >= 1 AND `id` NOT IN (-1) <> +[2011-11-02 17:15:36] INSERT INTO `tree` (`parent_id`, `position`, `left`, `right`, `level` ) VALUES (4, 0, 1, 2, 1) <> +[2011-11-02 17:15:36] SELECT `id` , `parent_id` , `position` , `left` , `right` , `level` , `title` , `type` FROM `tree` WHERE `id` = 0 <> +[2011-11-02 17:15:36] No query pending <> +[2011-11-02 17:15:36] nf: no result set <> +[2011-11-02 17:15:36] SELECT `id` , `parent_id` , `position` , `left` , `right` , `level` , `title` , `type` FROM `tree` WHERE `parent_id` = 0 ORDER BY `position` ASC <> +[2011-11-02 17:15:36] No query pending <> +[2011-11-02 17:15:36] SELECT `id` , `parent_id` , `position` , `left` , `right` , `level` , `title` , `type` FROM `tree` WHERE `id` = 5 <> +[2011-11-02 17:15:36] No query pending <> +[2011-11-02 17:15:36] nf: no result set <> +[2011-11-02 17:15:36] SELECT `id` , `parent_id` , `position` , `left` , `right` , `level` , `title` , `type` FROM `tree` WHERE `parent_id` = 5 ORDER BY `position` ASC <> +[2011-11-02 17:15:36] No query pending <> +[2011-11-02 17:15:36] UPDATE `tree` SET `position` = `position` + 1 WHERE `parent_id` = 5 AND `position` >= 0 AND `id` NOT IN (-1) <> +[2011-11-02 17:15:36] UPDATE `tree` SET `left` = `left` + 2 WHERE `left` >= 1 AND `id` NOT IN (-1) <> +[2011-11-02 17:15:36] UPDATE `tree` SET `right` = `right` + 2 WHERE `right` >= 1 AND `id` NOT IN (-1) <> +[2011-11-02 17:15:36] INSERT INTO `tree` (`parent_id`, `position`, `left`, `right`, `level` ) VALUES (5, 0, 1, 2, 1) <> +[2011-11-02 17:15:36] SELECT `id` , `parent_id` , `position` , `left` , `right` , `level` , `title` , `type` FROM `tree` WHERE `parent_id` = 1 ORDER BY `position` ASC <> +[2011-11-02 17:15:36] No query pending <> diff --git a/module/viewer/lib/js/jtree/_demo/_inc/class._database.php b/module/viewer/lib/js/jtree/_demo/_inc/class._database.php new file mode 100644 index 0000000..993cf1d --- /dev/null +++ b/module/viewer/lib/js/jtree/_demo/_inc/class._database.php @@ -0,0 +1,146 @@ + "localhost", + "serverport"=> "3306", + "username" => false, + "password" => false, + "database" => false, + "persist" => false, + "dieonerror"=> false, + "showerror" => false, + "error_file"=> true + ); + + function __construct() { + global $db_config; + $this->settings = array_merge($this->settings, $db_config); + if($this->settings["error_file"] === true) $this->settings["error_file"] = dirname(__FILE__)."/__mysql_errors.log"; + } + + function connect() { + if (!$this->link) { + $this->link = ($this->settings["persist"]) ? + mysql_pconnect( + $this->settings["servername"].":".$this->settings["serverport"], + $this->settings["username"], + $this->settings["password"] + ) : + mysql_connect( + $this->settings["servername"].":".$this->settings["serverport"], + $this->settings["username"], + $this->settings["password"] + ) or $this->error(); + } + if (!mysql_select_db($this->settings["database"], $this->link)) $this->error(); + if($this->link) mysql_query("SET NAMES 'utf8'"); + return ($this->link) ? true : false; + } + + function query($sql) { + if (!$this->link && !$this->connect()) $this->error(); + if (!($this->result = mysql_query($sql, $this->link))) $this->error($sql); + return ($this->result) ? true : false; + } + + function nextr() { + if(!$this->result) { + $this->error("No query pending"); + return false; + } + unset($this->row); + $this->row = mysql_fetch_array($this->result, MYSQL_BOTH); + return ($this->row) ? true : false ; + } + + function get_row($mode = "both") { + if(!$this->row) return false; + + $return = array(); + switch($mode) { + case "assoc": + foreach($this->row as $k => $v) { + if(!is_int($k)) $return[$k] = $v; + } + break; + case "num": + foreach($this->row as $k => $v) { + if(is_int($k)) $return[$k] = $v; + } + break; + default: + $return = $this->row; + break; + } + return array_map("stripslashes",$return); + } + + function get_all($mode = "both", $key = false) { + if(!$this->result) { + $this->error("No query pending"); + return false; + } + $return = array(); + while($this->nextr()) { + if($key !== false) $return[$this->f($key)] = $this->get_row($mode); + else $return[] = $this->get_row($mode); + } + return $return; + } + + function f($index) { + return stripslashes($this->row[$index]); + } + + function go_to($row) { + if(!$this->result) { + $this->error("No query pending"); + return false; + } + if(!mysql_data_seek($this->result, $row)) $this->error(); + } + + function nf() { + if ($numb = mysql_num_rows($this->result) === false) $this->error(); + return mysql_num_rows($this->result); + } + function af() { + return mysql_affected_rows(); + } + function error($string="") { + $error = mysql_error(); + if($this->settings["show_error"]) echo $error; + if($this->settings["error_file"] !== false) { + $handle = @fopen($this->settings["error_file"], "a+"); + if($handle) { + @fwrite($handle, "[".date("Y-m-d H:i:s")."] ".$string." <".$error.">\n"); + @fclose($handle); + } + } + if($this->settings["dieonerror"]) { + if(isset($this->result)) mysql_free_result($this->result); + mysql_close($this->link); + die(); + } + } + function insert_id() { + if(!$this->link) return false; + return mysql_insert_id(); + } + function escape($string){ + if(!$this->link) return addslashes($string); + return mysql_real_escape_string($string); + } + + function destroy(){ + if (isset($this->result)) mysql_free_result($this->result); + if (isset($this->link)) mysql_close($this->link); + } + + +} +?> \ No newline at end of file diff --git a/module/viewer/lib/js/jtree/_demo/_inc/class._database_i.php b/module/viewer/lib/js/jtree/_demo/_inc/class._database_i.php new file mode 100644 index 0000000..5f6d93b --- /dev/null +++ b/module/viewer/lib/js/jtree/_demo/_inc/class._database_i.php @@ -0,0 +1,152 @@ + "localhost", + "serverport"=> "3306", + "username" => false, + "password" => false, + "database" => false, + "persist" => false, + "dieonerror"=> false, + "showerror" => false, + "error_file"=> true + ); + + function __construct() { + global $db_config; + $this->settings = array_merge($this->settings, $db_config); + if($this->settings["error_file"] === true) $this->settings["error_file"] = dirname(__FILE__)."/__mysql_errors.log"; + } + + function connect() { + $this->data = new mysqli( + $this->settings["servername"], + $this->settings["username"], + $this->settings["password"], + $this->settings["database"], + $this->settings["serverport"] + ); + + if(mysqli_connect_errno()) { + $this->error("Connection error: ".mysqli_connect_error() ); + return false; + } + if(!$this->data->set_charset("utf8")) { + $this->error("Error loading character set utf8"); + return false; + } + return true; + } + + function query($sql) { + if(!$this->data && !$this->connect()) { + $this->error("Could node connect for query: ".$sql); + return false; + } + //echo $sql."
:"; + if(!($this->result = $this->data->query($sql))) $this->error($sql); + return ($this->result) ? true : false; + } + + function nextr(){ + if(!$this->result) { + $this->error("No query pending"); + return false; + } + unset($this->row); + $this->row = $this->result->fetch_array(MYSQL_BOTH); + return ($this->row) ? true : false ; + } + + function get_row($mode = "both") { + if(!$this->row) return false; + + $return = array(); + switch($mode) { + case "assoc": + foreach($this->row as $k => $v) { + if(!is_int($k)) $return[$k] = $v; + } + break; + case "num": + foreach($this->row as $k => $v) { + if(is_int($k)) $return[$k] = $v; + } + break; + default: + $return = $this->row; + break; + } + return array_map("stripslashes",$return); + } + + function get_all($mode = "both", $key = false) { + if(!$this->result) { + $this->error("No query pending"); + return false; + } + $return = array(); + while($this->nextr()) { + if($key !== false) $return[$this->f($key)] = $this->get_row($mode); + else $return[] = $this->get_row($mode); + } + return $return; + } + + function f($index) { + return stripslashes($this->row[$index]); + } + + function go_to($row) { + if(!$this->result) { + $this->error("No query pending"); + return false; + } + if(!$this->data->data_seek($row)) $this->error(); + } + + function nf() { + if (!$this->result) { + $this->error("nf: no result set"); + return false; + } + return $this->result->num_rows; + } + function af() { + return $this->data->affected_rows; + } + function error($string = "") { + $error = $this->data->error; + if($this->settings["show_error"]) echo $error; + if($this->settings["error_file"] !== false) { + $handle = @fopen($this->settings["error_file"], "a+"); + if($handle) { + @fwrite($handle, "[".date("Y-m-d H:i:s")."] ".$string." <".$error.">\n"); + @fclose($handle); + } + } + if($this->settings["dieonerror"]) { + if(isset($this->result)) $this->result->free(); + @$this->data->close(); + die(); + } + } + function insert_id() { + return $this->data->insert_id; + } + function escape($string) { + if(!$this->data) return addslashes($string); + return $this->data->escape_string($string); + } + + function destroy() { + if(isset($this->result)) $this->result->free(); + if($this->data) $this->data->close(); + } + + +} \ No newline at end of file diff --git a/module/viewer/lib/js/jtree/_demo/_inc/class.tree.php b/module/viewer/lib/js/jtree/_demo/_inc/class.tree.php new file mode 100644 index 0000000..f10a572 --- /dev/null +++ b/module/viewer/lib/js/jtree/_demo/_inc/class.tree.php @@ -0,0 +1,602 @@ + false, + "parent_id" => false, + "position" => false, + "left" => false, + "right" => false, + "level" => false + ); + + // Constructor + function __construct($table = "tree", $fields = array()) { + $this->table = $table; + if(!count($fields)) { + foreach($this->fields as $k => &$v) { $v = $k; } + } + else { + foreach($fields as $key => $field) { + switch($key) { + case "id": + case "parent_id": + case "position": + case "left": + case "right": + case "level": + $this->fields[$key] = $field; + break; + } + } + } + // Database + $this->db = new _database; + } + + function _get_node($id) { + $this->db->query("SELECT `".implode("` , `", $this->fields)."` FROM `".$this->table."` WHERE `".$this->fields["id"]."` = ".(int) $id); + $this->db->nextr(); + return $this->db->nf() === 0 ? false : $this->db->get_row("assoc"); + } + function _get_children($id, $recursive = false) { + $children = array(); + if($recursive) { + $node = $this->_get_node($id); + $this->db->query("SELECT `".implode("` , `", $this->fields)."` FROM `".$this->table."` WHERE `".$this->fields["left"]."` >= ".(int) $node[$this->fields["left"]]." AND `".$this->fields["right"]."` <= ".(int) $node[$this->fields["right"]]." ORDER BY `".$this->fields["left"]."` ASC"); + } + else { + $this->db->query("SELECT `".implode("` , `", $this->fields)."` FROM `".$this->table."` WHERE `".$this->fields["parent_id"]."` = ".(int) $id." ORDER BY `".$this->fields["position"]."` ASC"); + } + while($this->db->nextr()) $children[$this->db->f($this->fields["id"])] = $this->db->get_row("assoc"); + return $children; + } + function _get_path($id) { + $node = $this->_get_node($id); + $path = array(); + if(!$node === false) return false; + $this->db->query("SELECT `".implode("` , `", $this->fields)."` FROM `".$this->table."` WHERE `".$this->fields["left"]."` <= ".(int) $node[$this->fields["left"]]." AND `".$this->fields["right"]."` >= ".(int) $node[$this->fields["right"]]); + while($this->db->nextr()) $path[$this->db->f($this->fields["id"])] = $this->db->get_row("assoc"); + return $path; + } + + function _create($parent, $position) { + return $this->_move(0, $parent, $position); + } + function _remove($id) { + if((int)$id === 1) { return false; } + $data = $this->_get_node($id); + $lft = (int)$data[$this->fields["left"]]; + $rgt = (int)$data[$this->fields["right"]]; + $dif = $rgt - $lft + 1; + + // deleting node and its children + $this->db->query("" . + "DELETE FROM `".$this->table."` " . + "WHERE `".$this->fields["left"]."` >= ".$lft." AND `".$this->fields["right"]."` <= ".$rgt + ); + // shift left indexes of nodes right of the node + $this->db->query("". + "UPDATE `".$this->table."` " . + "SET `".$this->fields["left"]."` = `".$this->fields["left"]."` - ".$dif." " . + "WHERE `".$this->fields["left"]."` > ".$rgt + ); + // shift right indexes of nodes right of the node and the node's parents + $this->db->query("" . + "UPDATE `".$this->table."` " . + "SET `".$this->fields["right"]."` = `".$this->fields["right"]."` - ".$dif." " . + "WHERE `".$this->fields["right"]."` > ".$lft + ); + + $pid = (int)$data[$this->fields["parent_id"]]; + $pos = (int)$data[$this->fields["position"]]; + + // Update position of siblings below the deleted node + $this->db->query("" . + "UPDATE `".$this->table."` " . + "SET `".$this->fields["position"]."` = `".$this->fields["position"]."` - 1 " . + "WHERE `".$this->fields["parent_id"]."` = ".$pid." AND `".$this->fields["position"]."` > ".$pos + ); + return true; + } + function _move($id, $ref_id, $position = 0, $is_copy = false) { + if((int)$ref_id === 0 || (int)$id === 1) { return false; } + $sql = array(); // Queries executed at the end + $node = $this->_get_node($id); // Node data + $nchildren = $this->_get_children($id); // Node children + $ref_node = $this->_get_node($ref_id); // Ref node data + $rchildren = $this->_get_children($ref_id);// Ref node children + + $ndif = 2; + $node_ids = array(-1); + if($node !== false) { + $node_ids = array_keys($this->_get_children($id, true)); + // TODO: should be !$is_copy && , but if copied to self - screws some right indexes + if(in_array($ref_id, $node_ids)) return false; + $ndif = $node[$this->fields["right"]] - $node[$this->fields["left"]] + 1; + } + if($position >= count($rchildren)) { + $position = count($rchildren); + } + + // Not creating or copying - old parent is cleaned + if($node !== false && $is_copy == false) { + $sql[] = "" . + "UPDATE `".$this->table."` " . + "SET `".$this->fields["position"]."` = `".$this->fields["position"]."` - 1 " . + "WHERE " . + "`".$this->fields["parent_id"]."` = ".$node[$this->fields["parent_id"]]." AND " . + "`".$this->fields["position"]."` > ".$node[$this->fields["position"]]; + $sql[] = "" . + "UPDATE `".$this->table."` " . + "SET `".$this->fields["left"]."` = `".$this->fields["left"]."` - ".$ndif." " . + "WHERE `".$this->fields["left"]."` > ".$node[$this->fields["right"]]; + $sql[] = "" . + "UPDATE `".$this->table."` " . + "SET `".$this->fields["right"]."` = `".$this->fields["right"]."` - ".$ndif." " . + "WHERE " . + "`".$this->fields["right"]."` > ".$node[$this->fields["left"]]." AND " . + "`".$this->fields["id"]."` NOT IN (".implode(",", $node_ids).") "; + } + // Preparing new parent + $sql[] = "" . + "UPDATE `".$this->table."` " . + "SET `".$this->fields["position"]."` = `".$this->fields["position"]."` + 1 " . + "WHERE " . + "`".$this->fields["parent_id"]."` = ".$ref_id." AND " . + "`".$this->fields["position"]."` >= ".$position." " . + ( $is_copy ? "" : " AND `".$this->fields["id"]."` NOT IN (".implode(",", $node_ids).") "); + + $ref_ind = $ref_id === 0 ? (int)$rchildren[count($rchildren) - 1][$this->fields["right"]] + 1 : (int)$ref_node[$this->fields["right"]]; + $ref_ind = max($ref_ind, 1); + + $self = ($node !== false && !$is_copy && (int)$node[$this->fields["parent_id"]] == $ref_id && $position > $node[$this->fields["position"]]) ? 1 : 0; + foreach($rchildren as $k => $v) { + if($v[$this->fields["position"]] - $self == $position) { + $ref_ind = (int)$v[$this->fields["left"]]; + break; + } + } + if($node !== false && !$is_copy && $node[$this->fields["left"]] < $ref_ind) { + $ref_ind -= $ndif; + } + + $sql[] = "" . + "UPDATE `".$this->table."` " . + "SET `".$this->fields["left"]."` = `".$this->fields["left"]."` + ".$ndif." " . + "WHERE " . + "`".$this->fields["left"]."` >= ".$ref_ind." " . + ( $is_copy ? "" : " AND `".$this->fields["id"]."` NOT IN (".implode(",", $node_ids).") "); + $sql[] = "" . + "UPDATE `".$this->table."` " . + "SET `".$this->fields["right"]."` = `".$this->fields["right"]."` + ".$ndif." " . + "WHERE " . + "`".$this->fields["right"]."` >= ".$ref_ind." " . + ( $is_copy ? "" : " AND `".$this->fields["id"]."` NOT IN (".implode(",", $node_ids).") "); + + $ldif = $ref_id == 0 ? 0 : $ref_node[$this->fields["level"]] + 1; + $idif = $ref_ind; + if($node !== false) { + $ldif = $node[$this->fields["level"]] - ($ref_node[$this->fields["level"]] + 1); + $idif = $node[$this->fields["left"]] - $ref_ind; + if($is_copy) { + $sql[] = "" . + "INSERT INTO `".$this->table."` (" . + "`".$this->fields["parent_id"]."`, " . + "`".$this->fields["position"]."`, " . + "`".$this->fields["left"]."`, " . + "`".$this->fields["right"]."`, " . + "`".$this->fields["level"]."`" . + ") " . + "SELECT " . + "".$ref_id.", " . + "`".$this->fields["position"]."`, " . + "`".$this->fields["left"]."` - (".($idif + ($node[$this->fields["left"]] >= $ref_ind ? $ndif : 0))."), " . + "`".$this->fields["right"]."` - (".($idif + ($node[$this->fields["left"]] >= $ref_ind ? $ndif : 0))."), " . + "`".$this->fields["level"]."` - (".$ldif.") " . + "FROM `".$this->table."` " . + "WHERE " . + "`".$this->fields["id"]."` IN (".implode(",", $node_ids).") " . + "ORDER BY `".$this->fields["level"]."` ASC"; + } + else { + $sql[] = "" . + "UPDATE `".$this->table."` SET " . + "`".$this->fields["parent_id"]."` = ".$ref_id.", " . + "`".$this->fields["position"]."` = ".$position." " . + "WHERE " . + "`".$this->fields["id"]."` = ".$id; + $sql[] = "" . + "UPDATE `".$this->table."` SET " . + "`".$this->fields["left"]."` = `".$this->fields["left"]."` - (".$idif."), " . + "`".$this->fields["right"]."` = `".$this->fields["right"]."` - (".$idif."), " . + "`".$this->fields["level"]."` = `".$this->fields["level"]."` - (".$ldif.") " . + "WHERE " . + "`".$this->fields["id"]."` IN (".implode(",", $node_ids).") "; + } + } + else { + $sql[] = "" . + "INSERT INTO `".$this->table."` (" . + "`".$this->fields["parent_id"]."`, " . + "`".$this->fields["position"]."`, " . + "`".$this->fields["left"]."`, " . + "`".$this->fields["right"]."`, " . + "`".$this->fields["level"]."` " . + ") " . + "VALUES (" . + $ref_id.", " . + $position.", " . + $idif.", " . + ($idif + 1).", " . + $ldif. + ")"; + } + foreach($sql as $q) { $this->db->query($q); } + $ind = $this->db->insert_id(); + if($is_copy) $this->_fix_copy($ind, $position); + return $node === false || $is_copy ? $ind : true; + } + function _fix_copy($id, $position) { + $node = $this->_get_node($id); + $children = $this->_get_children($id, true); + + $map = array(); + for($i = $node[$this->fields["left"]] + 1; $i < $node[$this->fields["right"]]; $i++) { + $map[$i] = $id; + } + foreach($children as $cid => $child) { + if((int)$cid == (int)$id) { + $this->db->query("UPDATE `".$this->table."` SET `".$this->fields["position"]."` = ".$position." WHERE `".$this->fields["id"]."` = ".$cid); + continue; + } + $this->db->query("UPDATE `".$this->table."` SET `".$this->fields["parent_id"]."` = ".$map[(int)$child[$this->fields["left"]]]." WHERE `".$this->fields["id"]."` = ".$cid); + for($i = $child[$this->fields["left"]] + 1; $i < $child[$this->fields["right"]]; $i++) { + $map[$i] = $cid; + } + } + } + + function _reconstruct() { + $this->db->query("" . + "CREATE TEMPORARY TABLE `temp_tree` (" . + "`".$this->fields["id"]."` INTEGER NOT NULL, " . + "`".$this->fields["parent_id"]."` INTEGER NOT NULL, " . + "`". $this->fields["position"]."` INTEGER NOT NULL" . + ") type=HEAP" + ); + $this->db->query("" . + "INSERT INTO `temp_tree` " . + "SELECT " . + "`".$this->fields["id"]."`, " . + "`".$this->fields["parent_id"]."`, " . + "`".$this->fields["position"]."` " . + "FROM `".$this->table."`" + ); + + $this->db->query("" . + "CREATE TEMPORARY TABLE `temp_stack` (" . + "`".$this->fields["id"]."` INTEGER NOT NULL, " . + "`".$this->fields["left"]."` INTEGER, " . + "`".$this->fields["right"]."` INTEGER, " . + "`".$this->fields["level"]."` INTEGER, " . + "`stack_top` INTEGER NOT NULL, " . + "`".$this->fields["parent_id"]."` INTEGER, " . + "`".$this->fields["position"]."` INTEGER " . + ") type=HEAP" + ); + $counter = 2; + $this->db->query("SELECT COUNT(*) FROM temp_tree"); + $this->db->nextr(); + $maxcounter = (int) $this->db->f(0) * 2; + $currenttop = 1; + $this->db->query("" . + "INSERT INTO `temp_stack` " . + "SELECT " . + "`".$this->fields["id"]."`, " . + "1, " . + "NULL, " . + "0, " . + "1, " . + "`".$this->fields["parent_id"]."`, " . + "`".$this->fields["position"]."` " . + "FROM `temp_tree` " . + "WHERE `".$this->fields["parent_id"]."` = 0" + ); + $this->db->query("DELETE FROM `temp_tree` WHERE `".$this->fields["parent_id"]."` = 0"); + + while ($counter <= $maxcounter) { + $this->db->query("" . + "SELECT " . + "`temp_tree`.`".$this->fields["id"]."` AS tempmin, " . + "`temp_tree`.`".$this->fields["parent_id"]."` AS pid, " . + "`temp_tree`.`".$this->fields["position"]."` AS lid " . + "FROM `temp_stack`, `temp_tree` " . + "WHERE " . + "`temp_stack`.`".$this->fields["id"]."` = `temp_tree`.`".$this->fields["parent_id"]."` AND " . + "`temp_stack`.`stack_top` = ".$currenttop." " . + "ORDER BY `temp_tree`.`".$this->fields["position"]."` ASC LIMIT 1" + ); + + if ($this->db->nextr()) { + $tmp = $this->db->f("tempmin"); + + $q = "INSERT INTO temp_stack (stack_top, `".$this->fields["id"]."`, `".$this->fields["left"]."`, `".$this->fields["right"]."`, `".$this->fields["level"]."`, `".$this->fields["parent_id"]."`, `".$this->fields["position"]."`) VALUES(".($currenttop + 1).", ".$tmp.", ".$counter.", NULL, ".$currenttop.", ".$this->db->f("pid").", ".$this->db->f("lid").")"; + $this->db->query($q); + $this->db->query("DELETE FROM `temp_tree` WHERE `".$this->fields["id"]."` = ".$tmp); + $counter++; + $currenttop++; + } + else { + $this->db->query("" . + "UPDATE temp_stack SET " . + "`".$this->fields["right"]."` = ".$counter.", " . + "`stack_top` = -`stack_top` " . + "WHERE `stack_top` = ".$currenttop + ); + $counter++; + $currenttop--; + } + } + + $temp_fields = $this->fields; + unset($temp_fields["parent_id"]); + unset($temp_fields["position"]); + unset($temp_fields["left"]); + unset($temp_fields["right"]); + unset($temp_fields["level"]); + if(count($temp_fields) > 1) { + $this->db->query("" . + "CREATE TEMPORARY TABLE `temp_tree2` " . + "SELECT `".implode("`, `", $temp_fields)."` FROM `".$this->table."` " + ); + } + $this->db->query("TRUNCATE TABLE `".$this->table."`"); + $this->db->query("" . + "INSERT INTO ".$this->table." (" . + "`".$this->fields["id"]."`, " . + "`".$this->fields["parent_id"]."`, " . + "`".$this->fields["position"]."`, " . + "`".$this->fields["left"]."`, " . + "`".$this->fields["right"]."`, " . + "`".$this->fields["level"]."` " . + ") " . + "SELECT " . + "`".$this->fields["id"]."`, " . + "`".$this->fields["parent_id"]."`, " . + "`".$this->fields["position"]."`, " . + "`".$this->fields["left"]."`, " . + "`".$this->fields["right"]."`, " . + "`".$this->fields["level"]."` " . + "FROM temp_stack " . + "ORDER BY `".$this->fields["id"]."`" + ); + if(count($temp_fields) > 1) { + $sql = "" . + "UPDATE `".$this->table."` v, `temp_tree2` SET v.`".$this->fields["id"]."` = v.`".$this->fields["id"]."` "; + foreach($temp_fields as $k => $v) { + if($k == "id") continue; + $sql .= ", v.`".$v."` = `temp_tree2`.`".$v."` "; + } + $sql .= " WHERE v.`".$this->fields["id"]."` = `temp_tree2`.`".$this->fields["id"]."` "; + $this->db->query($sql); + } + } + + function _analyze() { + $report = array(); + + $this->db->query("" . + "SELECT " . + "`".$this->fields["left"]."` FROM `".$this->table."` s " . + "WHERE " . + "`".$this->fields["parent_id"]."` = 0 " + ); + $this->db->nextr(); + if($this->db->nf() == 0) { + $report[] = "[FAIL]\tNo root node."; + } + else { + $report[] = ($this->db->nf() > 1) ? "[FAIL]\tMore than one root node." : "[OK]\tJust one root node."; + } + $report[] = ($this->db->f(0) != 1) ? "[FAIL]\tRoot node's left index is not 1." : "[OK]\tRoot node's left index is 1."; + + $this->db->query("" . + "SELECT " . + "COUNT(*) FROM `".$this->table."` s " . + "WHERE " . + "`".$this->fields["parent_id"]."` != 0 AND " . + "(SELECT COUNT(*) FROM `".$this->table."` WHERE `".$this->fields["id"]."` = s.`".$this->fields["parent_id"]."`) = 0 "); + $this->db->nextr(); + $report[] = ($this->db->f(0) > 0) ? "[FAIL]\tMissing parents." : "[OK]\tNo missing parents."; + + $this->db->query("SELECT MAX(`".$this->fields["right"]."`) FROM `".$this->table."`"); + $this->db->nextr(); + $n = $this->db->f(0); + $this->db->query("SELECT COUNT(*) FROM `".$this->table."`"); + $this->db->nextr(); + $c = $this->db->f(0); + $report[] = ($n/2 != $c) ? "[FAIL]\tRight index does not match node count." : "[OK]\tRight index matches count."; + + $this->db->query("" . + "SELECT COUNT(`".$this->fields["id"]."`) FROM `".$this->table."` s " . + "WHERE " . + "(SELECT COUNT(*) FROM `".$this->table."` WHERE " . + "`".$this->fields["right"]."` < s.`".$this->fields["right"]."` AND " . + "`".$this->fields["left"]."` > s.`".$this->fields["left"]."` AND " . + "`".$this->fields["level"]."` = s.`".$this->fields["level"]."` + 1" . + ") != " . + "(SELECT COUNT(*) FROM `".$this->table."` WHERE " . + "`".$this->fields["parent_id"]."` = s.`".$this->fields["id"]."`" . + ") " + ); + $this->db->nextr(); + $report[] = ($this->db->f(0) > 0) ? "[FAIL]\tAdjacency and nested set do not match." : "[OK]\tNS and AJ match"; + + return implode("
",$report); + } + + function _dump($output = false) { + $nodes = array(); + $this->db->query("SELECT * FROM ".$this->table." ORDER BY `".$this->fields["left"]."`"); + while($this->db->nextr()) $nodes[] = $this->db->get_row("assoc"); + if($output) { + echo "
";
+			foreach($nodes as $node) {
+				echo str_repeat(" ",(int)$node[$this->fields["level"]] * 2);
+				echo $node[$this->fields["id"]]." (".$node[$this->fields["left"]].",".$node[$this->fields["right"]].",".$node[$this->fields["level"]].",".$node[$this->fields["parent_id"]].",".$node[$this->fields["position"]].")
"; + } + echo str_repeat("-",40); + echo "
"; + } + return $nodes; + } + function _drop() { + $this->db->query("TRUNCATE TABLE `".$this->table."`"); + $this->db->query("" . + "INSERT INTO `".$this->table."` (" . + "`".$this->fields["id"]."`, " . + "`".$this->fields["parent_id"]."`, " . + "`".$this->fields["position"]."`, " . + "`".$this->fields["left"]."`, " . + "`".$this->fields["right"]."`, " . + "`".$this->fields["level"]."` " . + ") " . + "VALUES (" . + "1, " . + "0, " . + "0, " . + "1, " . + "2, " . + "0 ". + ")"); + } +} + +class json_tree extends _tree_struct { + function __construct($table = "tree", $fields = array(), $add_fields = array("title" => "title", "type" => "type")) { + parent::__construct($table, $fields); + $this->fields = array_merge($this->fields, $add_fields); + $this->add_fields = $add_fields; + } + + function create_node($data) { + $id = parent::_create((int)$data[$this->fields["id"]], (int)$data[$this->fields["position"]]); + if($id) { + $data["id"] = $id; + $this->set_data($data); + return "{ \"status\" : 1, \"id\" : ".(int)$id." }"; + } + return "{ \"status\" : 0 }"; + } + function set_data($data) { + if(count($this->add_fields) == 0) { return "{ \"status\" : 1 }"; } + $s = "UPDATE `".$this->table."` SET `".$this->fields["id"]."` = `".$this->fields["id"]."` "; + foreach($this->add_fields as $k => $v) { + if(isset($data[$k])) $s .= ", `".$this->fields[$v]."` = \"".$this->db->escape($data[$k])."\" "; + else $s .= ", `".$this->fields[$v]."` = `".$this->fields[$v]."` "; + } + $s .= "WHERE `".$this->fields["id"]."` = ".(int)$data["id"]; + $this->db->query($s); + return "{ \"status\" : 1 }"; + } + function rename_node($data) { return $this->set_data($data); } + + function move_node($data) { + $id = parent::_move((int)$data["id"], (int)$data["ref"], (int)$data["position"], (int)$data["copy"]); + if(!$id) return "{ \"status\" : 0 }"; + if((int)$data["copy"] && count($this->add_fields)) { + $ids = array_keys($this->_get_children($id, true)); + $data = $this->_get_children((int)$data["id"], true); + + $i = 0; + foreach($data as $dk => $dv) { + $s = "UPDATE `".$this->table."` SET `".$this->fields["id"]."` = `".$this->fields["id"]."` "; + foreach($this->add_fields as $k => $v) { + if(isset($dv[$k])) $s .= ", `".$this->fields[$v]."` = \"".$this->db->escape($dv[$k])."\" "; + else $s .= ", `".$this->fields[$v]."` = `".$this->fields[$v]."` "; + } + $s .= "WHERE `".$this->fields["id"]."` = ".$ids[$i]; + $this->db->query($s); + $i++; + } + } + return "{ \"status\" : 1, \"id\" : ".$id." }"; + } + function remove_node($data) { + $id = parent::_remove((int)$data["id"]); + return "{ \"status\" : 1 }"; + } + function get_children($data) { + $tmp = $this->_get_children((int)$data["id"]); + if((int)$data["id"] === 1 && count($tmp) === 0) { + $this->_create_default(); + $tmp = $this->_get_children((int)$data["id"]); + } + $result = array(); + if((int)$data["id"] === 0) return json_encode($result); + foreach($tmp as $k => $v) { + $result[] = array( + "attr" => array("id" => "node_".$k, "rel" => $v[$this->fields["type"]]), + "data" => $v[$this->fields["title"]], + "state" => ((int)$v[$this->fields["right"]] - (int)$v[$this->fields["left"]] > 1) ? "closed" : "" + ); + } + return json_encode($result); + } + function search($data) { + $this->db->query("SELECT `".$this->fields["left"]."`, `".$this->fields["right"]."` FROM `".$this->table."` WHERE `".$this->fields["title"]."` LIKE '%".$this->db->escape($data["search_str"])."%'"); + if($this->db->nf() === 0) return "[]"; + $q = "SELECT DISTINCT `".$this->fields["id"]."` FROM `".$this->table."` WHERE 0 "; + while($this->db->nextr()) { + $q .= " OR (`".$this->fields["left"]."` < ".(int)$this->db->f(0)." AND `".$this->fields["right"]."` > ".(int)$this->db->f(1).") "; + } + $result = array(); + $this->db->query($q); + while($this->db->nextr()) { $result[] = "#node_".$this->db->f(0); } + return json_encode($result); + } + + function _create_default() { + $this->_drop(); + $this->create_node(array( + "id" => 1, + "position" => 0, + "title" => "C:", + "type" => "drive" + )); + $this->create_node(array( + "id" => 1, + "position" => 1, + "title" => "D:", + "type" => "drive" + )); + $this->create_node(array( + "id" => 2, + "position" => 0, + "title" => "_demo", + "type" => "folder" + )); + $this->create_node(array( + "id" => 2, + "position" => 1, + "title" => "_docs", + "type" => "folder" + )); + $this->create_node(array( + "id" => 4, + "position" => 0, + "title" => "index.html", + "type" => "default" + )); + $this->create_node(array( + "id" => 5, + "position" => 1, + "title" => "doc.html", + "type" => "default" + )); + } +} + +?> \ No newline at end of file diff --git a/module/viewer/lib/js/jtree/_demo/_install.txt b/module/viewer/lib/js/jtree/_demo/_install.txt new file mode 100644 index 0000000..3cd5735 --- /dev/null +++ b/module/viewer/lib/js/jtree/_demo/_install.txt @@ -0,0 +1,6 @@ +1) Create a database and a user with all privileges for this database. +2) Edit the config.php file and update the configuration for the database at the top of the file +3) Import the _dump.sql in your newly created database +4) You are ready to go + +*) PLEASE NOTE THAT THE PHP TREE CLASS HAS NOT BEEN THOROUGHLY TESTED \ No newline at end of file diff --git a/module/viewer/lib/js/jtree/_demo/config.php b/module/viewer/lib/js/jtree/_demo/config.php new file mode 100644 index 0000000..346e288 --- /dev/null +++ b/module/viewer/lib/js/jtree/_demo/config.php @@ -0,0 +1,14 @@ + "localhost", + "username" => "root", + "password" => "", + "database" => "" +); +if(extension_loaded("mysqli")) require_once("_inc/class._database_i.php"); +else require_once("_inc/class._database.php"); + +// Tree class +require_once("_inc/class.tree.php"); +?> \ No newline at end of file diff --git a/module/viewer/lib/js/jtree/_demo/file.png b/module/viewer/lib/js/jtree/_demo/file.png new file mode 100644 index 0000000000000000000000000000000000000000..58959687bcfcb0d5be6f586f70b7f35b5c4492c1 GIT binary patch literal 392 zcmV;30eAk1P)ik)!CUo`*`M0zk0c zZqe)YUi$t1Yv}|enWiZ>n+>PaPsZ_-^ZA@%7)IHi@9cF<(P%W#Zih&c1VIp>*=)7} ze3SxYkb1q2YPAYu3`8XVs#1V_*!Oc_Cg&rTf}R^BL9%dIL?9xt)?NavwNO=9Yn_0s zMqz^eeh*c30-P1nG`$J9T0um-TCH{y5Cj2y-}f#6%jNQSI2?Wh0Iv{4M2s=ASS)^W m@8tXrzm-+*c0Kh+CIK}DO|C`hR0000_PS&=26o zo$drTf}cTgr%-e!-MJG>7q*5b@ilo#+azt0=KaaNcUP41H+xgoHJ);xbUBF z()aw$8*|su29!s$(P-z38%xJlxp(LG^C;{}ts2N?tt#d6FMDh5%3WX*ICVsL01Ci! zU2im-B^!kRjODV<=Pyg|+U-`$bsgtm!-*KxT2m?Jk+1R4A$KO3}|(8p*lY6C+7aV=ZWrp^JLg(oHP;SLrIKG$T{r zD3%ovESI+0(fI6CH_}+!CtHEt*wBiFgLm*UF6CM?23=7=eL3&fV^P_fH?;&u7X46US&ifCF@Z@R;>S<2SSU V2dMV}qW1s*002ovPDHLkV1o8k4}1Us literal 0 HcmV?d00001 diff --git a/module/viewer/lib/js/jtree/_demo/index.html b/module/viewer/lib/js/jtree/_demo/index.html new file mode 100644 index 0000000..b16d8b9 --- /dev/null +++ b/module/viewer/lib/js/jtree/_demo/index.html @@ -0,0 +1,461 @@ + + + + + jsTree v.1.0 - Demo + + + + + + + + + +
+ +

jsTree v.1.0

+

DEMO

+

Creating a tree, binding events, using the instance

+
+

Here is how you create an instance, bind an event and then get the instance.

+
+ +
+ +
+ +

Doing something when the tree is loaded

+
+

You can use a few events to do that.

+
+ +
+ +
+ +

Doing something when a node is clicked

+
+
+ +
+ +
+ +

Using CSS to make nodes wrap

+
+ + + +
+ +

Using CSS to make the nodes bigger

+
+ + + +
+ +

PHP & mySQL demo + event order

+
+

Here is a PHP & mySQL enabled demo. You can use the classes/DB structure included, but those are not thoroughly tested and not officially a part of jstree. In the log window you can also see all function calls as they happen on the instance.

+ + + +
+
+ + + +
+
+ + + +
+ +
+ + + \ No newline at end of file diff --git a/module/viewer/lib/js/jtree/_demo/root.png b/module/viewer/lib/js/jtree/_demo/root.png new file mode 100644 index 0000000000000000000000000000000000000000..a27e6a39c4fbab9c23bc78d1fec5b5e83e3b8982 GIT binary patch literal 628 zcmV-)0*n2LP)e20L;#i_JNLeF9g_Jc?dZhFS5g-H}++Sg9>-iwdGOGdOT+u&0{my(o zr>zhI075hqFNNf6c7}{4z7B&pj;#j%PN&m98yg$UW;1S+7MckYcG>02`>(&x&(AM3 zaB*}rd82joNGTOU@Zna7jCsvOzkPQwanAj?`i%lu0n{zEZF%4qQ2ztzn+tER9m1Ue O0000_create_default(); +//die(); + +if(isset($_GET["reconstruct"])) { + $jstree->_reconstruct(); + die(); +} +if(isset($_GET["analyze"])) { + echo $jstree->_analyze(); + die(); +} + +if($_REQUEST["operation"] && strpos($_REQUEST["operation"], "_") !== 0 && method_exists($jstree, $_REQUEST["operation"])) { + header("HTTP/1.0 200 OK"); + header('Content-type: application/json; charset=utf-8'); + header("Cache-Control: no-cache, must-revalidate"); + header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); + header("Pragma: no-cache"); + echo $jstree->{$_REQUEST["operation"]}($_REQUEST); + die(); +} +header("HTTP/1.0 404 Not Found"); +?> + +_drop(); +$jstree->create_node(array("id"=>0,"position"=>0)); +$jstree->create_node(array("id"=>1,"position"=>0)); +$jstree->create_node(array("id"=>1,"position"=>0)); +$jstree->create_node(array("id"=>3,"position"=>0,"name"=>"Pesho")); +$jstree->move(3,2,0,true); +$jstree->_dump(true); +$jstree->_reconstruct(); +echo $jstree->_analyze(); +die(); + +$tree = new _tree_struct; +$tree->drop(); +$tree->create(0, 0); +$tree->create(0, 0); +$tree->create(1, 0); +$tree->create(0, 3); +$tree->create(2, 3); +$tree->create(2, 0); +$tree->dump(true); +$tree->move(6,4,0); +$tree->move(1,0,0); +$tree->move(3,2,99,true); +$tree->move(7,1,0,true); +$tree->move(1,7,0); +$tree->move(1,0,1,true); +$tree->move(2, 0, 0, true); +$tree->move(13, 12, 2, true); +$tree->dump(true); +$tree->move(15, 16, 2, true); +$tree->dump(true); +$tree->move(4, 0, 0); +$tree->dump(true); +$tree->move(4, 0, 2); +$tree->dump(true); +echo $tree->analyze(); +$tree->drop(); +*/ +?> \ No newline at end of file diff --git a/module/viewer/lib/js/jtree/_docs/!style.css b/module/viewer/lib/js/jtree/_docs/!style.css new file mode 100644 index 0000000..48e22f0 --- /dev/null +++ b/module/viewer/lib/js/jtree/_docs/!style.css @@ -0,0 +1,48 @@ +html, body { margin:0; padding:0; background:#D9E3CB; } +body, td, th, pre, code, select, option, input, textarea { } +#dhead { margin:0 0 0 -10px; padding:0; line-height:80px; font-size:18pt; font-family:Georgia; /*text-shadow:1px 1px 2px gray;*/ border-bottom:10px solid #73796B; margin-bottom:0.5em; text-align:center; width:820px; background:black; color:white; -moz-border-radius:5px 5px 0 0; border-radius:5px 5px 0 0; -webkit-border-radius:5px 5px 0 0; text-indent:-2000px; background:black url("logo.png") center center no-repeat; } +h1 { margin:0 0 0 0px; padding:0; font-size:14pt; font-family:Georgia; /*text-shadow:1px 1px 2px gray;*/ margin-bottom:1em; text-align:center; text-transform:uppercase;} +h2 { margin:0.5em 0 0.5em 0; padding:0.5em 0 0.5em 20px; font-size:12pt; font-family:Georgia; color:white; background:silver; text-shadow:1px 1px 2px gray; clear:both; -moz-border-radius:5px; border-radius:5px; -webkit-border-radius:5px; } +h3 { margin:0; padding:0.5em 0 0.5em 0; font-size:11.5pt; font-family:Georgia; color:gray; clear:both; } +p { padding:0em 0 0.5em 0; margin:0; line-height:1.8em; } +p.meta { font-size:9pt; color:gray; margin-top:-5px; } +.arguments .tp, p code { color:green; padding:0 4px; font-family: "Consolas", "Bitstream Vera Sans Mono", "Courier New", Courier, monospace !important; font-weight: normal !important; font-style: normal !important; font-size:13px; } +#description, .panel { margin:0 20px; } +#container { width:800px; margin:10px auto; overflow:hidden; background:white; padding:0 10px 10px 10px; -moz-border-radius:5px; border-radius:5px; -webkit-border-radius:5px; -moz-box-shadow: 0px 0px 10px #000; } +.demo { width:255px; float:left; margin:0; overflow:hidden; } +.code { width:490px; float:right; margin:0 0 10px 0; border:1px solid gray; font-size:12px; } +pre { display:block; } +.code_f { border:1px solid gray; margin-bottom:1em; } +.syntaxhighlighter { margin:0 0 0 0 !important; padding:0 !important; line-height:18px; } + +.log { padding:4px; border:1px solid gray; margin-bottom:1em; } +.button { display:block; margin-bottom:0.5em; } +.arguments { margin:0em 1em; padding:0; list-style-type:none; } +.arguments .tp { padding:0 0 0 0; float:left; width:70px; } +.arguments strong { display:block; } + +.api h3 { margin-left:-10px; color:black; font-family: "Consolas", "Bitstream Vera Sans Mono", "Courier New", Courier, monospace !important; font-weight: normal !important; font-size:14px; margin-top:2em; border-top:1px solid; width:780px; } +.api .arguments li strong { color:black; font-family: "Consolas", "Bitstream Vera Sans Mono", "Courier New", Courier, monospace !important; font-weight: normal !important; font-size:13px; } + +.configuration h3 { margin-left:-10px; color:black; font-family: "Consolas", "Bitstream Vera Sans Mono", "Courier New", Courier, monospace !important; font-weight: normal !important; font-size:14px; margin-top:2em; border-top:1px solid; width:780px; } +.note { background:#ffffee; padding:10px 20px; border:1px solid #333; -moz-border-radius:5px; border-radius:5px; -webkit-border-radius:5px; margin-bottom:15px; text-align:center; font-weight:bold; } + +.plugins, .demos { margin:0 auto 20px auto; } + +ul.columns { list-style-type:none; width:700px; margin:0px auto 15px auto; padding:0; overflow:hidden; } +ul.columns li { float:left; margin:0; padding:0 0 0 0px; line-height:18px; width:345px; } +ul.demos li, ul.plugins li { width:220px; text-align:left; padding:5px 0; } +ul.demos li a, ul.plugins li a { text-decoration:none; color:#3B5998; } +ul.demos li a:hover, ul.plugins li a:hover { text-decoration:underline; } +ul.plugins li p { text-align:left; font-size:9px; color:#333; margin:0 5px 0 0; } + +ul.demos li { width:auto; } + +.demo, .demo input, .jstree-dnd-helper, #vakata-contextmenu { font-size:10px; font-family:Verdana; } + +#demo_body .demo, #demo_body .code { width:auto; float:none; clear:both; margin:10px auto; } +#demo_body .code { margin-bottom:20px; } + +ul.jstree { width:700px; margin:0px auto 15px auto; padding:0; } +ul.jstree li { margin:0; padding:2px 0; } +ul.jstree li a { color:#3B5998; text-decoration:underline; } \ No newline at end of file diff --git a/module/viewer/lib/js/jtree/_docs/_drive.png b/module/viewer/lib/js/jtree/_docs/_drive.png new file mode 100644 index 0000000000000000000000000000000000000000..a27e6a39c4fbab9c23bc78d1fec5b5e83e3b8982 GIT binary patch literal 628 zcmV-)0*n2LP)e20L;#i_JNLeF9g_Jc?dZhFS5g-H}++Sg9>-iwdGOGdOT+u&0{my(o zr>zhI075hqFNNf6c7}{4z7B&pj;#j%PN&m98yg$UW;1S+7MckYcG>02`>(&x&(AM3 zaB*}rd82joNGTOU@Zna7jCsvOzkPQwanAj?`i%lu0n{zEZF%4qQ2ztzn+tER9m1Ue O0000Node 1 +
  • Node 2
  • diff --git a/module/viewer/lib/js/jtree/_docs/_json_data.json b/module/viewer/lib/js/jtree/_docs/_json_data.json new file mode 100644 index 0000000..e0cac24 --- /dev/null +++ b/module/viewer/lib/js/jtree/_docs/_json_data.json @@ -0,0 +1,4 @@ +[ + { "data" : "A node", "children" : [ { "data" : "Only child", "state" : "closed" } ], "state" : "open" }, + "Ajax node" +] \ No newline at end of file diff --git a/module/viewer/lib/js/jtree/_docs/_search_data.json b/module/viewer/lib/js/jtree/_docs/_search_data.json new file mode 100644 index 0000000..efa8230 --- /dev/null +++ b/module/viewer/lib/js/jtree/_docs/_search_data.json @@ -0,0 +1,6 @@ +[ + "Ajax node 1", + "Ajax node 2", + "TARGET", + "Ajax node 4" +] \ No newline at end of file diff --git a/module/viewer/lib/js/jtree/_docs/_search_result.json b/module/viewer/lib/js/jtree/_docs/_search_result.json new file mode 100644 index 0000000..1d292f3 --- /dev/null +++ b/module/viewer/lib/js/jtree/_docs/_search_result.json @@ -0,0 +1 @@ +[ "#root_node" ] \ No newline at end of file diff --git a/module/viewer/lib/js/jtree/_docs/_xml_flat.xml b/module/viewer/lib/js/jtree/_docs/_xml_flat.xml new file mode 100644 index 0000000..06162db --- /dev/null +++ b/module/viewer/lib/js/jtree/_docs/_xml_flat.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/module/viewer/lib/js/jtree/_docs/_xml_nest.xml b/module/viewer/lib/js/jtree/_docs/_xml_nest.xml new file mode 100644 index 0000000..f882624 --- /dev/null +++ b/module/viewer/lib/js/jtree/_docs/_xml_nest.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/module/viewer/lib/js/jtree/_docs/checkbox.html b/module/viewer/lib/js/jtree/_docs/checkbox.html new file mode 100644 index 0000000..0e5efbf --- /dev/null +++ b/module/viewer/lib/js/jtree/_docs/checkbox.html @@ -0,0 +1,171 @@ + + + + + jsTree v.1.0 - checkbox documentation + + + + + + + + + + +
    + +

    jsTree v.1.0

    +

    checkbox plugin

    +

    Description

    +
    +

    The checkbox plugin makes multiselection possible using three-state checkboxes.

    +
    + +

    Configuration

    +
    + +

    override_ui

    +

    A boolean. Default is false.

    +

    If set to true all selection will be handled by checkboxes. The checkbox plugin will map UI's get_selected function to its own get_checked function and overwrite the UI reselect function. It will also disable the select_node, deselect_node and deselect_all functions. If left as false nodes can be selected and checked independently.

    + +

    checked_parent_open

    +

    A Boolean. Default is true.

    +

    When set to true when programatically checking a node in the tree all of its closed parents are opened automatically.

    + +

    two_state

    +

    A boolean. Default is false.

    +

    If set to true checkboxes will be two-state only, meaning that you will be able to select parent and children independently and there will be no undetermined state.

    + +

    real_checkboxes

    +

    A boolean. Default is false.

    +

    If set to true real hidden checkboxes will be created for each element, so if the tree is part of a form, checked nodes will be submitted automatically. By default the name of the checkbox is "check_" + the ID of the LI element and the value is 1, this can be changed using the real_checkboxes_names config option.

    + +

    real_checkboxes_names

    +

    A function. Default is function (n) { return [("check_" + (n[0].id || Math.ceil(Math.random() * 10000))), 1]; }.

    +

    If real checkboxes are used this function is invoked in the current tree's scope for each new checkbox that is created. It receives a single argument - the node that will contain the checkbox. The function must return an array consisting of two values - the name for the checkbox and the value for the checkbox.

    + +
    + +

    Demos

    +
    +

    Using the checkbox plugin - all you need to do is include it in the list of active plugins.

    +
    + +
    + + +
    + +

    API

    +
    +

    ._prepare_checkboxes ( node )

    +

    Inserts the checkbox icons on the node. Used internally.

    +
      +
    • + mixed node +

      This can be a DOM node, jQuery node or selector pointing to an element within the tree.

      +
    • +
    + +

    ._repair_state ( node )

    +

    Repairs the checkbox state inside the node. Used internally.

    +
      +
    • + mixed node +

      This can be a DOM node, jQuery node or selector pointing to an element within the tree.

      +
    • +
    + +

    .change_state ( node , uncheck )

    +

    Changes the state of a node. Used mostly internally - you'd be better off using the check_node and uncheck_node functions. Triggers an event.

    +
      +
    • + mixed node +

      This can be a DOM node, jQuery node or selector pointing to an element within the tree.

      +
    • +
    • + boolean uncheck +

      If set to true the node is unchecked, if set to false the node is checked, otherwise - the state is toggled.

      +
    • +
    + +

    .check_node ( node )

    +

    Checks a node.

    +
      +
    • + mixed node +

      This can be a DOM node, jQuery node or selector pointing to an element within the tree.

      +
    • +
    + +

    .uncheck_node ( node )

    +

    Unchecks a node.

    +
      +
    • + mixed node +

      This can be a DOM node, jQuery node or selector pointing to an element within the tree.

      +
    • +
    + +

    .check_all ( )

    +

    Checks all nodes.

    + +

    .uncheck_all ( )

    +

    Unchecks all nodes.

    + +

    .is_checked ( node )

    +

    Checks if a node is checked. Returns boolean.

    +
      +
    • + mixed node +

      This can be a DOM node, jQuery node or selector pointing to an element within the tree.

      +
    • +
    + +
     
    +

    .get_checked ( context, get_all ), .get_unchecked ( context, get_all )

    +

    Both functions return jQuery collections.

    +
      +
    • + mixed context +

      This can be a DOM node, jQuery node or selector pointing to an element within the tree. If specified only nodes inside the specified context are returned, otherwise the whole tree is searched.

      +
    • +
    • + boolean get_all +

      By default these functions return only top level checked/unchecked nodes (if a node is checked its children are note returned), if this parameter is set to true they will return all checked/unchecked nodes.

      +
    • +
    + +
     
    +

    .show_checkboxes ( ), .hide_checkboxes ( )

    +

    Show or hide the checkbox icons.

    + +
    + +
    + + \ No newline at end of file diff --git a/module/viewer/lib/js/jtree/_docs/contextmenu.html b/module/viewer/lib/js/jtree/_docs/contextmenu.html new file mode 100644 index 0000000..e56881f --- /dev/null +++ b/module/viewer/lib/js/jtree/_docs/contextmenu.html @@ -0,0 +1,121 @@ + + + + + jsTree v.1.0 - contextmenu documentation + + + + + + + + + + +
    + +

    jsTree v.1.0

    +

    contextmenu plugin

    +

    Description

    +
    +

    The contextmenu plugin enables a contextual menu to be shown, when the user right-clicks a node (or when triggered programatically by the developer).

    +
    + +

    Configuration

    +
    +

    select_node

    +

    Boolean. Default is false.

    +

    Whether to select the right clicked node when showing the context menu. If this is set to true and the node is not selected all currently selected nodes will be deselected.

    + +

    show_at_node

    +

    Boolean. Default is true.

    +

    Whether to show the context menu just below the node, or at the clicked point exactly.

    + +

    items

    +

    Expects an object or a function, which should return an object. If a function is used it fired in the tree's context and receives one argument - the node that was right clicked. The object format is:

    +
    +
    +{
    +// Some key
    +"rename" : {
    +	// The item label
    +	"label"				: "Rename",
    +	// The function to execute upon a click
    +	"action"			: function (obj) { this.rename(obj); },
    +	// All below are optional 
    +	"_disabled"			: true,		// clicking the item won't do a thing
    +	"_class"			: "class",	// class is applied to the item LI node
    +	"separator_before"	: false,	// Insert a separator before the item
    +	"separator_after"	: true,		// Insert a separator after the item
    +	// false or string - if does not contain `/` - used as classname
    +	"icon"				: false,
    +	"submenu"			: { 
    +		/* Collection of objects (the same structure) */
    +	}
    +}
    +/* MORE ENTRIES ... */
    +}
    +
    +
    +
    + +

    Demos

    +
    + +

    Using the contextmenu

    +
    + +
    + + +
    + +

    API

    +
    + +

    .show_contextmenu ( node , x, y )

    +

    Shows the contextmenu next to a node. Triggered automatically when right-clicking a node.

    +
      +
    • + mixed node +

      This can be a DOM node, jQuery node or selector pointing to an element within the tree.

      +
    • +
    • + number x +

      The X-coordinate to show the menu at - may be overwritten by show_at_node. If you omit this the menu is shown aligned with the left of the node.

      +
    • +
    • + number y +

      The Y-coordinate to show the menu at - may be overwritten by show_at_node. If you omit this the menu is shown just below the node.

      +
    • +
    + +
    + +
    + + \ No newline at end of file diff --git a/module/viewer/lib/js/jtree/_docs/cookies.html b/module/viewer/lib/js/jtree/_docs/cookies.html new file mode 100644 index 0000000..ce9a128 --- /dev/null +++ b/module/viewer/lib/js/jtree/_docs/cookies.html @@ -0,0 +1,97 @@ + + + + + jsTree v.1.0 - cookies documentation + + + + + + + + + + +
    + +

    jsTree v.1.0

    +

    cookies plugin

    +

    Description

    +
    +

    The cookies enables jstree to save the state of the tree across sessions. What this does is save the opened and selected nodes in a cookie, and reopen & reselect them the next time the user loads the tree. Depends on the jQuery.cookie plugin.

    The nodes need to have IDs for this plugin to work.

    +
    + +

    Configuration

    +
    + +

    save_opened

    +

    A string (or false). Default is "jstree_open".

    +

    The name of the cookie to save opened nodes in. If set to false - opened nodes won't be saved.

    + +

    save_selected

    +

    A string (or false). Default is "jstree_select".

    +

    The name of the cookie to save selected nodes in. If set to false - selected nodes won't be saved.

    + +

    auto_save

    +

    A Boolean. Default is true.

    +

    If set to true jstree will automatically update the cookies every time a change in the state occurs.

    + +

    cookie_options

    +

    An object. Default is {}.

    +

    The options accepted by the jQuery.cookie plugin.

    + +
    + +

    Demos

    +
    +

    Check your data plugin documentation (html_data, xml_data, json_data) or take a close look at these examples for information on how to specify multilanguage nodes.

    + +

    Using the cookies plugin

    +

    Go ahead and make changes to the tree and then refresh this page.

    +
    + +
    + + +
    + +

    API

    +
    + + +

    Save the current state.

    +
      +
    • + string event +

      Used internally with the auto_save option. Do not set this manually.

      +
    • +
    +
    + +
    + + \ No newline at end of file diff --git a/module/viewer/lib/js/jtree/_docs/core.html b/module/viewer/lib/js/jtree/_docs/core.html new file mode 100644 index 0000000..fc87138 --- /dev/null +++ b/module/viewer/lib/js/jtree/_docs/core.html @@ -0,0 +1,689 @@ + + + + + jsTree v.1.0 Core documentation + + + + + + + + + + +
    + +

    jsTree v.1.0

    +

    CORE

    +

    Description

    +
    +

    Including the files

    +

    First of all, as jsTree is a jQuery component, you need to include jQuery itself. jsTree v.1.0 requires jQuery version 1.4.2

    + +
    +<script type="text/javascript" src="_lib/jquery.js"></script>
    +
    + +

    Then you need to include jsTree:

    + +
    +<script type="text/javascript" src="jquery.jstree.js"></script>
    +
    + +

    Or you could use the minified version:

    + +
    +<script type="text/javascript" src="jquery.jstree.min.js"></script>
    +
    + +

    You may change the path to whatever you like, but it is recommended not to rename jquery.tree.js or jquery.tree.min.js as the filenames may be used for path autodetection (for example in the themes plugin, but if you really need to rename the file most plugins will give you the option to set the path manually).

    + +

    Additionally some plugins have dependencies - plugins that detect a dependency is missing will throw an error.

    + +

    Creating and configuring an instance

    +

    You can create a tree in the following manner:

    + +
    +jQuery("some-selector-to-container-node-here").jstree([ config_object ]);
    +
    + +

    In the optional config object you specify all the options that you want to set. Each plugin will describe its configuration and defaults. In the configuration section below you will find the options defined by the core. Each plugin's options (even the core) are set in their own subobject, which is named after the plugin. For example all of the core's options are set in the core key of the config object:

    +
    +jQuery("some-selector-to-container-node-here")
    +	.jstree({
    +		core : {
    +			/* core options go here */
    +		}
    +	});
    +
    + +

    Please note that if your options for a given plugin are the same as the defaults you may omit those options or omit the subobject completely (if you do not need to modify the defaults).

    + +

    There is only one special config option that is not a part of any plugin - this is the plugins option, which defines a list of active plugins for the instance being created. Although many plugins may be included, only the ones listed in this option will be active. The only autoincluded "plugin" is the jstree core.

    + +
    +jQuery("some-selector-to-container-node-here")
    +	.jstree({
    +		core : { /* core options go here */ },
    +		plugins : [ "themes", "html_data", "some-other-plugin" ]
    +	});
    +
    + +

    Interacting with the tree

    + +

    To perform an operation programatically on a given instance you can use two methods:

    +
    +/* METHOD ONE */
    +jQuery("some-selector-to-container-node-here")
    +	.jstree("operation_name" [, argument_1, argument_2, ...]);
    +
    +/* METHOD TWO */
    +jQuery.jstree._reference(needle) 
    +	/* NEEDLE can be a DOM node or selector for the container or a node within the container */
    +	.operation_name([ argument_1, argument_2, ...]);
    +
    +

    NOTE: Functions prefixed with _ can not be called with method one.

    + +

    jsTree uses events to notify of any changes happening in the tree. All events fire on the tree container in the jstree namespace and are named after the function that triggered them. Please note that for some events it is best to bind before creating the instance. For example:

    +
    +jQuery("some-container")
    +	.bind("loaded.jstree", function (event, data) {
    +		alert("TREE IS LOADED");
    +	})
    +	.jstree({ /* configuration here */ });
    +
    +

    Please note the second parameter data. Its structure is as follows:

    +
    +{ 
    +	"inst" : /* the actual tree instance */, 
    +	"args" : /* arguments passed to the function */, 
    +	"rslt" : /* any data the function passed to the event */, 
    +	"rlbk" : /* an optional rollback object - it is not always present */
    +}
    +
    +

    There is also one special event - before.jstree. This events enables you to prevent an operation from executing. Look at the demo below.

    + +
    + +

    Configuration

    +
    + +

    html_titles

    +

    Boolean. Default is false.

    +

    Defines whether titles can contain HTML code.

    + +

    animation

    +

    A number. Default is 500.

    +

    Defines the duration of open/close animations. 0 means no animation.

    + +

    initially_open

    +

    An array. Default is [].

    +

    Defines which nodes are to be automatically opened (if they are not present they will first be loaded) when the tree finishes loading - a list of IDs is expected.

    + +

    initially_load

    +

    An array. Default is [].

    +

    Defines which nodes are to be automatically loaded (but not opened) when the tree finishes loading - a list of IDs is expected.

    + +

    load_open

    +

    A Boolean. Default is false.

    +

    When set to true forces loading of nodes marked as open, which do not have children. Otherwise nodes are only visualized as open without any children and opening/closing such a node won't cause it to load (make a server call).

    + +

    open_parents

    +

    Boolean. Default is true.

    +

    If set to true opening a node will also open any closed ancestors it has (will open the whole chain down to this node).

    + +

    notify_plugins

    +

    Boolean. Default is true.

    +

    If set to true loading nodes with some metadata will trigger some actions on the corresponding plugin. So you can actually set the selected/checked/etc

    + +

    rtl

    +

    Boolean. Default is false.

    +

    Defines whether the tree is in right-to-left mode (also make sure you are using a RTL theme - for example the included default-rtl).

    + +

    strings

    +

    Object. Default is { loading : "Loading ...", new_node : "New node" }.

    +

    Contains strings needed for the operation of the tree so that you can localize.

    + + +
    + +

    Demos

    +
    + +

    Binding to an event and executing an action

    + +
    + +
    + +

     

    + +

    Preventing an action

    +

    This is the same demo as above, but this time the operation will be prevented.

    + +
    + +
    + + +

     

    +

    The important part is e.stopImmediatePropagation(); return false.

    +
    + +

    API

    +
    +

    Use extra caution when working with functions prefixed with an underscore - _!
    Those functions are probably for internal usage only.

    + + +

    jQuery.jstree.defaults

    +

    An object. Default is a collection of all included plugin's defaults.

    +

    This object is exposed so that you can apply standart settings to all future instances

    + +

    jQuery.jstree.plugin ( plugin_name , plugin_data )

    +

    This function is used by developers to extend jstree (add "plugins").

    +
      +
    • + string plugin_name +

      The plugin name - it should be unique.

      +
    • +
    • + object plugin_data +

      The plugin itself. It consists of __init & __destroy functions, defaults object (that of course could be an array or a simple value) and a _fn object, whose keys are all the functions you are extending jstree with. You can overwrite functions (but you can in your function call the overriden old function), and you are responsible for triggering events and setting rollback points. You can omit any of the elements in the plugin_data param. Keep in mind jstree will automatically clear classes prepended with jstree- and all events in the jstree namespace when destroying a tree, so you do not need to worry about those.

      +

      Read jstree's code for examples on how to develop plugins.

      +
    • +
    + +

    jQuery.jstree.rollback ( rollback_object )

    +

    This function will roll the tree back to the state specified by the rollback object

    +
      +
    • + string rollback_object +

      Normally you will get this object from the event you are handling. You can of course use .get_rollback() to get the current state of the tree as a rollback object.

      +
      +$("some-container").bind("some-event.jstree", function (e, data) {
      +	$.jstree.rollback(data.rlbk);
      +});
      +

      Keep in mind that not all events will give you a rollback object - sometimes data.rlbk will be false.

      +
    • +
    + +

    jQuery.jstree._focused ()

    +

    Returns the currently focused tree instance on the page. If not interaction has been made - it is the last one to be created.

    + +

    jQuery.jstree._reference ( needle )

    +

    Returns the tree instance for the specified needle.

    +
      +
    • + mixed needle +

      This can be a DOM node, jQuery node or selector pointing to the tree container, or an element within the tree.

      +
    • +
    + +

    jQuery.jstree._instance ( index , container , settings )

    +

    This function is used internally when creating new tree instances. Calling this function by itself is not enough to create a new instance. To create a tree use the documented method $("selector").jstree([ options ]).

    + +

    jQuery.jstree._fn

    +

    This object stores all functions included by plugins. It is used internally as a prototype for all instances - do not modify manually.

    + +

    .data

    +

    An object where all plugins store instance specific data. Do not modify manually.

    + +

    .get_settings ()

    +

    Returns a copy of the instance's settings object - the defaults, extended by your own config object.

    + +

    ._get_settings ()

    +

    Returns the instance's settings object - the defaults, extended by your own config object.

    + +

    .get_index ()

    +

    Returns the internal instance index.

    + +

    .get_container ()

    +

    Returns the jQuery extended container node of the tree.

    + +

    .get_container_ul ()

    +

    Returns the jQuery extended first UL node in the container of the tree.

    + +

    ._set_settings ( settings )

    +

    Replace the settings object with the settings param. Please note that not all plugins will react to the change. Unless you know exactly what you are doing you'd be better off recreating the tree with the new settings.

    + +

    .init ()

    +

    This function is used internally when creating a new instance. Triggers an event, which fires after the tree is initialized, but not yet loaded.

    + +

    .destroy ()

    +

    Destroys the instance - it will automatically remove all bound events in the jstree namespace & remove all classes starting with jstree-. Triggers an event.

    + +

    .save_opened ()

    +

    Stores the currently open nodes before refreshing. Used internally. Triggers an event.

    + +

    .reopen ( is_callback )

    +

    Reopens all the nodes stored by save_opened or set in the initially_open config option on first load. It is called multiple times while reopening nodes - the is_callback param determines if this is the first call (false) or not. Used internally. Triggers an event.

    + +

    .refresh ( node )

    +

    Refreshes the tree. Saves all open nodes, and reloads and then reopens all saved nodes. Triggers an event.

    +
      +
    • + mixed node +

      This can be a DOM node, jQuery node or selector pointing to an element within the tree. If set this will reload only the given node - otherwise - the whole tree. Passing -1 also reloads the whole tree.

      +
    • +
    + +

    .loaded ()

    +

    A dummy function, whose purpose is only to trigger the loaded event. This event is triggered once after the tree's root nodes are loaded, but before any nodes set in initially_open are opened.

    + +

    .set_focus ()

    +

    Makes the current instance the focused one on the page. Triggers an event.

    + +

    .unset_focus ()

    +

    If the current instance is focused this removes the focus. Triggers an event.

    + +

    .is_focused ()

    +

    Returns true if the current instance is the focused one, otherwise returns false.

    + +

    .lock ()

    +

    Sets the tree to a locked state - no methods can be called on that instance except for unlock and is_locked.

    +

    .unlock ()

    +

    Sets the tree to a unlocked state (the default state).

    +

    .is_locked ()

    +

    Returns true if the tree is locked, otherwise returns false.

    + +

    ._get_node ( node )

    +

    Return the jQuery extended LI element of the node, -1 if the container node is passed, or false otherwise.

    +
      +
    • + mixed node +

      This can be a DOM node, jQuery node or selector pointing to an element within the tree.

      +
    • +
    + +

    ._get_next ( node , strict )

    +

    Gets the LI element representing the node next to the passed node. Returns false on failure.

    +
      +
    • + mixed node +

      This can be a DOM node, jQuery node or selector pointing to an element within the tree, whose next sibling we want.

      +
    • +
    • + bool strict +

      If set to true only immediate siblings are calculated. Otherwise if the node is the last child of its parent this function will "jump out" and return the parent's next sibling, etc. Default is false.

      +
    • +
    + +

    ._get_prev ( node , strict )

    +

    Gets the LI element representing the node previous to the passed node. Returns false on failure.

    +
      +
    • + mixed node +

      This can be a DOM node, jQuery node or selector pointing to an element within the tree, whose previous sibling we want.

      +
    • +
    • + bool strict +

      If set to true only immediate siblings are calculated. Otherwise if the node is the first child of its parent this function will "jump out" and return the parent itself. Default is false.

      +
    • +
    + +

    ._get_parent ( node )

    +

    Gets the LI element representing the parent of the passed node. Returns false on failure.

    +
      +
    • + mixed node +

      This can be a DOM node, jQuery node or selector pointing to an element within the tree, whose parent we want.

      +
    • +
    + +

    ._get_children ( node )

    +

    Gets the LI elements representing the children of the passed node. Returns false on failure (or if the node has no children).

    +
      +
    • + mixed node +

      This can be a DOM node, jQuery node or selector pointing to an element within the tree, whose children we want. Use -1 to return all root nodes.

      +
    • +
    + +

    .get_path ( node , id_mode )

    +

    Return the path to a node, either as an array of IDs or as an array of node names.

    +
      +
    • + mixed node +

      This can be a DOM node, jQuery node or selector pointing to an element within the tree, whose path we want.

      +
    • +
    • + bool id_mode +

      If set to true IDs are returned instead of the names of the parents. Default is false.

      +
    • +
    + +

    .correct_state ( node )

    +

    Corrects closed items to leaf items, if no children are found. Used internally, triggers an event.

    +
      +
    • + mixed node +

      This can be a DOM node, jQuery node or selector pointing to an element we want corrected.

      +
    • + + +

      .open_node ( node , callback , skip_animation )

      +

      Opens a closed node, so that its children are visible. If the animation config option is greater than 0 the children are revealed using a slide down animation, whose duration is the value of the animation config option in milliseconds. Triggers an event.

      +
        +
      • + mixed node +

        This can be a DOM node, jQuery node or selector pointing to an element we want opened.

        +
      • +
      • + function callback +

        A callback function executed once the node is opened. Used mostly internally, you'd be better of waiting for the event. You can skip this, by not specifying it, or by passing false.

        +
      • +
      • + bool skip_animation +

        If set to true the animation set in the animation config option is skipped. Default is false.

        +
      • +
      + +

      .after_open ( node )

      +

      A dummy function, it triggers an event after the open animation has finished.

      + +

      .close_node ( node , skip_animation )

      +

      Closes an open node, so that its children are not visible. If the animation config option is greater than 0 the children are hidden using a slide up animation, whose duration is the value of the animation config option in milliseconds. Triggers an event.

      +
        +
      • + mixed node +

        This can be a DOM node, jQuery node or selector pointing to an element we want closed.

        +
      • +
      • + bool skip_animation +

        If set to true the animation set in the animation config option is skipped. Default is false.

        +
      • +
      + +

      .after_close ( node )

      +

      A dummy function, it triggers an event after the close animation has finished.

      + +

      .toggle_node ( node )

      +

      If a node is closed - this function opens it, if it is open - calling this function will close it.

      +
        +
      • + mixed node +

        This can be a DOM node, jQuery node or selector pointing to an element we want toggled.

        +
      • +
      + +

      .open_all ( node , do_animation, original_obj )

      +

      Opens all descendants of the node node.

      +
        +
      • + mixed node +

        This can be a DOM node, jQuery node or selector pointing to an element whose descendants you want opened. If this param is omitted or set to -1 all nodes in the tree are opened.

        +
      • +
      • + boolean do_animation +

        If set to true all nodes are opened with an animation. This can be slow on large trees.

        +
      • +
      • + mixed original_obj +

        Used internally when recursively calling the same function - do not pass this param.

        +
      • +
      + +

      .close_all ( node, do_animation )

      +

      Closes all descendants of the node node.

      +
        +
      • + mixed node +

        This can be a DOM node, jQuery node or selector pointing to an element whose descendants you want closed. If this param is omitted or set to -1 all nodes in the tree are closed.

        +
      • +
      • + boolean do_animation +

        If set to true all nodes are closed with an animation. This can be slow on large trees.

        +
      • +
      + +
        
      +

      .is_open ( node ), .is_closed ( node ), .is_leaf ( node )

      +

      Those function check if the node is in a state.

      +
        +
      • + mixed node +

        This can be a DOM node, jQuery node or selector pointing to an element you want checked.

        +
      • +
      + +

      .clean_node ( node )

      +

      Applies all necessary classes to the node and its descendants. Used internally. Triggers an event.

      +
        +
      • + mixed node +

        This can be a DOM node, jQuery node or selector pointing to an element you want cleaned. If this param is omitted or set to -1 all nodes in the tree are cleaned.

        +
      • +
      + +

      .get_rollback ()

      +

      Get the current tree's state in the rollback format. Used mainly internally by plugins.

      + +

      .set_rollback ( html , data )

      +

      Rollback the tree. Used ONLY internally! Both arguments are part of the rollback object. If you need to rollback - take a look at jQuery.jstree.rollback(). Triggers event.

      + +

      .load_node ( node , success_callback , error_callback )

      +

      A dummy function that is overwritten by data plugins. Triggers event.

      +
        +
      • + mixed node +

        This can be a DOM node, jQuery node or selector pointing to an element you want loaded. Use -1 for root nodes.

        +
      • +
      • + function success_callback +

        A function to be executed once the node is loaded successfully - used internally. You should wait for the event.

        +
      • +
      • + function error_callback +

        A function to be executed if the node is not loaded due to an error - used internally. You should wait for the event.

        +
      • +
      + +

      ._is_loaded ( node )

      +

      A dummy function that should return true if the node's children are loaded or false otherwise.

      +
        +
      • + mixed node +

        This can be a DOM node, jQuery node or selector pointing to an element you want to check.

        +
      • +
      + +

      .create_node ( node , position , js , callback , is_loaded )

      +

      Creates the DOM structure necessary for a new node. Triggers an event.

      +
        +
      • + mixed node +

        This can be a DOM node, jQuery node or selector pointing to the element you want to create in (or next to).

        +
      • +
      • + mixed position +

        The position of the newly created node. This can be a zero based index to position the element at a specific point among the current children. You can also pass in one of those strings: "before", "after", "inside", "first", "last".

        +
      • +
      • + object js +

        The data for the newly created node. Consists of three keys:

        attr - an object of attributes (same used for jQuery.attr(). You can omit this key;
        state - a string - either "open" or "closed", for a leaf node - omit this key;
        data - a string or an object - if a string is passed it is used for the title of the node, if an object is passed there are two keys you can specify: attr and title;

        +
      • +
      • + function callback +

        A function to be executed once the node is created - used internally. You should wait for the event.

        +
      • +
      • + bool is_loaded +

        Specifies if the parent of the node is loaded or not - used ONLY internally.

        +
      • +
      + +

      ._get_string ( node )

      +

      Returns the needed string from the config object. If the key does not exist the key itself is returned.

      +
        +
      • + string key +

        The name of the string you are looking for.

        +
      • +
      + +

      .get_text ( node )

      +

      Returns the title of a node.

      +
        +
      • + mixed node +

        This can be a DOM node, jQuery node or selector pointing to the element whose title you need.

        +
      • +
      + +

      .set_text ( node , text )

      +

      Sets the title of a node. Triggers an event. This is used mostly internally - wait for a .rename_node event to avoid confusion.

      +
        +
      • + mixed node +

        This can be a DOM node, jQuery node or selector pointing to the element whose title you want to change.

        +
      • +
      • + string text +

        The new title.

        +
      • +
      + +

      .rename_node ( node , text )

      +

      Sets the title of a node. Triggers an event.

      +
        +
      • + mixed node +

        This can be a DOM node, jQuery node or selector pointing to the element whose title you want to change.

        +
      • +
      • + string text +

        The new title.

        +
      • +
      + +

      .delete_node ( node )

      +

      Removes a node. Triggers an event.

      +
        +
      • + mixed node +

        This can be a DOM node, jQuery node or selector pointing to the element you want to remove.

        +
      • +
      + +

      .prepare_move ( o , r , pos , cb , is_cb )

      +

      This function is used internally to prepare all necessary variables and nodes when moving a node around. It is automatically called as needed - you do not need to call it manually. Triggers an event.

      + +

      .check_move ()

      +

      Checks if the prepared move is a valid one.

      + +

      .move_node ( node , ref , position , is_copy , is_prepared , skip_check )

      +

      Moves a node to a new place. Triggers an event.

      +
        +
      • + mixed node +

        This can be a DOM node, jQuery node or selector pointing to the element you want to move.

        +
      • +
      • + mixed ref +

        This can be a DOM node, jQuery node or selector pointing to the element which will be the reference element in the move. -1 may be used too (to indicate the container node).

        +
      • +
      • + mixed position +

        The new position of the moved node. This can be a zero based index to position the element at a specific point among the reference node's current children. You can also use one of these strings: "before", "after", "inside", "first", "last".

        +
      • +
      • + bool is_copy +

        Should this be a copy or a move operation.

        +
      • +
      • + bool is_prepared +

        Used internally when this function is called recursively.

        +
      • +
      • + bool skip_check +

        If this is set to true check_move is not called.

        +
      • +
      + +

      ._get_move ()

      +

      Returns the lastly prepared move. The returned object contains:
      +.o - the node being moved
      +.r - the reference node in the move
      +.ot - the origin tree instance
      +.rt - the reference tree instance
      +.p - the position to move to (may be a string - "last", "first", etc)
      +.cp - the calculated position to move to (always a number)
      +.np - the new parent
      +.oc - the original node (if there was a copy)
      +.cy - boolen indicating if the move was a copy
      +.cr - same as np, but if a root node is created this is -1
      +.op - the former parent
      +.or - the node that was previously in the position of the moved node
      +

      + +
    + +
    + + \ No newline at end of file diff --git a/module/viewer/lib/js/jtree/_docs/crrm.html b/module/viewer/lib/js/jtree/_docs/crrm.html new file mode 100644 index 0000000..0f82718 --- /dev/null +++ b/module/viewer/lib/js/jtree/_docs/crrm.html @@ -0,0 +1,316 @@ + + + + + jsTree v.1.0 - CRRM documentation + + + + + + + + + + +
    + +

    jsTree v.1.0

    +

    crrm plugin

    +

    Description

    +
    +

    The CRRM plugin handles creating, renaming, removing and moving nodes by the user.

    +
    + +

    Configuration

    +
    +

    input_width_limit

    +

    A number. Default is 200.

    +

    When renaming (or creating) nodes the input for the text will autosize - this number sets the maximum size for the input.

    + +

    move

    +

    An object, containing various settings - see below for more.

    + +

    move.always_copy

    +

    true, false or "multitree". Default is false.

    +

    Defines how moves are handled - if set to true every move will be forced to a copy (leaving the original node in place). If set to "multitree" only moves between trees will be forced to a copy.

    + +

    move.open_onmove

    +

    A Boolean. Default is true.

    +

    If set to true, when moving a node to a new, closed parent, the parent node will be opened when the move completes.

    + +

    move.default_position

    +

    A string or a number. Default is "last".

    +

    The default position to move to if no position is specified. This can be a zero based index to position the element at a specific point among the new parent's current children. You can also use one of these strings: "before", "after", "inside", "first", "last".

    + +

    move.check_move

    +

    A function. Default is function (m) { return true; }.

    +

    The callback function enabling you to prevent some moves - just return false. The m parameter is the move object generated by jstree. The object follows the structure described in ._get_move.

    + +
    + +

    Demos

    +
    + +

    Creating nodes

    + + + +
    + +
    + + +

    Removing nodes

    + + +
    + +
    + + +

    Renaming nodes

    + + +
    + +
    + + +

    Moving nodes

    +

    move_1 uses the default position - "first"

    +

    move_2 specifies a position - "before" - meaning that the node specified as a first argument will come above the node specified as the second argument

    +

    move_3 will never work, because of the specified check_move function which prevents the first root node from being moved

    + + + +
    + +
    + + +
    + +

    API

    +
    + +

    ._show_input ( node , callback )

    +

    Renders an input field in a node. Used only internally.

    + +

    .rename ( node )

    +

    Sets a node in rename mode and when the user has entered changes, an event is triggered.

    +
      +
    • + mixed node +

      This can be a DOM node, jQuery node or selector pointing to an element within the tree. If you use the UI plugin - pass null to use the currently selected item.

      +
    • +
    + +

    .create ( node , position , js , callback , skip_rename )

    +

    Creates a new node. Triggers an event.

    +
      +
    • + mixed node +

      This can be a DOM node, jQuery node or selector pointing to the element you want to create in (or next to). If you use the UI plugin - pass null to use the currently selected item.

      +
    • +
    • + mixed position +

      The position of the newly created node. This can be a zero based index to position the element at a specific point among the current children. You can also pass in one of those strings: "before", "after", "inside", "first", "last".

      +
    • +
    • + object js +

      The data for the newly created node. Consists of three keys:

      attr - an object of attributes (same used for jQuery.attr(). You can omit this key;
      state - a string - either "open" or "closed", for a leaf node - omit this key;
      data - a string or an object - if a string is passed it is used for the title of the node, if an object is passed there are two keys you can specify: attr and title;

      +
    • +
    • + function callback +

      A function to be executed once the node is created. You'd be better off waiting for the event.

      +
    • +
    • + bool skip_rename +

      Skips the user input step. The node is created with the data you have supplied.

      +
    • +
    + +

    .remove ( node )

    +

    Removes a node. Triggers an event.

    +
      +
    • + mixed node +

      This can be a DOM node, jQuery node or selector pointing to an element within the tree. If you use the UI plugin - pass null to use the currently selected items.

      +
    • +
    + +
     
    +

    .check_move ( ), .move_node ( )

    +

    Both functions are overwritten from the core in order to implement the new functionality.

    + +

    .cut ( node )

    +

    Cuts a node (prepares it for pasting).

    +
      +
    • + mixed node +

      This can be a DOM node, jQuery node or selector pointing to an element within the tree. If you use the UI plugin - pass null to use the currently selected item.

      +
    • +
    + +

    .copy ( node )

    +

    Copies a node (prepares it for pasting).

    +
      +
    • + mixed node +

      This can be a DOM node, jQuery node or selector pointing to an element within the tree. If you use the UI plugin - pass null to use the currently selected item.

      +
    • +
    + +

    .paste ( node )

    +

    Pastes copied or cut nodes inside a node.

    +
      +
    • + mixed node +

      This can be a DOM node, jQuery node or selector pointing to an element within the tree. If you use the UI plugin - pass null to use the currently selected item.

      +
    • +
    + +
    + +
    + + \ No newline at end of file diff --git a/module/viewer/lib/js/jtree/_docs/dnd.html b/module/viewer/lib/js/jtree/_docs/dnd.html new file mode 100644 index 0000000..076112d --- /dev/null +++ b/module/viewer/lib/js/jtree/_docs/dnd.html @@ -0,0 +1,199 @@ + + + + + jsTree v.1.0 - dnd documentation + + + + + + + + + + +
    + +

    jsTree v.1.0

    +

    dnd plugin

    +

    Description

    +
    +

    The dnd plugin enables drag'n'drop support for jstree, also using foreign nodes and drop targets.

    +

    All foreign node options and callback functions in the config (drop_target, drop_check, drop_finish, drag_target, drag_check, drag_finish) are to be used ONLY when nodes that are not part of any tree are involved.
    If moving nodes from one tree instance to another - just listen for the "move_node.jstree" event on the receiving tree.
    DO NOT SET drag_target AND drop_target to match tree nodes!

    +
    + +

    Configuration

    +
    + +

    copy_modifier

    +

    A string. Default is "ctrl".

    +

    The special key used to make a drag copy instead of move ("ctrl", "shift", "alt", "meta").

    + +

    check_timeout

    +

    A number. Default is 200.

    +

    The number of milliseconds to wait before checking if a move is valid upon hovering a node (while dragging). 200 is a reasonable value - a higher number means better performance but slow feedback to the user, a lower number means lower performance (possibly) but the user will get feedback faster.

    + +

    open_timeout

    +

    A number. Default is 500.

    +

    The number of milliseconds to wait before opening a hovered if it has children (while dragging). This means that the user has to stop over the node for half a second in order to trigger the open operation. Keep in mind that a low value in combination with async data could mean a lot of unneeded traffic, so 500 is quite reasonable.

    + +

    drop_target

    +

    A string (jQuery selector) (or false). Default is ".jstree-drop".

    +

    A jquery selector matching all drop targets (you can also use the comma , in the string to specify multiple valid targets). If set to false drop targets are disabled.

    + +

    drop_check

    +

    A function. Default is function (data) { return true; }.

    +

    Return false to mark the move as invalid, otherwise return true. The data parameter is as follows:

    +

    data.o - the object being dragged

    +

    data.r - the drop target

    + +

    drop_finish

    +

    A function. Default is $.noop.

    +

    Gets executed after a valid drop, you get one parameter, which is as follows:

    +

    data.o - the object being dragged

    +

    data.r - the drop target

    + +

    drag_target

    +

    A string (jQuery selector) (or false). Default is ".jstree-draggable".

    +

    A jquery selector matching all foreign nodes that can be dropped on the tree (you can also use the comma , in the string to specify multiple valid foreign nodes). If set to false dragging foreign nodes is disabled.

    + +

    drag_check

    +

    A function. Default is function (data) { return { after : false, before : false, inside : true }; }.

    +

    Return a boolean for each position. The data parameter is as follows:

    +

    data.o - the foreign object being dragged

    +

    data.r - the hovered node

    + +

    drag_finish

    +

    A function. Default is $.noop.

    +

    Gets executed after a dropping a foreign element on a tree item, you get one parameter, which is as follows:

    +

    data.o - the foreign object being dragged

    +

    data.r - the target node

    + + +
    + +

    Demos

    +
    +

    Using the dnd plugin

    +

    Drag stuff around!

    +
    I have the jstree-drop class
    +
    I have the jstree-draggable class
    +
    + +
    + + +

    Reorder only demo

    +
    + +
    + + +
    + +

    API

    +
    + +
    +   +   +   +   +   +
    +

    .dnd_prepare ( ), .dnd_show ( ), .dnd_open ( ), .dnd_finish ( ), .dnd_enter ( ), .dnd_leave ( ), .start_drag ( )

    +

    All those functions are used internally only. If you want more information - examine the source code.

    + +
    + +
    + + \ No newline at end of file diff --git a/module/viewer/lib/js/jtree/_docs/hotkeys.html b/module/viewer/lib/js/jtree/_docs/hotkeys.html new file mode 100644 index 0000000..ad1bd9a --- /dev/null +++ b/module/viewer/lib/js/jtree/_docs/hotkeys.html @@ -0,0 +1,82 @@ + + + + + jsTree v.1.0 - hotkeys documentation + + + + + + + + + + +
    + +

    jsTree v.1.0

    +

    hotkeys plugin

    +

    Description

    +
    +

    The hotkeys plugin enables keyboard navigation and shortcuts. Depends on the jquery.hotkeys plugin.

    +
    + +

    Configuration

    +
    +

    Expects an object:
    each key is the keyboard shortcut (for possible values check the hotkeys plugin)
    each value is a function executed in the instance's context, the return value is used as a return value for the event.

    +

    Simple example:

    +

    "del" : function () { this.remove(); }

    +

    By default "up", "ctrl+up", "shift+up", "down", "ctrl+down", "shift+down", "left", "ctrl+left", "shift+left", "right", "ctrl+right", "shift+right", "space", "ctrl+space", "shift+space", "f2", "del" are bound.
    To override any of those - just specify your own function, to disable - just set to false. +

    + +

    Demos

    +
    + +

    Using the hotkeys plugin

    +

    Try pressing up/down/left/right/space/f2/del.

    +
    + +
    + + +
    + +

    API

    +
    + +

    .enable_hotkeys ( )

    +

    Enable shortcuts on the instance (enabled by default).

    + +

    .disable_hotkeys ( )

    +

    Disable shortcuts on the instance.

    + +
    + +
    + + \ No newline at end of file diff --git a/module/viewer/lib/js/jtree/_docs/html_data.html b/module/viewer/lib/js/jtree/_docs/html_data.html new file mode 100644 index 0000000..3e41595 --- /dev/null +++ b/module/viewer/lib/js/jtree/_docs/html_data.html @@ -0,0 +1,175 @@ + + + + + jsTree v.1.0 - html_data documentation + + + + + + + + + + +
    + +

    jsTree v.1.0

    +

    html_data plugin

    +

    Description

    +
    +

    The html_data plugin enables jsTree to convert nested unordered lists to interactive trees. jsTree can also get HTML from the server insert it into the DOM and convert that to a tree.

    +

    The basic structure you need to follow when supplying data in the HTML format is:

    +
    +
    +<li>
    +	<a href="some_value_here">Node title</a>
    +	<!-- UL node only needed for children - omit if there are no children -->
    +	<ul>
    +		<!-- Children LI nodes here -->
    +	</ul>
    +</li>
    +
    +
    +

    If you inspect the resulting structure you will find it a bit different - that is because jstree will automatically do some corrections.

    +
    +
    +<!-- one of the three classes will be applied depending on node structure -->
    +<li class="[ jstree-open | jstree-closed | jstree-leaf ]">
    +	<!-- an INS element is inserted -->
    +	<ins class="jstree-icon">&#160;</ins>
    +	<a href="some_value_here">
    +		<!-- another INS element is inserted -->
    +		<ins class="jstree-icon">&#160;</ins>
    +		Node title
    +	</a>
    +</li>
    +
    +
    +

    Both ins elements are inserted for visualization purposes. As for the class (jstree-open, jstree-closed) - you can specify that yourself to force the node to appear either closed or opened. Making a node with no children appear closed is often used - if you use ajax, opening a closed node with no children will result in jstree making a server call for the children (see the demo below).

    +
    + +

    Configuration

    +
    +

    data

    +

    A HTML string (or false if not used). Default is false.

    +

    Specifies the content to load into the container and convert to a tree.

    +

    ajax

    +

    An object (or false if not used). Default is false.

    +

    The ajax config object is pretty much the same as the jQuery ajax settings object.

    +

    You can set the data option to a function, that will be executed in the current tree's scope (this will be the tree instance) and gets the node about to be open as a paramater (or -1 for initial load). Whatever you return in the function will be sent to the server as data (so for example you can send the node's ID).

    +

    You can set the url option to a function, that will be executed in the current tree's scope (this will be the tree instance) and gets the node about to be open as a paramater (or -1 for initial load). Whatever you return in the url function will be used as the ajax URL (so that you can accomodate pretty paths such as /get_children/node_2).

    +

    The error and success functions (if present) also fire in the context of the tree, and if you return a value in the success function it will be used to populate the tree - this can be useful if you want to somehow change what the server returned on the client side before it is displayed in the tree.

    +

    correct_state

    +

    A Boolean. Default is true.

    +

    If this option is set to true if an AJAX request returns an empty result, the node that was about to be opened will be converted to a leaf node (the open icon will no longer be displayed).

    + +

    NOTE:
    If both data and ajax are not set, the current container's HTML is used to build the tree.
    If both data and ajax are set the initial tree is rendered from the data string. When opening a closed node (that has no loaded children) an AJAX request is made.

    +
    + +

    Demos

    +
    + +

    Using initial content (convert an existing list)

    +
    + +
    + + +

    Using the data config option

    +
    + + +

    Using the ajax config option

    +
    + + +

    Using both the data & ajax config options

    +
    + +
    + +

    API

    +
    +

    Both dummy functions - _is_loaded and load_node are overwritten.

    +

    .load_node_html ( node , success_callback , error_callback )

    +

    This function is called instead of load_node.

    +
      +
    • + mixed node +

      This can be a DOM node, jQuery node or selector pointing to an element you want loaded. Use -1 for root nodes.

      +
    • +
    • + function success_callback +

      A function to be executed once the node is loaded successfully - used internally. You should wait for the load_node event.

      +
    • +
    • + function error_callback +

      A function to be executed if the node is not loaded due to an error - used internally. You should wait for the load_node event.

      +
    • +
    + +
    + +
    + + \ No newline at end of file diff --git a/module/viewer/lib/js/jtree/_docs/index.html b/module/viewer/lib/js/jtree/_docs/index.html new file mode 100644 index 0000000..7303a3e --- /dev/null +++ b/module/viewer/lib/js/jtree/_docs/index.html @@ -0,0 +1,86 @@ + + + + + jsTree v.1.0 Documentation + + + + + + + + + + +
    + +

    jsTree - jquery tree plugin

    + +

    Description

    +
    + +

    jsTree:

    +
      +
    • ♦  is a javascript based, cross browser tree component. It is packaged as a jQuery plugin.
    • +
    • ♦  is absolutely free (licensed same as jQuery – under the terms of either the MIT License or the GPL v2 License).
    • +
    • ♦  is a one man project and relies on its great community for feature requests & bug reports. Join in!
    • +
    • ♦  passes jslint validation, minifies nicely and does not modify the global scope in any way.
    • +
    • ♦  uses plugins so feel free to remove any plugins you do not use (for an even smaller download) or create your own plugins.
    • +
    + +

    Features at a glance

    +
      +
    • Various data sources - HTML, JSON, XML
    • +
    • Supports AJAX loading
    • +
    • Drag & drop support
    • +
    • Highly configurable
    • +
    • Theme support + included themes
    • +
    • Uses jQuery's event system
    • +
    • Optional keyboard navigation
    • +
    • Maintain the same tree in many languages
    • +
    • Inline editing
    • +
    • Open/close optional animation
    • +
    • Define node types and fine tune them
    • +
    • Configurable multitree drag & drop
    • +
    • Optional checkbox tree support
    • +
    • Search function
    • +
    • Supports plugins
    • +
    • Optional state saving using cookies
    • +
    • RTL support
    • +
    • Optional sorting / unique management
    • +
    +

    if you like the project - consider supporting jstree.

    +
    + +

    Plugins documentation

    +
    +

    As of version 1.0 jsTree is extremely plugin friendly, so all functionality is now wrapped in plugins, which take care of various aspects of the tree and can be removed without affecting the functionality of other plugins. Below you will find a list of plugins - each with its own documentation page. Probably a good place to start is the core.

    +
      +
    • Core functionality

      all core functions for manipulating the tree + basic examples of including, configuring and working with the tree, along with demos of the new event system

    • +
    • HTML_DATA plugin

      enables jsTree to convert nested unordered lists to interactive trees, an already existing UL may be used or data could be retrieved from a server

    • +
    • JSON_DATA plugin

      enables jsTree to convert JSON objects to interactive trees, data can be set up in the config or retrieved from a server

    • +
    • XML_DATA plugin

      enables jsTree to convert XML objects to interactive trees (using XSL), data can be set up in the config or retrieved from a server

    • +
    • Themes plugin

      controls the looks of jstree - without this plugin you will get a functional tree, but it will look just like an ordinary UL list

    • +
    • UI plugin

      handles selecting, deselecting and hovering tree items

    • +
    • CRRM plugin

      handles creating, renaming, removing and moving nodes by the user, also includes cut/copy/paste functions

    • +
    • Hotkeys plugin

      enables support for keyboard navigation & shortcuts, highly configurable

    • +
    • Languages plugin

      enables multilanguage support - each node can have multiple titles, but only one is visible

    • +
    • Cookies plugin

      enables jstree to save the state of the tree across sessions, by saving selected and opened nodes in a cookie

    • +
    • Sort plugin

      enables jstree to automatically sort all nodes
      using a specified function

    • +
    • DND plugin

      enables drag'n'drop support for jstree, also using foreign nodes and drop targets

    • +
    • Checkbox plugin

      makes multiselection possible using three-state checkboxes

    • +
    • Search plugin

      enables searching for nodes whose title contains a given string, works on async trees too

    • +
    • Contextmenu plugin

      enables a multilevel context menu on tree items

    • +
    • Types plugin

      each node can have a type, and you can define rules on how that type should behave

    • +
    • Themeroller plugin

      adds support for jQuery UI's themes

    • +
    • Unique plugin

      adds unique checking to jsTree

    • +
    • Wholerow plugin

      enhances UIs select & hover functions

    • +
    +
    + +
    + + \ No newline at end of file diff --git a/module/viewer/lib/js/jtree/_docs/json_data.html b/module/viewer/lib/js/jtree/_docs/json_data.html new file mode 100644 index 0000000..6312a03 --- /dev/null +++ b/module/viewer/lib/js/jtree/_docs/json_data.html @@ -0,0 +1,249 @@ + + + + + jsTree v.1.0 - json_data documentation + + + + + + + + + + +
    + +

    jsTree v.1.0

    +

    json_data plugin

    +

    Description

    +
    +

    The json_data plugin enables jsTree to convert JSON objects to interactive trees. The data (JSON) can be set up in the config or retrieved from a server (also ondemand). Version 1.0 also introduces the experimental progressive render feature, which is suitable for large heavy trees, when the DOM would be too heavy to manipulate.

    +

    The basic structure you need to follow when supplying data in the JSON format is:

    +
    +
    +{ 
    +	"data" : "node_title", 
    +	// omit `attr` if not needed; the `attr` object gets passed to the jQuery `attr` function
    +	"attr" : { "id" : "node_identificator", "some-other-attribute" : "attribute_value" }, 
    +	// `state` and `children` are only used for NON-leaf nodes
    +	"state" : "closed", // or "open", defaults to "closed"
    +	"children" : [ /* an array of child nodes objects */ ]
    +}
    +
    +
    +

    The attr object will appear as attributes on the resulting li node.

    +

    You may need to pass some attributes to the a node, or set some metadata, or use language versions (for the languages plugin):

    +
    +
    +{
    +	// `data` can also be an object
    +	"data" : { 
    +		"title" : "The node title", 
    +		// omit when not needed
    +		"attr" : {}, 
    +		// if `icon` contains a slash / it is treated as a file, used for background
    +		// otherwise - it is added as a class to the <ins> node
    +		"icon" : "folder"
    +	},
    +
    +	// the `metadata` property will be saved using the jQuery `data` function on the `li` node
    +	"metadata" : "a string, array, object, etc",
    +
    +	// if you use the language plugin - just set this property
    +	// also make sure that `data` is an array of objects
    +	"language" : "en" // any code you are using
    +}
    +
    +
    +

    As seen in the first example below - you can also use a simple string to define a node (Child 1 & Child 2).

    +
    + +

    Configuration

    +
    +

    data

    +

    A JSON object (or false if not used). Default is false.

    +

    Specifies the content to load into the container and convert to a tree. You can also set this to a function - it will be executed in the tree's scope for every node that needs to be loaded, the function will receive two arguments - the node being loaded & a function to call with the data once your processing is done.

    +

    ajax

    +

    An object (or false if not used). Default is false.

    +

    The ajax config object is pretty much the same as the jQuery ajax settings object.

    +

    You can set the data option to a function, that will be executed in the current tree's scope (this will be the tree instance) and gets the node about to be open as a paramater (or -1 for initial load). Whatever you return in the data function will be sent to the server as data (so for example you can send the node's ID).

    +

    You can set the url option to a function, that will be executed in the current tree's scope (this will be the tree instance) and gets the node about to be open as a paramater (or -1 for initial load). Whatever you return in the url function will be used as the ajax URL (so that you can accomodate pretty paths such as /get_children/node_2).

    +

    The error and success functions (if present) also fire in the context of the tree, and if you return a value in the success function it will be used to populate the tree - this can be useful if you want to somehow change what the server returned on the client side before it is displayed in the tree (for example some .NET json implementations require this to work: "success" : function (data) { return data.d; }.

    +

    correct_state

    +

    A Boolean. Default is true.

    +

    If this option is set to true if an AJAX returns an empty result, the node that was about to be opened will be converted to a leaf node (the open icon will no longer be displayed).

    +

    progressive_render

    +

    A Boolean. Default is false.

    +

    If this option is set to true only the visible (open nodes) parts of the returned JSON are converted to DOM nodes, any hidden parts are saved away and parsed ondemand (when a node becomes visible). This is useful when you have a large nested tree which would result in a heavy DOM.

    +

    progressive_unload

    +

    A Boolean. Default is false.

    +

    If this option is set to true when a node is closed its children are removed from the DOM and saved as metadata on the node itself, on reopen that metadata is used (much like progressive_render).

    + +

    NOTE:
    If both data and ajax are set the initial tree is rendered from the data string. When opening a closed node (that has no loaded children) an AJAX request is made.

    +
    + +

    Demos

    +
    + +

    Using the data config option

    +
    + + +

    Using the ajax config option

    +
    + + +

    Using the progressive render config option

    +
    + + +

    Using both the data & ajax config options

    +
    + +
    + +

    API

    +
    +

    Both dummy functions - _is_loaded and load_node are overwritten.

    +

    .load_node_json ( node , success_callback , error_callback )

    +

    This function is called instead of load_node.

    +
      +
    • + mixed node +

      This can be a DOM node, jQuery node or selector pointing to an element you want loaded. Use -1 for root nodes.

      +
    • +
    • + function success_callback +

      A function to be executed once the node is loaded successfully - used internally. You should wait for the load_node event.

      +
    • +
    • + function error_callback +

      A function to be executed if the node is not loaded due to an error - used internally. You should wait for the load_node event.

      +
    • +
    +

    ._parse_json ( data , node , is_callback )

    +

    This function converts JSON nodes to the DOM structure required by jstree. Returns a jQuery object.

    +
      +
    • + mixed node +

      This can be a tree node in the JSON format described above, or an array of such JSON nodes, may also be a string.

      +
    • +
    • + mixed node +

      This is the DOM node, jQuery node or selector pointing to the element for which data is parsed. -1 means root nodes.

      +
    • +
    • + bool is_callback +

      Specifies if the function is called recursively - used ONLY internally.

      +
    • +
    +

    .get_json ( node , li_attr , a_attr )

    +

    This function returns an array of tree nodes converted back to JSON.

    +
      +
    • + mixed node +

      This can be a DOM node, jQuery node or selector pointing to an element you want returned. Use -1 or omit to get the whole tree.

      +
    • +
    • + array li_attr +

      The attributes to collect from the LI node. Defaults to [ "id" , "class" ]

      +
    • +
    • + array a_attr +

      The attributes to collect from the A node. Defaults to [ ]

      +
    • +
    • + boolean is_callback +

      Used internally.

      +
    • +
    + +
    + +
    + + \ No newline at end of file diff --git a/module/viewer/lib/js/jtree/_docs/languages.html b/module/viewer/lib/js/jtree/_docs/languages.html new file mode 100644 index 0000000..73c1034 --- /dev/null +++ b/module/viewer/lib/js/jtree/_docs/languages.html @@ -0,0 +1,152 @@ + + + + + jsTree v.1.0 - languages documentation + + + + + + + + + + +
    + +

    jsTree v.1.0

    +

    languages plugin

    +

    Description

    +
    +

    The languages plugin enables multilanguage trees. This means that each node has a specified number of titles - each in a different "language". Only one language set is visible at any given time. This is useful for maintaining the same structure in many languages (hence the name of the plugin)

    +
    + +

    Configuration

    +
    +

    Expects an array of language codes. Each of the items is used as a CSS class name, so make sure you specify only valid CSS class name strings. The first langauge will be visible onload. For example:

    +

    [ "en", "de", "bg" ]

    +
    + +

    Demos

    +
    +

    Check your data plugin documentation (html_data, xml_data, json_data) or take a close look at these examples for information on how to specify multilanguage nodes.

    + +

    Using the languages plugin with HTML data

    + + + + + + + +
    + +

    API

    +
    + +

    .set_lang ( lang )

    +

    Set the tree's visible language. Triggers an event.

    +
      +
    • + string
      number
      lang +

      Either the language code string (as specified in the config) or an index from the config array.

      +
    • +
    +

    .get_lang ( )

    +

    Returns the name of the currently visible language.

    + +

    ._get_string ( node , lang )

    +

    Returns the needed string from the core config object. Overwrites the get_string function from the core. If the key does not exist in that language, but exists in the root of the object - that is returned, if even that does not exist - the key itself is returned.

    +
      +
    • + string key +

      The name of the string you are looking for. If you want to use the localize option just set the strings core config option to an object like this one: strings : { "lang-code-here" : { "string-key" : "string-value" ... }, "other-lang" : { ... } }, otherwise _get_strings won't be affected.

      +
    • +
    • + string lang +

      The language code string (as specified in the config) to get the key in. If not specified the currently visible language is used.

      +
    • +
    + +

    .get_text ( node , lang )

    +

    Returns the title of a node. Overwrites the get_text function from the core.

    +
      +
    • + mixed node +

      This can be a DOM node, jQuery node or selector pointing to the element whose title you need.

      +
    • +
    • + string lang +

      The language code string (as specified in the config) to get the title in. If you omit this - the currently visible language is used.

      +
    • +
    + +

    .set_text ( node , text , lang )

    +

    Sets the title of a node. Overwrites the set_text function from the core. This is used internally - you should use rename_node. Since rename_node uses set_text internally you can pass a language string as a third parameter to rename_node.

    +
      +
    • + mixed node +

      This can be a DOM node, jQuery node or selector pointing to the element whose title you want to change.

      +
    • +
    • + string text +

      The new title.

      +
    • +
    • + string lang +

      The language code string (as specified in the config) to get the title in. If you omit this - the currently visible language is used.

      +
    • +
    + +

    ._load_css ( )

    +

    used only internally to include the CSS necessary for the plugin onload.

    + +

    .create_node ( obj , position , js , callback )

    +

    Overwrites the create_node function from the core. To create a node with a few titles use an array for the data property of the js parameter:

    +

    { "data" : [ { "title" : "EN title", language : "en" }, { "title" : "BG заглавие", language : "bg" } ] }

    + +
    + +
    + + \ No newline at end of file diff --git a/module/viewer/lib/js/jtree/_docs/logo.png b/module/viewer/lib/js/jtree/_docs/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..9f7a35be1fd0805cfb685c30e9a02ef33befdd29 GIT binary patch literal 6217 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 nd*O*Eo_OMkC!ToXLjFGhq(qa0&% + + + + jsTree v.1.0 - Search documentation + + + + + + + + + + +
    + +

    jsTree v.1.0

    +

    search plugin

    +

    Description

    +
    +

    The search plugin enables searching for nodes whose title contains a given string, works on async trees too. All found nodes get the jstree-search class applied to their contained a nodes - you can use that class to style search results.

    +
    + +

    Configuration

    +
    + +

    search_method

    +

    A string. Default is "contains".

    +

    The method to use for searching. The other options bundled with jstree are "jstree_contains" (case insensitive search) and "jstree_title_contains" (case insensitive based on the title tag of the A node). For multiple word search take a look this: https://github.com/vakata/jstree/issues/10 - you can easily write your own method too.

    + +

    show_only_matches

    +

    A boolean. Default is false.

    +

    If set to true all non-matching nodes are hidden and only the matching nodes (and their parents) are left visible, until the search is cleared. Keep in mind show_only_matches is heavy on the browser/DOM and is still experimental.

    + +

    ajax

    +

    An object (or false if not used). Default is false.

    +

    This object can be used to make a request to the server on each search - useful if you are using async trees. That way you can return an array of IDs that need to be loaded before the actual DOM search is performed (so that all the nodes that will match the search are loaded). For example if the user searches for "string", you get that on the server side, check the database and find out that there is a node containing that string. But the node is the child of some other node, etc - so in your response you must return the path to the node (without the node itself) as ids: ["#root_node","#child_node_3"]. This means that jstree will load those two nodes before doing the client side search, ensuring that your node will be visible.

    +

    The ajax config object is pretty much the same as the jQuery ajax settings object.

    +

    You can set the data option to a function, that will be executed in the current tree's scope (this will be the tree instance) and gets the search string as a paramater. Whatever you return in the function will be sent to the server as data.

    +

    You can set the url option to a function, that will be executed in the current tree's scope (this will be the tree instance) and gets the search string as a paramater. Whatever you return in the function will be used as the URL of the ajax request.

    +

    The error and success functions (if present) also fire in the context of the tree, and if you return a value in the success function it will be used as the array of IDs.

    + +
    + +

    Demos

    +
    + +

    Searching nodes

    +

    Do not open the node - instead - just press the button.

    + +
    + + +

    Using adv_search

    +

    Try pressing the buttons. It will also work with AJAX searching.

    + + + + + + + +
    + +

    API

    +
    + + +

    Searches for nodes matching the supplied string. Triggers an event.

    +
      +
    • + string str +

      The string to search for.

      +
    • +
    • + boolean skip_async +

      If set to true - skip the async search (if setup in the config). This is used mostly internally.

      +
    • +
    + + +

    Clears the current search. This function is automatically called when doing a new search. Triggers an event.

    + +

    ._search_open ( is_callback )

    +

    Used internally if async is setup in the config. This functions loads the nodes returned by the server one by one.

    + +
    + +
    + + \ No newline at end of file diff --git a/module/viewer/lib/js/jtree/_docs/sort.html b/module/viewer/lib/js/jtree/_docs/sort.html new file mode 100644 index 0000000..9d3a8ae --- /dev/null +++ b/module/viewer/lib/js/jtree/_docs/sort.html @@ -0,0 +1,85 @@ + + + + + jsTree v.1.0 - sort documentation + + + + + + + + + + +
    + +

    jsTree v.1.0

    +

    sort plugin

    +

    Description

    +
    +

    The sort enables jstree to automatically sort all nodes using a specified function. This means that when the user creates, renames or moves nodes around - they will automatically sort.

    +
    + +

    Configuration

    +
    + +

    Expects a function. The functions receives two arguments - two nodes to be compared. Return -1 or 1 (or any other different from -1). Default is:

    +

    function (a, b) { return this.get_text(a) > this.get_text(b) ? 1 : -1; }

    + +
    + +

    Demos

    +
    +

    Using the sort plugin

    + +
    + +
    + + +
    + +

    API

    +
    + +

    .sort ( node )

    +

    Sorts the children of the specified node - this function is called automatically.

    +
      +
    • + mixed node +

      This can be a DOM node, jQuery node or selector pointing to the element.

      +
    • +
    +
    + +
    + + \ No newline at end of file diff --git a/module/viewer/lib/js/jtree/_docs/syntax/!script.js b/module/viewer/lib/js/jtree/_docs/syntax/!script.js new file mode 100644 index 0000000..3796b01 --- /dev/null +++ b/module/viewer/lib/js/jtree/_docs/syntax/!script.js @@ -0,0 +1,2232 @@ +/** + * SyntaxHighlighter + * http://alexgorbatchev.com/ + * + * SyntaxHighlighter is donationware. If you are using it, please donate. + * http://alexgorbatchev.com/wiki/SyntaxHighlighter:Donate + * + * @version + * 2.1.364 (October 15 2009) + * + * @copyright + * Copyright (C) 2004-2009 Alex Gorbatchev. + * + * @license + * This file is part of SyntaxHighlighter. + * + * SyntaxHighlighter is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * SyntaxHighlighter is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with SyntaxHighlighter. If not, see . + */ +// +// Begin anonymous function. This is used to contain local scope variables without polutting global scope. +// +if (!window.SyntaxHighlighter) var SyntaxHighlighter = function() { + +// Shortcut object which will be assigned to the SyntaxHighlighter variable. +// This is a shorthand for local reference in order to avoid long namespace +// references to SyntaxHighlighter.whatever... +var sh = { + defaults : { + /** Additional CSS class names to be added to highlighter elements. */ + 'class-name' : '', + + /** First line number. */ + 'first-line' : 1, + + /** + * Pads line numbers. Possible values are: + * + * false - don't pad line numbers. + * true - automaticaly pad numbers with minimum required number of leading zeroes. + * [int] - length up to which pad line numbers. + */ + 'pad-line-numbers' : true, + + /** Lines to highlight. */ + 'highlight' : null, + + /** Enables or disables smart tabs. */ + 'smart-tabs' : true, + + /** Gets or sets tab size. */ + 'tab-size' : 4, + + /** Enables or disables gutter. */ + 'gutter' : true, + + /** Enables or disables toolbar. */ + 'toolbar' : true, + + /** Forces code view to be collapsed. */ + 'collapse' : false, + + /** Enables or disables automatic links. */ + 'auto-links' : true, + + /** Gets or sets light mode. Equavalent to turning off gutter and toolbar. */ + 'light' : false, + + /** Enables or disables automatic line wrapping. */ + 'wrap-lines' : true, + + 'html-script' : false + }, + + config : { + /** Enables use of tags. */ + scriptScriptTags : { left: /(<|<)\s*script.*?(>|>)/gi, right: /(<|<)\/\s*script\s*(>|>)/gi } + }, + + toolbar : { + /** + * Creates new toolbar for a highlighter. + * @param {Highlighter} highlighter Target highlighter. + */ + create : function(highlighter) + { + var div = document.createElement('DIV'), + items = sh.toolbar.items + ; + + div.className = 'toolbar'; + + for (var name in items) + { + var constructor = items[name], + command = new constructor(highlighter), + element = command.create() + ; + + highlighter.toolbarCommands[name] = command; + + if (element == null) + continue; + + if (typeof(element) == 'string') + element = sh.toolbar.createButton(element, highlighter.id, name); + + element.className += 'item ' + name; + div.appendChild(element); + } + + return div; + }, + + /** + * Create a standard anchor button for the toolbar. + * @param {String} label Label text to display. + * @param {String} highlighterId Highlighter ID that this button would belong to. + * @param {String} commandName Command name that would be executed. + * @return {Element} Returns an 'A' element. + */ + createButton : function(label, highlighterId, commandName) + { + var a = document.createElement('a'), + style = a.style, + config = sh.config, + width = config.toolbarItemWidth, + height = config.toolbarItemHeight + ; + + a.href = '#' + commandName; + a.title = label; + a.highlighterId = highlighterId; + a.commandName = commandName; + a.innerHTML = label; + + if (isNaN(width) == false) + style.width = width + 'px'; + + if (isNaN(height) == false) + style.height = height + 'px'; + + a.onclick = function(e) + { + try + { + sh.toolbar.executeCommand( + this, + e || window.event, + this.highlighterId, + this.commandName + ); + } + catch(e) + { + sh.utils.alert(e.message); + } + + return false; + }; + + return a; + }, + + /** + * Executes a toolbar command. + * @param {Element} sender Sender element. + * @param {MouseEvent} event Original mouse event object. + * @param {String} highlighterId Highlighter DIV element ID. + * @param {String} commandName Name of the command to execute. + * @return {Object} Passes out return value from command execution. + */ + executeCommand : function(sender, event, highlighterId, commandName, args) + { + var highlighter = sh.vars.highlighters[highlighterId], + command + ; + + if (highlighter == null || (command = highlighter.toolbarCommands[commandName]) == null) + return null; + + return command.execute(sender, event, args); + }, + + /** Collection of toolbar items. */ + items : { + expandSource : function(highlighter) + { + this.create = function() + { + if (highlighter.getParam('collapse') != true) + return; + + return sh.config.strings.expandSource; + }; + + this.execute = function(sender, event, args) + { + var div = highlighter.div; + + sender.parentNode.removeChild(sender); + div.className = div.className.replace('collapsed', ''); + }; + }, + + /** + * Command to open a new window and display the original unformatted source code inside. + */ + viewSource : function(highlighter) + { + this.create = function() + { + return sh.config.strings.viewSource; + }; + + this.execute = function(sender, event, args) + { + var code = sh.utils.fixInputString(highlighter.originalCode).replace(/' + code + ''); + wnd.document.close(); + }; + }, + + /** + * Command to copy the original source code in to the clipboard. + * Uses Flash method if clipboardSwf is configured. + */ + copyToClipboard : function(highlighter) + { + var flashDiv, flashSwf, + highlighterId = highlighter.id + ; + + this.create = function() + { + var config = sh.config; + + // disable functionality if running locally + if (config.clipboardSwf == null) + return null; + + function params(list) + { + var result = ''; + + for (var name in list) + result += ""; + + return result; + }; + + function attributes(list) + { + var result = ''; + + for (var name in list) + result += " " + name + "='" + list[name] + "'"; + + return result; + }; + + var args1 = { + width : config.toolbarItemWidth, + height : config.toolbarItemHeight, + id : highlighterId + '_clipboard', + type : 'application/x-shockwave-flash', + title : sh.config.strings.copyToClipboard + }, + + // these arguments are used in IE's collection + args2 = { + allowScriptAccess : 'always', + wmode : 'transparent', + flashVars : 'highlighterId=' + highlighterId, + menu : 'false' + }, + swf = config.clipboardSwf, + html + ; + + if (/msie/i.test(navigator.userAgent)) + { + html = '' + + params(args2) + + params({ movie : swf }) + + '' + ; + } + else + { + html = '' + ; + } + + flashDiv = document.createElement('div'); + flashDiv.innerHTML = html; + + return flashDiv; + }; + + this.execute = function(sender, event, args) + { + var command = args.command; + + switch (command) + { + case 'get': + var code = sh.utils.unindent( + sh.utils.fixInputString(highlighter.originalCode) + .replace(/</g, '<') + .replace(/>/g, '>') + .replace(/&/g, '&') + ); + + if(window.clipboardData) + // will fall through to the confirmation because there isn't a break + window.clipboardData.setData('text', code); + else + return sh.utils.unindent(code); + + case 'ok': + sh.utils.alert(sh.config.strings.copyToClipboardConfirmation); + break; + + case 'error': + sh.utils.alert(args.message); + break; + } + }; + }, + + /** Command to print the colored source code. */ + printSource : function(highlighter) + { + this.create = function() + { + return sh.config.strings.print; + }; + + this.execute = function(sender, event, args) + { + var iframe = document.createElement('IFRAME'), + doc = null + ; + + // make sure there is never more than one hidden iframe created by SH + if (sh.vars.printFrame != null) + document.body.removeChild(sh.vars.printFrame); + + sh.vars.printFrame = iframe; + + // this hides the iframe + iframe.style.cssText = 'position:absolute;width:0px;height:0px;left:-500px;top:-500px;'; + + document.body.appendChild(iframe); + doc = iframe.contentWindow.document; + + copyStyles(doc, window.document); + doc.write('
    ' + highlighter.div.innerHTML + '
    '); + doc.close(); + + iframe.contentWindow.focus(); + iframe.contentWindow.print(); + + function copyStyles(destDoc, sourceDoc) + { + var links = sourceDoc.getElementsByTagName('link'); + + for(var i = 0; i < links.length; i++) + if(links[i].rel.toLowerCase() == 'stylesheet' && /shCore\.css$/.test(links[i].href)) + destDoc.write(''); + }; + }; + }, + + /** Command to display the about dialog window. */ + about : function(highlighter) + { + this.create = function() + { + return sh.config.strings.help; + }; + + this.execute = function(sender, event) + { + var wnd = sh.utils.popup('', '_blank', 500, 250, 'scrollbars=0'), + doc = wnd.document + ; + + doc.write(sh.config.strings.aboutDialog); + doc.close(); + wnd.focus(); + }; + } + } + }, + + utils : { + /** + * Finds an index of element in the array. + * @ignore + * @param {Object} searchElement + * @param {Number} fromIndex + * @return {Number} Returns index of element if found; -1 otherwise. + */ + indexOf : function(array, searchElement, fromIndex) + { + fromIndex = Math.max(fromIndex || 0, 0); + + for (var i = fromIndex; i < array.length; i++) + if(array[i] == searchElement) + return i; + + return -1; + }, + + /** + * Generates a unique element ID. + */ + guid : function(prefix) + { + return prefix + Math.round(Math.random() * 1000000).toString(); + }, + + /** + * Merges two objects. Values from obj2 override values in obj1. + * Function is NOT recursive and works only for one dimensional objects. + * @param {Object} obj1 First object. + * @param {Object} obj2 Second object. + * @return {Object} Returns combination of both objects. + */ + merge: function(obj1, obj2) + { + var result = {}, name; + + for (name in obj1) + result[name] = obj1[name]; + + for (name in obj2) + result[name] = obj2[name]; + + return result; + }, + + /** + * Attempts to convert string to boolean. + * @param {String} value Input string. + * @return {Boolean} Returns true if input was "true", false if input was "false" and value otherwise. + */ + toBoolean: function(value) + { + switch (value) + { + case "true": + return true; + + case "false": + return false; + } + + return value; + }, + + /** + * Opens up a centered popup window. + * @param {String} url URL to open in the window. + * @param {String} name Popup name. + * @param {int} width Popup width. + * @param {int} height Popup height. + * @param {String} options window.open() options. + * @return {Window} Returns window instance. + */ + popup: function(url, name, width, height, options) + { + var x = (screen.width - width) / 2, + y = (screen.height - height) / 2 + ; + + options += ', left=' + x + + ', top=' + y + + ', width=' + width + + ', height=' + height + ; + options = options.replace(/^,/, ''); + + var win = window.open(url, name, options); + win.focus(); + return win; + }, + + /** + * Adds event handler to the target object. + * @param {Object} obj Target object. + * @param {String} type Name of the event. + * @param {Function} func Handling function. + */ + addEvent: function(obj, type, func) + { + if (obj.attachEvent) + { + obj['e' + type + func] = func; + obj[type + func] = function() + { + obj['e' + type + func](window.event); + } + obj.attachEvent('on' + type, obj[type + func]); + } + else + { + obj.addEventListener(type, func, false); + } + }, + + /** + * Displays an alert. + * @param {String} str String to display. + */ + alert: function(str) + { + alert(sh.config.strings.alert + str) + }, + + /** + * Finds a brush by its alias. + * + * @param {String} alias Brush alias. + * @param {Boolean} alert Suppresses the alert if false. + * @return {Brush} Returns bursh constructor if found, null otherwise. + */ + findBrush: function(alias, alert) + { + var brushes = sh.vars.discoveredBrushes, + result = null + ; + + if (brushes == null) + { + brushes = {}; + + // Find all brushes + for (var brush in sh.brushes) + { + var aliases = sh.brushes[brush].aliases; + + if (aliases == null) + continue; + + // keep the brush name + sh.brushes[brush].name = brush.toLowerCase(); + + for (var i = 0; i < aliases.length; i++) + brushes[aliases[i]] = brush; + } + + sh.vars.discoveredBrushes = brushes; + } + + result = sh.brushes[brushes[alias]]; + + if (result == null && alert != false) + sh.utils.alert(sh.config.strings.noBrush + alias); + + return result; + }, + + /** + * Executes a callback on each line and replaces each line with result from the callback. + * @param {Object} str Input string. + * @param {Object} callback Callback function taking one string argument and returning a string. + */ + eachLine: function(str, callback) + { + var lines = str.split('\n'); + + for (var i = 0; i < lines.length; i++) + lines[i] = callback(lines[i]); + + return lines.join('\n'); + }, + + /** + * This is a special trim which only removes first and last empty lines + * and doesn't affect valid leading space on the first line. + * + * @param {String} str Input string + * @return {String} Returns string without empty first and last lines. + */ + trimFirstAndLastLines: function(str) + { + return str.replace(/^[ ]*[\n]+|[\n]*[ ]*$/g, ''); + }, + + /** + * Parses key/value pairs into hash object. + * + * Understands the following formats: + * - name: word; + * - name: [word, word]; + * - name: "string"; + * - name: 'string'; + * + * For example: + * name1: value; name2: [value, value]; name3: 'value' + * + * @param {String} str Input string. + * @return {Object} Returns deserialized object. + */ + parseParams: function(str) + { + var match, + result = {}, + arrayRegex = new XRegExp("^\\[(?(.*?))\\]$"), + regex = new XRegExp( + "(?[\\w-]+)" + + "\\s*:\\s*" + + "(?" + + "[\\w-%#]+|" + // word + "\\[.*?\\]|" + // [] array + '".*?"|' + // "" string + "'.*?'" + // '' string + ")\\s*;?", + "g" + ) + ; + + while ((match = regex.exec(str)) != null) + { + var value = match.value + .replace(/^['"]|['"]$/g, '') // strip quotes from end of strings + ; + + // try to parse array value + if (value != null && arrayRegex.test(value)) + { + var m = arrayRegex.exec(value); + value = m.values.length > 0 ? m.values.split(/\s*,\s*/) : []; + } + + result[match.name] = value; + } + + return result; + }, + + /** + * Wraps each line of the string into tag with given style applied to it. + * + * @param {String} str Input string. + * @param {String} css Style name to apply to the string. + * @return {String} Returns input string with each line surrounded by tag. + */ + decorate: function(str, css) + { + if (str == null || str.length == 0 || str == '\n') + return str; + + str = str.replace(/... to them so that + // leading spaces aren't included. + if (css != null) + str = sh.utils.eachLine(str, function(line) + { + if (line.length == 0) + return ''; + + var spaces = ''; + + line = line.replace(/^( | )+/, function(s) + { + spaces = s; + return ''; + }); + + if (line.length == 0) + return spaces; + + return spaces + '' + line + ''; + }); + + return str; + }, + + /** + * Pads number with zeros until it's length is the same as given length. + * + * @param {Number} number Number to pad. + * @param {Number} length Max string length with. + * @return {String} Returns a string padded with proper amount of '0'. + */ + padNumber : function(number, length) + { + var result = number.toString(); + + while (result.length < length) + result = '0' + result; + + return result; + }, + + /** + * Measures width of a single space character. + * @return {Number} Returns width of a single space character. + */ + measureSpace : function() + { + var container = document.createElement('div'), + span, + result = 0, + body = document.body, + id = sh.utils.guid('measureSpace'), + + // variable names will be compressed, so it's better than a plain string + divOpen = '
    ' + + divOpen + 'lines">' + + divOpen + 'line">' + + divOpen + 'content' + + '"> ' + closeSpan + closeSpan + + closeDiv + + closeDiv + + closeDiv + + closeDiv + ; + + body.appendChild(container); + span = document.getElementById(id); + + if (/opera/i.test(navigator.userAgent)) + { + var style = window.getComputedStyle(span, null); + result = parseInt(style.getPropertyValue("width")); + } + else + { + result = span.offsetWidth; + } + + body.removeChild(container); + + return result; + }, + + /** + * Replaces tabs with spaces. + * + * @param {String} code Source code. + * @param {Number} tabSize Size of the tab. + * @return {String} Returns code with all tabs replaces by spaces. + */ + processTabs : function(code, tabSize) + { + var tab = ''; + + for (var i = 0; i < tabSize; i++) + tab += ' '; + + return code.replace(/\t/g, tab); + }, + + /** + * Replaces tabs with smart spaces. + * + * @param {String} code Code to fix the tabs in. + * @param {Number} tabSize Number of spaces in a column. + * @return {String} Returns code with all tabs replaces with roper amount of spaces. + */ + processSmartTabs : function(code, tabSize) + { + var lines = code.split('\n'), + tab = '\t', + spaces = '' + ; + + // Create a string with 1000 spaces to copy spaces from... + // It's assumed that there would be no indentation longer than that. + for (var i = 0; i < 50; i++) + spaces += ' '; // 20 spaces * 50 + + // This function inserts specified amount of spaces in the string + // where a tab is while removing that given tab. + function insertSpaces(line, pos, count) + { + return line.substr(0, pos) + + spaces.substr(0, count) + + line.substr(pos + 1, line.length) // pos + 1 will get rid of the tab + ; + }; + + // Go through all the lines and do the 'smart tabs' magic. + code = sh.utils.eachLine(code, function(line) + { + if (line.indexOf(tab) == -1) + return line; + + var pos = 0; + + while ((pos = line.indexOf(tab)) != -1) + { + // This is pretty much all there is to the 'smart tabs' logic. + // Based on the position within the line and size of a tab, + // calculate the amount of spaces we need to insert. + var spaces = tabSize - pos % tabSize; + line = insertSpaces(line, pos, spaces); + } + + return line; + }); + + return code; + }, + + /** + * Performs various string fixes based on configuration. + */ + fixInputString : function(str) + { + var br = /|<br\s*\/?>/gi; + + if (sh.config.bloggerMode == true) + str = str.replace(br, '\n'); + + if (sh.config.stripBrs == true) + str = str.replace(br, ''); + + return str; + }, + + /** + * Removes all white space at the begining and end of a string. + * + * @param {String} str String to trim. + * @return {String} Returns string without leading and following white space characters. + */ + trim: function(str) + { + return str.replace(/^\s+|\s+$/g, ''); + }, + + /** + * Unindents a block of text by the lowest common indent amount. + * @param {String} str Text to unindent. + * @return {String} Returns unindented text block. + */ + unindent: function(str) + { + var lines = sh.utils.fixInputString(str).split('\n'), + indents = new Array(), + regex = /^\s*/, + min = 1000 + ; + + // go through every line and check for common number of indents + for (var i = 0; i < lines.length && min > 0; i++) + { + var line = lines[i]; + + if (sh.utils.trim(line).length == 0) + continue; + + var matches = regex.exec(line); + + // In the event that just one line doesn't have leading white space + // we can't unindent anything, so bail completely. + if (matches == null) + return str; + + min = Math.min(matches[0].length, min); + } + + // trim minimum common number of white space from the begining of every line + if (min > 0) + for (var i = 0; i < lines.length; i++) + lines[i] = lines[i].substr(min); + + return lines.join('\n'); + }, + + /** + * Callback method for Array.sort() which sorts matches by + * index position and then by length. + * + * @param {Match} m1 Left object. + * @param {Match} m2 Right object. + * @return {Number} Returns -1, 0 or -1 as a comparison result. + */ + matchesSortCallback: function(m1, m2) + { + // sort matches by index first + if(m1.index < m2.index) + return -1; + else if(m1.index > m2.index) + return 1; + else + { + // if index is the same, sort by length + if(m1.length < m2.length) + return -1; + else if(m1.length > m2.length) + return 1; + } + + return 0; + }, + + /** + * Executes given regular expression on provided code and returns all + * matches that are found. + * + * @param {String} code Code to execute regular expression on. + * @param {Object} regex Regular expression item info from regexList collection. + * @return {Array} Returns a list of Match objects. + */ + getMatches: function(code, regexInfo) + { + function defaultAdd(match, regexInfo) + { + return [new sh.Match(match[0], match.index, regexInfo.css)]; + }; + + var index = 0, + match = null, + result = [], + func = regexInfo.func ? regexInfo.func : defaultAdd + ; + + while((match = regexInfo.regex.exec(code)) != null) + result = result.concat(func(match, regexInfo)); + + return result; + }, + + processUrls: function(code) + { + var lt = '<', + gt = '>' + ; + + return code.replace(sh.regexLib.url, function(m) + { + var suffix = '', prefix = ''; + + // We include < and > in the URL for the common cases like + // The problem is that they get transformed into <http://google.com> + // Where as > easily looks like part of the URL string. + + if (m.indexOf(lt) == 0) + { + prefix = lt; + m = m.substring(lt.length); + } + + if (m.indexOf(gt) == m.length - gt.length) + { + m = m.substring(0, m.length - gt.length); + suffix = gt; + } + + return prefix + '' + m + '' + suffix; + }); + }, + + /** + * Finds all + + + + + + + + + + + +
    + +

    jsTree v.1.0

    +

    themeroller plugin

    +

    Description

    +
    +

    The themeroller plugin adds support for jQuery UI's themes. Add the plugin as last in your plugins config option. Also make sure that you have included the jquery theme you'd like to use and you should NOT use the native jstree themes plugin.

    +

    If using the search plugin - bind to "search.jstree" to style the found nodes, or apply some styles to the .jstree-search class (which is added by default) but make sure the selector is stronger than your current theme or use !important

    +
    + +

    Configuration

    +
    +

    opened

    +

    A string. Default is "ui-icon-triangle-1-se".

    +

    The class name to use for open nodes (shows the arrow to close).

    + +

    closed

    +

    A string. Default is "ui-icon-triangle-1-e".

    +

    The class name to use for closed nodes (shows the arrow to open).

    + +

    item

    +

    A string. Default is "ui-state-default".

    +

    The class name to use for the actual items.

    + +

    item_h

    +

    A string. Default is "ui-state-hover".

    +

    The class name to use for the hovered item.

    + +

    item_a

    +

    A string. Default is "ui-state-active".

    +

    The class name to use for selected items (UI plugin).

    + +

    item_open

    +

    A string. Default is "ui-icon-folder-open".

    +

    The class name to use for the opened items. If set to false the icon is not shown.

    +

    item_clsd

    +

    A string. Default is "ui-icon-folder-collapsed".

    +

    The class name to use for the opened items. If set to false the icon is not shown.

    +

    item_leaf

    +

    A string. Default is "ui-icon-document".

    +

    The class name to use for the opened items. If set to false the icon is not shown.

    + + +
    + +

    Demos

    +
    + +

    Using the themeroller plugin

    +
    + +
    + + +
    + +

    API

    +
    + +

    ._themeroller ( obj )

    +

    Fixes the tree on various events by applying the configured classes - used internally only.

    + +
    + +
    + + \ No newline at end of file diff --git a/module/viewer/lib/js/jtree/_docs/themes.html b/module/viewer/lib/js/jtree/_docs/themes.html new file mode 100644 index 0000000..e4c4d62 --- /dev/null +++ b/module/viewer/lib/js/jtree/_docs/themes.html @@ -0,0 +1,127 @@ + + + + + jsTree v.1.0 - themes documentation + + + + + + + + + + +
    + +

    jsTree v.1.0

    +

    themes plugin

    +

    Description

    +
    +

    The themes plugin controls the looks of jstree - without this plugin you will get a functional tree, but it will look just like an ordinary UL list.

    +
    + +

    Configuration

    +
    +

    theme

    +

    A string. Default is "default".

    +

    The name of the theme to use to style the tree.

    + +

    url

    +

    A string (or false if not used). Default is false.

    +

    The location of the theme's CSS file, if set to false jstree will look for the file in < theme folder >/themes/< theme name >/style.css. You can set the theme folder using $.jstree._themes = "PATH/TO/FOLDER/";, otherwise it is autodetected as <jquery.tree.js location>/themes/.

    + +

    dots

    +

    A Boolean. Default is true.

    +

    Whether to show the connecting dots or not.

    + +

    icons

    +

    A Boolean. Default is true.

    +

    Whether to show the node icons or not.

    + +
    + +

    Demos

    +
    + +

    Using the themes plugin

    + + + + +
    + +
    + + +
    + +

    API

    +
    + +

    .set_theme ( name , url )

    +

    Set the tree's theme. Triggers an event.

    +
      +
    • + string name +

      The name of the theme to use to style the tree.

      +
    • +
    • + string url +

      The location of the theme's CSS file, if omitted jstree will look for the file in:
      < theme folder >/themes/< name >/style.css.
      You can set the theme folder using:
      $.jstree._themes = "PATH/TO/FOLDER/";, otherwise it is autodetected as <jquery.tree.js location>/themes/.

      +
    • +
    +

    .get_theme ( )

    +

    Returns the name of the currently active theme.

    + +
      
    +

    .show_dots ( ), .hide_dots ( ), .toggle_dots ( )

    +

    Show, hide or toggle the visibility of the dots connecting the tree's nodes.

    + +
      
    +

    .show_icons ( ), .hide_icons ( ), .toggle_icons ( )

    +

    Show, hide or toggle the visibility of the icons next to the title of each the tree node.

    + +
    + +
    + + \ No newline at end of file diff --git a/module/viewer/lib/js/jtree/_docs/types.html b/module/viewer/lib/js/jtree/_docs/types.html new file mode 100644 index 0000000..eb2c448 --- /dev/null +++ b/module/viewer/lib/js/jtree/_docs/types.html @@ -0,0 +1,178 @@ + + + + + jsTree v.1.0 - types documentation + + + + + + + + + + +
    + +

    jsTree v.1.0

    +

    types plugin

    +

    Description

    +
    +

    The types enables node types - each node can have a type, and you can define rules on how that type should behave - maximum children count, maximum depth, valid children types, selectable or not, etc.

    +
    + +

    Configuration

    +
    + +

    max_children

    +

    A number. Default is -1.

    +

    Defines maximum number of root nodes (-1 means unlimited, -2 means disable max_children checking in the tree).

    + +

    max_depth

    +

    A number. Default is -1.

    +

    Defines maximum depth of the tree (-1 means unlimited, -2 means disable max_depth checking in the tree).

    + +

    valid_children

    +

    A string or array. Default is "all".

    +

    Defines valid root node types (could be "all", "none", or an array of type strings).

    + +

    use_data

    +

    A boolean. Default is false.

    +

    If set to true jstree will check every node for $.metadata or $.data for rules (valid_children, max_depth & the function rules). Keep in mind jstree will look for this data in $("li-node-here").metadata().jstree.rule_name (or $.data respectively).

    + +

    type_attr

    +

    A string. Default is "rel".

    +

    Defines the attribute on each li node, where the type attribute will be stored. For correct usage in IE - do not assign to "type" - it triggers an IE bug.

    + +

    types

    +

    An object.

    +

    Defines all the active types in the tree. Each key is the type name, and each value represents the rules for this type. A default type is defined - all nodes with no explicit type set are treated as if they were of the default type.

    +
    +
    +types : {
    +	// the default type
    +	"default" : {
    +		"max_children"	: -1,
    +		"max_depth"		: -1,
    +		"valid_children": "all"
    +
    +		// Bound functions - you can bind any other function here (using boolean or function)
    +		//"select_node"	: true,
    +		//"open_node"	: true,
    +		//"close_node"	: true,
    +		//"create_node"	: true,
    +		//"delete_node"	: true
    +	}
    +}
    +
    +
    +

    For max_children, max_depth & valid_children use the same values as for the tree, but the value you set will only apply for that node type.

    +

    You can set an icon key - it should be an object consisting of two keys - image (string - location of the image to be used as an icon) & position (string - left and top pixels of the image - 10px 40px, only useful when using sprites - omit otherwise).

    +

    You can set more keys in that object - each key should be a function name, and each value - either a boolean (in order to allow or disallow that operation, on that node type) or a function. If you supply a function - your function will be called with two arguments - the name of the called function (the key) and the arguments passed to that function - you can then decide whether to return true or false.

    +

    For any type - for now you can control only functions that take the node being manipulated as the first argument.

    + +
    + +

    Demos

    +
    +

    Using the types plugin

    + +
    + +
    + + +
    + +

    API

    +
    + +

    ._get_type ( node )

    +

    Get the type of a node.

    +
      +
    • + mixed node +

      This can be a DOM node, jQuery node or selector pointing to the element.

      +
    • +
    + +

    .set_type ( type , node )

    +

    Set the type of a node. Triggers an event.

    +
      +
    • + string type +

      The new type.

      +
    • +
    • + mixed node +

      This can be a DOM node, jQuery node or selector pointing to the element.

      +
    • +
    + +

    ._check ( rule , node , opts )

    +

    Checks a rule on a give node. Used mostly internally.

    +
      +
    • + string rule +

      The rule to check.

      +
    • +
    • + mixed node +

      This can be a DOM node, jQuery node or selector pointing to the element.

      +
    • +
    • + mixed opts +

      Any additional options regarding the rule. Used internally.

      +
    • +
    + +
     
    +

    .create_node ( ), .check_move ( )

    +

    Both functions are overwritten to accomodate the new functionality presented by the plugin.

    + +
    + +
    + + \ No newline at end of file diff --git a/module/viewer/lib/js/jtree/_docs/ui.html b/module/viewer/lib/js/jtree/_docs/ui.html new file mode 100644 index 0000000..1f8ef45 --- /dev/null +++ b/module/viewer/lib/js/jtree/_docs/ui.html @@ -0,0 +1,197 @@ + + + + + jsTree v.1.0 - UI documentation + + + + + + + + + + +
    + +

    jsTree v.1.0

    +

    ui plugin

    +

    Description

    +
    +

    The UI plugin handles selecting, deselecting and hovering tree items.

    +
    + +

    Configuration

    +
    +

    select_limit

    +

    A number. Default is -1.

    +

    Defines how many nodes can be selected at a given time (-1 means unlimited).

    + +

    select_multiple_modifier

    +

    A string. Default is "ctrl".

    +

    The special key used to make a click add to the selection and not replace it ("ctrl", "shift", "alt", "meta").
    You can also set this to "on" making every click add to the selection.

    + +

    select_range_modifier

    +

    A string. Default is "shift".

    +

    The special key used to make a click expand a range from the last selected item ("ctrl", "shift", "alt", "meta").
    Note that the last clicked elemtn should be a sibling of the currently clicked element so that a range will be created (same as common file explorers).

    + +

    selected_parent_close

    +

    A string (or false). Default is "select_parent".

    +

    What action to take when a selected node's parent is closed (making the selected node invisible). Possible values are false - do nothing, "select_parent" - select the closed node's parent and "deselect" - deselect the node.

    + +

    selected_parent_open

    +

    A Boolean. Default is true.

    +

    When set to true when programatically selecting a node in the tree all of its closed parents are opened automatically.

    + +

    select_prev_on_delete

    +

    A boolean. Default is true.

    +

    If set to true when a selected node is deleted, its previous sibling (or parent) is selected.

    + +

    disable_selecting_children

    +

    A boolean. Default is false.

    +

    If set to true you will not be able to select children of already selected nodes.

    + +

    initially_select

    +

    An array. Default is [].

    +

    Defines which nodes are to be automatically selected when the tree finishes loading - a list of IDs is expected.

    + +
    + +

    Demos

    +
    + +

    Using the UI plugin

    +
    + +
    + + +
    + +

    API

    +
    + +

    ._get_node ( node , allow_multiple )

    +

    Overrides the function from the core module.
    if node is undefined or null and allow_multiple is true all the currently selected nodes are returned
    if node is undefined or null and allow_multiple is NOT true only the last selected node is returned.

    +
      +
    • + mixed node +

      This can be a DOM node, jQuery node or selector pointing to an element within the tree.

      +
    • +
    • + boolean allow_multiple +

      Whether to return all selected nodes or only the last selected one if node is null.

      +
    • +
    + +

    .save_selected ( )

    +

    Saves away the current selection state of the tree (saves it in a variable, so do not expect a restore after a refresh - for that functionality refer to the cookies plugin. Used mostly internally. Triggers an event.

    + +

    .reselect ( )

    +

    Restores the state of the tree using the variable saved in the above function. Used mostly internally. Triggers an event.

    + +

    .refresh ( node )

    +

    Overrides the function form the core module.
    Enables saving the selection state before the refresh and restoring it afterwards.

    + +

    .hover_node ( node )

    +

    Sets the specified node as hovered. Triggers an event.

    +
      +
    • + mixed node +

      This can be a DOM node, jQuery node or selector pointing to an element within the tree.

      +
    • +
    + +

    .dehover_node ( )

    +

    Removes the hover state from the currently hovered node (if there is one). Triggers an event.

    + + +

    .select_node ( node , check , event )

    +
      +
    • + mixed node +

      This can be a DOM node, jQuery node or selector pointing to an element within the tree.

      +
    • +
    • + bool check +

      Whether to check the specified rules and do appropriate actions (check select_limit, deselect other nodes respectively, etc) or to just force selection of the node regardless of select_limit.

      +
    • +
    • + event event +

      Used internally - when a click on a node caused this function to be executed.

      +
    • +
    + +
     
    +

    .deselect_node ( node ), .toggle_select ( node )

    +

    There functions control the selected state on a node. deselect_node triggers an event.

    +
      +
    • + mixed node +

      This can be a DOM node, jQuery node or selector pointing to an element within the tree.

      +
    • +
    + +

    .deselect_all ( context )

    +

    Deselects all selected nodes. If context is set - only the selected nodes within that context are deselected. Triggers an event.

    +
      +
    • + mixed context +

      This can be a DOM node, jQuery node or selector pointing to an element within the tree.

      +
    • +
    + +

    .get_selected ( context )

    +

    Returns all selected nodes. If context is set - only the selected nodes within that context are returned.

    +
      +
    • + mixed context +

      This can be a DOM node, jQuery node or selector pointing to an element within the tree.

      +
    • +
    + +

    .is_selected ( node )

    +

    Returns whether the specified node is selected or not.

    +
      +
    • + mixed node +

      This can be a DOM node, jQuery node or selector pointing to an element within the tree.

      +
    • +
    + +
    + +
    + + \ No newline at end of file diff --git a/module/viewer/lib/js/jtree/_docs/unique.html b/module/viewer/lib/js/jtree/_docs/unique.html new file mode 100644 index 0000000..cfadf2e --- /dev/null +++ b/module/viewer/lib/js/jtree/_docs/unique.html @@ -0,0 +1,85 @@ + + + + + jsTree v.1.0 - unique documentation + + + + + + + + + + +
    + +

    jsTree v.1.0

    +

    unique plugin

    +

    Description

    +
    +

    The unique plugin prevents from nodes with same titles coexisting (create/move/rename) in the same parent.

    +
    + +

    Configuration

    +
    + +

    error_callback

    +

    A function. Default is $.noop.

    +

    Whenever the plugin stops an action (because it violates the unique policy) this function will bre triggered in current tree's scope, receiving the name, siblings and function name that caused the conflict.

    + +
    + +

    Demos

    +
    +

    Try moving the child nodes together (drag'n'drop).

    + +

    Using the unique plugin

    +
    + +
    + + +
    + +

    API

    +
    + + +

    Used internally - checks the names array against the sibling nodes for matches.

    +
    + +
    + + \ No newline at end of file diff --git a/module/viewer/lib/js/jtree/_docs/xml_data.html b/module/viewer/lib/js/jtree/_docs/xml_data.html new file mode 100644 index 0000000..30e9f13 --- /dev/null +++ b/module/viewer/lib/js/jtree/_docs/xml_data.html @@ -0,0 +1,218 @@ + + + + + jsTree v.1.0 - xml_data documentation + + + + + + + + + + +
    + +

    jsTree v.1.0

    +

    xml_data plugin

    +

    Description

    +
    +

    The xml_data plugin enables jsTree to convert XML objects to interactive trees (using XSL). The data (XML) can be set up in the config (as a string) or retrieved from a server (also ondemand).

    +

    Two types of XML structures are supported - flat and nested:

    +
    +
    +<!-- FLAT -->
    +<root>
    +	<item id="root_1" parent_id="0" state="closed">
    +		<content>
    +			<name><![CDATA[Node 1]]></name>
    +		</content>
    +	</item>
    +	<item id="node_2" parent_id="root_1">
    +		<content>
    +			<name><![CDATA[Node 2]]></name>
    +		</content>
    +	</item>
    +</root>
    +
    +<!-- NESTED -->
    +<root>
    +	<item id="xml_1">
    +		<content><name><![CDATA[Root node 1]]></name></content>
    +		<item id="xml_2">
    +			<content><name><![CDATA[Child node 1]]></name></content>
    +		</item>
    +	</item>
    +</root>
    +
    +
    +

    Aside from nesting the only difference is the parent_id attribute used in xml_flat.

    +

    parent_id defines the parent of the node in XML flat, use 0 for root nodes. Also when using async - use 0 for the first level.

    +

    state defines the state of the node (open or closed). You can omit it too - jstree will handle the data automatically - nodes with no children will be leaf nodes, nodes with children will be closed.

    +

    All attributes you set on the item node will be transfered to the resulting li node. All attributes you set on the name node will be transfered to the resulting a node.

    +

    If you are using the languages plugin you can have multiple name nodes in a every item node, just set a language attribute on each one (<name language="en" ...).

    +

    Remember to always set the XML header on your XML files.

    +
    + +

    Configuration

    +
    +

    data

    +

    A XML string (or false if not used). Default is false.

    +

    Specifies the content to load into the container and convert to a tree.

    +

    ajax

    +

    An object (or false if not used). Default is false.

    +

    The ajax config object is pretty much the same as the jQuery ajax settings object.

    +

    You can set the data option to a function, that will be executed in the current tree's scope (this will be the tree instance) and gets the node about to be open as a parameter (or -1 for initial load). Whatever you return in the function will be sent to the server as data (so for example you can send the node's ID).

    +

    You can set the url option to a function, that will be executed in the current tree's scope (this will be the tree instance) and gets the node about to be open as a paramater (or -1 for initial load). Whatever you return in the url function will be used as the ajax URL (so that you can accomodate pretty paths such as /get_children/node_2).

    +

    The error and success functions (if present) also fire in the context of the tree, and if you return a value in the success function it will be used to populate the tree - this can be useful if you want to somehow change what the server returned on the client side before it is displayed in the tree. Please note that the success function receives a string as the first parameter, and also if you decide to return a value - return a string.

    +

    correct_state

    +

    A Boolean. Default is true.

    +

    If this option is set to true if an AJAX returns an empty result, the node that was about to be opened will be converted to a leaf node (the open icon will no longer be displayed).

    +

    clean_node

    +

    A Boolean. Default is false.

    +

    Set to true if node needs to be cleaned - usually you should leave this to false.

    +

    xsl

    +

    A string. Default is "flat".

    +

    The type of structure you wiil be using - set either to "flat" or "nest".

    +

    get_skip_empty

    +

    A Boolean. Default is false.

    +

    If set to true empty attributes won't be returned by the get_xml function.

    + +

    NOTE:
    If both data and ajax are set the initial tree is rendered from the data string. When opening a closed node (that has no loaded children) an AJAX request is made.

    +
    + +

    Demos

    +
    + +

    Using the data config option (flat)

    +
    + + +

    Using the ajax config option (nested)

    +
    + + +

    Using both the data & ajax config options (flat)

    +
    + +
    + +

    API

    +
    +

    Both dummy functions - _is_loaded and load_node are overwritten.

    +

    .load_node_xml ( node , success_callback , error_callback )

    +

    This function is called instead of load_node.

    +
      +
    • + mixed node +

      This can be a DOM node, jQuery node or selector pointing to an element you want loaded. Use -1 for root nodes.

      +
    • +
    • + function success_callback +

      A function to be executed once the node is loaded successfully - used internally. You should wait for the load_node event.

      +
    • +
    • + function error_callback +

      A function to be executed if the node is not loaded due to an error - used internally. You should wait for the load_node event.

      +
    • +
    +

    .parse_xml ( data )

    +

    This function converts XML strings or objects to the DOM structure required by jstree. Returns a jQuery object.

    +
      +
    • + mixed data +

      The XML string/object.

      +
    • +
    +

    .get_xml ( type , node , li_attr , a_attr , is_callback )

    +

    This function returns an array of tree nodes converted back to XML.

    +
      +
    • + string type +

      Either "flat" or "nest". Default is "flat".

      +
    • +
    • + mixed node +

      This can be a DOM node, jQuery node or selector pointing to an element you want returned. Use -1 or omit to get the whole tree.

      +
    • +
    • + array li_attr +

      The attributes to collect from the LI node. Defaults to [ "id" , "class" ]

      +
    • +
    • + array a_attr +

      The attributes to collect from the A node. Defaults to [ ]

      +
    • +
    • + string is_callback +

      Used internally.

      +
    • +
    + +
    + +
    + + \ No newline at end of file diff --git a/module/viewer/lib/js/jtree/_lib/jquery.cookie.js b/module/viewer/lib/js/jtree/_lib/jquery.cookie.js new file mode 100644 index 0000000..6036754 --- /dev/null +++ b/module/viewer/lib/js/jtree/_lib/jquery.cookie.js @@ -0,0 +1,96 @@ +/** + * Cookie plugin + * + * Copyright (c) 2006 Klaus Hartl (stilbuero.de) + * Dual licensed under the MIT and GPL licenses: + * http://www.opensource.org/licenses/mit-license.php + * http://www.gnu.org/licenses/gpl.html + * + */ + +/** + * Create a cookie with the given name and value and other optional parameters. + * + * @example $.cookie('the_cookie', 'the_value'); + * @desc Set the value of a cookie. + * @example $.cookie('the_cookie', 'the_value', { expires: 7, path: '/', domain: 'jquery.com', secure: true }); + * @desc Create a cookie with all available options. + * @example $.cookie('the_cookie', 'the_value'); + * @desc Create a session cookie. + * @example $.cookie('the_cookie', null); + * @desc Delete a cookie by passing null as value. Keep in mind that you have to use the same path and domain + * used when the cookie was set. + * + * @param String name The name of the cookie. + * @param String value The value of the cookie. + * @param Object options An object literal containing key/value pairs to provide optional cookie attributes. + * @option Number|Date expires Either an integer specifying the expiration date from now on in days or a Date object. + * If a negative value is specified (e.g. a date in the past), the cookie will be deleted. + * If set to null or omitted, the cookie will be a session cookie and will not be retained + * when the the browser exits. + * @option String path The value of the path atribute of the cookie (default: path of page that created the cookie). + * @option String domain The value of the domain attribute of the cookie (default: domain of page that created the cookie). + * @option Boolean secure If true, the secure attribute of the cookie will be set and the cookie transmission will + * require a secure protocol (like HTTPS). + * @type undefined + * + * @name $.cookie + * @cat Plugins/Cookie + * @author Klaus Hartl/klaus.hartl@stilbuero.de + */ + +/** + * Get the value of a cookie with the given name. + * + * @example $.cookie('the_cookie'); + * @desc Get the value of a cookie. + * + * @param String name The name of the cookie. + * @return The value of the cookie. + * @type String + * + * @name $.cookie + * @cat Plugins/Cookie + * @author Klaus Hartl/klaus.hartl@stilbuero.de + */ +jQuery.cookie = function(name, value, options) { + if (typeof value != 'undefined') { // name and value given, set cookie + options = options || {}; + if (value === null) { + value = ''; + options.expires = -1; + } + var expires = ''; + if (options.expires && (typeof options.expires == 'number' || options.expires.toUTCString)) { + var date; + if (typeof options.expires == 'number') { + date = new Date(); + date.setTime(date.getTime() + (options.expires * 24 * 60 * 60 * 1000)); + } else { + date = options.expires; + } + expires = '; expires=' + date.toUTCString(); // use expires attribute, max-age is not supported by IE + } + // CAUTION: Needed to parenthesize options.path and options.domain + // in the following expressions, otherwise they evaluate to undefined + // in the packed version for some reason... + var path = options.path ? '; path=' + (options.path) : ''; + var domain = options.domain ? '; domain=' + (options.domain) : ''; + var secure = options.secure ? '; secure' : ''; + document.cookie = [name, '=', encodeURIComponent(value), expires, path, domain, secure].join(''); + } else { // only name given, get cookie + var cookieValue = null; + if (document.cookie && document.cookie != '') { + var cookies = document.cookie.split(';'); + for (var i = 0; i < cookies.length; i++) { + var cookie = jQuery.trim(cookies[i]); + // Does this cookie string begin with the name we want? + if (cookie.substring(0, name.length + 1) == (name + '=')) { + cookieValue = decodeURIComponent(cookie.substring(name.length + 1)); + break; + } + } + } + return cookieValue; + } +}; \ No newline at end of file diff --git a/module/viewer/lib/js/jtree/_lib/jquery.hotkeys.js b/module/viewer/lib/js/jtree/_lib/jquery.hotkeys.js new file mode 100644 index 0000000..cd62905 --- /dev/null +++ b/module/viewer/lib/js/jtree/_lib/jquery.hotkeys.js @@ -0,0 +1,99 @@ +/* + * jQuery Hotkeys Plugin + * Copyright 2010, John Resig + * Dual licensed under the MIT or GPL Version 2 licenses. + * + * Based upon the plugin by Tzury Bar Yochay: + * http://github.com/tzuryby/hotkeys + * + * Original idea by: + * Binny V A, http://www.openjs.com/scripts/events/keyboard_shortcuts/ +*/ + +(function(jQuery){ + + jQuery.hotkeys = { + version: "0.8", + + specialKeys: { + 8: "backspace", 9: "tab", 13: "return", 16: "shift", 17: "ctrl", 18: "alt", 19: "pause", + 20: "capslock", 27: "esc", 32: "space", 33: "pageup", 34: "pagedown", 35: "end", 36: "home", + 37: "left", 38: "up", 39: "right", 40: "down", 45: "insert", 46: "del", + 96: "0", 97: "1", 98: "2", 99: "3", 100: "4", 101: "5", 102: "6", 103: "7", + 104: "8", 105: "9", 106: "*", 107: "+", 109: "-", 110: ".", 111 : "/", + 112: "f1", 113: "f2", 114: "f3", 115: "f4", 116: "f5", 117: "f6", 118: "f7", 119: "f8", + 120: "f9", 121: "f10", 122: "f11", 123: "f12", 144: "numlock", 145: "scroll", 191: "/", 224: "meta" + }, + + shiftNums: { + "`": "~", "1": "!", "2": "@", "3": "#", "4": "$", "5": "%", "6": "^", "7": "&", + "8": "*", "9": "(", "0": ")", "-": "_", "=": "+", ";": ": ", "'": "\"", ",": "<", + ".": ">", "/": "?", "\\": "|" + } + }; + + function keyHandler( handleObj ) { + // Only care when a possible input has been specified + if ( typeof handleObj.data !== "string" ) { + return; + } + + var origHandler = handleObj.handler, + keys = handleObj.data.toLowerCase().split(" "); + + handleObj.handler = function( event ) { + // Don't fire in text-accepting inputs that we didn't directly bind to + if ( this !== event.target && (/textarea|select/i.test( event.target.nodeName ) || + event.target.type === "text") ) { + return; + } + + // Keypress represents characters, not special keys + var special = event.type !== "keypress" && jQuery.hotkeys.specialKeys[ event.which ], + character = String.fromCharCode( event.which ).toLowerCase(), + key, modif = "", possible = {}; + + // check combinations (alt|ctrl|shift+anything) + if ( event.altKey && special !== "alt" ) { + modif += "alt+"; + } + + if ( event.ctrlKey && special !== "ctrl" ) { + modif += "ctrl+"; + } + + // TODO: Need to make sure this works consistently across platforms + if ( event.metaKey && !event.ctrlKey && special !== "meta" ) { + modif += "meta+"; + } + + if ( event.shiftKey && special !== "shift" ) { + modif += "shift+"; + } + + if ( special ) { + possible[ modif + special ] = true; + + } else { + possible[ modif + character ] = true; + possible[ modif + jQuery.hotkeys.shiftNums[ character ] ] = true; + + // "$" can be triggered as "Shift+4" or "Shift+$" or just "$" + if ( modif === "shift+" ) { + possible[ jQuery.hotkeys.shiftNums[ character ] ] = true; + } + } + + for ( var i = 0, l = keys.length; i < l; i++ ) { + if ( possible[ keys[i] ] ) { + return origHandler.apply( this, arguments ); + } + } + }; + } + + jQuery.each([ "keydown", "keyup", "keypress" ], function() { + jQuery.event.special[ this ] = { add: keyHandler }; + }); + +})( jQuery ); \ No newline at end of file diff --git a/module/viewer/lib/js/jtree/_lib/jquery.js b/module/viewer/lib/js/jtree/_lib/jquery.js new file mode 100644 index 0000000..eb6a596 --- /dev/null +++ b/module/viewer/lib/js/jtree/_lib/jquery.js @@ -0,0 +1,18 @@ +/*! + * jQuery JavaScript Library v1.6.1 + * 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: Thu May 12 15:04:36 2011 -0400 + */ +(function(a,b){function cy(a){return f.isWindow(a)?a:a.nodeType===9?a.defaultView||a.parentWindow:!1}function cv(a){if(!cj[a]){var b=f("<"+a+">").appendTo("body"),d=b.css("display");b.remove();if(d==="none"||d===""){ck||(ck=c.createElement("iframe"),ck.frameBorder=ck.width=ck.height=0),c.body.appendChild(ck);if(!cl||!ck.createElement)cl=(ck.contentWindow||ck.contentDocument).document,cl.write("");b=cl.createElement(a),cl.body.appendChild(b),d=f.css(b,"display"),c.body.removeChild(ck)}cj[a]=d}return cj[a]}function cu(a,b){var c={};f.each(cp.concat.apply([],cp.slice(0,b)),function(){c[this]=a});return c}function ct(){cq=b}function cs(){setTimeout(ct,0);return cq=f.now()}function ci(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}function ch(){try{return new a.XMLHttpRequest}catch(b){}}function cb(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=0===c})}function W(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function O(a,b){return(a&&a!=="*"?a+".":"")+b.replace(A,"`").replace(B,"&")}function N(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;ic)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 L(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 F(){return!0}function E(){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-$2").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 H(){if(!e.isReady){try{c.documentElement.doScroll("left")}catch(a){setTimeout(H,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=d.userAgent,x,y,z,A=Object.prototype.toString,B=Object.prototype.hasOwnProperty,C=Array.prototype.push,D=Array.prototype.slice,E=String.prototype.trim,F=Array.prototype.indexOf,G={};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.1",length:0,size:function(){return this.length},toArray:function(){return D.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)?C.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(),y.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(D.apply(this,arguments),"slice",D.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:C,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(;j0)return;y.resolveWith(c,[e]),e.fn.trigger&&e(c).trigger("ready").unbind("ready")}},bindReady:function(){if(!y){y=e._Deferred();if(c.readyState==="complete")return setTimeout(e.ready,1);if(c.addEventListener)c.addEventListener("DOMContentLoaded",z,!1),a.addEventListener("load",e.ready,!1);else if(c.attachEvent){c.attachEvent("onreadystatechange",z),a.attachEvent("onload",e.ready);var b=!1;try{b=a.frameElement==null}catch(d){}c.documentElement.doScroll&&b&&H()}}},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):G[A.call(a)]||"object"},isPlainObject:function(a){if(!a||e.type(a)!=="object"||a.nodeType||e.isWindow(a))return!1;if(a.constructor&&!B.call(a,"constructor")&&!B.call(a.constructor.prototype,"isPrototypeOf"))return!1;var c;for(c in a);return c===b||B.call(a,c)},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(b,c,d){a.DOMParser?(d=new DOMParser,c=d.parseFromString(b,"text/xml")):(c=new ActiveXObject("Microsoft.XMLDOM"),c.async="false",c.loadXML(b)),d=c.documentElement,(!d||!d.nodeName||d.nodeName==="parsererror")&&e.error("Invalid XML: "+b);return c},noop:function(){},globalEval:function(b){b&&j.test(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},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(;g0&&a[0]&&a[j-1]||j===0||e.isArray(a));if(k)for(;i1?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
    a",d=a.getElementsByTagName("*"),e=a.getElementsByTagName("a")[0];if(!d||!d.length||!e)return{};f=c.createElement("select"),g=f.appendChild(c.createElement("option")),h=a.getElementsByTagName("input")[0],j={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:h.value==="on",optSelected:g.selected,getSetAttribute:a.className!=="t",submitBubbles:!0,changeBubbles:!0,focusinBubbles:!1,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0},h.checked=!0,j.noCloneChecked=h.cloneNode(!0).checked,f.disabled=!0,j.optDisabled=!g.disabled;try{delete a.test}catch(s){j.deleteExpando=!1}!a.addEventListener&&a.attachEvent&&a.fireEvent&&(a.attachEvent("onclick",function b(){j.noCloneEvent=!1,a.detachEvent("onclick",b)}),a.cloneNode(!0).fireEvent("onclick")),h=c.createElement("input"),h.value="t",h.setAttribute("type","radio"),j.radioValue=h.value==="t",h.setAttribute("checked","checked"),a.appendChild(h),k=c.createDocumentFragment(),k.appendChild(a.firstChild),j.checkClone=k.cloneNode(!0).cloneNode(!0).lastChild.checked,a.innerHTML="",a.style.width=a.style.paddingLeft="1px",l=c.createElement("body"),m={visibility:"hidden",width:0,height:0,border:0,margin:0,background:"none"};for(q in m)l.style[q]=m[q];l.appendChild(a),b.insertBefore(l,b.firstChild),j.appendChecked=h.checked,j.boxModel=a.offsetWidth===2,"zoom"in a.style&&(a.style.display="inline",a.style.zoom=1,j.inlineBlockNeedsLayout=a.offsetWidth===2,a.style.display="",a.innerHTML="
    ",j.shrinkWrapBlocks=a.offsetWidth!==2),a.innerHTML="
    t
    ",n=a.getElementsByTagName("td"),r=n[0].offsetHeight===0,n[0].style.display="",n[1].style.display="none",j.reliableHiddenOffsets=r&&n[0].offsetHeight===0,a.innerHTML="",c.defaultView&&c.defaultView.getComputedStyle&&(i=c.createElement("div"),i.style.width="0",i.style.marginRight="0",a.appendChild(i),j.reliableMarginRight=(parseInt((c.defaultView.getComputedStyle(i,null)||{marginRight:0}).marginRight,10)||0)===0),l.innerHTML="",b.removeChild(l);if(a.attachEvent)for(q in{submit:1,change:1,focusin:1})p="on"+q,r=p in a,r||(a.setAttribute(p,"return;"),r=typeof a[p]=="function"),j[q+"Bubbles"]=r;return j}(),f.boxModel=f.support.boxModel;var i=/^(?:\{.*\}|\[.*\])$/,j=/([a-z])([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=f.expando,h=typeof c=="string",i,j=a.nodeType,k=j?f.cache:a,l=j?a[f.expando]:a[f.expando]&&f.expando;if((!l||e&&l&&!k[l][g])&&h&&d===b)return;l||(j?a[f.expando]=l=++f.uuid:l=f.expando),k[l]||(k[l]={},j||(k[l].toJSON=f.noop));if(typeof c=="object"||typeof c=="function")e?k[l][g]=f.extend(k[l][g],c):k[l]=f.extend(k[l],c);i=k[l],e&&(i[g]||(i[g]={}),i=i[g]),d!==b&&(i[f.camelCase(c)]=d);if(c==="events"&&!i[c])return i[g]&&i[g].events;return h?i[f.camelCase(c)]:i}},removeData:function(b,c,d){if(!!f.acceptData(b)){var e=f.expando,g=b.nodeType,h=g?f.cache:b,i=g?b[f.expando]:f.expando;if(!h[i])return;if(c){var j=d?h[i][e]:h[i];if(j){delete j[c];if(!l(j))return}}if(d){delete h[i][e];if(!l(h[i]))return}var k=h[i][e];f.support.deleteExpando||h!=a?delete h[i]:h[i]=null,k?(h[i]={},g||(h[i].toJSON=f.noop),h[i][e]=k):g&&(f.support.deleteExpando?delete b[f.expando]:b.removeAttribute?b.removeAttribute(f.expando):b[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-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;return(e.value||"").replace(p,"")}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=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);c=j&&f.attrFix[c]||c,i=f.attrHooks[c],i||(!t.test(c)||typeof d!="boolean"&&d!==b&&d.toLowerCase()!==c.toLowerCase()?v&&(f.nodeName(a,"form")||u.test(c))&&(i=v):i=w);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)return i.get(a,c);h=a.getAttribute(c);return h===null?b:h},removeAttr:function(a,b){var c;a.nodeType===1&&(b=f.attrFix[b]||b,f.support.getSetAttribute?a.removeAttribute(b):(f.attr(a,b,""),a.removeAttributeNode(a.getAttributeNode(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}}},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}}},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);c=i&&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))!==b?g:a[c]},propHooks:{}}),w={get:function(a,c){return a[f.propFix[c]||c]?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]=b),a.setAttribute(c,c.toLowerCase()));return c}},f.attrHooks.value={get:function(a,b){if(v&&f.nodeName(a,"button"))return v.get(a,b);return a.value},set:function(a,b,c){if(v&&f.nodeName(a,"button"))return v.set(a,b,c);a.value=b}},f.support.getSetAttribute||(f.attrFix=f.propFix,v=f.attrHooks.name=f.valHooks.button={get:function(a,c){var d;d=a.getAttributeNode(c);return d&&d.nodeValue!==""?d.nodeValue:b},set:function(a,b,c){var d=a.getAttributeNode(c);if(d){d.nodeValue=b;return 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)}})),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 x=Object.prototype.hasOwnProperty,y=/\.(.*)$/,z=/^(?:textarea|input|select)$/i,A=/\./g,B=/ /g,C=/[^\w\s.|`]/g,D=function(a){return a.replace(C,"\\$&")};f.event={add:function(a,c,d,e){if(a.nodeType!==3&&a.nodeType!==8){if(d===!1)d=E;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=E);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(),D).join("\\.(?:.*\\.)?")+"(\\.|$)")),p=t[h];if(!p)continue;if(!d){for(j=0;j=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?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-1?f.map(a.options,function(a){return a.selected}).join("-"):"":f.nodeName(a,"select")&&(c=a.selectedIndex);return c},K=function(c){var d=c.target,e,g;if(!!z.test(d.nodeName)&&!d.readOnly){e=f._data(d,"_change_data"),g=J(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:K,beforedeactivate:K,click:function(a){var b=a.target,c=f.nodeName(b,"input")?b.type:"";(c==="radio"||c==="checkbox"||f.nodeName(b,"select"))&&K.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")&&K.call(this,a)},beforeactivate:function(a){var b=a.target;f._data(b,"_change_data",J(b))}},setup:function(a,b){if(this.type==="file")return!1;for(var c in I)f.event.add(this,c+".specialChange",I[c]);return z.test(this.nodeName)},teardown:function(a){f.event.remove(this,".specialChange");return z.test(this.nodeName)}},I=f.event.special.change.filters,I.focus=I.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;i0?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;g0){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+~,(\[\\]+)+|[>+~])(\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;b0},k.find=function(a,b,c){var d;if(!a)return[];for(var e=0,f=l.order.length;e":function(a,b){var c,d=typeof b=="string",e=0,f=a.length;if(d&&!j.test(b)){b=b.toLowerCase();for(;e=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 bc[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=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",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.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="

    ";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="
    ";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;g0)for(h=g;h0: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-1:f(g).is(h))&&c.push({selector:i,elem:g,level:k});g=g.parentNode,k++}}return c}var l=U.test(a)||typeof a!="string"?f(a,b||this.context):0;for(d=0,e=this.length;d-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||typeof a=="string")return f.inArray(this[0],a?f(a):this.parent().children());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(W(c[0])||W(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=T.call(arguments);P.test(a)||(d=c),d&&typeof d=="string"&&(e=f.filter(d,e)),e=this.length>1&&!V[a]?f.unique(e):e,(this.length>1||R.test(d))&&Q.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 Y=/ jQuery\d+="(?:\d+|null)"/g,Z=/^\s+/,$=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,_=/<([\w:]+)/,ba=/",""],legend:[1,"
    ","
    "],thead:[1,"","
    "],tr:[2,"","
    "],td:[3,"","
    "],col:[2,"","
    "],area:[1,"",""],_default:[0,"",""]};bg.optgroup=bg.option,bg.tbody=bg.tfoot=bg.colgroup=bg.caption=bg.thead,bg.th=bg.td,f.support.htmlSerialize||(bg._default=[1,"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(Y,""):null;if(typeof a=="string"&&!bc.test(a)&&(f.support.leadingWhitespace||!Z.test(a))&&!bg[(_.exec(a)||["",""])[1].toLowerCase()]){a=a.replace($,"<$1>");try{for(var c=0,d=this.length;c1&&l0?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)){bj(a,d),e=bk(a),g=bk(d);for(h=0;e[h];++h)bj(e[h],g[h])}if(b){bi(a,d);if(c){e=bk(a),g=bk(d);for(h=0;e[h];++h)bi(e[h],g[h])}}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(!bb.test(k))k=b.createTextNode(k);else{k=k.replace($,"<$1>");var l=(_.exec(k)||["",""])[1].toLowerCase(),m=bg[l]||bg._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=ba.test(k),q=l==="table"&&!p?o.firstChild&&o.firstChild.childNodes:m[1]===""&&!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&&Z.test(k)&&o.insertBefore(b.createTextNode(Z.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=0)return b+"px"}}}),f.support.opacity||(f.cssHooks.opacity={get:function(a,b){return bp.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;c.zoom=1;var e=f.isNaN(b)?"":"alpha(opacity="+b*100+")",g=d&&d.filter||c.filter||"";c.filter=bo.test(g)?g.replace(bo,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=bz(a,"margin-right","marginRight"):c=a.style.marginRight});return c}})}),c.defaultView&&c.defaultView.getComputedStyle&&(bA=function(a,c){var d,e,g;c=c.replace(br,"-$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&&(bB=function(a,b){var c,d=a.currentStyle&&a.currentStyle[b],e=a.runtimeStyle&&a.runtimeStyle[b],f=a.style;!bs.test(d)&&bt.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}),bz=bA||bB,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 bE=/%20/g,bF=/\[\]$/,bG=/\r?\n/g,bH=/#.*$/,bI=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,bJ=/^(?:color|date|datetime|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,bK=/^(?:about|app|app\-storage|.+\-extension|file|widget):$/,bL=/^(?:GET|HEAD)$/,bM=/^\/\//,bN=/\?/,bO=/)<[^<]*)*<\/script>/gi,bP=/^(?:select|textarea)/i,bQ=/\s+/,bR=/([?&])_=[^&]*/,bS=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,bT=f.fn.load,bU={},bV={},bW,bX;try{bW=e.href}catch(bY){bW=c.createElement("a"),bW.href="",bW=bW.href}bX=bS.exec(bW.toLowerCase())||[],f.fn.extend({load:function(a,c,d){if(typeof a!="string"&&bT)return bT.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("
    ").append(c.replace(bO,"")).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||bP.test(this.nodeName)||bJ.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(bG,"\r\n")}}):{name:b.name,value:c.replace(bG,"\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?f.extend(!0,a,f.ajaxSettings,b):(b=a,a=f.extend(!0,f.ajaxSettings,b));for(var c in{context:1,url:1})c in b?a[c]=b[c]:c in f.ajaxSettings&&(a[c]=f.ajaxSettings[c]);return a},ajaxSettings:{url:bW,isLocal:bK.test(bX[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","*":"*/*"},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}},ajaxPrefilter:bZ(bU),ajaxTransport:bZ(bV),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?4:0;var o,r,u,w=l?ca(d,v,l):b,x,y;if(a>=200&&a<300||a===304){if(d.ifModified){if(x=v.getResponseHeader("Last-Modified"))f.lastModified[k]=x;if(y=v.getResponseHeader("Etag"))f.etag[k]=y}if(a===304)c="notmodified",o=!0;else try{r=cb(d,w),c="success",o=!0}catch(z){c="parsererror",u=z}}else{u=c;if(!c||a)c="error",a<0&&(a=0)}v.status=a,v.statusText=c,o?h.resolveWith(e,[r,c,v]):h.rejectWith(e,[v,c,u]),v.statusCode(j),j=b,t&&g.trigger("ajax"+(o?"Success":"Error"),[v,d,o?r:u]),i.resolveWith(e,[v,c]),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=bI.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(bH,"").replace(bM,bX[1]+"//"),d.dataTypes=f.trim(d.dataType||"*").toLowerCase().split(bQ),d.crossDomain==null&&(r=bS.exec(d.url.toLowerCase()),d.crossDomain=!(!r||r[1]==bX[1]&&r[2]==bX[2]&&(r[3]||(r[1]==="http:"?80:443))==(bX[3]||(bX[1]==="http:"?80:443)))),d.data&&d.processData&&typeof d.data!="string"&&(d.data=f.param(d.data,d.traditional)),b$(bU,d,c,v);if(s===2)return!1;t=d.global,d.type=d.type.toUpperCase(),d.hasContent=!bL.test(d.type),t&&f.active++===0&&f.event.trigger("ajaxStart");if(!d.hasContent){d.data&&(d.url+=(bN.test(d.url)?"&":"?")+d.data),k=d.url;if(d.cache===!1){var x=f.now(),y=d.url.replace(bR,"$1_="+x);d.url=y+(y===d.url?(bN.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]!=="*"?", */*; 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=b$(bV,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){status<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)b_(g,a[g],c,e);return d.join("&").replace(bE,"+")}}),f.extend({active:0,lastModified:{},etag:{}});var cc=f.now(),cd=/(\=)\?(&|$)|\?\?/i;f.ajaxSetup({jsonp:"callback",jsonpCallback:function(){return f.expando+"_"+cc++}}),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&&(cd.test(b.url)||e&&cd.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(cd,l),b.url===j&&(e&&(k=k.replace(cd,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 ce=a.ActiveXObject?function(){for(var a in cg)cg[a](0,1)}:!1,cf=0,cg;f.ajaxSettings.xhr=a.ActiveXObject?function(){return!this.isLocal&&ch()||ci()}:ch,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,ce&&delete cg[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=++cf,ce&&(cg||(cg={},f(a).unload(ce)),cg[i]=d),h.onreadystatechange=d)},abort:function(){d&&d(0,1)}}}});var cj={},ck,cl,cm=/^(?:toggle|show|hide)$/,cn=/^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,co,cp=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]],cq,cr=a.webkitRequestAnimationFrame||a.mozRequestAnimationFrame||a.oRequestAnimationFrame;f.fn.extend({show:function(a,b,c){var d,e;if(a||a===0)return this.animate(cu("show",3),a,b,c);for(var g=0,h=this.length;g=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
    ";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=cx.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&&!cx.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=cy(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=cy(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(){return this[0]?parseFloat(f.css(this[0],d,"padding")):null},f.fn["outer"+c]=function(a){return this[0]?parseFloat(f.css(this[0],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];return e.document.compatMode==="CSS1Compat"&&g||e.document.body["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 h=f.css(e,d),i=parseFloat(h);return f.isNaN(i)?h:i}return this.css(d,typeof a=="string"?a:a+"px")}}),a.jQuery=a.$=f})(window); \ No newline at end of file diff --git a/module/viewer/lib/js/jtree/jquery.jstree.js b/module/viewer/lib/js/jtree/jquery.jstree.js new file mode 100644 index 0000000..31efd3b --- /dev/null +++ b/module/viewer/lib/js/jtree/jquery.jstree.js @@ -0,0 +1,4551 @@ +/* + * jsTree 1.0-rc3 + * http://jstree.com/ + * + * Copyright (c) 2010 Ivan Bozhanov (vakata.com) + * + * Licensed same as jquery - under the terms of either the MIT License or the GPL Version 2 License + * http://www.opensource.org/licenses/mit-license.php + * http://www.gnu.org/licenses/gpl.html + * + * $Date: 2011-02-09 01:17:14 +0200 (ср, 09 февр 2011) $ + * $Revision: 236 $ + */ + +/*jslint browser: true, onevar: true, undef: true, bitwise: true, strict: true */ +/*global window : false, clearInterval: false, clearTimeout: false, document: false, setInterval: false, setTimeout: false, jQuery: false, navigator: false, XSLTProcessor: false, DOMParser: false, XMLSerializer: false*/ + +"use strict"; + +// top wrapper to prevent multiple inclusion (is this OK?) +(function () { if(jQuery && jQuery.jstree) { return; } + var is_ie6 = false, is_ie7 = false, is_ff2 = false; + +/* + * jsTree core + */ +(function ($) { + // Common functions not related to jsTree + // decided to move them to a `vakata` "namespace" + $.vakata = {}; + // CSS related functions + $.vakata.css = { + get_css : function(rule_name, delete_flag, sheet) { + rule_name = rule_name.toLowerCase(); + var css_rules = sheet.cssRules || sheet.rules, + j = 0; + do { + if(css_rules.length && j > css_rules.length + 5) { return false; } + if(css_rules[j].selectorText && css_rules[j].selectorText.toLowerCase() == rule_name) { + if(delete_flag === true) { + if(sheet.removeRule) { sheet.removeRule(j); } + if(sheet.deleteRule) { sheet.deleteRule(j); } + return true; + } + else { return css_rules[j]; } + } + } + while (css_rules[++j]); + return false; + }, + add_css : function(rule_name, sheet) { + if($.jstree.css.get_css(rule_name, false, sheet)) { return false; } + if(sheet.insertRule) { sheet.insertRule(rule_name + ' { }', 0); } else { sheet.addRule(rule_name, null, 0); } + return $.vakata.css.get_css(rule_name); + }, + remove_css : function(rule_name, sheet) { + return $.vakata.css.get_css(rule_name, true, sheet); + }, + add_sheet : function(opts) { + var tmp = false, is_new = true; + if(opts.str) { + if(opts.title) { tmp = $("style[id='" + opts.title + "-stylesheet']")[0]; } + if(tmp) { is_new = false; } + else { + tmp = document.createElement("style"); + tmp.setAttribute('type',"text/css"); + if(opts.title) { tmp.setAttribute("id", opts.title + "-stylesheet"); } + } + if(tmp.styleSheet) { + if(is_new) { + document.getElementsByTagName("head")[0].appendChild(tmp); + tmp.styleSheet.cssText = opts.str; + } + else { + tmp.styleSheet.cssText = tmp.styleSheet.cssText + " " + opts.str; + } + } + else { + tmp.appendChild(document.createTextNode(opts.str)); + document.getElementsByTagName("head")[0].appendChild(tmp); + } + return tmp.sheet || tmp.styleSheet; + } + if(opts.url) { + if(document.createStyleSheet) { + try { tmp = document.createStyleSheet(opts.url); } catch (e) { } + } + else { + tmp = document.createElement('link'); + tmp.rel = 'stylesheet'; + tmp.type = 'text/css'; + tmp.media = "all"; + tmp.href = opts.url; + document.getElementsByTagName("head")[0].appendChild(tmp); + return tmp.styleSheet; + } + } + } + }; + + // private variables + var instances = [], // instance array (used by $.jstree.reference/create/focused) + focused_instance = -1, // the index in the instance array of the currently focused instance + plugins = {}, // list of included plugins + prepared_move = {}; // for the move_node function + + // jQuery plugin wrapper (thanks to jquery UI widget function) + $.fn.jstree = function (settings) { + var isMethodCall = (typeof settings == 'string'), // is this a method call like $().jstree("open_node") + args = Array.prototype.slice.call(arguments, 1), + returnValue = this; + + // if a method call execute the method on all selected instances + if(isMethodCall) { + if(settings.substring(0, 1) == '_') { return returnValue; } + this.each(function() { + var instance = instances[$.data(this, "jstree_instance_id")], + methodValue = (instance && $.isFunction(instance[settings])) ? instance[settings].apply(instance, args) : instance; + if(typeof methodValue !== "undefined" && (settings.indexOf("is_") === 0 || (methodValue !== true && methodValue !== false))) { returnValue = methodValue; return false; } + }); + } + else { + this.each(function() { + // extend settings and allow for multiple hashes and $.data + var instance_id = $.data(this, "jstree_instance_id"), + a = [], + b = settings ? $.extend({}, true, settings) : {}, + c = $(this), + s = false, + t = []; + a = a.concat(args); + if(c.data("jstree")) { a.push(c.data("jstree")); } + b = a.length ? $.extend.apply(null, [true, b].concat(a)) : b; + + // if an instance already exists, destroy it first + if(typeof instance_id !== "undefined" && instances[instance_id]) { instances[instance_id].destroy(); } + // push a new empty object to the instances array + instance_id = parseInt(instances.push({}),10) - 1; + // store the jstree instance id to the container element + $.data(this, "jstree_instance_id", instance_id); + // clean up all plugins + b.plugins = $.isArray(b.plugins) ? b.plugins : $.jstree.defaults.plugins.slice(); + b.plugins.unshift("core"); + // only unique plugins + b.plugins = b.plugins.sort().join(",,").replace(/(,|^)([^,]+)(,,\2)+(,|$)/g,"$1$2$4").replace(/,,+/g,",").replace(/,$/,"").split(","); + + // extend defaults with passed data + s = $.extend(true, {}, $.jstree.defaults, b); + s.plugins = b.plugins; + $.each(plugins, function (i, val) { + if($.inArray(i, s.plugins) === -1) { s[i] = null; delete s[i]; } + else { t.push(i); } + }); + s.plugins = t; + + // push the new object to the instances array (at the same time set the default classes to the container) and init + instances[instance_id] = new $.jstree._instance(instance_id, $(this).addClass("jstree jstree-" + instance_id), s); + // init all activated plugins for this instance + $.each(instances[instance_id]._get_settings().plugins, function (i, val) { instances[instance_id].data[val] = {}; }); + $.each(instances[instance_id]._get_settings().plugins, function (i, val) { if(plugins[val]) { plugins[val].__init.apply(instances[instance_id]); } }); + // initialize the instance + setTimeout(function() { if(instances[instance_id]) { instances[instance_id].init(); } }, 0); + }); + } + // return the jquery selection (or if it was a method call that returned a value - the returned value) + return returnValue; + }; + // object to store exposed functions and objects + $.jstree = { + defaults : { + plugins : [] + }, + _focused : function () { return instances[focused_instance] || null; }, + _reference : function (needle) { + // get by instance id + if(instances[needle]) { return instances[needle]; } + // get by DOM (if still no luck - return null + var o = $(needle); + if(!o.length && typeof needle === "string") { o = $("#" + needle); } + if(!o.length) { return null; } + return instances[o.closest(".jstree").data("jstree_instance_id")] || null; + }, + _instance : function (index, container, settings) { + // for plugins to store data in + this.data = { core : {} }; + this.get_settings = function () { return $.extend(true, {}, settings); }; + this._get_settings = function () { return settings; }; + this.get_index = function () { return index; }; + this.get_container = function () { return container; }; + this.get_container_ul = function () { return container.children("ul:eq(0)"); }; + this._set_settings = function (s) { + settings = $.extend(true, {}, settings, s); + }; + }, + _fn : { }, + plugin : function (pname, pdata) { + pdata = $.extend({}, { + __init : $.noop, + __destroy : $.noop, + _fn : {}, + defaults : false + }, pdata); + plugins[pname] = pdata; + + $.jstree.defaults[pname] = pdata.defaults; + $.each(pdata._fn, function (i, val) { + val.plugin = pname; + val.old = $.jstree._fn[i]; + $.jstree._fn[i] = function () { + var rslt, + func = val, + args = Array.prototype.slice.call(arguments), + evnt = new $.Event("before.jstree"), + rlbk = false; + + if(this.data.core.locked === true && i !== "unlock" && i !== "is_locked") { return; } + + // Check if function belongs to the included plugins of this instance + do { + if(func && func.plugin && $.inArray(func.plugin, this._get_settings().plugins) !== -1) { break; } + func = func.old; + } while(func); + if(!func) { return; } + + // context and function to trigger events, then finally call the function + if(i.indexOf("_") === 0) { + rslt = func.apply(this, args); + } + else { + rslt = this.get_container().triggerHandler(evnt, { "func" : i, "inst" : this, "args" : args, "plugin" : func.plugin }); + if(rslt === false) { return; } + if(typeof rslt !== "undefined") { args = rslt; } + + rslt = func.apply( + $.extend({}, this, { + __callback : function (data) { + this.get_container().triggerHandler( i + '.jstree', { "inst" : this, "args" : args, "rslt" : data, "rlbk" : rlbk }); + }, + __rollback : function () { + rlbk = this.get_rollback(); + return rlbk; + }, + __call_old : function (replace_arguments) { + return func.old.apply(this, (replace_arguments ? Array.prototype.slice.call(arguments, 1) : args ) ); + } + }), args); + } + + // return the result + return rslt; + }; + $.jstree._fn[i].old = val.old; + $.jstree._fn[i].plugin = pname; + }); + }, + rollback : function (rb) { + if(rb) { + if(!$.isArray(rb)) { rb = [ rb ]; } + $.each(rb, function (i, val) { + instances[val.i].set_rollback(val.h, val.d); + }); + } + } + }; + // set the prototype for all instances + $.jstree._fn = $.jstree._instance.prototype = {}; + + // load the css when DOM is ready + $(function() { + // code is copied from jQuery ($.browser is deprecated + there is a bug in IE) + var u = navigator.userAgent.toLowerCase(), + v = (u.match( /.+?(?:rv|it|ra|ie)[\/: ]([\d.]+)/ ) || [0,'0'])[1], + css_string = '' + + '.jstree ul, .jstree li { display:block; margin:0 0 0 0; padding:0 0 0 0; list-style-type:none; } ' + + '.jstree li { display:block; min-height:18px; line-height:18px; white-space:nowrap; margin-left:18px; min-width:18px; } ' + + '.jstree-rtl li { margin-left:0; margin-right:18px; } ' + + '.jstree > ul > li { margin-left:0px; } ' + + '.jstree-rtl > ul > li { margin-right:0px; } ' + + '.jstree ins { display:inline-block; text-decoration:none; width:18px; height:18px; margin:0 0 0 0; padding:0; } ' + + '.jstree a { display:inline-block; white-space:nowrap; text-decoration:none; padding:1px 2px; margin:0; } ' + + '.jstree a:focus { outline: none; } ' + + '.jstree a > ins { height:16px; width:16px; } ' + + '.jstree a > .jstree-icon { margin-right:3px; } ' + + '.jstree-rtl a > .jstree-icon { margin-left:3px; margin-right:0; } ' + + 'li.jstree-open > ul { display:block; } ' + + 'li.jstree-closed > ul { display:none; } '; + // Correct IE 6 (does not support the > CSS selector) + if(/msie/.test(u) && parseInt(v, 10) == 6) { + is_ie6 = true; + + // fix image flicker and lack of caching + try { + document.execCommand("BackgroundImageCache", false, true); + } catch (err) { } + + css_string += '' + + '.jstree li { height:18px; margin-left:0; margin-right:0; } ' + + '.jstree li li { margin-left:18px; } ' + + '.jstree-rtl li li { margin-left:0px; margin-right:18px; } ' + + 'li.jstree-open ul { display:block; } ' + + 'li.jstree-closed ul { display:none !important; } ' + + '.jstree li a { display:inline; border-width:0 !important; padding:0px 2px !important; } ' + + '.jstree li a ins { height:16px; width:16px; margin-right:3px; } ' + + '.jstree-rtl li a ins { margin-right:0px; margin-left:3px; } '; + } + // Correct IE 7 (shifts anchor nodes onhover) + if(/msie/.test(u) && parseInt(v, 10) == 7) { + is_ie7 = true; + css_string += '.jstree li a { border-width:0 !important; padding:0px 2px !important; } '; + } + // correct ff2 lack of display:inline-block + if(!/compatible/.test(u) && /mozilla/.test(u) && parseFloat(v, 10) < 1.9) { + is_ff2 = true; + css_string += '' + + '.jstree ins { display:-moz-inline-box; } ' + + '.jstree li { line-height:12px; } ' + // WHY?? + '.jstree a { display:-moz-inline-box; } ' + + '.jstree .jstree-no-icons .jstree-checkbox { display:-moz-inline-stack !important; } '; + /* this shouldn't be here as it is theme specific */ + } + // the default stylesheet + $.vakata.css.add_sheet({ str : css_string, title : "jstree" }); + }); + + // core functions (open, close, create, update, delete) + $.jstree.plugin("core", { + __init : function () { + this.data.core.locked = false; + this.data.core.to_open = this.get_settings().core.initially_open; + this.data.core.to_load = this.get_settings().core.initially_load; + }, + defaults : { + html_titles : false, + animation : 500, + initially_open : [], + initially_load : [], + open_parents : true, + notify_plugins : true, + rtl : false, + load_open : false, + strings : { + loading : "Loading ...", + new_node : "New node", + multiple_selection : "Multiple selection" + } + }, + _fn : { + init : function () { + this.set_focus(); + if(this._get_settings().core.rtl) { + this.get_container().addClass("jstree-rtl").css("direction", "rtl"); + } + this.get_container().html(""); + this.data.core.li_height = this.get_container_ul().find("li.jstree-closed, li.jstree-leaf").eq(0).height() || 18; + + this.get_container() + .delegate("li > ins", "click.jstree", $.proxy(function (event) { + var trgt = $(event.target); + // if(trgt.is("ins") && event.pageY - trgt.offset().top < this.data.core.li_height) { this.toggle_node(trgt); } + this.toggle_node(trgt); + }, this)) + .bind("mousedown.jstree", $.proxy(function () { + this.set_focus(); // This used to be setTimeout(set_focus,0) - why? + }, this)) + .bind("dblclick.jstree", function (event) { + var sel; + if(document.selection && document.selection.empty) { document.selection.empty(); } + else { + if(window.getSelection) { + sel = window.getSelection(); + try { + sel.removeAllRanges(); + sel.collapse(); + } catch (err) { } + } + } + }); + if(this._get_settings().core.notify_plugins) { + this.get_container() + .bind("load_node.jstree", $.proxy(function (e, data) { + var o = this._get_node(data.rslt.obj), + t = this; + if(o === -1) { o = this.get_container_ul(); } + if(!o.length) { return; } + o.find("li").each(function () { + var th = $(this); + if(th.data("jstree")) { + $.each(th.data("jstree"), function (plugin, values) { + if(t.data[plugin] && $.isFunction(t["_" + plugin + "_notify"])) { + t["_" + plugin + "_notify"].call(t, th, values); + } + }); + } + }); + }, this)); + } + if(this._get_settings().core.load_open) { + this.get_container() + .bind("load_node.jstree", $.proxy(function (e, data) { + var o = this._get_node(data.rslt.obj), + t = this; + if(o === -1) { o = this.get_container_ul(); } + if(!o.length) { return; } + o.find("li.jstree-open:not(:has(ul))").each(function () { + t.load_node(this, $.noop, $.noop); + }); + }, this)); + } + this.__callback(); + this.load_node(-1, function () { this.loaded(); this.reload_nodes(); }); + }, + destroy : function () { + var i, + n = this.get_index(), + s = this._get_settings(), + _this = this; + + $.each(s.plugins, function (i, val) { + try { plugins[val].__destroy.apply(_this); } catch(err) { } + }); + this.__callback(); + // set focus to another instance if this one is focused + if(this.is_focused()) { + for(i in instances) { + if(instances.hasOwnProperty(i) && i != n) { + instances[i].set_focus(); + break; + } + } + } + // if no other instance found + if(n === focused_instance) { focused_instance = -1; } + // remove all traces of jstree in the DOM (only the ones set using jstree*) and cleans all events + this.get_container() + .unbind(".jstree") + .undelegate(".jstree") + .removeData("jstree_instance_id") + .find("[class^='jstree']") + .andSelf() + .attr("class", function () { return this.className.replace(/jstree[^ ]*|$/ig,''); }); + $(document) + .unbind(".jstree-" + n) + .undelegate(".jstree-" + n); + // remove the actual data + instances[n] = null; + delete instances[n]; + }, + + _core_notify : function (n, data) { + if(data.opened) { + this.open_node(n, false, true); + } + }, + + lock : function () { + this.data.core.locked = true; + this.get_container().children("ul").addClass("jstree-locked").css("opacity","0.7"); + this.__callback({}); + }, + unlock : function () { + this.data.core.locked = false; + this.get_container().children("ul").removeClass("jstree-locked").css("opacity","1"); + this.__callback({}); + }, + is_locked : function () { return this.data.core.locked; }, + save_opened : function () { + var _this = this; + this.data.core.to_open = []; + this.get_container_ul().find("li.jstree-open").each(function () { + if(this.id) { _this.data.core.to_open.push("#" + this.id.toString().replace(/^#/,"").replace(/\\\//g,"/").replace(/\//g,"\\\/").replace(/\\\./g,".").replace(/\./g,"\\.").replace(/\:/g,"\\:")); } + }); + this.__callback(_this.data.core.to_open); + }, + save_loaded : function () { }, + reload_nodes : function (is_callback) { + var _this = this, + done = true, + current = [], + remaining = []; + if(!is_callback) { + this.data.core.reopen = false; + this.data.core.refreshing = true; + this.data.core.to_open = $.map($.makeArray(this.data.core.to_open), function (n) { return "#" + n.toString().replace(/^#/,"").replace(/\\\//g,"/").replace(/\//g,"\\\/").replace(/\\\./g,".").replace(/\./g,"\\.").replace(/\:/g,"\\:"); }); + this.data.core.to_load = $.map($.makeArray(this.data.core.to_load), function (n) { return "#" + n.toString().replace(/^#/,"").replace(/\\\//g,"/").replace(/\//g,"\\\/").replace(/\\\./g,".").replace(/\./g,"\\.").replace(/\:/g,"\\:"); }); + if(this.data.core.to_open.length) { + this.data.core.to_load = this.data.core.to_load.concat(this.data.core.to_open); + } + } + if(this.data.core.to_load.length) { + $.each(this.data.core.to_load, function (i, val) { + if(val == "#") { return true; } + if($(val).length) { current.push(val); } + else { remaining.push(val); } + }); + if(current.length) { + this.data.core.to_load = remaining; + $.each(current, function (i, val) { + if(!_this._is_loaded(val)) { + _this.load_node(val, function () { _this.reload_nodes(true); }, function () { _this.reload_nodes(true); }); + done = false; + } + }); + } + } + if(this.data.core.to_open.length) { + $.each(this.data.core.to_open, function (i, val) { + _this.open_node(val, false, true); + }); + } + if(done) { + // TODO: find a more elegant approach to syncronizing returning requests + if(this.data.core.reopen) { clearTimeout(this.data.core.reopen); } + this.data.core.reopen = setTimeout(function () { _this.__callback({}, _this); }, 50); + this.data.core.refreshing = false; + this.reopen(); + } + }, + reopen : function () { + var _this = this; + if(this.data.core.to_open.length) { + $.each(this.data.core.to_open, function (i, val) { + _this.open_node(val, false, true); + }); + } + this.__callback({}); + }, + refresh : function (obj) { + var _this = this; + this.save_opened(); + if(!obj) { obj = -1; } + obj = this._get_node(obj); + if(!obj) { obj = -1; } + if(obj !== -1) { obj.children("UL").remove(); } + else { this.get_container_ul().empty(); } + this.load_node(obj, function () { _this.__callback({ "obj" : obj}); _this.reload_nodes(); }); + }, + // Dummy function to fire after the first load (so that there is a jstree.loaded event) + loaded : function () { + this.__callback(); + }, + // deal with focus + set_focus : function () { + if(this.is_focused()) { return; } + var f = $.jstree._focused(); + if(f) { f.unset_focus(); } + + this.get_container().addClass("jstree-focused"); + focused_instance = this.get_index(); + this.__callback(); + }, + is_focused : function () { + return focused_instance == this.get_index(); + }, + unset_focus : function () { + if(this.is_focused()) { + this.get_container().removeClass("jstree-focused"); + focused_instance = -1; + } + this.__callback(); + }, + + // traverse + _get_node : function (obj) { + var $obj = $(obj, this.get_container()); + if($obj.is(".jstree") || obj == -1) { return -1; } + $obj = $obj.closest("li", this.get_container()); + return $obj.length ? $obj : false; + }, + _get_next : function (obj, strict) { + obj = this._get_node(obj); + if(obj === -1) { return this.get_container().find("> ul > li:first-child"); } + if(!obj.length) { return false; } + if(strict) { return (obj.nextAll("li").size() > 0) ? obj.nextAll("li:eq(0)") : false; } + + if(obj.hasClass("jstree-open")) { return obj.find("li:eq(0)"); } + else if(obj.nextAll("li").size() > 0) { return obj.nextAll("li:eq(0)"); } + else { return obj.parentsUntil(".jstree","li").next("li").eq(0); } + }, + _get_prev : function (obj, strict) { + obj = this._get_node(obj); + if(obj === -1) { return this.get_container().find("> ul > li:last-child"); } + if(!obj.length) { return false; } + if(strict) { return (obj.prevAll("li").length > 0) ? obj.prevAll("li:eq(0)") : false; } + + if(obj.prev("li").length) { + obj = obj.prev("li").eq(0); + while(obj.hasClass("jstree-open")) { obj = obj.children("ul:eq(0)").children("li:last"); } + return obj; + } + else { var o = obj.parentsUntil(".jstree","li:eq(0)"); return o.length ? o : false; } + }, + _get_parent : function (obj) { + obj = this._get_node(obj); + if(obj == -1 || !obj.length) { return false; } + var o = obj.parentsUntil(".jstree", "li:eq(0)"); + return o.length ? o : -1; + }, + _get_children : function (obj) { + obj = this._get_node(obj); + if(obj === -1) { return this.get_container().children("ul:eq(0)").children("li"); } + if(!obj.length) { return false; } + return obj.children("ul:eq(0)").children("li"); + }, + get_path : function (obj, id_mode) { + var p = [], + _this = this; + obj = this._get_node(obj); + if(obj === -1 || !obj || !obj.length) { return false; } + obj.parentsUntil(".jstree", "li").each(function () { + p.push( id_mode ? this.id : _this.get_text(this) ); + }); + p.reverse(); + p.push( id_mode ? obj.attr("id") : this.get_text(obj) ); + return p; + }, + + // string functions + _get_string : function (key) { + return this._get_settings().core.strings[key] || key; + }, + + is_open : function (obj) { obj = this._get_node(obj); return obj && obj !== -1 && obj.hasClass("jstree-open"); }, + is_closed : function (obj) { obj = this._get_node(obj); return obj && obj !== -1 && obj.hasClass("jstree-closed"); }, + is_leaf : function (obj) { obj = this._get_node(obj); return obj && obj !== -1 && obj.hasClass("jstree-leaf"); }, + correct_state : function (obj) { + obj = this._get_node(obj); + if(!obj || obj === -1) { return false; } + obj.removeClass("jstree-closed jstree-open").addClass("jstree-leaf").children("ul").remove(); + this.__callback({ "obj" : obj }); + }, + // open/close + open_node : function (obj, callback, skip_animation) { + obj = this._get_node(obj); + if(!obj.length) { return false; } + if(!obj.hasClass("jstree-closed")) { if(callback) { callback.call(); } return false; } + var s = skip_animation || is_ie6 ? 0 : this._get_settings().core.animation, + t = this; + if(!this._is_loaded(obj)) { + obj.children("a").addClass("jstree-loading"); + this.load_node(obj, function () { t.open_node(obj, callback, skip_animation); }, callback); + } + else { + if(this._get_settings().core.open_parents) { + obj.parentsUntil(".jstree",".jstree-closed").each(function () { + t.open_node(this, false, true); + }); + } + if(s) { obj.children("ul").css("display","none"); } + obj.removeClass("jstree-closed").addClass("jstree-open").children("a").removeClass("jstree-loading"); + if(s) { obj.children("ul").stop(true, true).slideDown(s, function () { this.style.display = ""; t.after_open(obj); }); } + else { t.after_open(obj); } + this.__callback({ "obj" : obj }); + if(callback) { callback.call(); } + } + }, + after_open : function (obj) { this.__callback({ "obj" : obj }); }, + close_node : function (obj, skip_animation) { + obj = this._get_node(obj); + var s = skip_animation || is_ie6 ? 0 : this._get_settings().core.animation, + t = this; + if(!obj.length || !obj.hasClass("jstree-open")) { return false; } + if(s) { obj.children("ul").attr("style","display:block !important"); } + obj.removeClass("jstree-open").addClass("jstree-closed"); + if(s) { obj.children("ul").stop(true, true).slideUp(s, function () { this.style.display = ""; t.after_close(obj); }); } + else { t.after_close(obj); } + this.__callback({ "obj" : obj }); + }, + after_close : function (obj) { this.__callback({ "obj" : obj }); }, + toggle_node : function (obj) { + obj = this._get_node(obj); + if(obj.hasClass("jstree-closed")) { return this.open_node(obj); } + if(obj.hasClass("jstree-open")) { return this.close_node(obj); } + }, + open_all : function (obj, do_animation, original_obj) { + obj = obj ? this._get_node(obj) : -1; + if(!obj || obj === -1) { obj = this.get_container_ul(); } + if(original_obj) { + obj = obj.find("li.jstree-closed"); + } + else { + original_obj = obj; + if(obj.is(".jstree-closed")) { obj = obj.find("li.jstree-closed").andSelf(); } + else { obj = obj.find("li.jstree-closed"); } + } + var _this = this; + obj.each(function () { + var __this = this; + if(!_this._is_loaded(this)) { _this.open_node(this, function() { _this.open_all(__this, do_animation, original_obj); }, !do_animation); } + else { _this.open_node(this, false, !do_animation); } + }); + // so that callback is fired AFTER all nodes are open + if(original_obj.find('li.jstree-closed').length === 0) { this.__callback({ "obj" : original_obj }); } + }, + close_all : function (obj, do_animation) { + var _this = this; + obj = obj ? this._get_node(obj) : this.get_container(); + if(!obj || obj === -1) { obj = this.get_container_ul(); } + obj.find("li.jstree-open").andSelf().each(function () { _this.close_node(this, !do_animation); }); + this.__callback({ "obj" : obj }); + }, + clean_node : function (obj) { + obj = obj && obj != -1 ? $(obj) : this.get_container_ul(); + obj = obj.is("li") ? obj.find("li").andSelf() : obj.find("li"); + obj.removeClass("jstree-last") + .filter("li:last-child").addClass("jstree-last").end() + .filter(":has(li)") + .not(".jstree-open").removeClass("jstree-leaf").addClass("jstree-closed"); + obj.not(".jstree-open, .jstree-closed").addClass("jstree-leaf").children("ul").remove(); + this.__callback({ "obj" : obj }); + }, + // rollback + get_rollback : function () { + this.__callback(); + return { i : this.get_index(), h : this.get_container().children("ul").clone(true), d : this.data }; + }, + set_rollback : function (html, data) { + this.get_container().empty().append(html); + this.data = data; + this.__callback(); + }, + // Dummy functions to be overwritten by any datastore plugin included + load_node : function (obj, s_call, e_call) { this.__callback({ "obj" : obj }); }, + _is_loaded : function (obj) { return true; }, + + // Basic operations: create + create_node : function (obj, position, js, callback, is_loaded) { + obj = this._get_node(obj); + position = typeof position === "undefined" ? "last" : position; + var d = $("
  • "), + s = this._get_settings().core, + tmp; + + if(obj !== -1 && !obj.length) { return false; } + if(!is_loaded && !this._is_loaded(obj)) { this.load_node(obj, function () { this.create_node(obj, position, js, callback, true); }); return false; } + + this.__rollback(); + + if(typeof js === "string") { js = { "data" : js }; } + if(!js) { js = {}; } + if(js.attr) { d.attr(js.attr); } + if(js.metadata) { d.data(js.metadata); } + if(js.state) { d.addClass("jstree-" + js.state); } + if(!js.data) { js.data = this._get_string("new_node"); } + if(!$.isArray(js.data)) { tmp = js.data; js.data = []; js.data.push(tmp); } + $.each(js.data, function (i, m) { + tmp = $(""); + if($.isFunction(m)) { m = m.call(this, js); } + if(typeof m == "string") { tmp.attr('href','#')[ s.html_titles ? "html" : "text" ](m); } + else { + if(!m.attr) { m.attr = {}; } + if(!m.attr.href) { m.attr.href = '#'; } + tmp.attr(m.attr)[ s.html_titles ? "html" : "text" ](m.title); + if(m.language) { tmp.addClass(m.language); } + } + tmp.prepend(" "); + if(!m.icon && js.icon) { m.icon = js.icon; } + if(m.icon) { + if(m.icon.indexOf("/") === -1) { tmp.children("ins").addClass(m.icon); } + else { tmp.children("ins").css("background","url('" + m.icon + "') center center no-repeat"); } + } + d.append(tmp); + }); + d.prepend(" "); + if(obj === -1) { + obj = this.get_container(); + if(position === "before") { position = "first"; } + if(position === "after") { position = "last"; } + } + switch(position) { + case "before": obj.before(d); tmp = this._get_parent(obj); break; + case "after" : obj.after(d); tmp = this._get_parent(obj); break; + case "inside": + case "first" : + if(!obj.children("ul").length) { obj.append("
      "); } + obj.children("ul").prepend(d); + tmp = obj; + break; + case "last": + if(!obj.children("ul").length) { obj.append("
        "); } + obj.children("ul").append(d); + tmp = obj; + break; + default: + if(!obj.children("ul").length) { obj.append("
          "); } + if(!position) { position = 0; } + tmp = obj.children("ul").children("li").eq(position); + if(tmp.length) { tmp.before(d); } + else { obj.children("ul").append(d); } + tmp = obj; + break; + } + if(tmp === -1 || tmp.get(0) === this.get_container().get(0)) { tmp = -1; } + this.clean_node(tmp); + this.__callback({ "obj" : d, "parent" : tmp }); + if(callback) { callback.call(this, d); } + return d; + }, + // Basic operations: rename (deal with text) + get_text : function (obj) { + obj = this._get_node(obj); + if(!obj.length) { return false; } + var s = this._get_settings().core.html_titles; + obj = obj.children("a:eq(0)"); + if(s) { + obj = obj.clone(); + obj.children("INS").remove(); + return obj.html(); + } + else { + obj = obj.contents().filter(function() { return this.nodeType == 3; })[0]; + return obj.nodeValue; + } + }, + set_text : function (obj, val) { + obj = this._get_node(obj); + if(!obj.length) { return false; } + obj = obj.children("a:eq(0)"); + if(this._get_settings().core.html_titles) { + var tmp = obj.children("INS").clone(); + obj.html(val).prepend(tmp); + this.__callback({ "obj" : obj, "name" : val }); + return true; + } + else { + obj = obj.contents().filter(function() { return this.nodeType == 3; })[0]; + this.__callback({ "obj" : obj, "name" : val }); + return (obj.nodeValue = val); + } + }, + rename_node : function (obj, val) { + obj = this._get_node(obj); + this.__rollback(); + if(obj && obj.length && this.set_text.apply(this, Array.prototype.slice.call(arguments))) { this.__callback({ "obj" : obj, "name" : val }); } + }, + // Basic operations: deleting nodes + delete_node : function (obj) { + obj = this._get_node(obj); + if(!obj.length) { return false; } + this.__rollback(); + var p = this._get_parent(obj), prev = $([]), t = this; + obj.each(function () { + prev = prev.add(t._get_prev(this)); + }); + obj = obj.detach(); + if(p !== -1 && p.find("> ul > li").length === 0) { + p.removeClass("jstree-open jstree-closed").addClass("jstree-leaf"); + } + this.clean_node(p); + this.__callback({ "obj" : obj, "prev" : prev, "parent" : p }); + return obj; + }, + prepare_move : function (o, r, pos, cb, is_cb) { + var p = {}; + + p.ot = $.jstree._reference(o) || this; + p.o = p.ot._get_node(o); + p.r = r === - 1 ? -1 : this._get_node(r); + p.p = (typeof pos === "undefined" || pos === false) ? "last" : pos; // TODO: move to a setting + if(!is_cb && prepared_move.o && prepared_move.o[0] === p.o[0] && prepared_move.r[0] === p.r[0] && prepared_move.p === p.p) { + this.__callback(prepared_move); + if(cb) { cb.call(this, prepared_move); } + return; + } + p.ot = $.jstree._reference(p.o) || this; + p.rt = $.jstree._reference(p.r) || this; // r === -1 ? p.ot : $.jstree._reference(p.r) || this + if(p.r === -1 || !p.r) { + p.cr = -1; + switch(p.p) { + case "first": + case "before": + case "inside": + p.cp = 0; + break; + case "after": + case "last": + p.cp = p.rt.get_container().find(" > ul > li").length; + break; + default: + p.cp = p.p; + break; + } + } + else { + if(!/^(before|after)$/.test(p.p) && !this._is_loaded(p.r)) { + return this.load_node(p.r, function () { this.prepare_move(o, r, pos, cb, true); }); + } + switch(p.p) { + case "before": + p.cp = p.r.index(); + p.cr = p.rt._get_parent(p.r); + break; + case "after": + p.cp = p.r.index() + 1; + p.cr = p.rt._get_parent(p.r); + break; + case "inside": + case "first": + p.cp = 0; + p.cr = p.r; + break; + case "last": + p.cp = p.r.find(" > ul > li").length; + p.cr = p.r; + break; + default: + p.cp = p.p; + p.cr = p.r; + break; + } + } + p.np = p.cr == -1 ? p.rt.get_container() : p.cr; + p.op = p.ot._get_parent(p.o); + p.cop = p.o.index(); + if(p.op === -1) { p.op = p.ot ? p.ot.get_container() : this.get_container(); } + if(!/^(before|after)$/.test(p.p) && p.op && p.np && p.op[0] === p.np[0] && p.o.index() < p.cp) { p.cp++; } + //if(p.p === "before" && p.op && p.np && p.op[0] === p.np[0] && p.o.index() < p.cp) { p.cp--; } + p.or = p.np.find(" > ul > li:nth-child(" + (p.cp + 1) + ")"); + prepared_move = p; + this.__callback(prepared_move); + if(cb) { cb.call(this, prepared_move); } + }, + check_move : function () { + var obj = prepared_move, ret = true, r = obj.r === -1 ? this.get_container() : obj.r; + if(!obj || !obj.o || obj.or[0] === obj.o[0]) { return false; } + if(obj.op && obj.np && obj.op[0] === obj.np[0] && obj.cp - 1 === obj.o.index()) { return false; } + obj.o.each(function () { + if(r.parentsUntil(".jstree", "li").andSelf().index(this) !== -1) { ret = false; return false; } + }); + return ret; + }, + move_node : function (obj, ref, position, is_copy, is_prepared, skip_check) { + if(!is_prepared) { + return this.prepare_move(obj, ref, position, function (p) { + this.move_node(p, false, false, is_copy, true, skip_check); + }); + } + if(is_copy) { + prepared_move.cy = true; + } + if(!skip_check && !this.check_move()) { return false; } + + this.__rollback(); + var o = false; + if(is_copy) { + o = obj.o.clone(true); + o.find("*[id]").andSelf().each(function () { + if(this.id) { this.id = "copy_" + this.id; } + }); + } + else { o = obj.o; } + + if(obj.or.length) { obj.or.before(o); } + else { + if(!obj.np.children("ul").length) { $("
            ").appendTo(obj.np); } + obj.np.children("ul:eq(0)").append(o); + } + + try { + obj.ot.clean_node(obj.op); + obj.rt.clean_node(obj.np); + if(!obj.op.find("> ul > li").length) { + obj.op.removeClass("jstree-open jstree-closed").addClass("jstree-leaf").children("ul").remove(); + } + } catch (e) { } + + if(is_copy) { + prepared_move.cy = true; + prepared_move.oc = o; + } + this.__callback(prepared_move); + return prepared_move; + }, + _get_move : function () { return prepared_move; } + } + }); +})(jQuery); +//*/ + +/* + * jsTree ui plugin + * This plugins handles selecting/deselecting/hovering/dehovering nodes + */ +(function ($) { + var scrollbar_width, e1, e2; + $(function() { + if (/msie/.test(navigator.userAgent.toLowerCase())) { + e1 = $('').css({ position: 'absolute', top: -1000, left: 0 }).appendTo('body'); + e2 = $('').css({ position: 'absolute', top: -1000, left: 0 }).appendTo('body'); + scrollbar_width = e1.width() - e2.width(); + e1.add(e2).remove(); + } + else { + e1 = $('
            ').css({ width: 100, height: 100, overflow: 'auto', position: 'absolute', top: -1000, left: 0 }) + .prependTo('body').append('
            ').find('div').css({ width: '100%', height: 200 }); + scrollbar_width = 100 - e1.width(); + e1.parent().remove(); + } + }); + $.jstree.plugin("ui", { + __init : function () { + this.data.ui.selected = $(); + this.data.ui.last_selected = false; + this.data.ui.hovered = null; + this.data.ui.to_select = this.get_settings().ui.initially_select; + + this.get_container() + .delegate("a", "click.jstree", $.proxy(function (event) { + event.preventDefault(); + event.currentTarget.blur(); + if(!$(event.currentTarget).hasClass("jstree-loading")) { + this.select_node(event.currentTarget, true, event); + } + }, this)) + .delegate("a", "mouseenter.jstree", $.proxy(function (event) { + if(!$(event.currentTarget).hasClass("jstree-loading")) { + this.hover_node(event.target); + } + }, this)) + .delegate("a", "mouseleave.jstree", $.proxy(function (event) { + if(!$(event.currentTarget).hasClass("jstree-loading")) { + this.dehover_node(event.target); + } + }, this)) + .bind("reopen.jstree", $.proxy(function () { + this.reselect(); + }, this)) + .bind("get_rollback.jstree", $.proxy(function () { + this.dehover_node(); + this.save_selected(); + }, this)) + .bind("set_rollback.jstree", $.proxy(function () { + this.reselect(); + }, this)) + .bind("close_node.jstree", $.proxy(function (event, data) { + var s = this._get_settings().ui, + obj = this._get_node(data.rslt.obj), + clk = (obj && obj.length) ? obj.children("ul").find("a.jstree-clicked") : $(), + _this = this; + if(s.selected_parent_close === false || !clk.length) { return; } + clk.each(function () { + _this.deselect_node(this); + if(s.selected_parent_close === "select_parent") { _this.select_node(obj); } + }); + }, this)) + .bind("delete_node.jstree", $.proxy(function (event, data) { + var s = this._get_settings().ui.select_prev_on_delete, + obj = this._get_node(data.rslt.obj), + clk = (obj && obj.length) ? obj.find("a.jstree-clicked") : [], + _this = this; + clk.each(function () { _this.deselect_node(this); }); + if(s && clk.length) { + data.rslt.prev.each(function () { + if(this.parentNode) { _this.select_node(this); return false; /* if return false is removed all prev nodes will be selected */} + }); + } + }, this)) + .bind("move_node.jstree", $.proxy(function (event, data) { + if(data.rslt.cy) { + data.rslt.oc.find("a.jstree-clicked").removeClass("jstree-clicked"); + } + }, this)); + }, + defaults : { + select_limit : -1, // 0, 1, 2 ... or -1 for unlimited + select_multiple_modifier : "ctrl", // on, or ctrl, shift, alt + select_range_modifier : "shift", + selected_parent_close : "select_parent", // false, "deselect", "select_parent" + selected_parent_open : true, + select_prev_on_delete : true, + disable_selecting_children : false, + initially_select : [] + }, + _fn : { + _get_node : function (obj, allow_multiple) { + if(typeof obj === "undefined" || obj === null) { return allow_multiple ? this.data.ui.selected : this.data.ui.last_selected; } + var $obj = $(obj, this.get_container()); + if($obj.is(".jstree") || obj == -1) { return -1; } + $obj = $obj.closest("li", this.get_container()); + return $obj.length ? $obj : false; + }, + _ui_notify : function (n, data) { + if(data.selected) { + this.select_node(n, false); + } + }, + save_selected : function () { + var _this = this; + this.data.ui.to_select = []; + this.data.ui.selected.each(function () { if(this.id) { _this.data.ui.to_select.push("#" + this.id.toString().replace(/^#/,"").replace(/\\\//g,"/").replace(/\//g,"\\\/").replace(/\\\./g,".").replace(/\./g,"\\.").replace(/\:/g,"\\:")); } }); + this.__callback(this.data.ui.to_select); + }, + reselect : function () { + var _this = this, + s = this.data.ui.to_select; + s = $.map($.makeArray(s), function (n) { return "#" + n.toString().replace(/^#/,"").replace(/\\\//g,"/").replace(/\//g,"\\\/").replace(/\\\./g,".").replace(/\./g,"\\.").replace(/\:/g,"\\:"); }); + // this.deselect_all(); WHY deselect, breaks plugin state notifier? + $.each(s, function (i, val) { if(val && val !== "#") { _this.select_node(val); } }); + this.data.ui.selected = this.data.ui.selected.filter(function () { return this.parentNode; }); + this.__callback(); + }, + refresh : function (obj) { + this.save_selected(); + return this.__call_old(); + }, + hover_node : function (obj) { + obj = this._get_node(obj); + if(!obj.length) { return false; } + //if(this.data.ui.hovered && obj.get(0) === this.data.ui.hovered.get(0)) { return; } + if(!obj.hasClass("jstree-hovered")) { this.dehover_node(); } + this.data.ui.hovered = obj.children("a").addClass("jstree-hovered").parent(); + this._fix_scroll(obj); + this.__callback({ "obj" : obj }); + }, + dehover_node : function () { + var obj = this.data.ui.hovered, p; + if(!obj || !obj.length) { return false; } + p = obj.children("a").removeClass("jstree-hovered").parent(); + if(this.data.ui.hovered[0] === p[0]) { this.data.ui.hovered = null; } + this.__callback({ "obj" : obj }); + }, + select_node : function (obj, check, e) { + obj = this._get_node(obj); + if(obj == -1 || !obj || !obj.length) { return false; } + var s = this._get_settings().ui, + is_multiple = (s.select_multiple_modifier == "on" || (s.select_multiple_modifier !== false && e && e[s.select_multiple_modifier + "Key"])), + is_range = (s.select_range_modifier !== false && e && e[s.select_range_modifier + "Key"] && this.data.ui.last_selected && this.data.ui.last_selected[0] !== obj[0] && this.data.ui.last_selected.parent()[0] === obj.parent()[0]), + is_selected = this.is_selected(obj), + proceed = true, + t = this; + if(check) { + if(s.disable_selecting_children && is_multiple && + ( + (obj.parentsUntil(".jstree","li").children("a.jstree-clicked").length) || + (obj.children("ul").find("a.jstree-clicked:eq(0)").length) + ) + ) { + return false; + } + proceed = false; + switch(!0) { + case (is_range): + this.data.ui.last_selected.addClass("jstree-last-selected"); + obj = obj[ obj.index() < this.data.ui.last_selected.index() ? "nextUntil" : "prevUntil" ](".jstree-last-selected").andSelf(); + if(s.select_limit == -1 || obj.length < s.select_limit) { + this.data.ui.last_selected.removeClass("jstree-last-selected"); + this.data.ui.selected.each(function () { + if(this !== t.data.ui.last_selected[0]) { t.deselect_node(this); } + }); + is_selected = false; + proceed = true; + } + else { + proceed = false; + } + break; + case (is_selected && !is_multiple): + this.deselect_all(); + is_selected = false; + proceed = true; + break; + case (!is_selected && !is_multiple): + if(s.select_limit == -1 || s.select_limit > 0) { + this.deselect_all(); + proceed = true; + } + break; + case (is_selected && is_multiple): + this.deselect_node(obj); + break; + case (!is_selected && is_multiple): + if(s.select_limit == -1 || this.data.ui.selected.length + 1 <= s.select_limit) { + proceed = true; + } + break; + } + } + if(proceed && !is_selected) { + if(!is_range) { this.data.ui.last_selected = obj; } + obj.children("a").addClass("jstree-clicked"); + if(s.selected_parent_open) { + obj.parents(".jstree-closed").each(function () { t.open_node(this, false, true); }); + } + this.data.ui.selected = this.data.ui.selected.add(obj); + this._fix_scroll(obj.eq(0)); + this.__callback({ "obj" : obj, "e" : e }); + } + }, + _fix_scroll : function (obj) { + var c = this.get_container()[0], t; + if(c.scrollHeight > c.offsetHeight) { + obj = this._get_node(obj); + if(!obj || obj === -1 || !obj.length || !obj.is(":visible")) { return; } + t = obj.offset().top - this.get_container().offset().top; + if(t < 0) { + c.scrollTop = c.scrollTop + t - 1; + } + if(t + this.data.core.li_height + (c.scrollWidth > c.offsetWidth ? scrollbar_width : 0) > c.offsetHeight) { + c.scrollTop = c.scrollTop + (t - c.offsetHeight + this.data.core.li_height + 1 + (c.scrollWidth > c.offsetWidth ? scrollbar_width : 0)); + } + } + }, + deselect_node : function (obj) { + obj = this._get_node(obj); + if(!obj.length) { return false; } + if(this.is_selected(obj)) { + obj.children("a").removeClass("jstree-clicked"); + this.data.ui.selected = this.data.ui.selected.not(obj); + if(this.data.ui.last_selected.get(0) === obj.get(0)) { this.data.ui.last_selected = this.data.ui.selected.eq(0); } + this.__callback({ "obj" : obj }); + } + }, + toggle_select : function (obj) { + obj = this._get_node(obj); + if(!obj.length) { return false; } + if(this.is_selected(obj)) { this.deselect_node(obj); } + else { this.select_node(obj); } + }, + is_selected : function (obj) { return this.data.ui.selected.index(this._get_node(obj)) >= 0; }, + get_selected : function (context) { + return context ? $(context).find("a.jstree-clicked").parent() : this.data.ui.selected; + }, + deselect_all : function (context) { + var ret = context ? $(context).find("a.jstree-clicked").parent() : this.get_container().find("a.jstree-clicked").parent(); + ret.children("a.jstree-clicked").removeClass("jstree-clicked"); + this.data.ui.selected = $([]); + this.data.ui.last_selected = false; + this.__callback({ "obj" : ret }); + } + } + }); + // include the selection plugin by default + $.jstree.defaults.plugins.push("ui"); +})(jQuery); +//*/ + +/* + * jsTree CRRM plugin + * Handles creating/renaming/removing/moving nodes by user interaction. + */ +(function ($) { + $.jstree.plugin("crrm", { + __init : function () { + this.get_container() + .bind("move_node.jstree", $.proxy(function (e, data) { + if(this._get_settings().crrm.move.open_onmove) { + var t = this; + data.rslt.np.parentsUntil(".jstree").andSelf().filter(".jstree-closed").each(function () { + t.open_node(this, false, true); + }); + } + }, this)); + }, + defaults : { + input_width_limit : 200, + move : { + always_copy : false, // false, true or "multitree" + open_onmove : true, + default_position : "last", + check_move : function (m) { return true; } + } + }, + _fn : { + _show_input : function (obj, callback) { + obj = this._get_node(obj); + var rtl = this._get_settings().core.rtl, + w = this._get_settings().crrm.input_width_limit, + w1 = obj.children("ins").width(), + w2 = obj.find("> a:visible > ins").width() * obj.find("> a:visible > ins").length, + t = this.get_text(obj), + h1 = $("
            ", { css : { "position" : "absolute", "top" : "-200px", "left" : (rtl ? "0px" : "-1000px"), "visibility" : "hidden" } }).appendTo("body"), + h2 = obj.css("position","relative").append( + $("", { + "value" : t, + "class" : "jstree-rename-input", + // "size" : t.length, + "css" : { + "padding" : "0", + "border" : "1px solid silver", + "position" : "absolute", + "left" : (rtl ? "auto" : (w1 + w2 + 4) + "px"), + "right" : (rtl ? (w1 + w2 + 4) + "px" : "auto"), + "top" : "0px", + "height" : (this.data.core.li_height - 2) + "px", + "lineHeight" : (this.data.core.li_height - 2) + "px", + "width" : "150px" // will be set a bit further down + }, + "blur" : $.proxy(function () { + var i = obj.children(".jstree-rename-input"), + v = i.val(); + if(v === "") { v = t; } + h1.remove(); + i.remove(); // rollback purposes + this.set_text(obj,t); // rollback purposes + this.rename_node(obj, v); + callback.call(this, obj, v, t); + obj.css("position",""); + }, this), + "keyup" : function (event) { + var key = event.keyCode || event.which; + if(key == 27) { this.value = t; this.blur(); return; } + else if(key == 13) { this.blur(); return; } + else { + h2.width(Math.min(h1.text("pW" + this.value).width(),w)); + } + }, + "keypress" : function(event) { + var key = event.keyCode || event.which; + if(key == 13) { return false; } + } + }) + ).children(".jstree-rename-input"); + this.set_text(obj, ""); + h1.css({ + fontFamily : h2.css('fontFamily') || '', + fontSize : h2.css('fontSize') || '', + fontWeight : h2.css('fontWeight') || '', + fontStyle : h2.css('fontStyle') || '', + fontStretch : h2.css('fontStretch') || '', + fontVariant : h2.css('fontVariant') || '', + letterSpacing : h2.css('letterSpacing') || '', + wordSpacing : h2.css('wordSpacing') || '' + }); + h2.width(Math.min(h1.text("pW" + h2[0].value).width(),w))[0].select(); + }, + rename : function (obj) { + obj = this._get_node(obj); + this.__rollback(); + var f = this.__callback; + this._show_input(obj, function (obj, new_name, old_name) { + f.call(this, { "obj" : obj, "new_name" : new_name, "old_name" : old_name }); + }); + }, + create : function (obj, position, js, callback, skip_rename) { + var t, _this = this; + obj = this._get_node(obj); + if(!obj) { obj = -1; } + this.__rollback(); + t = this.create_node(obj, position, js, function (t) { + var p = this._get_parent(t), + pos = $(t).index(); + if(callback) { callback.call(this, t); } + if(p.length && p.hasClass("jstree-closed")) { this.open_node(p, false, true); } + if(!skip_rename) { + this._show_input(t, function (obj, new_name, old_name) { + _this.__callback({ "obj" : obj, "name" : new_name, "parent" : p, "position" : pos }); + }); + } + else { _this.__callback({ "obj" : t, "name" : this.get_text(t), "parent" : p, "position" : pos }); } + }); + return t; + }, + remove : function (obj) { + obj = this._get_node(obj, true); + var p = this._get_parent(obj), prev = this._get_prev(obj); + this.__rollback(); + obj = this.delete_node(obj); + if(obj !== false) { this.__callback({ "obj" : obj, "prev" : prev, "parent" : p }); } + }, + check_move : function () { + if(!this.__call_old()) { return false; } + var s = this._get_settings().crrm.move; + if(!s.check_move.call(this, this._get_move())) { return false; } + return true; + }, + move_node : function (obj, ref, position, is_copy, is_prepared, skip_check) { + var s = this._get_settings().crrm.move; + if(!is_prepared) { + if(typeof position === "undefined") { position = s.default_position; } + if(position === "inside" && !s.default_position.match(/^(before|after)$/)) { position = s.default_position; } + return this.__call_old(true, obj, ref, position, is_copy, false, skip_check); + } + // if the move is already prepared + if(s.always_copy === true || (s.always_copy === "multitree" && obj.rt.get_index() !== obj.ot.get_index() )) { + is_copy = true; + } + this.__call_old(true, obj, ref, position, is_copy, true, skip_check); + }, + + cut : function (obj) { + obj = this._get_node(obj, true); + if(!obj || !obj.length) { return false; } + this.data.crrm.cp_nodes = false; + this.data.crrm.ct_nodes = obj; + this.__callback({ "obj" : obj }); + }, + copy : function (obj) { + obj = this._get_node(obj, true); + if(!obj || !obj.length) { return false; } + this.data.crrm.ct_nodes = false; + this.data.crrm.cp_nodes = obj; + this.__callback({ "obj" : obj }); + }, + paste : function (obj) { + obj = this._get_node(obj); + if(!obj || !obj.length) { return false; } + var nodes = this.data.crrm.ct_nodes ? this.data.crrm.ct_nodes : this.data.crrm.cp_nodes; + if(!this.data.crrm.ct_nodes && !this.data.crrm.cp_nodes) { return false; } + if(this.data.crrm.ct_nodes) { this.move_node(this.data.crrm.ct_nodes, obj); this.data.crrm.ct_nodes = false; } + if(this.data.crrm.cp_nodes) { this.move_node(this.data.crrm.cp_nodes, obj, false, true); } + this.__callback({ "obj" : obj, "nodes" : nodes }); + } + } + }); + // include the crr plugin by default + // $.jstree.defaults.plugins.push("crrm"); +})(jQuery); +//*/ + +/* + * jsTree themes plugin + * Handles loading and setting themes, as well as detecting path to themes, etc. + */ +(function ($) { + var themes_loaded = []; + // this variable stores the path to the themes folder - if left as false - it will be autodetected + $.jstree._themes = false; + $.jstree.plugin("themes", { + __init : function () { + this.get_container() + .bind("init.jstree", $.proxy(function () { + var s = this._get_settings().themes; + this.data.themes.dots = s.dots; + this.data.themes.icons = s.icons; + this.set_theme(s.theme, s.url); + }, this)) + .bind("loaded.jstree", $.proxy(function () { + // bound here too, as simple HTML tree's won't honor dots & icons otherwise + if(!this.data.themes.dots) { this.hide_dots(); } + else { this.show_dots(); } + if(!this.data.themes.icons) { this.hide_icons(); } + else { this.show_icons(); } + }, this)); + }, + defaults : { + theme : "default", + url : false, + dots : true, + icons : true + }, + _fn : { + set_theme : function (theme_name, theme_url) { + if(!theme_name) { return false; } + if(!theme_url) { theme_url = $.jstree._themes + theme_name + '/style.css'; } + if($.inArray(theme_url, themes_loaded) == -1) { + $.vakata.css.add_sheet({ "url" : theme_url }); + themes_loaded.push(theme_url); + } + if(this.data.themes.theme != theme_name) { + this.get_container().removeClass('jstree-' + this.data.themes.theme); + this.data.themes.theme = theme_name; + } + this.get_container().addClass('jstree-' + theme_name); + if(!this.data.themes.dots) { this.hide_dots(); } + else { this.show_dots(); } + if(!this.data.themes.icons) { this.hide_icons(); } + else { this.show_icons(); } + this.__callback(); + }, + get_theme : function () { return this.data.themes.theme; }, + + show_dots : function () { this.data.themes.dots = true; this.get_container().children("ul").removeClass("jstree-no-dots"); }, + hide_dots : function () { this.data.themes.dots = false; this.get_container().children("ul").addClass("jstree-no-dots"); }, + toggle_dots : function () { if(this.data.themes.dots) { this.hide_dots(); } else { this.show_dots(); } }, + + show_icons : function () { this.data.themes.icons = true; this.get_container().children("ul").removeClass("jstree-no-icons"); }, + hide_icons : function () { this.data.themes.icons = false; this.get_container().children("ul").addClass("jstree-no-icons"); }, + toggle_icons: function () { if(this.data.themes.icons) { this.hide_icons(); } else { this.show_icons(); } } + } + }); + // autodetect themes path + $(function () { + if($.jstree._themes === false) { + $("script").each(function () { + if(this.src.toString().match(/jquery\.jstree[^\/]*?\.js(\?.*)?$/)) { + $.jstree._themes = this.src.toString().replace(/jquery\.jstree[^\/]*?\.js(\?.*)?$/, "") + 'themes/'; + return false; + } + }); + } + if($.jstree._themes === false) { $.jstree._themes = "themes/"; } + }); + // include the themes plugin by default + $.jstree.defaults.plugins.push("themes"); +})(jQuery); +//*/ + +/* + * jsTree hotkeys plugin + * Enables keyboard navigation for all tree instances + * Depends on the jstree ui & jquery hotkeys plugins + */ +(function ($) { + var bound = []; + function exec(i, event) { + var f = $.jstree._focused(), tmp; + if(f && f.data && f.data.hotkeys && f.data.hotkeys.enabled) { + tmp = f._get_settings().hotkeys[i]; + if(tmp) { return tmp.call(f, event); } + } + } + $.jstree.plugin("hotkeys", { + __init : function () { + if(typeof $.hotkeys === "undefined") { throw "jsTree hotkeys: jQuery hotkeys plugin not included."; } + if(!this.data.ui) { throw "jsTree hotkeys: jsTree UI plugin not included."; } + $.each(this._get_settings().hotkeys, function (i, v) { + if(v !== false && $.inArray(i, bound) == -1) { + $(document).bind("keydown", i, function (event) { return exec(i, event); }); + bound.push(i); + } + }); + this.get_container() + .bind("lock.jstree", $.proxy(function () { + if(this.data.hotkeys.enabled) { this.data.hotkeys.enabled = false; this.data.hotkeys.revert = true; } + }, this)) + .bind("unlock.jstree", $.proxy(function () { + if(this.data.hotkeys.revert) { this.data.hotkeys.enabled = true; } + }, this)); + this.enable_hotkeys(); + }, + defaults : { + "up" : function () { + var o = this.data.ui.hovered || this.data.ui.last_selected || -1; + this.hover_node(this._get_prev(o)); + return false; + }, + "ctrl+up" : function () { + var o = this.data.ui.hovered || this.data.ui.last_selected || -1; + this.hover_node(this._get_prev(o)); + return false; + }, + "shift+up" : function () { + var o = this.data.ui.hovered || this.data.ui.last_selected || -1; + this.hover_node(this._get_prev(o)); + return false; + }, + "down" : function () { + var o = this.data.ui.hovered || this.data.ui.last_selected || -1; + this.hover_node(this._get_next(o)); + return false; + }, + "ctrl+down" : function () { + var o = this.data.ui.hovered || this.data.ui.last_selected || -1; + this.hover_node(this._get_next(o)); + return false; + }, + "shift+down" : function () { + var o = this.data.ui.hovered || this.data.ui.last_selected || -1; + this.hover_node(this._get_next(o)); + return false; + }, + "left" : function () { + var o = this.data.ui.hovered || this.data.ui.last_selected; + if(o) { + if(o.hasClass("jstree-open")) { this.close_node(o); } + else { this.hover_node(this._get_prev(o)); } + } + return false; + }, + "ctrl+left" : function () { + var o = this.data.ui.hovered || this.data.ui.last_selected; + if(o) { + if(o.hasClass("jstree-open")) { this.close_node(o); } + else { this.hover_node(this._get_prev(o)); } + } + return false; + }, + "shift+left" : function () { + var o = this.data.ui.hovered || this.data.ui.last_selected; + if(o) { + if(o.hasClass("jstree-open")) { this.close_node(o); } + else { this.hover_node(this._get_prev(o)); } + } + return false; + }, + "right" : function () { + var o = this.data.ui.hovered || this.data.ui.last_selected; + if(o && o.length) { + if(o.hasClass("jstree-closed")) { this.open_node(o); } + else { this.hover_node(this._get_next(o)); } + } + return false; + }, + "ctrl+right" : function () { + var o = this.data.ui.hovered || this.data.ui.last_selected; + if(o && o.length) { + if(o.hasClass("jstree-closed")) { this.open_node(o); } + else { this.hover_node(this._get_next(o)); } + } + return false; + }, + "shift+right" : function () { + var o = this.data.ui.hovered || this.data.ui.last_selected; + if(o && o.length) { + if(o.hasClass("jstree-closed")) { this.open_node(o); } + else { this.hover_node(this._get_next(o)); } + } + return false; + }, + "space" : function () { + if(this.data.ui.hovered) { this.data.ui.hovered.children("a:eq(0)").click(); } + return false; + }, + "ctrl+space" : function (event) { + event.type = "click"; + if(this.data.ui.hovered) { this.data.ui.hovered.children("a:eq(0)").trigger(event); } + return false; + }, + "shift+space" : function (event) { + event.type = "click"; + if(this.data.ui.hovered) { this.data.ui.hovered.children("a:eq(0)").trigger(event); } + return false; + }, + "f2" : function () { this.rename(this.data.ui.hovered || this.data.ui.last_selected); }, + "del" : function () { this.remove(this.data.ui.hovered || this._get_node(null)); } + }, + _fn : { + enable_hotkeys : function () { + this.data.hotkeys.enabled = true; + }, + disable_hotkeys : function () { + this.data.hotkeys.enabled = false; + } + } + }); +})(jQuery); +//*/ + +/* + * jsTree JSON plugin + * The JSON data store. Datastores are build by overriding the `load_node` and `_is_loaded` functions. + */ +(function ($) { + $.jstree.plugin("json_data", { + __init : function() { + var s = this._get_settings().json_data; + if(s.progressive_unload) { + this.get_container().bind("after_close.jstree", function (e, data) { + data.rslt.obj.children("ul").remove(); + }); + } + }, + defaults : { + // `data` can be a function: + // * accepts two arguments - node being loaded and a callback to pass the result to + // * will be executed in the current tree's scope & ajax won't be supported + data : false, + ajax : false, + correct_state : true, + progressive_render : false, + progressive_unload : false + }, + _fn : { + load_node : function (obj, s_call, e_call) { var _this = this; this.load_node_json(obj, function () { _this.__callback({ "obj" : _this._get_node(obj) }); s_call.call(this); }, e_call); }, + _is_loaded : function (obj) { + var s = this._get_settings().json_data; + obj = this._get_node(obj); + return obj == -1 || !obj || (!s.ajax && !s.progressive_render && !$.isFunction(s.data)) || obj.is(".jstree-open, .jstree-leaf") || obj.children("ul").children("li").length > 0; + }, + refresh : function (obj) { + obj = this._get_node(obj); + var s = this._get_settings().json_data; + if(obj && obj !== -1 && s.progressive_unload && ($.isFunction(s.data) || !!s.ajax)) { + obj.removeData("jstree_children"); + } + return this.__call_old(); + }, + load_node_json : function (obj, s_call, e_call) { + var s = this.get_settings().json_data, d, + error_func = function () {}, + success_func = function () {}; + obj = this._get_node(obj); + + if(obj && obj !== -1 && (s.progressive_render || s.progressive_unload) && !obj.is(".jstree-open, .jstree-leaf") && obj.children("ul").children("li").length === 0 && obj.data("jstree_children")) { + d = this._parse_json(obj.data("jstree_children"), obj); + if(d) { + obj.append(d); + if(!s.progressive_unload) { obj.removeData("jstree_children"); } + } + this.clean_node(obj); + if(s_call) { s_call.call(this); } + return; + } + + if(obj && obj !== -1) { + if(obj.data("jstree_is_loading")) { return; } + else { obj.data("jstree_is_loading",true); } + } + switch(!0) { + case (!s.data && !s.ajax): throw "Neither data nor ajax settings supplied."; + // function option added here for easier model integration (also supporting async - see callback) + case ($.isFunction(s.data)): + s.data.call(this, obj, $.proxy(function (d) { + d = this._parse_json(d, obj); + if(!d) { + if(obj === -1 || !obj) { + if(s.correct_state) { this.get_container().children("ul").empty(); } + } + else { + obj.children("a.jstree-loading").removeClass("jstree-loading"); + obj.removeData("jstree_is_loading"); + if(s.correct_state) { this.correct_state(obj); } + } + if(e_call) { e_call.call(this); } + } + else { + if(obj === -1 || !obj) { this.get_container().children("ul").empty().append(d.children()); } + else { obj.append(d).children("a.jstree-loading").removeClass("jstree-loading"); obj.removeData("jstree_is_loading"); } + this.clean_node(obj); + if(s_call) { s_call.call(this); } + } + }, this)); + break; + case (!!s.data && !s.ajax) || (!!s.data && !!s.ajax && (!obj || obj === -1)): + if(!obj || obj == -1) { + d = this._parse_json(s.data, obj); + if(d) { + this.get_container().children("ul").empty().append(d.children()); + this.clean_node(); + } + else { + if(s.correct_state) { this.get_container().children("ul").empty(); } + } + } + if(s_call) { s_call.call(this); } + break; + case (!s.data && !!s.ajax) || (!!s.data && !!s.ajax && obj && obj !== -1): + error_func = function (x, t, e) { + var ef = this.get_settings().json_data.ajax.error; + if(ef) { ef.call(this, x, t, e); } + if(obj != -1 && obj.length) { + obj.children("a.jstree-loading").removeClass("jstree-loading"); + obj.removeData("jstree_is_loading"); + if(t === "success" && s.correct_state) { this.correct_state(obj); } + } + else { + if(t === "success" && s.correct_state) { this.get_container().children("ul").empty(); } + } + if(e_call) { e_call.call(this); } + }; + success_func = function (d, t, x) { + var sf = this.get_settings().json_data.ajax.success; + if(sf) { d = sf.call(this,d,t,x) || d; } + if(d === "" || (d && d.toString && d.toString().replace(/^[\s\n]+$/,"") === "") || (!$.isArray(d) && !$.isPlainObject(d))) { + return error_func.call(this, x, t, ""); + } + d = this._parse_json(d, obj); + if(d) { + if(obj === -1 || !obj) { this.get_container().children("ul").empty().append(d.children()); } + else { obj.append(d).children("a.jstree-loading").removeClass("jstree-loading"); obj.removeData("jstree_is_loading"); } + this.clean_node(obj); + if(s_call) { s_call.call(this); } + } + else { + if(obj === -1 || !obj) { + if(s.correct_state) { + this.get_container().children("ul").empty(); + if(s_call) { s_call.call(this); } + } + } + else { + obj.children("a.jstree-loading").removeClass("jstree-loading"); + obj.removeData("jstree_is_loading"); + if(s.correct_state) { + this.correct_state(obj); + if(s_call) { s_call.call(this); } + } + } + } + }; + s.ajax.context = this; + s.ajax.error = error_func; + s.ajax.success = success_func; + if(!s.ajax.dataType) { s.ajax.dataType = "json"; } + if($.isFunction(s.ajax.url)) { s.ajax.url = s.ajax.url.call(this, obj); } + if($.isFunction(s.ajax.data)) { s.ajax.data = s.ajax.data.call(this, obj); } + $.ajax(s.ajax); + break; + } + }, + _parse_json : function (js, obj, is_callback) { + var d = false, + p = this._get_settings(), + s = p.json_data, + t = p.core.html_titles, + tmp, i, j, ul1, ul2; + + if(!js) { return d; } + if(s.progressive_unload && obj && obj !== -1) { + obj.data("jstree_children", d); + } + if($.isArray(js)) { + d = $(); + if(!js.length) { return false; } + for(i = 0, j = js.length; i < j; i++) { + tmp = this._parse_json(js[i], obj, true); + if(tmp.length) { d = d.add(tmp); } + } + } + else { + if(typeof js == "string") { js = { data : js }; } + if(!js.data && js.data !== "") { return d; } + d = $("
          • "); + if(js.attr) { d.attr(js.attr); } + if(js.metadata) { d.data(js.metadata); } + if(js.state) { d.addClass("jstree-" + js.state); } + if(!$.isArray(js.data)) { tmp = js.data; js.data = []; js.data.push(tmp); } + $.each(js.data, function (i, m) { + tmp = $(""); + if($.isFunction(m)) { m = m.call(this, js); } + if(typeof m == "string") { tmp.attr('href','#')[ t ? "html" : "text" ](m); } + else { + if(!m.attr) { m.attr = {}; } + if(!m.attr.href) { m.attr.href = '#'; } + tmp.attr(m.attr)[ t ? "html" : "text" ](m.title); + if(m.language) { tmp.addClass(m.language); } + } + tmp.prepend(" "); + if(!m.icon && js.icon) { m.icon = js.icon; } + if(m.icon) { + if(m.icon.indexOf("/") === -1) { tmp.children("ins").addClass(m.icon); } + else { tmp.children("ins").css("background","url('" + m.icon + "') center center no-repeat"); } + } + d.append(tmp); + }); + d.prepend(" "); + if(js.children) { + if(s.progressive_render && js.state !== "open") { + d.addClass("jstree-closed").data("jstree_children", js.children); + } + else { + if(s.progressive_unload) { d.data("jstree_children", js.children); } + if($.isArray(js.children) && js.children.length) { + tmp = this._parse_json(js.children, obj, true); + if(tmp.length) { + ul2 = $("
              "); + ul2.append(tmp); + d.append(ul2); + } + } + } + } + } + if(!is_callback) { + ul1 = $("
                "); + ul1.append(d); + d = ul1; + } + return d; + }, + get_json : function (obj, li_attr, a_attr, is_callback) { + var result = [], + s = this._get_settings(), + _this = this, + tmp1, tmp2, li, a, t, lang; + obj = this._get_node(obj); + if(!obj || obj === -1) { obj = this.get_container().find("> ul > li"); } + li_attr = $.isArray(li_attr) ? li_attr : [ "id", "class" ]; + if(!is_callback && this.data.types) { li_attr.push(s.types.type_attr); } + a_attr = $.isArray(a_attr) ? a_attr : [ ]; + + obj.each(function () { + li = $(this); + tmp1 = { data : [] }; + if(li_attr.length) { tmp1.attr = { }; } + $.each(li_attr, function (i, v) { + tmp2 = li.attr(v); + if(tmp2 && tmp2.length && tmp2.replace(/jstree[^ ]*/ig,'').length) { + tmp1.attr[v] = (" " + tmp2).replace(/ jstree[^ ]*/ig,'').replace(/\s+$/ig," ").replace(/^ /,"").replace(/ $/,""); + } + }); + if(li.hasClass("jstree-open")) { tmp1.state = "open"; } + if(li.hasClass("jstree-closed")) { tmp1.state = "closed"; } + if(li.data()) { tmp1.metadata = li.data(); } + a = li.children("a"); + a.each(function () { + t = $(this); + if( + a_attr.length || + $.inArray("languages", s.plugins) !== -1 || + t.children("ins").get(0).style.backgroundImage.length || + (t.children("ins").get(0).className && t.children("ins").get(0).className.replace(/jstree[^ ]*|$/ig,'').length) + ) { + lang = false; + if($.inArray("languages", s.plugins) !== -1 && $.isArray(s.languages) && s.languages.length) { + $.each(s.languages, function (l, lv) { + if(t.hasClass(lv)) { + lang = lv; + return false; + } + }); + } + tmp2 = { attr : { }, title : _this.get_text(t, lang) }; + $.each(a_attr, function (k, z) { + tmp2.attr[z] = (" " + (t.attr(z) || "")).replace(/ jstree[^ ]*/ig,'').replace(/\s+$/ig," ").replace(/^ /,"").replace(/ $/,""); + }); + if($.inArray("languages", s.plugins) !== -1 && $.isArray(s.languages) && s.languages.length) { + $.each(s.languages, function (k, z) { + if(t.hasClass(z)) { tmp2.language = z; return true; } + }); + } + if(t.children("ins").get(0).className.replace(/jstree[^ ]*|$/ig,'').replace(/^\s+$/ig,"").length) { + tmp2.icon = t.children("ins").get(0).className.replace(/jstree[^ ]*|$/ig,'').replace(/\s+$/ig," ").replace(/^ /,"").replace(/ $/,""); + } + if(t.children("ins").get(0).style.backgroundImage.length) { + tmp2.icon = t.children("ins").get(0).style.backgroundImage.replace("url(","").replace(")",""); + } + } + else { + tmp2 = _this.get_text(t); + } + if(a.length > 1) { tmp1.data.push(tmp2); } + else { tmp1.data = tmp2; } + }); + li = li.find("> ul > li"); + if(li.length) { tmp1.children = _this.get_json(li, li_attr, a_attr, true); } + result.push(tmp1); + }); + return result; + } + } + }); +})(jQuery); +//*/ + +/* + * jsTree languages plugin + * Adds support for multiple language versions in one tree + * This basically allows for many titles coexisting in one node, but only one of them being visible at any given time + * This is useful for maintaining the same structure in many languages (hence the name of the plugin) + */ +(function ($) { + $.jstree.plugin("languages", { + __init : function () { this._load_css(); }, + defaults : [], + _fn : { + set_lang : function (i) { + var langs = this._get_settings().languages, + st = false, + selector = ".jstree-" + this.get_index() + ' a'; + if(!$.isArray(langs) || langs.length === 0) { return false; } + if($.inArray(i,langs) == -1) { + if(!!langs[i]) { i = langs[i]; } + else { return false; } + } + if(i == this.data.languages.current_language) { return true; } + st = $.vakata.css.get_css(selector + "." + this.data.languages.current_language, false, this.data.languages.language_css); + if(st !== false) { st.style.display = "none"; } + st = $.vakata.css.get_css(selector + "." + i, false, this.data.languages.language_css); + if(st !== false) { st.style.display = ""; } + this.data.languages.current_language = i; + this.__callback(i); + return true; + }, + get_lang : function () { + return this.data.languages.current_language; + }, + _get_string : function (key, lang) { + var langs = this._get_settings().languages, + s = this._get_settings().core.strings; + if($.isArray(langs) && langs.length) { + lang = (lang && $.inArray(lang,langs) != -1) ? lang : this.data.languages.current_language; + } + if(s[lang] && s[lang][key]) { return s[lang][key]; } + if(s[key]) { return s[key]; } + return key; + }, + get_text : function (obj, lang) { + obj = this._get_node(obj) || this.data.ui.last_selected; + if(!obj.size()) { return false; } + var langs = this._get_settings().languages, + s = this._get_settings().core.html_titles; + if($.isArray(langs) && langs.length) { + lang = (lang && $.inArray(lang,langs) != -1) ? lang : this.data.languages.current_language; + obj = obj.children("a." + lang); + } + else { obj = obj.children("a:eq(0)"); } + if(s) { + obj = obj.clone(); + obj.children("INS").remove(); + return obj.html(); + } + else { + obj = obj.contents().filter(function() { return this.nodeType == 3; })[0]; + return obj.nodeValue; + } + }, + set_text : function (obj, val, lang) { + obj = this._get_node(obj) || this.data.ui.last_selected; + if(!obj.size()) { return false; } + var langs = this._get_settings().languages, + s = this._get_settings().core.html_titles, + tmp; + if($.isArray(langs) && langs.length) { + lang = (lang && $.inArray(lang,langs) != -1) ? lang : this.data.languages.current_language; + obj = obj.children("a." + lang); + } + else { obj = obj.children("a:eq(0)"); } + if(s) { + tmp = obj.children("INS").clone(); + obj.html(val).prepend(tmp); + this.__callback({ "obj" : obj, "name" : val, "lang" : lang }); + return true; + } + else { + obj = obj.contents().filter(function() { return this.nodeType == 3; })[0]; + this.__callback({ "obj" : obj, "name" : val, "lang" : lang }); + return (obj.nodeValue = val); + } + }, + _load_css : function () { + var langs = this._get_settings().languages, + str = "/* languages css */", + selector = ".jstree-" + this.get_index() + ' a', + ln; + if($.isArray(langs) && langs.length) { + this.data.languages.current_language = langs[0]; + for(ln = 0; ln < langs.length; ln++) { + str += selector + "." + langs[ln] + " {"; + if(langs[ln] != this.data.languages.current_language) { str += " display:none; "; } + str += " } "; + } + this.data.languages.language_css = $.vakata.css.add_sheet({ 'str' : str, 'title' : "jstree-languages" }); + } + }, + create_node : function (obj, position, js, callback) { + var t = this.__call_old(true, obj, position, js, function (t) { + var langs = this._get_settings().languages, + a = t.children("a"), + ln; + if($.isArray(langs) && langs.length) { + for(ln = 0; ln < langs.length; ln++) { + if(!a.is("." + langs[ln])) { + t.append(a.eq(0).clone().removeClass(langs.join(" ")).addClass(langs[ln])); + } + } + a.not("." + langs.join(", .")).remove(); + } + if(callback) { callback.call(this, t); } + }); + return t; + } + } + }); +})(jQuery); +//*/ + +/* + * jsTree cookies plugin + * Stores the currently opened/selected nodes in a cookie and then restores them + * Depends on the jquery.cookie plugin + */ +(function ($) { + $.jstree.plugin("cookies", { + __init : function () { + if(typeof $.cookie === "undefined") { throw "jsTree cookie: jQuery cookie plugin not included."; } + + var s = this._get_settings().cookies, + tmp; + if(!!s.save_loaded) { + tmp = $.cookie(s.save_loaded); + if(tmp && tmp.length) { this.data.core.to_load = tmp.split(","); } + } + if(!!s.save_opened) { + tmp = $.cookie(s.save_opened); + if(tmp && tmp.length) { this.data.core.to_open = tmp.split(","); } + } + if(!!s.save_selected) { + tmp = $.cookie(s.save_selected); + if(tmp && tmp.length && this.data.ui) { this.data.ui.to_select = tmp.split(","); } + } + this.get_container() + .one( ( this.data.ui ? "reselect" : "reopen" ) + ".jstree", $.proxy(function () { + this.get_container() + .bind("open_node.jstree close_node.jstree select_node.jstree deselect_node.jstree", $.proxy(function (e) { + if(this._get_settings().cookies.auto_save) { this.save_cookie((e.handleObj.namespace + e.handleObj.type).replace("jstree","")); } + }, this)); + }, this)); + }, + defaults : { + save_loaded : "jstree_load", + save_opened : "jstree_open", + save_selected : "jstree_select", + auto_save : true, + cookie_options : {} + }, + _fn : { + save_cookie : function (c) { + if(this.data.core.refreshing) { return; } + var s = this._get_settings().cookies; + if(!c) { // if called manually and not by event + if(s.save_loaded) { + this.save_loaded(); + $.cookie(s.save_loaded, this.data.core.to_load.join(","), s.cookie_options); + } + if(s.save_opened) { + this.save_opened(); + $.cookie(s.save_opened, this.data.core.to_open.join(","), s.cookie_options); + } + if(s.save_selected && this.data.ui) { + this.save_selected(); + $.cookie(s.save_selected, this.data.ui.to_select.join(","), s.cookie_options); + } + return; + } + switch(c) { + case "open_node": + case "close_node": + if(!!s.save_opened) { + this.save_opened(); + $.cookie(s.save_opened, this.data.core.to_open.join(","), s.cookie_options); + } + if(!!s.save_loaded) { + this.save_loaded(); + $.cookie(s.save_loaded, this.data.core.to_load.join(","), s.cookie_options); + } + break; + case "select_node": + case "deselect_node": + if(!!s.save_selected && this.data.ui) { + this.save_selected(); + $.cookie(s.save_selected, this.data.ui.to_select.join(","), s.cookie_options); + } + break; + } + } + } + }); + // include cookies by default + // $.jstree.defaults.plugins.push("cookies"); +})(jQuery); +//*/ + +/* + * jsTree sort plugin + * Sorts items alphabetically (or using any other function) + */ +(function ($) { + $.jstree.plugin("sort", { + __init : function () { + this.get_container() + .bind("load_node.jstree", $.proxy(function (e, data) { + var obj = this._get_node(data.rslt.obj); + obj = obj === -1 ? this.get_container().children("ul") : obj.children("ul"); + this.sort(obj); + }, this)) + .bind("rename_node.jstree create_node.jstree create.jstree", $.proxy(function (e, data) { + this.sort(data.rslt.obj.parent()); + }, this)) + .bind("move_node.jstree", $.proxy(function (e, data) { + var m = data.rslt.np == -1 ? this.get_container() : data.rslt.np; + this.sort(m.children("ul")); + }, this)); + }, + defaults : function (a, b) { return this.get_text(a) > this.get_text(b) ? 1 : -1; }, + _fn : { + sort : function (obj) { + var s = this._get_settings().sort, + t = this; + obj.append($.makeArray(obj.children("li")).sort($.proxy(s, t))); + obj.find("> li > ul").each(function() { t.sort($(this)); }); + this.clean_node(obj); + } + } + }); +})(jQuery); +//*/ + +/* + * jsTree DND plugin + * Drag and drop plugin for moving/copying nodes + */ +(function ($) { + var o = false, + r = false, + m = false, + ml = false, + sli = false, + sti = false, + dir1 = false, + dir2 = false, + last_pos = false; + $.vakata.dnd = { + is_down : false, + is_drag : false, + helper : false, + scroll_spd : 10, + init_x : 0, + init_y : 0, + threshold : 5, + helper_left : 5, + helper_top : 10, + user_data : {}, + + drag_start : function (e, data, html) { + if($.vakata.dnd.is_drag) { $.vakata.drag_stop({}); } + try { + e.currentTarget.unselectable = "on"; + e.currentTarget.onselectstart = function() { return false; }; + if(e.currentTarget.style) { e.currentTarget.style.MozUserSelect = "none"; } + } catch(err) { } + $.vakata.dnd.init_x = e.pageX; + $.vakata.dnd.init_y = e.pageY; + $.vakata.dnd.user_data = data; + $.vakata.dnd.is_down = true; + $.vakata.dnd.helper = $("
                ").html(html); //.fadeTo(10,0.25); + $(document).bind("mousemove", $.vakata.dnd.drag); + $(document).bind("mouseup", $.vakata.dnd.drag_stop); + return false; + }, + drag : function (e) { + if(!$.vakata.dnd.is_down) { return; } + if(!$.vakata.dnd.is_drag) { + if(Math.abs(e.pageX - $.vakata.dnd.init_x) > 5 || Math.abs(e.pageY - $.vakata.dnd.init_y) > 5) { + $.vakata.dnd.helper.appendTo("body"); + $.vakata.dnd.is_drag = true; + $(document).triggerHandler("drag_start.vakata", { "event" : e, "data" : $.vakata.dnd.user_data }); + } + else { return; } + } + + // maybe use a scrolling parent element instead of document? + if(e.type === "mousemove") { // thought of adding scroll in order to move the helper, but mouse poisition is n/a + var d = $(document), t = d.scrollTop(), l = d.scrollLeft(); + if(e.pageY - t < 20) { + if(sti && dir1 === "down") { clearInterval(sti); sti = false; } + if(!sti) { dir1 = "up"; sti = setInterval(function () { $(document).scrollTop($(document).scrollTop() - $.vakata.dnd.scroll_spd); }, 150); } + } + else { + if(sti && dir1 === "up") { clearInterval(sti); sti = false; } + } + if($(window).height() - (e.pageY - t) < 20) { + if(sti && dir1 === "up") { clearInterval(sti); sti = false; } + if(!sti) { dir1 = "down"; sti = setInterval(function () { $(document).scrollTop($(document).scrollTop() + $.vakata.dnd.scroll_spd); }, 150); } + } + else { + if(sti && dir1 === "down") { clearInterval(sti); sti = false; } + } + + if(e.pageX - l < 20) { + if(sli && dir2 === "right") { clearInterval(sli); sli = false; } + if(!sli) { dir2 = "left"; sli = setInterval(function () { $(document).scrollLeft($(document).scrollLeft() - $.vakata.dnd.scroll_spd); }, 150); } + } + else { + if(sli && dir2 === "left") { clearInterval(sli); sli = false; } + } + if($(window).width() - (e.pageX - l) < 20) { + if(sli && dir2 === "left") { clearInterval(sli); sli = false; } + if(!sli) { dir2 = "right"; sli = setInterval(function () { $(document).scrollLeft($(document).scrollLeft() + $.vakata.dnd.scroll_spd); }, 150); } + } + else { + if(sli && dir2 === "right") { clearInterval(sli); sli = false; } + } + } + + $.vakata.dnd.helper.css({ left : (e.pageX + $.vakata.dnd.helper_left) + "px", top : (e.pageY + $.vakata.dnd.helper_top) + "px" }); + $(document).triggerHandler("drag.vakata", { "event" : e, "data" : $.vakata.dnd.user_data }); + }, + drag_stop : function (e) { + if(sli) { clearInterval(sli); } + if(sti) { clearInterval(sti); } + $(document).unbind("mousemove", $.vakata.dnd.drag); + $(document).unbind("mouseup", $.vakata.dnd.drag_stop); + $(document).triggerHandler("drag_stop.vakata", { "event" : e, "data" : $.vakata.dnd.user_data }); + $.vakata.dnd.helper.remove(); + $.vakata.dnd.init_x = 0; + $.vakata.dnd.init_y = 0; + $.vakata.dnd.user_data = {}; + $.vakata.dnd.is_down = false; + $.vakata.dnd.is_drag = false; + } + }; + $(function() { + var css_string = '#vakata-dragged { display:block; margin:0 0 0 0; padding:4px 4px 4px 24px; position:absolute; top:-2000px; line-height:16px; z-index:10000; } '; + $.vakata.css.add_sheet({ str : css_string, title : "vakata" }); + }); + + $.jstree.plugin("dnd", { + __init : function () { + this.data.dnd = { + active : false, + after : false, + inside : false, + before : false, + off : false, + prepared : false, + w : 0, + to1 : false, + to2 : false, + cof : false, + cw : false, + ch : false, + i1 : false, + i2 : false, + mto : false + }; + this.get_container() + .bind("mouseenter.jstree", $.proxy(function (e) { + if($.vakata.dnd.is_drag && $.vakata.dnd.user_data.jstree) { + if(this.data.themes) { + m.attr("class", "jstree-" + this.data.themes.theme); + if(ml) { ml.attr("class", "jstree-" + this.data.themes.theme); } + $.vakata.dnd.helper.attr("class", "jstree-dnd-helper jstree-" + this.data.themes.theme); + } + //if($(e.currentTarget).find("> ul > li").length === 0) { + if(e.currentTarget === e.target && $.vakata.dnd.user_data.obj && $($.vakata.dnd.user_data.obj).length && $($.vakata.dnd.user_data.obj).parents(".jstree:eq(0)")[0] !== e.target) { // node should not be from the same tree + var tr = $.jstree._reference(e.target), dc; + if(tr.data.dnd.foreign) { + dc = tr._get_settings().dnd.drag_check.call(this, { "o" : o, "r" : tr.get_container(), is_root : true }); + if(dc === true || dc.inside === true || dc.before === true || dc.after === true) { + $.vakata.dnd.helper.children("ins").attr("class","jstree-ok"); + } + } + else { + tr.prepare_move(o, tr.get_container(), "last"); + if(tr.check_move()) { + $.vakata.dnd.helper.children("ins").attr("class","jstree-ok"); + } + } + } + } + }, this)) + .bind("mouseup.jstree", $.proxy(function (e) { + //if($.vakata.dnd.is_drag && $.vakata.dnd.user_data.jstree && $(e.currentTarget).find("> ul > li").length === 0) { + if($.vakata.dnd.is_drag && $.vakata.dnd.user_data.jstree && e.currentTarget === e.target && $.vakata.dnd.user_data.obj && $($.vakata.dnd.user_data.obj).length && $($.vakata.dnd.user_data.obj).parents(".jstree:eq(0)")[0] !== e.target) { // node should not be from the same tree + var tr = $.jstree._reference(e.currentTarget), dc; + if(tr.data.dnd.foreign) { + dc = tr._get_settings().dnd.drag_check.call(this, { "o" : o, "r" : tr.get_container(), is_root : true }); + if(dc === true || dc.inside === true || dc.before === true || dc.after === true) { + tr._get_settings().dnd.drag_finish.call(this, { "o" : o, "r" : tr.get_container(), is_root : true }); + } + } + else { + tr.move_node(o, tr.get_container(), "last", e[tr._get_settings().dnd.copy_modifier + "Key"]); + } + } + }, this)) + .bind("mouseleave.jstree", $.proxy(function (e) { + if(e.relatedTarget && e.relatedTarget.id && e.relatedTarget.id === "jstree-marker-line") { + return false; + } + if($.vakata.dnd.is_drag && $.vakata.dnd.user_data.jstree) { + if(this.data.dnd.i1) { clearInterval(this.data.dnd.i1); } + if(this.data.dnd.i2) { clearInterval(this.data.dnd.i2); } + if(this.data.dnd.to1) { clearTimeout(this.data.dnd.to1); } + if(this.data.dnd.to2) { clearTimeout(this.data.dnd.to2); } + if($.vakata.dnd.helper.children("ins").hasClass("jstree-ok")) { + $.vakata.dnd.helper.children("ins").attr("class","jstree-invalid"); + } + } + }, this)) + .bind("mousemove.jstree", $.proxy(function (e) { + if($.vakata.dnd.is_drag && $.vakata.dnd.user_data.jstree) { + var cnt = this.get_container()[0]; + + // Horizontal scroll + if(e.pageX + 24 > this.data.dnd.cof.left + this.data.dnd.cw) { + if(this.data.dnd.i1) { clearInterval(this.data.dnd.i1); } + this.data.dnd.i1 = setInterval($.proxy(function () { this.scrollLeft += $.vakata.dnd.scroll_spd; }, cnt), 100); + } + else if(e.pageX - 24 < this.data.dnd.cof.left) { + if(this.data.dnd.i1) { clearInterval(this.data.dnd.i1); } + this.data.dnd.i1 = setInterval($.proxy(function () { this.scrollLeft -= $.vakata.dnd.scroll_spd; }, cnt), 100); + } + else { + if(this.data.dnd.i1) { clearInterval(this.data.dnd.i1); } + } + + // Vertical scroll + if(e.pageY + 24 > this.data.dnd.cof.top + this.data.dnd.ch) { + if(this.data.dnd.i2) { clearInterval(this.data.dnd.i2); } + this.data.dnd.i2 = setInterval($.proxy(function () { this.scrollTop += $.vakata.dnd.scroll_spd; }, cnt), 100); + } + else if(e.pageY - 24 < this.data.dnd.cof.top) { + if(this.data.dnd.i2) { clearInterval(this.data.dnd.i2); } + this.data.dnd.i2 = setInterval($.proxy(function () { this.scrollTop -= $.vakata.dnd.scroll_spd; }, cnt), 100); + } + else { + if(this.data.dnd.i2) { clearInterval(this.data.dnd.i2); } + } + + } + }, this)) + .bind("scroll.jstree", $.proxy(function (e) { + if($.vakata.dnd.is_drag && $.vakata.dnd.user_data.jstree && m && ml) { + m.hide(); + ml.hide(); + } + }, this)) + .delegate("a", "mousedown.jstree", $.proxy(function (e) { + if(e.which === 1) { + this.start_drag(e.currentTarget, e); + return false; + } + }, this)) + .delegate("a", "mouseenter.jstree", $.proxy(function (e) { + if($.vakata.dnd.is_drag && $.vakata.dnd.user_data.jstree) { + this.dnd_enter(e.currentTarget); + } + }, this)) + .delegate("a", "mousemove.jstree", $.proxy(function (e) { + if($.vakata.dnd.is_drag && $.vakata.dnd.user_data.jstree) { + if(!r || !r.length || r.children("a")[0] !== e.currentTarget) { + this.dnd_enter(e.currentTarget); + } + if(typeof this.data.dnd.off.top === "undefined") { this.data.dnd.off = $(e.target).offset(); } + this.data.dnd.w = (e.pageY - (this.data.dnd.off.top || 0)) % this.data.core.li_height; + if(this.data.dnd.w < 0) { this.data.dnd.w += this.data.core.li_height; } + this.dnd_show(); + } + }, this)) + .delegate("a", "mouseleave.jstree", $.proxy(function (e) { + if($.vakata.dnd.is_drag && $.vakata.dnd.user_data.jstree) { + if(e.relatedTarget && e.relatedTarget.id && e.relatedTarget.id === "jstree-marker-line") { + return false; + } + if(m) { m.hide(); } + if(ml) { ml.hide(); } + /* + var ec = $(e.currentTarget).closest("li"), + er = $(e.relatedTarget).closest("li"); + if(er[0] !== ec.prev()[0] && er[0] !== ec.next()[0]) { + if(m) { m.hide(); } + if(ml) { ml.hide(); } + } + */ + this.data.dnd.mto = setTimeout( + (function (t) { return function () { t.dnd_leave(e); }; })(this), + 0); + } + }, this)) + .delegate("a", "mouseup.jstree", $.proxy(function (e) { + if($.vakata.dnd.is_drag && $.vakata.dnd.user_data.jstree) { + this.dnd_finish(e); + } + }, this)); + + $(document) + .bind("drag_stop.vakata", $.proxy(function () { + if(this.data.dnd.to1) { clearTimeout(this.data.dnd.to1); } + if(this.data.dnd.to2) { clearTimeout(this.data.dnd.to2); } + if(this.data.dnd.i1) { clearInterval(this.data.dnd.i1); } + if(this.data.dnd.i2) { clearInterval(this.data.dnd.i2); } + this.data.dnd.after = false; + this.data.dnd.before = false; + this.data.dnd.inside = false; + this.data.dnd.off = false; + this.data.dnd.prepared = false; + this.data.dnd.w = false; + this.data.dnd.to1 = false; + this.data.dnd.to2 = false; + this.data.dnd.i1 = false; + this.data.dnd.i2 = false; + this.data.dnd.active = false; + this.data.dnd.foreign = false; + if(m) { m.css({ "top" : "-2000px" }); } + if(ml) { ml.css({ "top" : "-2000px" }); } + }, this)) + .bind("drag_start.vakata", $.proxy(function (e, data) { + if(data.data.jstree) { + var et = $(data.event.target); + if(et.closest(".jstree").hasClass("jstree-" + this.get_index())) { + this.dnd_enter(et); + } + } + }, this)); + /* + .bind("keydown.jstree-" + this.get_index() + " keyup.jstree-" + this.get_index(), $.proxy(function(e) { + if($.vakata.dnd.is_drag && $.vakata.dnd.user_data.jstree && !this.data.dnd.foreign) { + var h = $.vakata.dnd.helper.children("ins"); + if(e[this._get_settings().dnd.copy_modifier + "Key"] && h.hasClass("jstree-ok")) { + h.parent().html(h.parent().html().replace(/ \(Copy\)$/, "") + " (Copy)"); + } + else { + h.parent().html(h.parent().html().replace(/ \(Copy\)$/, "")); + } + } + }, this)); */ + + + + var s = this._get_settings().dnd; + if(s.drag_target) { + $(document) + .delegate(s.drag_target, "mousedown.jstree-" + this.get_index(), $.proxy(function (e) { + o = e.target; + $.vakata.dnd.drag_start(e, { jstree : true, obj : e.target }, "" + $(e.target).text() ); + if(this.data.themes) { + if(m) { m.attr("class", "jstree-" + this.data.themes.theme); } + if(ml) { ml.attr("class", "jstree-" + this.data.themes.theme); } + $.vakata.dnd.helper.attr("class", "jstree-dnd-helper jstree-" + this.data.themes.theme); + } + $.vakata.dnd.helper.children("ins").attr("class","jstree-invalid"); + var cnt = this.get_container(); + this.data.dnd.cof = cnt.offset(); + this.data.dnd.cw = parseInt(cnt.width(),10); + this.data.dnd.ch = parseInt(cnt.height(),10); + this.data.dnd.foreign = true; + e.preventDefault(); + }, this)); + } + if(s.drop_target) { + $(document) + .delegate(s.drop_target, "mouseenter.jstree-" + this.get_index(), $.proxy(function (e) { + if(this.data.dnd.active && this._get_settings().dnd.drop_check.call(this, { "o" : o, "r" : $(e.target), "e" : e })) { + $.vakata.dnd.helper.children("ins").attr("class","jstree-ok"); + } + }, this)) + .delegate(s.drop_target, "mouseleave.jstree-" + this.get_index(), $.proxy(function (e) { + if(this.data.dnd.active) { + $.vakata.dnd.helper.children("ins").attr("class","jstree-invalid"); + } + }, this)) + .delegate(s.drop_target, "mouseup.jstree-" + this.get_index(), $.proxy(function (e) { + if(this.data.dnd.active && $.vakata.dnd.helper.children("ins").hasClass("jstree-ok")) { + this._get_settings().dnd.drop_finish.call(this, { "o" : o, "r" : $(e.target), "e" : e }); + } + }, this)); + } + }, + defaults : { + copy_modifier : "ctrl", + check_timeout : 100, + open_timeout : 500, + drop_target : ".jstree-drop", + drop_check : function (data) { return true; }, + drop_finish : $.noop, + drag_target : ".jstree-draggable", + drag_finish : $.noop, + drag_check : function (data) { return { after : false, before : false, inside : true }; } + }, + _fn : { + dnd_prepare : function () { + if(!r || !r.length) { return; } + this.data.dnd.off = r.offset(); + if(this._get_settings().core.rtl) { + this.data.dnd.off.right = this.data.dnd.off.left + r.width(); + } + if(this.data.dnd.foreign) { + var a = this._get_settings().dnd.drag_check.call(this, { "o" : o, "r" : r }); + this.data.dnd.after = a.after; + this.data.dnd.before = a.before; + this.data.dnd.inside = a.inside; + this.data.dnd.prepared = true; + return this.dnd_show(); + } + this.prepare_move(o, r, "before"); + this.data.dnd.before = this.check_move(); + this.prepare_move(o, r, "after"); + this.data.dnd.after = this.check_move(); + if(this._is_loaded(r)) { + this.prepare_move(o, r, "inside"); + this.data.dnd.inside = this.check_move(); + } + else { + this.data.dnd.inside = false; + } + this.data.dnd.prepared = true; + return this.dnd_show(); + }, + dnd_show : function () { + if(!this.data.dnd.prepared) { return; } + var o = ["before","inside","after"], + r = false, + rtl = this._get_settings().core.rtl, + pos; + if(this.data.dnd.w < this.data.core.li_height/3) { o = ["before","inside","after"]; } + else if(this.data.dnd.w <= this.data.core.li_height*2/3) { + o = this.data.dnd.w < this.data.core.li_height/2 ? ["inside","before","after"] : ["inside","after","before"]; + } + else { o = ["after","inside","before"]; } + $.each(o, $.proxy(function (i, val) { + if(this.data.dnd[val]) { + $.vakata.dnd.helper.children("ins").attr("class","jstree-ok"); + r = val; + return false; + } + }, this)); + if(r === false) { $.vakata.dnd.helper.children("ins").attr("class","jstree-invalid"); } + + pos = rtl ? (this.data.dnd.off.right - 18) : (this.data.dnd.off.left + 10); + switch(r) { + case "before": + m.css({ "left" : pos + "px", "top" : (this.data.dnd.off.top - 6) + "px" }).show(); + if(ml) { ml.css({ "left" : (pos + 8) + "px", "top" : (this.data.dnd.off.top - 1) + "px" }).show(); } + break; + case "after": + m.css({ "left" : pos + "px", "top" : (this.data.dnd.off.top + this.data.core.li_height - 6) + "px" }).show(); + if(ml) { ml.css({ "left" : (pos + 8) + "px", "top" : (this.data.dnd.off.top + this.data.core.li_height - 1) + "px" }).show(); } + break; + case "inside": + m.css({ "left" : pos + ( rtl ? -4 : 4) + "px", "top" : (this.data.dnd.off.top + this.data.core.li_height/2 - 5) + "px" }).show(); + if(ml) { ml.hide(); } + break; + default: + m.hide(); + if(ml) { ml.hide(); } + break; + } + last_pos = r; + return r; + }, + dnd_open : function () { + this.data.dnd.to2 = false; + this.open_node(r, $.proxy(this.dnd_prepare,this), true); + }, + dnd_finish : function (e) { + if(this.data.dnd.foreign) { + if(this.data.dnd.after || this.data.dnd.before || this.data.dnd.inside) { + this._get_settings().dnd.drag_finish.call(this, { "o" : o, "r" : r, "p" : last_pos }); + } + } + else { + this.dnd_prepare(); + this.move_node(o, r, last_pos, e[this._get_settings().dnd.copy_modifier + "Key"]); + } + o = false; + r = false; + m.hide(); + if(ml) { ml.hide(); } + }, + dnd_enter : function (obj) { + if(this.data.dnd.mto) { + clearTimeout(this.data.dnd.mto); + this.data.dnd.mto = false; + } + var s = this._get_settings().dnd; + this.data.dnd.prepared = false; + r = this._get_node(obj); + if(s.check_timeout) { + // do the calculations after a minimal timeout (users tend to drag quickly to the desired location) + if(this.data.dnd.to1) { clearTimeout(this.data.dnd.to1); } + this.data.dnd.to1 = setTimeout($.proxy(this.dnd_prepare, this), s.check_timeout); + } + else { + this.dnd_prepare(); + } + if(s.open_timeout) { + if(this.data.dnd.to2) { clearTimeout(this.data.dnd.to2); } + if(r && r.length && r.hasClass("jstree-closed")) { + // if the node is closed - open it, then recalculate + this.data.dnd.to2 = setTimeout($.proxy(this.dnd_open, this), s.open_timeout); + } + } + else { + if(r && r.length && r.hasClass("jstree-closed")) { + this.dnd_open(); + } + } + }, + dnd_leave : function (e) { + this.data.dnd.after = false; + this.data.dnd.before = false; + this.data.dnd.inside = false; + $.vakata.dnd.helper.children("ins").attr("class","jstree-invalid"); + m.hide(); + if(ml) { ml.hide(); } + if(r && r[0] === e.target.parentNode) { + if(this.data.dnd.to1) { + clearTimeout(this.data.dnd.to1); + this.data.dnd.to1 = false; + } + if(this.data.dnd.to2) { + clearTimeout(this.data.dnd.to2); + this.data.dnd.to2 = false; + } + } + }, + start_drag : function (obj, e) { + o = this._get_node(obj); + if(this.data.ui && this.is_selected(o)) { o = this._get_node(null, true); } + var dt = o.length > 1 ? this._get_string("multiple_selection") : this.get_text(o), + cnt = this.get_container(); + if(!this._get_settings().core.html_titles) { dt = dt.replace(//ig,">"); } + $.vakata.dnd.drag_start(e, { jstree : true, obj : o }, "" + dt ); + if(this.data.themes) { + if(m) { m.attr("class", "jstree-" + this.data.themes.theme); } + if(ml) { ml.attr("class", "jstree-" + this.data.themes.theme); } + $.vakata.dnd.helper.attr("class", "jstree-dnd-helper jstree-" + this.data.themes.theme); + } + this.data.dnd.cof = cnt.offset(); + this.data.dnd.cw = parseInt(cnt.width(),10); + this.data.dnd.ch = parseInt(cnt.height(),10); + this.data.dnd.active = true; + } + } + }); + $(function() { + var css_string = '' + + '#vakata-dragged ins { display:block; text-decoration:none; width:16px; height:16px; margin:0 0 0 0; padding:0; position:absolute; top:4px; left:4px; ' + + ' -moz-border-radius:4px; border-radius:4px; -webkit-border-radius:4px; ' + + '} ' + + '#vakata-dragged .jstree-ok { background:green; } ' + + '#vakata-dragged .jstree-invalid { background:red; } ' + + '#jstree-marker { padding:0; margin:0; font-size:12px; overflow:hidden; height:12px; width:8px; position:absolute; top:-30px; z-index:10001; background-repeat:no-repeat; display:none; background-color:transparent; text-shadow:1px 1px 1px white; color:black; line-height:10px; } ' + + '#jstree-marker-line { padding:0; margin:0; line-height:0%; font-size:1px; overflow:hidden; height:1px; width:100px; position:absolute; top:-30px; z-index:10000; background-repeat:no-repeat; display:none; background-color:#456c43; ' + + ' cursor:pointer; border:1px solid #eeeeee; border-left:0; -moz-box-shadow: 0px 0px 2px #666; -webkit-box-shadow: 0px 0px 2px #666; box-shadow: 0px 0px 2px #666; ' + + ' -moz-border-radius:1px; border-radius:1px; -webkit-border-radius:1px; ' + + '}' + + ''; + $.vakata.css.add_sheet({ str : css_string, title : "jstree" }); + m = $("
                ").attr({ id : "jstree-marker" }).hide().html("»") + .bind("mouseleave mouseenter", function (e) { + m.hide(); + ml.hide(); + e.preventDefault(); + e.stopImmediatePropagation(); + return false; + }) + .appendTo("body"); + ml = $("
                ").attr({ id : "jstree-marker-line" }).hide() + .bind("mouseup", function (e) { + if(r && r.length) { + r.children("a").trigger(e); + e.preventDefault(); + e.stopImmediatePropagation(); + return false; + } + }) + .bind("mouseleave", function (e) { + var rt = $(e.relatedTarget); + if(rt.is(".jstree") || rt.closest(".jstree").length === 0) { + if(r && r.length) { + r.children("a").trigger(e); + m.hide(); + ml.hide(); + e.preventDefault(); + e.stopImmediatePropagation(); + return false; + } + } + }) + .appendTo("body"); + $(document).bind("drag_start.vakata", function (e, data) { + if(data.data.jstree) { m.show(); if(ml) { ml.show(); } } + }); + $(document).bind("drag_stop.vakata", function (e, data) { + if(data.data.jstree) { m.hide(); if(ml) { ml.hide(); } } + }); + }); +})(jQuery); +//*/ + +/* + * jsTree checkbox plugin + * Inserts checkboxes in front of every node + * Depends on the ui plugin + * DOES NOT WORK NICELY WITH MULTITREE DRAG'N'DROP + */ +(function ($) { + $.jstree.plugin("checkbox", { + __init : function () { + this.data.checkbox.noui = this._get_settings().checkbox.override_ui; + if(this.data.ui && this.data.checkbox.noui) { + this.select_node = this.deselect_node = this.deselect_all = $.noop; + this.get_selected = this.get_checked; + } + + this.get_container() + .bind("open_node.jstree create_node.jstree clean_node.jstree refresh.jstree", $.proxy(function (e, data) { + this._prepare_checkboxes(data.rslt.obj); + }, this)) + .bind("loaded.jstree", $.proxy(function (e) { + this._prepare_checkboxes(); + }, this)) + .delegate( (this.data.ui && this.data.checkbox.noui ? "a" : "ins.jstree-checkbox") , "click.jstree", $.proxy(function (e) { + e.preventDefault(); + if(this._get_node(e.target).hasClass("jstree-checked")) { this.uncheck_node(e.target); } + else { this.check_node(e.target); } + if(this.data.ui && this.data.checkbox.noui) { + this.save_selected(); + if(this.data.cookies) { this.save_cookie("select_node"); } + } + else { + e.stopImmediatePropagation(); + return false; + } + }, this)); + }, + defaults : { + override_ui : false, + two_state : false, + real_checkboxes : false, + checked_parent_open : true, + real_checkboxes_names : function (n) { return [ ("check_" + (n[0].id || Math.ceil(Math.random() * 10000))) , 1]; } + }, + __destroy : function () { + this.get_container() + .find("input.jstree-real-checkbox").removeClass("jstree-real-checkbox").end() + .find("ins.jstree-checkbox").remove(); + }, + _fn : { + _checkbox_notify : function (n, data) { + if(data.checked) { + this.check_node(n, false); + } + }, + _prepare_checkboxes : function (obj) { + obj = !obj || obj == -1 ? this.get_container().find("> ul > li") : this._get_node(obj); + if(obj === false) { return; } // added for removing root nodes + var c, _this = this, t, ts = this._get_settings().checkbox.two_state, rc = this._get_settings().checkbox.real_checkboxes, rcn = this._get_settings().checkbox.real_checkboxes_names; + obj.each(function () { + t = $(this); + c = t.is("li") && (t.hasClass("jstree-checked") || (rc && t.children(":checked").length)) ? "jstree-checked" : "jstree-unchecked"; + t.find("li").andSelf().each(function () { + var $t = $(this), nm; + $t.children("a" + (_this.data.languages ? "" : ":eq(0)") ).not(":has(.jstree-checkbox)").prepend(" ").parent().not(".jstree-checked, .jstree-unchecked").addClass( ts ? "jstree-unchecked" : c ); + if(rc) { + if(!$t.children(":checkbox").length) { + nm = rcn.call(_this, $t); + $t.prepend(""); + } + else { + $t.children(":checkbox").addClass("jstree-real-checkbox"); + } + } + if(!ts) { + if(c === "jstree-checked" || $t.hasClass("jstree-checked") || $t.children(':checked').length) { + $t.find("li").andSelf().addClass("jstree-checked").children(":checkbox").prop("checked", true); + } + } + else { + if($t.hasClass("jstree-checked") || $t.children(':checked').length) { + $t.addClass("jstree-checked").children(":checkbox").prop("checked", true); + } + } + }); + }); + if(!ts) { + obj.find(".jstree-checked").parent().parent().each(function () { _this._repair_state(this); }); + } + }, + change_state : function (obj, state) { + obj = this._get_node(obj); + var coll = false, rc = this._get_settings().checkbox.real_checkboxes; + if(!obj || obj === -1) { return false; } + state = (state === false || state === true) ? state : obj.hasClass("jstree-checked"); + if(this._get_settings().checkbox.two_state) { + if(state) { + obj.removeClass("jstree-checked").addClass("jstree-unchecked"); + if(rc) { obj.children(":checkbox").prop("checked", false); } + } + else { + obj.removeClass("jstree-unchecked").addClass("jstree-checked"); + if(rc) { obj.children(":checkbox").prop("checked", true); } + } + } + else { + if(state) { + coll = obj.find("li").andSelf(); + if(!coll.filter(".jstree-checked, .jstree-undetermined").length) { return false; } + coll.removeClass("jstree-checked jstree-undetermined").addClass("jstree-unchecked"); + if(rc) { coll.children(":checkbox").prop("checked", false); } + } + else { + coll = obj.find("li").andSelf(); + if(!coll.filter(".jstree-unchecked, .jstree-undetermined").length) { return false; } + coll.removeClass("jstree-unchecked jstree-undetermined").addClass("jstree-checked"); + if(rc) { coll.children(":checkbox").prop("checked", true); } + if(this.data.ui) { this.data.ui.last_selected = obj; } + this.data.checkbox.last_selected = obj; + } + obj.parentsUntil(".jstree", "li").each(function () { + var $this = $(this); + if(state) { + if($this.children("ul").children("li.jstree-checked, li.jstree-undetermined").length) { + $this.parentsUntil(".jstree", "li").andSelf().removeClass("jstree-checked jstree-unchecked").addClass("jstree-undetermined"); + if(rc) { $this.parentsUntil(".jstree", "li").andSelf().children(":checkbox").prop("checked", false); } + return false; + } + else { + $this.removeClass("jstree-checked jstree-undetermined").addClass("jstree-unchecked"); + if(rc) { $this.children(":checkbox").prop("checked", false); } + } + } + else { + if($this.children("ul").children("li.jstree-unchecked, li.jstree-undetermined").length) { + $this.parentsUntil(".jstree", "li").andSelf().removeClass("jstree-checked jstree-unchecked").addClass("jstree-undetermined"); + if(rc) { $this.parentsUntil(".jstree", "li").andSelf().children(":checkbox").prop("checked", false); } + return false; + } + else { + $this.removeClass("jstree-unchecked jstree-undetermined").addClass("jstree-checked"); + if(rc) { $this.children(":checkbox").prop("checked", true); } + } + } + }); + } + if(this.data.ui && this.data.checkbox.noui) { this.data.ui.selected = this.get_checked(); } + this.__callback(obj); + return true; + }, + check_node : function (obj) { + if(this.change_state(obj, false)) { + obj = this._get_node(obj); + if(this._get_settings().checkbox.checked_parent_open) { + var t = this; + obj.parents(".jstree-closed").each(function () { t.open_node(this, false, true); }); + } + this.__callback({ "obj" : obj }); + } + }, + uncheck_node : function (obj) { + if(this.change_state(obj, true)) { this.__callback({ "obj" : this._get_node(obj) }); } + }, + check_all : function () { + var _this = this, + coll = this._get_settings().checkbox.two_state ? this.get_container_ul().find("li") : this.get_container_ul().children("li"); + coll.each(function () { + _this.change_state(this, false); + }); + this.__callback(); + }, + uncheck_all : function () { + var _this = this, + coll = this._get_settings().checkbox.two_state ? this.get_container_ul().find("li") : this.get_container_ul().children("li"); + coll.each(function () { + _this.change_state(this, true); + }); + this.__callback(); + }, + + is_checked : function(obj) { + obj = this._get_node(obj); + return obj.length ? obj.is(".jstree-checked") : false; + }, + get_checked : function (obj, get_all) { + obj = !obj || obj === -1 ? this.get_container() : this._get_node(obj); + return get_all || this._get_settings().checkbox.two_state ? obj.find(".jstree-checked") : obj.find("> ul > .jstree-checked, .jstree-undetermined > ul > .jstree-checked"); + }, + get_unchecked : function (obj, get_all) { + obj = !obj || obj === -1 ? this.get_container() : this._get_node(obj); + return get_all || this._get_settings().checkbox.two_state ? obj.find(".jstree-unchecked") : obj.find("> ul > .jstree-unchecked, .jstree-undetermined > ul > .jstree-unchecked"); + }, + + show_checkboxes : function () { this.get_container().children("ul").removeClass("jstree-no-checkboxes"); }, + hide_checkboxes : function () { this.get_container().children("ul").addClass("jstree-no-checkboxes"); }, + + _repair_state : function (obj) { + obj = this._get_node(obj); + if(!obj.length) { return; } + if(this._get_settings().checkbox.two_state) { + obj.find('li').andSelf().not('.jstree-checked').removeClass('jstree-undetermined').addClass('jstree-unchecked').children(':checkbox').prop('checked', true); + return; + } + var rc = this._get_settings().checkbox.real_checkboxes, + a = obj.find("> ul > .jstree-checked").length, + b = obj.find("> ul > .jstree-undetermined").length, + c = obj.find("> ul > li").length; + if(c === 0) { if(obj.hasClass("jstree-undetermined")) { this.change_state(obj, false); } } + else if(a === 0 && b === 0) { this.change_state(obj, true); } + else if(a === c) { this.change_state(obj, false); } + else { + obj.parentsUntil(".jstree","li").andSelf().removeClass("jstree-checked jstree-unchecked").addClass("jstree-undetermined"); + if(rc) { obj.parentsUntil(".jstree", "li").andSelf().children(":checkbox").prop("checked", false); } + } + }, + reselect : function () { + if(this.data.ui && this.data.checkbox.noui) { + var _this = this, + s = this.data.ui.to_select; + s = $.map($.makeArray(s), function (n) { return "#" + n.toString().replace(/^#/,"").replace(/\\\//g,"/").replace(/\//g,"\\\/").replace(/\\\./g,".").replace(/\./g,"\\.").replace(/\:/g,"\\:"); }); + this.deselect_all(); + $.each(s, function (i, val) { _this.check_node(val); }); + this.__callback(); + } + else { + this.__call_old(); + } + }, + save_loaded : function () { + var _this = this; + this.data.core.to_load = []; + this.get_container_ul().find("li.jstree-closed.jstree-undetermined").each(function () { + if(this.id) { _this.data.core.to_load.push("#" + this.id); } + }); + } + } + }); + $(function() { + var css_string = '.jstree .jstree-real-checkbox { display:none; } '; + $.vakata.css.add_sheet({ str : css_string, title : "jstree" }); + }); +})(jQuery); +//*/ + +/* + * jsTree XML plugin + * The XML data store. Datastores are build by overriding the `load_node` and `_is_loaded` functions. + */ +(function ($) { + $.vakata.xslt = function (xml, xsl, callback) { + var rs = "", xm, xs, processor, support; + // TODO: IE9 no XSLTProcessor, no document.recalc + if(document.recalc) { + xm = document.createElement('xml'); + xs = document.createElement('xml'); + xm.innerHTML = xml; + xs.innerHTML = xsl; + $("body").append(xm).append(xs); + setTimeout( (function (xm, xs, callback) { + return function () { + callback.call(null, xm.transformNode(xs.XMLDocument)); + setTimeout( (function (xm, xs) { return function () { $(xm).remove(); $(xs).remove(); }; })(xm, xs), 200); + }; + })(xm, xs, callback), 100); + return true; + } + if(typeof window.DOMParser !== "undefined" && typeof window.XMLHttpRequest !== "undefined" && typeof window.XSLTProcessor === "undefined") { + xml = new DOMParser().parseFromString(xml, "text/xml"); + xsl = new DOMParser().parseFromString(xsl, "text/xml"); + // alert(xml.transformNode()); + // callback.call(null, new XMLSerializer().serializeToString(rs)); + + } + if(typeof window.DOMParser !== "undefined" && typeof window.XMLHttpRequest !== "undefined" && typeof window.XSLTProcessor !== "undefined") { + processor = new XSLTProcessor(); + support = $.isFunction(processor.transformDocument) ? (typeof window.XMLSerializer !== "undefined") : true; + if(!support) { return false; } + xml = new DOMParser().parseFromString(xml, "text/xml"); + xsl = new DOMParser().parseFromString(xsl, "text/xml"); + if($.isFunction(processor.transformDocument)) { + rs = document.implementation.createDocument("", "", null); + processor.transformDocument(xml, xsl, rs, null); + callback.call(null, new XMLSerializer().serializeToString(rs)); + return true; + } + else { + processor.importStylesheet(xsl); + rs = processor.transformToFragment(xml, document); + callback.call(null, $("
                ").append(rs).html()); + return true; + } + } + return false; + }; + var xsl = { + 'nest' : '<' + '?xml version="1.0" encoding="utf-8" ?>' + + '' + + '' + + '' + + ' ' + + ' ' + + ' ' + + '' + + '' + + ' ' + + ' ' + + '' + + '', + + 'flat' : '<' + '?xml version="1.0" encoding="utf-8" ?>' + + '' + + '' + + '' + + '
                  ' + + ' ' + /* the last `or` may be removed */ + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + '
                ' + + '
                ' + + '' + + ' ' + + ' ' + + ' ' + + '
              • ' + + ' ' + + ' jstree-last ' + + ' ' + + ' jstree-open ' + + ' jstree-closed ' + + ' jstree-leaf ' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + '  ' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + ' #' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + ' jstree-icon ' + + ' ' + + ' ' + + ' background:url() center center no-repeat;' + + '  ' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + '
                  ' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + '
                ' + + '
                ' + + '
              • ' + + '' + + '' + }, + escape_xml = function(string) { + return string + .toString() + .replace(/&/g, '&') + .replace(//g, '>') + .replace(/"/g, '"') + .replace(/'/g, '''); + }; + $.jstree.plugin("xml_data", { + defaults : { + data : false, + ajax : false, + xsl : "flat", + clean_node : false, + correct_state : true, + get_skip_empty : false, + get_include_preamble : true + }, + _fn : { + load_node : function (obj, s_call, e_call) { var _this = this; this.load_node_xml(obj, function () { _this.__callback({ "obj" : _this._get_node(obj) }); s_call.call(this); }, e_call); }, + _is_loaded : function (obj) { + var s = this._get_settings().xml_data; + obj = this._get_node(obj); + return obj == -1 || !obj || (!s.ajax && !$.isFunction(s.data)) || obj.is(".jstree-open, .jstree-leaf") || obj.children("ul").children("li").size() > 0; + }, + load_node_xml : function (obj, s_call, e_call) { + var s = this.get_settings().xml_data, + error_func = function () {}, + success_func = function () {}; + + obj = this._get_node(obj); + if(obj && obj !== -1) { + if(obj.data("jstree_is_loading")) { return; } + else { obj.data("jstree_is_loading",true); } + } + switch(!0) { + case (!s.data && !s.ajax): throw "Neither data nor ajax settings supplied."; + case ($.isFunction(s.data)): + s.data.call(this, obj, $.proxy(function (d) { + this.parse_xml(d, $.proxy(function (d) { + if(d) { + d = d.replace(/ ?xmlns="[^"]*"/ig, ""); + if(d.length > 10) { + d = $(d); + if(obj === -1 || !obj) { this.get_container().children("ul").empty().append(d.children()); } + else { obj.children("a.jstree-loading").removeClass("jstree-loading"); obj.append(d); obj.removeData("jstree_is_loading"); } + if(s.clean_node) { this.clean_node(obj); } + if(s_call) { s_call.call(this); } + } + else { + if(obj && obj !== -1) { + obj.children("a.jstree-loading").removeClass("jstree-loading"); + obj.removeData("jstree_is_loading"); + if(s.correct_state) { + this.correct_state(obj); + if(s_call) { s_call.call(this); } + } + } + else { + if(s.correct_state) { + this.get_container().children("ul").empty(); + if(s_call) { s_call.call(this); } + } + } + } + } + }, this)); + }, this)); + break; + case (!!s.data && !s.ajax) || (!!s.data && !!s.ajax && (!obj || obj === -1)): + if(!obj || obj == -1) { + this.parse_xml(s.data, $.proxy(function (d) { + if(d) { + d = d.replace(/ ?xmlns="[^"]*"/ig, ""); + if(d.length > 10) { + d = $(d); + this.get_container().children("ul").empty().append(d.children()); + if(s.clean_node) { this.clean_node(obj); } + if(s_call) { s_call.call(this); } + } + } + else { + if(s.correct_state) { + this.get_container().children("ul").empty(); + if(s_call) { s_call.call(this); } + } + } + }, this)); + } + break; + case (!s.data && !!s.ajax) || (!!s.data && !!s.ajax && obj && obj !== -1): + error_func = function (x, t, e) { + var ef = this.get_settings().xml_data.ajax.error; + if(ef) { ef.call(this, x, t, e); } + if(obj !== -1 && obj.length) { + obj.children("a.jstree-loading").removeClass("jstree-loading"); + obj.removeData("jstree_is_loading"); + if(t === "success" && s.correct_state) { this.correct_state(obj); } + } + else { + if(t === "success" && s.correct_state) { this.get_container().children("ul").empty(); } + } + if(e_call) { e_call.call(this); } + }; + success_func = function (d, t, x) { + d = x.responseText; + var sf = this.get_settings().xml_data.ajax.success; + if(sf) { d = sf.call(this,d,t,x) || d; } + if(d === "" || (d && d.toString && d.toString().replace(/^[\s\n]+$/,"") === "")) { + return error_func.call(this, x, t, ""); + } + this.parse_xml(d, $.proxy(function (d) { + if(d) { + d = d.replace(/ ?xmlns="[^"]*"/ig, ""); + if(d.length > 10) { + d = $(d); + if(obj === -1 || !obj) { this.get_container().children("ul").empty().append(d.children()); } + else { obj.children("a.jstree-loading").removeClass("jstree-loading"); obj.append(d); obj.removeData("jstree_is_loading"); } + if(s.clean_node) { this.clean_node(obj); } + if(s_call) { s_call.call(this); } + } + else { + if(obj && obj !== -1) { + obj.children("a.jstree-loading").removeClass("jstree-loading"); + obj.removeData("jstree_is_loading"); + if(s.correct_state) { + this.correct_state(obj); + if(s_call) { s_call.call(this); } + } + } + else { + if(s.correct_state) { + this.get_container().children("ul").empty(); + if(s_call) { s_call.call(this); } + } + } + } + } + }, this)); + }; + s.ajax.context = this; + s.ajax.error = error_func; + s.ajax.success = success_func; + if(!s.ajax.dataType) { s.ajax.dataType = "xml"; } + if($.isFunction(s.ajax.url)) { s.ajax.url = s.ajax.url.call(this, obj); } + if($.isFunction(s.ajax.data)) { s.ajax.data = s.ajax.data.call(this, obj); } + $.ajax(s.ajax); + break; + } + }, + parse_xml : function (xml, callback) { + var s = this._get_settings().xml_data; + $.vakata.xslt(xml, xsl[s.xsl], callback); + }, + get_xml : function (tp, obj, li_attr, a_attr, is_callback) { + var result = "", + s = this._get_settings(), + _this = this, + tmp1, tmp2, li, a, lang; + if(!tp) { tp = "flat"; } + if(!is_callback) { is_callback = 0; } + obj = this._get_node(obj); + if(!obj || obj === -1) { obj = this.get_container().find("> ul > li"); } + li_attr = $.isArray(li_attr) ? li_attr : [ "id", "class" ]; + if(!is_callback && this.data.types && $.inArray(s.types.type_attr, li_attr) === -1) { li_attr.push(s.types.type_attr); } + + a_attr = $.isArray(a_attr) ? a_attr : [ ]; + + if(!is_callback) { + if(s.xml_data.get_include_preamble) { + result += '<' + '?xml version="1.0" encoding="UTF-8"?' + '>'; + } + result += ""; + } + obj.each(function () { + result += ""; + result += ""; + }); + result += ""; + tmp2 = li[0].id || true; + li = li.find("> ul > li"); + if(li.length) { tmp2 = _this.get_xml(tp, li, li_attr, a_attr, tmp2); } + else { tmp2 = ""; } + if(tp == "nest") { result += tmp2; } + result += ""; + if(tp == "flat") { result += tmp2; } + }); + if(!is_callback) { result += ""; } + return result; + } + } + }); +})(jQuery); +//*/ + +/* + * jsTree search plugin + * Enables both sync and async search on the tree + * DOES NOT WORK WITH JSON PROGRESSIVE RENDER + */ +(function ($) { + $.expr[':'].jstree_contains = function(a,i,m){ + return (a.textContent || a.innerText || "").toLowerCase().indexOf(m[3].toLowerCase())>=0; + }; + $.expr[':'].jstree_title_contains = function(a,i,m) { + return (a.getAttribute("title") || "").toLowerCase().indexOf(m[3].toLowerCase())>=0; + }; + $.jstree.plugin("search", { + __init : function () { + this.data.search.str = ""; + this.data.search.result = $(); + if(this._get_settings().search.show_only_matches) { + this.get_container() + .bind("search.jstree", function (e, data) { + $(this).children("ul").find("li").hide().removeClass("jstree-last"); + data.rslt.nodes.parentsUntil(".jstree").andSelf().show() + .filter("ul").each(function () { $(this).children("li:visible").eq(-1).addClass("jstree-last"); }); + }) + .bind("clear_search.jstree", function () { + $(this).children("ul").find("li").css("display","").end().end().jstree("clean_node", -1); + }); + } + }, + defaults : { + ajax : false, + search_method : "jstree_contains", // for case insensitive - jstree_contains + show_only_matches : false + }, + _fn : { + search : function (str, skip_async) { + if($.trim(str) === "") { this.clear_search(); return; } + var s = this.get_settings().search, + t = this, + error_func = function () { }, + success_func = function () { }; + this.data.search.str = str; + + if(!skip_async && s.ajax !== false && this.get_container_ul().find("li.jstree-closed:not(:has(ul)):eq(0)").length > 0) { + this.search.supress_callback = true; + error_func = function () { }; + success_func = function (d, t, x) { + var sf = this.get_settings().search.ajax.success; + if(sf) { d = sf.call(this,d,t,x) || d; } + this.data.search.to_open = d; + this._search_open(); + }; + s.ajax.context = this; + s.ajax.error = error_func; + s.ajax.success = success_func; + if($.isFunction(s.ajax.url)) { s.ajax.url = s.ajax.url.call(this, str); } + if($.isFunction(s.ajax.data)) { s.ajax.data = s.ajax.data.call(this, str); } + if(!s.ajax.data) { s.ajax.data = { "search_string" : str }; } + if(!s.ajax.dataType || /^json/.exec(s.ajax.dataType)) { s.ajax.dataType = "json"; } + $.ajax(s.ajax); + return; + } + if(this.data.search.result.length) { this.clear_search(); } + this.data.search.result = this.get_container().find("a" + (this.data.languages ? "." + this.get_lang() : "" ) + ":" + (s.search_method) + "(" + this.data.search.str + ")"); + this.data.search.result.addClass("jstree-search").parent().parents(".jstree-closed").each(function () { + t.open_node(this, false, true); + }); + this.__callback({ nodes : this.data.search.result, str : str }); + }, + clear_search : function (str) { + this.data.search.result.removeClass("jstree-search"); + this.__callback(this.data.search.result); + this.data.search.result = $(); + }, + _search_open : function (is_callback) { + var _this = this, + done = true, + current = [], + remaining = []; + if(this.data.search.to_open.length) { + $.each(this.data.search.to_open, function (i, val) { + if(val == "#") { return true; } + if($(val).length && $(val).is(".jstree-closed")) { current.push(val); } + else { remaining.push(val); } + }); + if(current.length) { + this.data.search.to_open = remaining; + $.each(current, function (i, val) { + _this.open_node(val, function () { _this._search_open(true); }); + }); + done = false; + } + } + if(done) { this.search(this.data.search.str, true); } + } + } + }); +})(jQuery); +//*/ + +/* + * jsTree contextmenu plugin + */ +(function ($) { + $.vakata.context = { + hide_on_mouseleave : false, + + cnt : $("
                "), + vis : false, + tgt : false, + par : false, + func : false, + data : false, + rtl : false, + show : function (s, t, x, y, d, p, rtl) { + $.vakata.context.rtl = !!rtl; + var html = $.vakata.context.parse(s), h, w; + if(!html) { return; } + $.vakata.context.vis = true; + $.vakata.context.tgt = t; + $.vakata.context.par = p || t || null; + $.vakata.context.data = d || null; + $.vakata.context.cnt + .html(html) + .css({ "visibility" : "hidden", "display" : "block", "left" : 0, "top" : 0 }); + + if($.vakata.context.hide_on_mouseleave) { + $.vakata.context.cnt + .one("mouseleave", function(e) { $.vakata.context.hide(); }); + } + + h = $.vakata.context.cnt.height(); + w = $.vakata.context.cnt.width(); + if(x + w > $(document).width()) { + x = $(document).width() - (w + 5); + $.vakata.context.cnt.find("li > ul").addClass("right"); + } + if(y + h > $(document).height()) { + y = y - (h + t[0].offsetHeight); + $.vakata.context.cnt.find("li > ul").addClass("bottom"); + } + + $.vakata.context.cnt + .css({ "left" : x, "top" : y }) + .find("li:has(ul)") + .bind("mouseenter", function (e) { + var w = $(document).width(), + h = $(document).height(), + ul = $(this).children("ul").show(); + if(w !== $(document).width()) { ul.toggleClass("right"); } + if(h !== $(document).height()) { ul.toggleClass("bottom"); } + }) + .bind("mouseleave", function (e) { + $(this).children("ul").hide(); + }) + .end() + .css({ "visibility" : "visible" }) + .show(); + $(document).triggerHandler("context_show.vakata"); + }, + hide : function () { + $.vakata.context.vis = false; + $.vakata.context.cnt.attr("class","").css({ "visibility" : "hidden" }); + $(document).triggerHandler("context_hide.vakata"); + }, + parse : function (s, is_callback) { + if(!s) { return false; } + var str = "", + tmp = false, + was_sep = true; + if(!is_callback) { $.vakata.context.func = {}; } + str += ""; + $(document).triggerHandler("context_parse.vakata"); + return str.length > 10 ? str : false; + }, + exec : function (i) { + if($.isFunction($.vakata.context.func[i])) { + // if is string - eval and call it! + $.vakata.context.func[i].call($.vakata.context.data, $.vakata.context.par); + return true; + } + else { return false; } + } + }; + $(function () { + var css_string = '' + + '#vakata-contextmenu { display:block; visibility:hidden; left:0; top:-200px; position:absolute; margin:0; padding:0; min-width:180px; background:#ebebeb; border:1px solid silver; z-index:10000; *width:180px; } ' + + '#vakata-contextmenu ul { min-width:180px; *width:180px; } ' + + '#vakata-contextmenu ul, #vakata-contextmenu li { margin:0; padding:0; list-style-type:none; display:block; } ' + + '#vakata-contextmenu li { line-height:20px; min-height:20px; position:relative; padding:0px; } ' + + '#vakata-contextmenu li a { padding:1px 6px; line-height:17px; display:block; text-decoration:none; margin:1px 1px 0 1px; } ' + + '#vakata-contextmenu li ins { float:left; width:16px; height:16px; text-decoration:none; margin-right:2px; } ' + + '#vakata-contextmenu li a:hover, #vakata-contextmenu li.vakata-hover > a { background:gray; color:white; } ' + + '#vakata-contextmenu li ul { display:none; position:absolute; top:-2px; left:100%; background:#ebebeb; border:1px solid gray; } ' + + '#vakata-contextmenu .right { right:100%; left:auto; } ' + + '#vakata-contextmenu .bottom { bottom:-1px; top:auto; } ' + + '#vakata-contextmenu li.vakata-separator { min-height:0; height:1px; line-height:1px; font-size:1px; overflow:hidden; margin:0 2px; background:silver; /* border-top:1px solid #fefefe; */ padding:0; } '; + $.vakata.css.add_sheet({ str : css_string, title : "vakata" }); + $.vakata.context.cnt + .delegate("a","click", function (e) { e.preventDefault(); }) + .delegate("a","mouseup", function (e) { + if(!$(this).parent().hasClass("jstree-contextmenu-disabled") && $.vakata.context.exec($(this).attr("rel"))) { + $.vakata.context.hide(); + } + else { $(this).blur(); } + }) + .delegate("a","mouseover", function () { + $.vakata.context.cnt.find(".vakata-hover").removeClass("vakata-hover"); + }) + .appendTo("body"); + $(document).bind("mousedown", function (e) { if($.vakata.context.vis && !$.contains($.vakata.context.cnt[0], e.target)) { $.vakata.context.hide(); } }); + if(typeof $.hotkeys !== "undefined") { + $(document) + .bind("keydown", "up", function (e) { + if($.vakata.context.vis) { + var o = $.vakata.context.cnt.find("ul:visible").last().children(".vakata-hover").removeClass("vakata-hover").prevAll("li:not(.vakata-separator)").first(); + if(!o.length) { o = $.vakata.context.cnt.find("ul:visible").last().children("li:not(.vakata-separator)").last(); } + o.addClass("vakata-hover"); + e.stopImmediatePropagation(); + e.preventDefault(); + } + }) + .bind("keydown", "down", function (e) { + if($.vakata.context.vis) { + var o = $.vakata.context.cnt.find("ul:visible").last().children(".vakata-hover").removeClass("vakata-hover").nextAll("li:not(.vakata-separator)").first(); + if(!o.length) { o = $.vakata.context.cnt.find("ul:visible").last().children("li:not(.vakata-separator)").first(); } + o.addClass("vakata-hover"); + e.stopImmediatePropagation(); + e.preventDefault(); + } + }) + .bind("keydown", "right", function (e) { + if($.vakata.context.vis) { + $.vakata.context.cnt.find(".vakata-hover").children("ul").show().children("li:not(.vakata-separator)").removeClass("vakata-hover").first().addClass("vakata-hover"); + e.stopImmediatePropagation(); + e.preventDefault(); + } + }) + .bind("keydown", "left", function (e) { + if($.vakata.context.vis) { + $.vakata.context.cnt.find(".vakata-hover").children("ul").hide().children(".vakata-separator").removeClass("vakata-hover"); + e.stopImmediatePropagation(); + e.preventDefault(); + } + }) + .bind("keydown", "esc", function (e) { + $.vakata.context.hide(); + e.preventDefault(); + }) + .bind("keydown", "space", function (e) { + $.vakata.context.cnt.find(".vakata-hover").last().children("a").click(); + e.preventDefault(); + }); + } + }); + + $.jstree.plugin("contextmenu", { + __init : function () { + this.get_container() + .delegate("a", "contextmenu.jstree", $.proxy(function (e) { + e.preventDefault(); + if(!$(e.currentTarget).hasClass("jstree-loading")) { + this.show_contextmenu(e.currentTarget, e.pageX, e.pageY); + } + }, this)) + .delegate("a", "click.jstree", $.proxy(function (e) { + if(this.data.contextmenu) { + $.vakata.context.hide(); + } + }, this)) + .bind("destroy.jstree", $.proxy(function () { + // TODO: move this to descruct method + if(this.data.contextmenu) { + $.vakata.context.hide(); + } + }, this)); + $(document).bind("context_hide.vakata", $.proxy(function () { this.data.contextmenu = false; }, this)); + }, + defaults : { + select_node : false, // requires UI plugin + show_at_node : true, + items : { // Could be a function that should return an object like this one + "create" : { + "separator_before" : false, + "separator_after" : true, + "label" : "Create", + "action" : function (obj) { this.create(obj); } + }, + "rename" : { + "separator_before" : false, + "separator_after" : false, + "label" : "Rename", + "action" : function (obj) { this.rename(obj); } + }, + "remove" : { + "separator_before" : false, + "icon" : false, + "separator_after" : false, + "label" : "Delete", + "action" : function (obj) { if(this.is_selected(obj)) { this.remove(); } else { this.remove(obj); } } + }, + "ccp" : { + "separator_before" : true, + "icon" : false, + "separator_after" : false, + "label" : "Edit", + "action" : false, + "submenu" : { + "cut" : { + "separator_before" : false, + "separator_after" : false, + "label" : "Cut", + "action" : function (obj) { this.cut(obj); } + }, + "copy" : { + "separator_before" : false, + "icon" : false, + "separator_after" : false, + "label" : "Copy", + "action" : function (obj) { this.copy(obj); } + }, + "paste" : { + "separator_before" : false, + "icon" : false, + "separator_after" : false, + "label" : "Paste", + "action" : function (obj) { this.paste(obj); } + } + } + } + } + }, + _fn : { + show_contextmenu : function (obj, x, y) { + obj = this._get_node(obj); + var s = this.get_settings().contextmenu, + a = obj.children("a:visible:eq(0)"), + o = false, + i = false; + if(s.select_node && this.data.ui && !this.is_selected(obj)) { + this.deselect_all(); + this.select_node(obj, true); + } + if(s.show_at_node || typeof x === "undefined" || typeof y === "undefined") { + o = a.offset(); + x = o.left; + y = o.top + this.data.core.li_height; + } + i = obj.data("jstree") && obj.data("jstree").contextmenu ? obj.data("jstree").contextmenu : s.items; + if($.isFunction(i)) { i = i.call(this, obj); } + this.data.contextmenu = true; + $.vakata.context.show(i, a, x, y, this, obj, this._get_settings().core.rtl); + if(this.data.themes) { $.vakata.context.cnt.attr("class", "jstree-" + this.data.themes.theme + "-context"); } + } + } + }); +})(jQuery); +//*/ + +/* + * jsTree types plugin + * Adds support types of nodes + * You can set an attribute on each li node, that represents its type. + * According to the type setting the node may get custom icon/validation rules + */ +(function ($) { + $.jstree.plugin("types", { + __init : function () { + var s = this._get_settings().types; + this.data.types.attach_to = []; + this.get_container() + .bind("init.jstree", $.proxy(function () { + var types = s.types, + attr = s.type_attr, + icons_css = "", + _this = this; + + $.each(types, function (i, tp) { + $.each(tp, function (k, v) { + if(!/^(max_depth|max_children|icon|valid_children)$/.test(k)) { _this.data.types.attach_to.push(k); } + }); + if(!tp.icon) { return true; } + if( tp.icon.image || tp.icon.position) { + if(i == "default") { icons_css += '.jstree-' + _this.get_index() + ' a > .jstree-icon { '; } + else { icons_css += '.jstree-' + _this.get_index() + ' li[' + attr + '="' + i + '"] > a > .jstree-icon { '; } + if(tp.icon.image) { icons_css += ' background-image:url(' + tp.icon.image + '); '; } + if(tp.icon.position){ icons_css += ' background-position:' + tp.icon.position + '; '; } + else { icons_css += ' background-position:0 0; '; } + icons_css += '} '; + } + }); + if(icons_css !== "") { $.vakata.css.add_sheet({ 'str' : icons_css, title : "jstree-types" }); } + }, this)) + .bind("before.jstree", $.proxy(function (e, data) { + var s, t, + o = this._get_settings().types.use_data ? this._get_node(data.args[0]) : false, + d = o && o !== -1 && o.length ? o.data("jstree") : false; + if(d && d.types && d.types[data.func] === false) { e.stopImmediatePropagation(); return false; } + if($.inArray(data.func, this.data.types.attach_to) !== -1) { + if(!data.args[0] || (!data.args[0].tagName && !data.args[0].jquery)) { return; } + s = this._get_settings().types.types; + t = this._get_type(data.args[0]); + if( + ( + (s[t] && typeof s[t][data.func] !== "undefined") || + (s["default"] && typeof s["default"][data.func] !== "undefined") + ) && this._check(data.func, data.args[0]) === false + ) { + e.stopImmediatePropagation(); + return false; + } + } + }, this)); + if(is_ie6) { + this.get_container() + .bind("load_node.jstree set_type.jstree", $.proxy(function (e, data) { + var r = data && data.rslt && data.rslt.obj && data.rslt.obj !== -1 ? this._get_node(data.rslt.obj).parent() : this.get_container_ul(), + c = false, + s = this._get_settings().types; + $.each(s.types, function (i, tp) { + if(tp.icon && (tp.icon.image || tp.icon.position)) { + c = i === "default" ? r.find("li > a > .jstree-icon") : r.find("li[" + s.type_attr + "='" + i + "'] > a > .jstree-icon"); + if(tp.icon.image) { c.css("backgroundImage","url(" + tp.icon.image + ")"); } + c.css("backgroundPosition", tp.icon.position || "0 0"); + } + }); + }, this)); + } + }, + defaults : { + // defines maximum number of root nodes (-1 means unlimited, -2 means disable max_children checking) + max_children : -1, + // defines the maximum depth of the tree (-1 means unlimited, -2 means disable max_depth checking) + max_depth : -1, + // defines valid node types for the root nodes + valid_children : "all", + + // whether to use $.data + use_data : false, + // where is the type stores (the rel attribute of the LI element) + type_attr : "rel", + // a list of types + types : { + // the default type + "default" : { + "max_children" : -1, + "max_depth" : -1, + "valid_children": "all" + + // Bound functions - you can bind any other function here (using boolean or function) + //"select_node" : true + } + } + }, + _fn : { + _types_notify : function (n, data) { + if(data.type && this._get_settings().types.use_data) { + this.set_type(data.type, n); + } + }, + _get_type : function (obj) { + obj = this._get_node(obj); + return (!obj || !obj.length) ? false : obj.attr(this._get_settings().types.type_attr) || "default"; + }, + set_type : function (str, obj) { + obj = this._get_node(obj); + var ret = (!obj.length || !str) ? false : obj.attr(this._get_settings().types.type_attr, str); + if(ret) { this.__callback({ obj : obj, type : str}); } + return ret; + }, + _check : function (rule, obj, opts) { + obj = this._get_node(obj); + var v = false, t = this._get_type(obj), d = 0, _this = this, s = this._get_settings().types, data = false; + if(obj === -1) { + if(!!s[rule]) { v = s[rule]; } + else { return; } + } + else { + if(t === false) { return; } + data = s.use_data ? obj.data("jstree") : false; + if(data && data.types && typeof data.types[rule] !== "undefined") { v = data.types[rule]; } + else if(!!s.types[t] && typeof s.types[t][rule] !== "undefined") { v = s.types[t][rule]; } + else if(!!s.types["default"] && typeof s.types["default"][rule] !== "undefined") { v = s.types["default"][rule]; } + } + if($.isFunction(v)) { v = v.call(this, obj); } + if(rule === "max_depth" && obj !== -1 && opts !== false && s.max_depth !== -2 && v !== 0) { + // also include the node itself - otherwise if root node it is not checked + obj.children("a:eq(0)").parentsUntil(".jstree","li").each(function (i) { + // check if current depth already exceeds global tree depth + if(s.max_depth !== -1 && s.max_depth - (i + 1) <= 0) { v = 0; return false; } + d = (i === 0) ? v : _this._check(rule, this, false); + // check if current node max depth is already matched or exceeded + if(d !== -1 && d - (i + 1) <= 0) { v = 0; return false; } + // otherwise - set the max depth to the current value minus current depth + if(d >= 0 && (d - (i + 1) < v || v < 0) ) { v = d - (i + 1); } + // if the global tree depth exists and it minus the nodes calculated so far is less than `v` or `v` is unlimited + if(s.max_depth >= 0 && (s.max_depth - (i + 1) < v || v < 0) ) { v = s.max_depth - (i + 1); } + }); + } + return v; + }, + check_move : function () { + if(!this.__call_old()) { return false; } + var m = this._get_move(), + s = m.rt._get_settings().types, + mc = m.rt._check("max_children", m.cr), + md = m.rt._check("max_depth", m.cr), + vc = m.rt._check("valid_children", m.cr), + ch = 0, d = 1, t; + + if(vc === "none") { return false; } + if($.isArray(vc) && m.ot && m.ot._get_type) { + m.o.each(function () { + if($.inArray(m.ot._get_type(this), vc) === -1) { d = false; return false; } + }); + if(d === false) { return false; } + } + if(s.max_children !== -2 && mc !== -1) { + ch = m.cr === -1 ? this.get_container().find("> ul > li").not(m.o).length : m.cr.find("> ul > li").not(m.o).length; + if(ch + m.o.length > mc) { return false; } + } + if(s.max_depth !== -2 && md !== -1) { + d = 0; + if(md === 0) { return false; } + if(typeof m.o.d === "undefined") { + // TODO: deal with progressive rendering and async when checking max_depth (how to know the depth of the moved node) + t = m.o; + while(t.length > 0) { + t = t.find("> ul > li"); + d ++; + } + m.o.d = d; + } + if(md - m.o.d < 0) { return false; } + } + return true; + }, + create_node : function (obj, position, js, callback, is_loaded, skip_check) { + if(!skip_check && (is_loaded || this._is_loaded(obj))) { + var p = (typeof position == "string" && position.match(/^before|after$/i) && obj !== -1) ? this._get_parent(obj) : this._get_node(obj), + s = this._get_settings().types, + mc = this._check("max_children", p), + md = this._check("max_depth", p), + vc = this._check("valid_children", p), + ch; + if(typeof js === "string") { js = { data : js }; } + if(!js) { js = {}; } + if(vc === "none") { return false; } + if($.isArray(vc)) { + if(!js.attr || !js.attr[s.type_attr]) { + if(!js.attr) { js.attr = {}; } + js.attr[s.type_attr] = vc[0]; + } + else { + if($.inArray(js.attr[s.type_attr], vc) === -1) { return false; } + } + } + if(s.max_children !== -2 && mc !== -1) { + ch = p === -1 ? this.get_container().find("> ul > li").length : p.find("> ul > li").length; + if(ch + 1 > mc) { return false; } + } + if(s.max_depth !== -2 && md !== -1 && (md - 1) < 0) { return false; } + } + return this.__call_old(true, obj, position, js, callback, is_loaded, skip_check); + } + } + }); +})(jQuery); +//*/ + +/* + * jsTree HTML plugin + * The HTML data store. Datastores are build by replacing the `load_node` and `_is_loaded` functions. + */ +(function ($) { + $.jstree.plugin("html_data", { + __init : function () { + // this used to use html() and clean the whitespace, but this way any attached data was lost + this.data.html_data.original_container_html = this.get_container().find(" > ul > li").clone(true); + // remove white space from LI node - otherwise nodes appear a bit to the right + this.data.html_data.original_container_html.find("li").andSelf().contents().filter(function() { return this.nodeType == 3; }).remove(); + }, + defaults : { + data : false, + ajax : false, + correct_state : true + }, + _fn : { + load_node : function (obj, s_call, e_call) { var _this = this; this.load_node_html(obj, function () { _this.__callback({ "obj" : _this._get_node(obj) }); s_call.call(this); }, e_call); }, + _is_loaded : function (obj) { + obj = this._get_node(obj); + return obj == -1 || !obj || (!this._get_settings().html_data.ajax && !$.isFunction(this._get_settings().html_data.data)) || obj.is(".jstree-open, .jstree-leaf") || obj.children("ul").children("li").size() > 0; + }, + load_node_html : function (obj, s_call, e_call) { + var d, + s = this.get_settings().html_data, + error_func = function () {}, + success_func = function () {}; + obj = this._get_node(obj); + if(obj && obj !== -1) { + if(obj.data("jstree_is_loading")) { return; } + else { obj.data("jstree_is_loading",true); } + } + switch(!0) { + case ($.isFunction(s.data)): + s.data.call(this, obj, $.proxy(function (d) { + if(d && d !== "" && d.toString && d.toString().replace(/^[\s\n]+$/,"") !== "") { + d = $(d); + if(!d.is("ul")) { d = $("
                  ").append(d); } + if(obj == -1 || !obj) { this.get_container().children("ul").empty().append(d.children()).find("li, a").filter(function () { return !this.firstChild || !this.firstChild.tagName || this.firstChild.tagName !== "INS"; }).prepend(" ").end().filter("a").children("ins:first-child").not(".jstree-icon").addClass("jstree-icon"); } + else { obj.children("a.jstree-loading").removeClass("jstree-loading"); obj.append(d).children("ul").find("li, a").filter(function () { return !this.firstChild || !this.firstChild.tagName || this.firstChild.tagName !== "INS"; }).prepend(" ").end().filter("a").children("ins:first-child").not(".jstree-icon").addClass("jstree-icon"); obj.removeData("jstree_is_loading"); } + this.clean_node(obj); + if(s_call) { s_call.call(this); } + } + else { + if(obj && obj !== -1) { + obj.children("a.jstree-loading").removeClass("jstree-loading"); + obj.removeData("jstree_is_loading"); + if(s.correct_state) { + this.correct_state(obj); + if(s_call) { s_call.call(this); } + } + } + else { + if(s.correct_state) { + this.get_container().children("ul").empty(); + if(s_call) { s_call.call(this); } + } + } + } + }, this)); + break; + case (!s.data && !s.ajax): + if(!obj || obj == -1) { + this.get_container() + .children("ul").empty() + .append(this.data.html_data.original_container_html) + .find("li, a").filter(function () { return !this.firstChild || !this.firstChild.tagName || this.firstChild.tagName !== "INS"; }).prepend(" ").end() + .filter("a").children("ins:first-child").not(".jstree-icon").addClass("jstree-icon"); + this.clean_node(); + } + if(s_call) { s_call.call(this); } + break; + case (!!s.data && !s.ajax) || (!!s.data && !!s.ajax && (!obj || obj === -1)): + if(!obj || obj == -1) { + d = $(s.data); + if(!d.is("ul")) { d = $("
                    ").append(d); } + this.get_container() + .children("ul").empty().append(d.children()) + .find("li, a").filter(function () { return !this.firstChild || !this.firstChild.tagName || this.firstChild.tagName !== "INS"; }).prepend(" ").end() + .filter("a").children("ins:first-child").not(".jstree-icon").addClass("jstree-icon"); + this.clean_node(); + } + if(s_call) { s_call.call(this); } + break; + case (!s.data && !!s.ajax) || (!!s.data && !!s.ajax && obj && obj !== -1): + obj = this._get_node(obj); + error_func = function (x, t, e) { + var ef = this.get_settings().html_data.ajax.error; + if(ef) { ef.call(this, x, t, e); } + if(obj != -1 && obj.length) { + obj.children("a.jstree-loading").removeClass("jstree-loading"); + obj.removeData("jstree_is_loading"); + if(t === "success" && s.correct_state) { this.correct_state(obj); } + } + else { + if(t === "success" && s.correct_state) { this.get_container().children("ul").empty(); } + } + if(e_call) { e_call.call(this); } + }; + success_func = function (d, t, x) { + var sf = this.get_settings().html_data.ajax.success; + if(sf) { d = sf.call(this,d,t,x) || d; } + if(d === "" || (d && d.toString && d.toString().replace(/^[\s\n]+$/,"") === "")) { + return error_func.call(this, x, t, ""); + } + if(d) { + d = $(d); + if(!d.is("ul")) { d = $("
                      ").append(d); } + if(obj == -1 || !obj) { this.get_container().children("ul").empty().append(d.children()).find("li, a").filter(function () { return !this.firstChild || !this.firstChild.tagName || this.firstChild.tagName !== "INS"; }).prepend(" ").end().filter("a").children("ins:first-child").not(".jstree-icon").addClass("jstree-icon"); } + else { obj.children("a.jstree-loading").removeClass("jstree-loading"); obj.append(d).children("ul").find("li, a").filter(function () { return !this.firstChild || !this.firstChild.tagName || this.firstChild.tagName !== "INS"; }).prepend(" ").end().filter("a").children("ins:first-child").not(".jstree-icon").addClass("jstree-icon"); obj.removeData("jstree_is_loading"); } + this.clean_node(obj); + if(s_call) { s_call.call(this); } + } + else { + if(obj && obj !== -1) { + obj.children("a.jstree-loading").removeClass("jstree-loading"); + obj.removeData("jstree_is_loading"); + if(s.correct_state) { + this.correct_state(obj); + if(s_call) { s_call.call(this); } + } + } + else { + if(s.correct_state) { + this.get_container().children("ul").empty(); + if(s_call) { s_call.call(this); } + } + } + } + }; + s.ajax.context = this; + s.ajax.error = error_func; + s.ajax.success = success_func; + if(!s.ajax.dataType) { s.ajax.dataType = "html"; } + if($.isFunction(s.ajax.url)) { s.ajax.url = s.ajax.url.call(this, obj); } + if($.isFunction(s.ajax.data)) { s.ajax.data = s.ajax.data.call(this, obj); } + $.ajax(s.ajax); + break; + } + } + } + }); + // include the HTML data plugin by default + $.jstree.defaults.plugins.push("html_data"); +})(jQuery); +//*/ + +/* + * jsTree themeroller plugin + * Adds support for jQuery UI themes. Include this at the end of your plugins list, also make sure "themes" is not included. + */ +(function ($) { + $.jstree.plugin("themeroller", { + __init : function () { + var s = this._get_settings().themeroller; + this.get_container() + .addClass("ui-widget-content") + .addClass("jstree-themeroller") + .delegate("a","mouseenter.jstree", function (e) { + if(!$(e.currentTarget).hasClass("jstree-loading")) { + $(this).addClass(s.item_h); + } + }) + .delegate("a","mouseleave.jstree", function () { + $(this).removeClass(s.item_h); + }) + .bind("init.jstree", $.proxy(function (e, data) { + data.inst.get_container().find("> ul > li > .jstree-loading > ins").addClass("ui-icon-refresh"); + this._themeroller(data.inst.get_container().find("> ul > li")); + }, this)) + .bind("open_node.jstree create_node.jstree", $.proxy(function (e, data) { + this._themeroller(data.rslt.obj); + }, this)) + .bind("loaded.jstree refresh.jstree", $.proxy(function (e) { + this._themeroller(); + }, this)) + .bind("close_node.jstree", $.proxy(function (e, data) { + this._themeroller(data.rslt.obj); + }, this)) + .bind("delete_node.jstree", $.proxy(function (e, data) { + this._themeroller(data.rslt.parent); + }, this)) + .bind("correct_state.jstree", $.proxy(function (e, data) { + data.rslt.obj + .children("ins.jstree-icon").removeClass(s.opened + " " + s.closed + " ui-icon").end() + .find("> a > ins.ui-icon") + .filter(function() { + return this.className.toString() + .replace(s.item_clsd,"").replace(s.item_open,"").replace(s.item_leaf,"") + .indexOf("ui-icon-") === -1; + }).removeClass(s.item_open + " " + s.item_clsd).addClass(s.item_leaf || "jstree-no-icon"); + }, this)) + .bind("select_node.jstree", $.proxy(function (e, data) { + data.rslt.obj.children("a").addClass(s.item_a); + }, this)) + .bind("deselect_node.jstree deselect_all.jstree", $.proxy(function (e, data) { + this.get_container() + .find("a." + s.item_a).removeClass(s.item_a).end() + .find("a.jstree-clicked").addClass(s.item_a); + }, this)) + .bind("dehover_node.jstree", $.proxy(function (e, data) { + data.rslt.obj.children("a").removeClass(s.item_h); + }, this)) + .bind("hover_node.jstree", $.proxy(function (e, data) { + this.get_container() + .find("a." + s.item_h).not(data.rslt.obj).removeClass(s.item_h); + data.rslt.obj.children("a").addClass(s.item_h); + }, this)) + .bind("move_node.jstree", $.proxy(function (e, data) { + this._themeroller(data.rslt.o); + this._themeroller(data.rslt.op); + }, this)); + }, + __destroy : function () { + var s = this._get_settings().themeroller, + c = [ "ui-icon" ]; + $.each(s, function (i, v) { + v = v.split(" "); + if(v.length) { c = c.concat(v); } + }); + this.get_container() + .removeClass("ui-widget-content") + .find("." + c.join(", .")).removeClass(c.join(" ")); + }, + _fn : { + _themeroller : function (obj) { + var s = this._get_settings().themeroller; + obj = !obj || obj == -1 ? this.get_container_ul() : this._get_node(obj).parent(); + obj + .find("li.jstree-closed") + .children("ins.jstree-icon").removeClass(s.opened).addClass("ui-icon " + s.closed).end() + .children("a").addClass(s.item) + .children("ins.jstree-icon").addClass("ui-icon") + .filter(function() { + return this.className.toString() + .replace(s.item_clsd,"").replace(s.item_open,"").replace(s.item_leaf,"") + .indexOf("ui-icon-") === -1; + }).removeClass(s.item_leaf + " " + s.item_open).addClass(s.item_clsd || "jstree-no-icon") + .end() + .end() + .end() + .end() + .find("li.jstree-open") + .children("ins.jstree-icon").removeClass(s.closed).addClass("ui-icon " + s.opened).end() + .children("a").addClass(s.item) + .children("ins.jstree-icon").addClass("ui-icon") + .filter(function() { + return this.className.toString() + .replace(s.item_clsd,"").replace(s.item_open,"").replace(s.item_leaf,"") + .indexOf("ui-icon-") === -1; + }).removeClass(s.item_leaf + " " + s.item_clsd).addClass(s.item_open || "jstree-no-icon") + .end() + .end() + .end() + .end() + .find("li.jstree-leaf") + .children("ins.jstree-icon").removeClass(s.closed + " ui-icon " + s.opened).end() + .children("a").addClass(s.item) + .children("ins.jstree-icon").addClass("ui-icon") + .filter(function() { + return this.className.toString() + .replace(s.item_clsd,"").replace(s.item_open,"").replace(s.item_leaf,"") + .indexOf("ui-icon-") === -1; + }).removeClass(s.item_clsd + " " + s.item_open).addClass(s.item_leaf || "jstree-no-icon"); + } + }, + defaults : { + "opened" : "ui-icon-triangle-1-se", + "closed" : "ui-icon-triangle-1-e", + "item" : "ui-state-default", + "item_h" : "ui-state-hover", + "item_a" : "ui-state-active", + "item_open" : "ui-icon-folder-open", + "item_clsd" : "ui-icon-folder-collapsed", + "item_leaf" : "ui-icon-document" + } + }); + $(function() { + var css_string = '' + + '.jstree-themeroller .ui-icon { overflow:visible; } ' + + '.jstree-themeroller a { padding:0 2px; } ' + + '.jstree-themeroller .jstree-no-icon { display:none; }'; + $.vakata.css.add_sheet({ str : css_string, title : "jstree" }); + }); +})(jQuery); +//*/ + +/* + * jsTree unique plugin + * Forces different names amongst siblings (still a bit experimental) + * NOTE: does not check language versions (it will not be possible to have nodes with the same title, even in different languages) + */ +(function ($) { + $.jstree.plugin("unique", { + __init : function () { + this.get_container() + .bind("before.jstree", $.proxy(function (e, data) { + var nms = [], res = true, p, t; + if(data.func == "move_node") { + // obj, ref, position, is_copy, is_prepared, skip_check + if(data.args[4] === true) { + if(data.args[0].o && data.args[0].o.length) { + data.args[0].o.children("a").each(function () { nms.push($(this).text().replace(/^\s+/g,"")); }); + res = this._check_unique(nms, data.args[0].np.find("> ul > li").not(data.args[0].o), "move_node"); + } + } + } + if(data.func == "create_node") { + // obj, position, js, callback, is_loaded + if(data.args[4] || this._is_loaded(data.args[0])) { + p = this._get_node(data.args[0]); + if(data.args[1] && (data.args[1] === "before" || data.args[1] === "after")) { + p = this._get_parent(data.args[0]); + if(!p || p === -1) { p = this.get_container(); } + } + if(typeof data.args[2] === "string") { nms.push(data.args[2]); } + else if(!data.args[2] || !data.args[2].data) { nms.push(this._get_string("new_node")); } + else { nms.push(data.args[2].data); } + res = this._check_unique(nms, p.find("> ul > li"), "create_node"); + } + } + if(data.func == "rename_node") { + // obj, val + nms.push(data.args[1]); + t = this._get_node(data.args[0]); + p = this._get_parent(t); + if(!p || p === -1) { p = this.get_container(); } + res = this._check_unique(nms, p.find("> ul > li").not(t), "rename_node"); + } + if(!res) { + e.stopPropagation(); + return false; + } + }, this)); + }, + defaults : { + error_callback : $.noop + }, + _fn : { + _check_unique : function (nms, p, func) { + var cnms = []; + p.children("a").each(function () { cnms.push($(this).text().replace(/^\s+/g,"")); }); + if(!cnms.length || !nms.length) { return true; } + cnms = cnms.sort().join(",,").replace(/(,|^)([^,]+)(,,\2)+(,|$)/g,"$1$2$4").replace(/,,+/g,",").replace(/,$/,"").split(","); + if((cnms.length + nms.length) != cnms.concat(nms).sort().join(",,").replace(/(,|^)([^,]+)(,,\2)+(,|$)/g,"$1$2$4").replace(/,,+/g,",").replace(/,$/,"").split(",").length) { + this._get_settings().unique.error_callback.call(null, nms, p, func); + return false; + } + return true; + }, + check_move : function () { + if(!this.__call_old()) { return false; } + var p = this._get_move(), nms = []; + if(p.o && p.o.length) { + p.o.children("a").each(function () { nms.push($(this).text().replace(/^\s+/g,"")); }); + return this._check_unique(nms, p.np.find("> ul > li").not(p.o), "check_move"); + } + return true; + } + } + }); +})(jQuery); +//*/ + +/* + * jsTree wholerow plugin + * Makes select and hover work on the entire width of the node + * MAY BE HEAVY IN LARGE DOM + */ +(function ($) { + $.jstree.plugin("wholerow", { + __init : function () { + if(!this.data.ui) { throw "jsTree wholerow: jsTree UI plugin not included."; } + this.data.wholerow.html = false; + this.data.wholerow.to = false; + this.get_container() + .bind("init.jstree", $.proxy(function (e, data) { + this._get_settings().core.animation = 0; + }, this)) + .bind("open_node.jstree create_node.jstree clean_node.jstree loaded.jstree", $.proxy(function (e, data) { + this._prepare_wholerow_span( data && data.rslt && data.rslt.obj ? data.rslt.obj : -1 ); + }, this)) + .bind("search.jstree clear_search.jstree reopen.jstree after_open.jstree after_close.jstree create_node.jstree delete_node.jstree clean_node.jstree", $.proxy(function (e, data) { + if(this.data.to) { clearTimeout(this.data.to); } + this.data.to = setTimeout( (function (t, o) { return function() { t._prepare_wholerow_ul(o); }; })(this, data && data.rslt && data.rslt.obj ? data.rslt.obj : -1), 0); + }, this)) + .bind("deselect_all.jstree", $.proxy(function (e, data) { + this.get_container().find(" > .jstree-wholerow .jstree-clicked").removeClass("jstree-clicked " + (this.data.themeroller ? this._get_settings().themeroller.item_a : "" )); + }, this)) + .bind("select_node.jstree deselect_node.jstree ", $.proxy(function (e, data) { + data.rslt.obj.each(function () { + var ref = data.inst.get_container().find(" > .jstree-wholerow li:visible:eq(" + ( parseInt((($(this).offset().top - data.inst.get_container().offset().top + data.inst.get_container()[0].scrollTop) / data.inst.data.core.li_height),10)) + ")"); + // ref.children("a")[e.type === "select_node" ? "addClass" : "removeClass"]("jstree-clicked"); + ref.children("a").attr("class",data.rslt.obj.children("a").attr("class")); + }); + }, this)) + .bind("hover_node.jstree dehover_node.jstree", $.proxy(function (e, data) { + this.get_container().find(" > .jstree-wholerow .jstree-hovered").removeClass("jstree-hovered " + (this.data.themeroller ? this._get_settings().themeroller.item_h : "" )); + if(e.type === "hover_node") { + var ref = this.get_container().find(" > .jstree-wholerow li:visible:eq(" + ( parseInt(((data.rslt.obj.offset().top - this.get_container().offset().top + this.get_container()[0].scrollTop) / this.data.core.li_height),10)) + ")"); + // ref.children("a").addClass("jstree-hovered"); + ref.children("a").attr("class",data.rslt.obj.children(".jstree-hovered").attr("class")); + } + }, this)) + .delegate(".jstree-wholerow-span, ins.jstree-icon, li", "click.jstree", function (e) { + var n = $(e.currentTarget); + if(e.target.tagName === "A" || (e.target.tagName === "INS" && n.closest("li").is(".jstree-open, .jstree-closed"))) { return; } + n.closest("li").children("a:visible:eq(0)").click(); + e.stopImmediatePropagation(); + }) + .delegate("li", "mouseover.jstree", $.proxy(function (e) { + e.stopImmediatePropagation(); + if($(e.currentTarget).children(".jstree-hovered, .jstree-clicked").length) { return false; } + this.hover_node(e.currentTarget); + return false; + }, this)) + .delegate("li", "mouseleave.jstree", $.proxy(function (e) { + if($(e.currentTarget).children("a").hasClass("jstree-hovered").length) { return; } + this.dehover_node(e.currentTarget); + }, this)); + if(is_ie7 || is_ie6) { + $.vakata.css.add_sheet({ str : ".jstree-" + this.get_index() + " { position:relative; } ", title : "jstree" }); + } + }, + defaults : { + }, + __destroy : function () { + this.get_container().children(".jstree-wholerow").remove(); + this.get_container().find(".jstree-wholerow-span").remove(); + }, + _fn : { + _prepare_wholerow_span : function (obj) { + obj = !obj || obj == -1 ? this.get_container().find("> ul > li") : this._get_node(obj); + if(obj === false) { return; } // added for removing root nodes + obj.each(function () { + $(this).find("li").andSelf().each(function () { + var $t = $(this); + if($t.children(".jstree-wholerow-span").length) { return true; } + $t.prepend(" "); + }); + }); + }, + _prepare_wholerow_ul : function () { + var o = this.get_container().children("ul").eq(0), h = o.html(); + o.addClass("jstree-wholerow-real"); + if(this.data.wholerow.last_html !== h) { + this.data.wholerow.last_html = h; + this.get_container().children(".jstree-wholerow").remove(); + this.get_container().append( + o.clone().removeClass("jstree-wholerow-real") + .wrapAll("
                      ").parent() + .width(o.parent()[0].scrollWidth) + .css("top", (o.height() + ( is_ie7 ? 5 : 0)) * -1 ) + .find("li[id]").each(function () { this.removeAttribute("id"); }).end() + ); + } + } + } + }); + $(function() { + var css_string = '' + + '.jstree .jstree-wholerow-real { position:relative; z-index:1; } ' + + '.jstree .jstree-wholerow-real li { cursor:pointer; } ' + + '.jstree .jstree-wholerow-real a { border-left-color:transparent !important; border-right-color:transparent !important; } ' + + '.jstree .jstree-wholerow { position:relative; z-index:0; height:0; } ' + + '.jstree .jstree-wholerow ul, .jstree .jstree-wholerow li { width:100%; } ' + + '.jstree .jstree-wholerow, .jstree .jstree-wholerow ul, .jstree .jstree-wholerow li, .jstree .jstree-wholerow a { margin:0 !important; padding:0 !important; } ' + + '.jstree .jstree-wholerow, .jstree .jstree-wholerow ul, .jstree .jstree-wholerow li { background:transparent !important; }' + + '.jstree .jstree-wholerow ins, .jstree .jstree-wholerow span, .jstree .jstree-wholerow input { display:none !important; }' + + '.jstree .jstree-wholerow a, .jstree .jstree-wholerow a:hover { text-indent:-9999px; !important; width:100%; padding:0 !important; border-right-width:0px !important; border-left-width:0px !important; } ' + + '.jstree .jstree-wholerow-span { position:absolute; left:0; margin:0px; padding:0; height:18px; border-width:0; padding:0; z-index:0; }'; + if(is_ff2) { + css_string += '' + + '.jstree .jstree-wholerow a { display:block; height:18px; margin:0; padding:0; border:0; } ' + + '.jstree .jstree-wholerow-real a { border-color:transparent !important; } '; + } + if(is_ie7 || is_ie6) { + css_string += '' + + '.jstree .jstree-wholerow, .jstree .jstree-wholerow li, .jstree .jstree-wholerow ul, .jstree .jstree-wholerow a { margin:0; padding:0; line-height:18px; } ' + + '.jstree .jstree-wholerow a { display:block; height:18px; line-height:18px; overflow:hidden; } '; + } + $.vakata.css.add_sheet({ str : css_string, title : "jstree" }); + }); +})(jQuery); +//*/ + +/* +* jsTree model plugin +* This plugin gets jstree to use a class model to retrieve data, creating great dynamism +*/ +(function ($) { + var nodeInterface = ["getChildren","getChildrenCount","getAttr","getName","getProps"], + validateInterface = function(obj, inter) { + var valid = true; + obj = obj || {}; + inter = [].concat(inter); + $.each(inter, function (i, v) { + if(!$.isFunction(obj[v])) { valid = false; return false; } + }); + return valid; + }; + $.jstree.plugin("model", { + __init : function () { + if(!this.data.json_data) { throw "jsTree model: jsTree json_data plugin not included."; } + this._get_settings().json_data.data = function (n, b) { + var obj = (n == -1) ? this._get_settings().model.object : n.data("jstree_model"); + if(!validateInterface(obj, nodeInterface)) { return b.call(null, false); } + if(this._get_settings().model.async) { + obj.getChildren($.proxy(function (data) { + this.model_done(data, b); + }, this)); + } + else { + this.model_done(obj.getChildren(), b); + } + }; + }, + defaults : { + object : false, + id_prefix : false, + async : false + }, + _fn : { + model_done : function (data, callback) { + var ret = [], + s = this._get_settings(), + _this = this; + + if(!$.isArray(data)) { data = [data]; } + $.each(data, function (i, nd) { + var r = nd.getProps() || {}; + r.attr = nd.getAttr() || {}; + if(nd.getChildrenCount()) { r.state = "closed"; } + r.data = nd.getName(); + if(!$.isArray(r.data)) { r.data = [r.data]; } + if(_this.data.types && $.isFunction(nd.getType)) { + r.attr[s.types.type_attr] = nd.getType(); + } + if(r.attr.id && s.model.id_prefix) { r.attr.id = s.model.id_prefix + r.attr.id; } + if(!r.metadata) { r.metadata = { }; } + r.metadata.jstree_model = nd; + ret.push(r); + }); + callback.call(null, ret); + } + } + }); +})(jQuery); +//*/ + +})(); \ No newline at end of file diff --git a/module/viewer/lib/js/jtree/themes/apple/bg.jpg b/module/viewer/lib/js/jtree/themes/apple/bg.jpg new file mode 100644 index 0000000000000000000000000000000000000000..3aad05d8fadd75f8d9e02866f695b486f0b46343 GIT binary patch literal 331 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 literal 0 HcmV?d00001 diff --git a/module/viewer/lib/js/jtree/themes/apple/style.css b/module/viewer/lib/js/jtree/themes/apple/style.css new file mode 100644 index 0000000..db7a143 --- /dev/null +++ b/module/viewer/lib/js/jtree/themes/apple/style.css @@ -0,0 +1,61 @@ +/* + * jsTree apple theme 1.0 + * Supported features: dots/no-dots, icons/no-icons, focused, loading + * Supported plugins: ui (hovered, clicked), checkbox, contextmenu, search + */ + +.jstree-apple > ul { background:url("bg.jpg") left top repeat; } +.jstree-apple li, +.jstree-apple ins { background-image:url("d.png"); background-repeat:no-repeat; background-color:transparent; } +.jstree-apple li { background-position:-90px 0; background-repeat:repeat-y; } +.jstree-apple li.jstree-last { background:transparent; } +.jstree-apple .jstree-open > ins { background-position:-72px 0; } +.jstree-apple .jstree-closed > ins { background-position:-54px 0; } +.jstree-apple .jstree-leaf > ins { background-position:-36px 0; } + +.jstree-apple a { border-radius:4px; -moz-border-radius:4px; -webkit-border-radius:4px; text-shadow:1px 1px 1px white; } +.jstree-apple .jstree-hovered { background:#e7f4f9; border:1px solid #d8f0fa; padding:0 3px 0 1px; text-shadow:1px 1px 1px silver; } +.jstree-apple .jstree-clicked { background:#beebff; border:1px solid #99defd; padding:0 3px 0 1px; } +.jstree-apple a .jstree-icon { background-position:-56px -20px; } +.jstree-apple a.jstree-loading .jstree-icon { background:url("throbber.gif") center center no-repeat !important; } + +.jstree-apple.jstree-focused { background:white; } + +.jstree-apple .jstree-no-dots li, +.jstree-apple .jstree-no-dots .jstree-leaf > ins { background:transparent; } +.jstree-apple .jstree-no-dots .jstree-open > ins { background-position:-18px 0; } +.jstree-apple .jstree-no-dots .jstree-closed > ins { background-position:0 0; } + +.jstree-apple .jstree-no-icons a .jstree-icon { display:none; } + +.jstree-apple .jstree-search { font-style:italic; } + +.jstree-apple .jstree-no-icons .jstree-checkbox { display:inline-block; } +.jstree-apple .jstree-no-checkboxes .jstree-checkbox { display:none !important; } +.jstree-apple .jstree-checked > a > .jstree-checkbox { background-position:-38px -19px; } +.jstree-apple .jstree-unchecked > a > .jstree-checkbox { background-position:-2px -19px; } +.jstree-apple .jstree-undetermined > a > .jstree-checkbox { background-position:-20px -19px; } +.jstree-apple .jstree-checked > a > .checkbox:hover { background-position:-38px -37px; } +.jstree-apple .jstree-unchecked > a > .jstree-checkbox:hover { background-position:-2px -37px; } +.jstree-apple .jstree-undetermined > a > .jstree-checkbox:hover { background-position:-20px -37px; } + +#vakata-dragged.jstree-apple ins { background:transparent !important; } +#vakata-dragged.jstree-apple .jstree-ok { background:url("d.png") -2px -53px no-repeat !important; } +#vakata-dragged.jstree-apple .jstree-invalid { background:url("d.png") -18px -53px no-repeat !important; } +#jstree-marker.jstree-apple { background:url("d.png") -41px -57px no-repeat !important; text-indent:-100px; } + +.jstree-apple a.jstree-search { color:aqua; } +.jstree-apple .jstree-locked a { color:silver; cursor:default; } + +#vakata-contextmenu.jstree-apple-context, +#vakata-contextmenu.jstree-apple-context li ul { background:#f0f0f0; border:1px solid #979797; -moz-box-shadow: 1px 1px 2px #999; -webkit-box-shadow: 1px 1px 2px #999; box-shadow: 1px 1px 2px #999; } +#vakata-contextmenu.jstree-apple-context li { } +#vakata-contextmenu.jstree-apple-context a { color:black; } +#vakata-contextmenu.jstree-apple-context a:hover, +#vakata-contextmenu.jstree-apple-context .vakata-hover > a { padding:0 5px; background:#e8eff7; border:1px solid #aecff7; color:black; -moz-border-radius:2px; -webkit-border-radius:2px; border-radius:2px; } +#vakata-contextmenu.jstree-apple-context li.jstree-contextmenu-disabled a, +#vakata-contextmenu.jstree-apple-context li.jstree-contextmenu-disabled a:hover { color:silver; background:transparent; border:0; padding:1px 4px; } +#vakata-contextmenu.jstree-apple-context li.vakata-separator { background:white; border-top:1px solid #e0e0e0; margin:0; } +#vakata-contextmenu.jstree-apple-context li ul { margin-left:-4px; } + +/* TODO: IE6 support - the `>` selectors */ \ No newline at end of file diff --git a/module/viewer/lib/js/jtree/themes/apple/throbber.gif b/module/viewer/lib/js/jtree/themes/apple/throbber.gif new file mode 100644 index 0000000000000000000000000000000000000000..5b33f7e54f4e55b6b8774d86d96895db9af044b4 GIT binary patch literal 1849 zcma*odr(tX9tZI2z31lM+(&YVk%mZ}5P~KlG2s=WSbGzm0!x7^P##Mnh7t-jP!X0Q zk_SQ}Po-L1tlDK;6l?(>v)e5ZBQx4|Y-Q?nr@Px3?9h(3ZWr3^tj=`TP57gKr87N$ zp2wWee1GRRCwo_xahnw)5cxNPJbCg2L6DV|6`#+yw6v6!mDS$f9-JvFD^n;GQ&UrZ zzh5jCkByB101O60U0q#p_1BM>Cv-vP?&s4@g_((4_1L=L$(a91)0=J91Gas#R{McE znYG^9*0A5YZ>#;~+Wkn(W5B0^yELIYLP!K}mB~<)AM@1&nqekynuaEGqPrzoH|KodRXJy)%+w_fu3nE5>@Bd_b zqC$EQ;{c`T&?EsNO|igL9gC7Ygxv?aQUEXMq?~>wg{EyW;VcJ37CUF#HjrT=KQO_* zS>M9yydXk18D(+QDJ1>r);Lav_uYKp$T?4vr{Q$lTo&pKv^?(>L-)G2*lwH!Ah7k? z7oH<8h-(KTKt5V6$8gF)C7Io&P5=SjTh)=zV=E2EUhQZP##L8S{d%UK>>+y82>+FV+#^BzW7u3F)Bb>=lYQ%%j`F>ASe zo*cw@V#u6T`A2He;70mR(V&iV&-7{qP~=SRf&jm9-T{*ZeZ}$rd0#6c&fLG^xJcf5 z+p<`wJYgW+_s*V{uI$nMB;%8`S_3>PfGOj3Rq}@Cx^+j?rk92fANSFDBYnOqQ>Vdj z)(|$AhP4t&Lb=Gvo2#3Gl%9<=Gv`Mz?Po@P4iLF!x}GUWJICDlFk-hS^Whyh7x~VH z@0vD1>HYD4&e+~yzS*-sFR{9`{QEEZO1zg7>R&7cHts-6j!xHVdA8eI+ZlVzd%`es zJT@$#GX(gvCJ1oJN%yLBK}{V=V;seo;!w|Yte!W1%5qLNFWqvZW>h&IiH+oPT=b@E zPhGzv5=(Un*X>v`>%8h_nj^NdYcE6NHS_ifkCV$*D)Tqrbu`s;<=t<4 zAHNqNV?6(g<1PY-w@#I-WYFViz?9TrkMr)u0g`O`u|>T;k|2sV*YF^punvT;$SuTy{j3Gv)yqD!R_CF>yR)MzmmYS5v+~R zXAdD%ng9?df;wd8GxR#%3O+gz};Vo;)sK%Bj-q>Oq%R7JU-KD?vYu>#2UjaDo z&8$>5xW~?KPD_#XFToU1hIb*VOMidUr6iYiO0N|i-7s`T8!cFT`rN!^1Pt78J93i6 z5HI1wIM$94m{3SLDvISDe6$ZG1;eq_D9RTaaC>=cO{@Bs>$IlPCPJJ$h$)-3vzNUQ6OsN#_zWxey!_9%hxwH2_dEJi=yY|1c7nDm2_Lm!Cof8-R_+9UkS zcBE(o47yE)oMR(Q=dp1a2wTX5KvvGyLqlWTa7V&!A*|w|)ax~1_~aJ0=_Lilg*0iQk7#ZD EAHN$8j{pDw literal 0 HcmV?d00001 diff --git a/module/viewer/lib/js/jtree/themes/classic/d.gif b/module/viewer/lib/js/jtree/themes/classic/d.gif new file mode 100644 index 0000000000000000000000000000000000000000..6eb0004ce3544f9973ddbd5a2c450fc0e1a354b1 GIT binary patch literal 3003 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 literal 0 HcmV?d00001 diff --git a/module/viewer/lib/js/jtree/themes/classic/d.png b/module/viewer/lib/js/jtree/themes/classic/d.png new file mode 100644 index 0000000000000000000000000000000000000000..275daeca2d6ae2ba9cf59bd23a194d13a35a825d GIT binary patch literal 7535 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 FV1ky2eG>ox literal 0 HcmV?d00001 diff --git a/module/viewer/lib/js/jtree/themes/classic/dot_for_ie.gif b/module/viewer/lib/js/jtree/themes/classic/dot_for_ie.gif new file mode 100644 index 0000000000000000000000000000000000000000..c0cc5fda7cfb9539720de442a3caca9c9a3fc4cb GIT binary patch literal 43 vcmZ?wbhEHbWMW`qXkcKFla>7c|G(l-7DfgJMg|=QAOOiQFfqBrF<1it%E1S( literal 0 HcmV?d00001 diff --git a/module/viewer/lib/js/jtree/themes/classic/style.css b/module/viewer/lib/js/jtree/themes/classic/style.css new file mode 100644 index 0000000..21cd624 --- /dev/null +++ b/module/viewer/lib/js/jtree/themes/classic/style.css @@ -0,0 +1,76 @@ +/* + * jsTree classic theme 1.0 + * Supported features: dots/no-dots, icons/no-icons, focused, loading + * Supported plugins: ui (hovered, clicked), checkbox, contextmenu, search + */ + +.jstree-classic li, +.jstree-classic ins { background-image:url("d.png"); background-repeat:no-repeat; background-color:transparent; } +.jstree-classic li { background-position:-90px 0; background-repeat:repeat-y; } +.jstree-classic li.jstree-last { background:transparent; } +.jstree-classic .jstree-open > ins { background-position:-72px 0; } +.jstree-classic .jstree-closed > ins { background-position:-54px 0; } +.jstree-classic .jstree-leaf > ins { background-position:-36px 0; } + +.jstree-classic .jstree-hovered { background:#e7f4f9; border:1px solid #e7f4f9; padding:0 2px 0 1px; } +.jstree-classic .jstree-clicked { background:navy; border:1px solid navy; padding:0 2px 0 1px; color:white; } +.jstree-classic a .jstree-icon { background-position:-56px -19px; } +.jstree-classic .jstree-open > a .jstree-icon { background-position:-56px -36px; } +.jstree-classic a.jstree-loading .jstree-icon { background:url("throbber.gif") center center no-repeat !important; } + +.jstree-classic.jstree-focused { background:white; } + +.jstree-classic .jstree-no-dots li, +.jstree-classic .jstree-no-dots .jstree-leaf > ins { background:transparent; } +.jstree-classic .jstree-no-dots .jstree-open > ins { background-position:-18px 0; } +.jstree-classic .jstree-no-dots .jstree-closed > ins { background-position:0 0; } + +.jstree-classic .jstree-no-icons a .jstree-icon { display:none; } + +.jstree-classic .jstree-search { font-style:italic; } + +.jstree-classic .jstree-no-icons .jstree-checkbox { display:inline-block; } +.jstree-classic .jstree-no-checkboxes .jstree-checkbox { display:none !important; } +.jstree-classic .jstree-checked > a > .jstree-checkbox { background-position:-38px -19px; } +.jstree-classic .jstree-unchecked > a > .jstree-checkbox { background-position:-2px -19px; } +.jstree-classic .jstree-undetermined > a > .jstree-checkbox { background-position:-20px -19px; } +.jstree-classic .jstree-checked > a > .jstree-checkbox:hover { background-position:-38px -37px; } +.jstree-classic .jstree-unchecked > a > .jstree-checkbox:hover { background-position:-2px -37px; } +.jstree-classic .jstree-undetermined > a > .jstree-checkbox:hover { background-position:-20px -37px; } + +#vakata-dragged.jstree-classic ins { background:transparent !important; } +#vakata-dragged.jstree-classic .jstree-ok { background:url("d.png") -2px -53px no-repeat !important; } +#vakata-dragged.jstree-classic .jstree-invalid { background:url("d.png") -18px -53px no-repeat !important; } +#jstree-marker.jstree-classic { background:url("d.png") -41px -57px no-repeat !important; text-indent:-100px; } + +.jstree-classic a.jstree-search { color:aqua; } +.jstree-classic .jstree-locked a { color:silver; cursor:default; } + +#vakata-contextmenu.jstree-classic-context, +#vakata-contextmenu.jstree-classic-context li ul { background:#f0f0f0; border:1px solid #979797; -moz-box-shadow: 1px 1px 2px #999; -webkit-box-shadow: 1px 1px 2px #999; box-shadow: 1px 1px 2px #999; } +#vakata-contextmenu.jstree-classic-context li a { color:white; } +#vakata-contextmenu.jstree-classic-context a:hover, +#vakata-contextmenu.jstree-classic-context .vakata-hover > a { padding:0 5px; background:#e8eff7; border:1px solid #aecff7; color:black; -moz-border-radius:2px; -webkit-border-radius:2px; border-radius:2px; } +#vakata-contextmenu.jstree-classic-context li.jstree-contextmenu-disabled a, +#vakata-contextmenu.jstree-classic-context li.jstree-contextmenu-disabled a:hover { color:silver; background:transparent; border:0; padding:1px 4px; } +#vakata-contextmenu.jstree-classic-context li.vakata-separator { background:white; border-top:1px solid #e0e0e0; margin:0; } +#vakata-contextmenu.jstree-classic-context li ul { margin-left:-4px; } + +/* IE6 BEGIN */ +.jstree-classic li, +.jstree-classic ins, +#vakata-dragged.jstree-classic .jstree-invalid, +#vakata-dragged.jstree-classic .jstree-ok, +#jstree-marker.jstree-classic { _background-image:url("d.gif"); } +.jstree-classic .jstree-open ins { _background-position:-72px 0; } +.jstree-classic .jstree-closed ins { _background-position:-54px 0; } +.jstree-classic .jstree-leaf ins { _background-position:-36px 0; } +.jstree-classic .jstree-open a ins.jstree-icon { _background-position:-56px -36px; } +.jstree-classic .jstree-closed a ins.jstree-icon { _background-position:-56px -19px; } +.jstree-classic .jstree-leaf a ins.jstree-icon { _background-position:-56px -19px; } +#vakata-contextmenu.jstree-classic-context ins { _display:none; } +#vakata-contextmenu.jstree-classic-context li { _zoom:1; } +.jstree-classic .jstree-undetermined a .jstree-checkbox { _background-position:-20px -19px; } +.jstree-classic .jstree-checked a .jstree-checkbox { _background-position:-38px -19px; } +.jstree-classic .jstree-unchecked a .jstree-checkbox { _background-position:-2px -19px; } +/* IE6 END */ \ No newline at end of file diff --git a/module/viewer/lib/js/jtree/themes/classic/throbber.gif b/module/viewer/lib/js/jtree/themes/classic/throbber.gif new file mode 100644 index 0000000000000000000000000000000000000000..5b33f7e54f4e55b6b8774d86d96895db9af044b4 GIT binary patch literal 1849 zcma*odr(tX9tZI2z31lM+(&YVk%mZ}5P~KlG2s=WSbGzm0!x7^P##Mnh7t-jP!X0Q zk_SQ}Po-L1tlDK;6l?(>v)e5ZBQx4|Y-Q?nr@Px3?9h(3ZWr3^tj=`TP57gKr87N$ zp2wWee1GRRCwo_xahnw)5cxNPJbCg2L6DV|6`#+yw6v6!mDS$f9-JvFD^n;GQ&UrZ zzh5jCkByB101O60U0q#p_1BM>Cv-vP?&s4@g_((4_1L=L$(a91)0=J91Gas#R{McE znYG^9*0A5YZ>#;~+Wkn(W5B0^yELIYLP!K}mB~<)AM@1&nqekynuaEGqPrzoH|KodRXJy)%+w_fu3nE5>@Bd_b zqC$EQ;{c`T&?EsNO|igL9gC7Ygxv?aQUEXMq?~>wg{EyW;VcJ37CUF#HjrT=KQO_* zS>M9yydXk18D(+QDJ1>r);Lav_uYKp$T?4vr{Q$lTo&pKv^?(>L-)G2*lwH!Ah7k? z7oH<8h-(KTKt5V6$8gF)C7Io&P5=SjTh)=zV=E2EUhQZP##L8S{d%UK>>+y82>+FV+#^BzW7u3F)Bb>=lYQ%%j`F>ASe zo*cw@V#u6T`A2He;70mR(V&iV&-7{qP~=SRf&jm9-T{*ZeZ}$rd0#6c&fLG^xJcf5 z+p<`wJYgW+_s*V{uI$nMB;%8`S_3>PfGOj3Rq}@Cx^+j?rk92fANSFDBYnOqQ>Vdj z)(|$AhP4t&Lb=Gvo2#3Gl%9<=Gv`Mz?Po@P4iLF!x}GUWJICDlFk-hS^Whyh7x~VH z@0vD1>HYD4&e+~yzS*-sFR{9`{QEEZO1zg7>R&7cHts-6j!xHVdA8eI+ZlVzd%`es zJT@$#GX(gvCJ1oJN%yLBK}{V=V;seo;!w|Yte!W1%5qLNFWqvZW>h&IiH+oPT=b@E zPhGzv5=(Un*X>v`>%8h_nj^NdYcE6NHS_ifkCV$*D)Tqrbu`s;<=t<4 zAHNqNV?6(g<1PY-w@#I-WYFViz?9TrkMr)u0g`O`u|>T;k|2sV*YF^punvT;$SuTy{j3Gv)yqD!R_CF>yR)MzmmYS5v+~R zXAdD%ng9?df;wd8GxR#%3O+gz};Vo;)sK%Bj-q>Oq%R7JU-KD?vYu>#2UjaDo z&8$>5xW~?KPD_#XFToU1hIb*VOMidUr6iYiO0N|i-7s`T8!cFT`rN!^1Pt78J93i6 z5HI1wIM$94m{3SLDvISDe6$ZG1;eq_D9RTaaC>=cO{@Bs>$IlPCPJJ$h$)-3vzNUQ6OsN#_zWxey!_9%hxwH2_dEJi=yY|1c7nDm2_Lm!Cof8-R_+9UkS zcBE(o47yE)oMR(Q=dp1a2wTX5KvvGyLqlWTa7V&!A*|w|)ax~1_~aJ0=_Lilg*0iQk7#ZD EAHN$8j{pDw literal 0 HcmV?d00001 diff --git a/module/viewer/lib/js/jtree/themes/default-rtl/d.gif b/module/viewer/lib/js/jtree/themes/default-rtl/d.gif new file mode 100644 index 0000000000000000000000000000000000000000..d85aba049b5c45649fcbb889a3765c39f3a3678a GIT binary patch literal 2872 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 literal 0 HcmV?d00001 diff --git a/module/viewer/lib/js/jtree/themes/default-rtl/dots.gif b/module/viewer/lib/js/jtree/themes/default-rtl/dots.gif new file mode 100644 index 0000000000000000000000000000000000000000..00433648c0769d3b473e6c972e6314f16e5a29f6 GIT binary patch literal 132 zcmZ?wbhEHb6k^C>XkcKFm6iVg|G(l-7DfgJMg|=QAOOiQFh%$DujG2o@7!&2t}F81 zi%)NALp7pQE0R)nt;u<`&t1p+tMlofyEoVVvS#&m4*XdBM8(|u%G$3jZi&HJrDaFc ka&IroI(@dv{ej`poLAGXzuGqAZ(00B0V}?F8Vn590H|{~1^@s6 literal 0 HcmV?d00001 diff --git a/module/viewer/lib/js/jtree/themes/default-rtl/style.css b/module/viewer/lib/js/jtree/themes/default-rtl/style.css new file mode 100644 index 0000000..d51aef6 --- /dev/null +++ b/module/viewer/lib/js/jtree/themes/default-rtl/style.css @@ -0,0 +1,84 @@ +/* + * jsTree default-rtl theme 1.0 + * Supported features: dots/no-dots, icons/no-icons, focused, loading + * Supported plugins: ui (hovered, clicked), checkbox, contextmenu, search + */ + +.jstree-default-rtl li, +.jstree-default-rtl ins { background-image:url("d.png"); background-repeat:no-repeat; background-color:transparent; } +.jstree-default-rtl li { background-position:-90px 0; background-repeat:repeat-y; } +.jstree-default-rtl li.jstree-last { background:transparent; } +.jstree-default-rtl .jstree-open > ins { background-position:-72px 0; } +.jstree-default-rtl .jstree-closed > ins { background-position:-54px 0; } +.jstree-default-rtl .jstree-leaf > ins { background-position:-36px 0; } + +.jstree-default-rtl .jstree-hovered { background:#e7f4f9; border:1px solid #d8f0fa; padding:0 2px 0 1px; } +.jstree-default-rtl .jstree-clicked { background:#beebff; border:1px solid #99defd; padding:0 2px 0 1px; } +.jstree-default-rtl a .jstree-icon { background-position:-56px -19px; } +.jstree-default-rtl a.jstree-loading .jstree-icon { background:url("throbber.gif") center center no-repeat !important; } + +.jstree-default-rtl.jstree-focused { background:#ffffee; } + +.jstree-default-rtl .jstree-no-dots li, +.jstree-default-rtl .jstree-no-dots .jstree-leaf > ins { background:transparent; } +.jstree-default-rtl .jstree-no-dots .jstree-open > ins { background-position:-18px 0; } +.jstree-default-rtl .jstree-no-dots .jstree-closed > ins { background-position:0 0; } + +.jstree-default-rtl .jstree-no-icons a .jstree-icon { display:none; } + +.jstree-default-rtl .jstree-search { font-style:italic; } + +.jstree-default-rtl .jstree-no-icons .jstree-checkbox { display:inline-block; } +.jstree-default-rtl .jstree-no-checkboxes .jstree-checkbox { display:none !important; } +.jstree-default-rtl .jstree-checked > a > .jstree-checkbox { background-position:-38px -19px; } +.jstree-default-rtl .jstree-unchecked > a > .jstree-checkbox { background-position:-2px -19px; } +.jstree-default-rtl .jstree-undetermined > a > .jstree-checkbox { background-position:-20px -19px; } +.jstree-default-rtl .jstree-checked > a > .jstree-checkbox:hover { background-position:-38px -37px; } +.jstree-default-rtl .jstree-unchecked > a > .jstree-checkbox:hover { background-position:-2px -37px; } +.jstree-default-rtl .jstree-undetermined > a > .jstree-checkbox:hover { background-position:-20px -37px; } + +#vakata-dragged.jstree-default-rtl ins { background:transparent !important; } +#vakata-dragged.jstree-default-rtl .jstree-ok { background:url("d.png") -2px -53px no-repeat !important; } +#vakata-dragged.jstree-default-rtl .jstree-invalid { background:url("d.png") -18px -53px no-repeat !important; } +#jstree-marker.jstree-default-rtl { background:url("d.png") -41px -57px no-repeat !important; text-indent:-100px; } + +.jstree-default-rtl a.jstree-search { color:aqua; } +.jstree-default-rtl .jstree-locked a { color:silver; cursor:default; } + +#vakata-contextmenu.jstree-default-rtl-context, +#vakata-contextmenu.jstree-default-rtl-context li ul { background:#f0f0f0; border:1px solid #979797; -moz-box-shadow: 1px 1px 2px #999; -webkit-box-shadow: 1px 1px 2px #999; box-shadow: 1px 1px 2px #999; } +#vakata-contextmenu.jstree-default-rtl-context li { } +#vakata-contextmenu.jstree-default-rtl-context a { color:black; } +#vakata-contextmenu.jstree-default-rtl-context a:hover, +#vakata-contextmenu.jstree-default-rtl-context .vakata-hover > a { padding:0 5px; background:#e8eff7; border:1px solid #aecff7; color:black; -moz-border-radius:2px; -webkit-border-radius:2px; border-radius:2px; } +#vakata-contextmenu.jstree-default-rtl-context li.jstree-contextmenu-disabled a, +#vakata-contextmenu.jstree-default-rtl-context li.jstree-contextmenu-disabled a:hover { color:silver; background:transparent; border:0; padding:1px 4px; } +#vakata-contextmenu.jstree-default-rtl-context li.vakata-separator { background:white; border-top:1px solid #e0e0e0; margin:0; } +#vakata-contextmenu.jstree-default-rtl-context li ul { margin-left:-4px; } + +/* IE6 BEGIN */ +.jstree-default-rtl li, +.jstree-default-rtl ins, +#vakata-dragged.jstree-default-rtl .jstree-invalid, +#vakata-dragged.jstree-default-rtl .jstree-ok, +#jstree-marker.jstree-default-rtl { _background-image:url("d.gif"); } +.jstree-default-rtl .jstree-open ins { _background-position:-72px 0; } +.jstree-default-rtl .jstree-closed ins { _background-position:-54px 0; } +.jstree-default-rtl .jstree-leaf ins { _background-position:-36px 0; } +.jstree-default-rtl a ins.jstree-icon { _background-position:-56px -19px; } +#vakata-contextmenu.jstree-default-rtl-context ins { _display:none; } +#vakata-contextmenu.jstree-default-rtl-context li { _zoom:1; } +.jstree-default-rtl .jstree-undetermined a .jstree-checkbox { _background-position:-18px -19px; } +.jstree-default-rtl .jstree-checked a .jstree-checkbox { _background-position:-36px -19px; } +.jstree-default-rtl .jstree-unchecked a .jstree-checkbox { _background-position:0px -19px; } +/* IE6 END */ + +/* RTL part */ +.jstree-default-rtl .jstree-hovered, .jstree-default-rtl .jstree-clicked { padding:0 1px 0 2px; } +.jstree-default-rtl li { background-image:url("dots.gif"); background-position: 100% 0px; } +.jstree-default-rtl .jstree-checked > a > .jstree-checkbox { background-position:-36px -19px; margin-left:2px; } +.jstree-default-rtl .jstree-unchecked > a > .jstree-checkbox { background-position:0px -19px; margin-left:2px; } +.jstree-default-rtl .jstree-undetermined > a > .jstree-checkbox { background-position:-18px -19px; margin-left:2px; } +.jstree-default-rtl .jstree-checked > a > .jstree-checkbox:hover { background-position:-36px -37px; } +.jstree-default-rtl .jstree-unchecked > a > .jstree-checkbox:hover { background-position:0px -37px; } +.jstree-default-rtl .jstree-undetermined > a > .jstree-checkbox:hover { background-position:-18px -37px; } \ No newline at end of file diff --git a/module/viewer/lib/js/jtree/themes/default-rtl/throbber.gif b/module/viewer/lib/js/jtree/themes/default-rtl/throbber.gif new file mode 100644 index 0000000000000000000000000000000000000000..5b33f7e54f4e55b6b8774d86d96895db9af044b4 GIT binary patch literal 1849 zcma*odr(tX9tZI2z31lM+(&YVk%mZ}5P~KlG2s=WSbGzm0!x7^P##Mnh7t-jP!X0Q zk_SQ}Po-L1tlDK;6l?(>v)e5ZBQx4|Y-Q?nr@Px3?9h(3ZWr3^tj=`TP57gKr87N$ zp2wWee1GRRCwo_xahnw)5cxNPJbCg2L6DV|6`#+yw6v6!mDS$f9-JvFD^n;GQ&UrZ zzh5jCkByB101O60U0q#p_1BM>Cv-vP?&s4@g_((4_1L=L$(a91)0=J91Gas#R{McE znYG^9*0A5YZ>#;~+Wkn(W5B0^yELIYLP!K}mB~<)AM@1&nqekynuaEGqPrzoH|KodRXJy)%+w_fu3nE5>@Bd_b zqC$EQ;{c`T&?EsNO|igL9gC7Ygxv?aQUEXMq?~>wg{EyW;VcJ37CUF#HjrT=KQO_* zS>M9yydXk18D(+QDJ1>r);Lav_uYKp$T?4vr{Q$lTo&pKv^?(>L-)G2*lwH!Ah7k? z7oH<8h-(KTKt5V6$8gF)C7Io&P5=SjTh)=zV=E2EUhQZP##L8S{d%UK>>+y82>+FV+#^BzW7u3F)Bb>=lYQ%%j`F>ASe zo*cw@V#u6T`A2He;70mR(V&iV&-7{qP~=SRf&jm9-T{*ZeZ}$rd0#6c&fLG^xJcf5 z+p<`wJYgW+_s*V{uI$nMB;%8`S_3>PfGOj3Rq}@Cx^+j?rk92fANSFDBYnOqQ>Vdj z)(|$AhP4t&Lb=Gvo2#3Gl%9<=Gv`Mz?Po@P4iLF!x}GUWJICDlFk-hS^Whyh7x~VH z@0vD1>HYD4&e+~yzS*-sFR{9`{QEEZO1zg7>R&7cHts-6j!xHVdA8eI+ZlVzd%`es zJT@$#GX(gvCJ1oJN%yLBK}{V=V;seo;!w|Yte!W1%5qLNFWqvZW>h&IiH+oPT=b@E zPhGzv5=(Un*X>v`>%8h_nj^NdYcE6NHS_ifkCV$*D)Tqrbu`s;<=t<4 zAHNqNV?6(g<1PY-w@#I-WYFViz?9TrkMr)u0g`O`u|>T;k|2sV*YF^punvT;$SuTy{j3Gv)yqD!R_CF>yR)MzmmYS5v+~R zXAdD%ng9?df;wd8GxR#%3O+gz};Vo;)sK%Bj-q>Oq%R7JU-KD?vYu>#2UjaDo z&8$>5xW~?KPD_#XFToU1hIb*VOMidUr6iYiO0N|i-7s`T8!cFT`rN!^1Pt78J93i6 z5HI1wIM$94m{3SLDvISDe6$ZG1;eq_D9RTaaC>=cO{@Bs>$IlPCPJJ$h$)-3vzNUQ6OsN#_zWxey!_9%hxwH2_dEJi=yY|1c7nDm2_Lm!Cof8-R_+9UkS zcBE(o47yE)oMR(Q=dp1a2wTX5KvvGyLqlWTa7V&!A*|w|)ax~1_~aJ0=_Lilg*0iQk7#ZD EAHN$8j{pDw literal 0 HcmV?d00001 diff --git a/module/viewer/lib/js/jtree/themes/default/d.gif b/module/viewer/lib/js/jtree/themes/default/d.gif new file mode 100644 index 0000000000000000000000000000000000000000..0e958d38716d93d4050a993398dec77490f836c7 GIT binary patch literal 2944 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 literal 0 HcmV?d00001 diff --git a/module/viewer/lib/js/jtree/themes/default/d.png b/module/viewer/lib/js/jtree/themes/default/d.png new file mode 100644 index 0000000000000000000000000000000000000000..8540175a04b0cd303e3966d1727f30ee9b8a7254 GIT binary patch literal 7635 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 z ins { background-position:-72px 0; } +.jstree-default .jstree-closed > ins { background-position:-54px 0; } +.jstree-default .jstree-leaf > ins { background-position:-36px 0; } + +.jstree-default .jstree-hovered { padding:0 2px 0 1px; } +.jstree-default .jstree-clicked { padding:0 2px 0 1px; } +.jstree-default a .jstree-icon { background-position:-56px -19px; } +.jstree-default a.jstree-loading .jstree-icon { background:url("throbber.gif") center center no-repeat !important; } + +.jstree-default.jstree-focused { } + +.jstree-default .jstree-no-dots li, +.jstree-default .jstree-no-dots .jstree-leaf > ins { background:transparent; } +.jstree-default .jstree-no-dots .jstree-open > ins { background-position:-18px 0; } +.jstree-default .jstree-no-dots .jstree-closed > ins { background-position:0 0; } + +.jstree-default .jstree-no-icons a .jstree-icon { display:none; } + +.jstree-default .jstree-search { font-style:italic; } + +.jstree-default .jstree-no-icons .jstree-checkbox { display:inline-block; } +.jstree-default .jstree-no-checkboxes .jstree-checkbox { display:none !important; } +.jstree-default .jstree-checked > a > .jstree-checkbox { background-position:-38px -19px; } +.jstree-default .jstree-unchecked > a > .jstree-checkbox { background-position:-2px -19px; } +.jstree-default .jstree-undetermined > a > .jstree-checkbox { background-position:-20px -19px; } +.jstree-default .jstree-checked > a > .jstree-checkbox:hover { background-position:-38px -37px; } +.jstree-default .jstree-unchecked > a > .jstree-checkbox:hover { background-position:-2px -37px; } +.jstree-default .jstree-undetermined > a > .jstree-checkbox:hover { background-position:-20px -37px; } + +#vakata-dragged.jstree-default ins { background:transparent !important; } +#vakata-dragged.jstree-default .jstree-ok { background:url("d.png") -2px -53px no-repeat !important; } +#vakata-dragged.jstree-default .jstree-invalid { background:url("d.png") -18px -53px no-repeat !important; } +#jstree-marker.jstree-default { background:url("d.png") -41px -57px no-repeat !important; text-indent:-100px; } + +.jstree-default a.jstree-search { font-weight: bold } +.jstree-default .jstree-locked a { color:silver; cursor:default; } + +#vakata-contextmenu.jstree-default-context, +#vakata-contextmenu.jstree-default-context li ul { background:#f0f0f0; border:1px solid #979797; -moz-box-shadow: 1px 1px 2px #999; -webkit-box-shadow: 1px 1px 2px #999; box-shadow: 1px 1px 2px #999; } +#vakata-contextmenu.jstree-default-context a:hover, +#vakata-contextmenu.jstree-default-context .vakata-hover > a { padding:0 5px; background:#e8eff7; border:1px solid #aecff7; -moz-border-radius:2px; -webkit-border-radius:2px; border-radius:2px; } +#vakata-contextmenu.jstree-default-context li.jstree-contextmenu-disabled a, +#vakata-contextmenu.jstree-default-context li.jstree-contextmenu-disabled a:hover { color:silver; background:transparent; border:0; padding:1px 4px; } +#vakata-contextmenu.jstree-default-context li.vakata-separator { background:white; border-top:1px solid #e0e0e0; margin:0; } +#vakata-contextmenu.jstree-default-context li ul { margin-left:-4px; } + +/* IE6 BEGIN */ +.jstree-default li, +.jstree-default ins, +#vakata-dragged.jstree-default .jstree-invalid, +#vakata-dragged.jstree-default .jstree-ok, +#jstree-marker.jstree-default { _background-image:url("d.gif"); } +.jstree-default .jstree-open ins { _background-position:-72px 0; } +.jstree-default .jstree-closed ins { _background-position:-54px 0; } +.jstree-default .jstree-leaf ins { _background-position:-36px 0; } +.jstree-default a ins.jstree-icon { _background-position:-56px -19px; } +#vakata-contextmenu.jstree-default-context ins { _display:none; } +#vakata-contextmenu.jstree-default-context li { _zoom:1; } +.jstree-default .jstree-undetermined a .jstree-checkbox { _background-position:-20px -19px; } +.jstree-default .jstree-checked a .jstree-checkbox { _background-position:-38px -19px; } +.jstree-default .jstree-unchecked a .jstree-checkbox { _background-position:-2px -19px; } +/* IE6 END */ \ No newline at end of file diff --git a/module/viewer/lib/js/jtree/themes/default/throbber.gif b/module/viewer/lib/js/jtree/themes/default/throbber.gif new file mode 100644 index 0000000000000000000000000000000000000000..5b33f7e54f4e55b6b8774d86d96895db9af044b4 GIT binary patch literal 1849 zcma*odr(tX9tZI2z31lM+(&YVk%mZ}5P~KlG2s=WSbGzm0!x7^P##Mnh7t-jP!X0Q zk_SQ}Po-L1tlDK;6l?(>v)e5ZBQx4|Y-Q?nr@Px3?9h(3ZWr3^tj=`TP57gKr87N$ zp2wWee1GRRCwo_xahnw)5cxNPJbCg2L6DV|6`#+yw6v6!mDS$f9-JvFD^n;GQ&UrZ zzh5jCkByB101O60U0q#p_1BM>Cv-vP?&s4@g_((4_1L=L$(a91)0=J91Gas#R{McE znYG^9*0A5YZ>#;~+Wkn(W5B0^yELIYLP!K}mB~<)AM@1&nqekynuaEGqPrzoH|KodRXJy)%+w_fu3nE5>@Bd_b zqC$EQ;{c`T&?EsNO|igL9gC7Ygxv?aQUEXMq?~>wg{EyW;VcJ37CUF#HjrT=KQO_* zS>M9yydXk18D(+QDJ1>r);Lav_uYKp$T?4vr{Q$lTo&pKv^?(>L-)G2*lwH!Ah7k? z7oH<8h-(KTKt5V6$8gF)C7Io&P5=SjTh)=zV=E2EUhQZP##L8S{d%UK>>+y82>+FV+#^BzW7u3F)Bb>=lYQ%%j`F>ASe zo*cw@V#u6T`A2He;70mR(V&iV&-7{qP~=SRf&jm9-T{*ZeZ}$rd0#6c&fLG^xJcf5 z+p<`wJYgW+_s*V{uI$nMB;%8`S_3>PfGOj3Rq}@Cx^+j?rk92fANSFDBYnOqQ>Vdj z)(|$AhP4t&Lb=Gvo2#3Gl%9<=Gv`Mz?Po@P4iLF!x}GUWJICDlFk-hS^Whyh7x~VH z@0vD1>HYD4&e+~yzS*-sFR{9`{QEEZO1zg7>R&7cHts-6j!xHVdA8eI+ZlVzd%`es zJT@$#GX(gvCJ1oJN%yLBK}{V=V;seo;!w|Yte!W1%5qLNFWqvZW>h&IiH+oPT=b@E zPhGzv5=(Un*X>v`>%8h_nj^NdYcE6NHS_ifkCV$*D)Tqrbu`s;<=t<4 zAHNqNV?6(g<1PY-w@#I-WYFViz?9TrkMr)u0g`O`u|>T;k|2sV*YF^punvT;$SuTy{j3Gv)yqD!R_CF>yR)MzmmYS5v+~R zXAdD%ng9?df;wd8GxR#%3O+gz};Vo;)sK%Bj-q>Oq%R7JU-KD?vYu>#2UjaDo z&8$>5xW~?KPD_#XFToU1hIb*VOMidUr6iYiO0N|i-7s`T8!cFT`rN!^1Pt78J93i6 z5HI1wIM$94m{3SLDvISDe6$ZG1;eq_D9RTaaC>=cO{@Bs>$IlPCPJJ$h$)-3vzNUQ6OsN#_zWxey!_9%hxwH2_dEJi=yY|1c7nDm2_Lm!Cof8-R_+9UkS zcBE(o47yE)oMR(Q=dp1a2wTX5KvvGyLqlWTa7V&!A*|w|)ax~1_~aJ0=_Lilg*0iQk7#ZD EAHN$8j{pDw literal 0 HcmV?d00001 diff --git a/module/viewer/lib/js/ligeo.js b/module/viewer/lib/js/ligeo.js new file mode 100644 index 0000000..c0dcdb6 --- /dev/null +++ b/module/viewer/lib/js/ligeo.js @@ -0,0 +1,1671 @@ + +////stav modulu: active,sleep,init, +//HTML mapa bude pouze pregenerovana kdyz uzivatel v admin nastaveni zmeni nastaveni - vrstvy, moduly... +//prihlaseny uzivatel v JS bude udrzovat prihlasovaci udaje, automaticky po prihlaseni mu budou zobrazeny dalsi data a moznost editace vrstev (JSON komunikace) + +/* + *prihlaseni + * 1/ odeslu POST na srvr, zeptam se, zda jsou spravne prihlasovaci udaje + * 2/ pokud TRUE - uloz hash (login + koreni + heslo) do cookies A reload web + * 3/ pri nacitani webu v init overim zda je uvivatel prihlasen (ulozen cookies? -> odeslu na srvr zda hash je spravny) + * +*/ +//document.write(''); + +var ligeo = null; + +var apiURL = "../proxyAPI.php"; +var wmsURL;//ziskane z settings.php, +var gfiURL = "../proxyGFI.php?" +var printURL ; //ziskane z settings.php, print.pdf docasne upraveno, popřípadě změnit,pro potřeby tisku +var planLayers; +var queryableLayers +var adminURL;//ziskane z settings.php, + + + +function ligeoInit(){ + ligeo = new LiGeo(); + + +} + +function LiGeo(){ + this.modulesTxt=new Array(); + this.userHash=""; + this.userName = ""; + + this.page= location.pathname.slice(location.pathname.lastIndexOf("/",location.pathname.lastIndexOf("/")-1)+1,location.pathname.lastIndexOf("/")); + this.namespace = "ligeo_"+this.page; + this.baselayerNames = []; + var that = this; + + + + /* + jQuery.ajaxSetup({ + async:false + }); + $.get("../settings.php", + function(data){ + wmsURL = data.proxy_url+"/proxyWMS.php?"; + printURL = data.proxy_url+"/print.php"; + this.modulesTxt = data.viewer_modules; + alert("aaaweeew"+this.modulesTxt.length); + }, "json"); + */ + var modulesTxt; + $.ajax({ + type: 'GET', + url: '../settings.php', + dataType: 'json', + success: function(data) { + wmsURL = data.proxy_url+"/proxyWMS.php?"; + printURL = data.proxy_url+"/print.php"; + modulesTxt = data.viewer_modules; + adminURL = data.admin_url; + that.baselayerNames = data.base_layers; + + }, + data: {}, + async: false + }); + this.modulesTxt = modulesTxt; + modulesTxt=""; + + var json1 = '{"request":"user.hash","userHash":"'+getCookie("userHash")+'"}'; + + var layersJson1 = apiURL+"?json="+json1; + var res1 = OpenLayers.Request.issue({ + method: 'POST', + params: { + json:json + }, + url: layersJson1, + headers:{ + "Content-Type": + "application/x-www-form-urlencoded" + }, + async: false + }); + + + var g1 = new OpenLayers.Format.JSON(); + var data1 = g1.read(res1.responseText); + if(data1.userHash){ + this.userHash=data1.userHash; + this.userName=data1.name; + } + + + var json = '{"request":"plan.detail","userHash":"'+this.userHash+'","param":{"name":"'+this.page+'"}}'; + + var layersJson = apiURL+"?json="+json; + var res = OpenLayers.Request.issue({ + method: 'POST', + params: { + json:json + }, + url: layersJson, + headers:{ + "Content-Type": + "application/x-www-form-urlencoded" + }, + async: false + }); + + + var g = new OpenLayers.Format.JSON(); + var data = g.read(res.responseText); + + this.title=data.title; + this.planId=data.planId; + this.mapCenterLat=data.mapCenterLat; + this.mapCenterLon=data.mapCenterLon; + this.txt=data.txt; + this.mapZoom = data.mapZoom; + this.privilege = data.privilege; + + this.modules = new Array(); + + + + document.title = this.title; + + + + + + + + var sketchSymbolizers, style, styleMap, measureControls; + var printMapUrl = ""; + + this.moduleActive = ""; + + ///////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////////////////// + + + //this.modulesTxt = new Array("layers","info","legend","print","measurement","editor","biotopy","login"); + + this.ligeoMap = new LiGeoMap(this); + + + /** + *load base layers + */ + + this.baselayers = new LiGeobaseLayers(this,this.baselayerNames); + /** + * end load base layers + */ + + + /** + *definice funkci + */ + this.isTabMenuContentOpen = function(){ + return document.getElementById("tabMenuContent").style.visibility == "visible"; + } + + this.activate = function(module,force){ + if((this.moduleActive && this.moduleActive != module)){ + this.modules[this.moduleActive].deactivate(); + document.getElementById("tabMenu"+this.moduleActive).className=""; + } + if(!force){ + if(this.moduleActive == module && this.isTabMenuContentOpen()){ + document.getElementById("tabMenuContent").style.visibility = "hidden"; + }else if(!this.isTabMenuContentOpen()){ + document.getElementById("tabMenuContent").style.visibility = "visible"; + } + } + this.modules[module].activate(); + document.getElementById("tabMenu"+module).className="active"; + this.moduleActive = module; + } + /** + *KONEC definice funkci + */ + + + + + + /** + *priprava stranky + */ + var htmlLi = ""; + + for(var i =0; i'+this.modules[this.modulesTxt[i]].title()+''; + } + + document.getElementById("menuList").innerHTML = '
                        '+htmlLi+'
                      '; + htmlLi = ""; + + for(var j =0; j radians + deg2rad:function(num) { + var num=num*Math.PI/180; + return num + }, + + // ===== + // radians -> degrees + rad2deg:function(num2) { + var num2=num2*180/Math.PI; + return num2 + }, + + // ===== + // rounds x to y digits after decimal point + roundoff:function(x,y) { + x=parseFloat(x); + y=parseFloat(y); + x=Math.round(x*Math.pow(10,y))/Math.pow(10,y); + return x + }, + + // ===== + // degrees value -> D / DM / DMS string; + // returns object with locNum:value in D/DM/DMS and locStr: one of N,S,W,E + // spec is string containing either 'la' or 'lo' and 'd' or 'dm' or 'dms' + resToString:function(num,spec){ + var secsize=3; + var minsize=5; + var degsize=7; + if ((! spec) || (!spec.match)) { + spec = ""; + } + if (! spec.match(/d/i)) { + spec = spec + 'dms'; //default + } + + if(spec.match(/lo/i)){ + if(num<0){ + var str='W'; + num=Math.abs(num) + }else{ + var str='E' + } + }else{ + if(num<0){ + var str='S'; + num=Math.abs(num) + }else{ + var str='N'; + } + } + var degree=0; + var minut =0; + var second=0; + + var y=Math.abs(parseFloat(num)); + if (spec.match(/dm/i)) { + degree=parseInt(y+1)-1; + y=(y-degree)*60; + } else { + degree=this.roundoff(y,degsize); + y=0; + } + if (spec.match(/dms/i)) { + minut=parseInt(y+1)-1; + y=(y-minut)*60; + second=this.roundoff(y,secsize); + } else { + minut=this.roundoff(y,minsize); + y = 0; + } + + if(second>=60){ + second=second - 60; + minut=minut+1; + } + if(minut>=60){ + minut=minut - 60; + degree=degree+1 + } + value=""+degree; + if (spec.match(/dm/i)) { + value = value + "\260"+minut+"\'" + } + if (spec.match(/dms/i)) { + value = value +second+'\"'; + } + return{ + locNum:value, + locStr:str + }; + }, + + // ===== + //accepts lat, lot in degrees, + // if dms contains 'p' it returns 'Nddmmss Eddmmss' otherwise 'ddmmssNddmmssE' + // where 'ddmmss' depends on what dms contains. (dms should NOT contain 'la' nor 'lo') + degStr:function(lat, lot, dms){ + var la = this.resToString(lat,'lat'+dms); + var lo = this.resToString(lot,'lot'+dms); + return (dms && dms.match && dms.match(/p/i)) ? + '' + la.locStr+la.locNum + ' ' + lo.locStr+lo.locNum : + '' + la.locNum+la.locStr + ' ' + lo.locNum+lo.locStr ; + }, + + // ===== + // as degStr, but accepts lat and lot in radians + radStr:function (lat, lot, dms, pre) { + return this.degStr(this.rad2deg(lat),this.rad2deg(lot),dms,pre); + }, + + // ===== + // parses [N|S|W|E] [-] ddmmss [N|S|W|E] string to number + StringToRes:function(str) { + var parse = str.match("^ *" + + "([NSWE]?) *" + //1 + "(-?) *"+ //2 + "([0-9][0-9]*(\\.[0-9]*)?) *" + //3 + "([dDo\260 ] *"+ + "(([0-9][0-9]*(\\.[0-9]*)?) *" + //7 + "([' ] *" + + "(([0-9][0-9]*(\\.[0-9]*)?) *" + //11 + "\"? *"+ + ")?)?" + + ")?)?" + + "([NSWE]?) *$"); //13 + if (parse === null) { + return 1 / 0; //NaN (not parsed) + } + if (parse[1].length+parse[13].length >=2) { + return 1 / 0; //NaN (double NSWE specification + } + if (parse[7] === undefined) { + parse[7] = 0 + } + if (parse[11] === undefined) { + parse[11] = 0 + } + return (parse[1].match(/[SW]/)?-1:1)* + (parse[2].length ?-1:1)* + (parse[13].match(/[SW]/)?-1:1)* + (parseFloat(parse[3])+parseFloat(parse[7])/60+parseFloat(parse[11])/3600); + }, + + + /* + =============================== JTSK ============================= + Converts JTSK-95 coordinates in area of Czech Republic + based on code by Zdenek Hrdina (c) 2001,2002 + zhrdina@zs.koop.cz, zhrdina@koop.cz + + modified by Tomas Ebenlendr + ebik@ucw.cz + */ + + + // ===== + // accepts jtsk-95: Y,X,height + // returns lat,lot,alt (radians, meters) + JTSKToRad:function (Y,X,H) + { + /* Přepočet vstupích údajů */ + if (H === undefined) { + H = 300;// Relativne rozumna vyska + } + H+=45; + var deg2rad = this.deg2rad; + + /*Vypocet zemepisnych souradnic z rovinnych souradnic*/ + var zemsour = (function (X,Y) { + // var a=6377397.15508; + var e=0.081696831215303; + var n=0.97992470462083; + var konst_u_ro=12310230.12797036; + var sinUQ=0.863499969506341; + var cosUQ=0.504348889819882; + var sinVQ=0.420215144586493; + var cosVQ=0.907424504992097; + var alfa=1.000597498371542; + var k=1.003419163966575; + var ro=Math.sqrt(X*X+Y*Y); + var epsilon=2*Math.atan(Y/(ro+X)); + var D=epsilon/n; + var S=2*Math.atan(Math.exp(1/n*Math.log(konst_u_ro/ro)))-Math.PI/2; + var sinS=Math.sin(S); + var cosS=Math.cos(S); + var sinU=sinUQ*sinS-cosUQ*cosS*Math.cos(D); + var cosU=Math.sqrt(1-sinU*sinU); + var sinDV=Math.sin(D)*cosS/cosU; + var cosDV=Math.sqrt(1-sinDV*sinDV); + var sinV=sinVQ*cosDV-cosVQ*sinDV; + var cosV=cosVQ*cosDV+sinVQ*sinDV; + var Ljtsk=2*Math.atan(sinV/(1+cosV))/alfa; + var t=Math.exp(2/alfa*Math.log((1+sinU)/cosU/k)); + var pom=(t-1)/(t+1); + var sinB; + do { + sinB=pom; + pom=t*Math.exp(e*Math.log((1+e*sinB)/(1-e*sinB))); + pom=(pom-1)/(pom+1); + } while (Math.abs(pom-sinB)>1e-15); + var Bjtsk=Math.atan(pom/Math.sqrt(1-pom*pom)); + return { + L:Ljtsk, + B:Bjtsk + }; + })(X,Y); + + /* Pravoúhlé souřadnice ve S-JTSK */ + var pravjtsk = (function (Bjtsk, Ljtsk, H) { + var a=6377397.15508; + var f_1=299.152812853; + var e2=1-(1-1/f_1)*(1-1/f_1); + ro=a/Math.sqrt(1-e2*Math.sin(Bjtsk)*Math.sin(Bjtsk)); + var x=(ro+H)*Math.cos(Bjtsk)*Math.cos(Ljtsk); + var y=(ro+H)*Math.cos(Bjtsk)*Math.sin(Ljtsk); + var z=((1-e2)*ro+H)*Math.sin(Bjtsk); + return { + x:x, + y:y, + z:z + } + })(zemsour.B, zemsour.L, H) + + /* Pravoúhlé souřadnice v WGS-84*/ + var pravwgs = (function (x, y, z) { + var dx=570.69; + var dy=85.69; + var dz=462.84; + var wz=deg2rad(-5.2611/3600); + var wy=deg2rad(-1.58676/3600); + var wx=deg2rad(-4.99821/3600); + var m=3.543e-6; + var xn=dx+(1+m)*(x+wz*y-wy*z); + var yn=dy+(1+m)*(-wz*x+y+wx*z); + var zn=dz+(1+m)*(wy*x-wx*y+z); + return { + x: xn, + y: yn, + z: zn + }; + })(pravjtsk.x, pravjtsk.y, pravjtsk.z); + + /* Geodetické souřadnice v systému WGS-84*/ + var geowgs = (function (xn, yn, zn) { + var a=6378137.0; + var f_1=298.257223563; + var a_b=f_1/(f_1-1); + var p=Math.sqrt(xn*xn+yn*yn); + var e2=1-(1-1/f_1)*(1-1/f_1); + var theta=Math.atan(zn*a_b/p); + var st=Math.sin(theta); + var ct=Math.cos(theta); + var t=(zn+e2*a_b*a*st*st*st)/(p-e2*a*ct*ct*ct); + var B=Math.atan(t); + var L=2*Math.atan(yn/(p+xn)); + var H=Math.sqrt(1+t*t)*(p-a/Math.sqrt(1+(1-e2)*t*t)); + return { + B:B, + L:L, + H:H + }; + })(pravwgs.x, pravwgs.y, pravwgs.z); + + return { + lat:geowgs.B, + lot:geowgs.L, + alt:geowgs.H-45 + } + }, + + + // ===== + // accepts lat,lot,alt, (radians, meters) + // returns jtsk-95 y,x,z (z is altitude in meters) + radToJTSK:function(lat, lot, alt) + { + var B=lat; + var L=lot; + var H=alt; + var deg2rad = this.deg2rad; + + if (alt === undefined) { + H = 300;// Relativne rozumna vyska + } + + /* Pravoúhlé souřadnice ve WGS-84 */ + var pravwgs = (function (B, L, H) { + var a=6378137.0; + var f_1=298.257223563; + var e2=1-(1-1/f_1)*(1-1/f_1); + var ro=a/Math.sqrt(1-e2*Math.sin(B)*Math.sin(B)); + var x=(ro+H)*Math.cos(B)*Math.cos(L); + var y=(ro+H)*Math.cos(B)*Math.sin(L); + var z=((1-e2)*ro+H)*Math.sin(B); + return { + x: x, + y: y, + z: z + }; + })(B, L, H); + + /* Pravoúhlé souřadnice v S-JTSK */ + var pravjtsk = (function (x, y, z) { + var dx=-570.69; + var dy=-85.69; + var dz=-462.84; + var wz=deg2rad(5.2611/3600); //FIXME use deg2rad + var wy=deg2rad(1.58676/3600); + var wx=deg2rad(4.99821/3600); + var m=-3.543e-6; + var xn=dx+(1+m)*(x+wz*y-wy*z); + var yn=dy+(1+m)*(-wz*x+y+wx*z); + var zn=dz+(1+m)*(wy*x-wx*y+z); + return { + x: xn, + y: yn, + z: zn + }; + })(pravwgs.x, pravwgs.y, pravwgs.z); + + /* Geodetické souřadnice v systému S-JTSK */ + var geojtsk = (function (xn, yn, zn) { + var a=6377397.15508; + var f_1=299.152812853; + var a_b=f_1/(f_1-1); + var p=Math.sqrt(xn*xn+yn*yn); + var e2=1-(1-1/f_1)*(1-1/f_1); + var theta=Math.atan(zn*a_b/p); + var st=Math.sin(theta); + var ct=Math.cos(theta); + var t=(zn+e2*a_b*a*st*st*st)/(p-e2*a*ct*ct*ct); + var B=Math.atan(t); + var L=2*Math.atan(yn/(p+xn)); + var H=Math.sqrt(1+t*t)*(p-a/Math.sqrt(1+(1-e2)*t*t)); + return { + B: B, + L: L, + H: H + }; + })(pravjtsk.x, pravjtsk.y, pravjtsk.z); + + /* Rovinné souřadnice v systému S-JTSK */ + var rovjtsk = (function (B, L, H) { + var a=6377397.15508; + var e=0.081696831215303; + var n=0.97992470462083; + var konst_u_ro=12310230.12797036; + var sinUQ=0.863499969506341; + var cosUQ=0.504348889819882; + var sinVQ=0.420215144586493; + var cosVQ=0.907424504992097; + var alfa=1.000597498371542; + var k_2=1.00685001861538; + var sinB=Math.sin(B); + var t=(1-e*sinB)/(1+e*sinB); + t=(1+sinB)*(1+sinB)/(1-sinB*sinB)*Math.exp(e*Math.log(t)); + t=k_2*Math.exp(alfa*Math.log(t)); + var sinU=(t-1)/(t+1); + var cosU=Math.sqrt(1-sinU*sinU); + var V=alfa*L; + var sinV=Math.sin(V); + var cosV=Math.cos(V); + var cosDV=cosVQ*cosV+sinVQ*sinV; + var sinDV=sinVQ*cosV-cosVQ*sinV; + var sinS=sinUQ*sinU+cosUQ*cosU*cosDV; + var cosS=Math.sqrt(1-sinS*sinS); + var sinD=sinDV*cosU/cosS; + var D=Math.atan(sinD/Math.sqrt(1-sinD*sinD)); + var epsilon=n*D; + var ro=konst_u_ro*Math.exp(-n*Math.log((1+sinS)/cosS)); + var X=ro*Math.cos(epsilon); + var Y=ro*Math.sin(epsilon); + return { + X: X, + Y: Y, + H: H + }; + })(geojtsk.B, geojtsk.L, geojtsk.H); + + return { + y: rovjtsk.Y, + x:rovjtsk.X, + z:rovjtsk.H + }; + }, + + /* + =============================== S42 ============================= + Converts S-42 coordinates in area of Czech Republic + based on code by Gabor Timar (Majster V1.0, prevody.xls) + timar@ludens.elte.hu + + javascripted by Tomas Ebenlendr + ebik@ucw.cz + */ + + // ===== + // S42 datum + datumS42: + { + a1: 6378245, + f1: 0.00335232986925913, + a2: 6378137, + f2: 0.00335281066474748, + + // Tunable parameters + dx: 26, + dy: -121, + dz: -78 + }, + + // ===== + // abridged Mologensky, accuracy 2m + abridgedMologensky:function (FI, LA, pars, rev) { + if (rev) { + var a1 = pars.a2; + var f1 = pars.f2; + var a2 = pars.a1; + var f2 = pars.f1; + + var dx = -pars.dx; + var dy = -pars.dy; + var dz = -pars.dz; + } else { + var a1 = pars.a1; + var f1 = pars.f1; + var a2 = pars.a2; + var f2 = pars.f2; + + var dx = pars.dx; + var dy = pars.dy; + var dz = pars.dz; + } + + var sFI = Math.sin(FI); + var cFI = Math.cos(FI); + var sLA = Math.sin(LA); + var cLA = Math.cos(LA); + var e1_2 = 2*f1 - f1*f1; + var t1 = 1 - e1_2*sFI*sFI; + var M = pars.a1*(1 - e1_2)/Math.pow(t1,1.5); + var N = a1/Math.sqrt(t1); + var cs = Math.sin(this.deg2rad(1/3600)); + var dFIs = ( - dx*sFI*cLA - dy*sFI*sLA + dz*cFI + + (a1*(f2-f1) + f1*(a2-a1))*Math.sin(2*FI)) / (M*cs); + var dLAs = (-dx*sLA + dy*cLA) / (N*cFI*cs); + return { + fi:FI + this.deg2rad(dFIs/3600), + lambda: LA + this.deg2rad(dLAs/3600) + }; + }, + + // ===== + // accepts y, x in S42 coordinate system (i.e. northing, easting) + // returns lat, lot (radians) + s42ToRad:function (Y,X) + { + /* centimeter accuracy ? */ + var deg2rad = this.deg2rad; + var gk=(function (Y, X) { + var zone=Math.floor(X/1000000) + + var a=6378245; + var e=0.0818133340169312; + var e2=e*e; + var FE=500000+zone*1000000; + var FN=0; + var lambda0=deg2rad(6*zone-3); + /* var fi0=0; */ + var k0=1; + var x = X-FE; + var y = Y-FN; + var e1 = (1-Math.sqrt(1-e2))/(1+Math.sqrt(1-e2)); + var t1 = 1 - e2/4 - 3*e2*e2/64 - 5*e2*e2*e2/256; + /* + var t2 = 3*e2/8 + 3*e2*e2/32 + 45*e2*e2*e2/1024; + var t3 = 15*e2*e2/256+45*e2*e2*e2/1024; + var t4 = 35*e2*e2*e2/3072; + var M0 = a * (fi0 * t1 + - Math.sin(2*fi0)*t2 + + Math.sin(4*fi0)*t3 + - Math.sin(6*fi0)*t4); + */ + var M0 = 0; + var M = M0 + y/k0; + var mu = M / (a * t1); + var fi1 = mu + Math.sin(2*mu)*(3*e1/2 - 27*Math.pow(e1,3)/32) + + Math.sin(4*mu)*(21*e1*e1/16 - 55*Math.pow(e1,4)/32) + + Math.sin(6*mu)*151*Math.pow(e1,3)/96 + + Math.sin(8*mu)*1079*Math.pow(e1,4)/512; + var e_2 = e2/(1-e2); + var C1 = e_2*Math.pow(Math.cos(fi1),2); + var T1 = Math.pow(Math.tan(fi1),2); + var t5 = 1-e2*Math.pow(Math.sin(fi1),2); + var N1 = a / Math.sqrt(t5); + var R1 = a * (1-e2) / Math.pow(t5,1.5); + var D = x / (N1 * k0); + var fi = fi1 - (N1*Math.tan(fi1)/R1) * ( + D*D/2 + - (5 + 3*T1 + 10*C1 - 4*C1*C1 - 9*e_2)*Math.pow(D,4)/24 + + (61 + 90*T1 + 298*C1 + 45*T1*T1 - 252*e_2 - 3*C1*C1)*Math.pow(D,6)/720); + var lambda = lambda0 + ( + D + - (1 + 2*T1 + C1)*Math.pow(D,3)/6 + + (5 - 2*C1 + 28*T1 - 3*C1*C1 + 8*e_2 + 24*T1*T1)*Math.pow(D,5)/120 + )/Math.cos(fi1); + /* + alert('fi1:' + fi1 + '\n' + + 'lambda0:' + lambda0 + '\n' + + 'N1:' + N1 + '\n' + + 'R1:' + R1 + '\n' + + 'D:' + D + '\n' + + 'T1:' + T1 + '\n' + + 'C1:' + C1 + '\n' + + 'e_2:' + e_2 + '\n' + + 't5:' + t5 + '\n' + + '\n' + + 'fi:' + fi + '\n' + + 'lambda:' + lambda); + */ + return { + fi:fi, + lambda:lambda + }; + })(Y, X); + + var am = this.abridgedMologensky( gk.fi, gk.lambda, this.datumS42); + + return { + lat:am.fi, + lot:am.lambda + } + }, + + + // ===== + // accepts lat, lot (radians) + // returns y, x in S42 coordinate system (i.e. northing, easting) + radToS42:function(lat, lot) + { + var am = this.abridgedMologensky( lat, lot, this.datumS42, true); + var deg2rad = this.deg2rad; + var rad2deg = this.rad2deg; + + var s = (function (FI, LA){ + var zone=Math.floor(rad2deg(LA)/6) + + var a=6378245; + var e=0.0818133340169312; + var e2=e*e; + var FE=1500000+zone*1000000; + var FN=0; + var lambda0=deg2rad(6*zone+3); + /*var fi0=0;*/ + var t1 = 1 - e2/4 - 3*e2*e2/64 - 5*e2*e2*e2/256; + var M0 = 0; + var k0=1; + var e_2 = e2/(1-e2); + var cFI = Math.cos(FI); + var tFI = Math.tan(FI); + var N = a / Math.sqrt(1 - e2*Math.pow(Math.sin(FI),2)); + var T = tFI*tFI; + var C = e_2 * cFI * cFI; + var A = (LA - lambda0)*cFI; + var t2 = 3*e2/8 + 3*e2*e2/32 + 45*e2*e2*e2/1024; + var t3 = 15*e2*e2/256+45*e2*e2*e2/1024; + var t4 = 35*e2*e2*e2/3072; + var M = a*( FI * t1 + - Math.sin(2*FI)*t2 + + Math.sin(4*FI)*t3 + - Math.sin(6*FI)*t4); + var x = k0*N*(A + (1 - T + C)*Math.pow(A,3)/6 + + (5 - 18*T + T*T + 72*C - 85*e_2)*Math.pow(A,5)/120); + var y = k0*(M - M0 + N*tFI*( + A*A/2 + (5 - T + 9*C + 4*C*C)*Math.pow(A,4)/24 + + (61 - 58*T + T*T + 600*C - 330*e_2)*Math.pow(A,6)/720)); + /* + alert('FI:' + FI + '\n' + + 'LA:' + LA + '\n' + + 'lambda0:' + lambda0 + '\n' + + 'M:' + M + '\n' + + 'N:' + N + '\n' + + 'A:' + A + '\n' + + 'T:' + T + '\n' + + 'C:' + C + '\n' + + 'e_2:' + e_2 + '\n' + + '\n' + + 'x:' + x + '\n' + + 'y:' + y + '\n' + + 'FE:' + FE); + */ + return { + Y: FN + y, + X: FE + x + }; + })(am.fi, am.lambda); + + return { + y:s.Y, + x:s.X + }; + }, + + + /* + =============================== UTM ============================= + Converts UTM and seznam coordinates in area of Czech Republic. + (The functions are inconsistent by 2'' at Portugal for zone 33) + (I know Portugal is zone 30, but mapy.seznam.cz maps are whole in zone 33) + Based on code from mapy.seznam.cz. + */ + + // ===== + // accepts x, y in mapy.seznam.cz + // returns lat, lot (radians) + seznamToRad:function(x,y) { + return this.UTMToRad( + y/32 + 1300000, + x/32 - 3700000, + 33 + ); + }, + + // ===== + // accepts lat, lot (radians) + // returns x, y in mapy.seznam.cz + radToSeznam:function(la, lo) { + var ret = this.radToUTM(la,lo,33); + return { + x:(ret.east+3700000)*32, + y:(ret.north-1300000)*32 + }; + }, + + // ===== + // accepts northing, easting, zone in UTM + // returns lat, lot (radians) + UTMToRad:function(north, east, zone){ + var units=1; + var k=0.9996; + var a=6378137; + var f=1/298.257223563; + var b=a*(1-f); + var e2=(a*a-b*b)/(a*a); + var e=Math.sqrt(e2); + var ei2=(a*a-b*b)/(b*b); + var ei=Math.sqrt(ei2); + var n=(a-b)/(a+b); + var G=this.deg2rad(a*(1-n)*(1-n*n)*(1+(9/4)*n*n+(255/64)*Math.pow(n,4))); + var northu=(north-0)*units; + var eastu=(east-500000)*units; + var m=northu/k; + var sigma=this.deg2rad(m/G); + var footlat=sigma+((3*n/2)-(27*Math.pow(n,3)/32))*Math.sin(2*sigma)+((21*n*n/16)-(55*Math.pow(n,4)/32))*Math.sin(4*sigma)+(151*Math.pow(n,3)/96)*Math.sin(6*sigma)+(1097*Math.pow(n,4)/512)*Math.sin(8*sigma); + var rho=a*(1-e2)/Math.pow(1-(e2*Math.sin(footlat)*Math.sin(footlat)),(3/2)); + var nu=a/Math.sqrt(1-(e2*Math.sin(footlat)*Math.sin(footlat))); + var psi=nu/rho; + var t=Math.tan(footlat); + var x=eastu/(k*nu); + + var laterm1=(t/(k*rho))*(eastu*x/2); + var laterm2=(t/(k*rho))*(eastu*Math.pow(x,3)/24)*(-4*psi*psi+9*psi*(1-t*t)+12*t*t); + var laterm3=(t/(k*rho))*(eastu*Math.pow(x,5)/720)*(8*Math.pow(psi,4)*(11-24*t*t)-12*Math.pow(psi,3)*(21-71*t*t)+15*psi*psi*(15-98*t*t+15*Math.pow(t,4))+180*psi*(5*t*t-3*Math.pow(t,4))+360*Math.pow(t,4)); + var laterm4=(t/(k*rho))*(eastu*Math.pow(x,7)/40320)*(1385+3633*t*t+4095*Math.pow(t,4)+1575*Math.pow(t,6)); + var latrad=footlat-laterm1+laterm2-laterm3+laterm4; + + var seclat=1/Math.cos(footlat); + var loterm1=x*seclat; + var loterm2=(Math.pow(x,3)/6)*seclat*(psi+2*t*t); + var loterm3=(Math.pow(x,5)/120)*seclat*(-4*Math.pow(psi,3)*(1-6*t*t)+psi*psi*(9-68*t*t)+72*psi*t*t+24*Math.pow(t,4)); + var loterm4=(Math.pow(x,7)/5040)*seclat*(61+662*t*t+1320*Math.pow(t,4)+720*Math.pow(t,6)); + var w=loterm1-loterm2+loterm3-loterm4; + var longrad=this.deg2rad((zone-30)*5)+w; + + return { + lat:latrad, + lot:longrad + }; + }, + + // ===== + // accepts lat, lot (radians), forcezone (for not autodetecting utm zone) + // returns northing, easting, zone in UTM + radToUTM:function(la,lo,forcezone){ + function roundoff(x,y){ + var x=parseFloat(x); + var y=parseFloat(y); + x=Math.round(x*Math.pow(10,y))/Math.pow(10,y); + return x + }; + var units=1; + var distsize=3; + var latrad=la; + var lonrad=lo; + var latddd=this.rad2deg(la); + var londdd=this.rad2deg(lo); + var zone=Math.round((londdd+183)/6); + if (forcezone !== undefined) { + zone = forcezone; + } + var k=0.9996; + var a=6378137; + var f=1/298.257223563; + var b=a*(1-f); + var e2=(a*a-b*b)/(a*a); + var e=Math.sqrt(e2); + var ei2=(a*a-b*b)/(b*b); + var ei=Math.sqrt(ei2); + var n=(a-b)/(a+b); + var G=this.deg2rad(a*(1-n)*(1-n*n)*(1+(9/4)*n*n+(255/64)*Math.pow(n,4))); + var w=londdd-parseFloat(zone*6-183); + w=this.deg2rad(w); + var t=Math.tan(latrad); + var rho=a*(1-e2)/Math.pow(1-(e2*Math.sin(latrad)*Math.sin(latrad)),(3/2)); + var nu=a/Math.sqrt(1-(e2*Math.sin(latrad)*Math.sin(latrad))); + var psi=nu/rho; + var coslat=Math.cos(latrad); + var sinlat=Math.sin(latrad); + var A0=1-(e2/4)-(3*e2*e2/64)-(5*Math.pow(e2,3)/256); + var A2=(3/8)*(e2+(e2*e2/4)+(15*Math.pow(e2,3)/128)); + var A4=(15/256)*(e2*e2+(3*Math.pow(e2,3)/4)); + var A6=35*Math.pow(e2,3)/3072; + var m=a*((A0*latrad)-(A2*Math.sin(2*latrad))+(A4*Math.sin(4*latrad))-(A6*Math.sin(6*latrad))); + var eterm1=(w*w/6)*coslat*coslat*(psi-t*t); + var eterm2=(Math.pow(w,4)/120)*Math.pow(coslat,4)*(4*Math.pow(psi,3)*(1-6*t*t)+psi*psi*(1+8*t*t)-psi*2*t*t+Math.pow(t,4)); + var eterm3=(Math.pow(w,6)/5040)*Math.pow(coslat,6)*(61-479*t*t+179*Math.pow(t,4)-Math.pow(t,6)); + var dE=k*nu*w*coslat*(1+eterm1+eterm2+eterm3); + var east=roundoff(parseFloat(500000)+(dE/units),distsize); + var nterm1=(w*w/2)*nu*sinlat*coslat; + var nterm2=(Math.pow(w,4)/24)*nu*sinlat*Math.pow(coslat,3)*(4*psi*psi+psi-t*t); + var nterm3=(Math.pow(w,6)/720)*nu*sinlat*Math.pow(coslat,5)*(8*Math.pow(psi,4)*(11-24*t*t)-28*Math.pow(psi,3)*(1-6*t*t)+psi*psi*(1-32*t*t)-psi*2*t*t+Math.pow(t,4)); + var nterm4=(Math.pow(w,8)/40320)*nu*sinlat*Math.pow(coslat,7)*(1385-3111*t*t+543*Math.pow(t,4)-Math.pow(t,6)); + var dN=k*(m+nterm1+nterm2+nterm3+nterm4); + var north=roundoff(parseFloat(0)+(dN/units),distsize); + return{ + zone:zone, + east:east, + north:north + }; + } + } +////////////////////////////////////konec prevod +}; + + + + + + + +function removeLayersOutOfRange(layerArray){ + var retArray = new Array(); + for(var i = 0; i < layerArray.length; i++) { + if(layerArray[i].calculateInRange() == true){ + retArray.push(layerArray[i]); + } + } + + return retArray; +} + + +if (!Array.prototype.indexOf) { + Array.prototype.indexOf = function(obj, start) { + for (var i = (start || 0), j = this.length; i < j; i++) { + if (this[i] === obj) { + return i; + } + } + return -1; + } +} + + +function setCookie(c_name,value,exdays) +{ + var exdate=new Date(); + exdate.setDate(exdate.getDate() + exdays); + var c_value=escape(value) + ((exdays==null) ? "" : "; expires="+exdate.toUTCString()); + document.cookie=c_name + "=" + c_value; +} + + +function getCookie(c_name) +{ + var i,x,y,ARRcookies=document.cookie.split(";"); + for (i=0;i \ +
                       
                      \ +
                      \ +
                      \ +
                      \ +
                      \ +
                      \ +
                      \ +
                      \ +
                      \ +
                      \ +
                      ' + + + + }); + $.prettyPhoto.open(splashImg,'splash','splash'); + },250); + window.setTimeout(function() { + $.prettyPhoto.close() + }, 5000); + + } + }); + } + + showSplashScreen(); + +}); + +function validate_url(val) +{ + var tomatch= /http:\/\/[A-Za-z0-9\.-]{3,}\.[A-Za-z]{2}/ + + if (tomatch.test(val)){ + return true; + } + else + { + return false; + } +} + +function validate_file_extension(val){ + var type = val.substr(val.lastIndexOf('.')+1) ; + + if(type=="png" || type=="jpg" || type=="jpeg" || type=="gif"){ + return "img"; + }else if(type == "pdf"){ + return "pdf"; + }else if(type == "doc" || type == "rtf"){ + return "doc"; + }else if(type=="xls" || type=="cvs"){ + return "xls"; + }else if(type == "zip" || type=="7zip" || type=="rar" || type =="tar"){ + return "zip"; + }else{ + return "other"; + } + +} diff --git a/module/viewer/lib/js/ligeoabout.js b/module/viewer/lib/js/ligeoabout.js new file mode 100644 index 0000000..31a1d47 --- /dev/null +++ b/module/viewer/lib/js/ligeoabout.js @@ -0,0 +1,23 @@ + +function LiGeoabout(ligeo){ + this.name = "about"; + + document.getElementById("tabMenuContentabout").innerHTML = ligeo.txt; + + this.title = function(){ + //todo taday zjistim lokalizaci + return "O mapě"; + } + + this.toString = function(){ + return ""; + } + + this.activate = function(){ + this.tabMenuContent = document.getElementById("tabMenuContent"+this.name).style.display="block"; + } + + this.deactivate = function(){ + this.tabMenuContent = document.getElementById("tabMenuContent"+this.name).style.display="none"; + } +} \ No newline at end of file diff --git a/module/viewer/lib/js/ligeobaselayers.js b/module/viewer/lib/js/ligeobaselayers.js new file mode 100644 index 0000000..ffadfff --- /dev/null +++ b/module/viewer/lib/js/ligeobaselayers.js @@ -0,0 +1,86 @@ +var bLgsat, bLgclasic, bLblank, bLwhite + +function LiGeobaseLayers(ligeo,baseLayersNames){ + + + bLgsat = new OpenLayers.Layer.Google( + "Google Satellite", + { + type: G_SATELLITE_MAP, + 'sphericalMercator': true, + visibility: false, + format: "image/png", + opacity: 1, + isBaseLayer: true, + numZoomLevels: 21 + }) + + bLgclasic = new OpenLayers.Layer.Google( + "Google Clasic", + { + type: G_NORMAL_MAP, + 'sphericalMercator': true, + visibility: false, + format: "image/png", + opacity: 1, + isBaseLayer: true, + numZoomLevels: 21 + }) + + + bLwhite = new OpenLayers.Layer.Image( + "None", + '../img/white.png', + //ligeo.ligeoMap.map.maxExtent, + new OpenLayers.Bounds(-180,-90,180,90), + new OpenLayers.Size(10, 10), + { + isBaseLayer: true, + visibility: false + } + ); + + + + + + var visibleBaseLayer = ""; + var baseLayerName = []; + var defaultLayer = baseLayersNames[0]; + + + for(i=0; i
                      " + } + + this.changeBaseLayer = function(layer){ + eval(visibleBaseLayer+".setVisibility(false)"); + visibleBaseLayer = layer + eval(layer+".setVisibility(true)"); + } + + + + ligeo.ligeoMap.map.addLayers(baseLayerName); + + baseLayerName[baseLayersNames.indexOf(defaultLayer)].setVisibility(true) + var visibleBaseLayer = defaultLayer + document.getElementById(defaultLayer).checked = true + + + + + + + + + +} \ No newline at end of file diff --git a/module/viewer/lib/js/ligeobiotopy.js b/module/viewer/lib/js/ligeobiotopy.js new file mode 100644 index 0000000..ddce37c --- /dev/null +++ b/module/viewer/lib/js/ligeobiotopy.js @@ -0,0 +1,124 @@ +function LiGeobiotopy(ligeo){ + var ligeo = ligeo; + this.name = "biotopy"; + this.panel; + var layerName="biotopy2"; + + this.title = function(){ + //todo taday zjistim lokalizaci + return "biotopy"; + } + + this.toString = function(){ + return ""; + } + + this.activate = function(){ + if(this.panel) + this.panel.activate(); + document.getElementById("tabMenuContent"+this.name).style.display="block"; + if(! ligeo.userHash ){ + //alert(ligeo.userName+ligeo.userHash); + document.getElementById("tabMenuContent"+this.name).innerHTML = "Pro editace musíte být přihlášen."; + } + click.activate(); + + } + + this.deactivate = function(){ + if(this.panel) + this.panel.deactivate(); + this.tabMenuContent = document.getElementById("tabMenuContent"+this.name).style.display="none"; + click.deactivate(); + } + + this.hosp = function(){ + window.open(adminURL+"page/pg_biotopy/hosp.php?planId="+ligeo.planId +"&dbtab=" + layerName + "&userHash=" + ligeo.userHash,"Hospodářská_hodnota") + + } + this.spol = function(){ + window.open(adminURL+"page/pg_biotopy/spol.php?planId="+ligeo.planId +"&dbtab=" + layerName + "&userHash=" + ligeo.userHash,"Společenská_hodnota") + + } + //////////////////////////////gfi + + + + + var ie7 = (typeof document.addEventListener != 'function' && window.XMLHttpRequest) ? true : false; + + document.getElementById("biotopyGfiContent").innerHTML = "

                      Klikněte na biotop v mapě, pro získání informací o biotopu

                      "; + + + function gfi(x,y){ + + var bioURL = "../proxy.php?"+adminURL+"/page/pg_biotopy/GFI.php"+"?x="+x+"&y="+y+"&planId=" + ligeo.planId + "&dbtab=" + layerName + "&userHash=" + ligeo.userHash; + + + + $.ajax({ + type: 'GET', + url: bioURL, + dataType: 'json', + success: function(data) { + document.getElementById("biotopyGfiContent").innerHTML= data.name + " "+ data.kod; + document.getElementById("biotopyGfiContent").innerHTML += "(
                      edit)"; + + }, + data: {}, + async: false + }); + } + + OpenLayers.Control.Click = OpenLayers.Class(OpenLayers.Control, { + defaultHandlerOptions: { + 'single': true, + 'double': false, + 'pixelTolerance': 0, + 'stopSingle': false, + 'stopDouble': false + }, + + initialize: function(options) { + this.handlerOptions = OpenLayers.Util.extend( + {}, this.defaultHandlerOptions + ); + OpenLayers.Control.prototype.initialize.apply( + this, arguments + ); + this.handler = new OpenLayers.Handler.Click( + this, { + 'click': this.trigger + }, this.handlerOptions + ); + }, + + trigger: function(e) { + var lonlat = ligeo.ligeoMap.map.getLonLatFromPixel(e.xy); + var wgsLonLat = lonlat.transform(new OpenLayers.Projection("EPSG:900913"), new OpenLayers.Projection("EPSG:4326")); + gfi ( wgsLonLat.lat,wgsLonLat.lon); + + } + + }); + + + + + + + var click = new OpenLayers.Control.Click(); + ligeo.ligeoMap.map.addControl(click); + + +//////////////////////////////konec gfi + + + + + + + + +} + diff --git a/module/viewer/lib/js/ligeoeditor.js b/module/viewer/lib/js/ligeoeditor.js new file mode 100644 index 0000000..9cfd97e --- /dev/null +++ b/module/viewer/lib/js/ligeoeditor.js @@ -0,0 +1,356 @@ +var wfsu = "../proxyWFS.php"; //vojta +var map, wfs, selectControl; //vojta + +function LiGeoeditor(ligeo){ + var ligeo = ligeo; + this.name = "editor"; + this.panel; + + + this.title = function(){ + //todo taday zjistim lokalizaci + return "Editor"; + } + + this.toString = function(){ + return ""; + } + + this.activate = function(){ + if(this.panel) + this.panel.activate(); + document.getElementById("tabMenuContent"+this.name).style.display="block"; + if(! ligeo.userHash ){ + //alert(ligeo.userName+ligeo.userHash); + document.getElementById("tabMenuContent"+this.name).innerHTML = "This section is only visible logged users."; + } + + var selectbox = document.getElementById("tabMenuContenteditorSelect"); + + for(var j = 0;j<100; j++){ + + selectbox.remove(0); + } + + selectbox.add(new Option("== Layers ==", ""), null); + + for(var i =0;i nechci vkladat novy + var knRowCount=1;//pocet bboduu + /** + * + */ + + + + + + // Needed only for interaction, not for the display. + function onPopupClose(evt) { + /* + // 'this' is the popup. + var feature = this.feature; + if (feature.layer) { // The feature is not destroyed + selectControl.unselect(feature); + } else { // After "moveend" or "refresh" events on POIs layer all + // features have been destroyed by the Strategy.BBOX + this.destroy(); + } + */ + } + function onFeatureSelect(evt) { + knFeatureSelected = true; + window.open(document.getElementById("nahlizenidokn"+evt.feature['id']).href,"_blank"); + } + + function onFeatureUnselect(evt) { + knFeatureSelected = false; + //alert('unselected'); + /*feature = evt.feature; + if (feature.popup) { + popup.feature = null; + ligeo.ligeoMap.map.removePopup(feature.popup); + feature.popup.destroy(); + feature.popup = null; + }*/ + } + function onBeforefeatureadded(evt) { + /* + * feature = evt.feature; + popup = new OpenLayers.Popup.FramedCloud("featurePopup", + feature.geometry.getBounds().getCenterLonLat(), + new OpenLayers.Size(100,100), + "aaaa", + null, true, onPopupClose); + feature.popup = popup; + popup.feature = feature; + ligeo.ligeoMap.map.addPopup(popup, true); + */ + if(knFeatureSelected) + return false; + + var lonlat = ligeo.ligeoMap.map.getLonLatFromViewPortPx(evt.xy); //odečtení souřadnic z obrazovky a převadoní do 900913 + var lat = evt.feature['geometry'].y; //mercator 900913 + var lon = evt.feature['geometry'].x; //mercator 900913 + + var knLonLat = new OpenLayers.LonLat(lon,lat); //defince bodu, potřeba pro transformaci + var knWgs = knLonLat.transform(new OpenLayers.Projection("EPSG:900913"), new OpenLayers.Projection("EPSG:4326")); //transformace z 900913 do 4326 + var knJtsk = ligeo.ligeoMap.convertCoord.radToJTSK(ligeo.ligeoMap.convertCoord.deg2rad(knWgs.lat),ligeo.ligeoMap.convertCoord.deg2rad(knWgs.lon)); //transformace z 4326 do 102067(jtsk) + var jtsky = Math.round(knJtsk.x); //zaokrouhlení + var jtskx = Math.round(knJtsk.y); //zaokrouhlení + var knurl = "http://nahlizenidokn.cuzk.cz/MapaIdentifikace.aspx?&x=-"+jtskx+"&y=-"+jtsky; + + //pomucka pro odecet souradnic + //alert (lon+" "+lat) + + document.getElementById("knHromadne").innerHTML += "("+knRowCount+") Odkaz na katastr nemovitostí
                      "; + + knRowCount++; + return true; + } + + /** + * + */ + + + + OpenLayers.Control.Click = OpenLayers.Class(OpenLayers.Control, { + initialize: function() { + OpenLayers.Control.prototype.initialize.apply( + this, arguments + ); + this.handler = new OpenLayers.Handler.Click( + this, { + 'click': this.trigger + }); + }, + trigger: function kn(e) { + + lonlat = ligeo.ligeoMap.map.getLonLatFromViewPortPx(e.xy); //odečtení souřadnic z obrazovky a převadoní do 900913 + lat = lonlat.lat; //mercator 900913 + lon = lonlat.lon; //mercator 900913 + + if (document.getElementById('hromadnyVypisKn').checked) + { + var knPoint1 = new OpenLayers.Geometry.Point(lon,lat); + var knPoints = new OpenLayers.Feature.Vector(knPoint1); + + knPoints.attributes = { + name: knRowCount + }; + + + knLayer.addFeatures([knPoints]); + } + else{ + knLonLat = new OpenLayers.LonLat(lon,lat); //defince bodu, potřeba pro transformaci + knWgs = knLonLat.transform(new OpenLayers.Projection("EPSG:900913"), new OpenLayers.Projection("EPSG:4326")); //transformace z 900913 do 4326 + var knJtsk = ligeo.ligeoMap.convertCoord.radToJTSK(ligeo.ligeoMap.convertCoord.deg2rad(knWgs.lat),ligeo.ligeoMap.convertCoord.deg2rad(knWgs.lon)); //transformace z 4326 do 102067(jtsk) + jtsky = Math.round(knJtsk.x); //zaokrouhlení + jtskx = Math.round(knJtsk.y); //zaokrouhlení + var knurl = "http://nahlizenidokn.cuzk.cz/MapaIdentifikace.aspx?&x=-"+jtskx+"&y=-"+jtsky; + + window.open(knurl,"_blank"); + } + } + } + ); + + //kn//////////////////////////////////////////////// + + + + + + + + + + + + + + + + var ie7 = (typeof document.addEventListener != 'function' && window.XMLHttpRequest) ? true : false; + + + + + var info = new OpenLayers.Control.WMSGetFeatureInfo({ + infoFormat: "text/html", + url: gfiURL, + queryVisible: true, + layerUrls: [wmsURL], + title: 'Click', + layers: ligeo.ligeoMap.queryableLayers, + eventListeners: { + getfeatureinfo: function(event) { + alert("aaaaaaa") + ligeo.activate("info",true); + + if (ie7==true) { + document.getElementById("gfiContent").innerHTML = event.text + } else { + document.getElementById("gfiContent").innerHTML = event.text.replace(//,""); + } + + //////////////////////////////////////////////////////////////////////////////////////// uprava tabulky ///////////////////////// + var layers = ligeo.ligeoMap.queryableLayers + //identifikace požadované bunky + for (i = 0; i < layers.length; i++) { + a = document.getElementById("gfiContent") + b = a.getElementsByTagName("caption"); + + if (b[i] == null) + { + break; + } + else { + var layerName=b[i].innerHTML; + var gid = 0; + + + ////////////////////////////////////////foto/////////////////////////////// + if (true) + { + c = a.getElementsByTagName("tbody"); + d = c[i]; + e = d.getElementsByTagName("tr"); + f = e[1]; + g = f.getElementsByTagName("td"); + h = e[0]; + j = h.getElementsByTagName("th"); + + for(var x=0; x"; + }else{ + g[x].innerHTML = " odkaz"; + } + + } + + if(j[x].innerHTML=="fid"){ + gid = g[x].innerHTML.replace(layerName+"\.",""); + j[x].innerHTML=""; + g[x].innerHTML=""; + } + /* + if(j[x].innerHTML=="ligeoPicture"){ + j[x].innerHTML = "Foto"; + g[x].innerHTML = ""; + }else if(j[x].innerHTML=="ligeoUrl" && g[x].innerHTML){ + j[x].innerHTML = "Odkaz"; + g[x].innerHTML = ""+g[x].innerHTML+""; + } + */ + + } + + $(document).ready(function(){ + $("a[rel^='prettyPhoto']").prettyPhoto({ + social_tools:false + }); + }) + + } + ////////////////////////////////konec foto///////////////////////////////////// + } + + if(ligeo.ligeoMap.planLayers[ligeo.ligeoMap.planLayersName.indexOf(ligeo.namespace +":"+b[i].innerHTML)].metadata.type != "RASTR"){ + b[i].innerHTML="legenda "+ligeo.ligeoMap.planLayers[ligeo.ligeoMap.planLayersName.indexOf(ligeo.namespace +":"+b[i].innerHTML)].name + if(ligeo.userHash && ligeo.privilege > 1){ + b[i].innerHTML += " (edit)" + } + } + } + //////////////////////////////////// konec foto /////////////////////// + } + } + }); + + + ligeo.ligeoMap.map.addControl(info); + // build the getFeatureInfo + var featureInfo = new OpenLayers.Control({ + displayClass: "olControlFeatureInfo", + title: "Kliknutí zjistíte informace o místě" + }); + + featureInfo.events.register("activate", featureInfo, function() { + that.showKn(false); + ligeo.activate("info",true); + info.activate(); + document.getElementById("tabMenuContentinfo").innerHTML = "Pro dotazování ve viditelné vrstvě klikněte na mapu.

                      "; + }); + featureInfo.events.register("deactivate", featureInfo, function() { + info.deactivate(); + + }); + + + + + + var Kn = new OpenLayers.Control.Click({ + displayClass: "olControlKn" + }); + Kn.events.register("activate", Kn, function() { + ligeo.activate("info",true); + + document.getElementById("tabMenuContentinfo").innerHTML="
                      Hromadný výpis?
                      "; + }); + Kn.events.register("deactivate", Kn, function() { + + }); + + + //alert(ligeo.ligeoMap.map.controls[3]); + ligeo.ligeoMap.toolbar.addControls([featureInfo,Kn]); +} \ No newline at end of file diff --git a/module/viewer/lib/js/ligeolayers.js b/module/viewer/lib/js/ligeolayers.js new file mode 100644 index 0000000..5406216 --- /dev/null +++ b/module/viewer/lib/js/ligeolayers.js @@ -0,0 +1,35 @@ +function LiGeolayers(ligeo){ + this.name = "layers"; + this.tabMenuContent = ""; + this.title = function(){ + //todo taday zjistim lokalizaci + return "Layers"; + } + + this.toString = function(){ + return ""; + } + + this.activate = function(){ + this.tabMenuContent = document.getElementById("tabMenuContent"+this.name).style.display="block"; + } + + this.deactivate = function(){ + this.tabMenuContent = document.getElementById("tabMenuContent"+this.name).style.display="none"; + } +/* + ligeo.ligeoMap.map.addControl(new OpenLayers.Control.LayerSwitcher({ + div:document.getElementById('tabMenuContent'+this.name) + } + )); +*/ +} + + + + + + + + + diff --git a/module/viewer/lib/js/ligeolegend.js b/module/viewer/lib/js/ligeolegend.js new file mode 100644 index 0000000..1664a17 --- /dev/null +++ b/module/viewer/lib/js/ligeolegend.js @@ -0,0 +1,57 @@ +/* + *je li typ vrstvy vektor, v legendě se objeví obrázek, který odpovídá zvolenému stylu + *je li typ vrstvy rastr, v legendě se objeví odkaz na přiložený obrázek legendy +*/ + +function LiGeolegend(ligeo){ + this.name = "legend"; + + this.title = function(){ + //todo taday zjistim lokalizaci + return "Legend"; + } + + this.toString = function(){ + return ""; + } + + this.activate = function(){ + this.tabMenuContent = document.getElementById("tabMenuContent"+this.name).style.display="block"; + + var html =""; + + for(var i = 0; i < ligeo.ligeoMap.planLayers.length; i++) + { + + if (ligeo.ligeoMap.planLayers[i].metadata.inLegend!=1) + { + nic = ""; + + html += nic; + } + + else if (ligeo.ligeoMap.planLayers[i].metadata.type=="RASTR") + { + legendImage1 = "Legenda"; + legendName1 = ligeo.ligeoMap.planLayers[i].name; + html += ""+legendImage1 + " " + legendName1+ ""; + } + + + else + { + legendImage = "legenda"; + legendName = ligeo.ligeoMap.planLayers[i].name; + html += ""+legendImage + "" + legendName+ ""; + + } + + } + document.getElementById("tabMenuContent"+this.name).innerHTML=""+html+"
                      "; + } + + this.deactivate = function(){ + this.tabMenuContent = document.getElementById("tabMenuContent"+this.name).style.display="none"; + + } +} diff --git a/module/viewer/lib/js/ligeologin.js b/module/viewer/lib/js/ligeologin.js new file mode 100644 index 0000000..adf6ac9 --- /dev/null +++ b/module/viewer/lib/js/ligeologin.js @@ -0,0 +1,25 @@ +function LiGeologin(ligeo){ + var ligeo = ligeo; + this.name = "login"; + + this.title = function(){ + //todo taday zjistim lokalizaci + return "Login"; + } + + this.toString = function(){ + return ""; + } + + this.activate = function(){ + document.getElementById("tabMenuContent"+this.name).style.display="block"; + if(ligeo.userHash ){ + //alert(ligeo.userName+ligeo.userHash); + document.getElementById("tabMenuContent"+this.name).innerHTML = "

                      "+ligeo.userName+" ("+(ligeo.privilege ==1 ? "viewing" : (ligeo.privilege==2 ? "editation" : (ligeo.privilege==3 ? "administration" : "")))+")

                      " + } + } + + this.deactivate = function(){ + this.tabMenuContent = document.getElementById("tabMenuContent"+this.name).style.display="none"; + } +} \ No newline at end of file diff --git a/module/viewer/lib/js/ligeomeasurement.js b/module/viewer/lib/js/ligeomeasurement.js new file mode 100644 index 0000000..83b27e1 --- /dev/null +++ b/module/viewer/lib/js/ligeomeasurement.js @@ -0,0 +1,153 @@ +function LiGeomeasurement(ligeo){ + this.name = "measurement"; + + this.title = function(){ + //todo taday zjistim lokalizaci + return "Measurement"; + } + + this.toString = function(){ + return ""; + } + + this.activate = function(){ + this.tabMenuContent = document.getElementById("tabMenuContent"+this.name).style.display="block"; + } + + var sketchSymbolizers = { + "Point": { + pointRadius: 4, + graphicName: "square", + fillColor: "white", + fillOpacity: 1, + strokeWidth: 1, + strokeOpacity: 1, + strokeColor: "#FF0000" + }, + "Line": { + strokeWidth: 3, + strokeOpacity: 1, + strokeColor: "#FF0000", + strokeDashstyle: "dash" + }, + "Polygon": { + strokeWidth: 2, + strokeOpacity: 1, + strokeColor: "#FF0000", + fillColor: "white", + fillOpacity: 0.4 + } + }; + var style = new OpenLayers.Style(); + style.addRules([ + new OpenLayers.Rule({ + symbolizer: sketchSymbolizers + }) + ]); + var styleMap = new OpenLayers.StyleMap({ + "default": style + }); + + this.deactivate = function(){ + if(measureControls.polygon.active) + measureControls.polygon.deactivate(); + if(measureControls.line.active) + measureControls.line.deactivate(); + + document.getElementById('mapOutput').innerHTML = ""; + document.getElementById("tabMenuContent"+this.name).style.display="none"; + + } + + + + + + + + + + + + + + + + // build the measure controls + var measureControls = { + line: new OpenLayers.Control.Measure( + OpenLayers.Handler.Path, { + geodesic: true, + persist: true, + displayClass: "olControlMeasureDistance", + title: "Length measurement", + handlerOptions: { + layerOptions: { + styleMap: styleMap + } + } + } + ), + polygon: new OpenLayers.Control.Measure( + OpenLayers.Handler.Polygon, { + geodesic: true, + persist: true, + displayClass: "olControlMeasureArea", + title: "Area measurement", + handlerOptions: { + layerOptions: { + styleMap: styleMap + } + } + } + ) + }; + + for(var key in measureControls) { + var control = measureControls[key]; + control.events.on({ + "measure": handleMeasurements, + "measurepartial": handleMeasurements + }); + } + + function handleMeasurements(event) { + var geometry = event.geometry; + var units = event.units; + var order = event.order; + var measure = event.measure; + var element = document.getElementById('mapOutput'); + var out = ""; + if(order == 1) { + out += "Length: " + measure.toFixed(3) + " " + units; + + } else { + out += "Area: " + measure.toFixed(3) + " " + units + "2"; + } + element.innerHTML = out; + } + + measureControls.line.events.register("activate", measureControls.line, function() { + ligeo.activate("measurement",true); + measureControls.line.activate(); + }); + measureControls.polygon.events.register("activate", measureControls.polygon, function() { + ligeo.activate("measurement",true); + measureControls.polygon.activate(); + }); + + measureControls.line.events.register("deactivate", measureControls.line, function() { + // ligeo.activate("measurement",true); + measureControls.line.deactivate(); + }); + measureControls.polygon.events.register("deactivate", measureControls.polygon, function() { + // ligeo.activate("measurement",true); + measureControls.polygon.deactivate(); + }); + + ligeo.ligeoMap.toolbar.addControls([ + measureControls.line, + measureControls.polygon + ]); + +} diff --git a/module/viewer/lib/js/ligeoprint.js b/module/viewer/lib/js/ligeoprint.js new file mode 100644 index 0000000..f9900f1 --- /dev/null +++ b/module/viewer/lib/js/ligeoprint.js @@ -0,0 +1,205 @@ +function LiGeoprint(ligeo){ + this.name = "print"; + var printJson = ""; + var printMapUrl = ""; //URL PDF vrácené ze srvr + var printLayer; + + this.title = function(){ + //todo taday zjistim lokalizaci + return "Print"; + } + + this.toString = function(){ + return ""; + } + + + this.printSelected = function(){ + + + + //document.getElementById("printResult").style.display="none"; + + if(printJson){ + document.getElementById("print_form").spec.value=printJson; + document.getElementById("print_form").action=printURL; + + }else{ + alert("Choose print extent"); + return false; + } + this.deactivatePrintLayer(); + + return true; + + } + + this.openPrint = function(){ + if(printMapUrl) + document.location=printMapUrl; + document.getElementById("printResult").style.display="none"; + + } + + this.activatePrintLayer = function(){ + document.getElementById("mapName").disabled = false; + box.activate(); + } + + this.deactivatePrintLayer = function(){ + printJson=""; + printLayer.removeAllFeatures(); + box.deactivate(); + } + + + this.activate = function(){ + this.tabMenuContent = document.getElementById("tabMenuContent"+this.name).style.display="block"; + printLayer.setVisibility(true); + document.getElementById("mapName").disabled = false; + this.activatePrintLayer(); + } + + this.deactivate = function(){ + this.tabMenuContent = document.getElementById("tabMenuContent"+this.name).style.display="none"; + printLayer.setVisibility(false); + this.deactivatePrintLayer(); + } + + this.nazev = ligeo.page + + + + + + printLayer = new OpenLayers.Layer.Vector("Polygon Layer",{ + displayInLayerSwitcher:false + }); + + + ligeo.ligeoMap.map.addLayers([printLayer]); + printLayer.setZIndex(900); + + var control = new OpenLayers.Control(); + OpenLayers.Util.extend(control, { + draw: function () { + // this Handler.Box will intercept the shift-mousedown + // before Control.MouseDefault gets to see it + box = new OpenLayers.Handler.Box( control, + { + "done": this.notice + } + ); + + }, + + notice: function (bounds) { + + if(printLayer.features.length > 0) { + printLayer.removeFeatures(printLayer.features[0]) + } + var ll = ligeo.ligeoMap.map.getLonLatFromPixel(new OpenLayers.Pixel(bounds.left, bounds.bottom)); + var ur = ligeo.ligeoMap.map.getLonLatFromPixel(new OpenLayers.Pixel(bounds.right, bounds.top)); + + var center = ligeo.ligeoMap.map.getLonLatFromPixel(new OpenLayers.Pixel((bounds.left + ((bounds.right-bounds.left)/2)), (bounds.top + ((bounds.bottom-bounds.top)/2)))); + + + + var point = new OpenLayers.LonLat(center.lon, center.lat); + //this.map.setCenter(point, ligeo.ligeoMap.zoom); + + + var pA = new Array(); + pA[0] = new OpenLayers.Geometry.Point( ll.lon.toFixed(4), ll.lat.toFixed(4) ); + pA[1] = new OpenLayers.Geometry.Point( ll.lon.toFixed(4), ur.lat.toFixed(4) ); + pA[2] = new OpenLayers.Geometry.Point( ur.lon.toFixed(4), ur.lat.toFixed(4) ); + pA[3] = new OpenLayers.Geometry.Point( ur.lon.toFixed(4), ll.lat.toFixed(4) ); + + var pointList = []; + for(var p=0; p<4; p++) { + pointList.push(pA[p]) + }; + + var linearRing = new OpenLayers.Geometry.LinearRing(pointList); + var newPolygon = new OpenLayers.Geometry.Polygon(linearRing); + var selectBoxFeature = new OpenLayers.Feature.Vector( + newPolygon); + + // add new polygon box feature to the box layer + printLayer.addFeatures([selectBoxFeature]); + + + //nastavení tisku + var dpi = document.getElementById('dpi_form').value + + + var printable = new Array() + var printableZix = new Array(); + + var activeLayer = ligeo.ligeoMap.getLayersActive(); + for(var i = 0; i < activeLayer.length; i++){ + if (ligeo.ligeoMap.planLayers[ligeo.ligeoMap.planLayersName.indexOf(activeLayer[i])].metadata.printable=="0") + { + notprint="" + } + else + { + var zIx = ligeo.ligeoMap.planLayers[ligeo.ligeoMap.planLayersName.indexOf(activeLayer[i])].getZIndex(); + printable[zIx]=activeLayer[i]; + printableZix.push(zIx); + } + }; + + printableZix.sort(); + + var layersToPrint = new Array() + for(var i = 0; i < printableZix.length; i++) + { + + layers = + "{ \"type\": \""+ligeo.ligeoMap.planLayers[ligeo.ligeoMap.planLayersName.indexOf(printable[printableZix[i]])].metadata.type+"\"," + +"\"layers\": [\""+printable[printableZix[i]]+"\"]," + +"\"baseURL\": \""+wmsURL+"\"," + +"\"opacity\":"+ ligeo.ligeoMap.planLayers[ligeo.ligeoMap.planLayersName.indexOf(printable[printableZix[i]])].opacity +"," + +"\"singleTile\":\"true\"," + +"\"customParams\":{" + +"\"ENV\":\"\"," + +"\"TRANSPARENT\":\"true\"" + +"}," + +"\"format\": \"image/png\"" + +"}"; + layersToPrint.push(layers); + + } + + + + printJson = "{" + +"\"layout\": \"Legal\"," + +"\"srs\": \"EPSG:900913\"," + +"\"units\": \"meters\"," + +"\"geodetic\": \"true\"," + +"\"outputFilename\": \""+replaceDiak(document.getElementById("mapName").value)+"\"," + +"\"outputFormat\": \"pdf\"," + +"\"layers\":["+layersToPrint+"]," + +"\"pages\": [" + +"{" + +"\"center\":["+center.lon+","+center.lat+"]," + +"\"zoom\":\""+ligeo.ligeoMap.map.zoom+"\"," + +"\"bbox\": [ "+ll.lon.toFixed(4)+", "+ll.lat.toFixed(4)+","+ ur.lon.toFixed(4)+","+ur.lat.toFixed(4)+"]," + +"\"srs\": \"EPSG:900913\"," + +"\"dpi\": "+dpi+"," + +"\"geodetic\": \"true\"," + +"\"mapTitle\": \""+replaceDiak(document.getElementById("mapName").value)+"\"," + +"\"comment\": \"\"" + +"}" + +"]" + +"}"; + + + document.getElementById("mapName").disabled = true; + box.deactivate(); + } + }); + ligeo.ligeoMap.map.addControl(control); +} diff --git a/module/viewer/lib/js/main.js b/module/viewer/lib/js/main.js new file mode 100644 index 0000000..967e0ba --- /dev/null +++ b/module/viewer/lib/js/main.js @@ -0,0 +1,4 @@ + + +document.write(''); +document.write(''); \ No newline at end of file diff --git a/module/viewer/lib/js/openlayers/OpenLayers.js b/module/viewer/lib/js/openlayers/OpenLayers.js new file mode 100644 index 0000000..e226496 --- /dev/null +++ b/module/viewer/lib/js/openlayers/OpenLayers.js @@ -0,0 +1,2553 @@ +/* + + OpenLayers.js -- OpenLayers Map Viewer Library + + Copyright 2005-2010 OpenLayers Contributors, released under the Clear BSD + license. Please see http://svn.openlayers.org/trunk/openlayers/license.txt + for the full text of the license. + + Includes compressed code under the following licenses: + + (For uncompressed versions of the code used please see the + OpenLayers SVN repository: ) + +*/ + +/* Contains portions of Prototype.js: + * + * Prototype JavaScript framework, version 1.4.0 + * (c) 2005 Sam Stephenson + * + * Prototype is freely distributable under the terms of an MIT-style license. + * For details, see the Prototype web site: http://prototype.conio.net/ + * + *--------------------------------------------------------------------------*/ + +/** +* +* Contains portions of Rico +* +* Copyright 2005 Sabre Airline Solutions +* +* 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. +* +**/ + +/** + * Contains XMLHttpRequest.js + * Copyright 2007 Sergey Ilinsky (http://www.ilinsky.com) + * + * 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 + */ + +/** + * Contains portions of Gears + * + * Copyright 2007, Google Inc. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. 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. + * 3. Neither the name of Google Inc. nor the names of its contributors may be + * used to endorse or promote products derived from this software without + * specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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. + * + * Sets up google.gears.*, which is *the only* supported way to access Gears. + * + * Circumvent this file at your own risk! + * + * In the future, Gears may automatically define google.gears.* without this + * file. Gears may use these objects to transparently fix bugs and compatibility + * issues. Applications that use the code below will continue to work seamlessly + * when that happens. + */ +var OpenLayers={singleFile:true};(function(){var singleFile=(typeof OpenLayers=="object"&&OpenLayers.singleFile);var scriptLocation;window.OpenLayers={_scriptName:(!singleFile)?"lib/OpenLayers.js":"OpenLayers.js",_getScriptLocation:function(){if(scriptLocation!=undefined){return scriptLocation;} +scriptLocation="";var isOL=new RegExp("(^|(.*?\\/))("+OpenLayers._scriptName+")(\\?|$)");var scripts=document.getElementsByTagName('script');for(var i=0,len=scripts.length;i";}else{var s=document.createElement("script");s.src=host+jsfiles[i];var h=document.getElementsByTagName("head").length?document.getElementsByTagName("head")[0]:document.body;h.appendChild(s);}} +if(docWrite){document.write(allScriptTags.join(""));}}})();OpenLayers.VERSION_NUMBER="OpenLayers 2.10 -- $Revision: 10721 $";OpenLayers.String={startsWith:function(str,sub){return(str.indexOf(sub)==0);},contains:function(str,sub){return(str.indexOf(sub)!=-1);},trim:function(str){return str.replace(/^\s\s*/,'').replace(/\s\s*$/,'');},camelize:function(str){var oStringList=str.split('-');var camelizedString=oStringList[0];for(var i=1,len=oStringList.length;i0){fig=parseFloat(num.toPrecision(sig));} +return fig;},format:function(num,dec,tsep,dsep){dec=(typeof dec!="undefined")?dec:0;tsep=(typeof tsep!="undefined")?tsep:OpenLayers.Number.thousandsSeparator;dsep=(typeof dsep!="undefined")?dsep:OpenLayers.Number.decimalSeparator;if(dec!=null){num=parseFloat(num.toFixed(dec));} +var parts=num.toString().split(".");if(parts.length==1&&dec==null){dec=0;} +var integer=parts[0];if(tsep){var thousands=/(-?[0-9]+)([0-9]{3})/;while(thousands.test(integer)){integer=integer.replace(thousands,"$1"+tsep+"$2");}} +var str;if(dec==0){str=integer;}else{var rem=parts.length>1?parts[1]:"0";if(dec!=null){rem=rem+new Array(dec-rem.length+1).join("0");} +str=integer+dsep+rem;} +return str;}};if(!Number.prototype.limitSigDigs){Number.prototype.limitSigDigs=function(sig){OpenLayers.Console.warn(OpenLayers.i18n("methodDeprecated",{'newMethod':'OpenLayers.Number.limitSigDigs'}));return OpenLayers.Number.limitSigDigs(this,sig);};} +OpenLayers.Function={bind:function(func,object){var args=Array.prototype.slice.apply(arguments,[2]);return function(){var newArgs=args.concat(Array.prototype.slice.apply(arguments,[0]));return func.apply(object,newArgs);};},bindAsEventListener:function(func,object){return function(event){return func.call(object,event||window.event);};},False:function(){return false;},True:function(){return true;}};if(!Function.prototype.bind){Function.prototype.bind=function(){OpenLayers.Console.warn(OpenLayers.i18n("methodDeprecated",{'newMethod':'OpenLayers.Function.bind'}));Array.prototype.unshift.apply(arguments,[this]);return OpenLayers.Function.bind.apply(null,arguments);};} +if(!Function.prototype.bindAsEventListener){Function.prototype.bindAsEventListener=function(object){OpenLayers.Console.warn(OpenLayers.i18n("methodDeprecated",{'newMethod':'OpenLayers.Function.bindAsEventListener'}));return OpenLayers.Function.bindAsEventListener(this,object);};} +OpenLayers.Array={filter:function(array,callback,caller){var selected=[];if(Array.prototype.filter){selected=array.filter(callback,caller);}else{var len=array.length;if(typeof callback!="function"){throw new TypeError();} +for(var i=0;i1){initialize=Type.prototype.initialize;Type.prototype.initialize=function(){};extended=new Type();if(initialize===undefined){delete Type.prototype.initialize;}else{Type.prototype.initialize=initialize;}} +parent=Type.prototype;}else{parent=Type;} +OpenLayers.Util.extend(extended,parent);} +Class.prototype=extended;return Class;};OpenLayers.Class.isPrototype=function(){};OpenLayers.Class.create=function(){return function(){if(arguments&&arguments[0]!=OpenLayers.Class.isPrototype){this.initialize.apply(this,arguments);}};};OpenLayers.Class.inherit=function(){var superClass=arguments[0];var proto=new superClass(OpenLayers.Class.isPrototype);for(var i=1,len=arguments.length;i=0;i--){if(array[i]==item){array.splice(i,1);}} +return array;};OpenLayers.Util.clearArray=function(array){OpenLayers.Console.warn(OpenLayers.i18n("methodDeprecated",{'newMethod':'array = []'}));array.length=0;};OpenLayers.Util.indexOf=function(array,obj){if(typeof array.indexOf=="function"){return array.indexOf(obj);}else{for(var i=0,len=array.length;i=0.0&&parseFloat(opacity)<1.0){element.style.filter='alpha(opacity='+(opacity*100)+')';element.style.opacity=opacity;}else if(parseFloat(opacity)==1.0){element.style.filter='';element.style.opacity='';}};OpenLayers.Util.createDiv=function(id,px,sz,imgURL,position,border,overflow,opacity){var dom=document.createElement('div');if(imgURL){dom.style.backgroundImage='url('+imgURL+')';} +if(!id){id=OpenLayers.Util.createUniqueID("OpenLayersDiv");} +if(!position){position="absolute";} +OpenLayers.Util.modifyDOMElement(dom,id,px,sz,position,border,overflow,opacity);return dom;};OpenLayers.Util.createImage=function(id,px,sz,imgURL,position,border,opacity,delayDisplay){var image=document.createElement("img");if(!id){id=OpenLayers.Util.createUniqueID("OpenLayersDiv");} +if(!position){position="relative";} +OpenLayers.Util.modifyDOMElement(image,id,px,sz,position,border,null,opacity);if(delayDisplay){image.style.display="none";OpenLayers.Event.observe(image,"load",OpenLayers.Function.bind(OpenLayers.Util.onImageLoad,image));OpenLayers.Event.observe(image,"error",OpenLayers.Function.bind(OpenLayers.Util.onImageLoadError,image));} +image.style.alt=id;image.galleryImg="no";if(imgURL){image.src=imgURL;} +return image;};OpenLayers.Util.setOpacity=function(element,opacity){OpenLayers.Util.modifyDOMElement(element,null,null,null,null,null,null,opacity);};OpenLayers.Util.onImageLoad=function(){if(!this.viewRequestID||(this.map&&this.viewRequestID==this.map.viewRequestID)){this.style.display="";} +OpenLayers.Element.removeClass(this,"olImageLoadError");};OpenLayers.IMAGE_RELOAD_ATTEMPTS=0;OpenLayers.Util.onImageLoadError=function(){this._attempts=(this._attempts)?(this._attempts+1):1;if(this._attempts<=OpenLayers.IMAGE_RELOAD_ATTEMPTS){var urls=this.urls;if(urls&&urls instanceof Array&&urls.length>1){var src=this.src.toString();var current_url,k;for(k=0;current_url=urls[k];k++){if(src.indexOf(current_url)!=-1){break;}} +var guess=Math.floor(urls.length*Math.random());var new_url=urls[guess];k=0;while(new_url==current_url&&k++<4){guess=Math.floor(urls.length*Math.random());new_url=urls[guess];} +this.src=src.replace(current_url,new_url);}else{this.src=this.src;}}else{OpenLayers.Element.addClass(this,"olImageLoadError");} +this.style.display="";};OpenLayers.Util.alphaHackNeeded=null;OpenLayers.Util.alphaHack=function(){if(OpenLayers.Util.alphaHackNeeded==null){var arVersion=navigator.appVersion.split("MSIE");var version=parseFloat(arVersion[1]);var filter=false;try{filter=!!(document.body.filters);}catch(e){} +OpenLayers.Util.alphaHackNeeded=(filter&&(version>=5.5)&&(version<7));} +return OpenLayers.Util.alphaHackNeeded;};OpenLayers.Util.modifyAlphaImageDiv=function(div,id,px,sz,imgURL,position,border,sizing,opacity){OpenLayers.Util.modifyDOMElement(div,id,px,sz,position,null,null,opacity);var img=div.childNodes[0];if(imgURL){img.src=imgURL;} +OpenLayers.Util.modifyDOMElement(img,div.id+"_innerImage",null,sz,"relative",border);if(OpenLayers.Util.alphaHack()){if(div.style.display!="none"){div.style.display="inline-block";} +if(sizing==null){sizing="scale";} +div.style.filter="progid:DXImageTransform.Microsoft"+".AlphaImageLoader(src='"+img.src+"', "+"sizingMethod='"+sizing+"')";if(parseFloat(div.style.opacity)>=0.0&&parseFloat(div.style.opacity)<1.0){div.style.filter+=" alpha(opacity="+div.style.opacity*100+")";} +img.style.filter="alpha(opacity=0)";}};OpenLayers.Util.createAlphaImageDiv=function(id,px,sz,imgURL,position,border,sizing,opacity,delayDisplay){var div=OpenLayers.Util.createDiv();var img=OpenLayers.Util.createImage(null,null,null,null,null,null,null,false);div.appendChild(img);if(delayDisplay){img.style.display="none";OpenLayers.Event.observe(img,"load",OpenLayers.Function.bind(OpenLayers.Util.onImageLoad,div));OpenLayers.Event.observe(img,"error",OpenLayers.Function.bind(OpenLayers.Util.onImageLoadError,div));} +OpenLayers.Util.modifyAlphaImageDiv(div,id,px,sz,imgURL,position,border,sizing,opacity);return div;};OpenLayers.Util.upperCaseObject=function(object){var uObject={};for(var key in object){uObject[key.toUpperCase()]=object[key];} +return uObject;};OpenLayers.Util.applyDefaults=function(to,from){to=to||{};var fromIsEvt=typeof window.Event=="function"&&from instanceof window.Event;for(var key in from){if(to[key]===undefined||(!fromIsEvt&&from.hasOwnProperty&&from.hasOwnProperty(key)&&!to.hasOwnProperty(key))){to[key]=from[key];}} +if(!fromIsEvt&&from&&from.hasOwnProperty&&from.hasOwnProperty('toString')&&!to.hasOwnProperty('toString')){to.toString=from.toString;} +return to;};OpenLayers.Util.getParameterString=function(params){var paramsArray=[];for(var key in params){var value=params[key];if((value!=null)&&(typeof value!='function')){var encodedValue;if(typeof value=='object'&&value.constructor==Array){var encodedItemArray=[];var item;for(var itemIndex=0,len=value.length;itemIndex0)) +{if(!index){index=0;} +if(result[index].childNodes.length>1){return result.childNodes[1].nodeValue;} +else if(result[index].childNodes.length==1){return result[index].firstChild.nodeValue;}}else{return"";}};OpenLayers.Util.getXmlNodeValue=function(node){var val=null;OpenLayers.Util.Try(function(){val=node.text;if(!val){val=node.textContent;} +if(!val){val=node.firstChild.nodeValue;}},function(){val=node.textContent;});return val;};OpenLayers.Util.mouseLeft=function(evt,div){var target=(evt.relatedTarget)?evt.relatedTarget:evt.toElement;while(target!=div&&target!=null){target=target.parentNode;} +return(target!=div);};OpenLayers.Util.DEFAULT_PRECISION=14;OpenLayers.Util.toFloat=function(number,precision){if(precision==null){precision=OpenLayers.Util.DEFAULT_PRECISION;} +var number;if(precision==0){number=parseFloat(number);}else{number=parseFloat(parseFloat(number).toPrecision(precision));} +return number;};OpenLayers.Util.rad=function(x){return x*Math.PI/180;};OpenLayers.Util.deg=function(x){return x*180/Math.PI;};OpenLayers.Util.VincentyConstants={a:6378137,b:6356752.3142,f:1/298.257223563};OpenLayers.Util.distVincenty=function(p1,p2){var ct=OpenLayers.Util.VincentyConstants;var a=ct.a,b=ct.b,f=ct.f;var L=OpenLayers.Util.rad(p2.lon-p1.lon);var U1=Math.atan((1-f)*Math.tan(OpenLayers.Util.rad(p1.lat)));var U2=Math.atan((1-f)*Math.tan(OpenLayers.Util.rad(p2.lat)));var sinU1=Math.sin(U1),cosU1=Math.cos(U1);var sinU2=Math.sin(U2),cosU2=Math.cos(U2);var lambda=L,lambdaP=2*Math.PI;var iterLimit=20;while(Math.abs(lambda-lambdaP)>1e-12&&--iterLimit>0){var sinLambda=Math.sin(lambda),cosLambda=Math.cos(lambda);var sinSigma=Math.sqrt((cosU2*sinLambda)*(cosU2*sinLambda)+ +(cosU1*sinU2-sinU1*cosU2*cosLambda)*(cosU1*sinU2-sinU1*cosU2*cosLambda));if(sinSigma==0){return 0;} +var cosSigma=sinU1*sinU2+cosU1*cosU2*cosLambda;var sigma=Math.atan2(sinSigma,cosSigma);var alpha=Math.asin(cosU1*cosU2*sinLambda/sinSigma);var cosSqAlpha=Math.cos(alpha)*Math.cos(alpha);var cos2SigmaM=cosSigma-2*sinU1*sinU2/cosSqAlpha;var C=f/16*cosSqAlpha*(4+f*(4-3*cosSqAlpha));lambdaP=lambda;lambda=L+(1-C)*f*Math.sin(alpha)*(sigma+C*sinSigma*(cos2SigmaM+C*cosSigma*(-1+2*cos2SigmaM*cos2SigmaM)));} +if(iterLimit==0){return NaN;} +var uSq=cosSqAlpha*(a*a-b*b)/(b*b);var A=1+uSq/16384*(4096+uSq*(-768+uSq*(320-175*uSq)));var B=uSq/1024*(256+uSq*(-128+uSq*(74-47*uSq)));var deltaSigma=B*sinSigma*(cos2SigmaM+B/4*(cosSigma*(-1+2*cos2SigmaM*cos2SigmaM)- +B/6*cos2SigmaM*(-3+4*sinSigma*sinSigma)*(-3+4*cos2SigmaM*cos2SigmaM)));var s=b*A*(sigma-deltaSigma);var d=s.toFixed(3)/1000;return d;};OpenLayers.Util.destinationVincenty=function(lonlat,brng,dist){var u=OpenLayers.Util;var ct=u.VincentyConstants;var a=ct.a,b=ct.b,f=ct.f;var lon1=lonlat.lon;var lat1=lonlat.lat;var s=dist;var alpha1=u.rad(brng);var sinAlpha1=Math.sin(alpha1);var cosAlpha1=Math.cos(alpha1);var tanU1=(1-f)*Math.tan(u.rad(lat1));var cosU1=1/Math.sqrt((1+tanU1*tanU1)),sinU1=tanU1*cosU1;var sigma1=Math.atan2(tanU1,cosAlpha1);var sinAlpha=cosU1*sinAlpha1;var cosSqAlpha=1-sinAlpha*sinAlpha;var uSq=cosSqAlpha*(a*a-b*b)/(b*b);var A=1+uSq/16384*(4096+uSq*(-768+uSq*(320-175*uSq)));var B=uSq/1024*(256+uSq*(-128+uSq*(74-47*uSq)));var sigma=s/(b*A),sigmaP=2*Math.PI;while(Math.abs(sigma-sigmaP)>1e-12){var cos2SigmaM=Math.cos(2*sigma1+sigma);var sinSigma=Math.sin(sigma);var cosSigma=Math.cos(sigma);var deltaSigma=B*sinSigma*(cos2SigmaM+B/4*(cosSigma*(-1+2*cos2SigmaM*cos2SigmaM)- +B/6*cos2SigmaM*(-3+4*sinSigma*sinSigma)*(-3+4*cos2SigmaM*cos2SigmaM)));sigmaP=sigma;sigma=s/(b*A)+deltaSigma;} +var tmp=sinU1*sinSigma-cosU1*cosSigma*cosAlpha1;var lat2=Math.atan2(sinU1*cosSigma+cosU1*sinSigma*cosAlpha1,(1-f)*Math.sqrt(sinAlpha*sinAlpha+tmp*tmp));var lambda=Math.atan2(sinSigma*sinAlpha1,cosU1*cosSigma-sinU1*sinSigma*cosAlpha1);var C=f/16*cosSqAlpha*(4+f*(4-3*cosSqAlpha));var L=lambda-(1-C)*f*sinAlpha*(sigma+C*sinSigma*(cos2SigmaM+C*cosSigma*(-1+2*cos2SigmaM*cos2SigmaM)));var revAz=Math.atan2(sinAlpha,-tmp);return new OpenLayers.LonLat(lon1+u.deg(L),u.deg(lat2));};OpenLayers.Util.getParameters=function(url){url=url||window.location.href;var paramsString="";if(OpenLayers.String.contains(url,'?')){var start=url.indexOf('?')+1;var end=OpenLayers.String.contains(url,"#")?url.indexOf('#'):url.length;paramsString=url.substring(start,end);} +var parameters={};var pairs=paramsString.split(/[&;]/);for(var i=0,len=pairs.length;i1.0)?(1.0/scale):scale;return normScale;};OpenLayers.Util.getResolutionFromScale=function(scale,units){var resolution;if(scale){if(units==null){units="degrees";} +var normScale=OpenLayers.Util.normalizeScale(scale);resolution=1/(normScale*OpenLayers.INCHES_PER_UNIT[units]*OpenLayers.DOTS_PER_INCH);} +return resolution;};OpenLayers.Util.getScaleFromResolution=function(resolution,units){if(units==null){units="degrees";} +var scale=resolution*OpenLayers.INCHES_PER_UNIT[units]*OpenLayers.DOTS_PER_INCH;return scale;};OpenLayers.Util.safeStopPropagation=function(evt){OpenLayers.Event.stop(evt,true);};OpenLayers.Util.pagePosition=function(forElement){var valueT=0,valueL=0;var element=forElement;var child=forElement;while(element){if(element==document.body){if(OpenLayers.Element.getStyle(child,'position')=='absolute'){break;}} +valueT+=element.offsetTop||0;valueL+=element.offsetLeft||0;child=element;try{element=element.offsetParent;}catch(e){OpenLayers.Console.error(OpenLayers.i18n("pagePositionFailed",{'elemId':element.id}));break;}} +element=forElement;while(element){valueT-=element.scrollTop||0;valueL-=element.scrollLeft||0;element=element.parentNode;} +return[valueL,valueT];};OpenLayers.Util.isEquivalentUrl=function(url1,url2,options){options=options||{};OpenLayers.Util.applyDefaults(options,{ignoreCase:true,ignorePort80:true,ignoreHash:true});var urlObj1=OpenLayers.Util.createUrlObject(url1,options);var urlObj2=OpenLayers.Util.createUrlObject(url2,options);for(var key in urlObj1){if(key!=="args"){if(urlObj1[key]!=urlObj2[key]){return false;}}} +for(var key in urlObj1.args){if(urlObj1.args[key]!=urlObj2.args[key]){return false;} +delete urlObj2.args[key];} +for(var key in urlObj2.args){return false;} +return true;};OpenLayers.Util.createUrlObject=function(url,options){options=options||{};if(!(/^\w+:\/\//).test(url)){var loc=window.location;var port=loc.port?":"+loc.port:"";var fullUrl=loc.protocol+"//"+loc.host.split(":").shift()+port;if(url.indexOf("/")===0){url=fullUrl+url;}else{var parts=loc.pathname.split("/");parts.pop();url=fullUrl+parts.join("/")+"/"+url;}} +if(options.ignoreCase){url=url.toLowerCase();} +var a=document.createElement('a');a.href=url;var urlObject={};urlObject.host=a.host.split(":").shift();urlObject.protocol=a.protocol;if(options.ignorePort80){urlObject.port=(a.port=="80"||a.port=="0")?"":a.port;}else{urlObject.port=(a.port==""||a.port=="0")?"80":a.port;} +urlObject.hash=(options.ignoreHash||a.hash==="#")?"":a.hash;var queryString=a.search;if(!queryString){var qMark=url.indexOf("?");queryString=(qMark!=-1)?url.substr(qMark):"";} +urlObject.args=OpenLayers.Util.getParameters(queryString);urlObject.pathname=(a.pathname.charAt(0)=="/")?a.pathname:"/"+a.pathname;return urlObject;};OpenLayers.Util.removeTail=function(url){var head=null;var qMark=url.indexOf("?");var hashMark=url.indexOf("#");if(qMark==-1){head=(hashMark!=-1)?url.substr(0,hashMark):url;}else{head=(hashMark!=-1)?url.substr(0,Math.min(qMark,hashMark)):url.substr(0,qMark);} +return head;};OpenLayers.Util.getBrowserName=function(){var browserName="";var ua=navigator.userAgent.toLowerCase();if(ua.indexOf("opera")!=-1){browserName="opera";}else if(ua.indexOf("msie")!=-1){browserName="msie";}else if(ua.indexOf("safari")!=-1){browserName="safari";}else if(ua.indexOf("mozilla")!=-1){if(ua.indexOf("firefox")!=-1){browserName="firefox";}else{browserName="mozilla";}} +return browserName;};OpenLayers.Util.getRenderedDimensions=function(contentHTML,size,options){var w,h;var container=document.createElement("div");container.style.visibility="hidden";var containerElement=(options&&options.containerElement)?options.containerElement:document.body;if(size){if(size.w){w=size.w;container.style.width=w+"px";}else if(size.h){h=size.h;container.style.height=h+"px";}} +if(options&&options.displayClass){container.className=options.displayClass;} +var content=document.createElement("div");content.innerHTML=contentHTML;content.style.overflow="visible";if(content.childNodes){for(var i=0,l=content.childNodes.length;i=0){if(coordinateminutes<10){coordinateminutes="0"+coordinateminutes;} +str+=coordinateminutes+"'";if(dmsOption.indexOf('dms')>=0){if(coordinateseconds<10){coordinateseconds="0"+coordinateseconds;} +str+=coordinateseconds+'"';}} +if(axis=="lon"){str+=coordinate<0?OpenLayers.i18n("W"):OpenLayers.i18n("E");}else{str+=coordinate<0?OpenLayers.i18n("S"):OpenLayers.i18n("N");} +return str;};OpenLayers.Rico=new Object();OpenLayers.Rico.Corner={round:function(e,options){e=OpenLayers.Util.getElement(e);this._setOptions(options);var color=this.options.color;if(this.options.color=="fromElement"){color=this._background(e);} +var bgColor=this.options.bgColor;if(this.options.bgColor=="fromParent"){bgColor=this._background(e.offsetParent);} +this._roundCornersImpl(e,color,bgColor);},changeColor:function(theDiv,newColor){theDiv.style.backgroundColor=newColor;var spanElements=theDiv.parentNode.getElementsByTagName("span");for(var currIdx=0;currIdx"+el.innerHTML+"
                      ";},_roundTopCorners:function(el,color,bgColor){var corner=this._createCorner(bgColor);for(var i=0;i=0;i--){corner.appendChild(this._createCornerSlice(color,bgColor,i,"bottom"));} +el.style.paddingBottom=0;el.appendChild(corner);},_createCorner:function(bgColor){var corner=document.createElement("div");corner.style.backgroundColor=(this._isTransparent()?"transparent":bgColor);return corner;},_createCornerSlice:function(color,bgColor,n,position){var slice=document.createElement("span");var inStyle=slice.style;inStyle.backgroundColor=color;inStyle.display="block";inStyle.height="1px";inStyle.overflow="hidden";inStyle.fontSize="1px";var borderColor=this._borderColor(color,bgColor);if(this.options.border&&n==0){inStyle.borderTopStyle="solid";inStyle.borderTopWidth="1px";inStyle.borderLeftWidth="0px";inStyle.borderRightWidth="0px";inStyle.borderBottomWidth="0px";inStyle.height="0px";inStyle.borderColor=borderColor;} +else if(borderColor){inStyle.borderColor=borderColor;inStyle.borderStyle="solid";inStyle.borderWidth="0px 1px";} +if(!this.options.compact&&(n==(this.options.numSlices-1))){inStyle.height="2px";} +this._setMargin(slice,n,position);this._setBorder(slice,n,position);return slice;},_setOptions:function(options){this.options={corners:"all",color:"fromElement",bgColor:"fromParent",blend:true,border:false,compact:false};OpenLayers.Util.extend(this.options,options||{});this.options.numSlices=this.options.compact?2:4;if(this._isTransparent()){this.options.blend=false;}},_whichSideTop:function(){if(this._hasString(this.options.corners,"all","top")){return"";} +if(this.options.corners.indexOf("tl")>=0&&this.options.corners.indexOf("tr")>=0){return"";} +if(this.options.corners.indexOf("tl")>=0){return"left";}else if(this.options.corners.indexOf("tr")>=0){return"right";} +return"";},_whichSideBottom:function(){if(this._hasString(this.options.corners,"all","bottom")){return"";} +if(this.options.corners.indexOf("bl")>=0&&this.options.corners.indexOf("br")>=0){return"";} +if(this.options.corners.indexOf("bl")>=0){return"left";}else if(this.options.corners.indexOf("br")>=0){return"right";} +return"";},_borderColor:function(color,bgColor){if(color=="transparent"){return bgColor;}else if(this.options.border){return this.options.border;}else if(this.options.blend){return this._blend(bgColor,color);}else{return"";}},_setMargin:function(el,n,corners){var marginSize=this._marginSize(n);var whichSide=corners=="top"?this._whichSideTop():this._whichSideBottom();if(whichSide=="left"){el.style.marginLeft=marginSize+"px";el.style.marginRight="0px";} +else if(whichSide=="right"){el.style.marginRight=marginSize+"px";el.style.marginLeft="0px";} +else{el.style.marginLeft=marginSize+"px";el.style.marginRight=marginSize+"px";}},_setBorder:function(el,n,corners){var borderSize=this._borderSize(n);var whichSide=corners=="top"?this._whichSideTop():this._whichSideBottom();if(whichSide=="left"){el.style.borderLeftWidth=borderSize+"px";el.style.borderRightWidth="0px";} +else if(whichSide=="right"){el.style.borderRightWidth=borderSize+"px";el.style.borderLeftWidth="0px";} +else{el.style.borderLeftWidth=borderSize+"px";el.style.borderRightWidth=borderSize+"px";} +if(this.options.border!=false){el.style.borderLeftWidth=borderSize+"px";el.style.borderRightWidth=borderSize+"px";}},_marginSize:function(n){if(this._isTransparent()){return 0;} +var marginSizes=[5,3,2,1];var blendedMarginSizes=[3,2,1,0];var compactMarginSizes=[2,1];var smBlendedMarginSizes=[1,0];if(this.options.compact&&this.options.blend){return smBlendedMarginSizes[n];}else if(this.options.compact){return compactMarginSizes[n];}else if(this.options.blend){return blendedMarginSizes[n];}else{return marginSizes[n];}},_borderSize:function(n){var transparentBorderSizes=[5,3,2,1];var blendedBorderSizes=[2,1,1,1];var compactBorderSizes=[1,0];var actualBorderSizes=[0,2,0,0];if(this.options.compact&&(this.options.blend||this._isTransparent())){return 1;}else if(this.options.compact){return compactBorderSizes[n];}else if(this.options.blend){return blendedBorderSizes[n];}else if(this.options.border){return actualBorderSizes[n];}else if(this._isTransparent()){return transparentBorderSizes[n];} +return 0;},_hasString:function(str){for(var i=1;i=0){return true;}return false;},_blend:function(c1,c2){var cc1=OpenLayers.Rico.Color.createFromHex(c1);cc1.blend(OpenLayers.Rico.Color.createFromHex(c2));return cc1;},_background:function(el){try{return OpenLayers.Rico.Color.createColorFromBackground(el).asHex();}catch(err){return"#ffffff";}},_isTransparent:function(){return this.options.color=="transparent";},_isTopRounded:function(){return this._hasString(this.options.corners,"all","top","tl","tr");},_isBottomRounded:function(){return this._hasString(this.options.corners,"all","bottom","bl","br");},_hasSingleTextChild:function(el){return el.childNodes.length==1&&el.childNodes[0].nodeType==3;}};(function(){if(window.google&&google.gears){return;} +var factory=null;if(typeof GearsFactory!='undefined'){factory=new GearsFactory();}else{try{factory=new ActiveXObject('Gears.Factory');if(factory.getBuildInfo().indexOf('ie_mobile')!=-1){factory.privateSetGlobalObject(this);}}catch(e){if((typeof navigator.mimeTypes!='undefined')&&navigator.mimeTypes["application/x-googlegears"]){factory=document.createElement("object");factory.style.display="none";factory.width=0;factory.height=0;factory.type="application/x-googlegears";document.documentElement.appendChild(factory);}}} +if(!factory){return;} +if(!window.google){google={};} +if(!google.gears){google.gears={factory:factory};}})();OpenLayers.Element={visible:function(element){return OpenLayers.Util.getElement(element).style.display!='none';},toggle:function(){for(var i=0,len=arguments.length;i"+ +this.contentDiv.innerHTML+"
                      ";var containerElement=(this.map)?this.map.layerContainerDiv:document.body;var realSize=OpenLayers.Util.getRenderedDimensions(preparedHTML,null,{displayClass:this.displayClass,containerElement:containerElement});var safeSize=this.getSafeContentSize(realSize);var newSize=null;if(safeSize.equals(realSize)){newSize=realSize;}else{var fixedSize=new OpenLayers.Size();fixedSize.w=(safeSize.w(mapSize.w-this.map.paddingForPopups.right)){newTL.x=mapSize.w-this.map.paddingForPopups.right-this.size.w;} +if(origTL.y(mapSize.h-this.map.paddingForPopups.bottom)){newTL.y=mapSize.h-this.map.paddingForPopups.bottom-this.size.h;} +var dx=origTL.x-newTL.x;var dy=origTL.y-newTL.y;this.map.pan(dx,dy);},registerEvents:function(){this.events=new OpenLayers.Events(this,this.div,null,true);this.events.on({"mousedown":this.onmousedown,"mousemove":this.onmousemove,"mouseup":this.onmouseup,"click":this.onclick,"mouseout":this.onmouseout,"dblclick":this.ondblclick,scope:this});},onmousedown:function(evt){this.mousedown=true;OpenLayers.Event.stop(evt,true);},onmousemove:function(evt){if(this.mousedown){OpenLayers.Event.stop(evt,true);}},onmouseup:function(evt){if(this.mousedown){this.mousedown=false;OpenLayers.Event.stop(evt,true);}},onclick:function(evt){OpenLayers.Event.stop(evt,true);},onmouseout:function(evt){this.mousedown=false;},ondblclick:function(evt){OpenLayers.Event.stop(evt,true);},CLASS_NAME:"OpenLayers.Popup"});OpenLayers.Popup.WIDTH=200;OpenLayers.Popup.HEIGHT=200;OpenLayers.Popup.COLOR="white";OpenLayers.Popup.OPACITY=1;OpenLayers.Popup.BORDER="0px";OpenLayers.Protocol=OpenLayers.Class({format:null,options:null,autoDestroy:true,defaultFilter:null,initialize:function(options){options=options||{};OpenLayers.Util.extend(this,options);this.options=options;},mergeWithDefaultFilter:function(filter){var merged;if(filter&&this.defaultFilter){merged=new OpenLayers.Filter.Logical({type:OpenLayers.Filter.Logical.AND,filters:[this.defaultFilter,filter]});}else{merged=filter||this.defaultFilter||undefined;} +return merged;},destroy:function(){this.options=null;this.format=null;},read:function(options){options=options||{};options.filter=this.mergeWithDefaultFilter(options.filter);},create:function(){},update:function(){},"delete":function(){},commit:function(){},abort:function(response){},createCallback:function(method,response,options){return OpenLayers.Function.bind(function(){method.apply(this,[response,options]);},this);},CLASS_NAME:"OpenLayers.Protocol"});OpenLayers.Protocol.Response=OpenLayers.Class({code:null,requestType:null,last:true,features:null,reqFeatures:null,priv:null,initialize:function(options){OpenLayers.Util.extend(this,options);},success:function(){return this.code>0;},CLASS_NAME:"OpenLayers.Protocol.Response"});OpenLayers.Protocol.Response.SUCCESS=1;OpenLayers.Protocol.Response.FAILURE=0;OpenLayers.Renderer=OpenLayers.Class({container:null,root:null,extent:null,locked:false,size:null,resolution:null,map:null,initialize:function(containerID,options){this.container=OpenLayers.Util.getElement(containerID);},destroy:function(){this.container=null;this.extent=null;this.size=null;this.resolution=null;this.map=null;},supported:function(){return false;},setExtent:function(extent,resolutionChanged){this.extent=extent.clone();if(resolutionChanged){this.resolution=null;}},setSize:function(size){this.size=size.clone();this.resolution=null;},getResolution:function(){this.resolution=this.resolution||this.map.getResolution();return this.resolution;},drawFeature:function(feature,style){if(style==null){style=feature.style;} +if(feature.geometry){var bounds=feature.geometry.getBounds();if(bounds){if(!bounds.intersectsBounds(this.extent)){style={display:"none"};} +var rendered=this.drawGeometry(feature.geometry,style,feature.id);if(style.display!="none"&&style.label&&rendered!==false){var location=feature.geometry.getCentroid();if(style.labelXOffset||style.labelYOffset){xOffset=isNaN(style.labelXOffset)?0:style.labelXOffset;yOffset=isNaN(style.labelYOffset)?0:style.labelYOffset;var res=this.getResolution();location.move(xOffset*res,yOffset*res);} +this.drawText(feature.id,style,location);}else{this.removeText(feature.id);} +return rendered;}}},drawGeometry:function(geometry,style,featureId){},drawText:function(featureId,style,location){},removeText:function(featureId){},clear:function(){},getFeatureIdFromEvent:function(evt){},eraseFeatures:function(features){if(!(features instanceof Array)){features=[features];} +for(var i=0,len=features.length;i0.5;},isDark:function(){return!this.isBright();},asRGB:function(){return"rgb("+this.rgb.r+","+this.rgb.g+","+this.rgb.b+")";},asHex:function(){return"#"+this.rgb.r.toColorPart()+this.rgb.g.toColorPart()+this.rgb.b.toColorPart();},asHSB:function(){return OpenLayers.Rico.Color.RGBtoHSB(this.rgb.r,this.rgb.g,this.rgb.b);},toString:function(){return this.asHex();}});OpenLayers.Rico.Color.createFromHex=function(hexCode){if(hexCode.length==4){var shortHexCode=hexCode;var hexCode='#';for(var i=1;i<4;i++){hexCode+=(shortHexCode.charAt(i)+ +shortHexCode.charAt(i));}} +if(hexCode.indexOf('#')==0){hexCode=hexCode.substring(1);} +var red=hexCode.substring(0,2);var green=hexCode.substring(2,4);var blue=hexCode.substring(4,6);return new OpenLayers.Rico.Color(parseInt(red,16),parseInt(green,16),parseInt(blue,16));};OpenLayers.Rico.Color.createColorFromBackground=function(elem){var actualColor=RicoUtil.getElementsComputedStyle(OpenLayers.Util.getElement(elem),"backgroundColor","background-color");if(actualColor=="transparent"&&elem.parentNode){return OpenLayers.Rico.Color.createColorFromBackground(elem.parentNode);} +if(actualColor==null){return new OpenLayers.Rico.Color(255,255,255);} +if(actualColor.indexOf("rgb(")==0){var colors=actualColor.substring(4,actualColor.length-1);var colorArray=colors.split(",");return new OpenLayers.Rico.Color(parseInt(colorArray[0]),parseInt(colorArray[1]),parseInt(colorArray[2]));} +else if(actualColor.indexOf("#")==0){return OpenLayers.Rico.Color.createFromHex(actualColor);} +else{return new OpenLayers.Rico.Color(255,255,255);}};OpenLayers.Rico.Color.HSBtoRGB=function(hue,saturation,brightness){var red=0;var green=0;var blue=0;if(saturation==0){red=parseInt(brightness*255.0+0.5);green=red;blue=red;} +else{var h=(hue-Math.floor(hue))*6.0;var f=h-Math.floor(h);var p=brightness*(1.0-saturation);var q=brightness*(1.0-saturation*f);var t=brightness*(1.0-(saturation*(1.0-f)));switch(parseInt(h)){case 0:red=(brightness*255.0+0.5);green=(t*255.0+0.5);blue=(p*255.0+0.5);break;case 1:red=(q*255.0+0.5);green=(brightness*255.0+0.5);blue=(p*255.0+0.5);break;case 2:red=(p*255.0+0.5);green=(brightness*255.0+0.5);blue=(t*255.0+0.5);break;case 3:red=(p*255.0+0.5);green=(q*255.0+0.5);blue=(brightness*255.0+0.5);break;case 4:red=(t*255.0+0.5);green=(p*255.0+0.5);blue=(brightness*255.0+0.5);break;case 5:red=(brightness*255.0+0.5);green=(p*255.0+0.5);blue=(q*255.0+0.5);break;}} +return{r:parseInt(red),g:parseInt(green),b:parseInt(blue)};};OpenLayers.Rico.Color.RGBtoHSB=function(r,g,b){var hue;var saturation;var brightness;var cmax=(r>g)?r:g;if(b>cmax){cmax=b;} +var cmin=(rthis.right)){this.right=bounds.right;} +if((this.top==null)||(bounds.top>this.top)){this.top=bounds.top;}}}},containsLonLat:function(ll,inclusive){return this.contains(ll.lon,ll.lat,inclusive);},containsPixel:function(px,inclusive){return this.contains(px.x,px.y,inclusive);},contains:function(x,y,inclusive){if(inclusive==null){inclusive=true;} +if(x==null||y==null){return false;} +x=OpenLayers.Util.toFloat(x);y=OpenLayers.Util.toFloat(y);var contains=false;if(inclusive){contains=((x>=this.left)&&(x<=this.right)&&(y>=this.bottom)&&(y<=this.top));}else{contains=((x>this.left)&&(xthis.bottom)&&(y=this.bottom)&&(bounds.bottom<=this.top))||((this.bottom>=bounds.bottom)&&(this.bottom<=bounds.top)));var inTop=(((bounds.top>=this.bottom)&&(bounds.top<=this.top))||((this.top>bounds.bottom)&&(this.top=this.left)&&(bounds.left<=this.right))||((this.left>=bounds.left)&&(this.left<=bounds.right)));var inRight=(((bounds.right>=this.left)&&(bounds.right<=this.right))||((this.right>=bounds.left)&&(this.right<=bounds.right)));intersects=((inBottom||inTop)&&(inLeft||inRight));} +return intersects;},containsBounds:function(bounds,partial,inclusive){if(partial==null){partial=false;} +if(inclusive==null){inclusive=true;} +var bottomLeft=this.contains(bounds.left,bounds.bottom,inclusive);var bottomRight=this.contains(bounds.right,bounds.bottom,inclusive);var topLeft=this.contains(bounds.left,bounds.top,inclusive);var topRight=this.contains(bounds.right,bounds.top,inclusive);return(partial)?(bottomLeft||bottomRight||topLeft||topRight):(bottomLeft&&bottomRight&&topLeft&&topRight);},determineQuadrant:function(lonlat){var quadrant="";var center=this.getCenterLonLat();quadrant+=(lonlat.lat=maxExtent.right&&newBounds.right>maxExtent.right){newBounds=newBounds.add(-maxExtent.getWidth(),0);}} +return newBounds;},CLASS_NAME:"OpenLayers.Bounds"});OpenLayers.Bounds.fromString=function(str){var bounds=str.split(",");return OpenLayers.Bounds.fromArray(bounds);};OpenLayers.Bounds.fromArray=function(bbox){return new OpenLayers.Bounds(parseFloat(bbox[0]),parseFloat(bbox[1]),parseFloat(bbox[2]),parseFloat(bbox[3]));};OpenLayers.Bounds.fromSize=function(size){return new OpenLayers.Bounds(0,size.h,size.w,0);};OpenLayers.Bounds.oppositeQuadrant=function(quadrant){var opp="";opp+=(quadrant.charAt(0)=='t')?'b':'t';opp+=(quadrant.charAt(1)=='l')?'r':'l';return opp;};OpenLayers.LonLat=OpenLayers.Class({lon:0.0,lat:0.0,initialize:function(lon,lat){this.lon=OpenLayers.Util.toFloat(lon);this.lat=OpenLayers.Util.toFloat(lat);},toString:function(){return("lon="+this.lon+",lat="+this.lat);},toShortString:function(){return(this.lon+", "+this.lat);},clone:function(){return new OpenLayers.LonLat(this.lon,this.lat);},add:function(lon,lat){if((lon==null)||(lat==null)){var msg=OpenLayers.i18n("lonlatAddError");OpenLayers.Console.error(msg);return null;} +return new OpenLayers.LonLat(this.lon+OpenLayers.Util.toFloat(lon),this.lat+OpenLayers.Util.toFloat(lat));},equals:function(ll){var equals=false;if(ll!=null){equals=((this.lon==ll.lon&&this.lat==ll.lat)||(isNaN(this.lon)&&isNaN(this.lat)&&isNaN(ll.lon)&&isNaN(ll.lat)));} +return equals;},transform:function(source,dest){var point=OpenLayers.Projection.transform({'x':this.lon,'y':this.lat},source,dest);this.lon=point.x;this.lat=point.y;return this;},wrapDateLine:function(maxExtent){var newLonLat=this.clone();if(maxExtent){while(newLonLat.lonmaxExtent.right){newLonLat.lon-=maxExtent.getWidth();}} +return newLonLat;},CLASS_NAME:"OpenLayers.LonLat"});OpenLayers.LonLat.fromString=function(str){var pair=str.split(",");return new OpenLayers.LonLat(pair[0],pair[1]);};OpenLayers.Pixel=OpenLayers.Class({x:0.0,y:0.0,initialize:function(x,y){this.x=parseFloat(x);this.y=parseFloat(y);},toString:function(){return("x="+this.x+",y="+this.y);},clone:function(){return new OpenLayers.Pixel(this.x,this.y);},equals:function(px){var equals=false;if(px!=null){equals=((this.x==px.x&&this.y==px.y)||(isNaN(this.x)&&isNaN(this.y)&&isNaN(px.x)&&isNaN(px.y)));} +return equals;},add:function(x,y){if((x==null)||(y==null)){var msg=OpenLayers.i18n("pixelAddError");OpenLayers.Console.error(msg);return null;} +return new OpenLayers.Pixel(this.x+x,this.y+y);},offset:function(px){var newPx=this.clone();if(px){newPx=this.add(px.x,px.y);} +return newPx;},CLASS_NAME:"OpenLayers.Pixel"});OpenLayers.Control=OpenLayers.Class({id:null,map:null,div:null,type:null,allowSelection:false,displayClass:"",title:"",autoActivate:false,active:null,handler:null,eventListeners:null,events:null,EVENT_TYPES:["activate","deactivate"],initialize:function(options){this.displayClass=this.CLASS_NAME.replace("OpenLayers.","ol").replace(/\./g,"");OpenLayers.Util.extend(this,options);this.events=new OpenLayers.Events(this,null,this.EVENT_TYPES);if(this.eventListeners instanceof Object){this.events.on(this.eventListeners);} +if(this.id==null){this.id=OpenLayers.Util.createUniqueID(this.CLASS_NAME+"_");}},destroy:function(){if(this.events){if(this.eventListeners){this.events.un(this.eventListeners);} +this.events.destroy();this.events=null;} +this.eventListeners=null;if(this.handler){this.handler.destroy();this.handler=null;} +if(this.handlers){for(var key in this.handlers){if(this.handlers.hasOwnProperty(key)&&typeof this.handlers[key].destroy=="function"){this.handlers[key].destroy();}} +this.handlers=null;} +if(this.map){this.map.removeControl(this);this.map=null;}},setMap:function(map){this.map=map;if(this.handler){this.handler.setMap(map);}},draw:function(px){if(this.div==null){this.div=OpenLayers.Util.createDiv(this.id);this.div.className=this.displayClass;if(!this.allowSelection){this.div.className+=" olControlNoSelect";this.div.setAttribute("unselectable","on",0);this.div.onselectstart=OpenLayers.Function.False;} +if(this.title!=""){this.div.title=this.title;}} +if(px!=null){this.position=px.clone();} +this.moveTo(this.position);return this.div;},moveTo:function(px){if((px!=null)&&(this.div!=null)){this.div.style.left=px.x+"px";this.div.style.top=px.y+"px";}},activate:function(){if(this.active){return false;} +if(this.handler){this.handler.activate();} +this.active=true;if(this.map){OpenLayers.Element.addClass(this.map.viewPortDiv,this.displayClass.replace(/ /g,"")+"Active");} +this.events.triggerEvent("activate");return true;},deactivate:function(){if(this.active){if(this.handler){this.handler.deactivate();} +this.active=false;if(this.map){OpenLayers.Element.removeClass(this.map.viewPortDiv,this.displayClass.replace(/ /g,"")+"Active");} +this.events.triggerEvent("deactivate");return true;} +return false;},CLASS_NAME:"OpenLayers.Control"});OpenLayers.Control.TYPE_BUTTON=1;OpenLayers.Control.TYPE_TOGGLE=2;OpenLayers.Control.TYPE_TOOL=3;OpenLayers.Lang={code:null,defaultCode:"en",getCode:function(){if(!OpenLayers.Lang.code){OpenLayers.Lang.setCode();} +return OpenLayers.Lang.code;},setCode:function(code){var lang;if(!code){code=(OpenLayers.Util.getBrowserName()=="msie")?navigator.userLanguage:navigator.language;} +var parts=code.split('-');parts[0]=parts[0].toLowerCase();if(typeof OpenLayers.Lang[parts[0]]=="object"){lang=parts[0];} +if(parts[1]){var testLang=parts[0]+'-'+parts[1].toUpperCase();if(typeof OpenLayers.Lang[testLang]=="object"){lang=testLang;}} +if(!lang){OpenLayers.Console.warn('Failed to find OpenLayers.Lang.'+parts.join("-")+' dictionary, falling back to default language');lang=OpenLayers.Lang.defaultCode;} +OpenLayers.Lang.code=lang;},translate:function(key,context){var dictionary=OpenLayers.Lang[OpenLayers.Lang.getCode()];var message=dictionary[key];if(!message){message=key;} +if(context){message=OpenLayers.String.format(message,context);} +return message;}};OpenLayers.i18n=OpenLayers.Lang.translate;OpenLayers.Popup.Anchored=OpenLayers.Class(OpenLayers.Popup,{relativePosition:null,keepInMap:true,anchor:null,initialize:function(id,lonlat,contentSize,contentHTML,anchor,closeBox,closeBoxCallback){var newArguments=[id,lonlat,contentSize,contentHTML,closeBox,closeBoxCallback];OpenLayers.Popup.prototype.initialize.apply(this,newArguments);this.anchor=(anchor!=null)?anchor:{size:new OpenLayers.Size(0,0),offset:new OpenLayers.Pixel(0,0)};},destroy:function(){this.anchor=null;this.relativePosition=null;OpenLayers.Popup.prototype.destroy.apply(this,arguments);},show:function(){this.updatePosition();OpenLayers.Popup.prototype.show.apply(this,arguments);},moveTo:function(px){var oldRelativePosition=this.relativePosition;this.relativePosition=this.calculateRelativePosition(px);var newPx=this.calculateNewPx(px);var newArguments=new Array(newPx);OpenLayers.Popup.prototype.moveTo.apply(this,newArguments);if(this.relativePosition!=oldRelativePosition){this.updateRelativePosition();}},setSize:function(contentSize){OpenLayers.Popup.prototype.setSize.apply(this,arguments);if((this.lonlat)&&(this.map)){var px=this.map.getLayerPxFromLonLat(this.lonlat);this.moveTo(px);}},calculateRelativePosition:function(px){var lonlat=this.map.getLonLatFromLayerPx(px);var extent=this.map.getExtent();var quadrant=extent.determineQuadrant(lonlat);return OpenLayers.Bounds.oppositeQuadrant(quadrant);},updateRelativePosition:function(){},calculateNewPx:function(px){var newPx=px.offset(this.anchor.offset);var size=this.size||this.contentSize;var top=(this.relativePosition.charAt(0)=='t');newPx.y+=(top)?-(size.h+this.anchor.size.h):this.anchor.size.h;var left=(this.relativePosition.charAt(1)=='l');newPx.x+=(left)?-(size.w+this.anchor.size.w):this.anchor.size.w;return newPx;},CLASS_NAME:"OpenLayers.Popup.Anchored"});OpenLayers.Protocol.SOS=function(options){options=OpenLayers.Util.applyDefaults(options,OpenLayers.Protocol.SOS.DEFAULTS);var cls=OpenLayers.Protocol.SOS["v"+options.version.replace(/\./g,"_")];if(!cls){throw"Unsupported SOS version: "+options.version;} +return new cls(options);};OpenLayers.Protocol.SOS.DEFAULTS={"version":"1.0.0"};OpenLayers.Protocol.SQL=OpenLayers.Class(OpenLayers.Protocol,{databaseName:'ol',tableName:"ol_vector_features",postReadFiltering:true,initialize:function(options){OpenLayers.Protocol.prototype.initialize.apply(this,[options]);},destroy:function(){OpenLayers.Protocol.prototype.destroy.apply(this);},supported:function(){return false;},evaluateFilter:function(feature,filter){return filter&&this.postReadFiltering?filter.evaluate(feature):true;},CLASS_NAME:"OpenLayers.Protocol.SQL"});OpenLayers.Protocol.WFS=function(options){options=OpenLayers.Util.applyDefaults(options,OpenLayers.Protocol.WFS.DEFAULTS);var cls=OpenLayers.Protocol.WFS["v"+options.version.replace(/\./g,"_")];if(!cls){throw"Unsupported WFS version: "+options.version;} +return new cls(options);};OpenLayers.Protocol.WFS.fromWMSLayer=function(layer,options){var typeName,featurePrefix;var param=layer.params["LAYERS"];var parts=(param instanceof Array?param[0]:param).split(":");if(parts.length>1){featurePrefix=parts[0];} +typeName=parts.pop();var protocolOptions={url:layer.url,featureType:typeName,featurePrefix:featurePrefix,srsName:layer.projection&&layer.projection.getCode()||layer.map&&layer.map.getProjectionObject().getCode(),version:"1.1.0"};return new OpenLayers.Protocol.WFS(OpenLayers.Util.applyDefaults(options,protocolOptions));};OpenLayers.Protocol.WFS.DEFAULTS={"version":"1.0.0"};OpenLayers.Renderer.Canvas=OpenLayers.Class(OpenLayers.Renderer,{canvas:null,features:null,initialize:function(containerID){OpenLayers.Renderer.prototype.initialize.apply(this,arguments);this.root=document.createElement("canvas");this.container.appendChild(this.root);this.canvas=this.root.getContext("2d");this.features={};},eraseGeometry:function(geometry,featureId){this.eraseFeatures(this.features[featureId][0]);},supported:function(){var canvas=document.createElement("canvas");return!!canvas.getContext;},setExtent:function(extent){this.extent=extent.clone();this.resolution=null;this.redraw();},setSize:function(size){this.size=size.clone();this.root.style.width=size.w+"px";this.root.style.height=size.h+"px";this.root.width=size.w;this.root.height=size.h;this.resolution=null;},drawFeature:function(feature,style){style=style||feature.style;style=this.applyDefaultSymbolizer(style);this.features[feature.id]=[feature,style];this.redraw();},drawGeometry:function(geometry,style){var className=geometry.CLASS_NAME;if((className=="OpenLayers.Geometry.Collection")||(className=="OpenLayers.Geometry.MultiPoint")||(className=="OpenLayers.Geometry.MultiLineString")||(className=="OpenLayers.Geometry.MultiPolygon")){for(var i=0;i1){middle=parseInt((leftIndex+rightIndex)/2);var placement=this.compare(this,newNode,OpenLayers.Util.getElement(this.order[middle]));if(placement>0){leftIndex=middle;}else{rightIndex=middle;}} +this.order.splice(rightIndex,0,nodeId);this.indices[nodeId]=this.getZIndex(newNode);return this.getNextElement(rightIndex);},remove:function(node){var nodeId=node.id;var arrayIndex=OpenLayers.Util.indexOf(this.order,nodeId);if(arrayIndex>=0){this.order.splice(arrayIndex,1);delete this.indices[nodeId];if(this.order.length>0){var lastId=this.order[this.order.length-1];this.maxZIndex=this.indices[lastId];}else{this.maxZIndex=0;}}},clear:function(){this.order=[];this.indices={};this.maxZIndex=0;},exists:function(node){return(this.indices[node.id]!=null);},getZIndex:function(node){return node._style.graphicZIndex;},determineZIndex:function(node){var zIndex=node._style.graphicZIndex;if(zIndex==null){zIndex=this.maxZIndex;node._style.graphicZIndex=zIndex;}else if(zIndex>this.maxZIndex){this.maxZIndex=zIndex;}},getNextElement:function(index){var nextIndex=index+1;if(nextIndex=0;--j){cluster=clusters[j];if(this.shouldCluster(cluster,feature)){this.addToCluster(cluster,feature);clustered=true;break;}} +if(!clustered){clusters.push(this.createCluster(this.features[i]));}}} +this.layer.removeAllFeatures();if(clusters.length>0){if(this.threshold>1){var clone=clusters.slice();clusters=[];var candidate;for(var i=0,len=clone.length;i0&&this.clusters.length==this.layer.features.length){exist=true;for(var i=0;i0){var remote=this.layer.projection;var local=this.layer.map.getProjectionObject();if(!local.equals(remote)){var geom;for(var i=0,len=features.length;i0){this.length=newLength;} +return this.length;},pageNext:function(event){var changed=false;if(this.features){if(this.num===null){this.num=-1;} +var start=(this.num+1)*this.length;changed=this.page(start,event);} +return changed;},pagePrevious:function(){var changed=false;if(this.features){if(this.num===null){this.num=this.pageCount();} +var start=(this.num-1)*this.length;changed=this.page(start);} +return changed;},page:function(start,event){var changed=false;if(this.features){if(start>=0&&start0){this.timer=window.setInterval(OpenLayers.Function.bind(this.refresh,this),this.interval);}},refresh:function(){if(this.layer&&this.layer.refresh&&typeof this.layer.refresh=="function"){this.layer.refresh({force:this.force});}},stop:function(){if(this.timer!==null){window.clearInterval(this.timer);this.timer=null;}},CLASS_NAME:"OpenLayers.Strategy.Refresh"});OpenLayers.Strategy.Save=OpenLayers.Class(OpenLayers.Strategy,{EVENT_TYPES:["start","success","fail"],events:null,auto:false,timer:null,initialize:function(options){OpenLayers.Strategy.prototype.initialize.apply(this,[options]);this.events=new OpenLayers.Events(this,null,this.EVENT_TYPES);},activate:function(){var activated=OpenLayers.Strategy.prototype.activate.call(this);if(activated){if(this.auto){if(typeof this.auto==="number"){this.timer=window.setInterval(OpenLayers.Function.bind(this.save,this),this.auto*1000);}else{this.layer.events.on({"featureadded":this.triggerSave,"afterfeaturemodified":this.triggerSave,scope:this});}}} +return activated;},deactivate:function(){var deactivated=OpenLayers.Strategy.prototype.deactivate.call(this);if(deactivated){if(this.auto){if(typeof this.auto==="number"){window.clearInterval(this.timer);}else{this.layer.events.un({"featureadded":this.triggerSave,"afterfeaturemodified":this.triggerSave,scope:this});}}} +return deactivated;},triggerSave:function(event){var feature=event.feature;if(feature.state===OpenLayers.State.INSERT||feature.state===OpenLayers.State.UPDATE||feature.state===OpenLayers.State.DELETE){this.save([event.feature]);}},save:function(features){if(!features){features=this.layer.features;} +this.events.triggerEvent("start",{features:features});var remote=this.layer.projection;var local=this.layer.map.getProjectionObject();if(!local.equals(remote)){var len=features.length;var clones=new Array(len);var orig,clone;for(var i=0;i0){this.layer.destroyFeatures(destroys);} +this.events.triggerEvent("success",evt);}else{this.events.triggerEvent("fail",evt);}},CLASS_NAME:"OpenLayers.Strategy.Save"});OpenLayers.Symbolizer.Line=OpenLayers.Class(OpenLayers.Symbolizer,{strokeColor:null,strokeOpacity:null,strokeWidth:null,strokeLinecap:null,strokeDashstyle:null,initialize:function(config){OpenLayers.Symbolizer.prototype.initialize.apply(this,arguments);},CLASS_NAME:"OpenLayers.Symbolizer.Line"});OpenLayers.Symbolizer.Point=OpenLayers.Class(OpenLayers.Symbolizer,{strokeColor:null,strokeOpacity:null,strokeWidth:null,strokeLinecap:null,strokeDashstyle:null,fillColor:null,fillOpacity:null,pointRadius:null,externalGraphic:null,graphicWidth:null,graphicHeight:null,graphicOpacity:null,graphicXOffset:null,graphicYOffset:null,rotation:null,graphicName:null,initialize:function(config){OpenLayers.Symbolizer.prototype.initialize.apply(this,arguments);},CLASS_NAME:"OpenLayers.Symbolizer.Point"});OpenLayers.Symbolizer.Polygon=OpenLayers.Class(OpenLayers.Symbolizer,{strokeColor:null,strokeOpacity:null,strokeWidth:null,strokeLinecap:null,strokeDashstyle:null,fillColor:null,fillOpacity:null,initialize:function(config){OpenLayers.Symbolizer.prototype.initialize.apply(this,arguments);},CLASS_NAME:"OpenLayers.Symbolizer.Polygon"});OpenLayers.Symbolizer.Raster=OpenLayers.Class(OpenLayers.Symbolizer,{initialize:function(config){OpenLayers.Symbolizer.prototype.initialize.apply(this,arguments);},CLASS_NAME:"OpenLayers.Symbolizer.Raster"});OpenLayers.Symbolizer.Text=OpenLayers.Class(OpenLayers.Symbolizer,{label:null,fontFamily:null,fontSize:null,fontWeight:null,fontStyle:null,initialize:function(config){OpenLayers.Symbolizer.prototype.initialize.apply(this,arguments);},CLASS_NAME:"OpenLayers.Symbolizer.Text"});OpenLayers.Tween=OpenLayers.Class({INTERVAL:10,easing:null,begin:null,finish:null,duration:null,callbacks:null,time:null,interval:null,playing:false,initialize:function(easing){this.easing=(easing)?easing:OpenLayers.Easing.Expo.easeOut;},start:function(begin,finish,duration,options){this.playing=true;this.begin=begin;this.finish=finish;this.duration=duration;this.callbacks=options.callbacks;this.time=0;if(this.interval){window.clearInterval(this.interval);this.interval=null;} +if(this.callbacks&&this.callbacks.start){this.callbacks.start.call(this,this.begin);} +this.interval=window.setInterval(OpenLayers.Function.bind(this.play,this),this.INTERVAL);},stop:function(){if(!this.playing){return;} +if(this.callbacks&&this.callbacks.done){this.callbacks.done.call(this,this.finish);} +window.clearInterval(this.interval);this.interval=null;this.playing=false;},play:function(){var value={};for(var i in this.begin){var b=this.begin[i];var f=this.finish[i];if(b==null||f==null||isNaN(b)||isNaN(f)){OpenLayers.Console.error('invalid value for Tween');} +var c=f-b;value[i]=this.easing.apply(this,[this.time,b,c,this.duration]);} +this.time++;if(this.callbacks&&this.callbacks.eachStep){this.callbacks.eachStep.call(this,value);} +if(this.time>this.duration){this.stop();}},CLASS_NAME:"OpenLayers.Tween"});OpenLayers.Easing={CLASS_NAME:"OpenLayers.Easing"};OpenLayers.Easing.Linear={easeIn:function(t,b,c,d){return c*t/d+b;},easeOut:function(t,b,c,d){return c*t/d+b;},easeInOut:function(t,b,c,d){return c*t/d+b;},CLASS_NAME:"OpenLayers.Easing.Linear"};OpenLayers.Easing.Expo={easeIn:function(t,b,c,d){return(t==0)?b:c*Math.pow(2,10*(t/d-1))+b;},easeOut:function(t,b,c,d){return(t==d)?b+c:c*(-Math.pow(2,-10*t/d)+1)+b;},easeInOut:function(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;},CLASS_NAME:"OpenLayers.Easing.Expo"};OpenLayers.Easing.Quad={easeIn:function(t,b,c,d){return c*(t/=d)*t+b;},easeOut:function(t,b,c,d){return-c*(t/=d)*(t-2)+b;},easeInOut:function(t,b,c,d){if((t/=d/2)<1)return c/2*t*t+b;return-c/2*((--t)*(t-2)-1)+b;},CLASS_NAME:"OpenLayers.Easing.Quad"};OpenLayers.Control.ArgParser=OpenLayers.Class(OpenLayers.Control,{center:null,zoom:null,layers:null,displayProjection:null,initialize:function(options){OpenLayers.Control.prototype.initialize.apply(this,arguments);},setMap:function(map){OpenLayers.Control.prototype.setMap.apply(this,arguments);for(var i=0,len=this.map.controls.length;i=mapBounds.bottom&&!labelPoint){labelPoint=gridPoint;}} +if(this.labelled){var labelPos=new OpenLayers.Geometry.Point(labelPoint.x,mapBounds.bottom);var labelAttrs={value:lon,label:this.labelled?OpenLayers.Util.getFormattedLonLat(lon,"lon",this.labelFormat):"",labelAlign:"cb",xOffset:0,yOffset:2};this.gratLayer.addFeatures(new OpenLayers.Feature.Vector(labelPos,labelAttrs));} +var geom=new OpenLayers.Geometry.LineString(pointList);lines.push(new OpenLayers.Feature.Vector(geom));} +for(var j=0;j90){continue;} +var pointList=[];var lonStart=centerLatPoints[0].x;var lonEnd=centerLatPoints[centerLatPoints.length-1].x;var lonDelta=(lonEnd-lonStart)/this.numPoints;var lon=lonStart;var labelPoint=null;for(var i=0;i<=this.numPoints;++i){var gridPoint=new OpenLayers.Geometry.Point(lon,lat);gridPoint.transform(llProj,mapProj);pointList.push(gridPoint);lon+=lonDelta;if(gridPoint.x0){this.map.setCenter(this.map.getLonLatFromPixel(evt.xy),this.map.getZoom()-1);}},zoomBoxEnd:function(evt){if(this.mouseDragStart!=null){if(Math.abs(this.mouseDragStart.x-evt.xy.x)>5||Math.abs(this.mouseDragStart.y-evt.xy.y)>5){var start=this.map.getLonLatFromViewPortPx(this.mouseDragStart);var end=this.map.getLonLatFromViewPortPx(evt.xy);var top=Math.max(start.lat,end.lat);var bottom=Math.min(start.lat,end.lat);var left=Math.min(start.lon,end.lon);var right=Math.max(start.lon,end.lon);var bounds=new OpenLayers.Bounds(left,bottom,right,top);this.map.zoomToExtent(bounds);}else{var end=this.map.getLonLatFromViewPortPx(evt.xy);this.map.setCenter(new OpenLayers.LonLat((end.lon),(end.lat)),this.map.getZoom()+1);} +this.removeZoomBox();}},removeZoomBox:function(){this.map.viewPortDiv.removeChild(this.zoomBox);this.zoomBox=null;},onWheelEvent:function(e){var inMap=false;var elem=OpenLayers.Event.element(e);while(elem!=null){if(this.map&&elem==this.map.div){inMap=true;break;} +elem=elem.parentNode;} +if(inMap){var delta=0;if(!e){e=window.event;} +if(e.wheelDelta){delta=e.wheelDelta/120;if(window.opera&&window.opera.version()<9.2){delta=-delta;}}else if(e.detail){delta=-e.detail/3;} +if(delta){e.xy=this.mousePosition;if(delta<0){this.defaultWheelDown(e);}else{this.defaultWheelUp(e);}} +OpenLayers.Event.stop(e);}},CLASS_NAME:"OpenLayers.Control.MouseDefaults"});OpenLayers.Control.MousePosition=OpenLayers.Class(OpenLayers.Control,{autoActivate:true,element:null,prefix:'',separator:', ',suffix:'',numDigits:5,granularity:10,emptyString:null,lastXy:null,displayProjection:null,initialize:function(options){OpenLayers.Control.prototype.initialize.apply(this,arguments);},destroy:function(){this.deactivate();OpenLayers.Control.prototype.destroy.apply(this,arguments);},activate:function(){if(OpenLayers.Control.prototype.activate.apply(this,arguments)){this.map.events.register('mousemove',this,this.redraw);this.map.events.register('mouseout',this,this.reset);this.redraw();return true;}else{return false;}},deactivate:function(){if(OpenLayers.Control.prototype.deactivate.apply(this,arguments)){this.map.events.unregister('mousemove',this,this.redraw);this.map.events.unregister('mouseout',this,this.reset);this.element.innerHTML="";return true;}else{return false;}},draw:function(){OpenLayers.Control.prototype.draw.apply(this,arguments);if(!this.element){this.div.left="";this.div.top="";this.element=this.div;} +return this.div;},redraw:function(evt){var lonLat;if(evt==null){this.reset();return;}else{if(this.lastXy==null||Math.abs(evt.xy.x-this.lastXy.x)>this.granularity||Math.abs(evt.xy.y-this.lastXy.y)>this.granularity) +{this.lastXy=evt.xy;return;} +lonLat=this.map.getLonLatFromPixel(evt.xy);if(!lonLat){return;} +if(this.displayProjection){lonLat.transform(this.map.getProjectionObject(),this.displayProjection);} +this.lastXy=evt.xy;} +var newHtml=this.formatOutput(lonLat);if(newHtml!=this.element.innerHTML){this.element.innerHTML=newHtml;}},reset:function(evt){if(this.emptyString!=null){this.element.innerHTML=this.emptyString;}},formatOutput:function(lonLat){var digits=parseInt(this.numDigits);var newHtml=this.prefix+ +lonLat.lon.toFixed(digits)+ +this.separator+ +lonLat.lat.toFixed(digits)+ +this.suffix;return newHtml;},CLASS_NAME:"OpenLayers.Control.MousePosition"});OpenLayers.Control.Pan=OpenLayers.Class(OpenLayers.Control,{slideFactor:50,direction:null,type:OpenLayers.Control.TYPE_BUTTON,initialize:function(direction,options){this.direction=direction;this.CLASS_NAME+=this.direction;OpenLayers.Control.prototype.initialize.apply(this,[options]);},trigger:function(){switch(this.direction){case OpenLayers.Control.Pan.NORTH:this.map.pan(0,-this.slideFactor);break;case OpenLayers.Control.Pan.SOUTH:this.map.pan(0,this.slideFactor);break;case OpenLayers.Control.Pan.WEST:this.map.pan(-this.slideFactor,0);break;case OpenLayers.Control.Pan.EAST:this.map.pan(this.slideFactor,0);break;}},CLASS_NAME:"OpenLayers.Control.Pan"});OpenLayers.Control.Pan.NORTH="North";OpenLayers.Control.Pan.SOUTH="South";OpenLayers.Control.Pan.EAST="East";OpenLayers.Control.Pan.WEST="West";OpenLayers.Control.PanZoom=OpenLayers.Class(OpenLayers.Control,{slideFactor:50,slideRatio:null,buttons:null,position:null,initialize:function(options){this.position=new OpenLayers.Pixel(OpenLayers.Control.PanZoom.X,OpenLayers.Control.PanZoom.Y);OpenLayers.Control.prototype.initialize.apply(this,arguments);},destroy:function(){OpenLayers.Control.prototype.destroy.apply(this,arguments);this.removeButtons();this.buttons=null;this.position=null;},draw:function(px){OpenLayers.Control.prototype.draw.apply(this,arguments);px=this.position;this.buttons=[];var sz=new OpenLayers.Size(18,18);var centered=new OpenLayers.Pixel(px.x+sz.w/2,px.y);this._addButton("panup","north-mini.png",centered,sz);px.y=centered.y+sz.h;this._addButton("panleft","west-mini.png",px,sz);this._addButton("panright","east-mini.png",px.add(sz.w,0),sz);this._addButton("pandown","south-mini.png",centered.add(0,sz.h*2),sz);this._addButton("zoomin","zoom-plus-mini.png",centered.add(0,sz.h*3+5),sz);this._addButton("zoomworld","zoom-world-mini.png",centered.add(0,sz.h*4+5),sz);this._addButton("zoomout","zoom-minus-mini.png",centered.add(0,sz.h*5+5),sz);return this.div;},_addButton:function(id,img,xy,sz){var imgLocation=OpenLayers.Util.getImagesLocation()+img;var btn=OpenLayers.Util.createAlphaImageDiv(this.id+"_"+id,xy,sz,imgLocation,"absolute");this.div.appendChild(btn);OpenLayers.Event.observe(btn,"mousedown",OpenLayers.Function.bindAsEventListener(this.buttonDown,btn));OpenLayers.Event.observe(btn,"dblclick",OpenLayers.Function.bindAsEventListener(this.doubleClick,btn));OpenLayers.Event.observe(btn,"click",OpenLayers.Function.bindAsEventListener(this.doubleClick,btn));btn.action=id;btn.map=this.map;if(!this.slideRatio){var slideFactorPixels=this.slideFactor;var getSlideFactor=function(){return slideFactorPixels;};}else{var slideRatio=this.slideRatio;var getSlideFactor=function(dim){return this.map.getSize()[dim]*slideRatio;};} +btn.getSlideFactor=getSlideFactor;this.buttons.push(btn);return btn;},_removeButton:function(btn){OpenLayers.Event.stopObservingElement(btn);btn.map=null;btn.getSlideFactor=null;this.div.removeChild(btn);OpenLayers.Util.removeItem(this.buttons,btn);},removeButtons:function(){for(var i=this.buttons.length-1;i>=0;--i){this._removeButton(this.buttons[i]);}},doubleClick:function(evt){OpenLayers.Event.stop(evt);return false;},buttonDown:function(evt){if(!OpenLayers.Event.isLeftClick(evt)){return;} +switch(this.action){case"panup":this.map.pan(0,-this.getSlideFactor("h"));break;case"pandown":this.map.pan(0,this.getSlideFactor("h"));break;case"panleft":this.map.pan(-this.getSlideFactor("w"),0);break;case"panright":this.map.pan(this.getSlideFactor("w"),0);break;case"zoomin":this.map.zoomIn();break;case"zoomout":this.map.zoomOut();break;case"zoomworld":this.map.zoomToMaxExtent();break;} +OpenLayers.Event.stop(evt);},CLASS_NAME:"OpenLayers.Control.PanZoom"});OpenLayers.Control.PanZoom.X=4;OpenLayers.Control.PanZoom.Y=4;OpenLayers.Control.Panel=OpenLayers.Class(OpenLayers.Control,{controls:null,autoActivate:true,defaultControl:null,saveState:false,activeState:null,initialize:function(options){OpenLayers.Control.prototype.initialize.apply(this,[options]);this.controls=[];this.activeState={};},destroy:function(){OpenLayers.Control.prototype.destroy.apply(this,arguments);for(var i=this.controls.length-1;i>=0;i--){if(this.controls[i].events){this.controls[i].events.un({"activate":this.redraw,"deactivate":this.redraw,scope:this});} +OpenLayers.Event.stopObservingElement(this.controls[i].panel_div);this.controls[i].panel_div=null;} +this.activeState=null;},activate:function(){if(OpenLayers.Control.prototype.activate.apply(this,arguments)){var control;for(var i=0,len=this.controls.length;i0){for(var l=this.div.children.length,i=l-1;i>=0;i--){this.div.removeChild(this.div.children[i]);}} +this.div.innerHTML="";if(this.active){for(var i=0,len=this.controls.length;i=9500&&scale<=950000){scale=Math.round(scale/1000)+"K";}else if(scale>=950000){scale=Math.round(scale/1000000)+"M";}else{scale=Math.round(scale);} +this.element.innerHTML=OpenLayers.i18n("scale",{'scaleDenom':scale});},CLASS_NAME:"OpenLayers.Control.Scale"});OpenLayers.Control.ScaleLine=OpenLayers.Class(OpenLayers.Control,{maxWidth:100,topOutUnits:"km",topInUnits:"m",bottomOutUnits:"mi",bottomInUnits:"ft",eTop:null,eBottom:null,geodesic:false,initialize:function(options){OpenLayers.Control.prototype.initialize.apply(this,[options]);},draw:function(){OpenLayers.Control.prototype.draw.apply(this,arguments);if(!this.eTop){this.eTop=document.createElement("div");this.eTop.className=this.displayClass+"Top";var theLen=this.topInUnits.length;this.div.appendChild(this.eTop);if((this.topOutUnits=="")||(this.topInUnits=="")){this.eTop.style.visibility="hidden";}else{this.eTop.style.visibility="visible";} +this.eBottom=document.createElement("div");this.eBottom.className=this.displayClass+"Bottom";this.div.appendChild(this.eBottom);if((this.bottomOutUnits=="")||(this.bottomInUnits=="")){this.eBottom.style.visibility="hidden";}else{this.eBottom.style.visibility="visible";}} +this.map.events.register('moveend',this,this.update);this.update();return this.div;},getBarLen:function(maxLen){var digits=parseInt(Math.log(maxLen)/Math.log(10));var pow10=Math.pow(10,digits);var firstChar=parseInt(maxLen/pow10);var barLen;if(firstChar>5){barLen=5;}else if(firstChar>2){barLen=2;}else{barLen=1;} +return barLen*pow10;},update:function(){var res=this.map.getResolution();if(!res){return;} +var curMapUnits=this.map.getUnits();var inches=OpenLayers.INCHES_PER_UNIT;var maxSizeData=this.maxWidth*res*inches[curMapUnits];var geodesicRatio=1;if(this.geodesic===true){var maxSizeGeodesic=(this.map.getGeodesicPixelSize().w||0.000001)*this.maxWidth;var maxSizeKilometers=maxSizeData/inches["km"];geodesicRatio=maxSizeGeodesic/maxSizeKilometers;maxSizeData*=geodesicRatio;} +var topUnits;var bottomUnits;if(maxSizeData>100000){topUnits=this.topOutUnits;bottomUnits=this.bottomOutUnits;}else{topUnits=this.topInUnits;bottomUnits=this.bottomInUnits;} +var topMax=maxSizeData/inches[topUnits];var bottomMax=maxSizeData/inches[bottomUnits];var topRounded=this.getBarLen(topMax);var bottomRounded=this.getBarLen(bottomMax);topMax=topRounded/inches[curMapUnits]*inches[topUnits];bottomMax=bottomRounded/inches[curMapUnits]*inches[bottomUnits];var topPx=topMax/res/geodesicRatio;var bottomPx=bottomMax/res/geodesicRatio;if(this.eBottom.style.visibility=="visible"){this.eBottom.style.width=Math.round(bottomPx)+"px";this.eBottom.innerHTML=bottomRounded+" "+bottomUnits;} +if(this.eTop.style.visibility=="visible"){this.eTop.style.width=Math.round(topPx)+"px";this.eTop.innerHTML=topRounded+" "+topUnits;}},CLASS_NAME:"OpenLayers.Control.ScaleLine"});OpenLayers.Control.ZoomIn=OpenLayers.Class(OpenLayers.Control,{type:OpenLayers.Control.TYPE_BUTTON,trigger:function(){this.map.zoomIn();},CLASS_NAME:"OpenLayers.Control.ZoomIn"});OpenLayers.Control.ZoomOut=OpenLayers.Class(OpenLayers.Control,{type:OpenLayers.Control.TYPE_BUTTON,trigger:function(){this.map.zoomOut();},CLASS_NAME:"OpenLayers.Control.ZoomOut"});OpenLayers.Control.ZoomToMaxExtent=OpenLayers.Class(OpenLayers.Control,{type:OpenLayers.Control.TYPE_BUTTON,trigger:function(){if(this.map){this.map.zoomToMaxExtent();}},CLASS_NAME:"OpenLayers.Control.ZoomToMaxExtent"});OpenLayers.Event={observers:false,KEY_BACKSPACE:8,KEY_TAB:9,KEY_RETURN:13,KEY_ESC:27,KEY_LEFT:37,KEY_UP:38,KEY_RIGHT:39,KEY_DOWN:40,KEY_DELETE:46,element:function(event){return event.target||event.srcElement;},isLeftClick:function(event){return(((event.which)&&(event.which==1))||((event.button)&&(event.button==1)));},isRightClick:function(event){return(((event.which)&&(event.which==3))||((event.button)&&(event.button==2)));},stop:function(event,allowDefault){if(!allowDefault){if(event.preventDefault){event.preventDefault();}else{event.returnValue=false;}} +if(event.stopPropagation){event.stopPropagation();}else{event.cancelBubble=true;}},findElement:function(event,tagName){var element=OpenLayers.Event.element(event);while(element.parentNode&&(!element.tagName||(element.tagName.toUpperCase()!=tagName.toUpperCase()))){element=element.parentNode;} +return element;},observe:function(elementParam,name,observer,useCapture){var element=OpenLayers.Util.getElement(elementParam);useCapture=useCapture||false;if(name=='keypress'&&(navigator.appVersion.match(/Konqueror|Safari|KHTML/)||element.attachEvent)){name='keydown';} +if(!this.observers){this.observers={};} +if(!element._eventCacheID){var idPrefix="eventCacheID_";if(element.id){idPrefix=element.id+"_"+idPrefix;} +element._eventCacheID=OpenLayers.Util.createUniqueID(idPrefix);} +var cacheID=element._eventCacheID;if(!this.observers[cacheID]){this.observers[cacheID]=[];} +this.observers[cacheID].push({'element':element,'name':name,'observer':observer,'useCapture':useCapture});if(element.addEventListener){element.addEventListener(name,observer,useCapture);}else if(element.attachEvent){element.attachEvent('on'+name,observer);}},stopObservingElement:function(elementParam){var element=OpenLayers.Util.getElement(elementParam);var cacheID=element._eventCacheID;this._removeElementObservers(OpenLayers.Event.observers[cacheID]);},_removeElementObservers:function(elementObservers){if(elementObservers){for(var i=elementObservers.length-1;i>=0;i--){var entry=elementObservers[i];var args=new Array(entry.element,entry.name,entry.observer,entry.useCapture);var removed=OpenLayers.Event.stopObserving.apply(this,args);}}},stopObserving:function(elementParam,name,observer,useCapture){useCapture=useCapture||false;var element=OpenLayers.Util.getElement(elementParam);var cacheID=element._eventCacheID;if(name=='keypress'){if(navigator.appVersion.match(/Konqueror|Safari|KHTML/)||element.detachEvent){name='keydown';}} +var foundEntry=false;var elementObservers=OpenLayers.Event.observers[cacheID];if(elementObservers){var i=0;while(!foundEntry&&i
                      "+"To get rid of this message, select a new BaseLayer "+"in the layer switcher in the upper-right corner.

                      "+"Most likely, this is because the Google Maps library "+"script was either not included, or does not contain the "+"correct API key for your site.

                      "+"Developers: For help getting this working correctly, "+"click here",'getLayerWarning':"The ${layerType} Layer was unable to load correctly.

                      "+"To get rid of this message, select a new BaseLayer "+"in the layer switcher in the upper-right corner.

                      "+"Most likely, this is because the ${layerLib} library "+"script was not correctly included.

                      "+"Developers: For help getting this working correctly, "+"click here",'scale':"Scale = 1 : ${scaleDenom}",'W':'W','E':'E','N':'N','S':'S','graticule':'Graticule','layerAlreadyAdded':"You tried to add the layer: ${layerName} to the map, but it has already been added",'reprojectDeprecated':"You are using the 'reproject' option "+"on the ${layerName} layer. This option is deprecated: "+"its use was designed to support displaying data over commercial "+"basemaps, but that functionality should now be achieved by using "+"Spherical Mercator support. More information is available from "+"http://trac.openlayers.org/wiki/SphericalMercator.",'methodDeprecated':"This method has been deprecated and will be removed in 3.0. "+"Please use ${newMethod} instead.",'boundsAddError':"You must pass both x and y values to the add function.",'lonlatAddError':"You must pass both lon and lat values to the add function.",'pixelAddError':"You must pass both x and y values to the add function.",'unsupportedGeometryType':"Unsupported geometry type: ${geomType}",'pagePositionFailed':"OpenLayers.Util.pagePosition failed: element with id ${elemId} may be misplaced.",'filterEvaluateNotImplemented':"evaluate is not implemented for this filter type.",'end':''};OpenLayers.Lang["fi"]=OpenLayers.Util.applyDefaults({'permalink':"Ikilinkki",'overlays':"Kerrokset",'baseLayer':"Peruskerros",'sameProjection':"Yleiskuvakarttaa voi käyttää vain, kun sillä on sama projektio kuin pääkartalla.",'W':"L",'E':"I",'N':"P",'S':"E"});OpenLayers.Lang["fur"]=OpenLayers.Util.applyDefaults({'permalink':"Leam Permanent",'overlays':"Livei parsore",'baseLayer':"Livel di base",'browserNotSupported':"Il to sgarfadĂ´r nol supuarte la renderizazion vetoriâl. Al moment a son supuartâts:\n${renderers}",'scale':"Scjale = 1 : ${scaleDenom}",'W':"O",'E':"E",'N':"N",'S':"S"});OpenLayers.Lang["gl"]=OpenLayers.Util.applyDefaults({'unhandledRequest':"Solicitude non xerada; a resposta foi: ${statusText}",'permalink':"LigazĂłn permanente",'overlays':"Capas superpostas",'baseLayer':"Capa base",'sameProjection':"A vista xeral do mapa sĂł funciona cando está na mesma proxecciĂłn cĂł mapa principal",'readNotImplemented':"Lectura non implementada.",'writeNotImplemented':"Escritura non implementada.",'noFID':"Non se pode actualizar a funcionalidade para a que non hai FID.",'errorLoadingGML':"Erro ao cargar o ficheiro GML ${url}",'browserNotSupported':"O seu navegador non soporta a renderizaciĂłn de vectores. Os renderizadores soportados actualmente son:\n${renderers}",'componentShouldBe':"addFeatures: o compoñente debera ser de tipo ${geomType}",'getFeatureError':"getFeatureFromEvent ten sido chamado a unha capa sen renderizador. Isto normalmente significa que destruĂ­u unha capa, mais non o executador que está asociado con ela.",'minZoomLevelError':"A propiedade minZoomLevel Ă© sĂł para uso conxuntamente coas capas FixedZoomLevels-descendent. O feito de que esa capa wfs verifique o minZoomLevel Ă© unha reliquia do pasado. Non podemos, con todo, eliminala sen a posibilidade de non romper as aplicaciĂłns baseadas en OL que poidan depender dela. Por iso a estamos deixando obsoleta (a comprobaciĂłn minZoomLevel de embaixo será eliminada na versiĂłn 3.0). Por favor, no canto diso use o axuste de resoluciĂłn mĂ­n/máx tal e como está descrito aquĂ­: http://trac.openlayers.org/wiki/SettingZoomLevels",'commitSuccess':"TransacciĂłn WFS: ÉXITO ${response}",'commitFailed':"TransacciĂłn WFS: FALLIDA ${response}",'googleWarning':"A capa do Google non puido cargarse correctamente.\x3cbr\x3e\x3cbr\x3ePara evitar esta mensaxe, escolla unha nova capa base no seleccionador de capas na marxe superior dereita.\x3cbr\x3e\x3cbr\x3eProbablemente, isto acontece porque a escritura da librarĂ­a do Google Maps ou ben non foi incluĂ­da ou ben non contĂ©n a clave API correcta para o seu sitio.\x3cbr\x3e\x3cbr\x3eDesenvolvedores: para axudar a facer funcionar isto correctamente, \x3ca href=\'http://trac.openlayers.org/wiki/Google\' target=\'_blank\'\x3epremede aquĂ­\x3c/a\x3e",'getLayerWarning':"A capa ${layerType} foi incapaz de cargarse correctamente.\x3cbr\x3e\x3cbr\x3ePara evitar esta mensaxe, escolla unha nova capa base no seleccionador de capas na marxe superior dereita.\x3cbr\x3e\x3cbr\x3eProbablemente, isto acontece porque a escritura da librarĂ­a ${layerLib} non foi ben incluĂ­da.\x3cbr\x3e\x3cbr\x3eDesenvolvedores: para axudar a facer funcionar isto correctamente, \x3ca href=\'http://trac.openlayers.org/wiki/${layerLib}\' target=\'_blank\'\x3epremede aquĂ­\x3c/a\x3e",'scale':"Escala = 1 : ${scaleDenom}",'W':"O",'E':"L",'N':"N",'S':"S",'layerAlreadyAdded':"Intentou engadir a capa: ${layerName} ao mapa, pero xa fora engadida",'reprojectDeprecated':"Está usando a opciĂłn \"reproject\" na capa ${layerName}. Esta opciĂłn está obsoleta: o seu uso foi deseñado para a visualizaciĂłn de datos sobre mapas base comerciais, pero esta funcionalidade debera agora ser obtida utilizando a proxecciĂłn Spherical Mercator. Hai dispoñible máis informaciĂłn en http://trac.openlayers.org/wiki/SphericalMercator.",'methodDeprecated':"Este mĂ©todo está obsoleto e será eliminado na versiĂłn 3.0. Por favor, no canto deste use ${newMethod}.",'boundsAddError':"Debe achegar os valores x e y á funciĂłn add.",'lonlatAddError':"Debe achegar tanto o valor lon coma o lat á funciĂłn add.",'pixelAddError':"Debe achegar os valores x e y á funciĂłn add.",'unsupportedGeometryType':"Tipo xeomĂ©trico non soportado: ${geomType}",'pagePositionFailed':"OpenLayers.Util.pagePosition fallou: o elemento con id ${elemId} pode non estar na sĂşa posiciĂłn.",'filterEvaluateNotImplemented':"avaliar non está implementado para este tipo de filtro."});OpenLayers.Lang["gsw"]=OpenLayers.Util.applyDefaults({'unhandledRequest':"Nit behandleti Aafrogsruckmäldig ${statusText}",'permalink':"Permalink",'overlays':"Iberlagerige",'baseLayer':"Grundcharte",'sameProjection':"D Ibersichts-Charte funktioniert nume, wänn si di glych Projäktion brucht wie d Hauptcharte",'readNotImplemented':"Läse nit implementiert.",'writeNotImplemented':"Schrybe nit implementiert.",'noFID':"E Feature, wu s kei FID derfir git, cha nit aktualisiert wäre.",'errorLoadingGML':"Fähler bim Lade vu dr GML-Datei ${url}",'browserNotSupported':"Dyy Browser unterstitzt kei Vektordarstellig. Aktuäll unterstitzti Renderer:\n${renderers}",'componentShouldBe':"addFeatures : Komponänt sott dr Typ ${geomType} syy",'getFeatureError':"getFeatureFromEvent isch uf eme Layer ohni Renderer ufgruefe wore. Des heisst normalerwys, ass Du e Layer kaputt gmacht hesch, aber nit dr Handler, wu derzue ghert.",'minZoomLevelError':"D minZoomLevel-Eigeschaft isch nume dänk fir d Layer, wu vu dr FixedZoomLevels abstamme. Ass dää wfs-Layer minZoomLevel prieft, scih e Relikt us dr Vergangeheit. Mir chenne s aber nit ändere ohni OL_basierti Aawändige villicht kaputt gehn, wu dervu abhänge. Us däm Grund het die Funktion d Eigeschaft \'deprecated\' iberchuu. D minZoomLevel-Priefig unte wird in dr Version 3.0 usegnuu. Bitte verwänd statt däm e min/max-Uflesig wie s do bschriben isch: http://trac.openlayers.org/wiki/SettingZoomLevels",'commitSuccess':"WFS-Transaktion: ERFOLGRYCH ${response}",'commitFailed':"WFS-Transaktion: FĂ„HLGSCHLAA ${response}",'googleWarning':"Dr Google-Layer het nit korräkt chenne glade wäre.\x3cbr\x3e\x3cbr\x3eGo die Mäldig nimi z kriege, wehl e andere Hintergrundlayer us em LayerSwitcher im rächte obere Ecke.\x3cbr\x3e\x3cbr\x3eDää Fähler git s seli hyfig, wel s Skript vu dr Google-Maps-Bibliothek nit yybunde woren isch oder wel s kei giltige API-Schlissel fir Dyy URL din het.\x3cbr\x3e\x3cbr\x3eEntwickler: Fir Hilf zum korräkte Yybinde vum Google-Layer \x3ca href=\'http://trac.openlayers.org/wiki/Google\' target=\'_blank\'\x3edoo drucke\x3c/a\x3e",'getLayerWarning':"Dr ${layerType}-Layer het nit korräkt chenne glade wäre.\x3cbr\x3e\x3cbr\x3eGo die Mäldig nimi z kriege, wehl e andere Hintergrundlayer us em LayerSwitcher im rächte obere Ecke.\x3cbr\x3e\x3cbr\x3eDää Fähler git s seli hyfig, wel s Skript vu dr \'${layerLib}\'-Bibliothek nit yybunde woren isch oder wel s kei giltige API-Schlissel fir Dyy URL din het.\x3cbr\x3e\x3cbr\x3eEntwickler: Fir Hilf zum korräkte Yybinde vu Layer \x3ca href=\'http://trac.openlayers.org/wiki/${layerLib}\' target=\'_blank\'\x3edoo drucke\x3c/a\x3e",'scale':"MaĂźstab = 1 : ${scaleDenom}",'W':"W",'E':"O",'N':"N",'S':"S",'layerAlreadyAdded':"Du hesch versuecht dää Layer in d Charte yyzfiege: ${layerName}, aber är isch schoi yygfiegt",'reprojectDeprecated':"Du bruchsch d \'reproject\'-Option bim ${layerName}-Layer. Die Option isch nimi giltig: si isch aagleit wore go Date iber kommerziälli Grundcharte lege, aber des sott mer jetz mache mit dr Unterstitzig vu Spherical Mercator. Meh Informatione git s uf http://trac.openlayers.org/wiki/SphericalMercator.",'methodDeprecated':"Die Methode isch veraltet un wird us dr Version 3.0 usegnuu. Bitte verwäbnd statt däm ${newMethod}.",'boundsAddError':"Du muesch e x-Wärt un e y-Wärt yygee bi dr Zuefieg-Funktion",'lonlatAddError':"Du meusch e Lengi- un e Breiti-Grad yygee bi dr Zuefieg-Funktion.",'pixelAddError':"Du muesch x- un y-Wärt aagee bi dr Zuefieg-Funktion.",'unsupportedGeometryType':"Nit unterstitze Geometrii-Typ: ${geomType}",'pagePositionFailed':"OpenLayers.Util.pagePosition fählgschlaa: Elemänt mit ID ${elemId} isch villicht falsch gsetzt.",'filterEvaluateNotImplemented':"evaluiere isch nit implemäntiert in däm Filtertyp."});OpenLayers.Lang["hr"]=OpenLayers.Util.applyDefaults({'unhandledRequest':"NepodrĹľani zahtjev ${statusText}",'permalink':"Permalink",'overlays':"Overlays",'baseLayer':"Osnovna karta",'sameProjection':"Pregledna karta radi jedino kao je u istoj projekciji kao i glava karta",'readNotImplemented':"ÄŚitanje nije implementirano.",'writeNotImplemented':"Pisanje nije implementirano.",'noFID':"Ne mogu aĹľurirati znaÄŤajku za koju ne postoji FID.",'errorLoadingGML':"Greška u uÄŤitavanju GML datoteke ${url}",'browserNotSupported':"Vaš preglednik ne podrĹľava vektorsko renderiranje. Trenutno podrĹľani rendereri su: ${renderers}",'componentShouldBe':"addFeatures : komponenta bi trebala biti ${geomType}",'getFeatureError':"getFeatureFromEvent je pozvao Layer bez renderera. Ovo obiÄŤno znaÄŤi da ste uništiili Layer, a ne neki Handler koji je povezan s njim.",'commitSuccess':"WFS Transakcija: USPJEĹ NA ${response}",'commitFailed':"WFS Transakcija: NEUSPJEĹ NA ${response}",'scale':"Mjerilo = 1 : ${scaleDenom}",'layerAlreadyAdded':"Pokušali ste dodati layer: ${layerName} na kartu, ali je već dodan",'methodDeprecated':"Ova metoda nije odobrena i biti će maknuta u 3.0. Koristite ${newMethod}.",'boundsAddError':"Morate dati obje vrijednosti , x i y da bi dodali funkciju.",'lonlatAddError':"Morate dati obje vrijednosti , (lon i lat) da bi dodali funkciju.",'pixelAddError':"Morate dati obje vrijednosti , x i y da bi dodali funkciju.",'unsupportedGeometryType':"NepodrĹľani tip geometrije: ${geomType}",'pagePositionFailed':"OpenLayers.Util.pagePosition nije uspjelo: element sa id ${elemId} moĹľe biti krivo smješten."});OpenLayers.Lang["hsb"]=OpenLayers.Util.applyDefaults({'unhandledRequest':"WotmoĹ‚wa njewobdźěłaneho naprašowanja ${statusText}",'permalink':"Trajny wotkaz",'overlays':"Naworštowanja",'baseLayer':"ZakĹ‚adna runina",'sameProjection':"PĹ™ehladowa karta jenoĹľ funguje, hdyĹľ je w samsnej projekciji kaĹľ hĹ‚owna karta",'readNotImplemented':"ÄŚitanje njeimplementowane.",'writeNotImplemented':"Pisanje njeimplementowane.",'noFID':"Funkcija, za kotruĹľ FID njeje, njeda so aktualizować.",'errorLoadingGML':"Zmylk pĹ™i zaÄŤitowanju dataje ${url}",'browserNotSupported':"TwĂłj wobhladowak wektorowe rysowanje njepodpÄ›ruje. Tuchwilu podpÄ›rowane rysowaki su:\n${renderers}",'componentShouldBe':"addFeatures: komponenta měła ${geomType} być",'getFeatureError':"getFeatureFromEvent bu na woršće bjez rysowak zawoĹ‚any. To zwjetša woznamjenja, zo sy worštu zniÄŤiĹ‚, ale nic wobdźěłak, kotryĹľ je z njej zwjazany.",'minZoomLevelError':"Kajkosć minZoomLevel je jenoĹľ za wuĹľiwanje z worštami myslena, kotreĹľ wot FixedZoomLevels pochadĹşeja. Zo tuta woršta wfs za minZoomLevel pĹ™epruwuje, je relikt zaĹ„dĹşenosće. Njemóžemy wšak ju wotstronić, bjeztoho zo aplikacije, kotreĹľ na OpenLayers bazÄ›ruja a snano tutu kajkosć wuĹľiwaja, hiĹľo njefunguja. Tohodla smy ju jako zestarjenu woznamjenili -- pĹ™epruwowanje za minZoomLevel budu so we wersiji 3.0 wotstronjeć. Prošu wuĹľij mÄ›sto toho nastajenje min/max, kaĹľ je tu wopisane: http://trac.openlayers.org/wiki/SettingZoomLevels",'commitSuccess':"WFS-Transakcija: WUSPĚŠNA ${response}",'commitFailed':"WFS-Transakcija: NJEPORADĹąENA ${response}",'googleWarning':"Woršta Google njemóžeše so korektnje zaÄŤitać.\x3cbr\x3e\x3cbr\x3eZo by tutu zdźělenku wotbyĹ‚, wubjer nowy BaseLayer z wubÄ›ra worštow horjeka naprawo.\x3cbr\x3e\x3cbr\x3eNajskerje so to stawa, dokelĹľ skript biblioteki Google Maps pak njebu zapĹ™ijaty pak njewobsahuje korektny kluÄŤ API za twoje sydĹ‚o.\x3cbr\x3e\x3cbr\x3eWuwiwarjo: Za pomoc ke korektnemu fungowanju worštow\n\x3ca href=\'http://trac.openlayers.org/wiki/Google\' target=\'_blank\'\x3etu kliknyć\x3c/a\x3e",'getLayerWarning':"Woršta ${layerType} njemóžeše so korektnje zaÄŤitać.\x3cbr\x3e\x3cbr\x3eZo by tutu zdźělenku wotbyĹ‚, wubjer nowy BaseLayer z wubÄ›ra worštow horjeka naprawo.\x3cbr\x3e\x3cbr\x3eNajskerje so to stawa, dokelĹľ skript biblioteki ${layerLib} njebu korektnje zapĹ™ijaty.\x3cbr\x3e\x3cbr\x3eWuwiwarjo: Za pomoc ke korektnemu fungowanju worštow\n\x3ca href=\'http://trac.openlayers.org/wiki/${layerLib}\' target=\'_blank\'\x3etu kliknyć\x3c/a\x3e",'scale':"MÄ›ritko = 1 : ${scaleDenom}",'W':"Z",'E':"W",'N':"S",'S':"J",'layerAlreadyAdded':"Sy spytaĹ‚ runinu ${layerName} karće dodać, ale je so hiĹľo dodaĹ‚a",'reprojectDeprecated':"WuĹľiwaš opciju \"reproject\" wořšty ${layerName}. Tuta opcija je zestarjena: jeje wuĹľiwanje bÄ› myslene, zo by zwobraznjenje datow nad komercielnymi bazowymi kartami podpÄ›raĹ‚o, ale funkcionalnosć měła so nÄ›tko z pomocu Sperical Mercator docpěć. Dalše informacije steja na http://trac.openlayers.org/wiki/SphericalMercator k dispoziciji.",'methodDeprecated':"Tuta metoda je so njeschwaliĹ‚a a budĹşe so w 3.0 wotstronjeć. Prošu wuĹľij ${newMethod} mÄ›sto toho.",'boundsAddError':"Dyrbiš hĂłdnotu x kaĹľ teĹľ y funkciji \"add\" pĹ™epodać.",'lonlatAddError':"Dyrbiš hĂłdnotu lon kaĹľ teĹľ lat funkciji \"add\" pĹ™epodać.",'pixelAddError':"Dyrbiš hĂłdnotu x kaĹľ teĹľ y funkciji \"add\" pĹ™epodać.",'unsupportedGeometryType':"NjepodpÄ›rowany geometrijowy typ: ${geomType}",'pagePositionFailed':"OpenLayers.Util.pagePosition je so njeporadĹşiĹ‚: element z id ${elemId} bu snano wopak zamÄ›stnjeny.",'filterEvaluateNotImplemented':"wuhĂłdnoćenje njeje za tutĂłn filtrowy typ implementowany."});OpenLayers.Lang["hu"]=OpenLayers.Util.applyDefaults({'unhandledRequest':"Nem kezelt kĂ©rĂ©s visszatĂ©rĂ©se ${statusText}",'permalink':"Permalink",'overlays':"RávetĂ­tĂ©sek",'baseLayer':"AlaprĂ©teg",'sameProjection':"Az áttekintĹ‘ tĂ©rkĂ©p csak abban az esetben működik, ha ugyanazon a vetĂĽleten van, mint a fĹ‘ tĂ©rkĂ©p.",'readNotImplemented':"Olvasás nincs vĂ©grehajtva.",'writeNotImplemented':"ĂŤrás nincs vĂ©grehajtva.",'noFID':"Nem frissĂ­thetĹ‘ olyan jellemzĹ‘, amely nem rendelkezik FID-del.",'errorLoadingGML':"Hiba GML-fájl betöltĂ©sekor ${url}",'browserNotSupported':"A böngĂ©szĹ‘je nem támogatja a vektoros renderelĂ©st. A jelenleg támogatott renderelĹ‘k:\n${renderers}",'componentShouldBe':"addFeatures : az összetevĹ‘nek ilyen tĂ­pusĂşnak kell lennie: ${geomType}",'getFeatureError':"getFeatureFromEvent rĂ©teget hĂ­vott meg renderelĹ‘ nĂ©lkĂĽl. Ez rendszerint azt jelenti, hogy megsemmisĂ­tett egy fĂłliát, de nĂ©hány ahhoz társĂ­tott kezelĹ‘t nem.",'minZoomLevelError':"A minZoomLevel tulajdonságot csak a következĹ‘vel valĂł használatra szánták: FixedZoomLevels-leszármazott fĂłliák. Ez azt jelenti, hogy a minZoomLevel wfs fĂłlia jelölĹ‘nĂ©gyzetei már a mĂşltĂ©. Mi azonban nem távolĂ­thatjuk el annak a veszĂ©lye nĂ©lkĂĽl, hogy az esetlegesen ettĹ‘l fĂĽggĹ‘ OL alapĂş alkalmazásokat tönkretennĂ©nk. EzĂ©rt ezt Ă©rvĂ©nytelenĂ­tjĂĽk -- a minZoomLevel az alul levĹ‘ jelölĹ‘nĂ©gyzet a 3.0-s verziĂłbĂłl el lesz távolĂ­tva. KĂ©rjĂĽk, helyette használja a min/max felbontás beállĂ­tást, amelyrĹ‘l az alábbi helyen talál leĂ­rást: http://trac.openlayers.org/wiki/SettingZoomLevels",'commitSuccess':"WFS tranzakciĂł: SIKERES ${response}",'commitFailed':"WFS tranzakciĂł: SIKERTELEN ${response}",'googleWarning':"A Google fĂłlia betöltĂ©se sikertelen.\x3cbr\x3e\x3cbr\x3eAhhoz, hogy ez az ĂĽzenet eltűnjön, válasszon egy Ăşj BaseLayer fĂłliát a jobb felsĹ‘ sarokban találhatĂł fĂłliakapcsolĂł segĂ­tsĂ©gĂ©vel.\x3cbr\x3e\x3cbr\x3eNagy valĂłszĂ­nűsĂ©ggel ez azĂ©rt van, mert a Google Maps könyvtár parancsfájlja nem találhatĂł, vagy nem tartalmazza az Ă–n oldalához tartozĂł megfelelĹ‘ API-kulcsot.\x3cbr\x3e\x3cbr\x3eFejlesztĹ‘knek: A helyes működtetĂ©sre vonatkozĂł segĂ­tsĂ©g az alábbi helyen Ă©rhetĹ‘ el, \x3ca href=\'http://trac.openlayers.org/wiki/Google\' target=\'_blank\'\x3ekattintson ide\x3c/a\x3e",'getLayerWarning':"A(z) ${layerType} fĂłlia nem töltĹ‘dött be helyesen.\x3cbr\x3e\x3cbr\x3eAhhoz, hogy ez az ĂĽzenet eltűnjön, válasszon egy Ăşj BaseLayer fĂłliát a jobb felsĹ‘ sarokban találhatĂł fĂłliakapcsolĂł segĂ­tsĂ©gĂ©vel.\x3cbr\x3e\x3cbr\x3eNagy valĂłszĂ­nűsĂ©ggel ez azĂ©rt van, mert a(z) ${layerLib} könyvtár parancsfájlja helytelen.\x3cbr\x3e\x3cbr\x3eFejlesztĹ‘knek: A helyes működtetĂ©sre vonatkozĂł segĂ­tsĂ©g az alábbi helyen Ă©rhetĹ‘ el, \x3ca href=\'http://trac.openlayers.org/wiki/${layerLib}\' target=\'_blank\'\x3ekattintson ide\x3c/a\x3e",'scale':"LĂ©ptĂ©k = 1 : ${scaleDenom}",'W':"Ny",'E':"K",'N':"É",'S':"D",'layerAlreadyAdded':"MegprĂłbálta hozzáadni a(z) ${layerName} fĂłliát a tĂ©rkĂ©phez, de az már hozzá van adva",'reprojectDeprecated':"Ă–n a \'reproject\' beállĂ­tást használja a(z) ${layerName} fĂłlián. Ez a beállĂ­tás Ă©rvĂ©nytelen: használata az ĂĽzleti alaptĂ©rkĂ©pek fölötti adatok megjelenĂ­tĂ©sĂ©nek támogatására szolgált, de ezt a funkciĂł ezentĂşl a Gömbi Mercator használatával Ă©rhetĹ‘ el. További informáciĂł az alábbi helyen Ă©rhetĹ‘ el: http://trac.openlayers.org/wiki/SphericalMercator",'methodDeprecated':"Ez a mĂłdszer Ă©rvĂ©nytelenĂ­tve lett Ă©s a 3.0-s verziĂłbĂłl el lesz távolĂ­tva. Használja a(z) ${newMethod} mĂłdszert helyette.",'boundsAddError':"Az x Ă©s y Ă©rtĂ©keknek egyaránt meg kell felelnie, hogy a funkciĂłt hozzáadhassa.",'lonlatAddError':"A hossz. Ă©s szĂ©l. Ă©rtĂ©keknek egyaránt meg kell felelnie, hogy a funkciĂłt hozzáadhassa.",'pixelAddError':"Az x Ă©s y Ă©rtĂ©keknek egyaránt meg kell felelnie, hogy a funkciĂłt hozzáadhassa.",'unsupportedGeometryType':"Nem támogatott geometriatĂ­pus: ${geomType}",'pagePositionFailed':"OpenLayers.Util.pagePosition sikertelen: lehetsĂ©ges, hogy a(z) ${elemId} azonosĂ­tĂłjĂş elem tĂ©ves helyre kerĂĽlt.",'filterEvaluateNotImplemented':"ennĂ©l a szűrĹ‘tĂ­pusnál kiĂ©rtĂ©kelĂ©s nem hajtĂłdik vĂ©gre."});OpenLayers.Lang["ia"]=OpenLayers.Util.applyDefaults({'unhandledRequest':"Le responsa a un requesta non esseva maneate: ${statusText}",'permalink':"Permaligamine",'overlays':"Superpositiones",'baseLayer':"Strato de base",'sameProjection':"Le mini-carta functiona solmente si illo es in le mesme projection que le carta principal",'readNotImplemented':"Lectura non implementate.",'writeNotImplemented':"Scriptura non implementate.",'noFID':"Non pote actualisar un elemento sin FID.",'errorLoadingGML':"Error al cargamento del file GML ${url}",'browserNotSupported':"Tu navigator non supporta le rendition de vectores. Le renditores actualmente supportate es:\n${renderers}",'componentShouldBe':"addFeatures: le componente debe esser del typo ${geomType}",'getFeatureError':"getFeatureFromEvent ha essite appellate in un strato sin renditor. Isto significa generalmente que tu ha destruite un strato, ma lassava un gestor associate con illo.",'minZoomLevelError':"Le proprietate minZoomLevel es solmente pro uso con le stratos descendente de FixedZoomLevels. Le facto que iste strato WFS verifica minZoomLevel es un reliquia del passato. Nonobstante, si nos lo remove immediatemente, nos pote rumper applicationes a base de OL que depende de illo. Ergo nos lo declara obsolete; le verification de minZoomLevel in basso essera removite in version 3.0. Per favor usa in su loco le configuration de resolutiones min/max como describite a: http://trac.openlayers.org/wiki/SettingZoomLevels",'commitSuccess':"Transaction WFS: SUCCESSO ${response}",'commitFailed':"Transaction WFS: FALLEVA ${response}",'googleWarning':"Le strato Google non poteva esser cargate correctemente.\x3cbr\x3e\x3cbr\x3ePro disfacer te de iste message, selige un nove BaseLayer in le selector de strato in alto a dextra.\x3cbr\x3e\x3cbr\x3eMulto probabilemente, isto es proque le script del libreria de Google Maps non esseva includite o non contine le clave API correcte pro tu sito.\x3cbr\x3e\x3cbr\x3eDisveloppatores: Pro adjuta de corriger isto, \x3ca href=\'http://trac.openlayers.org/wiki/Google\' target=\'_blank\'\x3eclicca hic\x3c/a",'getLayerWarning':"Le strato ${layerType} non poteva esser cargate correctemente.\x3cbr\x3e\x3cbr\x3ePro disfacer te de iste message, selige un nove BaseLayer in le selector de strato in alto a dextra.\x3cbr\x3e\x3cbr\x3eMulto probabilemente, isto es proque le script del libreria de ${layerLib} non esseva correctemente includite.\x3cbr\x3e\x3cbr\x3eDisveloppatores: Pro adjuta de corriger isto, \x3ca href=\'http://trac.openlayers.org/wiki/${layerLib}\' target=\'_blank\'\x3eclicca hic\x3c/a\x3e",'scale':"Scala = 1 : ${scaleDenom}",'W':"W",'E':"E",'N':"N",'S':"S",'layerAlreadyAdded':"Tu tentava adder le strato: ${layerName} al carta, ma illo es ja presente",'reprojectDeprecated':"Tu usa le option \'reproject\' in le strato ${layerName} layer. Iste option es obsolescente: illo esseva pro poter monstrar datos super cartas de base commercial, ma iste functionalitate pote ora esser attingite con le uso de Spherical Mercator. Ulterior information es disponibile a http://trac.openlayers.org/wiki/SphericalMercator.",'methodDeprecated':"Iste methodo ha essite declarate obsolescente e essera removite in version 3.0. Per favor usa ${newMethod} in su loco.",'boundsAddError':"Tu debe passar le duo valores x e y al function add.",'lonlatAddError':"Tu debe passar le duo valores lon e lat al function add.",'pixelAddError':"Tu debe passar le duo valores x e y al function add.",'unsupportedGeometryType':"Typo de geometria non supportate: ${geomType}",'pagePositionFailed':"OpenLayers.Util.pagePosition falleva: le elemento con id ${elemId} pote esser mal placiate.",'filterEvaluateNotImplemented':"\"evaluate\" non es implementate pro iste typo de filtro."});OpenLayers.Lang["id"]=OpenLayers.Util.applyDefaults({'unhandledRequest':"Permintaan yang tak tertangani menghasilkan ${statusText}",'permalink':"Pranala permanen",'overlays':"Hamparan",'baseLayer':"Lapisan Dasar",'sameProjection':"Peta tinjauan hanya bekerja bila dalam proyeksi yang sama dengan peta utama",'readNotImplemented':"Membaca tidak diterapkan.",'writeNotImplemented':"Menyimpan tidak diterapkan.",'noFID':"Tidak dapat memperbarui fitur yang tidak memiliki FID.",'errorLoadingGML':"Kesalahan dalam memuat berkas GML ${url}",'browserNotSupported':"Peramban Anda tidak mendukung penggambaran vektor. Penggambar yang didukung saat ini adalah:\n${renderers}",'componentShouldBe':"addFeatures : komponen harus berupa ${geomType}",'getFeatureError':"getFeatureFromEvent diterapkan pada lapisan tanpa penggambar. Ini biasanya berarti Anda menghapus sebuah lapisan, tetapi tidak menghapus penangan yang terkait dengannya.",'minZoomLevelError':"Properti minZoomLevel hanya ditujukan bekerja dengan lapisan FixedZoomLevels-descendent. Pengecekan minZoomLevel oleh lapisan wfs adalah peninggalan masa lalu. Kami tidak dapat menghapusnya tanpa kemungkinan merusak aplikasi berbasis OL yang mungkin bergantung padanya. Karenanya, kami menganggapnya tidak berlaku -- Cek minZoomLevel di bawah ini akan dihapus pada 3.0. Silakan gunakan penyetelan resolusi min/maks seperti dijabarkan di sini: http://trac.openlayers.org/wiki/SettingZoomLevels",'commitSuccess':"WFS Transaksi: BERHASIL ${respon}",'commitFailed':"WFS Transaksi: GAGAL ${respon}",'googleWarning':"Lapisan Google tidak dapat dimuat dengan benar.\x3cbr\x3e\x3cbr\x3eUntuk menghilangkan pesan ini, pilih suatu BaseLayer baru melalui penukar lapisan (layer switcher) di ujung kanan atas.\x3cbr\x3e\x3cbr\x3eKemungkinan besar ini karena pustaka skrip Google Maps tidak disertakan atau tidak mengandung kunci API yang tepat untuk situs Anda.\x3cbr\x3e\x3cbr\x3ePengembang: Untuk bantuan mengatasi masalah ini, \x3ca href=\'http://trac.openlayers.org/wiki/Google\' target=\'_blank\'\x3eklik di sini\x3c/a\x3e",'getLayerWarning':"Lapisan ${layerType} tidak dapat dimuat dengan benar.\x3cbr\x3e\x3cbr\x3eUntuk menghilangkan pesan ini, pilih suatu BaseLayer baru melalui penukar lapisan (layer switcher) di ujung kanan atas.\x3cbr\x3e\x3cbr\x3eKemungkinan besar ini karena pustaka skrip Google Maps tidak disertakan dengan benar.\x3cbr\x3e\x3cbr\x3ePengembang: Untuk bantuan mengatasi masalah ini, \x3ca href=\'http://trac.openlayers.org/wiki/${layerLib}\' target=\'_blank\'\x3eklik di sini\x3c/a\x3e",'scale':"Sekala = 1 : ${scaleDenom}",'W':"B",'E':"T",'N':"U",'S':"S",'layerAlreadyAdded':"Anda mencoba menambahkan lapisan: ${layerName} ke dalam peta, tapi lapisan itu telah ditambahkan",'reprojectDeprecated':"Anda menggunakan opsi \'reproject\' pada lapisan ${layerName}. Opsi ini telah ditinggalkan: penggunaannya dirancang untuk mendukung tampilan data melalui peta dasar komersial, tapi fungsionalitas tersebut saat ini harus dilakukan dengan menggunakan dukungan Spherical Mercator. Informasi lebih lanjut tersedia di http://trac.openlayers.org/wiki/SphericalMercator.",'methodDeprecated':"Metode ini telah usang dan akan dihapus di 3.0. Sebaliknya, harap gunakan ${newMethod}.",'boundsAddError':"Anda harus memberikan kedua nilai x dan y ke fungsi penambah.",'lonlatAddError':"Anda harus memberikan kedua nilai lon dan lat ke fungsi penambah.",'pixelAddError':"Anda harus memberikan kedua nilai x dan y ke fungsi penambah.",'unsupportedGeometryType':"Tipe geometri tak didukung: ${geomType}",'pagePositionFailed':"OpenLayers.Util.pagePosition gagal: elemen dengan id ${elemId} mungkin salah tempat.",'filterEvaluateNotImplemented':"evaluasi tidak tersedia untuk tipe filter ini."});OpenLayers.Lang["io"]=OpenLayers.Util.applyDefaults({'scale':"Skalo = 1 : ${scaleDenom}"});OpenLayers.Lang["is"]=OpenLayers.Util.applyDefaults({'permalink':"Varanlegur tengill",'overlays':"Ăžekjur",'baseLayer':"Grunnlag",'sameProjection':"YfirlitskortiĂ° virkar aĂ°eins ef ĂľaĂ° er Ă­ sömu vörpun og aĂ°alkortiĂ°",'readNotImplemented':"Skrifun er óútfærĂ°.",'writeNotImplemented':"Lestur er óútfærĂ°ur.",'errorLoadingGML':"Villa kom upp viĂ° aĂ° hlaĂ°a inn GML skránni ${url}",'scale':"Skali = 1 : ${scaleDenom}",'layerAlreadyAdded':"Þú reyndir aĂ° bæta laginu ${layerName} á kortiĂ° en ĂľaĂ° er Ăľegar bĂşiĂ° aĂ° bæta ĂľvĂ­ viĂ°",'methodDeprecated':"Ăžetta fall hefur veriĂ° Ăşrelt og verĂ°ur fjarlægt Ă­ 3.0. NotaĂ°u ${newMethod} Ă­ staĂ°in."});OpenLayers.Lang["ja"]=OpenLayers.Util.applyDefaults({'unhandledRequest':"未処理の要求は ${statusText} を返します",'permalink':"パーマリンク",'overlays':"オーバーレイ",'baseLayer':"基底レイヤー",'sameProjection':"ć¦‚č¦łĺś°ĺ›łăŻăƒˇă‚¤ăƒłă®ĺś°ĺ›łă¨ĺŚă˜ćŠ•ĺ˝±ćł•ă‚’ă¨ă‚‹ĺ ´ĺˆă®ăżć©źčƒ˝ă—ăľă™",'readNotImplemented':"読み込みは実装されていません。",'writeNotImplemented':"書き込みは実装されていません。",'noFID':"FID のない地物は更新できません。",'errorLoadingGML':"GML ファイル ${url} の読み込みエラー",'browserNotSupported':"あなたのブラウザはベクターグラフィックスの描写に対応していません。現時点で対応しているソフトウェアは以下のものです。\n${renderers}",'componentShouldBe':"addFeatures: č¦ç´ ăŻ ${geomType} であるべきです",'getFeatureError':"getFeatureFromEvent ăŚăƒ¬ăƒłăƒ€ăƒ©ăƒĽă®ăŞă„ăƒ¬ă‚¤ăƒ¤ăƒĽă‹ă‚‰ĺ‘Ľă°ă‚Śăľă—ăźă€‚é€šĺ¸¸ă€ă“ă‚ŚăŻă‚ăŞăźăŚăƒ¬ă‚¤ăƒ¤ăƒĽă‚’ă€ăťă‚Śă«é–˘é€ŁăĄă‘ă‚‰ă‚Śăźă„ăŹă¤ă‹ă®ăƒŹăƒłăƒ‰ăƒ©ă‚’é™¤ă„ă¦ă€ç ´ĺŁŠă—ă¦ă—ăľăŁăźă“ă¨ă‚’ć„Źĺ‘łă—ăľă™ă€‚",'minZoomLevelError':"minZoomLevel プロパティは FixedZoomLevels を継承するレイヤーでの使用のみを想定しています。この minZoomLevel に対する WFS レイヤーの検査は歴史的なものです。しかしながら、この検査を除去するとそれに依存する OpenLayers ăƒ™ăƒĽă‚ąă®ă‚˘ăƒ—ăƒŞă‚±ăƒĽă‚·ăƒ§ăƒłă‚’ç ´ĺŁŠă—ă¦ă—ăľă†ĺŹŻčƒ˝ć€§ăŚă‚ă‚Šăľă™ă€‚ă‚ˆăŁă¦ĺ»ƒć­˘ăŚäşˆĺ®šă•ă‚Śă¦ăŠă‚Šă€ă“ă® minZoomLevel 検査はバージョン3.0で除去されます。代わりに、http://trac.openlayers.org/wiki/SettingZoomLevels で解説されている、最小および最大解像度設定を使用してください。",'commitSuccess':"WFS トランザクション: 成功 ${response}",'commitFailed':"WFS トランザクション: 失敗 ${response}",'googleWarning':"Google レイヤーが正しく読み込みを行えませんでした。\x3cbr\x3e\x3cbr\x3eこのメッセージを消すには、右上の隅にあるレイヤー切り替え部分で新しい基底レイヤーを選んでください。\x3cbr\x3e\x3cbr\x3eおそらく、これは Google マップ用ライブラリのスクリプトが組み込まれていないか、あなたのサイトに対応する正しい API キーが設定されていないためです。\x3cbr\x3e\x3cbr\x3e開発者の方へ: 正しい動作をさせるために\x3ca href=\'http://trac.openlayers.org/wiki/Google\' target=\'_blank\'\x3eこちらのウィキ\x3c/a\x3eを参照してください。",'getLayerWarning':"${layerType} レイヤーが正しく読み込みを行えませんでした。\x3cbr\x3e\x3cbr\x3eこのメッセージを消すには、右上の隅にあるレイヤー切り替え部分で新しい基底レイヤーを選んでください。\x3cbr\x3e\x3cbr\x3eおそらく、これは ${layerLib} ライブラリのスクリプトが正しく組み込まれていないためです。\x3cbr\x3e\x3cbr\x3e開発者の方へ: 正しい動作をさせるために\x3ca href=\'http://trac.openlayers.org/wiki/${layerLib}\' target=\'_blank\'\x3eこちらのウィキ\x3c/a\x3eを参照してください。",'scale':"縮尺 = 1 : ${scaleDenom}",'W':"西",'E':"ćť±",'N':"北",'S':"南",'layerAlreadyAdded':"あなたは「${layerName}ă€Ťă‚’ĺś°ĺ›łă«čż˝ĺŠ ă—ă‚ˆă†ă¨č©¦ăżăľă—ăźăŚă€ăťă®ăƒ¬ă‚¤ăƒ¤ăƒĽăŻć—˘ă«čż˝ĺŠ ă•ă‚Śă¦ă„ăľă™",'reprojectDeprecated':"あなたは「${layerName}」レイヤーで reproject ă‚Şăƒ—ă‚·ăƒ§ăƒłă‚’ä˝żăŁă¦ă„ăľă™ă€‚ă“ă®ă‚Şăƒ—ă‚·ăƒ§ăƒłăŻĺ•†ç”¨ă®ĺźşĺş•ĺś°ĺ›łä¸Šă«ćƒ…ĺ ±ă‚’čˇ¨ç¤şă™ă‚‹ç›®çš„ă§č¨­č¨ˆă•ă‚Śăľă—ăźăŚă€çŹľĺś¨ă§ăŻăťă®ć©źčƒ˝ăŻ Spherical Mercator ă‚µăƒťăƒĽăƒˆă‚’ĺˆ©ç”¨ă—ă¦ĺ®źçŹľă•ă‚Śă¦ăŠă‚Šă€ă“ă®ă‚Şăƒ—ă‚·ăƒ§ăƒłă®ä˝żç”¨ăŻéťžćŽ¨ĺĄ¨ă§ă™ă€‚čż˝ĺŠ ă®ćƒ…ĺ ±ăŻ http://trac.openlayers.org/wiki/SphericalMercator で入手できます。",'methodDeprecated':"このメソッドは廃止が予定されており、バージョン3.0で除去されます。代わりに ${newMethod} を使用してください。",'boundsAddError':"x と y 両方の値を add 関数に渡さなければなりません。",'lonlatAddError':"lon と lat 両方の値を add 関数に渡さなければなりません。",'pixelAddError':"x と y の値両方を add 関数に渡さなければなりません。",'unsupportedGeometryType':"未対応の形状型: ${geomType}",'pagePositionFailed':"OpenLayers.Util.pagePosition が失敗しました: id ${elemId} ă‚’ă‚‚ă¤č¦ç´ ăŚčŞ¤ăŁăźä˝Ťç˝®ă«ă‚ă‚‹ĺŹŻčƒ˝ć€§ăŚă‚ă‚Šăľă™ă€‚",'filterEvaluateNotImplemented':"このフィルター型について evaluate は実装されていません。"});OpenLayers.Lang["km"]=OpenLayers.Util.applyDefaults({'permalink':"តំណភ្ជាប់អចិន្ត្រៃយ៍",'baseLayer':"ស្រទាប់បាត​",'errorLoadingGML':"កំហុសកំឡុងពេលផ្ទុកឯកសារ GML ${url}",'scale':"មាត្រដ្ឋាន = ១ áź– ${scaleDenom}"});OpenLayers.Lang["ksh"]=OpenLayers.Util.applyDefaults({'unhandledRequest':"Met dä Antwoot op en Aanfrooch ham_mer nix aanjefange: ${statusText}",'permalink':"Lengk op Duuer",'overlays':"Drövver jelaat",'baseLayer':"Jrund-Nivoh",'sameProjection':"De Ă–vverseeschs_Kaat deiht et bloĂź, wann se de sälve Projäxjuhn bruche deiht, wi de Houp_Kaat",'readNotImplemented':"„\x3ccode lang=\"en\"\x3eread\x3c/code\x3e“ is em Projramm nit fĂĽrjesinn.",'writeNotImplemented':"„\x3ccode lang=\"en\"\x3ewrite\x3c/code\x3e“ is em Projramm nit fĂĽrjesinn.",'noFID':"En Saach, woh kein \x3ci lang=\"en\"\x3eFID\x3c/i\x3e för doh es, löht sesch nit ändere.",'errorLoadingGML':"Fähler beim \x3ci lang=\"en\"\x3eGML\x3c/i\x3e-Datei-Laade vun \x3ccode\x3e${url}\x3c/code\x3e",'browserNotSupported':"Dinge Brauser kann kein Väktore uĂźjävve. De Zoote UĂźjaabe, di em Momang jon, sen:\n${renderers}",'componentShouldBe':"\x3ccode lang=\"en\"\x3eaddFeatures\x3c/code\x3e: dä Aandeil sullt vun dä Zoot „\x3ccode lang=\"en\"\x3e${geomType}\x3c/code\x3e“ sin.",'getFeatureError':"\x3ccode lang=\"en\"\x3egetFeatureFromEvent\x3c/code\x3e es vun enem Nivoh opjeroofe woode, woh et kei Projramm zom UĂźjävve jit. Dat bedĂĽgg för jewöhnlesch, dat De e Nivoh kapott jemaat häs, ävver nit e Projramm för domet ömzejonn, wat domet verbonge es.",'minZoomLevelError':"De Eijeschaff „\x3ccode lang=\"en\"\x3eminZoomLevel\x3c/code\x3e“ es bloĂź doför jedaach, dat mer se met dä NivvohĂź bruch, di vun \x3ccode lang=\"en\"\x3eFixedZoomLevels\x3c/code\x3e affhange don. Dat dat \x3ci lang=\"en\"\x3eWFS\x3c/i\x3e-Nivvoh övverhoup de Eijeschaff „\x3ccode lang=\"en\"\x3eminZoomLevel\x3c/code\x3e“ pröhfe deiht, es noch övveresch vun fröhjer. Mer kĂĽnne dat ävver jez nit fott lohĂźe, oohne dat mer Jevaa loufe, dat Aanwendunge vun OpenLayers nit mieh loufe, di sesch doh velleijsch noch drop am verlohĂźe sin. Dröm sare mer, dat mer et nit mieh han welle, un de „\x3ccode lang=\"en\"\x3eminZoomLevel\x3c/code\x3e“-Eijeschaff weed hee vun de Version 3.0 af nit mieh jeprööf wäde. Nemm doför de Enstellung för de hĂĽhĂźte un de kleinĂźte Oplöhsung, esu wi et en http://trac.openlayers.org/wiki/SettingZoomLevels opjeschrevve es.",'commitSuccess':"Dä \x3ci lang=\"en\"\x3eWFS\x3c/i\x3e-Vörjang es joot jeloufe: ${response}",'commitFailed':"Dä \x3ci lang=\"en\"\x3eWFS\x3c/i\x3e-Vörjang es scheif jejange: ${response}",'googleWarning':"Dat Nivvoh \x3ccode lang=\"en\"\x3eGoogle\x3c/code\x3e kunnt nit reschtesch jelaade wääde.\x3cbr /\x3e\x3cbr /\x3eĂ–m hee di Nohreesch loĂź ze krijje, donn en ander Jrund-Nivvoh uĂźsöhke, rähĂź bovve en de Ă„k.\x3cbr /\x3e\x3cbr /\x3eWascheinlesch es dat wiel dat \x3ci lang=\"en\"\x3eGoogle-Maps\x3c/i\x3e-Skrepp entweeder nit reschtesch enjebonge wood, udder nit dä reschtejje \x3ci lang=\"en\"\x3eAPI\x3c/i\x3e-Schlößel för Ding Web-Ăźait scheke deiht.\x3cbr /\x3e\x3cbr /\x3eFör Projrammierer jidd_et Hölp do_drövver, \x3ca href=\"http://trac.openlayers.org/wiki/Google\" target=\"_blank\"\x3ewi mer dat aan et Loufe brengk\x3c/a\x3e.",'getLayerWarning':"Dat Nivvoh \x3ccode\x3e${layerType}\x3c/code\x3e kunnt nit reschtesch jelaade wääde.\x3cbr /\x3e\x3cbr /\x3eĂ–m hee di Nohreesch loĂź ze krijje, donn en ander Jrund-Nivvoh uĂźsöhkre, rähĂź bovve en de Ă„k.\x3cbr /\x3e\x3cbr /\x3eWascheinlesch es dat, wiel dat Skrepp \x3ccode\x3e${layerLib}\x3c/code\x3e nit reschtesch enjebonge wood.\x3cbr /\x3e\x3cbr /\x3eFör Projrammierer jidd_Et Hölp do_drövver, \x3ca href=\"http://trac.openlayers.org/wiki/${layerLib}\" target=\"_blank\"\x3ewi mer dat aan et Loufe brengk\x3c/a\x3e.",'scale':"MohĂźshtaab = 1 : ${scaleDenom}",'W':"W",'E':"O",'N':"N",'S':"S",'layerAlreadyAdded':"Do häß versöhk, dat Nivvoh \x3ccode\x3e${layerName}\x3c/code\x3e en di Kaat eren ze bränge, et wohr ävver ald do dren.",'reprojectDeprecated':"Do bruchs de UĂźwahl \x3ccode\x3ereproject\x3c/code\x3e op däm Nivvoh \x3ccode\x3e${layerName}\x3c/code\x3e. Di UĂźwahl es nit mieh jähn jesinn. Se wohr doför jedaach, öm Date op jeschääfsmäßesch eruĂź jejovve Kaate bovve drop ze moole, wat ävver enzwesche besser met dä Ă–ngershtözung för de Ăźfääresche Mäkaator Beldscher jeiht. Doh kanns De mieh drövver fenge op dä Sigg: http://trac.openlayers.org/wiki/SphericalMercator.",'methodDeprecated':"Hee di Metood es nim_mih aktoäll un et weed se en dä Version 3.0 nit mieh jävve. Nemm \x3ccode\x3e${newMethod}\x3c/code\x3e doföör.",'boundsAddError':"Do moĂź beeds vun de \x3ccode\x3ex\x3c/code\x3e un \x3ccode\x3ey\x3c/code\x3e Wääte aan de FungkĂźjohn \x3ccode\x3eadd\x3c/code\x3e jävve.",'lonlatAddError':"Do moĂź beeds \x3ccode\x3elon\x3c/code\x3e un \x3ccode\x3elat\x3c/code\x3e aan de FungkĂźjohn \x3ccode\x3eadd\x3c/code\x3e jävve.",'pixelAddError':"Do moĂź beeds \x3ccode\x3ex\x3c/code\x3e un \x3ccode\x3ey\x3c/code\x3e aan de FungkĂźjohn \x3ccode\x3eadd\x3c/code\x3e jävve.",'unsupportedGeometryType':"De Zoot Jommetrii dom_mer nit ongershtöze: \x3ccode\x3e${geomType}\x3c/code\x3e",'pagePositionFailed':"\x3ccode lang=\"en\"\x3eOpenLayers.Util.pagePosition\x3c/code\x3e es donevve jejange: dat Denge met dä Kännong \x3ccode\x3e${elemId}\x3c/code\x3e kĂĽnnt am verkeehte Plaz sin.",'filterEvaluateNotImplemented':"„\x3ccode lang=\"en\"\x3eevaluate\x3c/code\x3e“ es för di Zoot Fellter nit enjereschdt."});OpenLayers.Lang["nds"]=OpenLayers.Util.applyDefaults({'unhandledRequest':"Unbehannelt TrĂĽchmellels för de Anfraag ${statusText}",'permalink':"Permalink",'overlays':"Overlays",'baseLayer':"Achtergrundkoort",'sameProjection':"De Ă–versichtskoort geiht blot, wenn de sĂĽlve Projekschoon as bi de Hööftkoort bruukt warrt",'readNotImplemented':"Lesen is nich inricht.",'writeNotImplemented':"Schrieven is nich inricht.",'noFID':"En Feature, dat keen FID hett, kann nich aktuell maakt warrn.",'errorLoadingGML':"Fehler bi’t Laden vun de GML-Datei ${url}",'browserNotSupported':"Dien Browser ĂĽnnerstĂĽtt keen Vektorbiller. ĂśnnerstĂĽtt Renderers:\n${renderers}",'componentShouldBe':"addFeatures : Kumponent schull man den Typ ${geomType} hebben",'getFeatureError':"getFeatureFromEvent is von en Laag ahn Render opropen worrn. Dat bedĂĽĂĽdt normalerwies, dat en Laag wegmaakt worrn is, aver nich de Handler, de dor op verwiest.",'commitSuccess':"WFS-Transakschoon: hett klappt ${response}",'commitFailed':"WFS-Transakschoon: hett nich klappt ${response}",'scale':"Skaal = 1 : ${scaleDenom}",'layerAlreadyAdded':"Du versöchst de Laag „${layerName}“ to de Koort totofögen, man de is al toföögt",'methodDeprecated':"Disse Methood is oold un schall dat in 3.0 nich mehr geven. Bruuk dor man beter ${newMethod} för.",'boundsAddError':"De Weert x un y, de mööt all beid an de add-Funkschoon övergeven warrn.",'lonlatAddError':"De Weert lon un lat, de mööt all beid an de add-Funkschoon övergeven warrn.",'pixelAddError':"De Weert x un y, de mööt all beid an de add-Funkschoon övergeven warrn.",'unsupportedGeometryType':"Nich ĂĽnnerstĂĽtt Geometrie-Typ: ${geomType}",'pagePositionFailed':"OpenLayers.Util.pagePosition gĂĽng nich: Element mit de Id ${elemId} is villicht an’n verkehrten Platz."});OpenLayers.Lang["nn"]=OpenLayers.Util.applyDefaults({'scale':"Skala = 1 : ${scaleDenom}",'layerAlreadyAdded':"Du freista ĂĄ leggja til laget «${layerName}» pĂĄ kartet, men det har alt vorte lagt til.",'boundsAddError':"Du er nøydd til ĂĄ gje bĂĄde ein x- og ein y-verdi til «add»-funksjonen.",'lonlatAddError':"Du er nøydd til ĂĄ gje bĂĄde lon- og lat-verdiar til «add»-funksjonen.",'pixelAddError':"Du er nøydd til ĂĄ gje bĂĄde ein x- og ein y-verdi til «add»-funksjonen."});OpenLayers.Lang["oc"]=OpenLayers.Util.applyDefaults({'unhandledRequest':"Requèsta pas gerida, retorna ${statusText}",'permalink':"Permaligam",'overlays':"Calques",'baseLayer':"Calc de basa",'sameProjection':"La carta de situacion fonciona pas que quora sa projeccion es la meteissa que la de la carta principala",'readNotImplemented':"Lectura pas implementada.",'writeNotImplemented':"Escritura pas implementada.",'noFID':"Impossible de metre a jorn un objècte sens identificant (fid).",'errorLoadingGML':"Error al cargament del fichièr GML ${url}",'browserNotSupported':"Vòstre navegidor supòrta pas lo rendut vectorial. Los renderers actualament suportats son : \n${renderers}",'componentShouldBe':"addFeatures : lo compausant deuriá èsser de tipe ${geomType}",'getFeatureError':"getFeatureFromEvent es estat apelat sus un calc sens renderer. Aquò significa generalament qu\'avètz destruch aqueste jaç, mas qu\'avètz conservat un handler que li èra associat.",'minZoomLevelError':"La proprietat minZoomLevel deu èsser utilizada solament per de jaces FixedZoomLevels-descendent. Lo fach qu\'aqueste jaç WFS verifique la presĂ©ncia de minZoomLevel es una relica del passat. ÇaquelĂ , la podèm suprimir sens copar d\'aplicacions que ne poirián dependre. Es per aquò que la depreciam -- la verificacion del minZoomLevel serĂ suprimida en version 3.0. A la plaça, mercĂ©s d\'utilizar los paramètres de resolucions min/max tal coma descrich sus : http://trac.openlayers.org/wiki/SettingZoomLevels",'commitSuccess':"Transaccion WFS : SUCCES ${response}",'commitFailed':"Transaccion WFS : FRACAS ${response}",'googleWarning':"Lo jaç Google es pas estat en mesura de se cargar corrèctament.\x3cbr\x3e\x3cbr\x3ePer suprimir aqueste messatge, causissètz una BaseLayer novèla dins lo selector de jaç en naut a drecha.\x3cbr\x3e\x3cbr\x3eAquò es possiblament causat par la non-inclusion de la librariá Google Maps, o alara perque que la clau de l\'API correspond pas a vòstre site.\x3cbr\x3e\x3cbr\x3eDesvolopaires : per saber cossĂ­ corregir aquò, \x3ca href=\'http://trac.openlayers.org/wiki/Google\' target=\'_blank\'\x3eclicatz aicĂ­\x3c/a\x3e",'getLayerWarning':"Lo jaç ${layerType} es pas en mesura de se cargar corrèctament.\x3cbr\x3e\x3cbr\x3ePer suprimir aqueste messatge, causissètz una BaseLayer novèla dins lo selector de jaç en naut a drecha.\x3cbr\x3e\x3cbr\x3eAquò es possiblament causat per la non-inclusion de la librariá ${layerLib}.\x3cbr\x3e\x3cbr\x3eDesvolopaires : per saber cossĂ­ corregir aquĂ­, \x3ca href=\'http://trac.openlayers.org/wiki/${layerLib}\' target=\'_blank\'\x3eclicatz aicĂ­\x3c/a\x3e",'scale':"Escala ~ 1 : ${scaleDenom}",'W':"O",'E':"È",'N':"N",'S':"S",'layerAlreadyAdded':"Avètz ensajat d\'apondre a la carta lo calc : ${layerName}, mas ja es present",'reprojectDeprecated':"Utilizatz l\'opcion \'reproject\' sul jaç ${layerName}. Aquesta opcion es despreciada : Son usatge permetiá d\'afichar de donadas al dessĂşs de jaces raster comercials. Aquesta foncionalitat ara es suportada en utilizant lo supòrt de la projeccion Mercator Esferica. Mai d\'informacion es disponibla sus http://trac.openlayers.org/wiki/SphericalMercator.",'methodDeprecated':"Aqueste metòde es despreciada, e serĂ suprimida a la version 3.0. MercĂ©s d\'utilizar ${newMethod} a la plaça.",'boundsAddError':"Vos cal passar las doas valors x e y a la foncion add.",'lonlatAddError':"Vos cal passar las doas valors lon e lat a la foncion add.",'pixelAddError':"Vos cal passar las doas valors x e y a la foncion add.",'unsupportedGeometryType':"Tipe de geometria pas suportat : ${geomType}",'pagePositionFailed':"OpenLayers.Util.pagePosition a fracassat : l\'element d\'id ${elemId} poiriá èsser mal posicionat.",'filterEvaluateNotImplemented':"evaluar es pas encara estat implementat per aqueste tipe de filtre."});OpenLayers.Lang["pt"]=OpenLayers.Util.applyDefaults({'unhandledRequest':"Servidor devolveu erro nĂŁo contemplado ${statusText}",'permalink':"Ligação permanente",'overlays':"Sobreposições",'baseLayer':"Camada Base",'sameProjection':"O mapa panorâmico sĂł funciona quando está na mesma projeção que o mapa principal",'readNotImplemented':"Leitura nĂŁo implementada.",'writeNotImplemented':"Escrita nĂŁo implementada.",'noFID':"NĂŁo Ă© possĂ­vel atualizar um elemento para a qual nĂŁo há FID.",'errorLoadingGML':"Erro ao carregar ficheiro GML ${url}",'browserNotSupported':"O seu navegador nĂŁo suporta renderização vetorial. Actualmente os renderizadores suportados sĂŁo:\n${renderers}",'componentShouldBe':"addFeatures: componente deve ser um(a) ${geomType}",'getFeatureError':"getFeatureFromEvent foi chamado numa camada sem renderizador. Isto normalmente significa que destruiu uma camada, mas nĂŁo um manipulador \'\'(handler)\'\' que lhe está associado.",'minZoomLevelError':"A propriedade minZoomLevel sĂł deve ser usada com as camadas descendentes da FixedZoomLevels. A verificação da propriedade por esta camada wfs Ă© uma relĂ­quia do passado. No entanto, nĂŁo podemos removĂŞ-la sem correr o risco de afectar aplicações OL que dependam dela. Portanto, estamos a torná-la obsoleta -- a verificação minZoomLevel será removida na versĂŁo 3.0. Em vez dela, por favor, use as opções de resolução min/max descritas aqui: http://trac.openlayers.org/wiki/SettingZoomLevels",'commitSuccess':"Transacção WFS: SUCESSO ${response}",'commitFailed':"Transacção WFS: FALHOU ${response}",'googleWarning':"A Camada Google nĂŁo foi correctamente carregada.\x3cbr\x3e\x3cbr\x3ePara deixar de receber esta mensagem, seleccione uma nova Camada-Base no \'\'switcher\'\' de camadas no canto superior direito.\x3cbr\x3e\x3cbr\x3eProvavelmente, isto acontece porque o \'\'script\'\' da biblioteca do Google Maps nĂŁo foi incluĂ­do ou nĂŁo contĂ©m a chave API correcta para o seu sĂ­tio.\x3cbr\x3e\x3cbr\x3eProgramadores: Para ajuda sobre como solucionar o problema \x3ca href=\'http://trac.openlayers.org/wiki/Google\' target=\'_blank\'\x3eclique aqui\x3c/a\x3e .",'getLayerWarning':"A camada ${layerType} nĂŁo foi correctamente carregada.\x3cbr\x3e\x3cbr\x3ePara desactivar esta mensagem, seleccione uma nova Camada-Base no \'\'switcher\'\' de camadas no canto superior direito.\x3cbr\x3e\x3cbr\x3eProvavelmente, isto acontece porque o \'\'script\'\' da biblioteca ${layerLib} nĂŁo foi incluĂ­do correctamente.\x3cbr\x3e\x3cbr\x3eProgramadores: Para ajuda sobre como solucionar o problema \x3ca href=\'http://trac.openlayers.org/wiki/${layerLib}\' target=\'_blank\'\x3eclique aqui\x3c/a\x3e .",'scale':"Escala = 1 : ${scaleDenom}",'W':"O",'E':"E",'N':"N",'S':"S",'layerAlreadyAdded':"VocĂŞ tentou adicionar a camada: ${layerName} ao mapa, mas ela já tinha sido adicionada antes",'reprojectDeprecated':"Está usando a opção \'reproject\' na camada ${layerName}. Esta opção Ă© obsoleta: foi concebida para permitir a apresentação de dados sobre mapas-base comerciais, mas esta funcionalidade Ă© agora suportada pelo Mercator EsfĂ©rico. Mais informação está disponĂ­vel em http://trac.openlayers.org/wiki/SphericalMercator.",'methodDeprecated':"Este mĂ©todo foi declarado obsoleto e será removido na versĂŁo 3.0. Por favor, use ${newMethod} em vez disso.",'boundsAddError':"VocĂŞ deve passar tanto o valor x como o y Ă função de adição.",'lonlatAddError':"VocĂŞ deve passar tanto o valor lon como o lat Ă função de adição.",'pixelAddError':"VocĂŞ deve passar tanto o valor x como o y Ă função de adição.",'unsupportedGeometryType':"Tipo de geometria nĂŁo suportado: ${geomType}",'pagePositionFailed':"OpenLayers.Util.pagePosition falhou: o elemento com o id ${elemId} poderá estar mal-posicionado.",'filterEvaluateNotImplemented':"avaliar nĂŁo está implementado para este tipo de filtro."});OpenLayers.Lang["ru"]=OpenLayers.Util.applyDefaults({'unhandledRequest':"Необработанный запрос вернул ${statusText}",'permalink':"Постоянная ссылка",'overlays':"Слои",'baseLayer':"Основной слой",'sameProjection':"Обзорная карта работает только тогда, когда имеет ту же проекцию, что и основная",'readNotImplemented':"Чтение не реализовано.",'writeNotImplemented':"Запись не реализована.",'noFID':"Невозможно обновить объект, для которого нет FID.",'errorLoadingGML':"Ошибка при загрузке файла GML ${url}",'browserNotSupported':"Ваш браузер не поддерживает векторную графику. На данный момент поддерживаются:\n${renderers}",'componentShouldBe':"addFeatures: компонент должен быть ${geomType}",'getFeatureError':"getFeatureFromEvent вызван для слоя без рендерера. Обычно ŃŤŃ‚Đľ говорит Đľ том, что вы уничтожили слой, но оставили связанный с ним обработчик.",'minZoomLevelError':"Свойство minZoomLevel предназначено только для использования со слоями, являющимися потомками FixedZoomLevels. То, что этот WFS-слой проверяется на minZoomLevel — реликт прошлого. Однако ĐĽŃ‹ не можем удалить эту функцию, Ń‚Đ°Đş как, возможно, от неё зависят некоторые основанные на OpenLayers приложения. Функция объявлена устаревшей — проверка minZoomLevel будет удалена в 3.0. Пожалуйста, используйте вместо неё настройку мин/макс разрешения, описанную здесь: http://trac.openlayers.org/wiki/SettingZoomLevels",'commitSuccess':"Транзакция WFS: УСПЕШНО ${response}",'commitFailed':"Транзакция WFS: ОШИБКА ${response}",'googleWarning':"Слой Google не удалось нормально загрузить.\x3cbr\x3e\x3cbr\x3eЧтобы избавиться от этого сообщения, выбите другой основной слой в переключателе в правом верхнем углу.\x3cbr\x3e\x3cbr\x3eСкорее всего, причина в том, что библиотека Google Maps не была включена или не содержит корректного API-ключа для вашего сайта.\x3cbr\x3e\x3cbr\x3eРазработчикам: чтобы узнать, как сделать, чтобы всё заработало, \x3ca href=\'http://trac.openlayers.org/wiki/Google\' target=\'_blank\'\x3eщёлкните тут\x3c/a\x3e",'getLayerWarning':"Слой ${layerType} не удалось нормально загрузить. \x3cbr\x3e\x3cbr\x3eЧтобы избавиться от этого сообщения, выбите другой основной слой в переключателе в правом верхнем углу.\x3cbr\x3e\x3cbr\x3eСкорее всего, причина в том, что библиотека ${layerLib} не была включена или была включена некорректно.\x3cbr\x3e\x3cbr\x3eРазработчикам: чтобы узнать, как сделать, чтобы всё заработало, \x3ca href=\'http://trac.openlayers.org/wiki/${layerLib}\' target=\'_blank\'\x3eщёлкните тут\x3c/a\x3e",'scale':"Масштаб = 1 : ${scaleDenom}",'W':"Đ—",'E':"Đ’",'N':"С",'S':"Đ®",'layerAlreadyAdded':"Đ’Ń‹ попытались добавить слой «${layerName}» на карту, но он уже был добавлен",'reprojectDeprecated':"Đ’Ń‹ используете опцию \'reproject\' для слоя ${layerName}. Đ­Ń‚Đ° опция является устаревшей: ее использование предполагалось для поддержки показа данных поверх коммерческих базовых карт, но теперь этот функционал несёт встроенная поддержка сферической проекции Меркатора. Больше сведений доступно на http://trac.openlayers.org/wiki/SphericalMercator.",'methodDeprecated':"Этот метод считается устаревшим и будет удалён в версии 3.0. Пожалуйста, пользуйтесь ${newMethod}.",'boundsAddError':"Функции add надо передавать оба значения, x и y.",'lonlatAddError':"Функции add надо передавать оба значения, lon и lat.",'pixelAddError':"Функции add надо передавать оба значения, x и y.",'unsupportedGeometryType':"Неподдерживаемый тип геометрии: ${geomType}",'pagePositionFailed':"OpenLayers.Util.pagePosition failed: элемент с id ${elemId} может находиться не в нужном месте.",'filterEvaluateNotImplemented':"evaluate не реализовано для фильтра данного типа."});OpenLayers.Lang["sk"]=OpenLayers.Util.applyDefaults({'unhandledRequest':"NeobslúženĂ© poĹľiadavky vracajĂş ${statusText}",'permalink':"TrvalĂ˝ odkaz",'overlays':"Prekrytia",'baseLayer':"Základná vrstva",'sameProjection':"PrehÄľadová mapka funguje iba vtedy, keÄŹ je v rovnakej projekcii ako hlavná mapa",'readNotImplemented':"ÄŚĂ­tanie nie je implementovanĂ©.",'writeNotImplemented':"Zápis nie je implementovanĂ˝.",'noFID':"Nie je moĹľnĂ© aktualizovaĹĄ vlastnosĹĄ, pre ktorĂş neexistuje FID.",'errorLoadingGML':"Chyba pri naÄŤĂ­tanĂ­ sĂşboru GML ${url}",'browserNotSupported':"Váš prehliadaÄŤ nepodporuje vykresÄľovanie vektorov. Momentálne podporovanĂ© vykresÄľovaÄŤe sĂş:\n${renderers}",'componentShouldBe':"addFeatures: komponent by mal byĹĄ ${geomType}",'getFeatureError':"getFeatureFromEvent bola zavolaná na vrstve bez vykresÄľovaÄŤa. To zvyÄŤajne znamená, Ĺľe ste odstránili vrstvu, ale nie niektorĂş z obslĂşh, ktorá je s ňou asociovaná.",'minZoomLevelError':"VlastnosĹĄ minZoomLevel je urÄŤenĂ˝ iba na pouĹľitie s vrstvami odvodenĂ˝mi od FixedZoomLevels. To, Ĺľe táto wfs vrstva kontroluje minZoomLevel je pozostatok z minulosti. NemĂ´Ĺľeme ho však odstrániĹĄ, aby sme sa vyhli moĹľnĂ©mu porušeniu aplikáciĂ­ zaloĹľenĂ˝ch na Open Layers, ktorĂ© na tomto mĂ´Ĺľe závisieĹĄ. Preto ho oznaÄŤujeme ako zavrhovanĂ˝ - dolu uvedená kontrola minZoomLevel bude odstránená vo verzii 3.0. PouĹľite prosĂ­m namiesto toho kontrolu min./max. rozlíšenia podÄľa tu uvedenĂ©ho popisu: http://trac.openlayers.org/wiki/SettingZoomLevels",'commitSuccess':"Transakcia WFS: ĂšSPEĹ NÁ ${response}",'commitFailed':"Transakcia WFS: ZLYHALA ${response}",'googleWarning':"Vrstvu Google nebolo moĹľnĂ© správne naÄŤĂ­taĹĄ.\x3cbr\x3e\x3cbr\x3eAby ste sa tejto správy zbavili vyberte novĂş BaseLayer v prepĂ­naÄŤi vrstiev v pravom hornom rohu.\x3cbr\x3e\x3cbr\x3eToto sa stalo pravdepodobne preto, Ĺľe skript kniĹľnice Google Maps buÄŹ nebol naÄŤĂ­tanĂ˝ alebo neobsahuje správny kľúč API pre vašu lokalitu.\x3cbr\x3e\x3cbr\x3eVĂ˝vojári: Tu mĂ´Ĺľete zĂ­skaĹĄ \x3ca href=\'http://trac.openlayers.org/wiki/Google\' target=\'_blank\'\x3epomoc so sfunkÄŤnenĂ­m\x3c/a\x3e",'getLayerWarning':"Vrstvu ${layerType} nebolo moĹľnĂ© správne naÄŤĂ­taĹĄ.\x3cbr\x3e\x3cbr\x3eAby ste sa tejto správy zbavili vyberte novĂş BaseLayer v prepĂ­naÄŤi vrstiev v pravom hornom rohu.\x3cbr\x3e\x3cbr\x3eToto sa stalo pravdepodobne preto, Ĺľe skript kniĹľnice ${layerType} buÄŹ nebol naÄŤĂ­tanĂ˝ alebo neobsahuje správny kľúč API pre vašu lokalitu.\x3cbr\x3e\x3cbr\x3eVĂ˝vojári: Tu mĂ´Ĺľete zĂ­skaĹĄ \x3ca href=\'http://trac.openlayers.org/wiki/${layerType}\' target=\'_blank\'\x3epomoc so sfunkÄŤnenĂ­m\x3c/a\x3e",'scale':"Mierka = 1 : ${scaleDenom}",'layerAlreadyAdded':"PokĂşsili ste sa do mapy pridaĹĄ vrstvu ${layerName}, ale tá uĹľ bola pridaná",'reprojectDeprecated':"Používate voÄľby „reproject“ vrstvy ${layerType}. Táto voÄľba je zzavrhovaná: jej pouĹľitie bolo navrhnutĂ© na podporu zobrazovania Ăşdajov nad komerÄŤnĂ˝mi základovĂ˝mi mapami, ale tĂşto funkcionalitu je teraz moĹľnĂ© dosiahnuĹĄ pomocou Spherical Mercator. ÄŽalšie informácie zĂ­skate na stránke http://trac.openlayers.org/wiki/SphericalMercator.",'methodDeprecated':"Táto metĂłda je zavrhovaná a bude odstránená vo verzii 3.0. PouĹľite prosĂ­m namiesto nej metĂłdu ${newMethod}.",'boundsAddError':"SÄŤĂ­tacej funkcii musĂ­te daĹĄ hodnoty x aj y.",'lonlatAddError':"SÄŤĂ­tacej funkcii musĂ­te daĹĄ hodnoty lon (zem. dĺžka) aj lat (zem. šírka).",'pixelAddError':"SÄŤĂ­tacej funkcii musĂ­te daĹĄ hodnoty x aj y.",'unsupportedGeometryType':"NepodporovanĂ˝ typ geometrie: ${geomType}",'pagePositionFailed':"OpenLayers.Util.pagePosition zlyhalo: prvok s id ${elemId} mĂ´Ĺľe byĹĄ zle umiestnenĂ˝.",'filterEvaluateNotImplemented':"evaluate nie je implementovanĂ˝ pre tento typ filtra"});OpenLayers.Lang["te"]=OpenLayers.Util.applyDefaults({'permalink':"స్థిరలింకు",'W':"ŕ°Ş",'E':"తూ",'N':"ŕ°‰",'S':"ŕ°¦"});OpenLayers.Lang["vi"]=OpenLayers.Util.applyDefaults({'unhandledRequest':"KhĂ´ng xá»­ lĂ˝ được phản hồi ${statusText} cho yĂŞu cầu",'permalink':"LiĂŞn káşżt thường trá»±c",'overlays':"Lấp bản đồ",'baseLayer':"Lá»›p nền",'sameProjection':"Bản đồ toĂ n cảnh chỉ hoạt Ä‘á»™ng khi cĂąng phĂ©p chiáşżu vá»›i bản đồ chĂ­nh",'readNotImplemented':"ChĆ°a há»— trợ chức năng đọc.",'writeNotImplemented':"ChĆ°a há»— trợ chức năng viáşżt.",'noFID':"KhĂ´ng thể cáş­p nháş­t tĂ­nh năng thiáşżu FID.",'errorLoadingGML':"Lá»—i tải táş­p tin GML tại ${url}",'browserNotSupported':"Trình duyệt của bạn khĂ´ng há»— trợ chức năng váş˝ báş±ng vectơ. Hiện há»— trợ các bá»™ káşżt xuất:\n${renderers}",'componentShouldBe':"addFeatures: bá»™ pháş­n cần phải lĂ ${geomType}",'getFeatureError':"getFeatureFromEvent được gọi từ lá»›p khĂ´ng cĂł bá»™ káşżt xuất. Thường thì cĂł láş˝ lá»›p bị xĂła nhĆ°ng má»™t phần xá»­ lĂ˝ của nĂł váş«n còn.",'minZoomLevelError':"Chỉ nĂŞn sá»­ dụng thuá»™c tĂ­nh minZoomLevel vá»›i các lá»›p FixedZoomLevels-descendent. Việc lá»›p wfs nĂ y tìm cho minZoomLevel lĂ di tĂ­ch còn lại từ xĆ°a. Tuy nhiĂŞn, náşżu chĂşng tĂ´i dời nĂł thì sáş˝ vỡ các chương trình OpenLayers mĂ dá»±a trĂŞn nĂł. Bởi váş­y chĂşng tĂ´i phản đối sá»­ dụng nĂł\x26nbsp;– bĆ°á»›c tìm cho minZoomLevel sáş˝ được dời vĂ o phiĂŞn bản 3.0. Xin sá»­ dụng thiáşżt láş­p Ä‘á»™ phân tĂ­ch tối thiểu / tối Ä‘a thay tháşż, theo hĆ°á»›ng dáş«n nĂ y: http://trac.openlayers.org/wiki/SettingZoomLevels",'commitSuccess':"Giao dịch WFS: THĂ€NH CĂ”NG ${response}",'commitFailed':"Giao dịch WFS: THẤT Báş I ${response}",'googleWarning':"KhĂ´ng thể tải lá»›p Google Ä‘Ăşng đắn.\x3cbr\x3e\x3cbr\x3eĐể tránh thĂ´ng báo nĂ y lần sau, hĂŁy chọn BaseLayer má»›i dĂąng Ä‘iều khiển chọn lá»›p ở gĂłc trĂŞn phải.\x3cbr\x3e\x3cbr\x3eChắc script thĆ° viện Google Maps hoáş·c khĂ´ng được bao gồm hoáş·c khĂ´ng chứa khĂła API hợp vá»›i website của bạn.\x3cbr\x3e\x3cbr\x3e\x3ca href=\'http://trac.openlayers.org/wiki/Google\' target=\'_blank\'\x3eTrợ giĂşp về tĂ­nh năng nĂ y\x3c/a\x3e cho người phát triển.",'getLayerWarning':"KhĂ´ng thể tải lá»›p ${layerType} Ä‘Ăşng đắn.\x3cbr\x3e\x3cbr\x3eĐể tránh thĂ´ng báo nĂ y lần sau, hĂŁy chọn BaseLayer má»›i dĂąng Ä‘iều khiển chọn lá»›p ở gĂłc trĂŞn phải.\x3cbr\x3e\x3cbr\x3eChắc script thĆ° viện ${layerLib} khĂ´ng được bao gồm Ä‘Ăşng kiểu.\x3cbr\x3e\x3cbr\x3e\x3ca href=\'http://trac.openlayers.org/wiki/${layerLib}\' target=\'_blank\'\x3eTrợ giĂşp về tĂ­nh năng nĂ y\x3c/a\x3e cho người phát triển.",'scale':"Tá»· lệ = 1 : ${scaleDenom}",'W':"T",'E':"Đ",'N':"B",'S':"N",'layerAlreadyAdded':"Bạn muốn thĂŞm lá»›p ${layerName} vĂ o bản đồ, nhĆ°ng lá»›p nĂ y Ä‘ĂŁ được thĂŞm",'reprojectDeprecated':"Bạn Ä‘ang áp dụng cháşż Ä‘á»™ “reproject” vĂ o lá»›p ${layerName}. Cháşż Ä‘á»™ nĂ y Ä‘ĂŁ bị phản đối: nĂł cĂł mục Ä‘Ă­ch há»— trợ lấp dữ liệu trĂŞn các nền bản đồ thương mại; nĂŞn thá»±c hiện hiệu ứng Ä‘Ăł dĂąng tĂ­nh năng Mercator Hình cầu. CĂł sáşµn thĂŞm chi tiáşżt tại http://trac.openlayers.org/wiki/SphericalMercator .",'methodDeprecated':"Phương thức nĂ y Ä‘ĂŁ bị phản đối vĂ sáş˝ bị dời vĂ o phiĂŞn bản 3.0. Xin hĂŁy sá»­ dụng ${newMethod} thay tháşż.",'boundsAddError':"Cần phải cho cả giá trị x vĂ y vĂ o hĂ m add.",'lonlatAddError':"Cần phải cho cả giá trị lon vĂ lat vĂ o hĂ m add.",'pixelAddError':"Cần phải cho cả giá trị x vĂ y vĂ o hĂ m add.",'unsupportedGeometryType':"KhĂ´ng há»— trợ kiểu địa lĂ˝: ${geomType}",'pagePositionFailed':"OpenLayers.Util.pagePosition bị thất bại: nguyĂŞn tố vá»›i ID ${elemId} cĂł thể ở chá»— sai.",'filterEvaluateNotImplemented':"chĆ°a há»— trợ evaluate cho loại bá»™ lọc nĂ y."});OpenLayers.Popup.AnchoredBubble=OpenLayers.Class(OpenLayers.Popup.Anchored,{rounded:false,initialize:function(id,lonlat,contentSize,contentHTML,anchor,closeBox,closeBoxCallback){this.padding=new OpenLayers.Bounds(0,OpenLayers.Popup.AnchoredBubble.CORNER_SIZE,0,OpenLayers.Popup.AnchoredBubble.CORNER_SIZE);OpenLayers.Popup.Anchored.prototype.initialize.apply(this,arguments);},draw:function(px){OpenLayers.Popup.Anchored.prototype.draw.apply(this,arguments);this.setContentHTML();this.setBackgroundColor();this.setOpacity();return this.div;},updateRelativePosition:function(){this.setRicoCorners();},setSize:function(contentSize){OpenLayers.Popup.Anchored.prototype.setSize.apply(this,arguments);this.setRicoCorners();},setBackgroundColor:function(color){if(color!=undefined){this.backgroundColor=color;} +if(this.div!=null){if(this.contentDiv!=null){this.div.style.background="transparent";OpenLayers.Rico.Corner.changeColor(this.groupDiv,this.backgroundColor);}}},setOpacity:function(opacity){OpenLayers.Popup.Anchored.prototype.setOpacity.call(this,opacity);if(this.div!=null){if(this.groupDiv!=null){OpenLayers.Rico.Corner.changeOpacity(this.groupDiv,this.opacity);}}},setBorder:function(border){this.border=0;},setRicoCorners:function(){var corners=this.getCornersToRound(this.relativePosition);var options={corners:corners,color:this.backgroundColor,bgColor:"transparent",blend:false};if(!this.rounded){OpenLayers.Rico.Corner.round(this.div,options);this.rounded=true;}else{OpenLayers.Rico.Corner.reRound(this.groupDiv,options);this.setBackgroundColor();this.setOpacity();}},getCornersToRound:function(){var corners=['tl','tr','bl','br'];var corner=OpenLayers.Bounds.oppositeQuadrant(this.relativePosition);OpenLayers.Util.removeItem(corners,corner);return corners.join(" ");},CLASS_NAME:"OpenLayers.Popup.AnchoredBubble"});OpenLayers.Popup.AnchoredBubble.CORNER_SIZE=5;OpenLayers.Popup.Framed=OpenLayers.Class(OpenLayers.Popup.Anchored,{imageSrc:null,imageSize:null,isAlphaImage:false,positionBlocks:null,blocks:null,fixedRelativePosition:false,initialize:function(id,lonlat,contentSize,contentHTML,anchor,closeBox,closeBoxCallback){OpenLayers.Popup.Anchored.prototype.initialize.apply(this,arguments);if(this.fixedRelativePosition){this.updateRelativePosition();this.calculateRelativePosition=function(px){return this.relativePosition;};} +this.contentDiv.style.position="absolute";this.contentDiv.style.zIndex=1;if(closeBox){this.closeDiv.style.zIndex=1;} +this.groupDiv.style.position="absolute";this.groupDiv.style.top="0px";this.groupDiv.style.left="0px";this.groupDiv.style.height="100%";this.groupDiv.style.width="100%";},destroy:function(){this.imageSrc=null;this.imageSize=null;this.isAlphaImage=null;this.fixedRelativePosition=false;this.positionBlocks=null;for(var i=0;i=200&&request.status<300){response.features=this.parseFeatures(request);response.code=OpenLayers.Protocol.Response.SUCCESS;}else{response.code=OpenLayers.Protocol.Response.FAILURE;} +options.callback.call(options.scope,response);}},parseFeatures:function(request){var doc=request.responseXML;if(!doc||!doc.documentElement){doc=request.responseText;} +if(!doc||doc.length<=0){return null;} +return(this.readFormat!==null)?this.readFormat.read(doc):this.format.read(doc);},commit:function(features,options){options=OpenLayers.Util.extend({},options);OpenLayers.Util.applyDefaults(options,this.options);var response=new OpenLayers.Protocol.Response({requestType:"commit",reqFeatures:features});response.priv=OpenLayers.Request.POST({url:options.url,data:this.format.write(features,options),callback:this.createCallback(this.handleCommit,response,options)});return response;},handleCommit:function(response,options){if(options.callback){var request=response.priv;var data=request.responseXML;if(!data||!data.documentElement){data=request.responseText;} +var obj=this.format.read(data)||{};response.insertIds=obj.insertIds||[];response.code=(obj.success)?OpenLayers.Protocol.Response.SUCCESS:OpenLayers.Protocol.Response.FAILURE;options.callback.call(options.scope,response);}},filterDelete:function(filter,options){options=OpenLayers.Util.extend({},options);OpenLayers.Util.applyDefaults(options,this.options);var response=new OpenLayers.Protocol.Response({requestType:"commit"});var root=this.format.createElementNSPlus("wfs:Transaction",{attributes:{service:"WFS",version:this.version}});var deleteNode=this.format.createElementNSPlus("wfs:Delete",{attributes:{typeName:(options.featureNS?this.featurePrefix+":":"")+ +options.featureType}});if(options.featureNS){deleteNode.setAttribute("xmlns:"+this.featurePrefix,options.featureNS);} +var filterNode=this.format.writeNode("ogc:Filter",filter);deleteNode.appendChild(filterNode);root.appendChild(deleteNode);var data=OpenLayers.Format.XML.prototype.write.apply(this.format,[root]);return OpenLayers.Request.POST({url:this.url,callback:options.callback||function(){},data:data});},abort:function(response){if(response){response.priv.abort();}},CLASS_NAME:"OpenLayers.Protocol.WFS.v1"});OpenLayers.Renderer.SVG=OpenLayers.Class(OpenLayers.Renderer.Elements,{xmlns:"http://www.w3.org/2000/svg",xlinkns:"http://www.w3.org/1999/xlink",MAX_PIXEL:15000,translationParameters:null,symbolMetrics:null,isGecko:null,supportUse:null,initialize:function(containerID){if(!this.supported()){return;} +OpenLayers.Renderer.Elements.prototype.initialize.apply(this,arguments);this.translationParameters={x:0,y:0};this.supportUse=(navigator.userAgent.toLowerCase().indexOf("applewebkit/5")==-1);this.isGecko=(navigator.userAgent.toLowerCase().indexOf("gecko/")!=-1);this.symbolMetrics={};},destroy:function(){OpenLayers.Renderer.Elements.prototype.destroy.apply(this,arguments);},supported:function(){var svgFeature="http://www.w3.org/TR/SVG11/feature#";return(document.implementation&&(document.implementation.hasFeature("org.w3c.svg","1.0")||document.implementation.hasFeature(svgFeature+"SVG","1.1")||document.implementation.hasFeature(svgFeature+"BasicStructure","1.1")));},inValidRange:function(x,y,xyOnly){var left=x+(xyOnly?0:this.translationParameters.x);var top=y+(xyOnly?0:this.translationParameters.y);return(left>=-this.MAX_PIXEL&&left<=this.MAX_PIXEL&&top>=-this.MAX_PIXEL&&top<=this.MAX_PIXEL);},setExtent:function(extent,resolutionChanged){OpenLayers.Renderer.Elements.prototype.setExtent.apply(this,arguments);var resolution=this.getResolution();var left=-extent.left/resolution;var top=extent.top/resolution;if(resolutionChanged){this.left=left;this.top=top;var extentString="0 0 "+this.size.w+" "+this.size.h;this.rendererRoot.setAttributeNS(null,"viewBox",extentString);this.translate(0,0);return true;}else{var inRange=this.translate(left-this.left,top-this.top);if(!inRange){this.setExtent(extent,true);} +return inRange;}},translate:function(x,y){if(!this.inValidRange(x,y,true)){return false;}else{var transformString="";if(x||y){transformString="translate("+x+","+y+")";} +this.root.setAttributeNS(null,"transform",transformString);this.translationParameters={x:x,y:y};return true;}},setSize:function(size){OpenLayers.Renderer.prototype.setSize.apply(this,arguments);this.rendererRoot.setAttributeNS(null,"width",this.size.w);this.rendererRoot.setAttributeNS(null,"height",this.size.h);},getNodeType:function(geometry,style){var nodeType=null;switch(geometry.CLASS_NAME){case"OpenLayers.Geometry.Point":if(style.externalGraphic){nodeType="image";}else if(this.isComplexSymbol(style.graphicName)){nodeType=this.supportUse===false?"svg":"use";}else{nodeType="circle";} +break;case"OpenLayers.Geometry.Rectangle":nodeType="rect";break;case"OpenLayers.Geometry.LineString":nodeType="polyline";break;case"OpenLayers.Geometry.LinearRing":nodeType="polygon";break;case"OpenLayers.Geometry.Polygon":case"OpenLayers.Geometry.Curve":case"OpenLayers.Geometry.Surface":nodeType="path";break;default:break;} +return nodeType;},setStyle:function(node,style,options){style=style||node._style;options=options||node._options;var r=parseFloat(node.getAttributeNS(null,"r"));var widthFactor=1;var pos;if(node._geometryClass=="OpenLayers.Geometry.Point"&&r){node.style.visibility="";if(style.graphic===false){node.style.visibility="hidden";}else if(style.externalGraphic){pos=this.getPosition(node);if(style.graphicTitle){node.setAttributeNS(null,"title",style.graphicTitle);} +if(style.graphicWidth&&style.graphicHeight){node.setAttributeNS(null,"preserveAspectRatio","none");} +var width=style.graphicWidth||style.graphicHeight;var height=style.graphicHeight||style.graphicWidth;width=width?width:style.pointRadius*2;height=height?height:style.pointRadius*2;var xOffset=(style.graphicXOffset!=undefined)?style.graphicXOffset:-(0.5*width);var yOffset=(style.graphicYOffset!=undefined)?style.graphicYOffset:-(0.5*height);var opacity=style.graphicOpacity||style.fillOpacity;node.setAttributeNS(null,"x",(pos.x+xOffset).toFixed());node.setAttributeNS(null,"y",(pos.y+yOffset).toFixed());node.setAttributeNS(null,"width",width);node.setAttributeNS(null,"height",height);node.setAttributeNS(this.xlinkns,"href",style.externalGraphic);node.setAttributeNS(null,"style","opacity: "+opacity);}else if(this.isComplexSymbol(style.graphicName)){var offset=style.pointRadius*3;var size=offset*2;var id=this.importSymbol(style.graphicName);pos=this.getPosition(node);widthFactor=this.symbolMetrics[id][0]*3/size;var parent=node.parentNode;var nextSibling=node.nextSibling;if(parent){parent.removeChild(node);} +if(this.supportUse===false){var src=document.getElementById(id);node.firstChild&&node.removeChild(node.firstChild);node.appendChild(src.firstChild.cloneNode(true));node.setAttributeNS(null,"viewBox",src.getAttributeNS(null,"viewBox"));}else{node.setAttributeNS(this.xlinkns,"href","#"+id);} +node.setAttributeNS(null,"width",size);node.setAttributeNS(null,"height",size);node.setAttributeNS(null,"x",pos.x-offset);node.setAttributeNS(null,"y",pos.y-offset);if(nextSibling){parent.insertBefore(node,nextSibling);}else if(parent){parent.appendChild(node);}}else{node.setAttributeNS(null,"r",style.pointRadius);} +var rotation=style.rotation;if((rotation!==undefined||node._rotation!==undefined)&&pos){node._rotation=rotation;rotation|=0;if(node.nodeName!=="svg"){node.setAttributeNS(null,"transform","rotate("+rotation+" "+pos.x+" "+ +pos.y+")");}else{var metrics=this.symbolMetrics[id];node.firstChild.setAttributeNS(null,"transform","rotate("+style.rotation+" "+metrics[1]+" "+metrics[2]+")");}}} +if(options.isFilled){node.setAttributeNS(null,"fill",style.fillColor);node.setAttributeNS(null,"fill-opacity",style.fillOpacity);}else{node.setAttributeNS(null,"fill","none");} +if(options.isStroked){node.setAttributeNS(null,"stroke",style.strokeColor);node.setAttributeNS(null,"stroke-opacity",style.strokeOpacity);node.setAttributeNS(null,"stroke-width",style.strokeWidth*widthFactor);node.setAttributeNS(null,"stroke-linecap",style.strokeLinecap||"round");node.setAttributeNS(null,"stroke-linejoin","round");style.strokeDashstyle&&node.setAttributeNS(null,"stroke-dasharray",this.dashStyle(style,widthFactor));}else{node.setAttributeNS(null,"stroke","none");} +if(style.pointerEvents){node.setAttributeNS(null,"pointer-events",style.pointerEvents);} +if(style.cursor!=null){node.setAttributeNS(null,"cursor",style.cursor);} +return node;},dashStyle:function(style,widthFactor){var w=style.strokeWidth*widthFactor;var str=style.strokeDashstyle;switch(str){case'solid':return'none';case'dot':return[1,4*w].join();case'dash':return[4*w,4*w].join();case'dashdot':return[4*w,4*w,1,4*w].join();case'longdash':return[8*w,4*w].join();case'longdashdot':return[8*w,4*w,1,4*w].join();default:return OpenLayers.String.trim(str).replace(/\s+/g,",");}},createNode:function(type,id){var node=document.createElementNS(this.xmlns,type);if(id){node.setAttributeNS(null,"id",id);} +return node;},nodeTypeCompare:function(node,type){return(type==node.nodeName);},createRenderRoot:function(){return this.nodeFactory(this.container.id+"_svgRoot","svg");},createRoot:function(suffix){return this.nodeFactory(this.container.id+suffix,"g");},createDefs:function(){var defs=this.nodeFactory(this.container.id+"_defs","defs");this.rendererRoot.appendChild(defs);return defs;},drawPoint:function(node,geometry){return this.drawCircle(node,geometry,1);},drawCircle:function(node,geometry,radius){var resolution=this.getResolution();var x=(geometry.x/resolution+this.left);var y=(this.top-geometry.y/resolution);if(this.inValidRange(x,y)){node.setAttributeNS(null,"cx",x);node.setAttributeNS(null,"cy",y);node.setAttributeNS(null,"r",radius);return node;}else{return false;}},drawLineString:function(node,geometry){var componentsResult=this.getComponentsString(geometry.components);if(componentsResult.path){node.setAttributeNS(null,"points",componentsResult.path);return(componentsResult.complete?node:null);}else{return false;}},drawLinearRing:function(node,geometry){var componentsResult=this.getComponentsString(geometry.components);if(componentsResult.path){node.setAttributeNS(null,"points",componentsResult.path);return(componentsResult.complete?node:null);}else{return false;}},drawPolygon:function(node,geometry){var d="";var draw=true;var complete=true;var linearRingResult,path;for(var j=0,len=geometry.components.length;j0){if(this.getShortString(components[i-1])){strings.push(this.clipLine(components[i],components[i-1]));}} +if(imaxX){k=(y2-y1)/(x2-x1);x2=x2<0?-maxX:maxX;y2=y1+(x2-x1)*k;} +if(y2<-maxY||y2>maxY){k=(x2-x1)/(y2-y1);y2=y2<0?-maxY:maxY;x2=x1+(y2-y1)*k;} +return x2+","+y2;},getShortString:function(point){var resolution=this.getResolution();var x=(point.x/resolution+this.left);var y=(this.top-point.y/resolution);if(this.inValidRange(x,y)){return x+","+y;}else{return false;}},getPosition:function(node){return({x:parseFloat(node.getAttributeNS(null,"cx")),y:parseFloat(node.getAttributeNS(null,"cy"))});},importSymbol:function(graphicName){if(!this.defs){this.defs=this.createDefs();} +var id=this.container.id+"-"+graphicName;if(document.getElementById(id)!=null){return id;} +var symbol=OpenLayers.Renderer.symbol[graphicName];if(!symbol){throw new Error(graphicName+' is not a valid symbol name');} +var symbolNode=this.nodeFactory(id,"symbol");var node=this.nodeFactory(null,"polygon");symbolNode.appendChild(node);var symbolExtent=new OpenLayers.Bounds(Number.MAX_VALUE,Number.MAX_VALUE,0,0);var points=[];var x,y;for(var i=0;i=2*parts[1]){return"longdash";} +return(parts[0]==1||parts[1]==1)?"dot":"dash";}else if(parts.length==4){return(1*parts[0]>=2*parts[1])?"longdashdot":"dashdot";} +return"solid";}},createNode:function(type,id){var node=document.createElement(type);if(id){node.id=id;} +node.unselectable='on';node.onselectstart=OpenLayers.Function.False;return node;},nodeTypeCompare:function(node,type){var subType=type;var splitIndex=subType.indexOf(":");if(splitIndex!=-1){subType=subType.substr(splitIndex+1);} +var nodeName=node.nodeName;splitIndex=nodeName.indexOf(":");if(splitIndex!=-1){nodeName=nodeName.substr(splitIndex+1);} +return(subType==nodeName);},createRenderRoot:function(){return this.nodeFactory(this.container.id+"_vmlRoot","div");},createRoot:function(suffix){return this.nodeFactory(this.container.id+suffix,"olv:group");},drawPoint:function(node,geometry){return this.drawCircle(node,geometry,1);},drawCircle:function(node,geometry,radius){if(!isNaN(geometry.x)&&!isNaN(geometry.y)){var resolution=this.getResolution();node.style.left=(((geometry.x/resolution-this.offset.x)|0)-radius)+"px";node.style.top=(((geometry.y/resolution-this.offset.y)|0)-radius)+"px";var diameter=radius*2;node.style.width=diameter+"px";node.style.height=diameter+"px";return node;} +return false;},drawLineString:function(node,geometry){return this.drawLine(node,geometry,false);},drawLinearRing:function(node,geometry){return this.drawLine(node,geometry,true);},drawLine:function(node,geometry,closeLine){this.setNodeDimension(node,geometry);var resolution=this.getResolution();var numComponents=geometry.components.length;var parts=new Array(numComponents);var comp,x,y;for(var i=0;i0){symbolExtent.bottom=symbolExtent.bottom-diff;symbolExtent.top=symbolExtent.top+diff;}else{symbolExtent.left=symbolExtent.left+diff;symbolExtent.right=symbolExtent.right-diff;} +cache={path:path,size:symbolExtent.getWidth(),left:symbolExtent.left,bottom:symbolExtent.bottom};this.symbolCache[id]=cache;return cache;},CLASS_NAME:"OpenLayers.Renderer.VML"});OpenLayers.Renderer.VML.LABEL_SHIFT={"l":0,"c":.5,"r":1,"t":0,"m":.5,"b":1};OpenLayers.Tile=OpenLayers.Class({EVENT_TYPES:["loadstart","loadend","reload","unload"],events:null,id:null,layer:null,url:null,bounds:null,size:null,position:null,isLoading:false,initialize:function(layer,position,bounds,url,size){this.layer=layer;this.position=position.clone();this.bounds=bounds.clone();this.url=url;this.size=size.clone();this.id=OpenLayers.Util.createUniqueID("Tile_");this.events=new OpenLayers.Events(this,null,this.EVENT_TYPES);},unload:function(){if(this.isLoading){this.isLoading=false;this.events.triggerEvent("unload");}},destroy:function(){this.layer=null;this.bounds=null;this.size=null;this.position=null;this.events.destroy();this.events=null;},clone:function(obj){if(obj==null){obj=new OpenLayers.Tile(this.layer,this.position,this.bounds,this.url,this.size);} +OpenLayers.Util.applyDefaults(obj,this);return obj;},draw:function(){var maxExtent=this.layer.maxExtent;var withinMaxExtent=(maxExtent&&this.bounds.intersectsBounds(maxExtent,false));this.shouldDraw=(withinMaxExtent||this.layer.displayOutsideMaxExtent);this.clear();return this.shouldDraw;},moveTo:function(bounds,position,redraw){if(redraw==null){redraw=true;} +this.bounds=bounds.clone();this.position=position.clone();if(redraw){this.draw();}},clear:function(){},getBoundsFromBaseLayer:function(position){var msg=OpenLayers.i18n('reprojectDeprecated',{'layerName':this.layer.name});OpenLayers.Console.warn(msg);var topLeft=this.layer.map.getLonLatFromLayerPx(position);var bottomRightPx=position.clone();bottomRightPx.x+=this.size.w;bottomRightPx.y+=this.size.h;var bottomRight=this.layer.map.getLonLatFromLayerPx(bottomRightPx);if(topLeft.lon>bottomRight.lon){if(topLeft.lon<0){topLeft.lon=-180-(topLeft.lon+180);}else{bottomRight.lon=180+bottomRight.lon+180;}} +var bounds=new OpenLayers.Bounds(topLeft.lon,bottomRight.lat,bottomRight.lon,topLeft.lat);return bounds;},showTile:function(){if(this.shouldDraw){this.show();}},show:function(){},hide:function(){},CLASS_NAME:"OpenLayers.Tile"});OpenLayers.Control.MouseToolbar=OpenLayers.Class(OpenLayers.Control.MouseDefaults,{mode:null,buttons:null,direction:"vertical",buttonClicked:null,initialize:function(position,direction){OpenLayers.Control.prototype.initialize.apply(this,arguments);this.position=new OpenLayers.Pixel(OpenLayers.Control.MouseToolbar.X,OpenLayers.Control.MouseToolbar.Y);if(position){this.position=position;} +if(direction){this.direction=direction;} +this.measureDivs=[];},destroy:function(){for(var btnId in this.buttons){var btn=this.buttons[btnId];btn.map=null;btn.events.destroy();} +OpenLayers.Control.MouseDefaults.prototype.destroy.apply(this,arguments);},draw:function(){OpenLayers.Control.prototype.draw.apply(this,arguments);OpenLayers.Control.MouseDefaults.prototype.draw.apply(this,arguments);this.buttons={};var sz=new OpenLayers.Size(28,28);var centered=new OpenLayers.Pixel(OpenLayers.Control.MouseToolbar.X,0);this._addButton("zoombox","drag-rectangle-off.png","drag-rectangle-on.png",centered,sz,"Shift->Drag to zoom to area");centered=centered.add((this.direction=="vertical"?0:sz.w),(this.direction=="vertical"?sz.h:0));this._addButton("pan","panning-hand-off.png","panning-hand-on.png",centered,sz,"Drag the map to pan.");centered=centered.add((this.direction=="vertical"?0:sz.w),(this.direction=="vertical"?sz.h:0));this.switchModeTo("pan");return this.div;},_addButton:function(id,img,activeImg,xy,sz,title){var imgLocation=OpenLayers.Util.getImagesLocation()+img;var activeImgLocation=OpenLayers.Util.getImagesLocation()+activeImg;var btn=OpenLayers.Util.createAlphaImageDiv("OpenLayers_Control_MouseToolbar_"+id,xy,sz,imgLocation,"absolute");this.div.appendChild(btn);btn.imgLocation=imgLocation;btn.activeImgLocation=activeImgLocation;btn.events=new OpenLayers.Events(this,btn,null,true);btn.events.on({"mousedown":this.buttonDown,"mouseup":this.buttonUp,"dblclick":OpenLayers.Event.stop,scope:this});btn.action=id;btn.title=title;btn.alt=title;btn.map=this.map;this.buttons[id]=btn;return btn;},buttonDown:function(evt){if(!OpenLayers.Event.isLeftClick(evt)){return;} +this.buttonClicked=evt.element.action;OpenLayers.Event.stop(evt);},buttonUp:function(evt){if(!OpenLayers.Event.isLeftClick(evt)){return;} +if(this.buttonClicked!=null){if(this.buttonClicked==evt.element.action){this.switchModeTo(evt.element.action);} +OpenLayers.Event.stop(evt);this.buttonClicked=null;}},defaultDblClick:function(evt){this.switchModeTo("pan");this.performedDrag=false;var newCenter=this.map.getLonLatFromViewPortPx(evt.xy);this.map.setCenter(newCenter,this.map.zoom+1);OpenLayers.Event.stop(evt);return false;},defaultMouseDown:function(evt){if(!OpenLayers.Event.isLeftClick(evt)){return;} +this.mouseDragStart=evt.xy.clone();this.performedDrag=false;this.startViaKeyboard=false;if(evt.shiftKey&&this.mode!="zoombox"){this.switchModeTo("zoombox");this.startViaKeyboard=true;}else if(evt.altKey&&this.mode!="measure"){this.switchModeTo("measure");}else if(!this.mode){this.switchModeTo("pan");} +switch(this.mode){case"zoombox":this.map.div.style.cursor="crosshair";this.zoomBox=OpenLayers.Util.createDiv('zoomBox',this.mouseDragStart,null,null,"absolute","2px solid red");this.zoomBox.style.backgroundColor="white";this.zoomBox.style.filter="alpha(opacity=50)";this.zoomBox.style.opacity="0.50";this.zoomBox.style.fontSize="1px";this.zoomBox.style.zIndex=this.map.Z_INDEX_BASE["Popup"]-1;this.map.viewPortDiv.appendChild(this.zoomBox);this.performedDrag=true;break;case"measure":var distance="";if(this.measureStart){var measureEnd=this.map.getLonLatFromViewPortPx(this.mouseDragStart);distance=OpenLayers.Util.distVincenty(this.measureStart,measureEnd);distance=Math.round(distance*100)/100;distance=distance+"km";this.measureStartBox=this.measureBox;} +this.measureStart=this.map.getLonLatFromViewPortPx(this.mouseDragStart);;this.measureBox=OpenLayers.Util.createDiv(null,this.mouseDragStart.add(-2-parseInt(this.map.layerContainerDiv.style.left),-2-parseInt(this.map.layerContainerDiv.style.top)),null,null,"absolute");this.measureBox.style.width="4px";this.measureBox.style.height="4px";this.measureBox.style.fontSize="1px";this.measureBox.style.backgroundColor="red";this.measureBox.style.zIndex=this.map.Z_INDEX_BASE["Popup"]-1;this.map.layerContainerDiv.appendChild(this.measureBox);if(distance){this.measureBoxDistance=OpenLayers.Util.createDiv(null,this.mouseDragStart.add(-2-parseInt(this.map.layerContainerDiv.style.left),2-parseInt(this.map.layerContainerDiv.style.top)),null,null,"absolute");this.measureBoxDistance.innerHTML=distance;this.measureBoxDistance.style.zIndex=this.map.Z_INDEX_BASE["Popup"]-1;this.map.layerContainerDiv.appendChild(this.measureBoxDistance);this.measureDivs.push(this.measureBoxDistance);} +this.measureBox.style.zIndex=this.map.Z_INDEX_BASE["Popup"]-1;this.map.layerContainerDiv.appendChild(this.measureBox);this.measureDivs.push(this.measureBox);break;default:this.map.div.style.cursor="move";break;} +document.onselectstart=OpenLayers.Function.False;OpenLayers.Event.stop(evt);},switchModeTo:function(mode){if(mode!=this.mode){if(this.mode&&this.buttons[this.mode]){OpenLayers.Util.modifyAlphaImageDiv(this.buttons[this.mode],null,null,null,this.buttons[this.mode].imgLocation);} +if(this.mode=="measure"&&mode!="measure"){for(var i=0,len=this.measureDivs.length;i1){this.onPreviousChange(this.previousStack[1],this.previousStack.length-1);} +if(this.previousStack.length>(this.limit+1)){this.previousStack.pop();} +if(this.nextStack.length>0){this.nextStack=[];this.onNextChange(null,0);}} +return true;},this);}},activate:function(){var activated=false;if(this.map){if(OpenLayers.Control.prototype.activate.apply(this)){if(this.listeners==null){this.setListeners();} +for(var type in this.listeners){this.map.events.register(type,this,this.listeners[type]);} +activated=true;if(this.previousStack.length==0){this.initStack();}}} +return activated;},initStack:function(){if(this.map.getCenter()){this.listeners.moveend();}},deactivate:function(){var deactivated=false;if(this.map){if(OpenLayers.Control.prototype.deactivate.apply(this)){for(var type in this.listeners){this.map.events.unregister(type,this,this.listeners[type]);} +if(this.clearOnDeactivate){this.clear();} +deactivated=true;}} +return deactivated;},CLASS_NAME:"OpenLayers.Control.NavigationHistory"});OpenLayers.Control.PanPanel=OpenLayers.Class(OpenLayers.Control.Panel,{slideFactor:50,initialize:function(options){OpenLayers.Control.Panel.prototype.initialize.apply(this,[options]);this.addControls([new OpenLayers.Control.Pan(OpenLayers.Control.Pan.NORTH,{slideFactor:this.slideFactor}),new OpenLayers.Control.Pan(OpenLayers.Control.Pan.SOUTH,{slideFactor:this.slideFactor}),new OpenLayers.Control.Pan(OpenLayers.Control.Pan.EAST,{slideFactor:this.slideFactor}),new OpenLayers.Control.Pan(OpenLayers.Control.Pan.WEST,{slideFactor:this.slideFactor})]);},CLASS_NAME:"OpenLayers.Control.PanPanel"});OpenLayers.Control.PanZoomBar=OpenLayers.Class(OpenLayers.Control.PanZoom,{zoomStopWidth:18,zoomStopHeight:11,slider:null,sliderEvents:null,zoombarDiv:null,divEvents:null,zoomWorldIcon:false,forceFixedZoomLevel:false,mouseDragStart:null,zoomStart:null,initialize:function(){OpenLayers.Control.PanZoom.prototype.initialize.apply(this,arguments);},destroy:function(){this._removeZoomBar();this.map.events.un({"changebaselayer":this.redraw,scope:this});OpenLayers.Control.PanZoom.prototype.destroy.apply(this,arguments);delete this.mouseDragStart;delete this.zoomStart;},setMap:function(map){OpenLayers.Control.PanZoom.prototype.setMap.apply(this,arguments);this.map.events.register("changebaselayer",this,this.redraw);},redraw:function(){if(this.div!=null){this.removeButtons();this._removeZoomBar();} +this.draw();},draw:function(px){OpenLayers.Control.prototype.draw.apply(this,arguments);px=this.position.clone();this.buttons=[];var sz=new OpenLayers.Size(18,18);var centered=new OpenLayers.Pixel(px.x+sz.w/2,px.y);var wposition=sz.w;if(this.zoomWorldIcon){centered=new OpenLayers.Pixel(px.x+sz.w,px.y);} +this._addButton("panup","north-mini.png",centered,sz);px.y=centered.y+sz.h;this._addButton("panleft","west-mini.png",px,sz);if(this.zoomWorldIcon){this._addButton("zoomworld","zoom-world-mini.png",px.add(sz.w,0),sz);wposition*=2;} +this._addButton("panright","east-mini.png",px.add(wposition,0),sz);this._addButton("pandown","south-mini.png",centered.add(0,sz.h*2),sz);this._addButton("zoomin","zoom-plus-mini.png",centered.add(0,sz.h*3+5),sz);centered=this._addZoomBar(centered.add(0,sz.h*4+5));this._addButton("zoomout","zoom-minus-mini.png",centered,sz);return this.div;},_addZoomBar:function(centered){var imgLocation=OpenLayers.Util.getImagesLocation();var id=this.id+"_"+this.map.id;var zoomsToEnd=this.map.getNumZoomLevels()-1-this.map.getZoom();var slider=OpenLayers.Util.createAlphaImageDiv(id,centered.add(-1,zoomsToEnd*this.zoomStopHeight),new OpenLayers.Size(20,9),imgLocation+"slider.png","absolute");this.slider=slider;this.sliderEvents=new OpenLayers.Events(this,slider,null,true,{includeXY:true});this.sliderEvents.on({"mousedown":this.zoomBarDown,"mousemove":this.zoomBarDrag,"mouseup":this.zoomBarUp,"dblclick":this.doubleClick,"click":this.doubleClick});var sz=new OpenLayers.Size();sz.h=this.zoomStopHeight*this.map.getNumZoomLevels();sz.w=this.zoomStopWidth;var div=null;if(OpenLayers.Util.alphaHack()){var id=this.id+"_"+this.map.id;div=OpenLayers.Util.createAlphaImageDiv(id,centered,new OpenLayers.Size(sz.w,this.zoomStopHeight),imgLocation+"zoombar.png","absolute",null,"crop");div.style.height=sz.h+"px";}else{div=OpenLayers.Util.createDiv('OpenLayers_Control_PanZoomBar_Zoombar'+this.map.id,centered,sz,imgLocation+"zoombar.png");} +this.zoombarDiv=div;this.divEvents=new OpenLayers.Events(this,div,null,true,{includeXY:true});this.divEvents.on({"mousedown":this.divClick,"mousemove":this.passEventToSlider,"dblclick":this.doubleClick,"click":this.doubleClick});this.div.appendChild(div);this.startTop=parseInt(div.style.top);this.div.appendChild(slider);this.map.events.register("zoomend",this,this.moveZoomBar);centered=centered.add(0,this.zoomStopHeight*this.map.getNumZoomLevels());return centered;},_removeZoomBar:function(){this.sliderEvents.un({"mousedown":this.zoomBarDown,"mousemove":this.zoomBarDrag,"mouseup":this.zoomBarUp,"dblclick":this.doubleClick,"click":this.doubleClick});this.sliderEvents.destroy();this.divEvents.un({"mousedown":this.divClick,"mousemove":this.passEventToSlider,"dblclick":this.doubleClick,"click":this.doubleClick});this.divEvents.destroy();this.div.removeChild(this.zoombarDiv);this.zoombarDiv=null;this.div.removeChild(this.slider);this.slider=null;this.map.events.unregister("zoomend",this,this.moveZoomBar);},passEventToSlider:function(evt){this.sliderEvents.handleBrowserEvent(evt);},divClick:function(evt){if(!OpenLayers.Event.isLeftClick(evt)){return;} +var y=evt.xy.y;var top=OpenLayers.Util.pagePosition(evt.object)[1];var levels=(y-top)/this.zoomStopHeight;if(this.forceFixedZoomLevel||!this.map.fractionalZoom){levels=Math.floor(levels);} +var zoom=(this.map.getNumZoomLevels()-1)-levels;zoom=Math.min(Math.max(zoom,0),this.map.getNumZoomLevels()-1);this.map.zoomTo(zoom);OpenLayers.Event.stop(evt);},zoomBarDown:function(evt){if(!OpenLayers.Event.isLeftClick(evt)){return;} +this.map.events.on({"mousemove":this.passEventToSlider,"mouseup":this.passEventToSlider,scope:this});this.mouseDragStart=evt.xy.clone();this.zoomStart=evt.xy.clone();this.div.style.cursor="move";this.zoombarDiv.offsets=null;OpenLayers.Event.stop(evt);},zoomBarDrag:function(evt){if(this.mouseDragStart!=null){var deltaY=this.mouseDragStart.y-evt.xy.y;var offsets=OpenLayers.Util.pagePosition(this.zoombarDiv);if((evt.clientY-offsets[1])>0&&(evt.clientY-offsets[1])0){pieces.push(',');} +pieces.push(this.writeNewline(),this.writeIndent(),json);}} +this.level-=1;pieces.push(this.writeNewline(),this.writeIndent(),']');return pieces.join('');},'string':function(string){var m={'\b':'\\b','\t':'\\t','\n':'\\n','\f':'\\f','\r':'\\r','"':'\\"','\\':'\\\\'};if(/["\\\x00-\x1f]/.test(string)){return'"'+string.replace(/([\x00-\x1f\\"])/g,function(a,b){var c=m[b];if(c){return c;} +c=b.charCodeAt();return'\\u00'+ +Math.floor(c/16).toString(16)+ +(c%16).toString(16);})+'"';} +return'"'+string+'"';},'number':function(number){return isFinite(number)?String(number):"null";},'boolean':function(bool){return String(bool);},'date':function(date){function format(number){return(number<10)?'0'+number:number;} +return'"'+date.getFullYear()+'-'+ +format(date.getMonth()+1)+'-'+ +format(date.getDate())+'T'+ +format(date.getHours())+':'+ +format(date.getMinutes())+':'+ +format(date.getSeconds())+'"';}},CLASS_NAME:"OpenLayers.Format.JSON"});OpenLayers.Format.WFST=function(options){options=OpenLayers.Util.applyDefaults(options,OpenLayers.Format.WFST.DEFAULTS);var cls=OpenLayers.Format.WFST["v"+options.version.replace(/\./g,"_")];if(!cls){throw"Unsupported WFST version: "+options.version;} +return new cls(options);};OpenLayers.Format.WFST.DEFAULTS={"version":"1.0.0"};OpenLayers.Format.XML=OpenLayers.Class(OpenLayers.Format,{namespaces:null,namespaceAlias:null,defaultPrefix:null,readers:{},writers:{},xmldom:null,initialize:function(options){if(window.ActiveXObject){this.xmldom=new ActiveXObject("Microsoft.XMLDOM");} +OpenLayers.Format.prototype.initialize.apply(this,[options]);this.namespaces=OpenLayers.Util.extend({},this.namespaces);this.namespaceAlias={};for(var alias in this.namespaces){this.namespaceAlias[this.namespaces[alias]]=alias;}},destroy:function(){this.xmldom=null;OpenLayers.Format.prototype.destroy.apply(this,arguments);},setNamespace:function(alias,uri){this.namespaces[alias]=uri;this.namespaceAlias[uri]=alias;},read:function(text){var index=text.indexOf('<');if(index>0){text=text.substring(index);} +var node=OpenLayers.Util.Try(OpenLayers.Function.bind((function(){var xmldom;if(window.ActiveXObject&&!this.xmldom){xmldom=new ActiveXObject("Microsoft.XMLDOM");}else{xmldom=this.xmldom;} +xmldom.loadXML(text);return xmldom;}),this),function(){return new DOMParser().parseFromString(text,'text/xml');},function(){var req=new XMLHttpRequest();req.open("GET","data:"+"text/xml"+";charset=utf-8,"+encodeURIComponent(text),false);if(req.overrideMimeType){req.overrideMimeType("text/xml");} +req.send(null);return req.responseXML;});if(this.keepData){this.data=node;} +return node;},write:function(node){var data;if(this.xmldom){data=node.xml;}else{var serializer=new XMLSerializer();if(node.nodeType==1){var doc=document.implementation.createDocument("","",null);if(doc.importNode){node=doc.importNode(node,true);} +doc.appendChild(node);data=serializer.serializeToString(doc);}else{data=serializer.serializeToString(node);}} +return data;},createElementNS:function(uri,name){var element;if(this.xmldom){if(typeof uri=="string"){element=this.xmldom.createNode(1,name,uri);}else{element=this.xmldom.createNode(1,name,"");}}else{element=document.createElementNS(uri,name);} +return element;},createTextNode:function(text){var node;if(typeof text!=="string"){text=String(text);} +if(this.xmldom){node=this.xmldom.createTextNode(text);}else{node=document.createTextNode(text);} +return node;},getElementsByTagNameNS:function(node,uri,name){var elements=[];if(node.getElementsByTagNameNS){elements=node.getElementsByTagNameNS(uri,name);}else{var allNodes=node.getElementsByTagName("*");var potentialNode,fullName;for(var i=0,len=allNodes.length;i0){prefix=name.substring(0,split);local=name.substring(split+1);}else{if(parent){prefix=this.namespaceAlias[parent.namespaceURI];}else{prefix=this.defaultPrefix;} +local=name;} +var child=this.writers[prefix][local].apply(this,[obj]);if(parent){parent.appendChild(child);} +return child;},getChildEl:function(node,name,uri){return node&&this.getThisOrNextEl(node.firstChild,name,uri);},getNextEl:function(node,name,uri){return node&&this.getThisOrNextEl(node.nextSibling,name,uri);},getThisOrNextEl:function(node,name,uri){outer:for(var sibling=node;sibling;sibling=sibling.nextSibling){switch(sibling.nodeType){case 1:if((!name||name===(sibling.localName||sibling.nodeName.split(":").pop()))&&(!uri||uri===sibling.namespaceURI)){break outer;} +sibling=null;break outer;case 3:if(/^\s*$/.test(sibling.nodeValue)){break;} +case 4:case 6:case 12:case 10:case 11:sibling=null;break outer;}} +return sibling||null;},lookupNamespaceURI:function(node,prefix){var uri=null;if(node){if(node.lookupNamespaceURI){uri=node.lookupNamespaceURI(prefix);}else{outer:switch(node.nodeType){case 1:if(node.namespaceURI!==null&&node.prefix===prefix){uri=node.namespaceURI;break outer;} +var len=node.attributes.length;if(len){var attr;for(var i=0;i=0;--i){this.controls[i].destroy();} +this.controls=null;} +if(this.layers!=null){for(var i=this.layers.length-1;i>=0;--i){this.layers[i].destroy(false);} +this.layers=null;} +if(this.viewPortDiv){this.div.removeChild(this.viewPortDiv);} +this.viewPortDiv=null;if(this.eventListeners){this.events.un(this.eventListeners);this.eventListeners=null;} +this.events.destroy();this.events=null;},setOptions:function(options){OpenLayers.Util.extend(this,options);},getTileSize:function(){return this.tileSize;},getBy:function(array,property,match){var test=(typeof match.test=="function");var found=OpenLayers.Array.filter(this[array],function(item){return item[property]==match||(test&&match.test(item[property]));});return found;},getLayersBy:function(property,match){return this.getBy("layers",property,match);},getLayersByName:function(match){return this.getLayersBy("name",match);},getLayersByClass:function(match){return this.getLayersBy("CLASS_NAME",match);},getControlsBy:function(property,match){return this.getBy("controls",property,match);},getControlsByClass:function(match){return this.getControlsBy("CLASS_NAME",match);},getLayer:function(id){var foundLayer=null;for(var i=0,len=this.layers.length;ithis.layers.length){idx=this.layers.length;} +if(base!=idx){this.layers.splice(base,1);this.layers.splice(idx,0,layer);for(var i=0,len=this.layers.length;i=0;--i){this.removePopup(this.popups[i]);}} +popup.map=this;this.popups.push(popup);var popupDiv=popup.draw();if(popupDiv){popupDiv.style.zIndex=this.Z_INDEX_BASE['Popup']+ +this.popups.length;this.layerContainerDiv.appendChild(popupDiv);}},removePopup:function(popup){OpenLayers.Util.removeItem(this.popups,popup);if(popup.div){try{this.layerContainerDiv.removeChild(popup.div);} +catch(e){}} +popup.map=null;},getSize:function(){var size=null;if(this.size!=null){size=this.size.clone();} +return size;},updateSize:function(){var newSize=this.getCurrentSize();if(newSize&&!isNaN(newSize.h)&&!isNaN(newSize.w)){this.events.clearMouseCache();var oldSize=this.getSize();if(oldSize==null){this.size=oldSize=newSize;} +if(!newSize.equals(oldSize)){this.size=newSize;for(var i=0,len=this.layers.length;ithis.restrictedExtent.getWidth()){lonlat=new OpenLayers.LonLat(maxCenter.lon,lonlat.lat);}else if(extent.leftthis.restrictedExtent.right){lonlat=lonlat.add(this.restrictedExtent.right- +extent.right,0);} +if(extent.getHeight()>this.restrictedExtent.getHeight()){lonlat=new OpenLayers.LonLat(lonlat.lon,maxCenter.lat);}else if(extent.bottomthis.restrictedExtent.top){lonlat=lonlat.add(0,this.restrictedExtent.top- +extent.top);}}} +var zoomChanged=forceZoomChange||((this.isValidZoomLevel(zoom))&&(zoom!=this.getZoom()));var centerChanged=(this.isValidLonLat(lonlat))&&(!lonlat.equals(this.center));if(zoomChanged||centerChanged||!dragging){if(!this.dragging&&!noEvent){this.events.triggerEvent("movestart");} +if(centerChanged){if((!zoomChanged)&&(this.center)){this.centerLayerContainer(lonlat);} +this.center=lonlat.clone();} +if((zoomChanged)||(this.layerContainerOrigin==null)){this.layerContainerOrigin=this.center.clone();this.layerContainerDiv.style.left="0px";this.layerContainerDiv.style.top="0px";} +if(zoomChanged){this.zoom=zoom;this.resolution=this.getResolutionForZoom(zoom);this.viewRequestID++;} +var bounds=this.getExtent();if(this.baseLayer.visibility){this.baseLayer.moveTo(bounds,zoomChanged,dragging);if(dragging){this.baseLayer.events.triggerEvent("move");}else{this.baseLayer.events.triggerEvent("moveend",{"zoomChanged":zoomChanged});}} +bounds=this.baseLayer.getExtent();for(var i=0,len=this.layers.length;i=0)&&(zoomLevel0){resolution=this.layers[0].getResolution();} +return resolution;},getUnits:function(){var units=null;if(this.baseLayer!=null){units=this.baseLayer.units;} +return units;},getScale:function(){var scale=null;if(this.baseLayer!=null){var res=this.getResolution();var units=this.baseLayer.units;scale=OpenLayers.Util.getScaleFromResolution(res,units);} +return scale;},getZoomForExtent:function(bounds,closest){var zoom=null;if(this.baseLayer!=null){zoom=this.baseLayer.getZoomForExtent(bounds,closest);} +return zoom;},getResolutionForZoom:function(zoom){var resolution=null;if(this.baseLayer){resolution=this.baseLayer.getResolutionForZoom(zoom);} +return resolution;},getZoomForResolution:function(resolution,closest){var zoom=null;if(this.baseLayer!=null){zoom=this.baseLayer.getZoomForResolution(resolution,closest);} +return zoom;},zoomTo:function(zoom){if(this.isValidZoomLevel(zoom)){this.setCenter(null,zoom);}},zoomIn:function(){this.zoomTo(this.getZoom()+1);},zoomOut:function(){this.zoomTo(this.getZoom()-1);},zoomToExtent:function(bounds,closest){var center=bounds.getCenterLonLat();if(this.baseLayer.wrapDateLine){var maxExtent=this.getMaxExtent();bounds=bounds.clone();while(bounds.right0){var separator=(url.indexOf('?')>-1)?'&':'?';url+=separator+paramString;}} +if(config.proxy&&(url.indexOf("http")==0)){if(typeof config.proxy=="function"){url=config.proxy(url);}else{url=config.proxy+encodeURIComponent(url);}} +request.open(config.method,url,config.async,config.user,config.password);for(var header in config.headers){request.setRequestHeader(header,config.headers[header]);} +var events=this.events;var self=this;request.onreadystatechange=function(){if(request.readyState==OpenLayers.Request.XMLHttpRequest.DONE){var proceed=events.triggerEvent("complete",{request:request,config:config,requestUrl:url});if(proceed!==false){self.runCallbacks({request:request,config:config,requestUrl:url});}}};if(config.async===false){request.send(config.data);}else{window.setTimeout(function(){if(request._aborted!==true){request.send(config.data);}},0);} +return request;},runCallbacks:function(options){var request=options.request;var config=options.config;var complete=(config.scope)?OpenLayers.Function.bind(config.callback,config.scope):config.callback;var success;if(config.success){success=(config.scope)?OpenLayers.Function.bind(config.success,config.scope):config.success;} +var failure;if(config.failure){failure=(config.scope)?OpenLayers.Function.bind(config.failure,config.scope):config.failure;} +complete(request);if(!request.status||(request.status>=200&&request.status<300)){this.events.triggerEvent("success",options);if(success){success(request);}} +if(request.status&&(request.status<200||request.status>=300)){this.events.triggerEvent("failure",options);if(failure){failure(request);}}},GET:function(config){config=OpenLayers.Util.extend(config,{method:"GET"});return OpenLayers.Request.issue(config);},POST:function(config){config=OpenLayers.Util.extend(config,{method:"POST"});config.headers=config.headers?config.headers:{};if(!("CONTENT-TYPE"in OpenLayers.Util.upperCaseObject(config.headers))){config.headers["Content-Type"]="application/xml";} +return OpenLayers.Request.issue(config);},PUT:function(config){config=OpenLayers.Util.extend(config,{method:"PUT"});config.headers=config.headers?config.headers:{};if(!("CONTENT-TYPE"in OpenLayers.Util.upperCaseObject(config.headers))){config.headers["Content-Type"]="application/xml";} +return OpenLayers.Request.issue(config);},DELETE:function(config){config=OpenLayers.Util.extend(config,{method:"DELETE"});return OpenLayers.Request.issue(config);},HEAD:function(config){config=OpenLayers.Util.extend(config,{method:"HEAD"});return OpenLayers.Request.issue(config);},OPTIONS:function(config){config=OpenLayers.Util.extend(config,{method:"OPTIONS"});return OpenLayers.Request.issue(config);}};OpenLayers.Tile.Image=OpenLayers.Class(OpenLayers.Tile,{url:null,imgDiv:null,frame:null,layerAlphaHack:null,isBackBuffer:false,lastRatio:1,isFirstDraw:true,backBufferTile:null,initialize:function(layer,position,bounds,url,size){OpenLayers.Tile.prototype.initialize.apply(this,arguments);this.url=url;this.frame=document.createElement('div');this.frame.style.overflow='hidden';this.frame.style.position='absolute';this.layerAlphaHack=this.layer.alpha&&OpenLayers.Util.alphaHack();},destroy:function(){if(this.imgDiv!=null){if(this.layerAlphaHack){OpenLayers.Event.stopObservingElement(this.imgDiv.childNodes[0]);} +OpenLayers.Event.stopObservingElement(this.imgDiv);if(this.imgDiv.parentNode==this.frame){this.frame.removeChild(this.imgDiv);this.imgDiv.map=null;} +this.imgDiv.urls=null;this.imgDiv.src=OpenLayers.Util.getImagesLocation()+"blank.gif";} +this.imgDiv=null;if((this.frame!=null)&&(this.frame.parentNode==this.layer.div)){this.layer.div.removeChild(this.frame);} +this.frame=null;if(this.backBufferTile){this.backBufferTile.destroy();this.backBufferTile=null;} +this.layer.events.unregister("loadend",this,this.resetBackBuffer);OpenLayers.Tile.prototype.destroy.apply(this,arguments);},clone:function(obj){if(obj==null){obj=new OpenLayers.Tile.Image(this.layer,this.position,this.bounds,this.url,this.size);} +obj=OpenLayers.Tile.prototype.clone.apply(this,[obj]);obj.imgDiv=null;return obj;},draw:function(){if(this.layer!=this.layer.map.baseLayer&&this.layer.reproject){this.bounds=this.getBoundsFromBaseLayer(this.position);} +var drawTile=OpenLayers.Tile.prototype.draw.apply(this,arguments);if((OpenLayers.Util.indexOf(this.layer.SUPPORTED_TRANSITIONS,this.layer.transitionEffect)!=-1)||this.layer.singleTile){if(drawTile){if(!this.backBufferTile){this.backBufferTile=this.clone();this.backBufferTile.hide();this.backBufferTile.isBackBuffer=true;this.events.register('loadend',this,this.resetBackBuffer);this.layer.events.register("loadend",this,this.resetBackBuffer);} +this.startTransition();}else{if(this.backBufferTile){this.backBufferTile.clear();}}}else{if(drawTile&&this.isFirstDraw){this.events.register('loadend',this,this.showTile);this.isFirstDraw=false;}} +if(!drawTile){return false;} +if(this.isLoading){this.events.triggerEvent("reload");}else{this.isLoading=true;this.events.triggerEvent("loadstart");} +return this.renderTile();},resetBackBuffer:function(){this.showTile();if(this.backBufferTile&&(this.isFirstDraw||!this.layer.numLoadingTiles)){this.isFirstDraw=false;var maxExtent=this.layer.maxExtent;var withinMaxExtent=(maxExtent&&this.bounds.intersectsBounds(maxExtent,false));if(withinMaxExtent){this.backBufferTile.position=this.position;this.backBufferTile.bounds=this.bounds;this.backBufferTile.size=this.size;this.backBufferTile.imageSize=this.layer.getImageSize(this.bounds)||this.size;this.backBufferTile.imageOffset=this.layer.imageOffset;this.backBufferTile.resolution=this.layer.getResolution();this.backBufferTile.renderTile();} +this.backBufferTile.hide();}},renderTile:function(){if(this.imgDiv==null){this.initImgDiv();} +this.imgDiv.viewRequestID=this.layer.map.viewRequestID;if(this.layer.async){this.layer.getURLasync(this.bounds,this,"url",this.positionImage);}else{if(this.layer.url instanceof Array){this.imgDiv.urls=this.layer.url.slice();} +this.url=this.layer.getURL(this.bounds);this.positionImage();} +return true;},positionImage:function(){if(this.layer===null){return;} +OpenLayers.Util.modifyDOMElement(this.frame,null,this.position,this.size);var imageSize=this.layer.getImageSize(this.bounds);if(this.layerAlphaHack){OpenLayers.Util.modifyAlphaImageDiv(this.imgDiv,null,null,imageSize,this.url);}else{OpenLayers.Util.modifyDOMElement(this.imgDiv,null,null,imageSize);this.imgDiv.src=this.url;}},clear:function(){if(this.imgDiv){this.hide();if(OpenLayers.Tile.Image.useBlankTile){this.imgDiv.src=OpenLayers.Util.getImagesLocation()+"blank.gif";}}},initImgDiv:function(){var offset=this.layer.imageOffset;var size=this.layer.getImageSize(this.bounds);if(this.layerAlphaHack){this.imgDiv=OpenLayers.Util.createAlphaImageDiv(null,offset,size,null,"relative",null,null,null,true);}else{this.imgDiv=OpenLayers.Util.createImage(null,offset,size,null,"relative",null,null,true);} +this.imgDiv.className='olTileImage';this.frame.style.zIndex=this.isBackBuffer?0:1;this.frame.appendChild(this.imgDiv);this.layer.div.appendChild(this.frame);if(this.layer.opacity!=null){OpenLayers.Util.modifyDOMElement(this.imgDiv,null,null,null,null,null,null,this.layer.opacity);} +this.imgDiv.map=this.layer.map;var onload=function(){if(this.isLoading){this.isLoading=false;this.events.triggerEvent("loadend");}};if(this.layerAlphaHack){OpenLayers.Event.observe(this.imgDiv.childNodes[0],'load',OpenLayers.Function.bind(onload,this));}else{OpenLayers.Event.observe(this.imgDiv,'load',OpenLayers.Function.bind(onload,this));} +var onerror=function(){if(this.imgDiv._attempts>OpenLayers.IMAGE_RELOAD_ATTEMPTS){onload.call(this);}};OpenLayers.Event.observe(this.imgDiv,"error",OpenLayers.Function.bind(onerror,this));},checkImgURL:function(){if(this.layer){var loaded=this.layerAlphaHack?this.imgDiv.firstChild.src:this.imgDiv.src;if(!OpenLayers.Util.isEquivalentUrl(loaded,this.url)){this.hide();}}},startTransition:function(){if(!this.backBufferTile||!this.backBufferTile.imgDiv){return;} +var ratio=1;if(this.backBufferTile.resolution){ratio=this.backBufferTile.resolution/this.layer.getResolution();} +if(ratio!=this.lastRatio){if(this.layer.transitionEffect=='resize'){var upperLeft=new OpenLayers.LonLat(this.backBufferTile.bounds.left,this.backBufferTile.bounds.top);var size=new OpenLayers.Size(this.backBufferTile.size.w*ratio,this.backBufferTile.size.h*ratio);var px=this.layer.map.getLayerPxFromLonLat(upperLeft);OpenLayers.Util.modifyDOMElement(this.backBufferTile.frame,null,px,size);var imageSize=this.backBufferTile.imageSize;imageSize=new OpenLayers.Size(imageSize.w*ratio,imageSize.h*ratio);var imageOffset=this.backBufferTile.imageOffset;if(imageOffset){imageOffset=new OpenLayers.Pixel(imageOffset.x*ratio,imageOffset.y*ratio);} +OpenLayers.Util.modifyDOMElement(this.backBufferTile.imgDiv,null,imageOffset,imageSize);this.backBufferTile.show();}}else{if(this.layer.singleTile){this.backBufferTile.show();}else{this.backBufferTile.hide();}} +this.lastRatio=ratio;},show:function(){this.frame.style.display='';if(OpenLayers.Util.indexOf(this.layer.SUPPORTED_TRANSITIONS,this.layer.transitionEffect)!=-1){if(navigator.userAgent.toLowerCase().indexOf("gecko")!=-1){this.frame.scrollLeft=this.frame.scrollLeft;}}},hide:function(){this.frame.style.display='none';},CLASS_NAME:"OpenLayers.Tile.Image"});OpenLayers.Tile.Image.useBlankTile=(OpenLayers.Util.getBrowserName()=="safari"||OpenLayers.Util.getBrowserName()=="opera");OpenLayers.Control.OverviewMap=OpenLayers.Class(OpenLayers.Control,{element:null,ovmap:null,size:new OpenLayers.Size(180,90),layers:null,minRectSize:15,minRectDisplayClass:"RectReplacement",minRatio:8,maxRatio:32,mapOptions:null,autoPan:false,handlers:null,resolutionFactor:1,maximized:false,initialize:function(options){this.layers=[];this.handlers={};OpenLayers.Control.prototype.initialize.apply(this,[options]);},destroy:function(){if(!this.mapDiv){return;} +if(this.handlers.click){this.handlers.click.destroy();} +if(this.handlers.drag){this.handlers.drag.destroy();} +this.mapDiv.removeChild(this.extentRectangle);this.extentRectangle=null;if(this.rectEvents){this.rectEvents.destroy();this.rectEvents=null;} +if(this.ovmap){this.ovmap.destroy();this.ovmap=null;} +this.element.removeChild(this.mapDiv);this.mapDiv=null;this.div.removeChild(this.element);this.element=null;if(this.maximizeDiv){OpenLayers.Event.stopObservingElement(this.maximizeDiv);this.div.removeChild(this.maximizeDiv);this.maximizeDiv=null;} +if(this.minimizeDiv){OpenLayers.Event.stopObservingElement(this.minimizeDiv);this.div.removeChild(this.minimizeDiv);this.minimizeDiv=null;} +this.map.events.un({"moveend":this.update,"changebaselayer":this.baseLayerDraw,scope:this});OpenLayers.Control.prototype.destroy.apply(this,arguments);},draw:function(){OpenLayers.Control.prototype.draw.apply(this,arguments);if(!(this.layers.length>0)){if(this.map.baseLayer){var layer=this.map.baseLayer.clone();this.layers=[layer];}else{this.map.events.register("changebaselayer",this,this.baseLayerDraw);return this.div;}} +this.element=document.createElement('div');this.element.className=this.displayClass+'Element';this.element.style.display='none';this.mapDiv=document.createElement('div');this.mapDiv.style.width=this.size.w+'px';this.mapDiv.style.height=this.size.h+'px';this.mapDiv.style.position='relative';this.mapDiv.style.overflow='hidden';this.mapDiv.id=OpenLayers.Util.createUniqueID('overviewMap');this.extentRectangle=document.createElement('div');this.extentRectangle.style.position='absolute';this.extentRectangle.style.zIndex=1000;this.extentRectangle.className=this.displayClass+'ExtentRectangle';this.mapDiv.appendChild(this.extentRectangle);this.element.appendChild(this.mapDiv);this.div.appendChild(this.element);if(!this.outsideViewport){this.div.className+=" "+this.displayClass+'Container';var imgLocation=OpenLayers.Util.getImagesLocation();var img=imgLocation+'layer-switcher-maximize.png';this.maximizeDiv=OpenLayers.Util.createAlphaImageDiv(this.displayClass+'MaximizeButton',null,new OpenLayers.Size(18,18),img,'absolute');this.maximizeDiv.style.display='none';this.maximizeDiv.className=this.displayClass+'MaximizeButton';OpenLayers.Event.observe(this.maximizeDiv,'click',OpenLayers.Function.bindAsEventListener(this.maximizeControl,this));this.div.appendChild(this.maximizeDiv);var img=imgLocation+'layer-switcher-minimize.png';this.minimizeDiv=OpenLayers.Util.createAlphaImageDiv('OpenLayers_Control_minimizeDiv',null,new OpenLayers.Size(18,18),img,'absolute');this.minimizeDiv.style.display='none';this.minimizeDiv.className=this.displayClass+'MinimizeButton';OpenLayers.Event.observe(this.minimizeDiv,'click',OpenLayers.Function.bindAsEventListener(this.minimizeControl,this));this.div.appendChild(this.minimizeDiv);var eventsToStop=['dblclick','mousedown'];for(var i=0,len=eventsToStop.length;ithis.minRatio)&&(resRatio<=this.maxRatio)&&(this.ovmap.getExtent().containsBounds(testExtent)));},updateOverview:function(){var mapRes=this.map.getResolution();var targetRes=this.ovmap.getResolution();var resRatio=targetRes/mapRes;if(resRatio>this.maxRatio){targetRes=this.minRatio*mapRes;}else if(resRatio<=this.minRatio){targetRes=this.maxRatio*mapRes;} +var center;if(this.ovmap.getProjection()!=this.map.getProjection()){center=this.map.center.clone();center.transform(this.map.getProjectionObject(),this.ovmap.getProjectionObject());}else{center=this.map.center;} +this.ovmap.setCenter(center,this.ovmap.getZoomForResolution(targetRes*this.resolutionFactor));this.updateRectToMap();},createMap:function(){var options=OpenLayers.Util.extend({controls:[],maxResolution:'auto',fallThrough:false},this.mapOptions);this.ovmap=new OpenLayers.Map(this.mapDiv,options);OpenLayers.Event.stopObserving(window,'unload',this.ovmap.unloadDestroy);this.ovmap.addLayers(this.layers);this.ovmap.zoomToMaxExtent();this.wComp=parseInt(OpenLayers.Element.getStyle(this.extentRectangle,'border-left-width'))+ +parseInt(OpenLayers.Element.getStyle(this.extentRectangle,'border-right-width'));this.wComp=(this.wComp)?this.wComp:2;this.hComp=parseInt(OpenLayers.Element.getStyle(this.extentRectangle,'border-top-width'))+ +parseInt(OpenLayers.Element.getStyle(this.extentRectangle,'border-bottom-width'));this.hComp=(this.hComp)?this.hComp:2;this.handlers.drag=new OpenLayers.Handler.Drag(this,{move:this.rectDrag,done:this.updateMapToRect},{map:this.ovmap});this.handlers.click=new OpenLayers.Handler.Click(this,{"click":this.mapDivClick},{"single":true,"double":false,"stopSingle":true,"stopDouble":true,"pixelTolerance":1,map:this.ovmap});this.handlers.click.activate();this.rectEvents=new OpenLayers.Events(this,this.extentRectangle,null,true);this.rectEvents.register("mouseover",this,function(e){if(!this.handlers.drag.active&&!this.map.dragging){this.handlers.drag.activate();}});this.rectEvents.register("mouseout",this,function(e){if(!this.handlers.drag.dragging){this.handlers.drag.deactivate();}});if(this.ovmap.getProjection()!=this.map.getProjection()){var sourceUnits=this.map.getProjectionObject().getUnits()||this.map.units||this.map.baseLayer.units;var targetUnits=this.ovmap.getProjectionObject().getUnits()||this.ovmap.units||this.ovmap.baseLayer.units;this.resolutionFactor=sourceUnits&&targetUnits?OpenLayers.INCHES_PER_UNIT[sourceUnits]/OpenLayers.INCHES_PER_UNIT[targetUnits]:1;}},updateRectToMap:function(){var bounds;if(this.ovmap.getProjection()!=this.map.getProjection()){bounds=this.map.getExtent().transform(this.map.getProjectionObject(),this.ovmap.getProjectionObject());}else{bounds=this.map.getExtent();} +var pxBounds=this.getRectBoundsFromMapBounds(bounds);if(pxBounds){this.setRectPxBounds(pxBounds);}},updateMapToRect:function(){var lonLatBounds=this.getMapBoundsFromRectBounds(this.rectPxBounds);if(this.ovmap.getProjection()!=this.map.getProjection()){lonLatBounds=lonLatBounds.transform(this.ovmap.getProjectionObject(),this.map.getProjectionObject());} +this.map.panTo(lonLatBounds.getCenterLonLat());},setRectPxBounds:function(pxBounds){var top=Math.max(pxBounds.top,0);var left=Math.max(pxBounds.left,0);var bottom=Math.min(pxBounds.top+Math.abs(pxBounds.getHeight()),this.ovmap.size.h-this.hComp);var right=Math.min(pxBounds.left+pxBounds.getWidth(),this.ovmap.size.w-this.wComp);var width=Math.max(right-left,0);var height=Math.max(bottom-top,0);if(width0){params.format=layerContext.formats[0].value;for(i=0,len=layerContext.formats.length;i0){for(i=0,len=layerContext.styles.length;i0&&tagName.indexOf(criteria)>-1){nodes.push(child);}else{matchNodes=this.getSiblingNodesByTagCriteria(child,criteria);if(matchNodes.length>0){(nodes.length==0)?nodes=matchNodes:nodes.push(matchNodes);}}}} +return nodes;},parseAttributes:function(node){var attributes={};if(node.nodeType==1){var children=node.childNodes;var n=children.length;for(var i=0;ithis.pixelTolerance){passes=false;}} +return passes;},clearTimer:function(){if(this.timerId!=null){window.clearTimeout(this.timerId);this.timerId=null;} +if(this.rightclickTimerId!=null){window.clearTimeout(this.rightclickTimerId);this.rightclickTimerId=null;}},delayedCall:function(evt){this.timerId=null;if(evt){this.callback('click',[evt]);}},deactivate:function(){var deactivated=false;if(OpenLayers.Handler.prototype.deactivate.apply(this,arguments)){this.clearTimer();this.down=null;deactivated=true;} +return deactivated;},CLASS_NAME:"OpenLayers.Handler.Click"});OpenLayers.Handler.Drag=OpenLayers.Class(OpenLayers.Handler,{started:false,stopDown:true,dragging:false,last:null,start:null,oldOnselectstart:null,interval:0,timeoutId:null,documentDrag:false,documentEvents:null,initialize:function(control,callbacks,options){OpenLayers.Handler.prototype.initialize.apply(this,arguments);},down:function(evt){},move:function(evt){},up:function(evt){},out:function(evt){},mousedown:function(evt){var propagate=true;this.dragging=false;if(this.checkModifiers(evt)&&OpenLayers.Event.isLeftClick(evt)){this.started=true;this.start=evt.xy;this.last=evt.xy;OpenLayers.Element.addClass(this.map.viewPortDiv,"olDragDown");this.down(evt);this.callback("down",[evt.xy]);OpenLayers.Event.stop(evt);if(!this.oldOnselectstart){this.oldOnselectstart=(document.onselectstart)?document.onselectstart:OpenLayers.Function.True;} +document.onselectstart=OpenLayers.Function.False;propagate=!this.stopDown;}else{this.started=false;this.start=null;this.last=null;} +return propagate;},mousemove:function(evt){if(this.started&&!this.timeoutId&&(evt.xy.x!=this.last.x||evt.xy.y!=this.last.y)){if(this.documentDrag===true&&this.documentEvents){if(evt.element===document){this.adjustXY(evt);this.setEvent(evt);}else{this.destroyDocumentEvents();}} +if(this.interval>0){this.timeoutId=setTimeout(OpenLayers.Function.bind(this.removeTimeout,this),this.interval);} +this.dragging=true;this.move(evt);this.callback("move",[evt.xy]);if(!this.oldOnselectstart){this.oldOnselectstart=document.onselectstart;document.onselectstart=OpenLayers.Function.False;} +this.last=this.evt.xy;} +return true;},removeTimeout:function(){this.timeoutId=null;},mouseup:function(evt){if(this.started){if(this.documentDrag===true&&this.documentEvents){this.adjustXY(evt);this.destroyDocumentEvents();} +var dragged=(this.start!=this.last);this.started=false;this.dragging=false;OpenLayers.Element.removeClass(this.map.viewPortDiv,"olDragDown");this.up(evt);this.callback("up",[evt.xy]);if(dragged){this.callback("done",[evt.xy]);} +document.onselectstart=this.oldOnselectstart;} +return true;},mouseout:function(evt){if(this.started&&OpenLayers.Util.mouseLeft(evt,this.map.div)){if(this.documentDrag===true){this.documentEvents=new OpenLayers.Events(this,document,null,null,{includeXY:true});this.documentEvents.on({mousemove:this.mousemove,mouseup:this.mouseup});OpenLayers.Element.addClass(document.body,"olDragDown");}else{var dragged=(this.start!=this.last);this.started=false;this.dragging=false;OpenLayers.Element.removeClass(this.map.viewPortDiv,"olDragDown");this.out(evt);this.callback("out",[]);if(dragged){this.callback("done",[evt.xy]);} +if(document.onselectstart){document.onselectstart=this.oldOnselectstart;}}} +return true;},click:function(evt){return(this.start==this.last);},activate:function(){var activated=false;if(OpenLayers.Handler.prototype.activate.apply(this,arguments)){this.dragging=false;activated=true;} +return activated;},deactivate:function(){var deactivated=false;if(OpenLayers.Handler.prototype.deactivate.apply(this,arguments)){this.started=false;this.dragging=false;this.start=null;this.last=null;deactivated=true;OpenLayers.Element.removeClass(this.map.viewPortDiv,"olDragDown");} +return deactivated;},adjustXY:function(evt){var pos=OpenLayers.Util.pagePosition(this.map.div);evt.xy.x-=pos[0];evt.xy.y-=pos[1];},destroyDocumentEvents:function(){OpenLayers.Element.removeClass(document.body,"olDragDown");this.documentEvents.destroy();this.documentEvents=null;},CLASS_NAME:"OpenLayers.Handler.Drag"});OpenLayers.Handler.Feature=OpenLayers.Class(OpenLayers.Handler,{EVENTMAP:{'click':{'in':'click','out':'clickout'},'mousemove':{'in':'over','out':'out'},'dblclick':{'in':'dblclick','out':null},'mousedown':{'in':null,'out':null},'mouseup':{'in':null,'out':null}},feature:null,lastFeature:null,down:null,up:null,clickTolerance:4,geometryTypes:null,stopClick:true,stopDown:true,stopUp:false,initialize:function(control,layer,callbacks,options){OpenLayers.Handler.prototype.initialize.apply(this,[control,callbacks,options]);this.layer=layer;},mousedown:function(evt){this.down=evt.xy;return this.handle(evt)?!this.stopDown:true;},mouseup:function(evt){this.up=evt.xy;return this.handle(evt)?!this.stopUp:true;},click:function(evt){return this.handle(evt)?!this.stopClick:true;},mousemove:function(evt){if(!this.callbacks['over']&&!this.callbacks['out']){return true;} +this.handle(evt);return true;},dblclick:function(evt){return!this.handle(evt);},geometryTypeMatches:function(feature){return this.geometryTypes==null||OpenLayers.Util.indexOf(this.geometryTypes,feature.geometry.CLASS_NAME)>-1;},handle:function(evt){if(this.feature&&!this.feature.layer){this.feature=null;} +var type=evt.type;var handled=false;var previouslyIn=!!(this.feature);var click=(type=="click"||type=="dblclick");this.feature=this.layer.getFeatureFromEvent(evt);if(this.feature&&!this.feature.layer){this.feature=null;} +if(this.lastFeature&&!this.lastFeature.layer){this.lastFeature=null;} +if(this.feature){var inNew=(this.feature!=this.lastFeature);if(this.geometryTypeMatches(this.feature)){if(previouslyIn&&inNew){if(this.lastFeature){this.triggerCallback(type,'out',[this.lastFeature]);} +this.triggerCallback(type,'in',[this.feature]);}else if(!previouslyIn||click){this.triggerCallback(type,'in',[this.feature]);} +this.lastFeature=this.feature;handled=true;}else{if(this.lastFeature&&(previouslyIn&&inNew||click)){this.triggerCallback(type,'out',[this.lastFeature]);} +this.feature=null;}}else{if(this.lastFeature&&(previouslyIn||click)){this.triggerCallback(type,'out',[this.lastFeature]);}} +return handled;},triggerCallback:function(type,mode,args){var key=this.EVENTMAP[type][mode];if(key){if(type=='click'&&this.up&&this.down){var dpx=Math.sqrt(Math.pow(this.up.x-this.down.x,2)+ +Math.pow(this.up.y-this.down.y,2));if(dpx<=this.clickTolerance){this.callback(key,args);}}else{this.callback(key,args);}}},activate:function(){var activated=false;if(OpenLayers.Handler.prototype.activate.apply(this,arguments)){this.moveLayerToTop();this.map.events.on({"removelayer":this.handleMapEvents,"changelayer":this.handleMapEvents,scope:this});activated=true;} +return activated;},deactivate:function(){var deactivated=false;if(OpenLayers.Handler.prototype.deactivate.apply(this,arguments)){this.moveLayerBack();this.feature=null;this.lastFeature=null;this.down=null;this.up=null;this.map.events.un({"removelayer":this.handleMapEvents,"changelayer":this.handleMapEvents,scope:this});deactivated=true;} +return deactivated;},handleMapEvents:function(evt){if(!evt.property||evt.property=="order"){this.moveLayerToTop();}},moveLayerToTop:function(){var index=Math.max(this.map.Z_INDEX_BASE['Feature']-1,this.layer.getZIndex())+1;this.layer.setZIndex(index);},moveLayerBack:function(){var index=this.layer.getZIndex()-1;if(index>=this.map.Z_INDEX_BASE['Feature']){this.layer.setZIndex(index);}else{this.map.setLayerZIndex(this.layer,this.map.getLayerIndex(this.layer));}},CLASS_NAME:"OpenLayers.Handler.Feature"});OpenLayers.Handler.Hover=OpenLayers.Class(OpenLayers.Handler,{delay:500,pixelTolerance:null,stopMove:false,px:null,timerId:null,initialize:function(control,callbacks,options){OpenLayers.Handler.prototype.initialize.apply(this,arguments);},mousemove:function(evt){if(this.passesTolerance(evt.xy)){this.clearTimer();this.callback('move',[evt]);this.px=evt.xy;evt=OpenLayers.Util.extend({},evt);this.timerId=window.setTimeout(OpenLayers.Function.bind(this.delayedCall,this,evt),this.delay);} +return!this.stopMove;},mouseout:function(evt){if(OpenLayers.Util.mouseLeft(evt,this.map.div)){this.clearTimer();this.callback('move',[evt]);} +return true;},passesTolerance:function(px){var passes=true;if(this.pixelTolerance&&this.px){var dpx=Math.sqrt(Math.pow(this.px.x-px.x,2)+ +Math.pow(this.px.y-px.y,2));if(dpx=0){this.initResolutions();break;}}}},onMapResize:function(){},redraw:function(){var redrawn=false;if(this.map){this.inRange=this.calculateInRange();var extent=this.getExtent();if(extent&&this.inRange&&this.visibility){var zoomChanged=true;this.moveTo(extent,zoomChanged,false);this.events.triggerEvent("moveend",{"zoomChanged":zoomChanged});redrawn=true;}} +return redrawn;},moveTo:function(bounds,zoomChanged,dragging){var display=this.visibility;if(!this.isBaseLayer){display=display&&this.inRange;} +this.display(display);},setMap:function(map){if(this.map==null){this.map=map;this.maxExtent=this.maxExtent||this.map.maxExtent;this.minExtent=this.minExtent||this.map.minExtent;this.projection=this.projection||this.map.projection;if(typeof this.projection=="string"){this.projection=new OpenLayers.Projection(this.projection);} +this.units=this.projection.getUnits()||this.units||this.map.units;this.initResolutions();if(!this.isBaseLayer){this.inRange=this.calculateInRange();var show=((this.visibility)&&(this.inRange));this.div.style.display=show?"":"none";} +this.setTileSize();}},afterAdd:function(){},removeMap:function(map){},getImageSize:function(bounds){return(this.imageSize||this.tileSize);},setTileSize:function(size){var tileSize=(size)?size:((this.tileSize)?this.tileSize:this.map.getTileSize());this.tileSize=tileSize;if(this.gutter){this.imageOffset=new OpenLayers.Pixel(-this.gutter,-this.gutter);this.imageSize=new OpenLayers.Size(tileSize.w+(2*this.gutter),tileSize.h+(2*this.gutter));}},getVisibility:function(){return this.visibility;},setVisibility:function(visibility){if(visibility!=this.visibility){this.visibility=visibility;this.display(visibility);this.redraw();if(this.map!=null){this.map.events.triggerEvent("changelayer",{layer:this,property:"visibility"});} +this.events.triggerEvent("visibilitychanged");}},display:function(display){if(display!=(this.div.style.display!="none")){this.div.style.display=(display&&this.calculateInRange())?"block":"none";}},calculateInRange:function(){var inRange=false;if(this.alwaysInRange){inRange=true;}else{if(this.map){var resolution=this.map.getResolution();inRange=((resolution>=this.minResolution)&&(resolution<=this.maxResolution));}} +return inRange;},setIsBaseLayer:function(isBaseLayer){if(isBaseLayer!=this.isBaseLayer){this.isBaseLayer=isBaseLayer;if(this.map!=null){this.map.events.triggerEvent("changebaselayer",{layer:this});}}},initResolutions:function(){var i,len;var props={},alwaysInRange=true;for(i=0,len=this.RESOLUTION_PROPERTIES.length;i=resolution){highRes=res;lowZoom=i;} +if(res<=resolution){lowRes=res;highZoom=i;break;}} +var dRes=highRes-lowRes;if(dRes>0){zoom=lowZoom+((highRes-resolution)/dRes);}else{zoom=lowZoom;}}else{var diff;var minDiff=Number.POSITIVE_INFINITY;for(var i=0,len=this.resolutions.length;iminDiff){break;} +minDiff=diff;}else{if(this.resolutions[i]4) +this._object.open(sMethod,sUrl,bAsync,sUser,sPassword);else +if(arguments.length>3) +this._object.open(sMethod,sUrl,bAsync,sUser);else +this._object.open(sMethod,sUrl,bAsync);if(!bGecko&&!bIE){this.readyState=cXMLHttpRequest.OPENED;fReadyStateChange(this);} +this._object.onreadystatechange=function(){if(bGecko&&!bAsync) +return;oRequest.readyState=oRequest._object.readyState;fSynchronizeValues(oRequest);if(oRequest._aborted){oRequest.readyState=cXMLHttpRequest.UNSENT;return;} +if(oRequest.readyState==cXMLHttpRequest.DONE){fCleanTransport(oRequest);if(bIE&&bAsync) +window.detachEvent("onunload",fOnUnload);} +if(nState!=oRequest.readyState) +fReadyStateChange(oRequest);nState=oRequest.readyState;}};cXMLHttpRequest.prototype.send=function(vData){if(cXMLHttpRequest.onsend) +cXMLHttpRequest.onsend.apply(this,arguments);if(vData&&vData.nodeType){vData=window.XMLSerializer?new window.XMLSerializer().serializeToString(vData):vData.xml;if(!this._headers["Content-Type"]) +this._object.setRequestHeader("Content-Type","application/xml");} +this._object.send(vData);if(bGecko&&!this._async){this.readyState=cXMLHttpRequest.OPENED;fSynchronizeValues(this);while(this.readyStatecXMLHttpRequest.UNSENT) +this._aborted=true;this._object.abort();fCleanTransport(this);};cXMLHttpRequest.prototype.getAllResponseHeaders=function(){return this._object.getAllResponseHeaders();};cXMLHttpRequest.prototype.getResponseHeader=function(sName){return this._object.getResponseHeader(sName);};cXMLHttpRequest.prototype.setRequestHeader=function(sName,sValue){if(!this._headers) +this._headers={};this._headers[sName]=sValue;return this._object.setRequestHeader(sName,sValue);};cXMLHttpRequest.prototype.addEventListener=function(sName,fHandler,bUseCapture){for(var nIndex=0,oListener;oListener=this._listeners[nIndex];nIndex++) +if(oListener[0]==sName&&oListener[1]==fHandler&&oListener[2]==bUseCapture) +return;this._listeners.push([sName,fHandler,bUseCapture]);};cXMLHttpRequest.prototype.removeEventListener=function(sName,fHandler,bUseCapture){for(var nIndex=0,oListener;oListener=this._listeners[nIndex];nIndex++) +if(oListener[0]==sName&&oListener[1]==fHandler&&oListener[2]==bUseCapture) +break;if(oListener) +this._listeners.splice(nIndex,1);};cXMLHttpRequest.prototype.dispatchEvent=function(oEvent){var oEventPseudo={'type':oEvent.type,'target':this,'currentTarget':this,'eventPhase':2,'bubbles':oEvent.bubbles,'cancelable':oEvent.cancelable,'timeStamp':oEvent.timeStamp,'stopPropagation':function(){},'preventDefault':function(){},'initEvent':function(){}};if(oEventPseudo.type=="readystatechange"&&this.onreadystatechange) +(this.onreadystatechange.handleEvent||this.onreadystatechange).apply(this,[oEventPseudo]);for(var nIndex=0,oListener;oListener=this._listeners[nIndex];nIndex++) +if(oListener[0]==oEventPseudo.type&&!oListener[2]) +(oListener[1].handleEvent||oListener[1]).apply(this,[oEventPseudo]);};cXMLHttpRequest.prototype.toString=function(){return'['+"object"+' '+"XMLHttpRequest"+']';};cXMLHttpRequest.toString=function(){return'['+"XMLHttpRequest"+']';};function fReadyStateChange(oRequest){if(cXMLHttpRequest.onreadystatechange) +cXMLHttpRequest.onreadystatechange.apply(oRequest);oRequest.dispatchEvent({'type':"readystatechange",'bubbles':false,'cancelable':false,'timeStamp':new Date+0});};function fGetDocument(oRequest){var oDocument=oRequest.responseXML,sResponse=oRequest.responseText;if(bIE&&sResponse&&oDocument&&!oDocument.documentElement&&oRequest.getResponseHeader("Content-Type").match(/[^\/]+\/[^\+]+\+xml/)){oDocument=new window.ActiveXObject("Microsoft.XMLDOM");oDocument.async=false;oDocument.validateOnParse=false;oDocument.loadXML(sResponse);} +if(oDocument) +if((bIE&&oDocument.parseError!=0)||!oDocument.documentElement||(oDocument.documentElement&&oDocument.documentElement.tagName=="parsererror")) +return null;return oDocument;};function fSynchronizeValues(oRequest){try{oRequest.responseText=oRequest._object.responseText;}catch(e){} +try{oRequest.responseXML=fGetDocument(oRequest._object);}catch(e){} +try{oRequest.status=oRequest._object.status;}catch(e){} +try{oRequest.statusText=oRequest._object.statusText;}catch(e){}};function fCleanTransport(oRequest){oRequest._object.onreadystatechange=new window.Function;};if(!window.Function.prototype.apply){window.Function.prototype.apply=function(oRequest,oArguments){if(!oArguments) +oArguments=[];oRequest.__func=this;oRequest.__func(oArguments[0],oArguments[1],oArguments[2],oArguments[3],oArguments[4]);delete oRequest.__func;};};OpenLayers.Request.XMLHttpRequest=cXMLHttpRequest;})();OpenLayers.Tile.Image.IFrame=OpenLayers.Class(OpenLayers.Tile.Image,{initialize:function(layer,position,bounds,url,size){OpenLayers.Tile.Image.prototype.initialize.apply(this,arguments);this.layerAlphaHack=false;},destroy:function(){if(this.imgDiv!=null){OpenLayers.Event.stopObservingElement(this.imgDiv.firstChild);} +OpenLayers.Tile.Image.prototype.destroy.apply(this,arguments);},clear:function(){if(this.imgDiv){var iFrame=this.imgDiv.firstChild;OpenLayers.Event.stopObservingElement(iFrame);this.imgDiv.removeChild(iFrame);}},clone:function(obj){if(obj==null){obj=new OpenLayers.Tile.Image.IFrame(this.layer,this.position,this.bounds,this.url,this.size);} +obj=OpenLayers.Tile.Image.prototype.clone.apply(this,[obj]);return obj;},renderTile:function(){if(OpenLayers.Tile.Image.prototype.renderTile.apply(this,arguments)){var form=this.createRequestForm();this.imgDiv.appendChild(form);form.submit();this.imgDiv.removeChild(form);}},initImgDiv:function(){this.imgDiv=this.createImgDiv();OpenLayers.Util.modifyDOMElement(this.imgDiv,this.id,null,this.layer.getImageSize(),"relative");this.imgDiv.className='olTileImage';this.frame.appendChild(this.imgDiv);this.layer.div.appendChild(this.frame);if(this.layer.opacity!=null){OpenLayers.Util.modifyDOMElement(this.imgDiv,null,null,null,null,null,null,this.layer.opacity);} +this.imgDiv.map=this.layer.map;},createImgDiv:function(){var eventPane=document.createElement("div");if(OpenLayers.Util.getBrowserName()=="msie"){eventPane.style.backgroundColor='#FFFFFF';eventPane.style.filter='chroma(color=#FFFFFF)';} +OpenLayers.Util.modifyDOMElement(eventPane,null,new OpenLayers.Pixel(0,0),this.layer.getImageSize(),"absolute");var imgDiv=document.createElement("div");imgDiv.appendChild(eventPane);return imgDiv;},createIFrame:function(){var id=this.id+'_iFrame';var iframe;if(OpenLayers.Util.getBrowserName()=="msie"){iframe=document.createElement('',inline_markup:'
                      {content}
                      ',custom_markup:'',social_tools:''},pp_settings);var matchedObjects=this,percentBased=false,pp_dimensions,pp_open,pp_contentHeight,pp_contentWidth,pp_containerHeight,pp_containerWidth,windowHeight=$(window).height(),windowWidth=$(window).width(),pp_slideshow;doresize=true,scroll_pos=_get_scroll();$(window).unbind('resize.prettyphoto').bind('resize.prettyphoto',function(){_center_overlay();_resize_overlay();});if(pp_settings.keyboard_shortcuts){$(document).unbind('keydown.prettyphoto').bind('keydown.prettyphoto',function(e){if(typeof $pp_pic_holder!='undefined'){if($pp_pic_holder.is(':visible')){switch(e.keyCode){case 37:$.prettyPhoto.changePage('previous');e.preventDefault();break;case 39:$.prettyPhoto.changePage('next');e.preventDefault();break;case 27:if(!settings.modal) +$.prettyPhoto.close();e.preventDefault();break;};};};});};$.prettyPhoto.initialize=function(){settings=pp_settings;if(settings.theme=='pp_default')settings.horizontal_padding=16;if(settings.ie6_fallback&&$.browser.msie&&parseInt($.browser.version)==6)settings.theme="light_square";theRel=$(this).attr('rel');galleryRegExp=/\[(?:.*)\]/;isSet=(galleryRegExp.exec(theRel))?true:false;pp_images=(isSet)?jQuery.map(matchedObjects,function(n,i){if($(n).attr('rel').indexOf(theRel)!=-1)return $(n).attr('href');}):$.makeArray($(this).attr('href'));pp_titles=(isSet)?jQuery.map(matchedObjects,function(n,i){if($(n).attr('rel').indexOf(theRel)!=-1)return($(n).find('img').attr('alt'))?$(n).find('img').attr('alt'):"";}):$.makeArray($(this).find('img').attr('alt'));pp_descriptions=(isSet)?jQuery.map(matchedObjects,function(n,i){if($(n).attr('rel').indexOf(theRel)!=-1)return($(n).attr('title'))?$(n).attr('title'):"";}):$.makeArray($(this).attr('title'));if(pp_images.length>30)settings.overlay_gallery=false;set_position=jQuery.inArray($(this).attr('href'),pp_images);rel_index=(isSet)?set_position:$("a[rel^='"+theRel+"']").index($(this));_build_overlay(this);if(settings.allow_resize) +$(window).bind('scroll.prettyphoto',function(){_center_overlay();});$.prettyPhoto.open();return false;} +$.prettyPhoto.open=function(event){if(typeof settings=="undefined"){settings=pp_settings;if($.browser.msie&&$.browser.version==6)settings.theme="light_square";pp_images=$.makeArray(arguments[0]);pp_titles=(arguments[1])?$.makeArray(arguments[1]):$.makeArray("");pp_descriptions=(arguments[2])?$.makeArray(arguments[2]):$.makeArray("");isSet=(pp_images.length>1)?true:false;set_position=0;_build_overlay(event.target);} +if($.browser.msie&&$.browser.version==6)$('select').css('visibility','hidden');if(settings.hideflash)$('object,embed,iframe[src*=youtube],iframe[src*=vimeo]').css('visibility','hidden');_checkPosition($(pp_images).size());$('.pp_loaderIcon').show();if(settings.deeplinking) +setHashtag();if(settings.social_tools){facebook_like_link=settings.social_tools.replace('{location_href}',encodeURIComponent(location.href));$pp_pic_holder.find('.pp_social').html(facebook_like_link);} +if($ppt.is(':hidden'))$ppt.css('opacity',0).show();$pp_overlay.show().fadeTo(settings.animation_speed,settings.opacity);$pp_pic_holder.find('.currentTextHolder').text((set_position+1)+settings.counter_separator_label+$(pp_images).size());if(pp_descriptions[set_position]!=""){$pp_pic_holder.find('.pp_description').show().html(unescape(pp_descriptions[set_position]));}else{$pp_pic_holder.find('.pp_description').hide();} +movie_width=(parseFloat(getParam('width',pp_images[set_position])))?getParam('width',pp_images[set_position]):settings.default_width.toString();movie_height=(parseFloat(getParam('height',pp_images[set_position])))?getParam('height',pp_images[set_position]):settings.default_height.toString();percentBased=false;if(movie_height.indexOf('%')!=-1){movie_height=parseFloat(($(window).height()*parseFloat(movie_height)/100)-150);percentBased=true;} +if(movie_width.indexOf('%')!=-1){movie_width=parseFloat(($(window).width()*parseFloat(movie_width)/100)-150);percentBased=true;} +$pp_pic_holder.fadeIn(function(){(settings.show_title&&pp_titles[set_position]!=""&&typeof pp_titles[set_position]!="undefined")?$ppt.html(unescape(pp_titles[set_position])):$ppt.html(' ');imgPreloader="";skipInjection=false;switch(_getFileType(pp_images[set_position])){case'image':imgPreloader=new Image();nextImage=new Image();if(isSet&&set_position<$(pp_images).size()-1)nextImage.src=pp_images[set_position+1];prevImage=new Image();if(isSet&&pp_images[set_position-1])prevImage.src=pp_images[set_position-1];$pp_pic_holder.find('#pp_full_res')[0].innerHTML=settings.image_markup.replace(/{path}/g,pp_images[set_position]);imgPreloader.onload=function(){pp_dimensions=_fitToViewport(imgPreloader.width,imgPreloader.height);_showContent();};imgPreloader.onerror=function(){alert('Image cannot be loaded. Make sure the path is correct and image exist.');$.prettyPhoto.close();};imgPreloader.src=pp_images[set_position];break;case'youtube':pp_dimensions=_fitToViewport(movie_width,movie_height);movie_id=getParam('v',pp_images[set_position]);if(movie_id==""){movie_id=pp_images[set_position].split('youtu.be/');movie_id=movie_id[1];if(movie_id.indexOf('?')>0) +movie_id=movie_id.substr(0,movie_id.indexOf('?'));if(movie_id.indexOf('&')>0) +movie_id=movie_id.substr(0,movie_id.indexOf('&'));} +movie='http://www.youtube.com/embed/'+movie_id;(getParam('rel',pp_images[set_position]))?movie+="?rel="+getParam('rel',pp_images[set_position]):movie+="?rel=1";if(settings.autoplay)movie+="&autoplay=1";toInject=settings.iframe_markup.replace(/{width}/g,pp_dimensions['width']).replace(/{height}/g,pp_dimensions['height']).replace(/{wmode}/g,settings.wmode).replace(/{path}/g,movie);break;case'vimeo':pp_dimensions=_fitToViewport(movie_width,movie_height);movie_id=pp_images[set_position];var regExp=/http:\/\/(www\.)?vimeo.com\/(\d+)/;var match=movie_id.match(regExp);movie='http://player.vimeo.com/video/'+match[2]+'?title=0&byline=0&portrait=0';if(settings.autoplay)movie+="&autoplay=1;";vimeo_width=pp_dimensions['width']+'/embed/?moog_width='+pp_dimensions['width'];toInject=settings.iframe_markup.replace(/{width}/g,vimeo_width).replace(/{height}/g,pp_dimensions['height']).replace(/{path}/g,movie);break;case'quicktime':pp_dimensions=_fitToViewport(movie_width,movie_height);pp_dimensions['height']+=15;pp_dimensions['contentHeight']+=15;pp_dimensions['containerHeight']+=15;toInject=settings.quicktime_markup.replace(/{width}/g,pp_dimensions['width']).replace(/{height}/g,pp_dimensions['height']).replace(/{wmode}/g,settings.wmode).replace(/{path}/g,pp_images[set_position]).replace(/{autoplay}/g,settings.autoplay);break;case'flash':pp_dimensions=_fitToViewport(movie_width,movie_height);flash_vars=pp_images[set_position];flash_vars=flash_vars.substring(pp_images[set_position].indexOf('flashvars')+10,pp_images[set_position].length);filename=pp_images[set_position];filename=filename.substring(0,filename.indexOf('?'));toInject=settings.flash_markup.replace(/{width}/g,pp_dimensions['width']).replace(/{height}/g,pp_dimensions['height']).replace(/{wmode}/g,settings.wmode).replace(/{path}/g,filename+'?'+flash_vars);break;case'iframe':pp_dimensions=_fitToViewport(movie_width,movie_height);frame_url=pp_images[set_position];frame_url=frame_url.substr(0,frame_url.indexOf('iframe')-1);toInject=settings.iframe_markup.replace(/{width}/g,pp_dimensions['width']).replace(/{height}/g,pp_dimensions['height']).replace(/{path}/g,frame_url);break;case'ajax':doresize=false;pp_dimensions=_fitToViewport(movie_width,movie_height);doresize=true;skipInjection=true;$.get(pp_images[set_position],function(responseHTML){toInject=settings.inline_markup.replace(/{content}/g,responseHTML);$pp_pic_holder.find('#pp_full_res')[0].innerHTML=toInject;_showContent();});break;case'custom':pp_dimensions=_fitToViewport(movie_width,movie_height);toInject=settings.custom_markup;break;case'inline':myClone=$(pp_images[set_position]).clone().append('
                      ').css({'width':settings.default_width}).wrapInner('
                      ').appendTo($('body')).show();doresize=false;pp_dimensions=_fitToViewport($(myClone).width(),$(myClone).height());doresize=true;$(myClone).remove();toInject=settings.inline_markup.replace(/{content}/g,$(pp_images[set_position]).html());break;};if(!imgPreloader&&!skipInjection){$pp_pic_holder.find('#pp_full_res')[0].innerHTML=toInject;_showContent();};});return false;};$.prettyPhoto.changePage=function(direction){currentGalleryPage=0;if(direction=='previous'){set_position--;if(set_position<0)set_position=$(pp_images).size()-1;}else if(direction=='next'){set_position++;if(set_position>$(pp_images).size()-1)set_position=0;}else{set_position=direction;};rel_index=set_position;if(!doresize)doresize=true;$('.pp_contract').removeClass('pp_contract').addClass('pp_expand');_hideContent(function(){$.prettyPhoto.open();});};$.prettyPhoto.changeGalleryPage=function(direction){if(direction=='next'){currentGalleryPage++;if(currentGalleryPage>totalPage)currentGalleryPage=0;}else if(direction=='previous'){currentGalleryPage--;if(currentGalleryPage<0)currentGalleryPage=totalPage;}else{currentGalleryPage=direction;};slide_speed=(direction=='next'||direction=='previous')?settings.animation_speed:0;slide_to=currentGalleryPage*(itemsPerPage*itemWidth);$pp_gallery.find('ul').animate({left:-slide_to},slide_speed);};$.prettyPhoto.startSlideshow=function(){if(typeof pp_slideshow=='undefined'){$pp_pic_holder.find('.pp_play').unbind('click').removeClass('pp_play').addClass('pp_pause').click(function(){$.prettyPhoto.stopSlideshow();return false;});pp_slideshow=setInterval($.prettyPhoto.startSlideshow,settings.slideshow);}else{$.prettyPhoto.changePage('next');};} +$.prettyPhoto.stopSlideshow=function(){$pp_pic_holder.find('.pp_pause').unbind('click').removeClass('pp_pause').addClass('pp_play').click(function(){$.prettyPhoto.startSlideshow();return false;});clearInterval(pp_slideshow);pp_slideshow=undefined;} +$.prettyPhoto.close=function(){if($pp_overlay.is(":animated"))return;$.prettyPhoto.stopSlideshow();$pp_pic_holder.stop().find('object,embed').css('visibility','hidden');$('div.pp_pic_holder,div.ppt,.pp_fade').fadeOut(settings.animation_speed,function(){$(this).remove();});$pp_overlay.fadeOut(settings.animation_speed,function(){if($.browser.msie&&$.browser.version==6)$('select').css('visibility','visible');if(settings.hideflash)$('object,embed,iframe[src*=youtube],iframe[src*=vimeo]').css('visibility','visible');$(this).remove();$(window).unbind('scroll.prettyphoto');clearHashtag();settings.callback();doresize=true;pp_open=false;delete settings;});};function _showContent(){$('.pp_loaderIcon').hide();projectedTop=scroll_pos['scrollTop']+((windowHeight/2)-(pp_dimensions['containerHeight']/2));if(projectedTop<0)projectedTop=0;$ppt.fadeTo(settings.animation_speed,1);$pp_pic_holder.find('.pp_content').animate({height:pp_dimensions['contentHeight'],width:pp_dimensions['contentWidth']},settings.animation_speed);$pp_pic_holder.animate({'top':projectedTop,'left':(windowWidth/2)-(pp_dimensions['containerWidth']/2),width:pp_dimensions['containerWidth']},settings.animation_speed,function(){$pp_pic_holder.find('.pp_hoverContainer,#fullResImage').height(pp_dimensions['height']).width(pp_dimensions['width']);$pp_pic_holder.find('.pp_fade').fadeIn(settings.animation_speed);if(isSet&&_getFileType(pp_images[set_position])=="image"){$pp_pic_holder.find('.pp_hoverContainer').show();}else{$pp_pic_holder.find('.pp_hoverContainer').hide();} +if(pp_dimensions['resized']){$('a.pp_expand,a.pp_contract').show();}else{$('a.pp_expand').hide();} +if(settings.autoplay_slideshow&&!pp_slideshow&&!pp_open)$.prettyPhoto.startSlideshow();settings.changepicturecallback();pp_open=true;});_insert_gallery();};function _hideContent(callback){$pp_pic_holder.find('#pp_full_res object,#pp_full_res embed').css('visibility','hidden');$pp_pic_holder.find('.pp_fade').fadeOut(settings.animation_speed,function(){$('.pp_loaderIcon').show();callback();});};function _checkPosition(setCount){(setCount>1)?$('.pp_nav').show():$('.pp_nav').hide();};function _fitToViewport(width,height){resized=false;_getDimensions(width,height);imageWidth=width,imageHeight=height;if(((pp_containerWidth>windowWidth)||(pp_containerHeight>windowHeight))&&doresize&&settings.allow_resize&&!percentBased){resized=true,fitting=false;while(!fitting){if((pp_containerWidth>windowWidth)){imageWidth=(windowWidth-200);imageHeight=(height/width)*imageWidth;}else if((pp_containerHeight>windowHeight)){imageHeight=(windowHeight-200);imageWidth=(width/height)*imageHeight;}else{fitting=true;};pp_containerHeight=imageHeight,pp_containerWidth=imageWidth;};_getDimensions(imageWidth,imageHeight);if((pp_containerWidth>windowWidth)||(pp_containerHeight>windowHeight)){_fitToViewport(pp_containerWidth,pp_containerHeight)};};return{width:Math.floor(imageWidth),height:Math.floor(imageHeight),containerHeight:Math.floor(pp_containerHeight),containerWidth:Math.floor(pp_containerWidth)+(settings.horizontal_padding*2),contentHeight:Math.floor(pp_contentHeight),contentWidth:Math.floor(pp_contentWidth),resized:resized};};function _getDimensions(width,height){width=parseFloat(width);height=parseFloat(height);$pp_details=$pp_pic_holder.find('.pp_details');$pp_details.width(width);detailsHeight=parseFloat($pp_details.css('marginTop'))+parseFloat($pp_details.css('marginBottom'));$pp_details=$pp_details.clone().addClass(settings.theme).width(width).appendTo($('body')).css({'position':'absolute','top':-10000});detailsHeight+=$pp_details.height();detailsHeight=(detailsHeight<=34)?36:detailsHeight;if($.browser.msie&&$.browser.version==7)detailsHeight+=8;$pp_details.remove();$pp_title=$pp_pic_holder.find('.ppt');$pp_title.width(width);titleHeight=parseFloat($pp_title.css('marginTop'))+parseFloat($pp_title.css('marginBottom'));$pp_title=$pp_title.clone().appendTo($('body')).css({'position':'absolute','top':-10000});titleHeight+=$pp_title.height();$pp_title.remove();pp_contentHeight=height+detailsHeight;pp_contentWidth=width;pp_containerHeight=pp_contentHeight+titleHeight+$pp_pic_holder.find('.pp_top').height()+$pp_pic_holder.find('.pp_bottom').height();pp_containerWidth=width;} +function _getFileType(itemSrc){if(itemSrc.match(/youtube\.com\/watch/i)||itemSrc.match(/youtu\.be/i)){return'youtube';}else if(itemSrc.match(/vimeo\.com/i)){return'vimeo';}else if(itemSrc.match(/\b.mov\b/i)){return'quicktime';}else if(itemSrc.match(/\b.swf\b/i)){return'flash';}else if(itemSrc.match(/\biframe=true\b/i)){return'iframe';}else if(itemSrc.match(/\bajax=true\b/i)){return'ajax';}else if(itemSrc.match(/\bcustom=true\b/i)){return'custom';}else if(itemSrc.substr(0,1)=='#'){return'inline';}else{return'image';};};function _center_overlay(){if(doresize&&typeof $pp_pic_holder!='undefined'){scroll_pos=_get_scroll();contentHeight=$pp_pic_holder.height(),contentwidth=$pp_pic_holder.width();projectedTop=(windowHeight/2)+scroll_pos['scrollTop']-(contentHeight/2);if(projectedTop<0)projectedTop=0;if(contentHeight>windowHeight) +return;$pp_pic_holder.css({'top':projectedTop,'left':(windowWidth/2)+scroll_pos['scrollLeft']-(contentwidth/2)});};};function _get_scroll(){if(self.pageYOffset){return{scrollTop:self.pageYOffset,scrollLeft:self.pageXOffset};}else if(document.documentElement&&document.documentElement.scrollTop){return{scrollTop:document.documentElement.scrollTop,scrollLeft:document.documentElement.scrollLeft};}else if(document.body){return{scrollTop:document.body.scrollTop,scrollLeft:document.body.scrollLeft};};};function _resize_overlay(){windowHeight=$(window).height(),windowWidth=$(window).width();if(typeof $pp_overlay!="undefined")$pp_overlay.height($(document).height()).width(windowWidth);};function _insert_gallery(){if(isSet&&settings.overlay_gallery&&_getFileType(pp_images[set_position])=="image"&&(settings.ie6_fallback&&!($.browser.msie&&parseInt($.browser.version)==6))){itemWidth=52+5;navWidth=(settings.theme=="facebook"||settings.theme=="pp_default")?50:30;itemsPerPage=Math.floor((pp_dimensions['containerWidth']-100-navWidth)/itemWidth);itemsPerPage=(itemsPerPage";};toInject=settings.gallery_markup.replace(/{gallery}/g,toInject);$pp_pic_holder.find('#pp_full_res').after(toInject);$pp_gallery=$('.pp_pic_holder .pp_gallery'),$pp_gallery_li=$pp_gallery.find('li');$pp_gallery.find('.pp_arrow_next').click(function(){$.prettyPhoto.changeGalleryPage('next');$.prettyPhoto.stopSlideshow();return false;});$pp_gallery.find('.pp_arrow_previous').click(function(){$.prettyPhoto.changeGalleryPage('previous');$.prettyPhoto.stopSlideshow();return false;});$pp_pic_holder.find('.pp_content').hover(function(){$pp_pic_holder.find('.pp_gallery:not(.disabled)').fadeIn();},function(){$pp_pic_holder.find('.pp_gallery:not(.disabled)').fadeOut();});itemWidth=52+5;$pp_gallery_li.each(function(i){$(this).find('a').click(function(){$.prettyPhoto.changePage(i);$.prettyPhoto.stopSlideshow();return false;});});};if(settings.slideshow){$pp_pic_holder.find('.pp_nav').prepend('Play') +$pp_pic_holder.find('.pp_nav .pp_play').click(function(){$.prettyPhoto.startSlideshow();return false;});} +$pp_pic_holder.attr('class','pp_pic_holder '+settings.theme);$pp_overlay.css({'opacity':0,'height':$(document).height(),'width':$(window).width()}).bind('click',function(){if(!settings.modal)$.prettyPhoto.close();});$('a.pp_close').bind('click',function(){$.prettyPhoto.close();return false;});$('a.pp_expand').bind('click',function(e){if($(this).hasClass('pp_expand')){$(this).removeClass('pp_expand').addClass('pp_contract');doresize=false;}else{$(this).removeClass('pp_contract').addClass('pp_expand');doresize=true;};_hideContent(function(){$.prettyPhoto.open();});return false;});$pp_pic_holder.find('.pp_previous, .pp_nav .pp_arrow_previous').bind('click',function(){$.prettyPhoto.changePage('previous');$.prettyPhoto.stopSlideshow();return false;});$pp_pic_holder.find('.pp_next, .pp_nav .pp_arrow_next').bind('click',function(){$.prettyPhoto.changePage('next');$.prettyPhoto.stopSlideshow();return false;});_center_overlay();};if(!pp_alreadyInitialized&&getHashtag()){pp_alreadyInitialized=true;hashIndex=getHashtag();hashRel=hashIndex;hashIndex=hashIndex.substring(hashIndex.indexOf('/')+1,hashIndex.length-1);hashRel=hashRel.substring(0,hashRel.indexOf('/'));setTimeout(function(){$("a[rel^='"+hashRel+"']:eq("+hashIndex+")").trigger('click');},50);} +return this.unbind('click.prettyphoto').bind('click.prettyphoto',$.prettyPhoto.initialize);};function getHashtag(){url=location.href;hashtag=(url.indexOf('#!')!=-1)?decodeURI(url.substring(url.indexOf('#!')+2,url.length)):false;return hashtag;};function setHashtag(){if(typeof theRel=='undefined')return;location.hash='!'+theRel+'/'+rel_index+'/';};function clearHashtag(){url=location.href;hashtag=(url.indexOf('#!prettyPhoto'))?true:false;if(hashtag)location.hash="!prettyPhoto";} +function getParam(name,url){name=name.replace(/[\[]/,"\\\[").replace(/[\]]/,"\\\]");var regexS="[\\?&]"+name+"=([^&#]*)";var regex=new RegExp(regexS);var results=regex.exec(url);return(results==null)?"":results[1];}})(jQuery);var pp_alreadyInitialized=false; \ No newline at end of file diff --git a/module/viewer/lib/js/proj4js-compressed.js b/module/viewer/lib/js/proj4js-compressed.js new file mode 100644 index 0000000..6e62f86 --- /dev/null +++ b/module/viewer/lib/js/proj4js-compressed.js @@ -0,0 +1,208 @@ +/* + proj4js.js -- Javascript reprojection library. + + Authors: Mike Adair madairATdmsolutions.ca + Richard Greenwood richATgreenwoodmap.com + Didier Richard didier.richardATign.fr + Stephen Irons + License: LGPL as per: http://www.gnu.org/copyleft/lesser.html + Note: This program is an almost direct port of the C library + Proj4. +*/ +Proj4js={defaultDatum:'WGS84',transform:function(source,dest,point){if(!source.readyToUse||!dest.readyToUse){this.reportError("Proj4js initialization for "+source.srsCode+" not yet complete");return point;} +if((source.srsProjNumber=="900913"&&dest.datumCode!="WGS84")||(dest.srsProjNumber=="900913"&&source.datumCode!="WGS84")){var wgs84=Proj4js.WGS84;this.transform(source,wgs84,point);source=wgs84;} +if(source.projName=="longlat"){point.x*=Proj4js.common.D2R;point.y*=Proj4js.common.D2R;}else{if(source.to_meter){point.x*=source.to_meter;point.y*=source.to_meter;} +source.inverse(point);} +if(source.from_greenwich){point.x+=source.from_greenwich;} +point=this.datum_transform(source.datum,dest.datum,point);if(dest.from_greenwich){point.x-=dest.from_greenwich;} +if(dest.projName=="longlat"){point.x*=Proj4js.common.R2D;point.y*=Proj4js.common.R2D;}else{dest.forward(point);if(dest.to_meter){point.x/=dest.to_meter;point.y/=dest.to_meter;}} +return point;},datum_transform:function(source,dest,point){if(source.compare_datums(dest)){return point;} +if(source.datum_type==Proj4js.common.PJD_NODATUM||dest.datum_type==Proj4js.common.PJD_NODATUM){return point;} +if(source.datum_type==Proj4js.common.PJD_GRIDSHIFT) +{alert("ERROR: Grid shift transformations are not implemented yet.");} +if(dest.datum_type==Proj4js.common.PJD_GRIDSHIFT) +{alert("ERROR: Grid shift transformations are not implemented yet.");} +if(source.es!=dest.es||source.a!=dest.a||source.datum_type==Proj4js.common.PJD_3PARAM||source.datum_type==Proj4js.common.PJD_7PARAM||dest.datum_type==Proj4js.common.PJD_3PARAM||dest.datum_type==Proj4js.common.PJD_7PARAM) +{source.geodetic_to_geocentric(point);if(source.datum_type==Proj4js.common.PJD_3PARAM||source.datum_type==Proj4js.common.PJD_7PARAM){source.geocentric_to_wgs84(point);} +if(dest.datum_type==Proj4js.common.PJD_3PARAM||dest.datum_type==Proj4js.common.PJD_7PARAM){dest.geocentric_from_wgs84(point);} +dest.geocentric_to_geodetic(point);} +if(dest.datum_type==Proj4js.common.PJD_GRIDSHIFT) +{alert("ERROR: Grid shift transformations are not implemented yet.");} +return point;},reportError:function(msg){},extend:function(destination,source){destination=destination||{};if(source){for(var property in source){var value=source[property];if(value!==undefined){destination[property]=value;}}} +return destination;},Class:function(){var Class=function(){this.initialize.apply(this,arguments);};var extended={};var parent;for(var i=0;i-1)&&(index+scriptNameLen==src.length)){this.libPath=src.slice(0,-scriptNameLen);break;}}} +return this.libPath||"";},loadScript:function(url,onload,onfail,loadCheck){var script=document.createElement('script');script.defer=false;script.type="text/javascript";script.id=url;script.src=url;script.onload=onload;script.onerror=onfail;script.loadCheck=loadCheck;if(/MSIE/.test(navigator.userAgent)){script.onreadystatechange=this.checkReadyState;} +document.getElementsByTagName('head')[0].appendChild(script);},checkReadyState:function(){if(this.readyState=='loaded'){if(!this.loadCheck()){this.onerror();}else{this.onload();}}}};Proj4js.Proj=Proj4js.Class({readyToUse:false,title:null,projName:null,units:null,datum:null,initialize:function(srsCode){this.srsCodeInput=srsCode;if(srsCode.indexOf('urn:')==0){var urn=srsCode.split(':');if((urn[1]=='ogc'||urn[1]=='x-ogc')&&(urn[2]=='def')&&(urn[3]=='crs')&&urn.length==7){srsCode=urn[4]+':'+urn[6];}}else if(srsCode.indexOf('http://')==0){var url=srsCode.split('#');if(url[0].match(/epsg.org/)){srsCode='EPSG:'+url[1];}else if(url[0].match(/RIG.xml/)){srsCode='IGNF:'+url[1];}} +this.srsCode=srsCode.toUpperCase();if(this.srsCode.indexOf("EPSG")==0){this.srsCode=this.srsCode;this.srsAuth='epsg';this.srsProjNumber=this.srsCode.substring(5);}else if(this.srsCode.indexOf("IGNF")==0){this.srsCode=this.srsCode;this.srsAuth='IGNF';this.srsProjNumber=this.srsCode.substring(5);}else if(this.srsCode.indexOf("CRS")==0){this.srsCode=this.srsCode;this.srsAuth='CRS';this.srsProjNumber=this.srsCode.substring(4);}else{this.srsAuth='';this.srsProjNumber=this.srsCode;} +this.loadProjDefinition();},loadProjDefinition:function(){if(Proj4js.defs[this.srsCode]){this.defsLoaded();return;} +var url=Proj4js.getScriptLocation()+'defs/'+this.srsAuth.toUpperCase()+this.srsProjNumber+'.js';Proj4js.loadScript(url,Proj4js.bind(this.defsLoaded,this),Proj4js.bind(this.loadFromService,this),Proj4js.bind(this.checkDefsLoaded,this));},loadFromService:function(){var url=Proj4js.defsLookupService+'/'+this.srsAuth+'/'+this.srsProjNumber+'/proj4js/';Proj4js.loadScript(url,Proj4js.bind(this.defsLoaded,this),Proj4js.bind(this.defsFailed,this),Proj4js.bind(this.checkDefsLoaded,this));},defsLoaded:function(){this.parseDefs();this.loadProjCode(this.projName);},checkDefsLoaded:function(){if(Proj4js.defs[this.srsCode]){return true;}else{return false;}},defsFailed:function(){Proj4js.reportError('failed to load projection definition for: '+this.srsCode);Proj4js.defs[this.srsCode]=Proj4js.defs['WGS84'];this.defsLoaded();},loadProjCode:function(projName){if(Proj4js.Proj[projName]){this.initTransforms();return;} +var url=Proj4js.getScriptLocation()+'projCode/'+projName+'.js';Proj4js.loadScript(url,Proj4js.bind(this.loadProjCodeSuccess,this,projName),Proj4js.bind(this.loadProjCodeFailure,this,projName),Proj4js.bind(this.checkCodeLoaded,this,projName));},loadProjCodeSuccess:function(projName){if(Proj4js.Proj[projName].dependsOn){this.loadProjCode(Proj4js.Proj[projName].dependsOn);}else{this.initTransforms();}},loadProjCodeFailure:function(projName){Proj4js.reportError("failed to find projection file for: "+projName);},checkCodeLoaded:function(projName){if(Proj4js.Proj[projName]){return true;}else{return false;}},initTransforms:function(){Proj4js.extend(this,Proj4js.Proj[this.projName]);this.init();this.readyToUse=true;},parseDefs:function(){this.defData=Proj4js.defs[this.srsCode];var paramName,paramVal;if(!this.defData){return;} +var paramArray=this.defData.split("+");for(var prop=0;prop1.0e-7){con=eccent*sinphi;return((1.0-eccent*eccent)*(sinphi/(1.0-con*con)-(.5/eccent)*Math.log((1.0-con)/(1.0+con))));}else{return(2.0*sinphi);}},asinz:function(x){if(Math.abs(x)>1.0){x=(x>1.0)?1.0:-1.0;} +return Math.asin(x);},e0fn:function(x){return(1.0-0.25*x*(1.0+x/16.0*(3.0+1.25*x)));},e1fn:function(x){return(0.375*x*(1.0+0.25*x*(1.0+0.46875*x)));},e2fn:function(x){return(0.05859375*x*x*(1.0+0.75*x));},e3fn:function(x){return(x*x*x*(35.0/3072.0));},mlfn:function(e0,e1,e2,e3,phi){return(e0*phi-e1*Math.sin(2.0*phi)+e2*Math.sin(4.0*phi)-e3*Math.sin(6.0*phi));},srat:function(esinp,exp){return(Math.pow((1.0-esinp)/(1.0+esinp),exp));},sign:function(x){if(x<0.0)return(-1);else return(1);},adjust_lon:function(x){x=(Math.abs(x)this.HALF_PI)return+Number.NaN;if(phi==this.HALF_PI)return Number.POSITIVE_INFINITY;if(phi==-1.0*this.HALF_PI)return-1.0*Number.POSITIVE_INFINITY;var con=eccent*sinphi;return Math.log(Math.tan((this.HALF_PI+phi)/2.0))+eccent*Math.log((1.0-con)/(1.0+con))/2.0;},fL:function(x,L){return 2.0*Math.atan(x*Math.exp(L))-this.HALF_PI;},invlatiso:function(eccent,ts){var phi=this.fL(1.0,ts);var Iphi=0.0;var con=0.0;do{Iphi=phi;con=eccent*Math.sin(Iphi);phi=this.fL(Math.exp(eccent*Math.log((1.0+con)/(1.0-con))/2.0),ts)}while(Math.abs(phi-Iphi)>1.0e-12);return phi;},sinh:function(x) +{var r=Math.exp(x);r=(r-1.0/r)/2.0;return r;},cosh:function(x) +{var r=Math.exp(x);r=(r+1.0/r)/2.0;return r;},tanh:function(x) +{var r=Math.exp(x);r=(r-1.0/r)/(r+1.0/r);return r;},asinh:function(x) +{var s=(x>=0?1.0:-1.0);return s*(Math.log(Math.abs(x)+Math.sqrt(x*x+1.0)));},acosh:function(x) +{return 2.0*Math.log(Math.sqrt((x+1.0)/2.0)+Math.sqrt((x-1.0)/2.0));},atanh:function(x) +{return Math.log((x-1.0)/(x+1.0))/2.0;},gN:function(a,e,sinphi) +{var temp=e*sinphi;return a/Math.sqrt(1.0-temp*temp);}};Proj4js.datum=Proj4js.Class({initialize:function(proj){this.datum_type=Proj4js.common.PJD_WGS84;if(proj.datumCode&&proj.datumCode=='none'){this.datum_type=Proj4js.common.PJD_NODATUM;} +if(proj&&proj.datum_params){for(var i=0;i3){if(proj.datum_params[3]!=0||proj.datum_params[4]!=0||proj.datum_params[5]!=0||proj.datum_params[6]!=0){this.datum_type=Proj4js.common.PJD_7PARAM;proj.datum_params[3]*=Proj4js.common.SEC_TO_RAD;proj.datum_params[4]*=Proj4js.common.SEC_TO_RAD;proj.datum_params[5]*=Proj4js.common.SEC_TO_RAD;proj.datum_params[6]=(proj.datum_params[6]/1000000.0)+1.0;}}} +if(proj){this.a=proj.a;this.b=proj.b;this.es=proj.es;this.ep2=proj.ep2;this.datum_params=proj.datum_params;}},compare_datums:function(dest){if(this.datum_type!=dest.datum_type){return false;}else if(this.a!=dest.a||Math.abs(this.es-dest.es)>0.000000000050){return false;}else if(this.datum_type==Proj4js.common.PJD_3PARAM){return(this.datum_params[0]==dest.datum_params[0]&&this.datum_params[1]==dest.datum_params[1]&&this.datum_params[2]==dest.datum_params[2]);}else if(this.datum_type==Proj4js.common.PJD_7PARAM){return(this.datum_params[0]==dest.datum_params[0]&&this.datum_params[1]==dest.datum_params[1]&&this.datum_params[2]==dest.datum_params[2]&&this.datum_params[3]==dest.datum_params[3]&&this.datum_params[4]==dest.datum_params[4]&&this.datum_params[5]==dest.datum_params[5]&&this.datum_params[6]==dest.datum_params[6]);}else if(this.datum_type==Proj4js.common.PJD_GRIDSHIFT){return strcmp(pj_param(this.params,"snadgrids").s,pj_param(dest.params,"snadgrids").s)==0;}else{return true;}},geodetic_to_geocentric:function(p){var Longitude=p.x;var Latitude=p.y;var Height=p.z?p.z:0;var X;var Y;var Z;var Error_Code=0;var Rn;var Sin_Lat;var Sin2_Lat;var Cos_Lat;if(Latitude<-Proj4js.common.HALF_PI&&Latitude>-1.001*Proj4js.common.HALF_PI){Latitude=-Proj4js.common.HALF_PI;}else if(Latitude>Proj4js.common.HALF_PI&&Latitude<1.001*Proj4js.common.HALF_PI){Latitude=Proj4js.common.HALF_PI;}else if((Latitude<-Proj4js.common.HALF_PI)||(Latitude>Proj4js.common.HALF_PI)){Proj4js.reportError('geocent:lat out of range:'+Latitude);return null;} +if(Longitude>Proj4js.common.PI)Longitude-=(2*Proj4js.common.PI);Sin_Lat=Math.sin(Latitude);Cos_Lat=Math.cos(Latitude);Sin2_Lat=Sin_Lat*Sin_Lat;Rn=this.a/(Math.sqrt(1.0e0-this.es*Sin2_Lat));X=(Rn+Height)*Cos_Lat*Math.cos(Longitude);Y=(Rn+Height)*Cos_Lat*Math.sin(Longitude);Z=((Rn*(1-this.es))+Height)*Sin_Lat;p.x=X;p.y=Y;p.z=Z;return Error_Code;},geocentric_to_geodetic:function(p){var genau=1.E-12;var genau2=(genau*genau);var maxiter=30;var P;var RR;var CT;var ST;var RX;var RK;var RN;var CPHI0;var SPHI0;var CPHI;var SPHI;var SDPHI;var At_Pole;var iter;var X=p.x;var Y=p.y;var Z=p.z?p.z:0.0;var Longitude;var Latitude;var Height;At_Pole=false;P=Math.sqrt(X*X+Y*Y);RR=Math.sqrt(X*X+Y*Y+Z*Z);if(P/this.agenau2&&iter0) +{Longitude=Proj4js.common.HALF_PI;} +else if(Y<0) +{Longitude=-Proj4js.common.HALF_PI;} +else +{At_Pole=true;Longitude=0.0;if(Z>0.0) +{Latitude=Proj4js.common.HALF_PI;} +else if(Z<0.0) +{Latitude=-Proj4js.common.HALF_PI;} +else +{Latitude=Proj4js.common.HALF_PI;Height=-this.b;return;}}} +W2=X*X+Y*Y;W=Math.sqrt(W2);T0=Z*Proj4js.common.AD_C;S0=Math.sqrt(T0*T0+W2);Sin_B0=T0/S0;Cos_B0=W/S0;Sin3_B0=Sin_B0*Sin_B0*Sin_B0;T1=Z+this.b*this.ep2*Sin3_B0;Sum=W-this.a*this.es*Cos_B0*Cos_B0*Cos_B0;S1=Math.sqrt(T1*T1+Sum*Sum);Sin_p1=T1/S1;Cos_p1=Sum/S1;Rn=this.a/Math.sqrt(1.0-this.es*Sin_p1*Sin_p1);if(Cos_p1>=Proj4js.common.COS_67P5) +{Height=W/Cos_p1-Rn;} +else if(Cos_p1<=-Proj4js.common.COS_67P5) +{Height=W/-Cos_p1-Rn;} +else +{Height=Z/Sin_p1+Rn*(this.es-1.0);} +if(At_Pole==false) +{Latitude=Math.atan(Sin_p1/Cos_p1);} +p.x=Longitude;p.y=Latitude;p.z=Height;return p;},geocentric_to_wgs84:function(p){if(this.datum_type==Proj4js.common.PJD_3PARAM) +{p.x+=this.datum_params[0];p.y+=this.datum_params[1];p.z+=this.datum_params[2];} +else if(this.datum_type==Proj4js.common.PJD_7PARAM) +{var Dx_BF=this.datum_params[0];var Dy_BF=this.datum_params[1];var Dz_BF=this.datum_params[2];var Rx_BF=this.datum_params[3];var Ry_BF=this.datum_params[4];var Rz_BF=this.datum_params[5];var M_BF=this.datum_params[6];var x_out=M_BF*(p.x-Rz_BF*p.y+Ry_BF*p.z)+Dx_BF;var y_out=M_BF*(Rz_BF*p.x+p.y-Rx_BF*p.z)+Dy_BF;var z_out=M_BF*(-Ry_BF*p.x+Rx_BF*p.y+p.z)+Dz_BF;p.x=x_out;p.y=y_out;p.z=z_out;}},geocentric_from_wgs84:function(p){if(this.datum_type==Proj4js.common.PJD_3PARAM) +{p.x-=this.datum_params[0];p.y-=this.datum_params[1];p.z-=this.datum_params[2];} +else if(this.datum_type==Proj4js.common.PJD_7PARAM) +{var Dx_BF=this.datum_params[0];var Dy_BF=this.datum_params[1];var Dz_BF=this.datum_params[2];var Rx_BF=this.datum_params[3];var Ry_BF=this.datum_params[4];var Rz_BF=this.datum_params[5];var M_BF=this.datum_params[6];var x_tmp=(p.x-Dx_BF)/M_BF;var y_tmp=(p.y-Dy_BF)/M_BF;var z_tmp=(p.z-Dz_BF)/M_BF;p.x=x_tmp+Rz_BF*y_tmp-Ry_BF*z_tmp;p.y=-Rz_BF*x_tmp+y_tmp+Rx_BF*z_tmp;p.z=Ry_BF*x_tmp-Rx_BF*y_tmp+z_tmp;}}});Proj4js.Point=Proj4js.Class({initialize:function(x,y,z){if(typeof x=='object'){this.x=x[0];this.y=x[1];this.z=x[2]||0.0;}else if(typeof x=='string'){var coords=x.split(',');this.x=parseFloat(coords[0]);this.y=parseFloat(coords[1]);this.z=parseFloat(coords[2])||0.0;}else{this.x=x;this.y=y;this.z=z||0.0;}},clone:function(){return new Proj4js.Point(this.x,this.y,this.z);},toString:function(){return("x="+this.x+",y="+this.y);},toShortString:function(){return(this.x+", "+this.y);}});Proj4js.PrimeMeridian={"greenwich":0.0,"lisbon":-9.131906111111,"paris":2.337229166667,"bogota":-74.080916666667,"madrid":-3.687938888889,"rome":12.452333333333,"bern":7.439583333333,"jakarta":106.807719444444,"ferro":-17.666666666667,"brussels":4.367975,"stockholm":18.058277777778,"athens":23.7163375,"oslo":10.722916666667};Proj4js.Ellipsoid={"MERIT":{a:6378137.0,rf:298.257,ellipseName:"MERIT 1983"},"SGS85":{a:6378136.0,rf:298.257,ellipseName:"Soviet Geodetic System 85"},"GRS80":{a:6378137.0,rf:298.257222101,ellipseName:"GRS 1980(IUGG, 1980)"},"IAU76":{a:6378140.0,rf:298.257,ellipseName:"IAU 1976"},"airy":{a:6377563.396,b:6356256.910,ellipseName:"Airy 1830"},"APL4.":{a:6378137,rf:298.25,ellipseName:"Appl. Physics. 1965"},"NWL9D":{a:6378145.0,rf:298.25,ellipseName:"Naval Weapons Lab., 1965"},"mod_airy":{a:6377340.189,b:6356034.446,ellipseName:"Modified Airy"},"andrae":{a:6377104.43,rf:300.0,ellipseName:"Andrae 1876 (Den., Iclnd.)"},"aust_SA":{a:6378160.0,rf:298.25,ellipseName:"Australian Natl & S. Amer. 1969"},"GRS67":{a:6378160.0,rf:298.2471674270,ellipseName:"GRS 67(IUGG 1967)"},"bessel":{a:6377397.155,rf:299.1528128,ellipseName:"Bessel 1841"},"bess_nam":{a:6377483.865,rf:299.1528128,ellipseName:"Bessel 1841 (Namibia)"},"clrk66":{a:6378206.4,b:6356583.8,ellipseName:"Clarke 1866"},"clrk80":{a:6378249.145,rf:293.4663,ellipseName:"Clarke 1880 mod."},"CPM":{a:6375738.7,rf:334.29,ellipseName:"Comm. des Poids et Mesures 1799"},"delmbr":{a:6376428.0,rf:311.5,ellipseName:"Delambre 1810 (Belgium)"},"engelis":{a:6378136.05,rf:298.2566,ellipseName:"Engelis 1985"},"evrst30":{a:6377276.345,rf:300.8017,ellipseName:"Everest 1830"},"evrst48":{a:6377304.063,rf:300.8017,ellipseName:"Everest 1948"},"evrst56":{a:6377301.243,rf:300.8017,ellipseName:"Everest 1956"},"evrst69":{a:6377295.664,rf:300.8017,ellipseName:"Everest 1969"},"evrstSS":{a:6377298.556,rf:300.8017,ellipseName:"Everest (Sabah & Sarawak)"},"fschr60":{a:6378166.0,rf:298.3,ellipseName:"Fischer (Mercury Datum) 1960"},"fschr60m":{a:6378155.0,rf:298.3,ellipseName:"Fischer 1960"},"fschr68":{a:6378150.0,rf:298.3,ellipseName:"Fischer 1968"},"helmert":{a:6378200.0,rf:298.3,ellipseName:"Helmert 1906"},"hough":{a:6378270.0,rf:297.0,ellipseName:"Hough"},"intl":{a:6378388.0,rf:297.0,ellipseName:"International 1909 (Hayford)"},"kaula":{a:6378163.0,rf:298.24,ellipseName:"Kaula 1961"},"lerch":{a:6378139.0,rf:298.257,ellipseName:"Lerch 1979"},"mprts":{a:6397300.0,rf:191.0,ellipseName:"Maupertius 1738"},"new_intl":{a:6378157.5,b:6356772.2,ellipseName:"New International 1967"},"plessis":{a:6376523.0,rf:6355863.0,ellipseName:"Plessis 1817 (France)"},"krass":{a:6378245.0,rf:298.3,ellipseName:"Krassovsky, 1942"},"SEasia":{a:6378155.0,b:6356773.3205,ellipseName:"Southeast Asia"},"walbeck":{a:6376896.0,b:6355834.8467,ellipseName:"Walbeck"},"WGS60":{a:6378165.0,rf:298.3,ellipseName:"WGS 60"},"WGS66":{a:6378145.0,rf:298.25,ellipseName:"WGS 66"},"WGS72":{a:6378135.0,rf:298.26,ellipseName:"WGS 72"},"WGS84":{a:6378137.0,rf:298.257223563,ellipseName:"WGS 84"},"sphere":{a:6370997.0,b:6370997.0,ellipseName:"Normal Sphere (r=6370997)"}};Proj4js.Datum={"WGS84":{towgs84:"0,0,0",ellipse:"WGS84",datumName:"WGS84"},"GGRS87":{towgs84:"-199.87,74.79,246.62",ellipse:"GRS80",datumName:"Greek_Geodetic_Reference_System_1987"},"NAD83":{towgs84:"0,0,0",ellipse:"GRS80",datumName:"North_American_Datum_1983"},"NAD27":{nadgrids:"@conus,@alaska,@ntv2_0.gsb,@ntv1_can.dat",ellipse:"clrk66",datumName:"North_American_Datum_1927"},"potsdam":{towgs84:"606.0,23.0,413.0",ellipse:"bessel",datumName:"Potsdam Rauenberg 1950 DHDN"},"carthage":{towgs84:"-263.0,6.0,431.0",ellipse:"clark80",datumName:"Carthage 1934 Tunisia"},"hermannskogel":{towgs84:"653.0,-212.0,449.0",ellipse:"bessel",datumName:"Hermannskogel"},"ire65":{towgs84:"482.530,-130.596,564.557,-1.042,-0.214,-0.631,8.15",ellipse:"mod_airy",datumName:"Ireland 1965"},"nzgd49":{towgs84:"59.47,-5.04,187.44,0.47,-0.1,1.024,-4.5993",ellipse:"intl",datumName:"New Zealand Geodetic Datum 1949"},"OSGB36":{towgs84:"446.448,-125.157,542.060,0.1502,0.2470,0.8421,-20.4894",ellipse:"airy",datumName:"Airy 1830"}};Proj4js.WGS84=new Proj4js.Proj('WGS84');Proj4js.Datum['OSB36']=Proj4js.Datum['OSGB36'];Proj4js.Proj.aea={init:function(){if(Math.abs(this.lat1+this.lat2)Proj4js.common.EPSLN){this.ns0=(this.ms1*this.ms1-this.ms2*this.ms2)/(this.qs2-this.qs1);}else{this.ns0=this.con;} +this.c=this.ms1*this.ms1+this.ns0*this.qs1;this.rh=this.a*Math.sqrt(this.c-this.ns0*this.qs0)/this.ns0;},forward:function(p){var lon=p.x;var lat=p.y;this.sin_phi=Math.sin(lat);this.cos_phi=Math.cos(lat);var qs=Proj4js.common.qsfnz(this.e3,this.sin_phi,this.cos_phi);var rh1=this.a*Math.sqrt(this.c-this.ns0*qs)/this.ns0;var theta=this.ns0*Proj4js.common.adjust_lon(lon-this.long0);var x=rh1*Math.sin(theta)+this.x0;var y=this.rh-rh1*Math.cos(theta)+this.y0;p.x=x;p.y=y;return p;},inverse:function(p){var rh1,qs,con,theta,lon,lat;p.x-=this.x0;p.y=this.rh-p.y+this.y0;if(this.ns0>=0){rh1=Math.sqrt(p.x*p.x+p.y*p.y);con=1.0;}else{rh1=-Math.sqrt(p.x*p.x+p.y*p.y);con=-1.0;} +theta=0.0;if(rh1!=0.0){theta=Math.atan2(con*p.x,con*p.y);} +con=rh1*this.ns0/this.a;qs=(this.c-con*con)/this.ns0;if(this.e3>=1e-10){con=1-.5*(1.0-this.es)*Math.log((1.0-this.e3)/(1.0+this.e3))/this.e3;if(Math.abs(Math.abs(con)-Math.abs(qs))>.0000000001){lat=this.phi1z(this.e3,qs);}else{if(qs>=0){lat=.5*PI;}else{lat=-.5*PI;}}}else{lat=this.phi1z(e3,qs);} +lon=Proj4js.common.adjust_lon(theta/this.ns0+this.long0);p.x=lon;p.y=lat;return p;},phi1z:function(eccent,qs){var con,com,dphi;var phi=Proj4js.common.asinz(.5*qs);if(eccentProj4js.common.HALF_PI){Proj4js.reportError("equi:Inv:DataError");} +var lon=Proj4js.common.adjust_lon(this.long0+p.x/(this.a*Math.cos(this.lat0)));p.x=lon;p.y=lat;}};Proj4js.Proj.merc={init:function(){if(this.lat_ts){if(this.sphere){this.k0=Math.cos(this.lat_ts);}else{this.k0=Proj4js.common.msfnz(this.es,Math.sin(this.lat_ts),Math.cos(this.lat_ts));}}},forward:function(p){var lon=p.x;var lat=p.y;if(lat*Proj4js.common.R2D>90.0&&lat*Proj4js.common.R2D<-90.0&&lon*Proj4js.common.R2D>180.0&&lon*Proj4js.common.R2D<-180.0){Proj4js.reportError("merc:forward: llInputOutOfRange: "+lon+" : "+lat);return null;} +var x,y;if(Math.abs(Math.abs(lat)-Proj4js.common.HALF_PI)<=Proj4js.common.EPSLN){Proj4js.reportError("merc:forward: ll2mAtPoles");return null;}else{if(this.sphere){x=this.x0+this.a*this.k0*Proj4js.common.adjust_lon(lon-this.long0);y=this.y0+this.a*this.k0*Math.log(Math.tan(Proj4js.common.FORTPI+0.5*lat));}else{var sinphi=Math.sin(lat);var ts=Proj4js.common.tsfnz(this.e,lat,sinphi);x=this.x0+this.a*this.k0*Proj4js.common.adjust_lon(lon-this.long0);y=this.y0-this.a*this.k0*Math.log(ts);} +p.x=x;p.y=y;return p;}},inverse:function(p){var x=p.x-this.x0;var y=p.y-this.y0;var lon,lat;if(this.sphere){lat=Proj4js.common.HALF_PI-2.0*Math.atan(Math.exp(-y/this.a*this.k0));}else{var ts=Math.exp(-y/(this.a*this.k0));lat=Proj4js.common.phi2z(this.e,ts);if(lat==-9999){Proj4js.reportError("merc:inverse: lat = -9999");return null;}} +lon=Proj4js.common.adjust_lon(this.long0+x/(this.a*this.k0));p.x=lon;p.y=lat;return p;}};Proj4js.Proj.utm={dependsOn:'tmerc',init:function(){if(!this.zone){Proj4js.reportError("utm:init: zone must be specified for UTM");return;} +this.lat0=0.0;this.long0=((6*Math.abs(this.zone))-183)*Proj4js.common.D2R;this.x0=500000.0;this.y0=this.utmSouth?10000000.0:0.0;this.k0=0.9996;Proj4js.Proj['tmerc'].init.apply(this);this.forward=Proj4js.Proj['tmerc'].forward;this.inverse=Proj4js.Proj['tmerc'].inverse;}};Proj4js.Proj.eqdc={init:function(){if(!this.mode)this.mode=0;this.temp=this.b/this.a;this.es=1.0-Math.pow(this.temp,2);this.e=Math.sqrt(this.es);this.e0=Proj4js.common.e0fn(this.es);this.e1=Proj4js.common.e1fn(this.es);this.e2=Proj4js.common.e2fn(this.es);this.e3=Proj4js.common.e3fn(this.es);this.sinphi=Math.sin(this.lat1);this.cosphi=Math.cos(this.lat1);this.ms1=Proj4js.common.msfnz(this.e,this.sinphi,this.cosphi);this.ml1=Proj4js.common.mlfn(this.e0,this.e1,this.e2,this.e3,this.lat1);if(this.mode!=0){if(Math.abs(this.lat1+this.lat2)=Proj4js.common.EPSLN){this.ns=(this.ms1-this.ms2)/(this.ml2-this.ml1);}else{this.ns=this.sinphi;}}else{this.ns=this.sinphi;} +this.g=this.ml1+this.ms1/this.ns;this.ml0=Proj4js.common.mlfn(this.e0,this.e1,this.e2,this.e3,this.lat0);this.rh=this.a*(this.g-this.ml0);},forward:function(p){var lon=p.x;var lat=p.y;var ml=Proj4js.common.mlfn(this.e0,this.e1,this.e2,this.e3,lat);var rh1=this.a*(this.g-ml);var theta=this.ns*Proj4js.common.adjust_lon(lon-this.long0);var x=this.x0+rh1*Math.sin(theta);var y=this.y0+this.rh-rh1*Math.cos(theta);p.x=x;p.y=y;return p;},inverse:function(p){p.x-=this.x0;p.y=this.rh-p.y+this.y0;var con,rh1;if(this.ns>=0){var rh1=Math.sqrt(p.x*p.x+p.y*p.y);var con=1.0;}else{rh1=-Math.sqrt(p.x*p.x+p.y*p.y);con=-1.0;} +var theta=0.0;if(rh1!=0.0)theta=Math.atan2(con*p.x,con*p.y);var ml=this.g-rh1/this.a;var lat=this.phi3z(this.ml,this.e0,this.e1,this.e2,this.e3);var lon=Proj4js.common.adjust_lon(this.long0+theta/this.ns);p.x=lon;p.y=lat;return p;},phi3z:function(ml,e0,e1,e2,e3){var phi;var dphi;phi=ml;for(var i=0;i<15;i++){dphi=(ml+e1*Math.sin(2.0*phi)-e2*Math.sin(4.0*phi)+e3*Math.sin(6.0*phi))/e0-phi;phi+=dphi;if(Math.abs(dphi)<=.0000000001){return phi;}} +Proj4js.reportError("PHI3Z-CONV:Latitude failed to converge after 15 iterations");return null;}};Proj4js.Proj.tmerc={init:function(){this.e0=Proj4js.common.e0fn(this.es);this.e1=Proj4js.common.e1fn(this.es);this.e2=Proj4js.common.e2fn(this.es);this.e3=Proj4js.common.e3fn(this.es);this.ml0=this.a*Proj4js.common.mlfn(this.e0,this.e1,this.e2,this.e3,this.lat0);},forward:function(p){var lon=p.x;var lat=p.y;var delta_lon=Proj4js.common.adjust_lon(lon-this.long0);var con;var x,y;var sin_phi=Math.sin(lat);var cos_phi=Math.cos(lat);if(this.sphere){var b=cos_phi*Math.sin(delta_lon);if((Math.abs(Math.abs(b)-1.0))<.0000000001){Proj4js.reportError("tmerc:forward: Point projects into infinity");return(93);}else{x=.5*this.a*this.k0*Math.log((1.0+b)/(1.0-b));con=Math.acos(cos_phi*Math.cos(delta_lon)/Math.sqrt(1.0-b*b));if(lat<0)con=-con;y=this.a*this.k0*(con-this.lat0);}}else{var al=cos_phi*delta_lon;var als=Math.pow(al,2);var c=this.ep2*Math.pow(cos_phi,2);var tq=Math.tan(lat);var t=Math.pow(tq,2);con=1.0-this.es*Math.pow(sin_phi,2);var n=this.a/Math.sqrt(con);var ml=this.a*Proj4js.common.mlfn(this.e0,this.e1,this.e2,this.e3,lat);x=this.k0*n*al*(1.0+als/6.0*(1.0-t+c+als/20.0*(5.0-18.0*t+Math.pow(t,2)+72.0*c-58.0*this.ep2)))+this.x0;y=this.k0*(ml-this.ml0+n*tq*(als*(0.5+als/24.0*(5.0-t+9.0*c+4.0*Math.pow(c,2)+als/30.0*(61.0-58.0*t+Math.pow(t,2)+600.0*c-330.0*this.ep2)))))+this.y0;} +p.x=x;p.y=y;return p;},inverse:function(p){var con,phi;var delta_phi;var i;var max_iter=6;var lat,lon;if(this.sphere){var f=Math.exp(p.x/(this.a*this.k0));var g=.5*(f-1/f);var temp=this.lat0+p.y/(this.a*this.k0);var h=Math.cos(temp);con=Math.sqrt((1.0-h*h)/(1.0+g*g));lat=Proj4js.common.asinz(con);if(temp<0) +lat=-lat;if((g==0)&&(h==0)){lon=this.long0;}else{lon=Proj4js.common.adjust_lon(Math.atan2(g,h)+this.long0);}}else{var x=p.x-this.x0;var y=p.y-this.y0;con=(this.ml0+y/this.k0)/this.a;phi=con;for(i=0;true;i++){delta_phi=((con+this.e1*Math.sin(2.0*phi)-this.e2*Math.sin(4.0*phi)+this.e3*Math.sin(6.0*phi))/this.e0)-phi;phi+=delta_phi;if(Math.abs(delta_phi)<=Proj4js.common.EPSLN)break;if(i>=max_iter){Proj4js.reportError("tmerc:inverse: Latitude failed to converge");return(95);}} +if(Math.abs(phi)0)||(Math.abs(g)<=Proj4js.common.EPSLN)){var x=this.a*ksp*cosphi*Math.sin(dlon);var y=this.y0+this.a*ksp*(this.cos_p14*sinphi-this.sin_p14*cosphi*coslon);}else{Proj4js.reportError("orthoFwdPointError");} +p.x=x;p.y=y;return p;},inverse:function(p){var rh;var z;var sinz,cosz;var temp;var con;var lon,lat;p.x-=this.x0;p.y-=this.y0;rh=Math.sqrt(p.x*p.x+p.y*p.y);if(rh>this.a+.0000001){Proj4js.reportError("orthoInvDataError");} +z=Proj4js.common.asinz(rh/this.a);sinz=Math.sin(z);cosi=Math.cos(z);lon=this.long0;if(Math.abs(rh)<=Proj4js.common.EPSLN){lat=this.lat0;} +lat=Proj4js.common.asinz(cosz*this.sin_p14+(y*sinz*this.cos_p14)/rh);con=Math.abs(lat0)-Proj4js.common.HALF_PI;if(Math.abs(con)<=Proj4js.common.EPSLN){if(this.lat0>=0){lon=Proj4js.common.adjust_lon(this.long0+Math.atan2(p.x,-p.y));}else{lon=Proj4js.common.adjust_lon(this.long0-Math.atan2(-p.x,p.y));}} +con=cosz-this.sin_p14*Math.sin(lat);if((Math.abs(con)>=Proj4js.common.EPSLN)||(Math.abs(x)>=Proj4js.common.EPSLN)){lon=Proj4js.common.adjust_lon(this.long0+Math.atan2((p.x*sinz*this.cos_p14),(con*rh)));} +p.x=lon;p.y=lat;return p;}};Proj4js.Proj.somerc={init:function(){var phy0=this.lat0;this.lambda0=this.long0;var sinPhy0=Math.sin(phy0);var semiMajorAxis=this.a;var invF=this.rf;var flattening=1/invF;var e2=2*flattening-Math.pow(flattening,2);var e=this.e=Math.sqrt(e2);this.R=semiMajorAxis*Math.sqrt(1-e2)/(1-e2*Math.pow(sinPhy0,2.0));this.alpha=Math.sqrt(1+e2/(1-e2)*Math.pow(Math.cos(phy0),4.0));this.b0=Math.asin(sinPhy0/this.alpha);this.K=Math.log(Math.tan(Math.PI/4.0+this.b0/2.0)) +-this.alpha*Math.log(Math.tan(Math.PI/4.0+phy0/2.0)) ++this.alpha*e/2*Math.log((1+e*sinPhy0)/(1-e*sinPhy0));},forward:function(p){var Sa1=Math.log(Math.tan(Math.PI/4.0-p.y/2.0));var Sa2=this.e/2.0*Math.log((1+this.e*Math.sin(p.y))/(1-this.e*Math.sin(p.y)));var S=-this.alpha*(Sa1+Sa2)+this.K;var b=2.0*(Math.atan(Math.exp(S))-Math.PI/4.0);var I=this.alpha*(p.x-this.lambda0);var rotI=Math.atan(Math.sin(I)/(Math.sin(this.b0)*Math.tan(b)+ +Math.cos(this.b0)*Math.cos(I)));var rotB=Math.asin(Math.cos(this.b0)*Math.sin(b)- +Math.sin(this.b0)*Math.cos(b)*Math.cos(I));p.y=this.R/2.0*Math.log((1+Math.sin(rotB))/(1-Math.sin(rotB))) ++this.y0;p.x=this.R*rotI+this.x0;return p;},inverse:function(p){var Y=p.x-this.x0;var X=p.y-this.y0;var rotI=Y/this.R;var rotB=2*(Math.atan(Math.exp(X/this.R))-Math.PI/4.0);var b=Math.asin(Math.cos(this.b0)*Math.sin(rotB) ++Math.sin(this.b0)*Math.cos(rotB)*Math.cos(rotI));var I=Math.atan(Math.sin(rotI)/(Math.cos(this.b0)*Math.cos(rotI)-Math.sin(this.b0)*Math.tan(rotB)));var lambda=this.lambda0+I/this.alpha;var S=0.0;var phy=b;var prevPhy=-1000.0;var iteration=0;while(Math.abs(phy-prevPhy)>0.0000001) +{if(++iteration>20) +{Proj4js.reportError("omercFwdInfinity");return;} +S=1.0/this.alpha*(Math.log(Math.tan(Math.PI/4.0+b/2.0))-this.K) ++this.e*Math.log(Math.tan(Math.PI/4.0 ++Math.asin(this.e*Math.sin(phy))/2.0));prevPhy=phy;phy=2.0*Math.atan(Math.exp(S))-Math.PI/2.0;} +p.x=lambda;p.y=phy;return p;}};Proj4js.Proj.stere={ssfn_:function(phit,sinphi,eccen){sinphi*=eccen;return(Math.tan(.5*(Proj4js.common.HALF_PI+phit))*Math.pow((1.-sinphi)/(1.+sinphi),.5*eccen));},TOL:1.e-8,NITER:8,CONV:1.e-10,S_POLE:0,N_POLE:1,OBLIQ:2,EQUIT:3,init:function(){this.phits=this.lat_ts?this.lat_ts:Proj4js.common.HALF_PI;var t=Math.abs(this.lat0);if((Math.abs(t)-Proj4js.common.HALF_PI)Proj4js.common.EPSLN?this.OBLIQ:this.EQUIT;} +this.phits=Math.abs(this.phits);if(this.es){var X;switch(this.mode){case this.N_POLE:case this.S_POLE:if(Math.abs(this.phits-Proj4js.common.HALF_PI)=Proj4js.common.EPSLN?Math.cos(this.phits)/Math.tan(Proj4js.common.FORTPI-.5*this.phits):2.*this.k0;break;}}},forward:function(p){var lon=p.x;lon=Proj4js.common.adjust_lon(lon-this.long0);var lat=p.y;var x,y;if(this.sphere){var sinphi,cosphi,coslam,sinlam;sinphi=Math.sin(lat);cosphi=Math.cos(lat);coslam=Math.cos(lon);sinlam=Math.sin(lon);switch(this.mode){case this.EQUIT:y=1.+cosphi*coslam;if(y<=Proj4js.common.EPSLN){F_ERROR;} +y=this.akm1/y;x=y*cosphi*sinlam;y*=sinphi;break;case this.OBLIQ:y=1.+this.sinph0*sinphi+this.cosph0*cosphi*coslam;if(y<=Proj4js.common.EPSLN){F_ERROR;} +y=this.akm1/y;x=y*cosphi*sinlam;y*=this.cosph0*sinphi-this.sinph0*cosphi*coslam;break;case this.N_POLE:coslam=-coslam;lat=-lat;case this.S_POLE:if(Math.abs(lat-Proj4js.common.HALF_PI)Proj4js.common.HALF_PI){Proj4js.reportError("sinu:Inv:DataError");} +temp=Math.abs(lat)-Proj4js.common.HALF_PI;if(Math.abs(temp)>Proj4js.common.EPSLN){temp=this.long0+p.x/(this.R*Math.cos(lat));lon=Proj4js.common.adjust_lon(temp);}else{lon=this.long0;} +p.x=lon;p.y=lat;return p;}};Proj4js.Proj.vandg={init:function(){this.R=6370997.0;},forward:function(p){var lon=p.x;var lat=p.y;var dlon=Proj4js.common.adjust_lon(lon-this.long0);var x,y;if(Math.abs(lat)<=Proj4js.common.EPSLN){x=this.x0+this.R*dlon;y=this.y0;} +var theta=Proj4js.common.asinz(2.0*Math.abs(lat/Proj4js.common.PI));if((Math.abs(dlon)<=Proj4js.common.EPSLN)||(Math.abs(Math.abs(lat)-Proj4js.common.HALF_PI)<=Proj4js.common.EPSLN)){x=this.x0;if(lat>=0){y=this.y0+Proj4js.common.PI*this.R*Math.tan(.5*theta);}else{y=this.y0+Proj4js.common.PI*this.R*-Math.tan(.5*theta);}} +var al=.5*Math.abs((Proj4js.common.PI/dlon)-(dlon/Proj4js.common.PI));var asq=al*al;var sinth=Math.sin(theta);var costh=Math.cos(theta);var g=costh/(sinth+costh-1.0);var gsq=g*g;var m=g*(2.0/sinth-1.0);var msq=m*m;var con=Proj4js.common.PI*this.R*(al*(g-msq)+Math.sqrt(asq*(g-msq)*(g-msq)-(msq+asq)*(gsq-msq)))/(msq+asq);if(dlon<0){con=-con;} +x=this.x0+con;con=Math.abs(con/(Proj4js.common.PI*this.R));if(lat>=0){y=this.y0+Proj4js.common.PI*this.R*Math.sqrt(1.0-con*con-2.0*al*con);}else{y=this.y0-Proj4js.common.PI*this.R*Math.sqrt(1.0-con*con-2.0*al*con);} +p.x=x;p.y=y;return p;},inverse:function(p){var dlon;var xx,yy,xys,c1,c2,c3;var al,asq;var a1;var m1;var con;var th1;var d;p.x-=this.x0;p.y-=this.y0;con=Proj4js.common.PI*this.R;xx=p.x/con;yy=p.y/con;xys=xx*xx+yy*yy;c1=-Math.abs(yy)*(1.0+xys);c2=c1-2.0*yy*yy+xx*xx;c3=-2.0*c1+1.0+2.0*yy*yy+xys*xys;d=yy*yy/c3+(2.0*c2*c2*c2/c3/c3/c3-9.0*c1*c2/c3/c3)/27.0;a1=(c1-c2*c2/3.0/c3)/c3;m1=2.0*Math.sqrt(-a1/3.0);con=((3.0*d)/a1)/m1;if(Math.abs(con)>1.0){if(con>=0.0){con=1.0;}else{con=-1.0;}} +th1=Math.acos(con)/3.0;if(p.y>=0){lat=(-m1*Math.cos(th1+Proj4js.common.PI/3.0)-c2/3.0/c3)*Proj4js.common.PI;}else{lat=-(-m1*Math.cos(th1+PI/3.0)-c2/3.0/c3)*Proj4js.common.PI;} +if(Math.abs(xx)0;--i){lat=2.0*Math.atan(num*Proj4js.common.srat(this.e*Math.sin(p.y),-0.5*this.e))-Proj4js.common.HALF_PI;if(Math.abs(lat-p.y)0.0){if(this.lat0>=0.0){this.f=this.d+Math.sqrt(this.d*this.d-1.0);}else{this.f=this.d-Math.sqrt(this.d*this.d-1.0);}}else{this.f=this.d;} +this.el=this.f*Math.pow(this.ts,this.bl);} +if(this.mode!=0){this.g=.5*(this.f-1.0/this.f);this.gama=Proj4js.common.asinz(Math.sin(this.alpha)/this.d);this.longc=this.longc-Proj4js.common.asinz(this.g*Math.tan(this.gama))/this.bl;this.con=Math.abs(this.lat0);if((this.con>Proj4js.common.EPSLN)&&(Math.abs(this.con-Proj4js.common.HALF_PI)>Proj4js.common.EPSLN)){this.singam=Math.sin(this.gama);this.cosgam=Math.cos(this.gama);this.sinaz=Math.sin(this.alpha);this.cosaz=Math.cos(this.alpha);if(this.lat0>=0){this.u=(this.al/this.bl)*Math.atan(Math.sqrt(this.d*this.d-1.0)/this.cosaz);}else{this.u=-(this.al/this.bl)*Math.atan(Math.sqrt(this.d*this.d-1.0)/this.cosaz);}}else{Proj4js.reportError("omerc:Init:DataError");}}else{this.sinphi=Math.sin(this.at1);this.ts1=Proj4js.common.tsfnz(this.e,this.lat1,this.sinphi);this.sinphi=Math.sin(this.lat2);this.ts2=Proj4js.common.tsfnz(this.e,this.lat2,this.sinphi);this.h=Math.pow(this.ts1,this.bl);this.l=Math.pow(this.ts2,this.bl);this.f=this.el/this.h;this.g=.5*(this.f-1.0/this.f);this.j=(this.el*this.el-this.l*this.h)/(this.el*this.el+this.l*this.h);this.p=(this.l-this.h)/(this.l+this.h);this.dlon=this.lon1-this.lon2;if(this.dlon<-Proj4js.common.PI)this.lon2=this.lon2-2.0*Proj4js.common.PI;if(this.dlon>Proj4js.common.PI)this.lon2=this.lon2+2.0*Proj4js.common.PI;this.dlon=this.lon1-this.lon2;this.longc=.5*(this.lon1+this.lon2)-Math.atan(this.j*Math.tan(.5*this.bl*this.dlon)/this.p)/this.bl;this.dlon=Proj4js.common.adjust_lon(this.lon1-this.longc);this.gama=Math.atan(Math.sin(this.bl*this.dlon)/this.g);this.alpha=Proj4js.common.asinz(this.d*Math.sin(this.gama));if(Math.abs(this.lat1-this.lat2)<=Proj4js.common.EPSLN){Proj4js.reportError("omercInitDataError");}else{this.con=Math.abs(this.lat1);} +if((this.con<=Proj4js.common.EPSLN)||(Math.abs(this.con-HALF_PI)<=Proj4js.common.EPSLN)){Proj4js.reportError("omercInitDataError");}else{if(Math.abs(Math.abs(this.lat0)-Proj4js.common.HALF_PI)<=Proj4js.common.EPSLN){Proj4js.reportError("omercInitDataError");}} +this.singam=Math.sin(this.gam);this.cosgam=Math.cos(this.gam);this.sinaz=Math.sin(this.alpha);this.cosaz=Math.cos(this.alpha);if(this.lat0>=0){this.u=(this.al/this.bl)*Math.atan(Math.sqrt(this.d*this.d-1.0)/this.cosaz);}else{this.u=-(this.al/this.bl)*Math.atan(Math.sqrt(this.d*this.d-1.0)/this.cosaz);}}},forward:function(p){var theta;var sin_phi,cos_phi;var b;var c,t,tq;var con,n,ml;var q,us,vl;var ul,vs;var s;var dlon;var ts1;var lon=p.x;var lat=p.y;sin_phi=Math.sin(lat);dlon=Proj4js.common.adjust_lon(lon-this.longc);vl=Math.sin(this.bl*dlon);if(Math.abs(Math.abs(lat)-Proj4js.common.HALF_PI)>Proj4js.common.EPSLN){ts1=Proj4js.common.tsfnz(this.e,lat,sin_phi);q=this.el/(Math.pow(ts1,this.bl));s=.5*(q-1.0/q);t=.5*(q+1.0/q);ul=(s*this.singam-vl*this.cosgam)/t;con=Math.cos(this.bl*dlon);if(Math.abs(con)<.0000001){us=this.al*this.bl*dlon;}else{us=this.al*Math.atan((s*this.cosgam+vl*this.singam)/con)/this.bl;if(con<0)us=us+Proj4js.common.PI*this.al/this.bl;}}else{if(lat>=0){ul=this.singam;}else{ul=-this.singam;} +us=this.al*lat/this.bl;} +if(Math.abs(Math.abs(ul)-1.0)<=Proj4js.common.EPSLN){Proj4js.reportError("omercFwdInfinity");} +vs=.5*this.al*Math.log((1.0-ul)/(1.0+ul))/this.bl;us=us-this.u;var x=this.x0+vs*this.cosaz+us*this.sinaz;var y=this.y0+us*this.cosaz-vs*this.sinaz;p.x=x;p.y=y;return p;},inverse:function(p){var delta_lon;var theta;var delta_theta;var sin_phi,cos_phi;var b;var c,t,tq;var con,n,ml;var vs,us,q,s,ts1;var vl,ul,bs;var dlon;var flag;p.x-=this.x0;p.y-=this.y0;flag=0;vs=p.x*this.cosaz-p.y*this.sinaz;us=p.y*this.cosaz+p.x*this.sinaz;us=us+this.u;q=Math.exp(-this.bl*vs/this.al);s=.5*(q-1.0/q);t=.5*(q+1.0/q);vl=Math.sin(this.bl*us/this.al);ul=(vl*this.cosgam+s*this.singam)/t;if(Math.abs(Math.abs(ul)-1.0)<=Proj4js.common.EPSLN) +{lon=this.longc;if(ul>=0.0){lat=Proj4js.common.HALF_PI;}else{lat=-Proj4js.common.HALF_PI;}}else{con=1.0/this.bl;ts1=Math.pow((this.el/Math.sqrt((1.0+ul)/(1.0-ul))),con);lat=Proj4js.common.phi2z(this.e,ts1);theta=this.longc-Math.atan2((s*this.cosgam-vl*this.singam),con)/this.bl;lon=Proj4js.common.adjust_lon(theta);} +p.x=lon;p.y=lat;return p;}};Proj4js.Proj.lcc={init:function(){if(!this.lat2){this.lat2=this.lat0;} +if(!this.k0)this.k0=1.0;if(Math.abs(this.lat1+this.lat2)Proj4js.common.EPSLN){this.ns=Math.log(ms1/ms2)/Math.log(ts1/ts2);}else{this.ns=sin1;} +this.f0=ms1/(this.ns*Math.pow(ts1,this.ns));this.rh=this.a*this.f0*Math.pow(ts0,this.ns);if(!this.title)this.title="Lambert Conformal Conic";},forward:function(p){var lon=p.x;var lat=p.y;if(lat<=90.0&&lat>=-90.0&&lon<=180.0&&lon>=-180.0){}else{Proj4js.reportError("lcc:forward: llInputOutOfRange: "+lon+" : "+lat);return null;} +var con=Math.abs(Math.abs(lat)-Proj4js.common.HALF_PI);var ts,rh1;if(con>Proj4js.common.EPSLN){ts=Proj4js.common.tsfnz(this.e,lat,Math.sin(lat));rh1=this.a*this.f0*Math.pow(ts,this.ns);}else{con=lat*this.ns;if(con<=0){Proj4js.reportError("lcc:forward: No Projection");return null;} +rh1=0;} +var theta=this.ns*Proj4js.common.adjust_lon(lon-this.long0);p.x=this.k0*(rh1*Math.sin(theta))+this.x0;p.y=this.k0*(this.rh-rh1*Math.cos(theta))+this.y0;return p;},inverse:function(p){var rh1,con,ts;var lat,lon;x=(p.x-this.x0)/this.k0;y=(this.rh-(p.y-this.y0)/this.k0);if(this.ns>0){rh1=Math.sqrt(x*x+y*y);con=1.0;}else{rh1=-Math.sqrt(x*x+y*y);con=-1.0;} +var theta=0.0;if(rh1!=0){theta=Math.atan2((con*x),(con*y));} +if((rh1!=0)||(this.ns>0.0)){con=1.0/this.ns;ts=Math.pow((rh1/(this.a*this.f0)),con);lat=Proj4js.common.phi2z(this.e,ts);if(lat==-9999)return null;}else{lat=-Proj4js.common.HALF_PI;} +lon=Proj4js.common.adjust_lon(theta/this.ns+this.long0);p.x=lon;p.y=lat;return p;}};Proj4js.Proj.laea={S_POLE:1,N_POLE:2,EQUIT:3,OBLIQ:4,init:function(){var t=Math.abs(this.lat0);if(Math.abs(t-Proj4js.common.HALF_PI)0){var sinphi;this.qp=Proj4js.common.qsfnz(this.e,1.0);this.mmf=.5/(1.-this.es);this.apa=this.authset(this.es);switch(this.mode){case this.N_POLE:case this.S_POLE:this.dd=1.;break;case this.EQUIT:this.rq=Math.sqrt(.5*this.qp);this.dd=1./this.rq;this.xmf=1.;this.ymf=.5*this.qp;break;case this.OBLIQ:this.rq=Math.sqrt(.5*this.qp);sinphi=Math.sin(this.lat0);this.sinb1=Proj4js.common.qsfnz(this.e,sinphi)/this.qp;this.cosb1=Math.sqrt(1.-this.sinb1*this.sinb1);this.dd=Math.cos(this.lat0)/(Math.sqrt(1.-this.es*sinphi*sinphi)*this.rq*this.cosb1);this.ymf=(this.xmf=this.rq)/this.dd;this.xmf*=this.dd;break;}}else{if(this.mode==this.OBLIQ){this.sinph0=Math.sin(this.lat0);this.cosph0=Math.cos(this.lat0);}}},forward:function(p){var x,y;var lam=p.x;var phi=p.y;lam=Proj4js.common.adjust_lon(lam-this.long0);if(this.sphere){var coslam,cosphi,sinphi;sinphi=Math.sin(phi);cosphi=Math.cos(phi);coslam=Math.cos(lam);switch(this.mode){case this.EQUIT:y=(this.mode==this.EQUIT)?1.+cosphi*coslam:1.+this.sinph0*sinphi+this.cosph0*cosphi*coslam;if(y<=Proj4js.common.EPSLN){Proj4js.reportError("laea:fwd:y less than eps");return null;} +y=Math.sqrt(2./y);x=y*cosphi*Math.sin(lam);y*=(this.mode==this.EQUIT)?sinphi:this.cosph0*sinphi-this.sinph0*cosphi*coslam;break;case this.N_POLE:coslam=-coslam;case this.S_POLE:if(Math.abs(phi+this.phi0)=0.){x=(b=Math.sqrt(q))*sinlam;y=coslam*((this.mode==this.S_POLE)?b:-b);}else{x=y=0.;} +break;}} +p.x=this.a*x+this.x0;p.y=this.a*y+this.y0;return p;},inverse:function(p){p.x-=this.x0;p.y-=this.y0;var x=p.x/this.a;var y=p.y/this.a;if(this.sphere){var cosz=0.0,rh,sinz=0.0;rh=Math.sqrt(x*x+y*y);var phi=rh*.5;if(phi>1.){Proj4js.reportError("laea:Inv:DataError");return null;} +phi=2.*Math.asin(phi);if(this.mode==this.OBLIQ||this.mode==this.EQUIT){sinz=Math.sin(phi);cosz=Math.cos(phi);} +switch(this.mode){case this.EQUIT:phi=(Math.abs(rh)<=Proj4js.common.EPSLN)?0.:Math.asin(y*sinz/rh);x*=sinz;y=cosz*rh;break;case this.OBLIQ:phi=(Math.abs(rh)<=Proj4js.common.EPSLN)?this.phi0:Math.asin(cosz*sinph0+y*sinz*cosph0/rh);x*=sinz*cosph0;y=(cosz-Math.sin(phi)*sinph0)*rh;break;case this.N_POLE:y=-y;phi=Proj4js.common.HALF_PI-phi;break;case this.S_POLE:phi-=Proj4js.common.HALF_PI;break;} +lam=(y==0.&&(this.mode==this.EQUIT||this.mode==this.OBLIQ))?0.:atan2(x,y);}else{var cCe,sCe,q,rho,ab=0.0;switch(this.mode){case this.EQUIT:case this.OBLIQ:x/=this.dd;y*=this.dd;rho=Math.sqrt(x*x+y*y);if(rho(2.0*Proj4js.common.HALF_PI*this.a)){Proj4js.reportError("aeqdInvDataError");return;} +var z=rh/this.a;var sinz=Math.sin(z);var cosz=Math.cos(z);var lon=this.long0;var lat;if(Math.abs(rh)<=Proj4js.common.EPSLN){lat=this.lat0;}else{lat=Proj4js.common.asinz(cosz*this.sin_p12+(p.y*sinz*this.cos_p12)/rh);var con=Math.abs(this.lat0)-Proj4js.common.HALF_PI;if(Math.abs(con)<=Proj4js.common.EPSLN){if(lat0>=0.0){lon=Proj4js.common.adjust_lon(this.long0+Math.atan2(p.x,-p.y));}else{lon=Proj4js.common.adjust_lon(this.long0-Math.atan2(-p.x,p.y));}}else{con=cosz-this.sin_p12*Math.sin(lat);if((Math.abs(con)=50){Proj4js.reportError("moll:Fwd:IterationError");}} +theta/=2.0;if(Proj4js.common.PI/2-Math.abs(lat)0.999999999999)arg=0.999999999999;var theta=Math.asin(arg);var lon=Proj4js.common.adjust_lon(this.long0+(p.x/(0.900316316158*this.a*Math.cos(theta))));if(lon<(-Proj4js.common.PI))lon=-Proj4js.common.PI;if(lon>Proj4js.common.PI)lon=Proj4js.common.PI;arg=(2.0*theta+Math.sin(2.0*theta))/Proj4js.common.PI;if(Math.abs(arg)>1.0)arg=1.0;var lat=Math.asin(arg);p.x=lon;p.y=lat;return p;}}; \ No newline at end of file diff --git a/module/viewer/lib/js/projCode/aea.js b/module/viewer/lib/js/projCode/aea.js new file mode 100644 index 0000000..b7b4f5b --- /dev/null +++ b/module/viewer/lib/js/projCode/aea.js @@ -0,0 +1,149 @@ +/******************************************************************************* +NAME ALBERS CONICAL EQUAL AREA + +PURPOSE: Transforms input longitude and latitude to Easting and Northing + for the Albers Conical Equal Area projection. The longitude + and latitude must be in radians. The Easting and Northing + values will be returned in meters. + +PROGRAMMER DATE +---------- ---- +T. Mittan, Feb, 1992 + +ALGORITHM REFERENCES + +1. Snyder, John P., "Map Projections--A Working Manual", U.S. Geological + Survey Professional Paper 1395 (Supersedes USGS Bulletin 1532), United + State Government Printing Office, Washington D.C., 1987. + +2. Snyder, John P. and Voxland, Philip M., "An Album of Map Projections", + U.S. Geological Survey Professional Paper 1453 , United State Government + Printing Office, Washington D.C., 1989. +*******************************************************************************/ + + +Proj4js.Proj.aea = { + init : function() { + + if (Math.abs(this.lat1 + this.lat2) < Proj4js.common.EPSLN) { + Proj4js.reportError("aeaInitEqualLatitudes"); + return; + } + this.temp = this.b / this.a; + this.es = 1.0 - Math.pow(this.temp,2); + this.e3 = Math.sqrt(this.es); + + this.sin_po=Math.sin(this.lat1); + this.cos_po=Math.cos(this.lat1); + this.t1=this.sin_po; + this.con = this.sin_po; + this.ms1 = Proj4js.common.msfnz(this.e3,this.sin_po,this.cos_po); + this.qs1 = Proj4js.common.qsfnz(this.e3,this.sin_po,this.cos_po); + + this.sin_po=Math.sin(this.lat2); + this.cos_po=Math.cos(this.lat2); + this.t2=this.sin_po; + this.ms2 = Proj4js.common.msfnz(this.e3,this.sin_po,this.cos_po); + this.qs2 = Proj4js.common.qsfnz(this.e3,this.sin_po,this.cos_po); + + this.sin_po=Math.sin(this.lat0); + this.cos_po=Math.cos(this.lat0); + this.t3=this.sin_po; + this.qs0 = Proj4js.common.qsfnz(this.e3,this.sin_po,this.cos_po); + + if (Math.abs(this.lat1 - this.lat2) > Proj4js.common.EPSLN) { + this.ns0 = (this.ms1 * this.ms1 - this.ms2 *this.ms2)/ (this.qs2 - this.qs1); + } else { + this.ns0 = this.con; + } + this.c = this.ms1 * this.ms1 + this.ns0 * this.qs1; + this.rh = this.a * Math.sqrt(this.c - this.ns0 * this.qs0)/this.ns0; + }, + +/* Albers Conical Equal Area forward equations--mapping lat,long to x,y + -------------------------------------------------------------------*/ + forward: function(p){ + + var lon=p.x; + var lat=p.y; + + this.sin_phi=Math.sin(lat); + this.cos_phi=Math.cos(lat); + + var qs = Proj4js.common.qsfnz(this.e3,this.sin_phi,this.cos_phi); + var rh1 =this.a * Math.sqrt(this.c - this.ns0 * qs)/this.ns0; + var theta = this.ns0 * Proj4js.common.adjust_lon(lon - this.long0); + var x = rh1 * Math.sin(theta) + this.x0; + var y = this.rh - rh1 * Math.cos(theta) + this.y0; + + p.x = x; + p.y = y; + return p; + }, + + + inverse: function(p) { + var rh1,qs,con,theta,lon,lat; + + p.x -= this.x0; + p.y = this.rh - p.y + this.y0; + if (this.ns0 >= 0) { + rh1 = Math.sqrt(p.x *p.x + p.y * p.y); + con = 1.0; + } else { + rh1 = -Math.sqrt(p.x * p.x + p.y *p.y); + con = -1.0; + } + theta = 0.0; + if (rh1 != 0.0) { + theta = Math.atan2(con * p.x, con * p.y); + } + con = rh1 * this.ns0 / this.a; + qs = (this.c - con * con) / this.ns0; + if (this.e3 >= 1e-10) { + con = 1 - .5 * (1.0 -this.es) * Math.log((1.0 - this.e3) / (1.0 + this.e3))/this.e3; + if (Math.abs(Math.abs(con) - Math.abs(qs)) > .0000000001 ) { + lat = this.phi1z(this.e3,qs); + } else { + if (qs >= 0) { + lat = .5 * PI; + } else { + lat = -.5 * PI; + } + } + } else { + lat = this.phi1z(e3,qs); + } + + lon = Proj4js.common.adjust_lon(theta/this.ns0 + this.long0); + p.x = lon; + p.y = lat; + return p; + }, + +/* Function to compute phi1, the latitude for the inverse of the + Albers Conical Equal-Area projection. +-------------------------------------------*/ + phi1z: function (eccent,qs) { + var con, com, dphi; + var phi = Proj4js.common.asinz(.5 * qs); + if (eccent < Proj4js.common.EPSLN) return phi; + + var eccnts = eccent * eccent; + for (var i = 1; i <= 25; i++) { + sinphi = Math.sin(phi); + cosphi = Math.cos(phi); + con = eccent * sinphi; + com = 1.0 - con * con; + dphi = .5 * com * com / cosphi * (qs / (1.0 - eccnts) - sinphi / com + .5 / eccent * Math.log((1.0 - con) / (1.0 + con))); + phi = phi + dphi; + if (Math.abs(dphi) <= 1e-7) return phi; + } + Proj4js.reportError("aea:phi1z:Convergence error"); + return null; + } + +}; + + + diff --git a/module/viewer/lib/js/projCode/aeqd.js b/module/viewer/lib/js/projCode/aeqd.js new file mode 100644 index 0000000..6dc4fa6 --- /dev/null +++ b/module/viewer/lib/js/projCode/aeqd.js @@ -0,0 +1,75 @@ +Proj4js.Proj.aeqd = { + + init : function() { + this.sin_p12=Math.sin(this.lat0); + this.cos_p12=Math.cos(this.lat0); + }, + + forward: function(p) { + var lon=p.x; + var lat=p.y; + var ksp; + + var sinphi=Math.sin(p.y); + var cosphi=Math.cos(p.y); + var dlon = Proj4js.common.adjust_lon(lon - this.long0); + var coslon = Math.cos(dlon); + var g = this.sin_p12 * sinphi + this.cos_p12 * cosphi * coslon; + if (Math.abs(Math.abs(g) - 1.0) < Proj4js.common.EPSLN) { + ksp = 1.0; + if (g < 0.0) { + Proj4js.reportError("aeqd:Fwd:PointError"); + return; + } + } else { + var z = Math.acos(g); + ksp = z/Math.sin(z); + } + p.x = this.x0 + this.a * ksp * cosphi * Math.sin(dlon); + p.y = this.y0 + this.a * ksp * (this.cos_p12 * sinphi - this.sin_p12 * cosphi * coslon); + return p; + }, + + inverse: function(p){ + p.x -= this.x0; + p.y -= this.y0; + + var rh = Math.sqrt(p.x * p.x + p.y *p.y); + if (rh > (2.0 * Proj4js.common.HALF_PI * this.a)) { + Proj4js.reportError("aeqdInvDataError"); + return; + } + var z = rh / this.a; + + var sinz=Math.sin(z); + var cosz=Math.cos(z); + + var lon = this.long0; + var lat; + if (Math.abs(rh) <= Proj4js.common.EPSLN) { + lat = this.lat0; + } else { + lat = Proj4js.common.asinz(cosz * this.sin_p12 + (p.y * sinz * this.cos_p12) / rh); + var con = Math.abs(this.lat0) - Proj4js.common.HALF_PI; + if (Math.abs(con) <= Proj4js.common.EPSLN) { + if (lat0 >= 0.0) { + lon = Proj4js.common.adjust_lon(this.long0 + Math.atan2(p.x , -p.y)); + } else { + lon = Proj4js.common.adjust_lon(this.long0 - Math.atan2(-p.x , p.y)); + } + } else { + con = cosz - this.sin_p12 * Math.sin(lat); + if ((Math.abs(con) < Proj4js.common.EPSLN) && (Math.abs(p.x) < Proj4js.common.EPSLN)) { + //no-op, just keep the lon value as is + } else { + var temp = Math.atan2((p.x * sinz * this.cos_p12), (con * rh)); + lon = Proj4js.common.adjust_lon(this.long0 + Math.atan2((p.x * sinz * this.cos_p12), (con * rh))); + } + } + } + + p.x = lon; + p.y = lat; + return p; + } +}; diff --git a/module/viewer/lib/js/projCode/cass.js b/module/viewer/lib/js/projCode/cass.js new file mode 100644 index 0000000..bfed624 --- /dev/null +++ b/module/viewer/lib/js/projCode/cass.js @@ -0,0 +1,162 @@ +/******************************************************************************* +NAME CASSINI + +PURPOSE: Transforms input longitude and latitude to Easting and + Northing for the Cassini projection. The + longitude and latitude must be in radians. The Easting + and Northing values will be returned in meters. + Ported from PROJ.4. + + +ALGORITHM REFERENCES + +1. Snyder, John P., "Map Projections--A Working Manual", U.S. Geological + Survey Professional Paper 1395 (Supersedes USGS Bulletin 1532), United + State Government Printing Office, Washington D.C., 1987. + +2. Snyder, John P. and Voxland, Philip M., "An Album of Map Projections", + U.S. Geological Survey Professional Paper 1453 , United State Government +*******************************************************************************/ + + +//Proj4js.defs["EPSG:28191"] = "+proj=cass +lat_0=31.73409694444445 +lon_0=35.21208055555556 +x_0=170251.555 +y_0=126867.909 +a=6378300.789 +b=6356566.435 +towgs84=-275.722,94.7824,340.894,-8.001,-4.42,-11.821,1 +units=m +no_defs"; + +// Initialize the Cassini projection +// ----------------------------------------------------------------- + +Proj4js.Proj.cass = { + init : function() { + if (!this.sphere) { + this.en = this.pj_enfn(this.es) + this.m0 = this.pj_mlfn(this.lat0, Math.sin(this.lat0), Math.cos(this.lat0), this.en); + } + }, + + C1: .16666666666666666666, + C2: .00833333333333333333, + C3: .04166666666666666666, + C4: .33333333333333333333, + C5: .06666666666666666666, + + +/* Cassini forward equations--mapping lat,long to x,y + -----------------------------------------------------------------------*/ + forward: function(p) { + + /* Forward equations + -----------------*/ + var x,y; + var lam=p.x; + var phi=p.y; + lam = Proj4js.common.adjust_lon(lam - this.long0); + + if (this.sphere) { + x = Math.asin(Math.cos(phi) * Math.sin(lam)); + y = Math.atan2(Math.tan(phi) , Math.cos(lam)) - this.phi0; + } else { + //ellipsoid + this.n = Math.sin(phi); + this.c = Math.cos(phi); + y = this.pj_mlfn(phi, this.n, this.c, this.en); + this.n = 1./Math.sqrt(1. - this.es * this.n * this.n); + this.tn = Math.tan(phi); + this.t = this.tn * this.tn; + this.a1 = lam * this.c; + this.c *= this.es * this.c / (1 - this.es); + this.a2 = this.a1 * this.a1; + x = this.n * this.a1 * (1. - this.a2 * this.t * (this.C1 - (8. - this.t + 8. * this.c) * this.a2 * this.C2)); + y -= this.m0 - this.n * this.tn * this.a2 * (.5 + (5. - this.t + 6. * this.c) * this.a2 * this.C3); + } + + p.x = this.a*x + this.x0; + p.y = this.a*y + this.y0; + return p; + },//cassFwd() + +/* Inverse equations + -----------------*/ + inverse: function(p) { + p.x -= this.x0; + p.y -= this.y0; + var x = p.x/this.a; + var y = p.y/this.a; + + if (this.sphere) { + this.dd = y + this.lat0; + phi = Math.asin(Math.sin(this.dd) * Math.cos(x)); + lam = Math.atan2(Math.tan(x), Math.cos(this.dd)); + } else { + /* ellipsoid */ + ph1 = this.pj_inv_mlfn(this.m0 + y, this.es, this.en); + this.tn = Math.tan(ph1); + this.t = this.tn * this.tn; + this.n = Math.sin(ph1); + this.r = 1. / (1. - this.es * this.n * this.n); + this.n = Math.sqrt(this.r); + this.r *= (1. - this.es) * this.n; + this.dd = x / this.n; + this.d2 = this.dd * this.dd; + phi = ph1 - (this.n * this.tn / this.r) * this.d2 * (.5 - (1. + 3. * this.t) * this.d2 * this.C3); + lam = this.dd * (1. + this.t * this.d2 * (-this.C4 + (1. + 3. * this.t) * this.d2 * this.C5)) / Math.cos(ph1); + } + p.x = Proj4js.common.adjust_lon(this.long0+lam); + p.y = phi; + return p; + },//lamazInv() + + + //code from the PROJ.4 pj_mlfn.c file; this may be useful for other projections + pj_enfn: function(es) { + en = new Array(); + en[0] = this.C00 - es * (this.C02 + es * (this.C04 + es * (this.C06 + es * this.C08))); + en[1] = es * (this.C22 - es * (this.C04 + es * (this.C06 + es * this.C08))); + var t = es * es; + en[2] = t * (this.C44 - es * (this.C46 + es * this.C48)); + t *= es; + en[3] = t * (this.C66 - es * this.C68); + en[4] = t * es * this.C88; + return en; + }, + + pj_mlfn: function(phi, sphi, cphi, en) { + cphi *= sphi; + sphi *= sphi; + return(en[0] * phi - cphi * (en[1] + sphi*(en[2]+ sphi*(en[3] + sphi*en[4])))); + }, + + pj_inv_mlfn: function(arg, es, en) { + k = 1./(1.-es); + phi = arg; + for (i = Proj4js.common.MAX_ITER; i ; --i) { /* rarely goes over 2 iterations */ + s = Math.sin(phi); + t = 1. - es * s * s; + //t = this.pj_mlfn(phi, s, Math.cos(phi), en) - arg; + //phi -= t * (t * Math.sqrt(t)) * k; + t = (this.pj_mlfn(phi, s, Math.cos(phi), en) - arg) * (t * Math.sqrt(t)) * k; + phi -= t; + if (Math.abs(t) < Proj4js.common.EPSLN) + return phi; + } + Proj4js.reportError("cass:pj_inv_mlfn: Convergence error"); + return phi; + }, + +/* meridinal distance for ellipsoid and inverse +** 8th degree - accurate to < 1e-5 meters when used in conjuction +** with typical major axis values. +** Inverse determines phi to EPS (1e-11) radians, about 1e-6 seconds. +*/ + C00: 1.0, + C02: .25, + C04: .046875, + C06: .01953125, + C08: .01068115234375, + C22: .75, + C44: .46875, + C46: .01302083333333333333, + C48: .00712076822916666666, + C66: .36458333333333333333, + C68: .00569661458333333333, + C88: .3076171875 + +} diff --git a/module/viewer/lib/js/projCode/cea.js b/module/viewer/lib/js/projCode/cea.js new file mode 100644 index 0000000..6c0d658 --- /dev/null +++ b/module/viewer/lib/js/projCode/cea.js @@ -0,0 +1,85 @@ +/******************************************************************************* +NAME LAMBERT CYLINDRICAL EQUAL AREA + +PURPOSE: Transforms input longitude and latitude to Easting and + Northing for the Lambert Cylindrical Equal Area projection. + This class of projection includes the Behrmann and + Gall-Peters Projections. The + longitude and latitude must be in radians. The Easting + and Northing values will be returned in meters. + +PROGRAMMER DATE +---------- ---- +R. Marsden August 2009 +Winwaed Software Tech LLC, http://www.winwaed.com + +This function was adapted from the Miller Cylindrical Projection in the Proj4JS +library. + +Note: This implementation assumes a Spherical Earth. The (commented) code +has been included for the ellipsoidal forward transform, but derivation of +the ellispoidal inverse transform is beyond me. Note that most of the +Proj4JS implementations do NOT currently support ellipsoidal figures. +Therefore this is not seen as a problem - especially this lack of support +is explicitly stated here. + +ALGORITHM REFERENCES + +1. "Cartographic Projection Procedures for the UNIX Environment - + A User's Manual" by Gerald I. Evenden, USGS Open File Report 90-284 + and Release 4 Interim Reports (2003) + +2. Snyder, John P., "Flattening the Earth - Two Thousand Years of Map + Projections", Univ. Chicago Press, 1993 +*******************************************************************************/ + +Proj4js.Proj.cea = { + +/* Initialize the Cylindrical Equal Area projection + -------------------------------------------*/ + init: function() { + //no-op + }, + + + /* Cylindrical Equal Area forward equations--mapping lat,long to x,y + ------------------------------------------------------------*/ + forward: function(p) { + var lon=p.x; + var lat=p.y; + /* Forward equations + -----------------*/ + dlon = Proj4js.common.adjust_lon(lon -this.long0); + var x = this.x0 + this.a * dlon * Math.cos(this.lat_ts); + var y = this.y0 + this.a * Math.sin(lat) / Math.cos(this.lat_ts); + /* Elliptical Forward Transform + Not implemented due to a lack of a matchign inverse function + { + var Sin_Lat = Math.sin(lat); + var Rn = this.a * (Math.sqrt(1.0e0 - this.es * Sin_Lat * Sin_Lat )); + x = this.x0 + this.a * dlon * Math.cos(this.lat_ts); + y = this.y0 + Rn * Math.sin(lat) / Math.cos(this.lat_ts); + } + */ + + + p.x=x; + p.y=y; + return p; + },//ceaFwd() + + /* Cylindrical Equal Area inverse equations--mapping x,y to lat/long + ------------------------------------------------------------*/ + inverse: function(p) { + p.x -= this.x0; + p.y -= this.y0; + + var lon = Proj4js.common.adjust_lon( this.long0 + (p.x / this.a) / Math.cos(this.lat_ts) ); + + var lat = Math.asin( (p.y/this.a) * Math.cos(this.lat_ts) ); + + p.x=lon; + p.y=lat; + return p; + }//ceaInv() +}; diff --git a/module/viewer/lib/js/projCode/eqc.js b/module/viewer/lib/js/projCode/eqc.js new file mode 100644 index 0000000..672c0e8 --- /dev/null +++ b/module/viewer/lib/js/projCode/eqc.js @@ -0,0 +1,42 @@ +/* similar to equi.js FIXME proj4 uses eqc */ +Proj4js.Proj.eqc = { + init : function() { + + if(!this.x0) this.x0=0; + if(!this.y0) this.y0=0; + if(!this.lat0) this.lat0=0; + if(!this.long0) this.long0=0; + if(!this.lat_ts) this.lat_ts=0; + if (!this.title) this.title = "Equidistant Cylindrical (Plate Carre)"; + + this.rc= Math.cos(this.lat_ts); + }, + + + // forward equations--mapping lat,long to x,y + // ----------------------------------------------------------------- + forward : function(p) { + + var lon= p.x; + var lat= p.y; + + var dlon = Proj4js.common.adjust_lon(lon - this.long0); + var dlat = Proj4js.common.adjust_lat(lat - this.lat0 ); + p.x= this.x0 + (this.a*dlon*this.rc); + p.y= this.y0 + (this.a*dlat ); + return p; + }, + + // inverse equations--mapping x,y to lat/long + // ----------------------------------------------------------------- + inverse : function(p) { + + var x= p.x; + var y= p.y; + + p.x= Proj4js.common.adjust_lon(this.long0 + ((x - this.x0)/(this.a*this.rc))); + p.y= Proj4js.common.adjust_lat(this.lat0 + ((y - this.y0)/(this.a ))); + return p; + } + +}; diff --git a/module/viewer/lib/js/projCode/eqdc.js b/module/viewer/lib/js/projCode/eqdc.js new file mode 100644 index 0000000..b81b36f --- /dev/null +++ b/module/viewer/lib/js/projCode/eqdc.js @@ -0,0 +1,140 @@ +/******************************************************************************* +NAME EQUIDISTANT CONIC + +PURPOSE: Transforms input longitude and latitude to Easting and Northing + for the Equidistant Conic projection. The longitude and + latitude must be in radians. The Easting and Northing values + will be returned in meters. + +PROGRAMMER DATE +---------- ---- +T. Mittan Mar, 1993 + +ALGORITHM REFERENCES + +1. Snyder, John P., "Map Projections--A Working Manual", U.S. Geological + Survey Professional Paper 1395 (Supersedes USGS Bulletin 1532), United + State Government Printing Office, Washington D.C., 1987. + +2. Snyder, John P. and Voxland, Philip M., "An Album of Map Projections", + U.S. Geological Survey Professional Paper 1453 , United State Government + Printing Office, Washington D.C., 1989. +*******************************************************************************/ + +/* Variables common to all subroutines in this code file + -----------------------------------------------------*/ + +Proj4js.Proj.eqdc = { + +/* Initialize the Equidistant Conic projection + ------------------------------------------*/ + init: function() { + + /* Place parameters in static storage for common use + -------------------------------------------------*/ + + if(!this.mode) this.mode=0;//chosen default mode + this.temp = this.b / this.a; + this.es = 1.0 - Math.pow(this.temp,2); + this.e = Math.sqrt(this.es); + this.e0 = Proj4js.common.e0fn(this.es); + this.e1 = Proj4js.common.e1fn(this.es); + this.e2 = Proj4js.common.e2fn(this.es); + this.e3 = Proj4js.common.e3fn(this.es); + + this.sinphi=Math.sin(this.lat1); + this.cosphi=Math.cos(this.lat1); + + this.ms1 = Proj4js.common.msfnz(this.e,this.sinphi,this.cosphi); + this.ml1 = Proj4js.common.mlfn(this.e0, this.e1, this.e2,this.e3, this.lat1); + + /* format B + ---------*/ + if (this.mode != 0) { + if (Math.abs(this.lat1 + this.lat2) < Proj4js.common.EPSLN) { + Proj4js.reportError("eqdc:Init:EqualLatitudes"); + //return(81); + } + this.sinphi=Math.sin(this.lat2); + this.cosphi=Math.cos(this.lat2); + + this.ms2 = Proj4js.common.msfnz(this.e,this.sinphi,this.cosphi); + this.ml2 = Proj4js.common.mlfn(this.e0, this.e1, this.e2, this.e3, this.lat2); + if (Math.abs(this.lat1 - this.lat2) >= Proj4js.common.EPSLN) { + this.ns = (this.ms1 - this.ms2) / (this.ml2 - this.ml1); + } else { + this.ns = this.sinphi; + } + } else { + this.ns = this.sinphi; + } + this.g = this.ml1 + this.ms1/this.ns; + this.ml0 = Proj4js.common.mlfn(this.e0, this.e1,this. e2, this.e3, this.lat0); + this.rh = this.a * (this.g - this.ml0); + }, + + +/* Equidistant Conic forward equations--mapping lat,long to x,y + -----------------------------------------------------------*/ + forward: function(p) { + var lon=p.x; + var lat=p.y; + + /* Forward equations + -----------------*/ + var ml = Proj4js.common.mlfn(this.e0, this.e1, this.e2, this.e3, lat); + var rh1 = this.a * (this.g - ml); + var theta = this.ns * Proj4js.common.adjust_lon(lon - this.long0); + + var x = this.x0 + rh1 * Math.sin(theta); + var y = this.y0 + this.rh - rh1 * Math.cos(theta); + p.x=x; + p.y=y; + return p; + }, + +/* Inverse equations + -----------------*/ + inverse: function(p) { + p.x -= this.x0; + p.y = this.rh - p.y + this.y0; + var con, rh1; + if (this.ns >= 0) { + var rh1 = Math.sqrt(p.x *p.x + p.y * p.y); + var con = 1.0; + } else { + rh1 = -Math.sqrt(p.x *p. x +p. y * p.y); + con = -1.0; + } + var theta = 0.0; + if (rh1 != 0.0) theta = Math.atan2(con *p.x, con *p.y); + var ml = this.g - rh1 /this.a; + var lat = this.phi3z(ml,this.e0,this.e1,this.e2,this.e3); + var lon = Proj4js.common.adjust_lon(this.long0 + theta / this.ns); + + p.x=lon; + p.y=lat; + return p; + }, + +/* Function to compute latitude, phi3, for the inverse of the Equidistant + Conic projection. +-----------------------------------------------------------------*/ + phi3z: function(ml,e0,e1,e2,e3) { + var phi; + var dphi; + + phi = ml; + for (var i = 0; i < 15; i++) { + dphi = (ml + e1 * Math.sin(2.0 * phi) - e2 * Math.sin(4.0 * phi) + e3 * Math.sin(6.0 * phi))/ e0 - phi; + phi += dphi; + if (Math.abs(dphi) <= .0000000001) { + return phi; + } + } + Proj4js.reportError("PHI3Z-CONV:Latitude failed to converge after 15 iterations"); + return null; + } + + +}; \ No newline at end of file diff --git a/module/viewer/lib/js/projCode/equi.js b/module/viewer/lib/js/projCode/equi.js new file mode 100644 index 0000000..88af96f --- /dev/null +++ b/module/viewer/lib/js/projCode/equi.js @@ -0,0 +1,72 @@ +/******************************************************************************* +NAME EQUIRECTANGULAR + +PURPOSE: Transforms input longitude and latitude to Easting and + Northing for the Equirectangular projection. The + longitude and latitude must be in radians. The Easting + and Northing values will be returned in meters. + +PROGRAMMER DATE +---------- ---- +T. Mittan Mar, 1993 + +ALGORITHM REFERENCES + +1. Snyder, John P., "Map Projections--A Working Manual", U.S. Geological + Survey Professional Paper 1395 (Supersedes USGS Bulletin 1532), United + State Government Printing Office, Washington D.C., 1987. + +2. Snyder, John P. and Voxland, Philip M., "An Album of Map Projections", + U.S. Geological Survey Professional Paper 1453 , United State Government + Printing Office, Washington D.C., 1989. +*******************************************************************************/ +Proj4js.Proj.equi = { + + init: function() { + if(!this.x0) this.x0=0; + if(!this.y0) this.y0=0; + if(!this.lat0) this.lat0=0; + if(!this.long0) this.long0=0; + ///this.t2; + }, + + + +/* Equirectangular forward equations--mapping lat,long to x,y + ---------------------------------------------------------*/ + forward: function(p) { + + var lon=p.x; + var lat=p.y; + + var dlon = Proj4js.common.adjust_lon(lon - this.long0); + var x = this.x0 +this. a * dlon *Math.cos(this.lat0); + var y = this.y0 + this.a * lat; + + this.t1=x; + this.t2=Math.cos(this.lat0); + p.x=x; + p.y=y; + return p; + }, //equiFwd() + + + +/* Equirectangular inverse equations--mapping x,y to lat/long + ---------------------------------------------------------*/ + inverse: function(p) { + + p.x -= this.x0; + p.y -= this.y0; + var lat = p.y /this. a; + + if ( Math.abs(lat) > Proj4js.common.HALF_PI) { + Proj4js.reportError("equi:Inv:DataError"); + } + var lon = Proj4js.common.adjust_lon(this.long0 + p.x / (this.a * Math.cos(this.lat0))); + p.x=lon; + p.y=lat; + }//equiInv() +}; + + diff --git a/module/viewer/lib/js/projCode/gauss.js b/module/viewer/lib/js/projCode/gauss.js new file mode 100644 index 0000000..1749fb9 --- /dev/null +++ b/module/viewer/lib/js/projCode/gauss.js @@ -0,0 +1,44 @@ + +Proj4js.Proj.gauss = { + + init : function() { + sphi = Math.sin(this.lat0); + cphi = Math.cos(this.lat0); + cphi *= cphi; + this.rc = Math.sqrt(1.0 - this.es) / (1.0 - this.es * sphi * sphi); + this.C = Math.sqrt(1.0 + this.es * cphi * cphi / (1.0 - this.es)); + this.phic0 = Math.asin(sphi / this.C); + this.ratexp = 0.5 * this.C * this.e; + this.K = Math.tan(0.5 * this.phic0 + Proj4js.common.FORTPI) / (Math.pow(Math.tan(0.5*this.lat0 + Proj4js.common.FORTPI), this.C) * Proj4js.common.srat(this.e*sphi, this.ratexp)); + }, + + forward : function(p) { + var lon = p.x; + var lat = p.y; + + p.y = 2.0 * Math.atan( this.K * Math.pow(Math.tan(0.5 * lat + Proj4js.common.FORTPI), this.C) * Proj4js.common.srat(this.e * Math.sin(lat), this.ratexp) ) - Proj4js.common.HALF_PI; + p.x = this.C * lon; + return p; + }, + + inverse : function(p) { + var DEL_TOL = 1e-14; + var lon = p.x / this.C; + var lat = p.y; + num = Math.pow(Math.tan(0.5 * lat + Proj4js.common.FORTPI)/this.K, 1./this.C); + for (var i = Proj4js.common.MAX_ITER; i>0; --i) { + lat = 2.0 * Math.atan(num * Proj4js.common.srat(this.e * Math.sin(p.y), -0.5 * this.e)) - Proj4js.common.HALF_PI; + if (Math.abs(lat - p.y) < DEL_TOL) break; + p.y = lat; + } + /* convergence failed */ + if (!i) { + Proj4js.reportError("gauss:inverse:convergence failed"); + return null; + } + p.x = lon; + p.y = lat; + return p; + } +}; + diff --git a/module/viewer/lib/js/projCode/gnom.js b/module/viewer/lib/js/projCode/gnom.js new file mode 100644 index 0000000..a38ec4e --- /dev/null +++ b/module/viewer/lib/js/projCode/gnom.js @@ -0,0 +1,116 @@ +/***************************************************************************** +NAME GNOMONIC + +PURPOSE: Transforms input longitude and latitude to Easting and + Northing for the Gnomonic Projection. + Implementation based on the existing sterea and ortho + implementations. + +PROGRAMMER DATE +---------- ---- +Richard Marsden November 2009 + +ALGORITHM REFERENCES + +1. Snyder, John P., "Flattening the Earth - Two Thousand Years of Map + Projections", University of Chicago Press 1993 + +2. Wolfram Mathworld "Gnomonic Projection" + http://mathworld.wolfram.com/GnomonicProjection.html + Accessed: 12th November 2009 +******************************************************************************/ + +Proj4js.Proj.gnom = { + + /* Initialize the Gnomonic projection + -------------------------------------*/ + init: function(def) { + + /* Place parameters in static storage for common use + -------------------------------------------------*/ + this.sin_p14=Math.sin(this.lat0); + this.cos_p14=Math.cos(this.lat0); + // Approximation for projecting points to the horizon (infinity) + this.infinity_dist = 1000 * this.a; + this.rc = 1; + }, + + + /* Gnomonic forward equations--mapping lat,long to x,y + ---------------------------------------------------*/ + forward: function(p) { + var sinphi, cosphi; /* sin and cos value */ + var dlon; /* delta longitude value */ + var coslon; /* cos of longitude */ + var ksp; /* scale factor */ + var g; + var lon=p.x; + var lat=p.y; + /* Forward equations + -----------------*/ + dlon = Proj4js.common.adjust_lon(lon - this.long0); + + sinphi=Math.sin(lat); + cosphi=Math.cos(lat); + + coslon = Math.cos(dlon); + g = this.sin_p14 * sinphi + this.cos_p14 * cosphi * coslon; + ksp = 1.0; + if ((g > 0) || (Math.abs(g) <= Proj4js.common.EPSLN)) { + x = this.x0 + this.a * ksp * cosphi * Math.sin(dlon) / g; + y = this.y0 + this.a * ksp * (this.cos_p14 * sinphi - this.sin_p14 * cosphi * coslon) / g; + } else { + Proj4js.reportError("orthoFwdPointError"); + + // Point is in the opposing hemisphere and is unprojectable + // We still need to return a reasonable point, so we project + // to infinity, on a bearing + // equivalent to the northern hemisphere equivalent + // This is a reasonable approximation for short shapes and lines that + // straddle the horizon. + + x = this.x0 + this.infinity_dist * cosphi * Math.sin(dlon); + y = this.y0 + this.infinity_dist * (this.cos_p14 * sinphi - this.sin_p14 * cosphi * coslon); + + } + p.x=x; + p.y=y; + return p; + }, + + + inverse: function(p) { + var rh; /* Rho */ + var z; /* angle */ + var sinc, cosc; + var c; + var lon , lat; + + /* Inverse equations + -----------------*/ + p.x = (p.x - this.x0) / this.a; + p.y = (p.y - this.y0) / this.a; + + p.x /= this.k0; + p.y /= this.k0; + + if ( (rh = Math.sqrt(p.x * p.x + p.y * p.y)) ) { + c = Math.atan2(rh, this.rc); + sinc = Math.sin(c); + cosc = Math.cos(c); + + lat = Proj4js.common.asinz(cosc*this.sin_p14 + (p.y*sinc*this.cos_p14) / rh); + lon = Math.atan2(p.x*sinc, rh*this.cos_p14*cosc - p.y*this.sin_p14*sinc); + lon = Proj4js.common.adjust_lon(this.long0+lon); + } else { + lat = this.phic0; + lon = 0.0; + } + + p.x=lon; + p.y=lat; + return p; + } +}; + + diff --git a/module/viewer/lib/js/projCode/gstmerc.js b/module/viewer/lib/js/projCode/gstmerc.js new file mode 100644 index 0000000..d7f38ff --- /dev/null +++ b/module/viewer/lib/js/projCode/gstmerc.js @@ -0,0 +1,52 @@ +Proj4js.Proj.gstmerc = { + init : function() { + + // array of: a, b, lon0, lat0, k0, x0, y0 + var temp= this.b / this.a; + this.e= Math.sqrt(1.0 - temp*temp); + this.lc= this.long0; + this.rs= Math.sqrt(1.0+this.e*this.e*Math.pow(Math.cos(this.lat0),4.0)/(1.0-this.e*this.e)); + var sinz= Math.sin(this.lat0); + var pc= Math.asin(sinz/this.rs); + var sinzpc= Math.sin(pc); + this.cp= Proj4js.common.latiso(0.0,pc,sinzpc)-this.rs*Proj4js.common.latiso(this.e,this.lat0,sinz); + this.n2= this.k0*this.a*Math.sqrt(1.0-this.e*this.e)/(1.0-this.e*this.e*sinz*sinz); + this.xs= this.x0; + this.ys= this.y0-this.n2*pc; + + if (!this.title) this.title = "Gauss Schreiber transverse mercator"; + }, + + + // forward equations--mapping lat,long to x,y + // ----------------------------------------------------------------- + forward : function(p) { + + var lon= p.x; + var lat= p.y; + + var L= this.rs*(lon-this.lc); + var Ls= this.cp+(this.rs*Proj4js.common.latiso(this.e,lat,Math.sin(lat))); + var lat1= Math.asin(Math.sin(L)/Proj4js.common.cosh(Ls)); + var Ls1= Proj4js.common.latiso(0.0,lat1,Math.sin(lat1)); + p.x= this.xs+(this.n2*Ls1); + p.y= this.ys+(this.n2*Math.atan(Proj4js.common.sinh(Ls)/Math.cos(L))); + return p; + }, + + // inverse equations--mapping x,y to lat/long + // ----------------------------------------------------------------- + inverse : function(p) { + + var x= p.x; + var y= p.y; + + var L= Math.atan(Proj4js.common.sinh((x-this.xs)/this.n2)/Math.cos((y-this.ys)/this.n2)); + var lat1= Math.asin(Math.sin((y-this.ys)/this.n2)/Proj4js.common.cosh((x-this.xs)/this.n2)); + var LC= Proj4js.common.latiso(0.0,lat1,Math.sin(lat1)); + p.x= this.lc+L/this.rs; + p.y= Proj4js.common.invlatiso(this.e,(LC-this.cp)/this.rs); + return p; + } + +}; diff --git a/module/viewer/lib/js/projCode/laea.js b/module/viewer/lib/js/projCode/laea.js new file mode 100644 index 0000000..9f70936 --- /dev/null +++ b/module/viewer/lib/js/projCode/laea.js @@ -0,0 +1,357 @@ +/******************************************************************************* +NAME LAMBERT AZIMUTHAL EQUAL-AREA + +PURPOSE: Transforms input longitude and latitude to Easting and + Northing for the Lambert Azimuthal Equal-Area projection. The + longitude and latitude must be in radians. The Easting + and Northing values will be returned in meters. + +PROGRAMMER DATE +---------- ---- +D. Steinwand, EROS March, 1991 + +This function was adapted from the Lambert Azimuthal Equal Area projection +code (FORTRAN) in the General Cartographic Transformation Package software +which is available from the U.S. Geological Survey National Mapping Division. + +ALGORITHM REFERENCES + +1. "New Equal-Area Map Projections for Noncircular Regions", John P. Snyder, + The American Cartographer, Vol 15, No. 4, October 1988, pp. 341-355. + +2. Snyder, John P., "Map Projections--A Working Manual", U.S. Geological + Survey Professional Paper 1395 (Supersedes USGS Bulletin 1532), United + State Government Printing Office, Washington D.C., 1987. + +3. "Software Documentation for GCTP General Cartographic Transformation + Package", U.S. Geological Survey National Mapping Division, May 1982. +*******************************************************************************/ + +Proj4js.Proj.laea = { + S_POLE: 1, + N_POLE: 2, + EQUIT: 3, + OBLIQ: 4, + + +/* Initialize the Lambert Azimuthal Equal Area projection + ------------------------------------------------------*/ + init: function() { + var t = Math.abs(this.lat0); + if (Math.abs(t - Proj4js.common.HALF_PI) < Proj4js.common.EPSLN) { + this.mode = this.lat0 < 0. ? this.S_POLE : this.N_POLE; + } else if (Math.abs(t) < Proj4js.common.EPSLN) { + this.mode = this.EQUIT; + } else { + this.mode = this.OBLIQ; + } + if (this.es > 0) { + var sinphi; + + this.qp = Proj4js.common.qsfnz(this.e, 1.0); + this.mmf = .5 / (1. - this.es); + this.apa = this.authset(this.es); + switch (this.mode) { + case this.N_POLE: + case this.S_POLE: + this.dd = 1.; + break; + case this.EQUIT: + this.rq = Math.sqrt(.5 * this.qp); + this.dd = 1. / this.rq; + this.xmf = 1.; + this.ymf = .5 * this.qp; + break; + case this.OBLIQ: + this.rq = Math.sqrt(.5 * this.qp); + sinphi = Math.sin(this.lat0); + this.sinb1 = Proj4js.common.qsfnz(this.e, sinphi) / this.qp; + this.cosb1 = Math.sqrt(1. - this.sinb1 * this.sinb1); + this.dd = Math.cos(this.lat0) / (Math.sqrt(1. - this.es * sinphi * sinphi) * this.rq * this.cosb1); + this.ymf = (this.xmf = this.rq) / this.dd; + this.xmf *= this.dd; + break; + } + } else { + if (this.mode == this.OBLIQ) { + this.sinph0 = Math.sin(this.lat0); + this.cosph0 = Math.cos(this.lat0); + } + } + }, + +/* Lambert Azimuthal Equal Area forward equations--mapping lat,long to x,y + -----------------------------------------------------------------------*/ + forward: function(p) { + + /* Forward equations + -----------------*/ + var x,y; + var lam=p.x; + var phi=p.y; + lam = Proj4js.common.adjust_lon(lam - this.long0); + + if (this.sphere) { + var coslam, cosphi, sinphi; + + sinphi = Math.sin(phi); + cosphi = Math.cos(phi); + coslam = Math.cos(lam); + switch (this.mode) { + case this.OBLIQ: + case this.EQUIT: + y = (this.mode == this.EQUIT) ? 1. + cosphi * coslam : 1. + this.sinph0 * sinphi + this.cosph0 * cosphi * coslam; + if (y <= Proj4js.common.EPSLN) { + Proj4js.reportError("laea:fwd:y less than eps"); + return null; + } + y = Math.sqrt(2. / y); + x = y * cosphi * Math.sin(lam); + y *= (this.mode == this.EQUIT) ? sinphi : this.cosph0 * sinphi - this.sinph0 * cosphi * coslam; + break; + case this.N_POLE: + coslam = -coslam; + case this.S_POLE: + if (Math.abs(phi + this.phi0) < Proj4js.common.EPSLN) { + Proj4js.reportError("laea:fwd:phi < eps"); + return null; + } + y = Proj4js.common.FORTPI - phi * .5; + y = 2. * ((this.mode == this.S_POLE) ? Math.cos(y) : Math.sin(y)); + x = y * Math.sin(lam); + y *= coslam; + break; + } + } else { + var coslam, sinlam, sinphi, q, sinb=0.0, cosb=0.0, b=0.0; + + coslam = Math.cos(lam); + sinlam = Math.sin(lam); + sinphi = Math.sin(phi); + q = Proj4js.common.qsfnz(this.e, sinphi); + if (this.mode == this.OBLIQ || this.mode == this.EQUIT) { + sinb = q / this.qp; + cosb = Math.sqrt(1. - sinb * sinb); + } + switch (this.mode) { + case this.OBLIQ: + b = 1. + this.sinb1 * sinb + this.cosb1 * cosb * coslam; + break; + case this.EQUIT: + b = 1. + cosb * coslam; + break; + case this.N_POLE: + b = Proj4js.common.HALF_PI + phi; + q = this.qp - q; + break; + case this.S_POLE: + b = phi - Proj4js.common.HALF_PI; + q = this.qp + q; + break; + } + if (Math.abs(b) < Proj4js.common.EPSLN) { + Proj4js.reportError("laea:fwd:b < eps"); + return null; + } + switch (this.mode) { + case this.OBLIQ: + case this.EQUIT: + b = Math.sqrt(2. / b); + if (this.mode == this.OBLIQ) { + y = this.ymf * b * (this.cosb1 * sinb - this.sinb1 * cosb * coslam); + } else { + y = (b = Math.sqrt(2. / (1. + cosb * coslam))) * sinb * this.ymf; + } + x = this.xmf * b * cosb * sinlam; + break; + case this.N_POLE: + case this.S_POLE: + if (q >= 0.) { + x = (b = Math.sqrt(q)) * sinlam; + y = coslam * ((this.mode == this.S_POLE) ? b : -b); + } else { + x = y = 0.; + } + break; + } + } + + //v 1.0 + /* + var sin_lat=Math.sin(lat); + var cos_lat=Math.cos(lat); + + var sin_delta_lon=Math.sin(delta_lon); + var cos_delta_lon=Math.cos(delta_lon); + + var g =this.sin_lat_o * sin_lat +this.cos_lat_o * cos_lat * cos_delta_lon; + if (g == -1.0) { + Proj4js.reportError("laea:fwd:Point projects to a circle of radius "+ 2.0 * R); + return null; + } + var ksp = this.a * Math.sqrt(2.0 / (1.0 + g)); + var x = ksp * cos_lat * sin_delta_lon + this.x0; + var y = ksp * (this.cos_lat_o * sin_lat - this.sin_lat_o * cos_lat * cos_delta_lon) + this.y0; + */ + p.x = this.a*x + this.x0; + p.y = this.a*y + this.y0; + return p; + },//lamazFwd() + +/* Inverse equations + -----------------*/ + inverse: function(p) { + p.x -= this.x0; + p.y -= this.y0; + var x = p.x/this.a; + var y = p.y/this.a; + + if (this.sphere) { + var cosz=0.0, rh, sinz=0.0; + + rh = Math.sqrt(x*x + y*y); + var phi = rh * .5; + if (phi > 1.) { + Proj4js.reportError("laea:Inv:DataError"); + return null; + } + phi = 2. * Math.asin(phi); + if (this.mode == this.OBLIQ || this.mode == this.EQUIT) { + sinz = Math.sin(phi); + cosz = Math.cos(phi); + } + switch (this.mode) { + case this.EQUIT: + phi = (Math.abs(rh) <= Proj4js.common.EPSLN) ? 0. : Math.asin(y * sinz / rh); + x *= sinz; + y = cosz * rh; + break; + case this.OBLIQ: + phi = (Math.abs(rh) <= Proj4js.common.EPSLN) ? this.phi0 : Math.asin(cosz * sinph0 + y * sinz * cosph0 / rh); + x *= sinz * cosph0; + y = (cosz - Math.sin(phi) * sinph0) * rh; + break; + case this.N_POLE: + y = -y; + phi = Proj4js.common.HALF_PI - phi; + break; + case this.S_POLE: + phi -= Proj4js.common.HALF_PI; + break; + } + lam = (y == 0. && (this.mode == this.EQUIT || this.mode == this.OBLIQ)) ? 0. : Math.atan2(x, y); + } else { + var cCe, sCe, q, rho, ab=0.0; + + switch (this.mode) { + case this.EQUIT: + case this.OBLIQ: + x /= this.dd; + y *= this.dd; + rho = Math.sqrt(x*x + y*y); + if (rho < Proj4js.common.EPSLN) { + p.x = 0.; + p.y = this.phi0; + return p; + } + sCe = 2. * Math.asin(.5 * rho / this.rq); + cCe = Math.cos(sCe); + x *= (sCe = Math.sin(sCe)); + if (this.mode == this.OBLIQ) { + ab = cCe * this.sinb1 + y * sCe * this.cosb1 / rho + q = this.qp * ab; + y = rho * this.cosb1 * cCe - y * this.sinb1 * sCe; + } else { + ab = y * sCe / rho; + q = this.qp * ab; + y = rho * cCe; + } + break; + case this.N_POLE: + y = -y; + case this.S_POLE: + q = (x * x + y * y); + if (!q ) { + p.x = 0.; + p.y = this.phi0; + return p; + } + /* + q = this.qp - q; + */ + ab = 1. - q / this.qp; + if (this.mode == this.S_POLE) { + ab = - ab; + } + break; + } + lam = Math.atan2(x, y); + phi = this.authlat(Math.asin(ab), this.apa); + } + + /* + var Rh = Math.Math.sqrt(p.x *p.x +p.y * p.y); + var temp = Rh / (2.0 * this.a); + + if (temp > 1) { + Proj4js.reportError("laea:Inv:DataError"); + return null; + } + + var z = 2.0 * Proj4js.common.asinz(temp); + var sin_z=Math.sin(z); + var cos_z=Math.cos(z); + + var lon =this.long0; + if (Math.abs(Rh) > Proj4js.common.EPSLN) { + var lat = Proj4js.common.asinz(this.sin_lat_o * cos_z +this. cos_lat_o * sin_z *p.y / Rh); + var temp =Math.abs(this.lat0) - Proj4js.common.HALF_PI; + if (Math.abs(temp) > Proj4js.common.EPSLN) { + temp = cos_z -this.sin_lat_o * Math.sin(lat); + if(temp!=0.0) lon=Proj4js.common.adjust_lon(this.long0+Math.atan2(p.x*sin_z*this.cos_lat_o,temp*Rh)); + } else if (this.lat0 < 0.0) { + lon = Proj4js.common.adjust_lon(this.long0 - Math.atan2(-p.x,p.y)); + } else { + lon = Proj4js.common.adjust_lon(this.long0 + Math.atan2(p.x, -p.y)); + } + } else { + lat = this.lat0; + } + */ + //return(OK); + p.x = Proj4js.common.adjust_lon(this.long0+lam); + p.y = phi; + return p; + },//lamazInv() + +/* determine latitude from authalic latitude */ + P00: .33333333333333333333, + P01: .17222222222222222222, + P02: .10257936507936507936, + P10: .06388888888888888888, + P11: .06640211640211640211, + P20: .01641501294219154443, + + authset: function(es) { + var t; + var APA = new Array(); + APA[0] = es * this.P00; + t = es * es; + APA[0] += t * this.P01; + APA[1] = t * this.P10; + t *= es; + APA[0] += t * this.P02; + APA[1] += t * this.P11; + APA[2] = t * this.P20; + return APA; + }, + + authlat: function(beta, APA) { + var t = beta+beta; + return(beta + APA[0] * Math.sin(t) + APA[1] * Math.sin(t+t) + APA[2] * Math.sin(t+t+t)); + } + +}; + + + diff --git a/module/viewer/lib/js/projCode/lcc.js b/module/viewer/lib/js/projCode/lcc.js new file mode 100644 index 0000000..6e1523a --- /dev/null +++ b/module/viewer/lib/js/projCode/lcc.js @@ -0,0 +1,148 @@ +/******************************************************************************* +NAME LAMBERT CONFORMAL CONIC + +PURPOSE: Transforms input longitude and latitude to Easting and + Northing for the Lambert Conformal Conic projection. The + longitude and latitude must be in radians. The Easting + and Northing values will be returned in meters. + + +ALGORITHM REFERENCES + +1. Snyder, John P., "Map Projections--A Working Manual", U.S. Geological + Survey Professional Paper 1395 (Supersedes USGS Bulletin 1532), United + State Government Printing Office, Washington D.C., 1987. + +2. Snyder, John P. and Voxland, Philip M., "An Album of Map Projections", + U.S. Geological Survey Professional Paper 1453 , United State Government +*******************************************************************************/ + + +//<2104> +proj=lcc +lat_1=10.16666666666667 +lat_0=10.16666666666667 +lon_0=-71.60561777777777 +k_0=1 +x0=-17044 +x0=-23139.97 +ellps=intl +units=m +no_defs no_defs + +// Initialize the Lambert Conformal conic projection +// ----------------------------------------------------------------- + +//Proj4js.Proj.lcc = Class.create(); +Proj4js.Proj.lcc = { + init : function() { + + // array of: r_maj,r_min,lat1,lat2,c_lon,c_lat,false_east,false_north + //double c_lat; /* center latitude */ + //double c_lon; /* center longitude */ + //double lat1; /* first standard parallel */ + //double lat2; /* second standard parallel */ + //double r_maj; /* major axis */ + //double r_min; /* minor axis */ + //double false_east; /* x offset in meters */ + //double false_north; /* y offset in meters */ + + if (!this.lat2){this.lat2=this.lat0;}//if lat2 is not defined + if (!this.k0) this.k0 = 1.0; + + // Standard Parallels cannot be equal and on opposite sides of the equator + if (Math.abs(this.lat1+this.lat2) < Proj4js.common.EPSLN) { + Proj4js.reportError("lcc:init: Equal Latitudes"); + return; + } + + var temp = this.b / this.a; + this.e = Math.sqrt(1.0 - temp*temp); + + var sin1 = Math.sin(this.lat1); + var cos1 = Math.cos(this.lat1); + var ms1 = Proj4js.common.msfnz(this.e, sin1, cos1); + var ts1 = Proj4js.common.tsfnz(this.e, this.lat1, sin1); + + var sin2 = Math.sin(this.lat2); + var cos2 = Math.cos(this.lat2); + var ms2 = Proj4js.common.msfnz(this.e, sin2, cos2); + var ts2 = Proj4js.common.tsfnz(this.e, this.lat2, sin2); + + var ts0 = Proj4js.common.tsfnz(this.e, this.lat0, Math.sin(this.lat0)); + + if (Math.abs(this.lat1 - this.lat2) > Proj4js.common.EPSLN) { + this.ns = Math.log(ms1/ms2)/Math.log(ts1/ts2); + } else { + this.ns = sin1; + } + this.f0 = ms1 / (this.ns * Math.pow(ts1, this.ns)); + this.rh = this.a * this.f0 * Math.pow(ts0, this.ns); + if (!this.title) this.title = "Lambert Conformal Conic"; + }, + + + // Lambert Conformal conic forward equations--mapping lat,long to x,y + // ----------------------------------------------------------------- + forward : function(p) { + + var lon = p.x; + var lat = p.y; + + // convert to radians + if ( lat <= 90.0 && lat >= -90.0 && lon <= 180.0 && lon >= -180.0) { + //lon = lon * Proj4js.common.D2R; + //lat = lat * Proj4js.common.D2R; + } else { + Proj4js.reportError("lcc:forward: llInputOutOfRange: "+ lon +" : " + lat); + return null; + } + + var con = Math.abs( Math.abs(lat) - Proj4js.common.HALF_PI); + var ts, rh1; + if (con > Proj4js.common.EPSLN) { + ts = Proj4js.common.tsfnz(this.e, lat, Math.sin(lat) ); + rh1 = this.a * this.f0 * Math.pow(ts, this.ns); + } else { + con = lat * this.ns; + if (con <= 0) { + Proj4js.reportError("lcc:forward: No Projection"); + return null; + } + rh1 = 0; + } + var theta = this.ns * Proj4js.common.adjust_lon(lon - this.long0); + p.x = this.k0 * (rh1 * Math.sin(theta)) + this.x0; + p.y = this.k0 * (this.rh - rh1 * Math.cos(theta)) + this.y0; + + return p; + }, + + // Lambert Conformal Conic inverse equations--mapping x,y to lat/long + // ----------------------------------------------------------------- + inverse : function(p) { + + var rh1, con, ts; + var lat, lon; + var x = (p.x - this.x0)/this.k0; + var y = (this.rh - (p.y - this.y0)/this.k0); + if (this.ns > 0) { + rh1 = Math.sqrt (x * x + y * y); + con = 1.0; + } else { + rh1 = -Math.sqrt (x * x + y * y); + con = -1.0; + } + var theta = 0.0; + if (rh1 != 0) { + theta = Math.atan2((con * x),(con * y)); + } + if ((rh1 != 0) || (this.ns > 0.0)) { + con = 1.0/this.ns; + ts = Math.pow((rh1/(this.a * this.f0)), con); + lat = Proj4js.common.phi2z(this.e, ts); + if (lat == -9999) return null; + } else { + lat = -Proj4js.common.HALF_PI; + } + lon = Proj4js.common.adjust_lon(theta/this.ns + this.long0); + + p.x = lon; + p.y = lat; + return p; + } +}; + + + + diff --git a/module/viewer/lib/js/projCode/merc.js b/module/viewer/lib/js/projCode/merc.js new file mode 100644 index 0000000..ebf55a7 --- /dev/null +++ b/module/viewer/lib/js/projCode/merc.js @@ -0,0 +1,115 @@ +/******************************************************************************* +NAME MERCATOR + +PURPOSE: Transforms input longitude and latitude to Easting and + Northing for the Mercator projection. The + longitude and latitude must be in radians. The Easting + and Northing values will be returned in meters. + +PROGRAMMER DATE +---------- ---- +D. Steinwand, EROS Nov, 1991 +T. Mittan Mar, 1993 + +ALGORITHM REFERENCES + +1. Snyder, John P., "Map Projections--A Working Manual", U.S. Geological + Survey Professional Paper 1395 (Supersedes USGS Bulletin 1532), United + State Government Printing Office, Washington D.C., 1987. + +2. Snyder, John P. and Voxland, Philip M., "An Album of Map Projections", + U.S. Geological Survey Professional Paper 1453 , United State Government + Printing Office, Washington D.C., 1989. +*******************************************************************************/ + +//static double r_major = a; /* major axis */ +//static double r_minor = b; /* minor axis */ +//static double lon_center = long0; /* Center longitude (projection center) */ +//static double lat_origin = lat0; /* center latitude */ +//static double e,es; /* eccentricity constants */ +//static double m1; /* small value m */ +//static double false_northing = y0; /* y offset in meters */ +//static double false_easting = x0; /* x offset in meters */ +//scale_fact = k0 + +Proj4js.Proj.merc = { + init : function() { + //?this.temp = this.r_minor / this.r_major; + //this.temp = this.b / this.a; + //this.es = 1.0 - Math.sqrt(this.temp); + //this.e = Math.sqrt( this.es ); + //?this.m1 = Math.cos(this.lat_origin) / (Math.sqrt( 1.0 - this.es * Math.sin(this.lat_origin) * Math.sin(this.lat_origin))); + //this.m1 = Math.cos(0.0) / (Math.sqrt( 1.0 - this.es * Math.sin(0.0) * Math.sin(0.0))); + if (this.lat_ts) { + if (this.sphere) { + this.k0 = Math.cos(this.lat_ts); + } else { + this.k0 = Proj4js.common.msfnz(this.es, Math.sin(this.lat_ts), Math.cos(this.lat_ts)); + } + } + }, + +/* Mercator forward equations--mapping lat,long to x,y + --------------------------------------------------*/ + + forward : function(p) { + //alert("ll2m coords : "+coords); + var lon = p.x; + var lat = p.y; + // convert to radians + if ( lat*Proj4js.common.R2D > 90.0 && + lat*Proj4js.common.R2D < -90.0 && + lon*Proj4js.common.R2D > 180.0 && + lon*Proj4js.common.R2D < -180.0) { + Proj4js.reportError("merc:forward: llInputOutOfRange: "+ lon +" : " + lat); + return null; + } + + var x,y; + if(Math.abs( Math.abs(lat) - Proj4js.common.HALF_PI) <= Proj4js.common.EPSLN) { + Proj4js.reportError("merc:forward: ll2mAtPoles"); + return null; + } else { + if (this.sphere) { + x = this.x0 + this.a * this.k0 * Proj4js.common.adjust_lon(lon - this.long0); + y = this.y0 + this.a * this.k0 * Math.log(Math.tan(Proj4js.common.FORTPI + 0.5*lat)); + } else { + var sinphi = Math.sin(lat); + var ts = Proj4js.common.tsfnz(this.e,lat,sinphi); + x = this.x0 + this.a * this.k0 * Proj4js.common.adjust_lon(lon - this.long0); + y = this.y0 - this.a * this.k0 * Math.log(ts); + } + p.x = x; + p.y = y; + return p; + } + }, + + + /* Mercator inverse equations--mapping x,y to lat/long + --------------------------------------------------*/ + inverse : function(p) { + + var x = p.x - this.x0; + var y = p.y - this.y0; + var lon,lat; + + if (this.sphere) { + lat = Proj4js.common.HALF_PI - 2.0 * Math.atan(Math.exp(-y / this.a * this.k0)); + } else { + var ts = Math.exp(-y / (this.a * this.k0)); + lat = Proj4js.common.phi2z(this.e,ts); + if(lat == -9999) { + Proj4js.reportError("merc:inverse: lat = -9999"); + return null; + } + } + lon = Proj4js.common.adjust_lon(this.long0+ x / (this.a * this.k0)); + + p.x = lon; + p.y = lat; + return p; + } +}; + + diff --git a/module/viewer/lib/js/projCode/mill.js b/module/viewer/lib/js/projCode/mill.js new file mode 100644 index 0000000..23d94ac --- /dev/null +++ b/module/viewer/lib/js/projCode/mill.js @@ -0,0 +1,68 @@ +/******************************************************************************* +NAME MILLER CYLINDRICAL + +PURPOSE: Transforms input longitude and latitude to Easting and + Northing for the Miller Cylindrical projection. The + longitude and latitude must be in radians. The Easting + and Northing values will be returned in meters. + +PROGRAMMER DATE +---------- ---- +T. Mittan March, 1993 + +This function was adapted from the Lambert Azimuthal Equal Area projection +code (FORTRAN) in the General Cartographic Transformation Package software +which is available from the U.S. Geological Survey National Mapping Division. + +ALGORITHM REFERENCES + +1. "New Equal-Area Map Projections for Noncircular Regions", John P. Snyder, + The American Cartographer, Vol 15, No. 4, October 1988, pp. 341-355. + +2. Snyder, John P., "Map Projections--A Working Manual", U.S. Geological + Survey Professional Paper 1395 (Supersedes USGS Bulletin 1532), United + State Government Printing Office, Washington D.C., 1987. + +3. "Software Documentation for GCTP General Cartographic Transformation + Package", U.S. Geological Survey National Mapping Division, May 1982. +*******************************************************************************/ + +Proj4js.Proj.mill = { + +/* Initialize the Miller Cylindrical projection + -------------------------------------------*/ + init: function() { + //no-op + }, + + + /* Miller Cylindrical forward equations--mapping lat,long to x,y + ------------------------------------------------------------*/ + forward: function(p) { + var lon=p.x; + var lat=p.y; + /* Forward equations + -----------------*/ + var dlon = Proj4js.common.adjust_lon(lon -this.long0); + var x = this.x0 + this.a * dlon; + var y = this.y0 + this.a * Math.log(Math.tan((Proj4js.common.PI / 4.0) + (lat / 2.5))) * 1.25; + + p.x=x; + p.y=y; + return p; + },//millFwd() + + /* Miller Cylindrical inverse equations--mapping x,y to lat/long + ------------------------------------------------------------*/ + inverse: function(p) { + p.x -= this.x0; + p.y -= this.y0; + + var lon = Proj4js.common.adjust_lon(this.long0 + p.x /this.a); + var lat = 2.5 * (Math.atan(Math.exp(0.8*p.y/this.a)) - Proj4js.common.PI / 4.0); + + p.x=lon; + p.y=lat; + return p; + }//millInv() +}; diff --git a/module/viewer/lib/js/projCode/moll.js b/module/viewer/lib/js/projCode/moll.js new file mode 100644 index 0000000..78b4476 --- /dev/null +++ b/module/viewer/lib/js/projCode/moll.js @@ -0,0 +1,100 @@ +/******************************************************************************* +NAME MOLLWEIDE + +PURPOSE: Transforms input longitude and latitude to Easting and + Northing for the MOllweide projection. The + longitude and latitude must be in radians. The Easting + and Northing values will be returned in meters. + +PROGRAMMER DATE +---------- ---- +D. Steinwand, EROS May, 1991; Updated Sept, 1992; Updated Feb, 1993 +S. Nelson, EDC Jun, 2993; Made corrections in precision and + number of iterations. + +ALGORITHM REFERENCES + +1. Snyder, John P. and Voxland, Philip M., "An Album of Map Projections", + U.S. Geological Survey Professional Paper 1453 , United State Government + Printing Office, Washington D.C., 1989. + +2. Snyder, John P., "Map Projections--A Working Manual", U.S. Geological + Survey Professional Paper 1395 (Supersedes USGS Bulletin 1532), United + State Government Printing Office, Washington D.C., 1987. +*******************************************************************************/ + +Proj4js.Proj.moll = { + + /* Initialize the Mollweide projection + ------------------------------------*/ + init: function(){ + //no-op + }, + + /* Mollweide forward equations--mapping lat,long to x,y + ----------------------------------------------------*/ + forward: function(p) { + + /* Forward equations + -----------------*/ + var lon=p.x; + var lat=p.y; + + var delta_lon = Proj4js.common.adjust_lon(lon - this.long0); + var theta = lat; + var con = Proj4js.common.PI * Math.sin(lat); + + /* Iterate using the Newton-Raphson method to find theta + -----------------------------------------------------*/ + for (var i=0;true;i++) { + var delta_theta = -(theta + Math.sin(theta) - con)/ (1.0 + Math.cos(theta)); + theta += delta_theta; + if (Math.abs(delta_theta) < Proj4js.common.EPSLN) break; + if (i >= 50) { + Proj4js.reportError("moll:Fwd:IterationError"); + //return(241); + } + } + theta /= 2.0; + + /* If the latitude is 90 deg, force the x coordinate to be "0 + false easting" + this is done here because of precision problems with "cos(theta)" + --------------------------------------------------------------------------*/ + if (Proj4js.common.PI/2 - Math.abs(lat) < Proj4js.common.EPSLN) delta_lon =0; + var x = 0.900316316158 * this.a * delta_lon * Math.cos(theta) + this.x0; + var y = 1.4142135623731 * this.a * Math.sin(theta) + this.y0; + + p.x=x; + p.y=y; + return p; + }, + + inverse: function(p){ + var theta; + var arg; + + /* Inverse equations + -----------------*/ + p.x-= this.x0; + //~ p.y -= this.y0; + var arg = p.y / (1.4142135623731 * this.a); + + /* Because of division by zero problems, 'arg' can not be 1.0. Therefore + a number very close to one is used instead. + -------------------------------------------------------------------*/ + if(Math.abs(arg) > 0.999999999999) arg=0.999999999999; + var theta =Math.asin(arg); + var lon = Proj4js.common.adjust_lon(this.long0 + (p.x / (0.900316316158 * this.a * Math.cos(theta)))); + if(lon < (-Proj4js.common.PI)) lon= -Proj4js.common.PI; + if(lon > Proj4js.common.PI) lon= Proj4js.common.PI; + arg = (2.0 * theta + Math.sin(2.0 * theta)) / Proj4js.common.PI; + if(Math.abs(arg) > 1.0)arg=1.0; + var lat = Math.asin(arg); + //return(OK); + + p.x=lon; + p.y=lat; + return p; + } +}; + diff --git a/module/viewer/lib/js/projCode/nzmg.js b/module/viewer/lib/js/projCode/nzmg.js new file mode 100644 index 0000000..f01553e --- /dev/null +++ b/module/viewer/lib/js/projCode/nzmg.js @@ -0,0 +1,286 @@ +/******************************************************************************* +NAME NEW ZEALAND MAP GRID + +PURPOSE: Transforms input longitude and latitude to Easting and + Northing for the New Zealand Map Grid projection. The + longitude and latitude must be in radians. The Easting + and Northing values will be returned in meters. + + +ALGORITHM REFERENCES + +1. Department of Land and Survey Technical Circular 1973/32 + http://www.linz.govt.nz/docs/miscellaneous/nz-map-definition.pdf + +2. OSG Technical Report 4.1 + http://www.linz.govt.nz/docs/miscellaneous/nzmg.pdf + + +IMPLEMENTATION NOTES + +The two references use different symbols for the calculated values. This +implementation uses the variable names similar to the symbols in reference [1]. + +The alogrithm uses different units for delta latitude and delta longitude. +The delta latitude is assumed to be in units of seconds of arc x 10^-5. +The delta longitude is the usual radians. Look out for these conversions. + +The algorithm is described using complex arithmetic. There were three +options: + * find and use a Javascript library for complex arithmetic + * write my own complex library + * expand the complex arithmetic by hand to simple arithmetic + +This implementation has expanded the complex multiplication operations +into parallel simple arithmetic operations for the real and imaginary parts. +The imaginary part is way over to the right of the display; this probably +violates every coding standard in the world, but, to me, it makes it much +more obvious what is going on. + +The following complex operations are used: + - addition + - multiplication + - division + - complex number raised to integer power + - summation + +A summary of complex arithmetic operations: + (from http://en.wikipedia.org/wiki/Complex_arithmetic) + addition: (a + bi) + (c + di) = (a + c) + (b + d)i + subtraction: (a + bi) - (c + di) = (a - c) + (b - d)i + multiplication: (a + bi) x (c + di) = (ac - bd) + (bc + ad)i + division: (a + bi) / (c + di) = [(ac + bd)/(cc + dd)] + [(bc - ad)/(cc + dd)]i + +The algorithm needs to calculate summations of simple and complex numbers. This is +implemented using a for-loop, pre-loading the summed value to zero. + +The algorithm needs to calculate theta^2, theta^3, etc while doing a summation. +There are three possible implementations: + - use Math.pow in the summation loop - except for complex numbers + - precalculate the values before running the loop + - calculate theta^n = theta^(n-1) * theta during the loop +This implementation uses the third option for both real and complex arithmetic. + +For example + psi_n = 1; + sum = 0; + for (n = 1; n <=6; n++) { + psi_n1 = psi_n * psi; // calculate psi^(n+1) + psi_n = psi_n1; + sum = sum + A[n] * psi_n; + } + + +TEST VECTORS + +NZMG E, N: 2487100.638 6751049.719 metres +NZGD49 long, lat: 172.739194 -34.444066 degrees + +NZMG E, N: 2486533.395 6077263.661 metres +NZGD49 long, lat: 172.723106 -40.512409 degrees + +NZMG E, N: 2216746.425 5388508.765 metres +NZGD49 long, lat: 169.172062 -46.651295 degrees + +Note that these test vectors convert from NZMG metres to lat/long referenced +to NZGD49, not the more usual WGS84. The difference is about 70m N/S and about +10m E/W. + +These test vectors are provided in reference [1]. Many more test +vectors are available in + http://www.linz.govt.nz/docs/topography/topographicdata/placenamesdatabase/nznamesmar08.zip +which is a catalog of names on the 260-series maps. + + +EPSG CODES + +NZMG EPSG:27200 +NZGD49 EPSG:4272 + +http://spatialreference.org/ defines these as + Proj4js.defs["EPSG:4272"] = "+proj=longlat +ellps=intl +datum=nzgd49 +no_defs "; + Proj4js.defs["EPSG:27200"] = "+proj=nzmg +lat_0=-41 +lon_0=173 +x_0=2510000 +y_0=6023150 +ellps=intl +datum=nzgd49 +units=m +no_defs "; + + +LICENSE + Copyright: Stephen Irons 2008 + Released under terms of the LGPL as per: http://www.gnu.org/copyleft/lesser.html + +*******************************************************************************/ + + +/** + Initialize New Zealand Map Grip projection +*/ + +Proj4js.Proj.nzmg = { + + /** + * iterations: Number of iterations to refine inverse transform. + * 0 -> km accuracy + * 1 -> m accuracy -- suitable for most mapping applications + * 2 -> mm accuracy + */ + iterations: 1, + + init : function() { + this.A = new Array(); + this.A[1] = +0.6399175073; + this.A[2] = -0.1358797613; + this.A[3] = +0.063294409; + this.A[4] = -0.02526853; + this.A[5] = +0.0117879; + this.A[6] = -0.0055161; + this.A[7] = +0.0026906; + this.A[8] = -0.001333; + this.A[9] = +0.00067; + this.A[10] = -0.00034; + + this.B_re = new Array(); this.B_im = new Array(); + this.B_re[1] = +0.7557853228; this.B_im[1] = 0.0; + this.B_re[2] = +0.249204646; this.B_im[2] = +0.003371507; + this.B_re[3] = -0.001541739; this.B_im[3] = +0.041058560; + this.B_re[4] = -0.10162907; this.B_im[4] = +0.01727609; + this.B_re[5] = -0.26623489; this.B_im[5] = -0.36249218; + this.B_re[6] = -0.6870983; this.B_im[6] = -1.1651967; + + this.C_re = new Array(); this.C_im = new Array(); + this.C_re[1] = +1.3231270439; this.C_im[1] = 0.0; + this.C_re[2] = -0.577245789; this.C_im[2] = -0.007809598; + this.C_re[3] = +0.508307513; this.C_im[3] = -0.112208952; + this.C_re[4] = -0.15094762; this.C_im[4] = +0.18200602; + this.C_re[5] = +1.01418179; this.C_im[5] = +1.64497696; + this.C_re[6] = +1.9660549; this.C_im[6] = +2.5127645; + + this.D = new Array(); + this.D[1] = +1.5627014243; + this.D[2] = +0.5185406398; + this.D[3] = -0.03333098; + this.D[4] = -0.1052906; + this.D[5] = -0.0368594; + this.D[6] = +0.007317; + this.D[7] = +0.01220; + this.D[8] = +0.00394; + this.D[9] = -0.0013; + }, + + /** + New Zealand Map Grid Forward - long/lat to x/y + long/lat in radians + */ + forward : function(p) { + var lon = p.x; + var lat = p.y; + + var delta_lat = lat - this.lat0; + var delta_lon = lon - this.long0; + + // 1. Calculate d_phi and d_psi ... // and d_lambda + // For this algorithm, delta_latitude is in seconds of arc x 10-5, so we need to scale to those units. Longitude is radians. + var d_phi = delta_lat / Proj4js.common.SEC_TO_RAD * 1E-5; var d_lambda = delta_lon; + var d_phi_n = 1; // d_phi^0 + + var d_psi = 0; + for (n = 1; n <= 10; n++) { + d_phi_n = d_phi_n * d_phi; + d_psi = d_psi + this.A[n] * d_phi_n; + } + + // 2. Calculate theta + var th_re = d_psi; var th_im = d_lambda; + + // 3. Calculate z + var th_n_re = 1; var th_n_im = 0; // theta^0 + var th_n_re1; var th_n_im1; + + var z_re = 0; var z_im = 0; + for (n = 1; n <= 6; n++) { + th_n_re1 = th_n_re*th_re - th_n_im*th_im; th_n_im1 = th_n_im*th_re + th_n_re*th_im; + th_n_re = th_n_re1; th_n_im = th_n_im1; + z_re = z_re + this.B_re[n]*th_n_re - this.B_im[n]*th_n_im; z_im = z_im + this.B_im[n]*th_n_re + this.B_re[n]*th_n_im; + } + + // 4. Calculate easting and northing + x = (z_im * this.a) + this.x0; + y = (z_re * this.a) + this.y0; + + p.x = x; p.y = y; + + return p; + }, + + + /** + New Zealand Map Grid Inverse - x/y to long/lat + */ + inverse : function(p) { + + var x = p.x; + var y = p.y; + + var delta_x = x - this.x0; + var delta_y = y - this.y0; + + // 1. Calculate z + var z_re = delta_y / this.a; var z_im = delta_x / this.a; + + // 2a. Calculate theta - first approximation gives km accuracy + var z_n_re = 1; var z_n_im = 0; // z^0 + var z_n_re1; var z_n_im1; + + var th_re = 0; var th_im = 0; + for (n = 1; n <= 6; n++) { + z_n_re1 = z_n_re*z_re - z_n_im*z_im; z_n_im1 = z_n_im*z_re + z_n_re*z_im; + z_n_re = z_n_re1; z_n_im = z_n_im1; + th_re = th_re + this.C_re[n]*z_n_re - this.C_im[n]*z_n_im; th_im = th_im + this.C_im[n]*z_n_re + this.C_re[n]*z_n_im; + } + + // 2b. Iterate to refine the accuracy of the calculation + // 0 iterations gives km accuracy + // 1 iteration gives m accuracy -- good enough for most mapping applications + // 2 iterations bives mm accuracy + for (i = 0; i < this.iterations; i++) { + var th_n_re = th_re; var th_n_im = th_im; + var th_n_re1; var th_n_im1; + + var num_re = z_re; var num_im = z_im; + for (n = 2; n <= 6; n++) { + th_n_re1 = th_n_re*th_re - th_n_im*th_im; th_n_im1 = th_n_im*th_re + th_n_re*th_im; + th_n_re = th_n_re1; th_n_im = th_n_im1; + num_re = num_re + (n-1)*(this.B_re[n]*th_n_re - this.B_im[n]*th_n_im); num_im = num_im + (n-1)*(this.B_im[n]*th_n_re + this.B_re[n]*th_n_im); + } + + th_n_re = 1; th_n_im = 0; + var den_re = this.B_re[1]; var den_im = this.B_im[1]; + for (n = 2; n <= 6; n++) { + th_n_re1 = th_n_re*th_re - th_n_im*th_im; th_n_im1 = th_n_im*th_re + th_n_re*th_im; + th_n_re = th_n_re1; th_n_im = th_n_im1; + den_re = den_re + n * (this.B_re[n]*th_n_re - this.B_im[n]*th_n_im); den_im = den_im + n * (this.B_im[n]*th_n_re + this.B_re[n]*th_n_im); + } + + // Complex division + var den2 = den_re*den_re + den_im*den_im; + th_re = (num_re*den_re + num_im*den_im) / den2; th_im = (num_im*den_re - num_re*den_im) / den2; + } + + // 3. Calculate d_phi ... // and d_lambda + var d_psi = th_re; var d_lambda = th_im; + var d_psi_n = 1; // d_psi^0 + + var d_phi = 0; + for (n = 1; n <= 9; n++) { + d_psi_n = d_psi_n * d_psi; + d_phi = d_phi + this.D[n] * d_psi_n; + } + + // 4. Calculate latitude and longitude + // d_phi is calcuated in second of arc * 10^-5, so we need to scale back to radians. d_lambda is in radians. + var lat = this.lat0 + (d_phi * Proj4js.common.SEC_TO_RAD * 1E5); + var lon = this.long0 + d_lambda; + + p.x = lon; + p.y = lat; + + return p; + } +}; diff --git a/module/viewer/lib/js/projCode/omerc.js b/module/viewer/lib/js/projCode/omerc.js new file mode 100644 index 0000000..33e8837 --- /dev/null +++ b/module/viewer/lib/js/projCode/omerc.js @@ -0,0 +1,256 @@ +/******************************************************************************* +NAME OBLIQUE MERCATOR (HOTINE) + +PURPOSE: Transforms input longitude and latitude to Easting and + Northing for the Oblique Mercator projection. The + longitude and latitude must be in radians. The Easting + and Northing values will be returned in meters. + +PROGRAMMER DATE +---------- ---- +T. Mittan Mar, 1993 + +ALGORITHM REFERENCES + +1. Snyder, John P., "Map Projections--A Working Manual", U.S. Geological + Survey Professional Paper 1395 (Supersedes USGS Bulletin 1532), United + State Government Printing Office, Washington D.C., 1987. + +2. Snyder, John P. and Voxland, Philip M., "An Album of Map Projections", + U.S. Geological Survey Professional Paper 1453 , United State Government + Printing Office, Washington D.C., 1989. +*******************************************************************************/ + +Proj4js.Proj.omerc = { + + /* Initialize the Oblique Mercator projection + ------------------------------------------*/ + init: function() { + if (!this.mode) this.mode=0; + if (!this.lon1) {this.lon1=0;this.mode=1;} + if (!this.lon2) this.lon2=0; + if (!this.lat2) this.lat2=0; + + /* Place parameters in static storage for common use + -------------------------------------------------*/ + var temp = this.b/ this.a; + var es = 1.0 - Math.pow(temp,2); + var e = Math.sqrt(es); + + this.sin_p20=Math.sin(this.lat0); + this.cos_p20=Math.cos(this.lat0); + + this.con = 1.0 - this.es * this.sin_p20 * this.sin_p20; + this.com = Math.sqrt(1.0 - es); + this.bl = Math.sqrt(1.0 + this.es * Math.pow(this.cos_p20,4.0)/(1.0 - es)); + this.al = this.a * this.bl * this.k0 * this.com / this.con; + if (Math.abs(this.lat0) < Proj4js.common.EPSLN) { + this.ts = 1.0; + this.d = 1.0; + this.el = 1.0; + } else { + this.ts = Proj4js.common.tsfnz(this.e,this.lat0,this.sin_p20); + this.con = Math.sqrt(this.con); + this.d = this.bl * this.com / (this.cos_p20 * this.con); + if ((this.d * this.d - 1.0) > 0.0) { + if (this.lat0 >= 0.0) { + this.f = this.d + Math.sqrt(this.d * this.d - 1.0); + } else { + this.f = this.d - Math.sqrt(this.d * this.d - 1.0); + } + } else { + this.f = this.d; + } + this.el = this.f * Math.pow(this.ts,this.bl); + } + + //this.longc=52.60353916666667; + + if (this.mode != 0) { + this.g = .5 * (this.f - 1.0/this.f); + this.gama = Proj4js.common.asinz(Math.sin(this.alpha) / this.d); + this.longc= this.longc - Proj4js.common.asinz(this.g * Math.tan(this.gama))/this.bl; + + /* Report parameters common to format B + -------------------------------------*/ + //genrpt(azimuth * R2D,"Azimuth of Central Line: "); + //cenlon(lon_origin); + // cenlat(lat_origin); + + this.con = Math.abs(this.lat0); + if ((this.con > Proj4js.common.EPSLN) && (Math.abs(this.con - Proj4js.common.HALF_PI) > Proj4js.common.EPSLN)) { + this.singam=Math.sin(this.gama); + this.cosgam=Math.cos(this.gama); + + this.sinaz=Math.sin(this.alpha); + this.cosaz=Math.cos(this.alpha); + + if (this.lat0>= 0) { + this.u = (this.al / this.bl) * Math.atan(Math.sqrt(this.d*this.d - 1.0)/this.cosaz); + } else { + this.u = -(this.al / this.bl) *Math.atan(Math.sqrt(this.d*this.d - 1.0)/this.cosaz); + } + } else { + Proj4js.reportError("omerc:Init:DataError"); + } + } else { + this.sinphi =Math. sin(this.at1); + this.ts1 = Proj4js.common.tsfnz(this.e,this.lat1,this.sinphi); + this.sinphi = Math.sin(this.lat2); + this.ts2 = Proj4js.common.tsfnz(this.e,this.lat2,this.sinphi); + this.h = Math.pow(this.ts1,this.bl); + this.l = Math.pow(this.ts2,this.bl); + this.f = this.el/this.h; + this.g = .5 * (this.f - 1.0/this.f); + this.j = (this.el * this.el - this.l * this.h)/(this.el * this.el + this.l * this.h); + this.p = (this.l - this.h) / (this.l + this.h); + this.dlon = this.lon1 - this.lon2; + if (this.dlon < -Proj4js.common.PI) this.lon2 = this.lon2 - 2.0 * Proj4js.common.PI; + if (this.dlon > Proj4js.common.PI) this.lon2 = this.lon2 + 2.0 * Proj4js.common.PI; + this.dlon = this.lon1 - this.lon2; + this.longc = .5 * (this.lon1 + this.lon2) -Math.atan(this.j * Math.tan(.5 * this.bl * this.dlon)/this.p)/this.bl; + this.dlon = Proj4js.common.adjust_lon(this.lon1 - this.longc); + this.gama = Math.atan(Math.sin(this.bl * this.dlon)/this.g); + this.alpha = Proj4js.common.asinz(this.d * Math.sin(this.gama)); + + /* Report parameters common to format A + -------------------------------------*/ + + if (Math.abs(this.lat1 - this.lat2) <= Proj4js.common.EPSLN) { + Proj4js.reportError("omercInitDataError"); + //return(202); + } else { + this.con = Math.abs(this.lat1); + } + if ((this.con <= Proj4js.common.EPSLN) || (Math.abs(this.con - HALF_PI) <= Proj4js.common.EPSLN)) { + Proj4js.reportError("omercInitDataError"); + //return(202); + } else { + if (Math.abs(Math.abs(this.lat0) - Proj4js.common.HALF_PI) <= Proj4js.common.EPSLN) { + Proj4js.reportError("omercInitDataError"); + //return(202); + } + } + + this.singam=Math.sin(this.gam); + this.cosgam=Math.cos(this.gam); + + this.sinaz=Math.sin(this.alpha); + this.cosaz=Math.cos(this.alpha); + + + if (this.lat0 >= 0) { + this.u = (this.al/this.bl) * Math.atan(Math.sqrt(this.d * this.d - 1.0)/this.cosaz); + } else { + this.u = -(this.al/this.bl) * Math.atan(Math.sqrt(this.d * this.d - 1.0)/this.cosaz); + } + } + }, + + + /* Oblique Mercator forward equations--mapping lat,long to x,y + ----------------------------------------------------------*/ + forward: function(p) { + var theta; /* angle */ + var sin_phi, cos_phi;/* sin and cos value */ + var b; /* temporary values */ + var c, t, tq; /* temporary values */ + var con, n, ml; /* cone constant, small m */ + var q,us,vl; + var ul,vs; + var s; + var dlon; + var ts1; + + var lon=p.x; + var lat=p.y; + /* Forward equations + -----------------*/ + sin_phi = Math.sin(lat); + dlon = Proj4js.common.adjust_lon(lon - this.longc); + vl = Math.sin(this.bl * dlon); + if (Math.abs(Math.abs(lat) - Proj4js.common.HALF_PI) > Proj4js.common.EPSLN) { + ts1 = Proj4js.common.tsfnz(this.e,lat,sin_phi); + q = this.el / (Math.pow(ts1,this.bl)); + s = .5 * (q - 1.0 / q); + t = .5 * (q + 1.0/ q); + ul = (s * this.singam - vl * this.cosgam) / t; + con = Math.cos(this.bl * dlon); + if (Math.abs(con) < .0000001) { + us = this.al * this.bl * dlon; + } else { + us = this.al * Math.atan((s * this.cosgam + vl * this.singam) / con)/this.bl; + if (con < 0) us = us + Proj4js.common.PI * this.al / this.bl; + } + } else { + if (lat >= 0) { + ul = this.singam; + } else { + ul = -this.singam; + } + us = this.al * lat / this.bl; + } + if (Math.abs(Math.abs(ul) - 1.0) <= Proj4js.common.EPSLN) { + //alert("Point projects into infinity","omer-for"); + Proj4js.reportError("omercFwdInfinity"); + //return(205); + } + vs = .5 * this.al * Math.log((1.0 - ul)/(1.0 + ul)) / this.bl; + us = us - this.u; + var x = this.x0 + vs * this.cosaz + us * this.sinaz; + var y = this.y0 + us * this.cosaz - vs * this.sinaz; + + p.x=x; + p.y=y; + return p; + }, + + inverse: function(p) { + var delta_lon; /* Delta longitude (Given longitude - center */ + var theta; /* angle */ + var delta_theta; /* adjusted longitude */ + var sin_phi, cos_phi;/* sin and cos value */ + var b; /* temporary values */ + var c, t, tq; /* temporary values */ + var con, n, ml; /* cone constant, small m */ + var vs,us,q,s,ts1; + var vl,ul,bs; + var dlon; + var flag; + + /* Inverse equations + -----------------*/ + p.x -= this.x0; + p.y -= this.y0; + flag = 0; + vs = p.x * this.cosaz - p.y * this.sinaz; + us = p.y * this.cosaz + p.x * this.sinaz; + us = us + this.u; + q = Math.exp(-this.bl * vs / this.al); + s = .5 * (q - 1.0/q); + t = .5 * (q + 1.0/q); + vl = Math.sin(this.bl * us / this.al); + ul = (vl * this.cosgam + s * this.singam)/t; + if (Math.abs(Math.abs(ul) - 1.0) <= Proj4js.common.EPSLN) + { + lon = this.longc; + if (ul >= 0.0) { + lat = Proj4js.common.HALF_PI; + } else { + lat = -Proj4js.common.HALF_PI; + } + } else { + con = 1.0 / this.bl; + ts1 =Math.pow((this.el / Math.sqrt((1.0 + ul) / (1.0 - ul))),con); + lat = Proj4js.common.phi2z(this.e,ts1); + //if (flag != 0) + //return(flag); + //~ con = Math.cos(this.bl * us /al); + theta = this.longc - Math.atan2((s * this.cosgam - vl * this.singam) , con)/this.bl; + lon = Proj4js.common.adjust_lon(theta); + } + p.x=lon; + p.y=lat; + return p; + } +}; diff --git a/module/viewer/lib/js/projCode/ortho.js b/module/viewer/lib/js/projCode/ortho.js new file mode 100644 index 0000000..800dfdc --- /dev/null +++ b/module/viewer/lib/js/projCode/ortho.js @@ -0,0 +1,110 @@ +/******************************************************************************* +NAME ORTHOGRAPHIC + +PURPOSE: Transforms input longitude and latitude to Easting and + Northing for the Orthographic projection. The + longitude and latitude must be in radians. The Easting + and Northing values will be returned in meters. + +PROGRAMMER DATE +---------- ---- +T. Mittan Mar, 1993 + +ALGORITHM REFERENCES + +1. Snyder, John P., "Map Projections--A Working Manual", U.S. Geological + Survey Professional Paper 1395 (Supersedes USGS Bulletin 1532), United + State Government Printing Office, Washington D.C., 1987. + +2. Snyder, John P. and Voxland, Philip M., "An Album of Map Projections", + U.S. Geological Survey Professional Paper 1453 , United State Government + Printing Office, Washington D.C., 1989. +*******************************************************************************/ + +Proj4js.Proj.ortho = { + + /* Initialize the Orthographic projection + -------------------------------------*/ + init: function(def) { + //double temp; /* temporary variable */ + + /* Place parameters in static storage for common use + -------------------------------------------------*/; + this.sin_p14=Math.sin(this.lat0); + this.cos_p14=Math.cos(this.lat0); + }, + + + /* Orthographic forward equations--mapping lat,long to x,y + ---------------------------------------------------*/ + forward: function(p) { + var sinphi, cosphi; /* sin and cos value */ + var dlon; /* delta longitude value */ + var coslon; /* cos of longitude */ + var ksp; /* scale factor */ + var g; + var lon=p.x; + var lat=p.y; + /* Forward equations + -----------------*/ + dlon = Proj4js.common.adjust_lon(lon - this.long0); + + sinphi=Math.sin(lat); + cosphi=Math.cos(lat); + + coslon = Math.cos(dlon); + g = this.sin_p14 * sinphi + this.cos_p14 * cosphi * coslon; + ksp = 1.0; + if ((g > 0) || (Math.abs(g) <= Proj4js.common.EPSLN)) { + var x = this.a * ksp * cosphi * Math.sin(dlon); + var y = this.y0 + this.a * ksp * (this.cos_p14 * sinphi - this.sin_p14 * cosphi * coslon); + } else { + Proj4js.reportError("orthoFwdPointError"); + } + p.x=x; + p.y=y; + return p; + }, + + + inverse: function(p) { + var rh; /* height above ellipsoid */ + var z; /* angle */ + var sinz,cosz; /* sin of z and cos of z */ + var temp; + var con; + var lon , lat; + /* Inverse equations + -----------------*/ + p.x -= this.x0; + p.y -= this.y0; + rh = Math.sqrt(p.x * p.x + p.y * p.y); + if (rh > this.a + .0000001) { + Proj4js.reportError("orthoInvDataError"); + } + z = Proj4js.common.asinz(rh / this.a); + + sinz=Math.sin(z); + cosz=Math.cos(z); + + lon = this.long0; + if (Math.abs(rh) <= Proj4js.common.EPSLN) { + lat = this.lat0; + } + lat = Proj4js.common.asinz(cosz * this.sin_p14 + (p.y * sinz * this.cos_p14)/rh); + con = Math.abs(this.lat0) - Proj4js.common.HALF_PI; + if (Math.abs(con) <= Proj4js.common.EPSLN) { + if (this.lat0 >= 0) { + lon = Proj4js.common.adjust_lon(this.long0 + Math.atan2(p.x, -p.y)); + } else { + lon = Proj4js.common.adjust_lon(this.long0 -Math.atan2(-p.x, p.y)); + } + } + con = cosz - this.sin_p14 * Math.sin(lat); + p.x=lon; + p.y=lat; + return p; + } +}; + + diff --git a/module/viewer/lib/js/projCode/poly.js b/module/viewer/lib/js/projCode/poly.js new file mode 100644 index 0000000..c0e21bc --- /dev/null +++ b/module/viewer/lib/js/projCode/poly.js @@ -0,0 +1,157 @@ +/* Function to compute, phi4, the latitude for the inverse of the + Polyconic projection. +------------------------------------------------------------*/ +function phi4z (eccent,e0,e1,e2,e3,a,b,c,phi) { + var sinphi, sin2ph, tanph, ml, mlp, con1, con2, con3, dphi, i; + + phi = a; + for (i = 1; i <= 15; i++) { + sinphi = Math.sin(phi); + tanphi = Math.tan(phi); + c = tanphi * Math.sqrt (1.0 - eccent * sinphi * sinphi); + sin2ph = Math.sin (2.0 * phi); + /* + ml = e0 * *phi - e1 * sin2ph + e2 * sin (4.0 * *phi); + mlp = e0 - 2.0 * e1 * cos (2.0 * *phi) + 4.0 * e2 * cos (4.0 * *phi); + */ + ml = e0 * phi - e1 * sin2ph + e2 * Math.sin (4.0 * phi) - e3 * Math.sin (6.0 * phi); + mlp = e0 - 2.0 * e1 * Math.cos (2.0 * phi) + 4.0 * e2 * Math.cos (4.0 * phi) - 6.0 * e3 * Math.cos (6.0 * phi); + con1 = 2.0 * ml + c * (ml * ml + b) - 2.0 * a * (c * ml + 1.0); + con2 = eccent * sin2ph * (ml * ml + b - 2.0 * a * ml) / (2.0 *c); + con3 = 2.0 * (a - ml) * (c * mlp - 2.0 / sin2ph) - 2.0 * mlp; + dphi = con1 / (con2 + con3); + phi += dphi; + if (Math.abs(dphi) <= .0000000001 ) return(phi); + } + Proj4js.reportError("phi4z: No convergence"); + return null; +} + + +/* Function to compute the constant e4 from the input of the eccentricity + of the spheroid, x. This constant is used in the Polar Stereographic + projection. +--------------------------------------------------------------------*/ +function e4fn(x) { + var con, com; + con = 1.0 + x; + com = 1.0 - x; + return (Math.sqrt((Math.pow(con,con))*(Math.pow(com,com)))); +} + + + + + +/******************************************************************************* +NAME POLYCONIC + +PURPOSE: Transforms input longitude and latitude to Easting and + Northing for the Polyconic projection. The + longitude and latitude must be in radians. The Easting + and Northing values will be returned in meters. + +PROGRAMMER DATE +---------- ---- +T. Mittan Mar, 1993 + +ALGORITHM REFERENCES + +1. Snyder, John P., "Map Projections--A Working Manual", U.S. Geological + Survey Professional Paper 1395 (Supersedes USGS Bulletin 1532), United + State Government Printing Office, Washington D.C., 1987. + +2. Snyder, John P. and Voxland, Philip M., "An Album of Map Projections", + U.S. Geological Survey Professional Paper 1453 , United State Government + Printing Office, Washington D.C., 1989. +*******************************************************************************/ + +Proj4js.Proj.poly = { + + /* Initialize the POLYCONIC projection + ----------------------------------*/ + init: function() { + var temp; /* temporary variable */ + if (this.lat0=0) this.lat0=90;//this.lat0 ca + + /* Place parameters in static storage for common use + -------------------------------------------------*/ + this.temp = this.b / this.a; + this.es = 1.0 - Math.pow(this.temp,2);// devait etre dans tmerc.js mais n y est pas donc je commente sinon retour de valeurs nulles + this.e = Math.sqrt(this.es); + this.e0 = Proj4js.common.e0fn(this.es); + this.e1 = Proj4js.common.e1fn(this.es); + this.e2 = Proj4js.common.e2fn(this.es); + this.e3 = Proj4js.common.e3fn(this.es); + this.ml0 = Proj4js.common.mlfn(this.e0, this.e1,this.e2, this.e3, this.lat0);//si que des zeros le calcul ne se fait pas + //if (!this.ml0) {this.ml0=0;} + }, + + + /* Polyconic forward equations--mapping lat,long to x,y + ---------------------------------------------------*/ + forward: function(p) { + var sinphi, cosphi; /* sin and cos value */ + var al; /* temporary values */ + var c; /* temporary values */ + var con, ml; /* cone constant, small m */ + var ms; /* small m */ + var x,y; + + var lon=p.x; + var lat=p.y; + + con = Proj4js.common.adjust_lon(lon - this.long0); + if (Math.abs(lat) <= .0000001) { + x = this.x0 + this.a * con; + y = this.y0 - this.a * this.ml0; + } else { + sinphi = Math.sin(lat); + cosphi = Math.cos(lat); + + ml = Proj4js.common.mlfn(this.e0, this.e1, this.e2, this.e3, lat); + ms = Proj4js.common.msfnz(this.e,sinphi,cosphi); + con = sinphi; + x = this.x0 + this.a * ms * Math.sin(con)/sinphi; + y = this.y0 + this.a * (ml - this.ml0 + ms * (1.0 - Math.cos(con))/sinphi); + } + + p.x=x; + p.y=y; + return p; + }, + + + /* Inverse equations + -----------------*/ + inverse: function(p) { + var sin_phi, cos_phi; /* sin and cos value */ + var al; /* temporary values */ + var b; /* temporary values */ + var c; /* temporary values */ + var con, ml; /* cone constant, small m */ + var iflg; /* error flag */ + var lon,lat; + p.x -= this.x0; + p.y -= this.y0; + al = this.ml0 + p.y/this.a; + iflg = 0; + + if (Math.abs(al) <= .0000001) { + lon = p.x/this.a + this.long0; + lat = 0.0; + } else { + b = al * al + (p.x/this.a) * (p.x/this.a); + iflg = phi4z(this.es,this.e0,this.e1,this.e2,this.e3,this.al,b,c,lat); + if (iflg != 1) return(iflg); + lon = Proj4js.common.adjust_lon((Proj4js.common.asinz(p.x * c / this.a) / Math.sin(lat)) + this.long0); + } + + p.x=lon; + p.y=lat; + return p; + } +}; + + + diff --git a/module/viewer/lib/js/projCode/sinu.js b/module/viewer/lib/js/projCode/sinu.js new file mode 100644 index 0000000..1c7e32a --- /dev/null +++ b/module/viewer/lib/js/projCode/sinu.js @@ -0,0 +1,79 @@ +/******************************************************************************* +NAME SINUSOIDAL + +PURPOSE: Transforms input longitude and latitude to Easting and + Northing for the Sinusoidal projection. The + longitude and latitude must be in radians. The Easting + and Northing values will be returned in meters. + +PROGRAMMER DATE +---------- ---- +D. Steinwand, EROS May, 1991 + +This function was adapted from the Sinusoidal projection code (FORTRAN) in the +General Cartographic Transformation Package software which is available from +the U.S. Geological Survey National Mapping Division. + +ALGORITHM REFERENCES + +1. Snyder, John P., "Map Projections--A Working Manual", U.S. Geological + Survey Professional Paper 1395 (Supersedes USGS Bulletin 1532), United + State Government Printing Office, Washington D.C., 1987. + +2. "Software Documentation for GCTP General Cartographic Transformation + Package", U.S. Geological Survey National Mapping Division, May 1982. +*******************************************************************************/ + +Proj4js.Proj.sinu = { + + /* Initialize the Sinusoidal projection + ------------------------------------*/ + init: function() { + /* Place parameters in static storage for common use + -------------------------------------------------*/ + this.R = 6370997.0; //Radius of earth + }, + + /* Sinusoidal forward equations--mapping lat,long to x,y + -----------------------------------------------------*/ + forward: function(p) { + var x,y,delta_lon; + var lon=p.x; + var lat=p.y; + /* Forward equations + -----------------*/ + delta_lon = Proj4js.common.adjust_lon(lon - this.long0); + x = this.R * delta_lon * Math.cos(lat) + this.x0; + y = this.R * lat + this.y0; + + p.x=x; + p.y=y; + return p; + }, + + inverse: function(p) { + var lat,temp,lon; + + /* Inverse equations + -----------------*/ + p.x -= this.x0; + p.y -= this.y0; + lat = p.y / this.R; + if (Math.abs(lat) > Proj4js.common.HALF_PI) { + Proj4js.reportError("sinu:Inv:DataError"); + } + temp = Math.abs(lat) - Proj4js.common.HALF_PI; + if (Math.abs(temp) > Proj4js.common.EPSLN) { + temp = this.long0+ p.x / (this.R *Math.cos(lat)); + lon = Proj4js.common.adjust_lon(temp); + } else { + lon = this.long0; + } + + p.x=lon; + p.y=lat; + return p; + } +}; + + diff --git a/module/viewer/lib/js/projCode/somerc.js b/module/viewer/lib/js/projCode/somerc.js new file mode 100644 index 0000000..474ad2e --- /dev/null +++ b/module/viewer/lib/js/projCode/somerc.js @@ -0,0 +1,110 @@ +/******************************************************************************* +NAME SWISS OBLIQUE MERCATOR + +PURPOSE: Swiss projection. +WARNING: X and Y are inverted (weird) in the swiss coordinate system. Not + here, since we want X to be horizontal and Y vertical. + +ALGORITHM REFERENCES +1. "Formules et constantes pour le Calcul pour la + projection cylindrique conforme à axe oblique et pour la transformation entre + des systèmes de référence". + http://www.swisstopo.admin.ch/internet/swisstopo/fr/home/topics/survey/sys/refsys/switzerland.parsysrelated1.31216.downloadList.77004.DownloadFile.tmp/swissprojectionfr.pdf + +*******************************************************************************/ + +Proj4js.Proj.somerc = { + + init: function() { + var phy0 = this.lat0; + this.lambda0 = this.long0; + var sinPhy0 = Math.sin(phy0); + var semiMajorAxis = this.a; + var invF = this.rf; + var flattening = 1 / invF; + var e2 = 2 * flattening - Math.pow(flattening, 2); + var e = this.e = Math.sqrt(e2); + this.R = this.k0 * semiMajorAxis * Math.sqrt(1 - e2) / (1 - e2 * Math.pow(sinPhy0, 2.0)); + this.alpha = Math.sqrt(1 + e2 / (1 - e2) * Math.pow(Math.cos(phy0), 4.0)); + this.b0 = Math.asin(sinPhy0 / this.alpha); + this.K = Math.log(Math.tan(Math.PI / 4.0 + this.b0 / 2.0)) + - this.alpha + * Math.log(Math.tan(Math.PI / 4.0 + phy0 / 2.0)) + + this.alpha + * e / 2 + * Math.log((1 + e * sinPhy0) + / (1 - e * sinPhy0)); + }, + + + forward: function(p) { + var Sa1 = Math.log(Math.tan(Math.PI / 4.0 - p.y / 2.0)); + var Sa2 = this.e / 2.0 + * Math.log((1 + this.e * Math.sin(p.y)) + / (1 - this.e * Math.sin(p.y))); + var S = -this.alpha * (Sa1 + Sa2) + this.K; + + // spheric latitude + var b = 2.0 * (Math.atan(Math.exp(S)) - Math.PI / 4.0); + + // spheric longitude + var I = this.alpha * (p.x - this.lambda0); + + // psoeudo equatorial rotation + var rotI = Math.atan(Math.sin(I) + / (Math.sin(this.b0) * Math.tan(b) + + Math.cos(this.b0) * Math.cos(I))); + + var rotB = Math.asin(Math.cos(this.b0) * Math.sin(b) - + Math.sin(this.b0) * Math.cos(b) * Math.cos(I)); + + p.y = this.R / 2.0 + * Math.log((1 + Math.sin(rotB)) / (1 - Math.sin(rotB))) + + this.y0; + p.x = this.R * rotI + this.x0; + return p; + }, + + inverse: function(p) { + var Y = p.x - this.x0; + var X = p.y - this.y0; + + var rotI = Y / this.R; + var rotB = 2 * (Math.atan(Math.exp(X / this.R)) - Math.PI / 4.0); + + var b = Math.asin(Math.cos(this.b0) * Math.sin(rotB) + + Math.sin(this.b0) * Math.cos(rotB) * Math.cos(rotI)); + var I = Math.atan(Math.sin(rotI) + / (Math.cos(this.b0) * Math.cos(rotI) - Math.sin(this.b0) + * Math.tan(rotB))); + + var lambda = this.lambda0 + I / this.alpha; + + var S = 0.0; + var phy = b; + var prevPhy = -1000.0; + var iteration = 0; + while (Math.abs(phy - prevPhy) > 0.0000001) + { + if (++iteration > 20) + { + Proj4js.reportError("omercFwdInfinity"); + return; + } + //S = Math.log(Math.tan(Math.PI / 4.0 + phy / 2.0)); + S = 1.0 + / this.alpha + * (Math.log(Math.tan(Math.PI / 4.0 + b / 2.0)) - this.K) + + this.e + * Math.log(Math.tan(Math.PI / 4.0 + + Math.asin(this.e * Math.sin(phy)) + / 2.0)); + prevPhy = phy; + phy = 2.0 * Math.atan(Math.exp(S)) - Math.PI / 2.0; + } + + p.x = lambda; + p.y = phy; + return p; + } +}; diff --git a/module/viewer/lib/js/projCode/stere.js b/module/viewer/lib/js/projCode/stere.js new file mode 100644 index 0000000..2e0a25f --- /dev/null +++ b/module/viewer/lib/js/projCode/stere.js @@ -0,0 +1,246 @@ + +// Initialize the Stereographic projection + +Proj4js.Proj.stere = { + ssfn_: function(phit, sinphi, eccen) { + sinphi *= eccen; + return (Math.tan (.5 * (Proj4js.common.HALF_PI + phit)) * Math.pow((1. - sinphi) / (1. + sinphi), .5 * eccen)); + }, + TOL: 1.e-8, + NITER: 8, + CONV: 1.e-10, + S_POLE: 0, + N_POLE: 1, + OBLIQ: 2, + EQUIT: 3, + + init : function() { + this.phits = this.lat_ts ? this.lat_ts : Proj4js.common.HALF_PI; + var t = Math.abs(this.lat0); + if ((Math.abs(t) - Proj4js.common.HALF_PI) < Proj4js.common.EPSLN) { + this.mode = this.lat0 < 0. ? this.S_POLE : this.N_POLE; + } else { + this.mode = t > Proj4js.common.EPSLN ? this.OBLIQ : this.EQUIT; + } + this.phits = Math.abs(this.phits); + if (this.es) { + var X; + + switch (this.mode) { + case this.N_POLE: + case this.S_POLE: + if (Math.abs(this.phits - Proj4js.common.HALF_PI) < Proj4js.common.EPSLN) { + this.akm1 = 2. * this.k0 / Math.sqrt(Math.pow(1+this.e,1+this.e)*Math.pow(1-this.e,1-this.e)); + } else { + t = Math.sin(this.phits); + this.akm1 = Math.cos(this.phits) / Proj4js.common.tsfnz(this.e, this.phits, t); + t *= this.e; + this.akm1 /= Math.sqrt(1. - t * t); + } + break; + case this.EQUIT: + this.akm1 = 2. * this.k0; + break; + case this.OBLIQ: + t = Math.sin(this.lat0); + X = 2. * Math.atan(this.ssfn_(this.lat0, t, this.e)) - Proj4js.common.HALF_PI; + t *= this.e; + this.akm1 = 2. * this.k0 * Math.cos(this.lat0) / Math.sqrt(1. - t * t); + this.sinX1 = Math.sin(X); + this.cosX1 = Math.cos(X); + break; + } + } else { + switch (this.mode) { + case this.OBLIQ: + this.sinph0 = Math.sin(this.lat0); + this.cosph0 = Math.cos(this.lat0); + case this.EQUIT: + this.akm1 = 2. * this.k0; + break; + case this.S_POLE: + case this.N_POLE: + this.akm1 = Math.abs(this.phits - Proj4js.common.HALF_PI) >= Proj4js.common.EPSLN ? + Math.cos(this.phits) / Math.tan(Proj4js.common.FORTPI - .5 * this.phits) : + 2. * this.k0 ; + break; + } + } + }, + +// Stereographic forward equations--mapping lat,long to x,y + forward: function(p) { + var lon = p.x; + lon = Proj4js.common.adjust_lon(lon - this.long0); + var lat = p.y; + var x, y; + + if (this.sphere) { + var sinphi, cosphi, coslam, sinlam; + + sinphi = Math.sin(lat); + cosphi = Math.cos(lat); + coslam = Math.cos(lon); + sinlam = Math.sin(lon); + switch (this.mode) { + case this.EQUIT: + y = 1. + cosphi * coslam; + if (y <= Proj4js.common.EPSLN) { + F_ERROR; + } + y = this.akm1 / y; + x = y * cosphi * sinlam; + y *= sinphi; + break; + case this.OBLIQ: + y = 1. + this.sinph0 * sinphi + this.cosph0 * cosphi * coslam; + if (y <= Proj4js.common.EPSLN) { + F_ERROR; + } + y = this.akm1 / y; + x = y * cosphi * sinlam; + y *= this.cosph0 * sinphi - this.sinph0 * cosphi * coslam; + break; + case this.N_POLE: + coslam = -coslam; + lat = -lat; + //Note no break here so it conitnues through S_POLE + case this.S_POLE: + if (Math.abs(lat - Proj4js.common.HALF_PI) < this.TOL) { + F_ERROR; + } + y = this.akm1 * Math.tan(Proj4js.common.FORTPI + .5 * lat); + x = sinlam * y; + y *= coslam; + break; + } + } else { + coslam = Math.cos(lon); + sinlam = Math.sin(lon); + sinphi = Math.sin(lat); + if (this.mode == this.OBLIQ || this.mode == this.EQUIT) { + X = 2. * Math.atan(this.ssfn_(lat, sinphi, this.e)); + sinX = Math.sin(X - Proj4js.common.HALF_PI); + cosX = Math.cos(X); + } + switch (this.mode) { + case this.OBLIQ: + A = this.akm1 / (this.cosX1 * (1. + this.sinX1 * sinX + this.cosX1 * cosX * coslam)); + y = A * (this.cosX1 * sinX - this.sinX1 * cosX * coslam); + x = A * cosX; + break; + case this.EQUIT: + A = 2. * this.akm1 / (1. + cosX * coslam); + y = A * sinX; + x = A * cosX; + break; + case this.S_POLE: + lat = -lat; + coslam = - coslam; + sinphi = -sinphi; + case this.N_POLE: + x = this.akm1 * Proj4js.common.tsfnz(this.e, lat, sinphi); + y = - x * coslam; + break; + } + x = x * sinlam; + } + p.x = x*this.a + this.x0; + p.y = y*this.a + this.y0; + return p; + }, + + +//* Stereographic inverse equations--mapping x,y to lat/long + inverse: function(p) { + var x = (p.x - this.x0)/this.a; /* descale and de-offset */ + var y = (p.y - this.y0)/this.a; + var lon, lat; + + var cosphi, sinphi, tp=0.0, phi_l=0.0, rho, halfe=0.0, pi2=0.0; + var i; + + if (this.sphere) { + var c, rh, sinc, cosc; + + rh = Math.sqrt(x*x + y*y); + c = 2. * Math.atan(rh / this.akm1); + sinc = Math.sin(c); + cosc = Math.cos(c); + lon = 0.; + switch (this.mode) { + case this.EQUIT: + if (Math.abs(rh) <= Proj4js.common.EPSLN) { + lat = 0.; + } else { + lat = Math.asin(y * sinc / rh); + } + if (cosc != 0. || x != 0.) lon = Math.atan2(x * sinc, cosc * rh); + break; + case this.OBLIQ: + if (Math.abs(rh) <= Proj4js.common.EPSLN) { + lat = this.phi0; + } else { + lat = Math.asin(cosc * sinph0 + y * sinc * cosph0 / rh); + } + c = cosc - sinph0 * Math.sin(lat); + if (c != 0. || x != 0.) { + lon = Math.atan2(x * sinc * cosph0, c * rh); + } + break; + case this.N_POLE: + y = -y; + case this.S_POLE: + if (Math.abs(rh) <= Proj4js.common.EPSLN) { + lat = this.phi0; + } else { + lat = Math.asin(this.mode == this.S_POLE ? -cosc : cosc); + } + lon = (x == 0. && y == 0.) ? 0. : Math.atan2(x, y); + break; + } + p.x = Proj4js.common.adjust_lon(lon + this.long0); + p.y = lat; + } else { + rho = Math.sqrt(x*x + y*y); + switch (this.mode) { + case this.OBLIQ: + case this.EQUIT: + tp = 2. * Math.atan2(rho * this.cosX1 , this.akm1); + cosphi = Math.cos(tp); + sinphi = Math.sin(tp); + if( rho == 0.0 ) { + phi_l = Math.asin(cosphi * this.sinX1); + } else { + phi_l = Math.asin(cosphi * this.sinX1 + (y * sinphi * this.cosX1 / rho)); + } + + tp = Math.tan(.5 * (Proj4js.common.HALF_PI + phi_l)); + x *= sinphi; + y = rho * this.cosX1 * cosphi - y * this.sinX1* sinphi; + pi2 = Proj4js.common.HALF_PI; + halfe = .5 * this.e; + break; + case this.N_POLE: + y = -y; + case this.S_POLE: + tp = - rho / this.akm1; + phi_l = Proj4js.common.HALF_PI - 2. * Math.atan(tp); + pi2 = -Proj4js.common.HALF_PI; + halfe = -.5 * this.e; + break; + } + for (i = this.NITER; i--; phi_l = lat) { //check this + sinphi = this.e * Math.sin(phi_l); + lat = 2. * Math.atan(tp * Math.pow((1.+sinphi)/(1.-sinphi), halfe)) - pi2; + if (Math.abs(phi_l - lat) < this.CONV) { + if (this.mode == this.S_POLE) lat = -lat; + lon = (x == 0. && y == 0.) ? 0. : Math.atan2(x, y); + p.x = Proj4js.common.adjust_lon(lon + this.long0); + p.y = lat; + return p; + } + } + } + } +}; diff --git a/module/viewer/lib/js/projCode/sterea.js b/module/viewer/lib/js/projCode/sterea.js new file mode 100644 index 0000000..8ba7ecb --- /dev/null +++ b/module/viewer/lib/js/projCode/sterea.js @@ -0,0 +1,56 @@ + +Proj4js.Proj.sterea = { + dependsOn : 'gauss', + + init : function() { + Proj4js.Proj['gauss'].init.apply(this); + if (!this.rc) { + Proj4js.reportError("sterea:init:E_ERROR_0"); + return; + } + this.sinc0 = Math.sin(this.phic0); + this.cosc0 = Math.cos(this.phic0); + this.R2 = 2.0 * this.rc; + if (!this.title) this.title = "Oblique Stereographic Alternative"; + }, + + forward : function(p) { + p.x = Proj4js.common.adjust_lon(p.x-this.long0); /* adjust del longitude */ + Proj4js.Proj['gauss'].forward.apply(this, [p]); + sinc = Math.sin(p.y); + cosc = Math.cos(p.y); + cosl = Math.cos(p.x); + k = this.k0 * this.R2 / (1.0 + this.sinc0 * sinc + this.cosc0 * cosc * cosl); + p.x = k * cosc * Math.sin(p.x); + p.y = k * (this.cosc0 * sinc - this.sinc0 * cosc * cosl); + p.x = this.a * p.x + this.x0; + p.y = this.a * p.y + this.y0; + return p; + }, + + inverse : function(p) { + var lon,lat; + p.x = (p.x - this.x0) / this.a; /* descale and de-offset */ + p.y = (p.y - this.y0) / this.a; + + p.x /= this.k0; + p.y /= this.k0; + if ( (rho = Math.sqrt(p.x*p.x + p.y*p.y)) ) { + c = 2.0 * Math.atan2(rho, this.R2); + sinc = Math.sin(c); + cosc = Math.cos(c); + lat = Math.asin(cosc * this.sinc0 + p.y * sinc * this.cosc0 / rho); + lon = Math.atan2(p.x * sinc, rho * this.cosc0 * cosc - p.y * this.sinc0 * sinc); + } else { + lat = this.phic0; + lon = 0.; + } + + p.x = lon; + p.y = lat; + Proj4js.Proj['gauss'].inverse.apply(this,[p]); + p.x = Proj4js.common.adjust_lon(p.x + this.long0); /* adjust longitude to CM */ + return p; + } +}; + diff --git a/module/viewer/lib/js/projCode/tmerc.js b/module/viewer/lib/js/projCode/tmerc.js new file mode 100644 index 0000000..ed23841 --- /dev/null +++ b/module/viewer/lib/js/projCode/tmerc.js @@ -0,0 +1,141 @@ +/******************************************************************************* +NAME TRANSVERSE MERCATOR + +PURPOSE: Transforms input longitude and latitude to Easting and + Northing for the Transverse Mercator projection. The + longitude and latitude must be in radians. The Easting + and Northing values will be returned in meters. + +ALGORITHM REFERENCES + +1. Snyder, John P., "Map Projections--A Working Manual", U.S. Geological + Survey Professional Paper 1395 (Supersedes USGS Bulletin 1532), United + State Government Printing Office, Washington D.C., 1987. + +2. Snyder, John P. and Voxland, Philip M., "An Album of Map Projections", + U.S. Geological Survey Professional Paper 1453 , United State Government + Printing Office, Washington D.C., 1989. +*******************************************************************************/ + + +/** + Initialize Transverse Mercator projection +*/ + +Proj4js.Proj.tmerc = { + init : function() { + this.e0 = Proj4js.common.e0fn(this.es); + this.e1 = Proj4js.common.e1fn(this.es); + this.e2 = Proj4js.common.e2fn(this.es); + this.e3 = Proj4js.common.e3fn(this.es); + this.ml0 = this.a * Proj4js.common.mlfn(this.e0, this.e1, this.e2, this.e3, this.lat0); + }, + + /** + Transverse Mercator Forward - long/lat to x/y + long/lat in radians + */ + forward : function(p) { + var lon = p.x; + var lat = p.y; + + var delta_lon = Proj4js.common.adjust_lon(lon - this.long0); // Delta longitude + var con; // cone constant + var x, y; + var sin_phi=Math.sin(lat); + var cos_phi=Math.cos(lat); + + if (this.sphere) { /* spherical form */ + var b = cos_phi * Math.sin(delta_lon); + if ((Math.abs(Math.abs(b) - 1.0)) < .0000000001) { + Proj4js.reportError("tmerc:forward: Point projects into infinity"); + return(93); + } else { + x = .5 * this.a * this.k0 * Math.log((1.0 + b)/(1.0 - b)); + con = Math.acos(cos_phi * Math.cos(delta_lon)/Math.sqrt(1.0 - b*b)); + if (lat < 0) con = - con; + y = this.a * this.k0 * (con - this.lat0); + } + } else { + var al = cos_phi * delta_lon; + var als = Math.pow(al,2); + var c = this.ep2 * Math.pow(cos_phi,2); + var tq = Math.tan(lat); + var t = Math.pow(tq,2); + con = 1.0 - this.es * Math.pow(sin_phi,2); + var n = this.a / Math.sqrt(con); + var ml = this.a * Proj4js.common.mlfn(this.e0, this.e1, this.e2, this.e3, lat); + + x = this.k0 * n * al * (1.0 + als / 6.0 * (1.0 - t + c + als / 20.0 * (5.0 - 18.0 * t + Math.pow(t,2) + 72.0 * c - 58.0 * this.ep2))) + this.x0; + y = this.k0 * (ml - this.ml0 + n * tq * (als * (0.5 + als / 24.0 * (5.0 - t + 9.0 * c + 4.0 * Math.pow(c,2) + als / 30.0 * (61.0 - 58.0 * t + Math.pow(t,2) + 600.0 * c - 330.0 * this.ep2))))) + this.y0; + + } + p.x = x; p.y = y; + return p; + }, // tmercFwd() + + /** + Transverse Mercator Inverse - x/y to long/lat + */ + inverse : function(p) { + var con, phi; /* temporary angles */ + var delta_phi; /* difference between longitudes */ + var i; + var max_iter = 6; /* maximun number of iterations */ + var lat, lon; + + if (this.sphere) { /* spherical form */ + var f = Math.exp(p.x/(this.a * this.k0)); + var g = .5 * (f - 1/f); + var temp = this.lat0 + p.y/(this.a * this.k0); + var h = Math.cos(temp); + con = Math.sqrt((1.0 - h * h)/(1.0 + g * g)); + lat = Proj4js.common.asinz(con); + if (temp < 0) + lat = -lat; + if ((g == 0) && (h == 0)) { + lon = this.long0; + } else { + lon = Proj4js.common.adjust_lon(Math.atan2(g,h) + this.long0); + } + } else { // ellipsoidal form + var x = p.x - this.x0; + var y = p.y - this.y0; + + con = (this.ml0 + y / this.k0) / this.a; + phi = con; + for (i=0;true;i++) { + delta_phi=((con + this.e1 * Math.sin(2.0*phi) - this.e2 * Math.sin(4.0*phi) + this.e3 * Math.sin(6.0*phi)) / this.e0) - phi; + phi += delta_phi; + if (Math.abs(delta_phi) <= Proj4js.common.EPSLN) break; + if (i >= max_iter) { + Proj4js.reportError("tmerc:inverse: Latitude failed to converge"); + return(95); + } + } // for() + if (Math.abs(phi) < Proj4js.common.HALF_PI) { + // sincos(phi, &sin_phi, &cos_phi); + var sin_phi=Math.sin(phi); + var cos_phi=Math.cos(phi); + var tan_phi = Math.tan(phi); + var c = this.ep2 * Math.pow(cos_phi,2); + var cs = Math.pow(c,2); + var t = Math.pow(tan_phi,2); + var ts = Math.pow(t,2); + con = 1.0 - this.es * Math.pow(sin_phi,2); + var n = this.a / Math.sqrt(con); + var r = n * (1.0 - this.es) / con; + var d = x / (n * this.k0); + var ds = Math.pow(d,2); + lat = phi - (n * tan_phi * ds / r) * (0.5 - ds / 24.0 * (5.0 + 3.0 * t + 10.0 * c - 4.0 * cs - 9.0 * this.ep2 - ds / 30.0 * (61.0 + 90.0 * t + 298.0 * c + 45.0 * ts - 252.0 * this.ep2 - 3.0 * cs))); + lon = Proj4js.common.adjust_lon(this.long0 + (d * (1.0 - ds / 6.0 * (1.0 + 2.0 * t + c - ds / 20.0 * (5.0 - 2.0 * c + 28.0 * t - 3.0 * cs + 8.0 * this.ep2 + 24.0 * ts))) / cos_phi)); + } else { + lat = Proj4js.common.HALF_PI * Proj4js.common.sign(y); + lon = this.long0; + } + } + p.x = lon; + p.y = lat; + return p; + } // tmercInv() +}; \ No newline at end of file diff --git a/module/viewer/lib/js/projCode/utm.js b/module/viewer/lib/js/projCode/utm.js new file mode 100644 index 0000000..f1c5b9f --- /dev/null +++ b/module/viewer/lib/js/projCode/utm.js @@ -0,0 +1,43 @@ +/******************************************************************************* +NAME TRANSVERSE MERCATOR + +PURPOSE: Transforms input longitude and latitude to Easting and + Northing for the Transverse Mercator projection. The + longitude and latitude must be in radians. The Easting + and Northing values will be returned in meters. + +ALGORITHM REFERENCES + +1. Snyder, John P., "Map Projections--A Working Manual", U.S. Geological + Survey Professional Paper 1395 (Supersedes USGS Bulletin 1532), United + State Government Printing Office, Washington D.C., 1987. + +2. Snyder, John P. and Voxland, Philip M., "An Album of Map Projections", + U.S. Geological Survey Professional Paper 1453 , United State Government + Printing Office, Washington D.C., 1989. +*******************************************************************************/ + + +/** + Initialize Transverse Mercator projection +*/ + +Proj4js.Proj.utm = { + dependsOn : 'tmerc', + + init : function() { + if (!this.zone) { + Proj4js.reportError("utm:init: zone must be specified for UTM"); + return; + } + this.lat0 = 0.0; + this.long0 = ((6 * Math.abs(this.zone)) - 183) * Proj4js.common.D2R; + this.x0 = 500000.0; + this.y0 = this.utmSouth ? 10000000.0 : 0.0; + this.k0 = 0.9996; + + Proj4js.Proj['tmerc'].init.apply(this); + this.forward = Proj4js.Proj['tmerc'].forward; + this.inverse = Proj4js.Proj['tmerc'].inverse; + } +}; \ No newline at end of file diff --git a/module/viewer/lib/js/projCode/vandg.js b/module/viewer/lib/js/projCode/vandg.js new file mode 100644 index 0000000..263bf0c --- /dev/null +++ b/module/viewer/lib/js/projCode/vandg.js @@ -0,0 +1,137 @@ +/******************************************************************************* +NAME VAN DER GRINTEN + +PURPOSE: Transforms input Easting and Northing to longitude and + latitude for the Van der Grinten projection. The + Easting and Northing must be in meters. The longitude + and latitude values will be returned in radians. + +PROGRAMMER DATE +---------- ---- +T. Mittan March, 1993 + +This function was adapted from the Van Der Grinten projection code +(FORTRAN) in the General Cartographic Transformation Package software +which is available from the U.S. Geological Survey National Mapping Division. + +ALGORITHM REFERENCES + +1. "New Equal-Area Map Projections for Noncircular Regions", John P. Snyder, + The American Cartographer, Vol 15, No. 4, October 1988, pp. 341-355. + +2. Snyder, John P., "Map Projections--A Working Manual", U.S. Geological + Survey Professional Paper 1395 (Supersedes USGS Bulletin 1532), United + State Government Printing Office, Washington D.C., 1987. + +3. "Software Documentation for GCTP General Cartographic Transformation + Package", U.S. Geological Survey National Mapping Division, May 1982. +*******************************************************************************/ + +Proj4js.Proj.vandg = { + +/* Initialize the Van Der Grinten projection + ----------------------------------------*/ + init: function() { + this.R = 6370997.0; //Radius of earth + }, + + forward: function(p) { + + var lon=p.x; + var lat=p.y; + + /* Forward equations + -----------------*/ + var dlon = Proj4js.common.adjust_lon(lon - this.long0); + var x,y; + + if (Math.abs(lat) <= Proj4js.common.EPSLN) { + x = this.x0 + this.R * dlon; + y = this.y0; + } + var theta = Proj4js.common.asinz(2.0 * Math.abs(lat / Proj4js.common.PI)); + if ((Math.abs(dlon) <= Proj4js.common.EPSLN) || (Math.abs(Math.abs(lat) - Proj4js.common.HALF_PI) <= Proj4js.common.EPSLN)) { + x = this.x0; + if (lat >= 0) { + y = this.y0 + Proj4js.common.PI * this.R * Math.tan(.5 * theta); + } else { + y = this.y0 + Proj4js.common.PI * this.R * - Math.tan(.5 * theta); + } + // return(OK); + } + var al = .5 * Math.abs((Proj4js.common.PI / dlon) - (dlon / Proj4js.common.PI)); + var asq = al * al; + var sinth = Math.sin(theta); + var costh = Math.cos(theta); + + var g = costh / (sinth + costh - 1.0); + var gsq = g * g; + var m = g * (2.0 / sinth - 1.0); + var msq = m * m; + var con = Proj4js.common.PI * this.R * (al * (g - msq) + Math.sqrt(asq * (g - msq) * (g - msq) - (msq + asq) * (gsq - msq))) / (msq + asq); + if (dlon < 0) { + con = -con; + } + x = this.x0 + con; + con = Math.abs(con / (Proj4js.common.PI * this.R)); + if (lat >= 0) { + y = this.y0 + Proj4js.common.PI * this.R * Math.sqrt(1.0 - con * con - 2.0 * al * con); + } else { + y = this.y0 - Proj4js.common.PI * this.R * Math.sqrt(1.0 - con * con - 2.0 * al * con); + } + p.x = x; + p.y = y; + return p; + }, + +/* Van Der Grinten inverse equations--mapping x,y to lat/long + ---------------------------------------------------------*/ + inverse: function(p) { + var dlon; + var xx,yy,xys,c1,c2,c3; + var al,asq; + var a1; + var m1; + var con; + var th1; + var d; + + /* inverse equations + -----------------*/ + p.x -= this.x0; + p.y -= this.y0; + con = Proj4js.common.PI * this.R; + xx = p.x / con; + yy =p.y / con; + xys = xx * xx + yy * yy; + c1 = -Math.abs(yy) * (1.0 + xys); + c2 = c1 - 2.0 * yy * yy + xx * xx; + c3 = -2.0 * c1 + 1.0 + 2.0 * yy * yy + xys * xys; + d = yy * yy / c3 + (2.0 * c2 * c2 * c2 / c3 / c3 / c3 - 9.0 * c1 * c2 / c3 /c3) / 27.0; + a1 = (c1 - c2 * c2 / 3.0 / c3) / c3; + m1 = 2.0 * Math.sqrt( -a1 / 3.0); + con = ((3.0 * d) / a1) / m1; + if (Math.abs(con) > 1.0) { + if (con >= 0.0) { + con = 1.0; + } else { + con = -1.0; + } + } + th1 = Math.acos(con) / 3.0; + if (p.y >= 0) { + lat = (-m1 *Math.cos(th1 + Proj4js.common.PI / 3.0) - c2 / 3.0 / c3) * Proj4js.common.PI; + } else { + lat = -(-m1 * Math.cos(th1 + Proj4js.common.PI / 3.0) - c2 / 3.0 / c3) * Proj4js.common.PI; + } + + if (Math.abs(xx) < Proj4js.common.EPSLN) { + lon = this.long0; + } + lon = Proj4js.common.adjust_lon(this.long0 + Proj4js.common.PI * (xys - 1.0 + Math.sqrt(1.0 + 2.0 * (xx * xx - yy * yy) + xys * xys)) / 2.0 / xx); + + p.x=lon; + p.y=lat; + return p; + } +}; diff --git a/module/viewer/lib/php/empty b/module/viewer/lib/php/empty new file mode 100644 index 0000000..e69de29 diff --git a/module/viewer/proxy.php b/module/viewer/proxy.php new file mode 100644 index 0000000..18f9125 --- /dev/null +++ b/module/viewer/proxy.php @@ -0,0 +1,25 @@ + \ No newline at end of file diff --git a/module/viewer/proxyAPI.php b/module/viewer/proxyAPI.php new file mode 100644 index 0000000..fc8e9fe --- /dev/null +++ b/module/viewer/proxyAPI.php @@ -0,0 +1,52 @@ +admin_url ."/api/?". $_SERVER["QUERY_STRING"]; + +//Start the Curl session +$session = curl_init($url); + +// If it's a POST, put the POST data in the body + +$postvars = ''; +while ($element = current($_POST)) { + $postvars .= key($_POST) . '=' . urlencode(str_replace('\"', '"', $element)) . '&'; + next($_POST); +} + + +curl_setopt($session, CURLOPT_POST, 1); +curl_setopt($session, CURLOPT_POSTFIELDS, $postvars); + + +// Don't return HTTP headers. Do return the contents of the call +curl_setopt($session, CURLOPT_HEADER, ($headers == "true") ? true : false); + +//curl_setopt($session, CURLOPT_FOLLOWLOCATION, true); +//curl_setopt($ch, CURLOPT_TIMEOUT, 4); +curl_setopt($session, CURLOPT_RETURNTRANSFER, 1); + + +if ($mimeType != "") { + // The web service returns XML. Set the Content-Type appropriately + header("Content-Type: application/json"); +} +// Make the call +$response = curl_exec($session); +echo $response; + +curl_close($session); +?> \ No newline at end of file diff --git a/module/viewer/proxyGFI.php b/module/viewer/proxyGFI.php new file mode 100644 index 0000000..c607e72 --- /dev/null +++ b/module/viewer/proxyGFI.php @@ -0,0 +1,29 @@ +geoserver_url.'wms?' . $onlineresource[0]; + + +echo send_request($onlineresource); + +function send_request($onlineresource) { + + $ch = curl_init(); + $timeout = 5; // set to zero for no timeout + // fix to allow HTTPS connections with incorrect certificates + curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); + curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2); + curl_setopt($ch, CURLOPT_USERPWD, $GLOBALS["LGSettings"]->geoserver_user . ':' . $GLOBALS["LGSettings"]->geoserver_pass); + curl_setopt($ch, CURLOPT_URL, $onlineresource); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); + curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout); + // curl_setopt ($ch, CURLOPT_ENCODING , "gzip, deflate"); + + $file_contents = curl_exec($ch); + + return $file_contents; +} + +?> \ No newline at end of file diff --git a/module/viewer/proxyWFS.php b/module/viewer/proxyWFS.php new file mode 100644 index 0000000..546c79c --- /dev/null +++ b/module/viewer/proxyWFS.php @@ -0,0 +1,62 @@ +geoserver_url."/wfs?", $rawpostdata); + +function send_request($onlineresource, $data) { + + + $curl = curl_init($onlineresource); + + curl_setopt($curl, CURLOPT_URL, $onlineresource); + curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE); + curl_setopt($curl, CURLOPT_HTTPHEADER, array( + 'POST HTTP/1.0', + 'Content-type: text/xml;charset="UTF-8"', + 'Accept: text/xml', + 'Cache-Control: no-cache', + 'Pragma: no-cache' + )); + curl_setopt($curl, CURLOPT_POSTFIELDS, $data); + curl_setopt($curl, CURLOPT_POST, TRUE); + + + + + + $theData = curl_exec($curl); + + curl_close($curl); + + return $theData; + + +// file_put_contents("log.txt", $onlineresource."-".$GLOBALS["LGSettings"]->geoserver_user."-$LGSettings->geoserver_pass\n", FILE_APPEND); + + $ch = curl_init(); + $timeout = 0; // set to zero for no timeout + // fix to allow HTTPS connections with incorrect certificates + curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); + curl_setopt($ch, CURLOPT_POST, 1); + curl_setopt($ch, CURLOPT_POSTFIELDS, $data); + curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2); + curl_setopt($ch, CURLOPT_USERPWD, $GLOBALS["LGSettings"]->geoserver_user . ':' . $GLOBALS["LGSettings"]->geoserver_pass); + curl_setopt($ch, CURLOPT_URL, $onlineresource); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); + curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout); + // curl_setopt ($ch, CURLOPT_ENCODING , "gzip, deflate"); + + $file_contents = curl_exec($ch); + + + return $file_contents; +} + + +?> \ No newline at end of file diff --git a/module/viewer/settings.php b/module/viewer/settings.php new file mode 100644 index 0000000..8fa9b26 --- /dev/null +++ b/module/viewer/settings.php @@ -0,0 +1,16 @@ +geoserver_url = $LGSettings->geoserver_url; +$settings->lang_default = $LGSettings->lang_default; +$settings->viewer_modules = $LGSettings->module->viewer_modules; +$settings->proxy_url = $LGSettings->admin_url . '/module/proxy/api/'; +$settings->admin_url = $LGSettings->admin_url; +$settings->base_layers = $LGSettings->module->base_layers; + + + +echo(json_encode($settings)); +?> + diff --git a/module/viewer/settings/module.php b/module/viewer/settings/module.php new file mode 100644 index 0000000..3fcf8fc --- /dev/null +++ b/module/viewer/settings/module.php @@ -0,0 +1,22 @@ + diff --git a/page/README.md b/page/README.md new file mode 100644 index 0000000..fb02f08 --- /dev/null +++ b/page/README.md @@ -0,0 +1,2 @@ +Pages for administration Mapito +=============================== \ No newline at end of file diff --git a/page/layerStyle_edit.php b/page/layerStyle_edit.php new file mode 100644 index 0000000..8053be7 --- /dev/null +++ b/page/layerStyle_edit.php @@ -0,0 +1,28 @@ + + +Layer: title); ?> + +
                      + + +
                      +
                      + + Choose a pet: + + foreach ($layerStyleManager->getStylesByUser() as $layerStyleId) { + $layerStyle = new LGLayerStyle($layerStyleId); + ?> + layerStyleId == $layer->layerStyleId ? "checked" : ""); ?>/> + + + +
                      +
                      + Return to layers + +
                      \ No newline at end of file diff --git a/page/layerStyles_edit/index.php b/page/layerStyles_edit/index.php new file mode 100644 index 0000000..7c0b9ff --- /dev/null +++ b/page/layerStyles_edit/index.php @@ -0,0 +1,129 @@ + +
                      +

                      New SLD style

                      + +
                      +
                      + + +
                      +
                      + + +
                      +
                      + + +
                      +
                      + + +
                      +
                      + + +
                      + + + +
                      +
                      + + + + +
                      +

                      My SLD styles

                      +
                      + getStylesByUser() as $layerStyleId) { + $layerStyle = new LGLayerStyle($layerStyleId); + ?> + +
                      +

                      title); ?>

                      + + + + + +
                      + + +
                      + + +
                      +
                      + + +
                      +
                      + + +
                      +
                      + + +
                      + +
                      + + +
                      + + +
                      +
                      + +
                      +
                      + + + + +
                      +

                      Public SLD styles

                      +
                      + getStylesPublic() as $layerStyleId) { + $layerStyle = new LGLayerStyle($layerStyleId); + ?> + +
                      +

                      title); ?>

                      + + + + + +
                      + + +
                      + + +
                      +
                      + + +
                      +
                      + + +
                      + + +
                      +
                      + +
                      +
                      \ No newline at end of file diff --git a/page/layers_edit/index.php b/page/layers_edit/index.php new file mode 100644 index 0000000..94d196b --- /dev/null +++ b/page/layers_edit/index.php @@ -0,0 +1,402 @@ + + +
                      +

                      My maps

                      + + + + +
                      + getPlans() as $planId) { + // $layerManager->updateLayersFromPostgis($planId); + $plan = new LGPlan($planId); + + $planPrivilege = $user->getPrivilegeForPlan($planId); + if ($planPrivilege < 2) + continue; + ?> +
                      data-collapsed="false" > + +

                      title); ?>

                      + Update layers from PostGIS +
                      +

                      Folders

                      +
                      + +
                      +

                      New folder

                      +
                      +
                      + + +
                      + + + +
                      +
                      + + + + getLayerFoldersByPlan($plan->planId) as $layerFolderId) { + $layerFolder = new LGLayerFolder($layerFolderId); + ?> +
                      +

                      title); ?>

                      +
                      + + +
                      + + +
                      +
                      + + +
                      + + basic) { ?> + + +
                      +
                      + + + +
                      +
                      + + + +
                      +

                      Layers getNumberOfNewLayersByPlan($planId)) { + echo('' . $layerManager->getNumberOfNewLayersByPlan($planId) . ''); + } + ?>

                      +
                      + + +
                      +

                      Add public layer to map

                      +
                      +
                      + + + +
                      + + + +
                      +
                      +
                      +

                      Add remote WMS

                      +
                      + + +
                      + + +
                      + +
                      + + +
                      + +
                      + + +
                      + +
                      + + +
                      + +
                      + + +
                      + + + + + +
                      +
                      + +
                      +
                      + + + + + + + + + + + + + getLayersByPlan($plan->planId) as $layerId) { + + $layer = new LGLayer($layerId); + if ($planPrivilege < 3 && $layer->isLocked) + continue; + + $rank++; + ?> + +
                      data-collapsed="false" > +

                      title); ?> new) { ?>new

                      + +
                      + + + + + +
                      + + +
                      + +
                      + + +
                      + +
                      + + +
                      + +
                      + + +
                      + +
                      + + +
                      + +
                      + + +
                      + +
                      + + +
                      + +
                      + + +
                      + +
                      + + +
                      + +
                      + + +
                      + + +
                      + + + + Legenda +
                      + +
                      + + +
                      + +
                      + + +
                      + +
                      + + +
                      + +
                      + + + +
                      + +
                      + + + +
                      + +
                      + + +
                      + +
                      + + +
                      + +
                      + + +
                      + +
                      + + +
                      + + layerStyleId); + ?> +
                      +

                      Select SLD style

                      +
                      +
                      + + Choose a pet: + $layerStyleManager = new LGLayerStyleManager($user); + foreach ($layerStyleManager->getStylesByUser() as $layerStyleId) { + $layerStyle = new LGLayerStyle($layerStyleId); + ?> + layerStyleId == $layer->layerStyleId ? "checked" : ""); ?>/> + + + +
                      +
                      +
                      + + + Update style + + + type == "RASTR") { ?> + + +
                      + +
                      + + +
                      + +
                      + +
                      + + +
                      +
                      \ No newline at end of file diff --git a/page/layers_public/index.php b/page/layers_public/index.php new file mode 100644 index 0000000..1701e96 --- /dev/null +++ b/page/layers_public/index.php @@ -0,0 +1,121 @@ +isPrivilegeSuperAdmin()) { + exit("no privilege"); +} + +/* + * To change this template, choose Tools | Templates + * and open the template in the editor. + */ +?> + + + + + + + + + + + + + + + + + +
                      + + +
                      +

                      Add public layer to map

                      +
                      +
                      + + +
                      + + +
                      + + +
                      + +
                      + + +
                      + + +
                      + + +
                      + + + +
                      +
                      + + + + + + + + + + getLayersByPlan($plan->planId) as $layerId) { + + $layer = new LGLayer($layerId); + ?> + +
                      data-collapsed="false" > +

                      title); ?>

                      + +
                      + + + + + +
                      + + +
                      + +
                      + + +
                      + +
                      + + +
                      + +
                      + + +
                      + +
                      + + +
                      + + + + + + +
                      + +
                      + + +
                      diff --git a/page/pg_biotopy/GFI.php b/page/pg_biotopy/GFI.php new file mode 100644 index 0000000..843ce39 --- /dev/null +++ b/page/pg_biotopy/GFI.php @@ -0,0 +1,60 @@ +getPrivilegeForPlan($plan->planId) > 1) + $dbname = 'ligeo_' . $plan->name; +$dbtab = $_GET["dbtab"]; + + +if ($plan->name) { + + $pgsql_conn = pg_connect("host=" . $GLOBALS["LGSettings"]->postgis_host . " dbname=" . $dbname . " user=" . $GLOBALS["LGSettings"]->postgis_user . " password=" . $GLOBALS["LGSettings"]->postgis_pass . ""); + if (!$pgsql_conn) { + die("Error in connection: " . pg_last_error()); + } + pg_query($pgsql_conn, "SET NAMES 'utf8'"); +} + +$x = $_GET["x"]; +$y = $_GET["y"]; + + + +$pgsql_conn = pg_connect("host=" . $GLOBALS["LGSettings"]->postgis_host . " dbname=" . $dbname . " user=" . $GLOBALS["LGSettings"]->postgis_user . " password=" . $GLOBALS["LGSettings"]->postgis_pass . ""); +if (!$pgsql_conn) { + die("Error in connection: " . pg_last_error()); +} +pg_query($pgsql_conn, "SET NAMES 'utf8'"); +$layerId = $layerManager->getLayerIdByPlanAndLayerName($planId, $dbtab); +$layer = new LGLayer($layerId); +$table_info = pg_tableInfo($dbtab, $pgsql_conn); +$sql = 'SELECT gid,biotop,kodbio FROM ' . $dbtab . ' WHERE St_Intersects(ST_SetSRID(ST_point(' . $y . ',' . $x . '),4326),' . $dbtab . ' .the_geom);'; +$results = pg_query($pgsql_conn, $sql); +//$row = pg_fetch_row($results); + +for ($lt = 0; $lt < pg_num_rows($results); $lt++) { + $temp["gid"] = pg_fetch_result($results, $lt, "gid"); + $temp["name"] = pg_fetch_result($results, $lt, "biotop"); + $temp["kod"] = pg_fetch_result($results, $lt, "kodbio"); +} + + + +//echo $sql; + + + +echo json_encode($temp); +//echo $row[0]; +//echo $row[1]; +pg_close($pgsql_conn); +?> + diff --git a/page/pg_biotopy/ek_hodnota.php b/page/pg_biotopy/ek_hodnota.php new file mode 100644 index 0000000..a3aa484 --- /dev/null +++ b/page/pg_biotopy/ek_hodnota.php @@ -0,0 +1,168 @@ +getPrivilegeForPlan($plan->planId) > 1) + $dbname = 'ligeo_' . $plan->name; +$dbtab = $_GET["dbtab"]; + +if ($plan->name) { + + $pgsql_conn = pg_connect("host=" . $GLOBALS["LGSettings"]->postgis_host . " dbname=" . $dbname . " user=" . $GLOBALS["LGSettings"]->postgis_user . " password=" . $GLOBALS["LGSettings"]->postgis_pass . ""); + if (!$pgsql_conn) { + die("Error in connection: " . pg_last_error()); + } +} +?> + + + + + Ligeo + + + + + isUser()) { + + if ($dbname) { + if ($dbtab) { + ?> + + +

                      + + + + + + "; + if (pg_field_name($results, $gt) == "puvodnost") { + echo "původnost"; + } elseif (pg_field_name($results, $gt) == "chranene_druhy") { + echo "chráněné druhy"; + } elseif (pg_field_name($results, $gt) == "stupen_degradace") { + echo "stupeň degradace"; + } elseif (pg_field_name($results, $gt) == "jakostni_trida") { + echo "jakostní třída"; + } elseif (pg_field_name($results, $gt) == "ohrozeni_spolecenstva") { + echo "ohrožení společenstva"; + } elseif (pg_field_name($results, $gt) == "vyskyt_bioindikatoru") { + echo "výskyt bioindikátorů"; + } elseif (pg_field_name($results, $gt) == "chranene_druhy2") { + echo "chráněné druhy"; + } elseif (pg_field_name($results, $gt) == "synantropie2") { + echo "synantropie"; + } elseif (pg_field_name($results, $gt) == "ek_hodnota") { + echo "ekologická hodnota"; + } elseif (pg_field_name($results, $gt) == "kodbio") { + echo "kód biotopu"; + } elseif (pg_field_name($results, $gt) == "area") { + echo "rozloha [m2]"; + } else { + echo pg_field_name($results, $gt); + } + + echo""; + } + } + echo ""; + echo ""; + echo ""; + echo ""; + + + for ($lt = 0; $lt < pg_num_rows($results); $lt++) { + ?> + + + + + + '); + if (pg_field_name($results, $gt) == "gid") { + $gid = pg_result($results, $lt, $gt); + echo (''); + echo (pg_result($results, $lt, $gt)); + } elseif ($table_info[pg_field_name($results, $gt)]["type"] == "varchar" && $table_info[pg_field_name($results, $gt)]["len"] == 212) { + + echo(''); + if (pg_result($results, $lt, $gt)) + echo('odkaz'); + + echo('
                      '); + } else { + echo(''); + } + ?> + + + + + + + + + + + + diff --git a/page/pg_biotopy/hosp.php b/page/pg_biotopy/hosp.php new file mode 100644 index 0000000..5e91cf0 --- /dev/null +++ b/page/pg_biotopy/hosp.php @@ -0,0 +1,342 @@ +getPrivilegeForPlan($plan->planId) > 1) + $dbname = 'ligeo_' . $plan->name; + +$dbtab = "bio_hosp_hod"; +$dbtab1 = "hosp_hodnota_1"; +$dbtab2 = "hosp_hodnota_2"; + +if ($plan->name) { + + $pgsql_conn = pg_connect("host=" . $GLOBALS["LGSettings"]->postgis_host . " dbname=" . $dbname . " user=" . $GLOBALS["LGSettings"]->postgis_user . " password=" . $GLOBALS["LGSettings"]->postgis_pass . ""); + if (!$pgsql_conn) { + die("Error in connection: " . pg_last_error()); + } + pg_query($pgsql_conn, "SET NAMES 'utf8'"); +} +?> + + + + + Ligeo + + + + + isUser()) { ?> + + + +

                      Hospodářská hodnota

                      + + + info + getLayerIdByPlanAndLayerName($planId, $dbtab); + $layer = new LGLayer($layerId); + + $table_info = pg_tableInfo($dbtab, $pgsql_conn); + ?> + + + +
                      procenta z celkové rozlohyekologická hodnotapotenciál biotopu
                      + + + + + + + + + + + + + + + style="background-color: yellow" > + +
                      + + + "; + + if (pg_field_name($results, $gt) == "group") { + echo "skupina"; + } elseif (pg_field_name($results, $gt) == "title") { + echo "ekonomický faktor"; + } elseif (pg_field_name($results, $gt) == "a_body") { + echo "body (dnes)"; + } elseif (pg_field_name($results, $gt) == "a_svde") { + echo "SVDe"; + } elseif (pg_field_name($results, $gt) == "a_hosp_hodnota") { + echo "aktuální hospodářská hodnota"; + } elseif (pg_field_name($results, $gt) == "p_body") { + echo "body (potenciální)"; + } elseif (pg_field_name($results, $gt) == "p_svde") { + echo "SVDe"; + } elseif (pg_field_name($results, $gt) == "p_hosp_hodnota") { + echo "hospodářský potenciál"; + } else { + echo pg_field_name($results, $gt); + } + + + echo""; + } + } + } + echo ""; + for ($lt = 0; $lt < pg_num_rows($results); $lt++) { + ?> + + + + '); + echo(''); + echo(''); + } else { + echo(''); + } + } elseif (pg_field_name($results, $gt) == "a_svde" || pg_field_name($results, $gt) == "p_svde" || pg_field_name($results, $gt) == "a_hosp_hodnota" || pg_field_name($results, $gt) == "p_hosp_hodnota") { + if (pg_fetch_result($results, $lt, "editable_svd") == "0") { + echo(''); + } else { + if (pg_field_name($results, $gt) == "a_hosp_hodnota" || pg_field_name($results, $gt) == "p_hosp_hodnota") { + echo(''); + } + } elseif (pg_field_name($results, $gt) == "a_body" || pg_field_name($results, $gt) == "p_body") { + echo(' + "; + } + ?> +
                      + + + + " /> + + '); + echo(''); + echo(''); + echo(''); + echo(''); + echo(''); + } else { + echo(''); + echo(''); + } + echo(''); + echo(''); + } else { //|| pg_fetch_result($results, $lt, "group") == "lesni_hospodarstvi" || pg_field_name($results, $gt) == "pracovni_mista" || pg_field_name($results, $gt) == "prumysl" || pg_field_name($results, $gt) == "tezba_ner" || pg_field_name($results, $gt) == "zemedelstvi" + if (pg_fetch_result($results, $lt, "group") == "doprava") { + echo(''); + echo(''); + } elseif (pg_fetch_result($results, $lt, "group") == "lesni_hospodarstvi") { + echo(''); + echo(''); + } elseif (pg_fetch_result($results, $lt, "group") == "pracovni_mista") { + echo(''); + echo(''); + } elseif (pg_fetch_result($results, $lt, "group") == "prumysl") { + echo(''); + echo(''); + } elseif (pg_fetch_result($results, $lt, "group") == "tezba_ner") { + echo(''); + echo(''); + } else { + echo(''); + echo(''); + } + } + } + } + + echo ""; + if (pg_fetch_result($results, $lt, "editable_title") == "1") { + ?> + "> + &dbtab=&planId=planId); ?>'}" /> +
                      +

                      Přidat ostatní

                      + +
                      + + +
                      + +

                      View 1

                      + = $high) + return false; + return true; + } + + //konec fce + if ($dbtab1) { + ?> + + + + "; + + + + if (pg_field_name($results, $gt) == "sum_akt") { + echo "aktuální ekonomická hodnota"; + } elseif (pg_field_name($results, $gt) == "sum_pot") { + echo "potenciální ekonomická hodnota"; + } elseif (pg_field_name($results, $gt) == "plneni") { + echo "plnění"; + } elseif (pg_field_name($results, $gt) == "group") { + echo "faktor"; + } else { + echo pg_field_name($results, $gt); + } + + + echo""; + } + echo""; + + echo ""; + + for ($lt = 0; $lt < pg_num_rows($results); $lt++) { + echo ""; + unset($gid); + for ($gt = 0; $gt < pg_num_fields($results); $gt++) { + if (pg_field_name($results, $gt) == "group") { + echo ""; + } else { + + echo ""; + } + } + if (numberBetween(pg_fetch_result($results, $lt, "plneni"), 0, 16)) { + echo ""; + } elseif (numberBetween(pg_fetch_result($results, $lt, "plneni"), 16, 31)) { + echo ""; + } elseif (numberBetween(pg_fetch_result($results, $lt, "plneni"), 31, 46)) { + echo ""; + } elseif (numberBetween(pg_fetch_result($results, $lt, "plneni"), 46, 61)) { + echo ""; + } elseif (numberBetween(pg_fetch_result($results, $lt, "plneni"), 61, 76)) { + echo ""; + } elseif (numberBetween(pg_fetch_result($results, $lt, "plneni"), 76, 91)) { + echo ""; + } elseif (numberBetween(pg_fetch_result($results, $lt, "plneni"), 91, 100)) { + echo ""; + } else { + echo ""; + } + echo ""; + } + echo "
                      plnění slovnětřída
                      " . pg_result($results, $lt, $gt) . "" . round(pg_result($results, $lt, $gt)) . "nedostatečné7nízké6snížené5průměrné4zvýšené3vysoké2maximální1mimo intervalmimo interval
                      "; + } + ?> + + + + + +

                      View 2

                      + + + + + "; + + if (pg_field_name($results, $gt) == "sum") { + echo "ekonomická potenciál"; + } elseif (pg_field_name($results, $gt) == "hyp_max") { + echo "hypotetický potenciál"; + } elseif (pg_field_name($results, $gt) == "interval") { + echo "interval"; + } elseif (pg_field_name($results, $gt) == "group") { + echo "faktor"; + } else { + echo pg_field_name($results, $gt); + } + + echo""; + } + + echo""; + echo ""; + for ($lt = 0; $lt < pg_num_rows($results); $lt++) { + ?> + + " . pg_result($results, $lt, $gt) . ""; + } + + if (numberBetween(pg_fetch_result($results, $lt, "interval"), 0, 16)) { + echo ""; + } elseif (numberBetween(pg_fetch_result($results, $lt, "interval"), 16, 31)) { + echo ""; + } elseif (numberBetween(pg_fetch_result($results, $lt, "interval"), 31, 46)) { + echo ""; + } elseif (numberBetween(pg_fetch_result($results, $lt, "interval"), 46, 61)) { + echo ""; + } elseif (numberBetween(pg_fetch_result($results, $lt, "interval"), 61, 76)) { + echo ""; + } elseif (numberBetween(pg_fetch_result($results, $lt, "interval"), 76, 91)) { + echo ""; + } elseif (numberBetween(pg_fetch_result($results, $lt, "interval"), 91, 100)) { + echo ""; + } else { + echo ""; + } + ?> + + "; + pg_close($pgsql_conn); + } + } + ?> + + \ No newline at end of file diff --git a/page/pg_biotopy/hosp_info.html b/page/pg_biotopy/hosp_info.html new file mode 100644 index 0000000..6bd86f2 --- /dev/null +++ b/page/pg_biotopy/hosp_info.html @@ -0,0 +1,14 @@ + + + + + + + + +
                      TODO write content
                      + + diff --git a/page/pg_biotopy/spol.php b/page/pg_biotopy/spol.php new file mode 100644 index 0000000..3e7fab2 --- /dev/null +++ b/page/pg_biotopy/spol.php @@ -0,0 +1,334 @@ +getPrivilegeForPlan($plan->planId) > 1) + $dbname = 'ligeo_' . $plan->name; + +$dbtab = "bio_spol_hod"; +$dbtab1 = "spol_hod_1"; +$dbtab2 = "spol_hod_2"; + +if ($plan->name) { + + $pgsql_conn = pg_connect("host=" . $GLOBALS["LGSettings"]->postgis_host . " dbname=" . $dbname . " user=" . $GLOBALS["LGSettings"]->postgis_user . " password=" . $GLOBALS["LGSettings"]->postgis_pass . ""); + if (!$pgsql_conn) { + die("Error in connection: " . pg_last_error()); + } + pg_query($pgsql_conn, "SET NAMES 'utf8'"); +} +?> + + + + + Ligeo + + + + + isUser()) { ?> + + + +

                      Společenská hodnota

                      + + + info + getLayerIdByPlanAndLayerName($planId, $dbtab); + $layer = new LGLayer($layerId); + + $table_info = pg_tableInfo($dbtab, $pgsql_conn); + ?> + + + +
                      slovní vyjádřenítřída
                      extrémě nízký7velmi nízký6nízký5průměrný4vysoký3velmi vysoký2mimořádný1mimo intervalmimo interval
                      + + + "; + + if (pg_field_name($results, $gt) == "group") { + echo "skupina"; + } elseif (pg_field_name($results, $gt) == "title") { + echo "ekonomický faktor"; + } elseif (pg_field_name($results, $gt) == "a_body") { + echo "body (dnes)"; + } elseif (pg_field_name($results, $gt) == "a_svds") { + echo "SVDs"; + } elseif (pg_field_name($results, $gt) == "a_spol_hod") { + echo "aktuální společenská hodnota"; + } elseif (pg_field_name($results, $gt) == "p_body") { + echo "body (potenciální)"; + } elseif (pg_field_name($results, $gt) == "p_svds") { + echo "SVDs"; + } elseif (pg_field_name($results, $gt) == "p_spol_hod") { + echo "společenský potenciál"; + } else { + echo pg_field_name($results, $gt); + } + + + echo""; + } + } + } + echo ""; + for ($lt = 0; $lt < pg_num_rows($results); $lt++) { + ?> + + + + '); + echo(''); + echo(''); + } else { + echo(''); + } + } elseif (pg_field_name($results, $gt) == "a_svds" || pg_field_name($results, $gt) == "p_svds" || pg_field_name($results, $gt) == "a_spol_hod" || pg_field_name($results, $gt) == "p_spol_hod") { + if (pg_fetch_result($results, $lt, "editable_svd") == "0") { + echo(''); + } else { + if (pg_field_name($results, $gt) == "a_spol_hod" || pg_field_name($results, $gt) == "p_spol_hod") { + echo(''); + } + } elseif (pg_field_name($results, $gt) == "a_body" || pg_field_name($results, $gt) == "p_body") { + echo(' + "; + } + ?> +
                      + + + + " /> + + '); + echo(''); + echo(''); + echo(''); + echo(''); + echo(''); + } else { + echo(''); + echo(''); + } + echo(''); + echo(''); + } else { //|| pg_fetch_result($results, $lt, "group") == "lesni_hospodarstvi" || pg_field_name($results, $gt) == "pracovni_mista" || pg_field_name($results, $gt) == "prumysl" || pg_field_name($results, $gt) == "tezba_ner" || pg_field_name($results, $gt) == "zemedelstvi" + if (pg_fetch_result($results, $lt, "group") == "sidelni") { + echo(''); + echo(''); + } elseif (pg_fetch_result($results, $lt, "group") == "rekreacni") { + echo(''); + echo(''); + } elseif (pg_fetch_result($results, $lt, "group") == "kulturni") { + echo(''); + echo(''); + } else { + echo(''); + echo(''); + } + } + } + } + + echo ""; + if (pg_fetch_result($results, $lt, "editable_title") == "1") { + ?> + "> + &dbtab=&planId=planId); ?>'}" /> +
                      +

                      Přidat ostatní

                      + +
                      + + +
                      + +

                      View 1

                      + = $high) + return false; + return true; + } + + //konec fce + if ($dbtab1) { + ?> + + + + "; + + + + if (pg_field_name($results, $gt) == "sum_akt") { + echo "aktuální společenská hodnota"; + } elseif (pg_field_name($results, $gt) == "sum_pot") { + echo "potenciální společenská hodnota"; + } elseif (pg_field_name($results, $gt) == "plneni") { + echo "plnění"; + } elseif (pg_field_name($results, $gt) == "group") { + echo "faktor"; + } else { + echo pg_field_name($results, $gt); + } + + + echo""; + } + echo""; + + echo ""; + + for ($lt = 0; $lt < pg_num_rows($results); $lt++) { + echo ""; + unset($gid); + for ($gt = 0; $gt < pg_num_fields($results); $gt++) { + if (pg_field_name($results, $gt) == "group") { + echo ""; + } else { + + echo ""; + } + } + if (numberBetween(pg_fetch_result($results, $lt, "plneni"), 0, 16)) { + echo ""; + } elseif (numberBetween(pg_fetch_result($results, $lt, "plneni"), 16, 31)) { + echo ""; + } elseif (numberBetween(pg_fetch_result($results, $lt, "plneni"), 31, 46)) { + echo ""; + } elseif (numberBetween(pg_fetch_result($results, $lt, "plneni"), 46, 61)) { + echo ""; + } elseif (numberBetween(pg_fetch_result($results, $lt, "plneni"), 61, 76)) { + echo ""; + } elseif (numberBetween(pg_fetch_result($results, $lt, "plneni"), 76, 91)) { + echo ""; + } elseif (numberBetween(pg_fetch_result($results, $lt, "plneni"), 91, 100)) { + echo ""; + } else { + echo ""; + } + echo ""; + } + echo "
                      plnění slovnětřída
                      " . pg_result($results, $lt, $gt) . "" . round(pg_result($results, $lt, $gt)) . "nedostatečné7nízké6snížené5průměrné4zvýšené3vysoké2maximální1mimo intervalmimo interval
                      "; + } + ?> + + + + + +

                      View 2

                      + + + + + "; + + if (pg_field_name($results, $gt) == "sum") { + echo "společenský potenciál"; + } elseif (pg_field_name($results, $gt) == "hyp_max") { + echo "hypotetický potenciál"; + } elseif (pg_field_name($results, $gt) == "interval") { + echo "interval"; + } elseif (pg_field_name($results, $gt) == "group") { + echo "faktor"; + } else { + echo pg_field_name($results, $gt); + } + + echo""; + } + + echo""; + echo ""; + for ($lt = 0; $lt < pg_num_rows($results); $lt++) { + ?> + + " . pg_result($results, $lt, $gt) . ""; + } + + if (numberBetween(pg_fetch_result($results, $lt, "interval"), 0, 16)) { + echo ""; + } elseif (numberBetween(pg_fetch_result($results, $lt, "interval"), 16, 31)) { + echo ""; + } elseif (numberBetween(pg_fetch_result($results, $lt, "interval"), 31, 46)) { + echo ""; + } elseif (numberBetween(pg_fetch_result($results, $lt, "interval"), 46, 61)) { + echo ""; + } elseif (numberBetween(pg_fetch_result($results, $lt, "interval"), 61, 76)) { + echo ""; + } elseif (numberBetween(pg_fetch_result($results, $lt, "interval"), 76, 91)) { + echo ""; + } elseif (numberBetween(pg_fetch_result($results, $lt, "interval"), 91, 100)) { + echo ""; + } else { + echo ""; + } + ?> + + "; + pg_close($pgsql_conn); + } + } + ?> + + \ No newline at end of file diff --git a/page/pg_edit/index.php b/page/pg_edit/index.php new file mode 100644 index 0000000..11e722f --- /dev/null +++ b/page/pg_edit/index.php @@ -0,0 +1,197 @@ +getPrivilegeForPlan($plan->planId) > 1) + $dbname = 'ligeo_' . $plan->name; +$dbtab = $_GET["dbtab"]; + +if ($plan->name) { + + $pgsql_conn = pg_connect("host=" . $GLOBALS["LGSettings"]->postgis_host . " dbname=" . $dbname . " user=" . $GLOBALS["LGSettings"]->postgis_user . " password=" . $GLOBALS["LGSettings"]->postgis_pass . ""); + if (!$pgsql_conn) { + die("Error in connection: " . pg_last_error()); + } +} +?> + + + + + Mapito + + + + + isUser()) { ?> +
                      + +
                      + + + +
                      + + + + +

                      title); ?>

                      + + +
                      + +
                      + + + + +
                      + + + getLayerIdByPlanAndLayerName($planId, $dbtab); + $layer = new LGLayer($layerId); + if ($layer->isLocked) { + ?> + Vrstva uzamčena + +
                      +
                      + + + + + + + + +
                      + +

                      + + +
                      slovní vyjádřenítřída
                      extrémě nízký7velmi nízký6nízký5průměrný4vysoký3velmi vysoký2mimořádný1mimo intervalmimo interval
                      + + + " . pg_field_name($results, $gt) . " (" . pg_field_type($results, $gt) . " [" . $table_info[pg_field_name($results, $gt)]["len"] . "])"; + if (pg_field_name($results, $gt) != "gid") { + ?> + + + + + + del + + "; + } + } + echo ""; + + + for ($lt = 0; $lt < pg_num_rows($results); $lt++) { + ?> + + + + + + '); + if (pg_field_name($results, $gt) == "gid") { + $gid = pg_result($results, $lt, $gt); + echo (''); + echo (pg_result($results, $lt, $gt)); + } elseif ($table_info[pg_field_name($results, $gt)]["type"] == "varchar" && $table_info[pg_field_name($results, $gt)]["len"] == 212) { + + echo(''); + if (pg_result($results, $lt, $gt)) + echo('odkaz'); + + echo('
                      '); + } else { + echo(''); + } + ?> + + + + + + + "; + + + pg_close($pgsql_conn); + } + } + } + } + ?> + + \ No newline at end of file diff --git a/page/plan_edit/index.php b/page/plan_edit/index.php new file mode 100644 index 0000000..d1795d7 --- /dev/null +++ b/page/plan_edit/index.php @@ -0,0 +1,119 @@ + +
                      +

                      New plan

                      + +
                      +
                      + + +
                      +
                      + + +
                      +
                      + + +
                      +
                      + + +
                      +
                      + + +
                      +
                      + + +
                      +
                      + + +
                      +
                      + + +
                      + + +
                      + + +
                      +

                      Plány

                      +
                      + getPlans() as $planId) { + $plan = new LGPlan($planId); + ?> + +
                      +

                      title); ?>

                      + +
                      + +
                      + To map +
                      + +
                      + + +
                      +
                      + + +
                      +
                      + + +
                      +
                      + + +
                      + +
                      + + +
                      +
                      + + +
                      +
                      + + +
                      +
                      + + +
                      + isSplashScreen()) { ?> +
                      + + +
                      + + + + + + + +
                      + +
                      +
                      \ No newline at end of file diff --git a/page/plan_edit/plan_edit_centerMap/map.php b/page/plan_edit/plan_edit_centerMap/map.php new file mode 100644 index 0000000..77da497 --- /dev/null +++ b/page/plan_edit/plan_edit_centerMap/map.php @@ -0,0 +1,109 @@ + + + + + + + Map settings + + + + + + + + + + +
                      +
                      + +
                      + + + \ No newline at end of file diff --git a/page/user_account/index.php b/page/user_account/index.php new file mode 100644 index 0000000..03bf546 --- /dev/null +++ b/page/user_account/index.php @@ -0,0 +1,22 @@ + + + + + +
                      + + +
                      + +
                      + + +
                      + +
                      + + +
                      + + + diff --git a/page/users_edit/index.php b/page/users_edit/index.php new file mode 100644 index 0000000..4a2517d --- /dev/null +++ b/page/users_edit/index.php @@ -0,0 +1,91 @@ + +
                      +
                      + +

                      New user

                      +
                      +
                      + + + +
                      +
                      + + +
                      +
                      + + +
                      + + + +
                      + + getUsers() as $systemUserId) { + $systemUser = new LGSystemUser($systemUserId); + ?> + +
                      +

                      title); ?>

                      + +
                      + +
                      + + +
                      +
                      + + +
                      +
                      + + +
                      +
                      + + +
                      + + getPlans() as $planId) { + $plan = new LGPlan($planId); + $privilege = new LGPlanPrivilege($systemUser->userId, $planId); + ?> +
                      + + + + +
                      +
                      + + + + +
                      +
                      + + +
                      + + + + + + + +
                      + +
                      \ No newline at end of file diff --git a/proxy.php b/proxy.php new file mode 100644 index 0000000..83840be --- /dev/null +++ b/proxy.php @@ -0,0 +1,171 @@ +set_path($path); + $result = $posting->send_request(); +} + +// strip leading text from result and output result +$len=strlen($result); +$pos = strpos($result, "<"); +if($pos > 1) { + $result = substr($result, $pos, $len); +} +//$result = str_replace("xlink:","",$result); +echo $result; + +// define class with functions to open socket and post XML +// from http://www.phpbuilder.com/annotate/message.php3?id=1013274 by Richard Hundt + +class HTTP_Client { + var $host; + var $path; + var $port; + var $data; + var $socket; + var $errno; + var $errstr; + var $timeout; + var $buf; + var $result; + var $agent_name = "MyAgent"; + //Constructor, timeout 30s + function HTTP_Client($host, $port, $data, $timeout = 30) { + $this->host = $host; + $this->port = $port; + $this->data = $data; + $this->timeout = $timeout; + } + + //Opens a connection + function connect() { + $this->socket = fsockopen($this->host, + $this->port, + $this->errno, + $this->errstr, + $this->timeout + ); + if(!$this->socket) + return false; + else + return true; + } + + //Set the path + function set_path($path) { + $this->path = $path; + } + + //Send request and clean up + function send_request() { + if(!$this->connect()) { + return false; + } + else { + $this->result = $this->request($this->data); + return $this->result; + } + } + + function request($data) { + $this->buf = ""; + fwrite($this->socket, + "POST $this->path HTTP/1.0\r\n". + "Host:$this->host\r\n". + "User-Agent: $this->agent_name\r\n". + "Content-Type: text/xml\r\n". + "Content-Length: ".strlen($data). + "\r\n". + "\r\n".$data. + "\r\n" + ); + + while(!feof($this->socket)) + $this->buf .= fgets($this->socket, 2048); + $this->close(); + return $this->buf; + } + + + function close() { + fclose($this->socket); + } +} + + + +function send_request() { + global $onlineresource; + $ch = curl_init(); + $timeout = 5; // set to zero for no timeout + + // fix to allow HTTPS connections with incorrect certificates + curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); + curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2); + + curl_setopt ($ch, CURLOPT_URL,$onlineresource); + curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1); + curl_setopt ($ch, CURLOPT_CONNECTTIMEOUT, $timeout); + curl_setopt ($ch, CURLOPT_ENCODING , "gzip, deflate"); + + $file_contents = curl_exec($ch); + curl_close($ch); + $lines = array(); + $lines = explode("\n", $file_contents); + if(!($response = $lines)) { + echo "Unable to retrieve file '$service_request'"; + } + $response = implode("",$response); + return $response; +} +?> \ No newline at end of file diff --git a/proxyPrint.php b/proxyPrint.php new file mode 100644 index 0000000..7f33b0f --- /dev/null +++ b/proxyPrint.php @@ -0,0 +1,50 @@ + \ No newline at end of file diff --git a/settings/module.php b/settings/module.php new file mode 100644 index 0000000..9d92633 --- /dev/null +++ b/settings/module.php @@ -0,0 +1,10 @@ + diff --git a/style/main.css b/style/main.css new file mode 100644 index 0000000..9709f76 --- /dev/null +++ b/style/main.css @@ -0,0 +1,609 @@ +/* jqm docs css + +Beware: lots of last-minute CSS going on in here +cobblers, shoes, +*/ + +body { background: #dddddd; } +.ui-mobile .type-home .ui-content { margin: 0; background: #e5e5e5 url(../images/jqm-sitebg.png) top center repeat-x; } +.ui-mobile #jqm-homeheader { padding: 40px 10px 0; text-align: center; margin: 0 auto; } +.ui-mobile #jqm-homeheader h1 { margin: 0 0 ; } +.ui-mobile #jqm-homeheader p { margin: .3em 0 0; line-height: 1.3; font-size: .9em; font-weight: bold; color: #666; } +.ui-mobile #jqm-version { text-indent: -99999px; background: url(../images/version.png) top right no-repeat; width: 119px; height: 122px; overflow: hidden; position: absolute; z-index: 50; top: -11px; right: 0; } +.ui-mobile .jqm-themeswitcher { margin: 10px 25px 10px 10px; } + +h2 { margin:1.2em 0 .4em 0; } +p code { font-size:1.2em; font-weight:bold; } + +dt { font-weight: bold; margin: 2em 0 .5em; } +dt code, dd code { font-size:1.3em; line-height:150%; } +pre { white-space: pre; white-space: pre-wrap; word-wrap: break-word; } + +#jqm-homeheader img { width: 235px; } +img { max-width: 100%; } + +.ui-header .jqm-home { top:0.65em; } +nav { margin: 0; } + +p.intro { + font-size: .96em; + line-height: 1.3; + border-top: 1px solid #75ae18; + border-bottom: 0; + background: none; + margin: 1.5em 0; + padding: 1.5em 15px 0; + +} +p.intro strong { + color: #558e08; +} +.footer-docs { + padding: 5px 0; +} +.footer-docs p { + float: left; + margin-left:15px; + font-weight: normal; + font-size: .9em; +} + +.type-interior .content-secondary { + border-right: 0; + border-left: 0; + margin: 10px -15px 0; + background: #fff; + border-top: 1px solid #ccc; +} +.type-home .ui-content { + margin-top: 5px; +} +.type-interior .ui-content { + padding-bottom: 0; +} +.content-secondary .ui-collapsible { + padding: 0 15px 10px; + +} +.content-secondary .ui-collapsible-content { + padding: 0; + background: none; + border-bottom: none; +} +.content-secondary .ui-listview { + margin: 0; +} +/* new API additions */ + +dt { + margin: 35px 0 15px 0; + background-color:#ddd; + font-weight:normal; +} +dt code { + display:inline-block; + font-weight:bold; + color:#56A00E; + padding:3px 7px; + margin-right:10px; + background-color:#fff; +} +dd { + margin-bottom:10px; +} +dd .default { font-weight:bold; } +dd pre { + margin:0 0 0 0; +} +dd code { font-weight: normal; } +dd pre code { + margin:0; + border:none; + font-weight:normal; + font-size:100%; + background-color:transparent; +} +dd h4 { margin:15px 0 0 0; } + +.localnav { + margin:0 0 20px 0; + overflow:hidden; +} +.localnav li { + float:left; +} +.localnav .ui-btn-inner { + padding: .6em 10px; + font-size:80%; +} + + +/* F bar theme - just for the docs overview headers */ +.ui-bar-f { + border: 1px solid #56A00E; + background: #74b042; + color: #fff; + font-weight: bold; + text-shadow: 0 -1px 1px #234403; + background-image: -webkit-gradient(linear, left top, left bottom, from(#74b042), to(#56A00E)); /* Saf4+, Chrome */ + background-image: -webkit-linear-gradient(top, #74b042, #56A00E); /* Chrome 10+, Saf5.1+ */ + background-image: -moz-linear-gradient(top, #74b042, #56A00E); /* FF3.6 */ + background-image: -ms-linear-gradient(top, #74b042, #56A00E); /* IE10 */ + background-image: -o-linear-gradient(top, #74b042, #56A00E); /* Opera 11.10+ */ + background-image: linear-gradient(top, #74b042, #56A00E); +} +.ui-bar-f, +.ui-bar-f .ui-link-inherit { + color: #fff; +} +.ui-bar-f .ui-link { + color: #fff; + font-weight: bold; +} + + + + +/* docs site layout */ + +@media all and (min-width: 650px){ + + .jqm-home { + position: absolute; + left: 10px; + top: 0; + } + .type-home .ui-content { + margin-top: 5px; + } + .ui-mobile #jqm-homeheader { + max-width: 340px; + } + .ui-mobile .jqm-themeswitcher { + float: right; + } + p.intro { + margin: 2em 0; + } + .type-home .ui-content, + .type-interior .ui-content { + padding: 0; + background: url(../images/px-ccc.gif) 50% 0 repeat-y; + } + .type-interior .ui-content { + background-position: 45%; + overflow: hidden; + } + .content-secondary { + text-align: left; + float: left; + width: 45%; + background: none; + } + .content-secondary, + .type-interior .content-secondary { + margin: 30px 0 20px 2%; + padding: 20px 4% 0 0; + background: none; + border-top: none; + } + .type-index .content-secondary { + padding: 0; + } + .content-secondary .ui-collapsible { + margin: 0; + padding: 0; + } + .content-secondary .ui-collapsible-content { + border: none; + } + .type-index .content-secondary .ui-listview { + margin: 0; + } + + .ui-mobile #jqm-homeheader { + padding: 0; + } + .content-primary { + width: 45%; + float: right; + margin-top: 30px; + margin-right: 1%; + padding-right: 1%; + } + .content-primary ul:first-child { + margin-top: 0; + } + .content-secondary h2 { + position: absolute; + left: -9999px; + } + .type-interior .content-primary { + padding: 1.5em 6% 3em 0; + margin: 0; + } + /* fix up the collapsibles - expanded on desktop */ + .content-secondary .ui-collapsible-heading { + display: none; + } + .content-secondary .ui-collapsible-contain { + margin:0; + } + .content-secondary .ui-collapsible-content { + display: block; + margin: 0; + padding: 0; + } + .type-interior .content-secondary .ui-li-divider { + padding-top: 1em; + padding-bottom: 1em; + } + .type-interior .content-secondary { + margin: 0; + padding: 0; + } + +} +@media all and (min-width: 750px){ + .type-home .ui-content, + .type-interior .ui-content { + background-position: 39%; + } + .content-secondary { + width: 34%; + } + .content-primary { + width: 56%; + padding-right: 1%; + } + .type-interior .ui-content { + background-position: 34%; + } +} + +@media all and (min-width: 1200px){ + .type-home .ui-content{ + background-position: 38.5%; + } + .type-interior .ui-content { + background-position: 30%; + } + .content-secondary { + width: 30%; + padding-right:6%; + margin: 30px 0 20px 5%; + } + .type-interior .content-secondary { + margin: 0; + padding: 0; + } + .content-primary { + width: 50%; + margin-right: 5%; + padding-right: 3%; + } + .type-interior .content-primary { + width: 60%; + } +} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +/* jqm docs css + +Beware: lots of last-minute CSS going on in here +cobblers, shoes, +*/ + +body { background: #dddddd; } +.ui-mobile .type-home .ui-content { margin: 0; background: #e5e5e5 url(../images/jqm-sitebg.png) top center repeat-x; } +.ui-mobile #jqm-homeheader { padding: 40px 10px 0; text-align: center; margin: 0 auto; } +.ui-mobile #jqm-homeheader h1 { margin: 0 0 ; } +.ui-mobile #jqm-homeheader p { margin: .3em 0 0; line-height: 1.3; font-size: .9em; font-weight: bold; color: #666; } +.ui-mobile #jqm-version { text-indent: -99999px; background: url(../images/version.png) top right no-repeat; width: 119px; height: 122px; overflow: hidden; position: absolute; z-index: 50; top: -11px; right: 0; } +.ui-mobile .jqm-themeswitcher { margin: 10px 25px 10px 10px; } + +h2 { margin:1.2em 0 .4em 0; } +p code { font-size:1.2em; font-weight:bold; } + +dt { font-weight: bold; margin: 2em 0 .5em; } +dt code, dd code { font-size:1.3em; line-height:150%; } +pre { white-space: pre; white-space: pre-wrap; word-wrap: break-word; } + +#jqm-homeheader img { width: 235px; } +img { max-width: 100%; } + +.ui-header .jqm-home { top:0.65em; } +nav { margin: 0; } + +p.intro { + font-size: .96em; + line-height: 1.3; + border-top: 1px solid #75ae18; + border-bottom: 0; + background: none; + margin: 1.5em 0; + padding: 1.5em 15px 0; + +} +p.intro strong { + color: #558e08; +} +.footer-docs { + padding: 5px 0; +} +.footer-docs p { + float: left; + margin-left:15px; + font-weight: normal; + font-size: .9em; +} + +.type-interior .content-secondary { + border-right: 0; + border-left: 0; + margin: 10px -15px 0; + background: #fff; + border-top: 1px solid #ccc; +} +.type-home .ui-content { + margin-top: 5px; +} +.type-interior .ui-content { + padding-bottom: 0; +} +.content-secondary .ui-collapsible { + padding: 0 15px 10px; + +} +.content-secondary .ui-collapsible-content { + padding: 0; + background: none; + border-bottom: none; +} +.content-secondary .ui-listview { + margin: 0; +} +/* new API additions */ + +dt { + margin: 35px 0 15px 0; + background-color:#ddd; + font-weight:normal; +} +dt code { + display:inline-block; + font-weight:bold; + color:#56A00E; + padding:3px 7px; + margin-right:10px; + background-color:#fff; +} +dd { + margin-bottom:10px; +} +dd .default { font-weight:bold; } +dd pre { + margin:0 0 0 0; +} +dd code { font-weight: normal; } +dd pre code { + margin:0; + border:none; + font-weight:normal; + font-size:100%; + background-color:transparent; +} +dd h4 { margin:15px 0 0 0; } + +.localnav { + margin:0 0 20px 0; + overflow:hidden; +} +.localnav li { + float:left; +} +.localnav .ui-btn-inner { + padding: .6em 10px; + font-size:80%; +} + + +/* F bar theme - just for the docs overview headers */ +.ui-bar-f { + border: 1px solid #56A00E; + background: #74b042; + color: #fff; + font-weight: bold; + text-shadow: 0 -1px 1px #234403; + background-image: -webkit-gradient(linear, left top, left bottom, from(#74b042), to(#56A00E)); /* Saf4+, Chrome */ + background-image: -webkit-linear-gradient(top, #74b042, #56A00E); /* Chrome 10+, Saf5.1+ */ + background-image: -moz-linear-gradient(top, #74b042, #56A00E); /* FF3.6 */ + background-image: -ms-linear-gradient(top, #74b042, #56A00E); /* IE10 */ + background-image: -o-linear-gradient(top, #74b042, #56A00E); /* Opera 11.10+ */ + background-image: linear-gradient(top, #74b042, #56A00E); +} +.ui-bar-f, +.ui-bar-f .ui-link-inherit { + color: #fff; +} +.ui-bar-f .ui-link { + color: #fff; + font-weight: bold; +} + + + + +/* docs site layout */ + +@media all and (min-width: 650px){ + + .jqm-home { + position: absolute; + left: 10px; + top: 0; + } + .type-home .ui-content { + margin-top: 5px; + } + .ui-mobile #jqm-homeheader { + max-width: 340px; + } + .ui-mobile .jqm-themeswitcher { + float: right; + } + p.intro { + margin: 2em 0; + } + .type-home .ui-content, + .type-interior .ui-content { + padding: 0; + background: url(../images/px-ccc.gif) 50% 0 repeat-y; + } + .type-interior .ui-content { + background-position: 45%; + overflow: hidden; + } + .content-secondary { + text-align: left; + float: left; + width: 45%; + background: none; + } + .content-secondary, + .type-interior .content-secondary { + margin: 30px 0 20px 2%; + padding: 20px 4% 0 0; + background: none; + border-top: none; + } + .type-index .content-secondary { + padding: 0; + } + .content-secondary .ui-collapsible { + margin: 0; + padding: 0; + } + .content-secondary .ui-collapsible-content { + border: none; + } + .type-index .content-secondary .ui-listview { + margin: 0; + } + + .ui-mobile #jqm-homeheader { + padding: 0; + } + .content-primary { + width: 45%; + float: right; + margin-top: 30px; + margin-right: 1%; + padding-right: 1%; + } + .content-primary ul:first-child { + margin-top: 0; + } + .content-secondary h2 { + position: absolute; + left: -9999px; + } + .type-interior .content-primary { + padding: 1.5em 6% 3em 0; + margin: 0; + } + /* fix up the collapsibles - expanded on desktop */ + .content-secondary .ui-collapsible-heading { + display: none; + } + .content-secondary .ui-collapsible-contain { + margin:0; + } + .content-secondary .ui-collapsible-content { + display: block; + margin: 0; + padding: 0; + } + .type-interior .content-secondary .ui-li-divider { + padding-top: 1em; + padding-bottom: 1em; + } + .type-interior .content-secondary { + margin: 0; + padding: 0; + } + +} +@media all and (min-width: 750px){ + .type-home .ui-content, + .type-interior .ui-content { + background-position: 39%; + } + .content-secondary { + width: 34%; + } + .content-primary { + width: 56%; + padding-right: 1%; + } + .type-interior .ui-content { + background-position: 34%; + } +} + +@media all and (min-width: 1200px){ + .type-home .ui-content{ + background-position: 38.5%; + } + .type-interior .ui-content { + background-position: 30%; + } + .content-secondary { + width: 30%; + padding-right:6%; + margin: 30px 0 20px 5%; + } + .type-interior .content-secondary { + margin: 0; + padding: 0; + } + .content-primary { + width: 50%; + margin-right: 5%; + padding-right: 3%; + } + .type-interior .content-primary { + width: 60%; + } +} \ No newline at end of file
                      + + + + + + + + style="background-color: yellow" > + +
  • =Vd!#C`CQ&XpK0^K`%K_8a6`%Kh9q!=U^f$_%J8n2`jQ z$unz(gh>MGhwz5v12uvpF z-FM$jj*X2Sz*sly%@rouBSwrEfbw;gZ5u>JMuuBiXQ1d)7GuYbeIP3OPq%H<)@C5h=A;7ZG%*@PgC#0~j@RAPtdX>$~ii(PQ0Og||Nl8gX z{zilw0Q~>-u2WZ!cJboHF%u_F>>hU~O`4Q|g-c!-o|`TxC|D}|j(UJT-+b`F2mkXY zA~ZEMwT1!ou2VO&j8VetufIOiPK}28Fh(zq!MSti>a46&kqBG2ZhdsfkRgNZ)M%&= z>gA9=W=f2G^wCGBI{|tL#k#OgRvi_IuwcQ0WIML5UGyzv9YmPFQHf$ z*2$`)A`$ZQ^N-lEb?vH`l+VU`AkH>&v8UF(Ug2C_%sMI(Vb!Wt$1h&Ic-c-Zi~68m z4j}@w!-iANT3cJM`799XP&s|ARgnlC9UWa8H*VZ-rS78Ulrfrx=(kYpw2wqlwef@Qmk9s&MEaVoh zxT@wHoN9(s&eT{2JXXUrHN;iaktc#;On&0TiR%Rg1&0l2E9QIv%11pMm?lu|1Y(Eo z-MjZFjQ6by=XT*Sc&r8zbaA@f$s^okv=rBye%7m#B6E z(ZmlNIB?tNpMPF?`SRr}!aM_R<8QbRk5M@s@VLgWtiq?5v2#O}&T4CGySaY-`jd=8 zSg%|r*{{9!+8Gu9pdGCS`U=S|4G+0+5x_y5Xu{7iz+{n%Jb@H$aXPt#L_kL{hUIJ( z-ufxVy>M9_o}GA=f5Wjv4^w{>3TvEirEIf- zSN5+q(BoH^Xg*^QumbNQ-tu@nxW-Pq>+YnE4h^LdN;#BD)(NC3DJho8HXHE2HpBml zx0>;xmmrJOz_zM_Hac;S$4*Z=Su#xUE2fyeSOz+qC#9Cpq30T`Awn@XBzBl=2~K)l zLy2G+8IG9bGoXwkawNECXn=!|6n};?lndtqTn5QT+>bF{AH!Jvb8 zdp~U0gD9Wk4P%L*=%LS;F(Y#F?Q!Jf6?&sJLDA@>?P-Sg_!WmX?+pJ1LF&pkCB{CK3VD z$=kMV+i54IQ6I)MH$l(v5ks|w3m2AS=yvYhxw7}(dvBjv3a(kRW;K3hXJ@C588c>9 zb#-+)g^tD%LGiX{PEO8;d-m*^*xK6KtaBpCt88A@tXZ=XIy*aWpdQq1#tjXMX11iH zr0MYC!vzNDz-;1CKI%c;W*iZirb}gJW`2gx*D==pJL7Rovd^DCe+lL5ESn%28t`7W z;`)hr3mC>~)<>&;VLXmW_L3z_DpdSmzfjj|vk2I5wJwG`fehX{?yuqMW9>91*^I-C z8rcL6`~xms9*^e=XHxk^8ap))cTs_T1|pxnfWL8GdH z)YL3{-2^N^;{{8!hZ`iP5UTtmd3v=hr9Zb#FONqcE zCMG7jsHo^4<>loW@$vDY)Qr892t1}tnKJhH@#8t@Kd5+JFTvl4fM{-RZmp`Sx`YdM zQ*$~Onmz9uH*Wk6mY{saiWOBvf?i4lkH>TT`RAW6gDB!RYQkPfgzD<*+I8#Jm3;c? zr7T3T9n?ATHE>Z`AQM@{D6M38;#?BkC=uHLwD<4JG|I}Oso>mzRq7cTtJ z?REz=G&FQbeJAKk1X*XVva+(pU>&?Vn&M%Ih9zUe$Eya^t>&FhR>>xah+xFnujZXj zR>>xah(PajA|Ig}IKL0y|J>lZJ#Fj(jrCpQI^mRy@qLaK%O>z1JI-Pz5NLJ~p&S1f ZU;uc#vp>^SEa3nE002ovPDHLkV1iA65^4Yd literal 0 HcmV?d00001 diff --git a/module/viewer/img/prettyPhoto/light_rounded/btnNext.png b/module/viewer/img/prettyPhoto/light_rounded/btnNext.png new file mode 100644 index 0000000000000000000000000000000000000000..b28c1ef3d595d5af9db1f2a4378cfd64407ed5c0 GIT binary patch literal 1411 zcmV-}1$_F6P)$9a05|MJUF0->4SGK<7F5TJ=lWKN6+&IhzfIXTxP_BAUYSlC~k)ya96~A ztE!1Fs3@{uSCwU7suGg-Dqm*4{6%~bnXhbax0`G>8;y^TlaJ!y=Z$>*$bCxrnvF(o z`x+M)R}d8y<%*4sb=vKA7v=~-N$_0n-ZRLqHxCaF-bMz>;maqN%k>M_92kbLQc)rz zB8pyLU&UAqOwrNN6cZCek&%%UV)*w#qa-FKlGEv|W5{3m+Nvr57=wC&(2ff5mzNh( z17JKGEL7k>2JHbJV~7v<&GHpkvnUX*@G!g&=-b;{j2C0X$H#{?xZRXAJPcs=9iF5m z$;ezRVzj2FM&MRfRz${TF_i##NF31cG^#Z`@cilNNv;SVRNO-;YUtmzPp;pO=?M$H&KXa&kgtWo0s6lPBgmI5?pE{Cs(iF?a`l;~DyD zeo-f&{o>+6-iK$tg6sHliqT3V>L zx0mkj?xbHsLxUI=K#h%!R99C=xw*MwjGUYtIy^k2!oou8>FJR^X=!QH*48EpNJ&YN zz7-V})Y{rg#l^)k2J7^-2D?WJrFf_^uu26000%G@R$X09v$M0`^;N^cP^fA+Q(jhM zR905f>guZ8WBY@$Q1eGn3BF&S-6IO?Hdx z>uV}0DWR^eF6oE&U>w5J%A>2v)`ghfQje?W0Dg6KC9&Gv+$?R{&z#uwe4u1DKR++| z0`pl5JPg3TzCNn2uNR5JkaKf$B7Z_1&}6(^FbrUZ(Z+b=uwC z6(A&3NPBN@PmI#h(ILt+GyQw^>CHgU3XH4^;Dv>Sz>|8Qt(jZ55^YOLN}|opO-W|v z)`SB2*4EZaaw;z`7Z10$w~KTUvj`0&EQiD4JrpU!n-28IYLy5594xT8W%)a>_yR`3 z4uAv%?*STd2moYs%#XI6ogI-V+As$Uv9+}&&z6>!Bm^*iV`GB~3JU1x=tz`+@o0Yw z+J^WV9UU#@iT~smWm{7`EZfx7BohS#jDGsnrH2m_UXQDI4>Bu&@Eaf)XZ|(~k9jZ_ z_ZWxq`emr|Xzc63$X|%rJll+IY;0_V?|(O6W`YCeEnxjf(UTDFL-@J*W=y-;YJV`; zte&CGf|v^iSUrL(V1rF)A^YGM9v(j6)c=JS`mZnWV1WUv&|&|TH8L{d9vmF}hxfbR z82m3^-_rhKSS4+OhpU&ZpOyf34Gj(b&6|EdCyLJu@m1w&8bCiKt?{ei;p}BIk$v;W z;K0BD2qXDg#@j>#gM45R2lxBQbC~&$0rR=di9ZMN#~@dC2t52le+>RFzyR~BA^19M RLBjw5002ovPDHLkV1n=}nO*<@ literal 0 HcmV?d00001 diff --git a/module/viewer/img/prettyPhoto/light_rounded/btnPrevious.png b/module/viewer/img/prettyPhoto/light_rounded/btnPrevious.png new file mode 100644 index 0000000000000000000000000000000000000000..e0cd9c49af7fe2f6ab694843bdd3b90ce9217cb3 GIT binary patch literal 1442 zcmV;T1zq}yP)DPR}?-yIFE=Eh>D`1 zxDZ4LPAETaM%Rg1tJM?Bq#w*j8W7$G%8Lw&qL>a zCw-c0=k{xpz@y)ROWmrvb?SWQJHxHA4-E}n(SMgP*YTP@kUTy+|!o71v*0Uj9&rU)Awvb?t|yrluuz?lkGJ^!4>Q=_3#Yh7?%3ySpO=mYhx}U&DY{ ztyUfuiv?p_UHazs_V(+RmX<#~!COX0NBtf&z+PNj(ACuyg9R|V-7WxmjW|KE>|Uds z@STc?cg@YsKf-UK&-yU{K0Q69%gakX4+sdLz`#JA)xX(ON1M&Y_pk=Ql>x3!!mdfe z!^0^!IG908e&ZRJBWj|fqrXs78-l{_=_v@jjIfe|ffq^G2m?4m^pL_e6dJiF1qN%N zN7iBv{W#*>#30@cz{pcPr!(of7J!S2ium5d#02Y>wRk`5Q93?XY=7I{-o9Wrc}-P4 zijR+f<+;7RJ8Nysxo|~Jaii!%Fot>rm`FYk+ zS69dHT3lRYgFQtzUOxh`I6)W|z%w&5?&_^S2ghNqocjra(~1+%0Vc$oy}iBE*4D=J zf`S5W8<5G#N$Tn8;ro!p#6)%$WMgB4Iy*brNyEd#%-Ht!Hs$8#((&;zr$TIOEG;Z7 z@LUWu*&qh%L!_jnsm&{8?^!)!Wk?@MMb%{ePRf%0|=@*@(HY=il?Tga{EH4qxvIv(ca)R=-l7m z=dj0mge~-X6I1W@6l_i33LLtW&2z{I<5w2)1HBr?f(#o-m~a)XCyiluc>E>604H)GzA+XomH+?%07*qoM6N<$f}$awVgLXD literal 0 HcmV?d00001 diff --git a/module/viewer/img/prettyPhoto/light_rounded/default_thumbnail.gif b/module/viewer/img/prettyPhoto/light_rounded/default_thumbnail.gif new file mode 100644 index 0000000000000000000000000000000000000000..2b1280f32756805aaa557cea32c70b05a2aa46b4 GIT binary patch literal 227 zcmZ?wbhEHbG-6O>IKlt||NsBb%*?E=uIA+AG%zrD`0!y=R1_N<+vm@pjg5^ZBqW4{ zgcKDO=ggUN^5n@6A3hv7aNygwZyp{VGiT1cdi82iQIVXS9M~i*gyK&Yu&54*1lh^J znxLT2my$UzW7WEx*ZT@|&X?rguUPlK=KX)mqpTdl9&9X0-U1vFe5XV=OIC<1TA^wB zAR@v0R&G+mkFG;kP93Sa$EGmNNLpZ-!L!AgPrAh9_7P-L(M E0LAB0sQ>@~ literal 0 HcmV?d00001 diff --git a/module/viewer/img/prettyPhoto/light_rounded/loader.gif b/module/viewer/img/prettyPhoto/light_rounded/loader.gif new file mode 100644 index 0000000000000000000000000000000000000000..7ac990cf04f2323f9723518bfd72ce102222cefa GIT binary patch literal 2545 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 RLBjw5002ovPDHLkV1n=}nO*<@ literal 0 HcmV?d00001 diff --git a/module/viewer/img/prettyPhoto/light_square/btnPrevious.png b/module/viewer/img/prettyPhoto/light_square/btnPrevious.png new file mode 100644 index 0000000000000000000000000000000000000000..e0cd9c49af7fe2f6ab694843bdd3b90ce9217cb3 GIT binary patch literal 1442 zcmV;T1zq}yP)DPR}?-yIFE=Eh>D`1 zxDZ4LPAETaM%Rg1tJM?Bq#w*j8W7$G%8Lw&qL>a zCw-c0=k{xpz@y)ROWmrvb?SWQJHxHA4-E}n(SMgP*YTP@kUTy+|!o71v*0Uj9&rU)Awvb?t|yrluuz?lkGJ^!4>Q=_3#Yh7?%3ySpO=mYhx}U&DY{ ztyUfuiv?p_UHazs_V(+RmX<#~!COX0NBtf&z+PNj(ACuyg9R|V-7WxmjW|KE>|Uds z@STc?cg@YsKf-UK&-yU{K0Q69%gakX4+sdLz`#JA)xX(ON1M&Y_pk=Ql>x3!!mdfe z!^0^!IG908e&ZRJBWj|fqrXs78-l{_=_v@jjIfe|ffq^G2m?4m^pL_e6dJiF1qN%N zN7iBv{W#*>#30@cz{pcPr!(of7J!S2ium5d#02Y>wRk`5Q93?XY=7I{-o9Wrc}-P4 zijR+f<+;7RJ8Nysxo|~Jaii!%Fot>rm`FYk+ zS69dHT3lRYgFQtzUOxh`I6)W|z%w&5?&_^S2ghNqocjra(~1+%0Vc$oy}iBE*4D=J zf`S5W8<5G#N$Tn8;ro!p#6)%$WMgB4Iy*brNyEd#%-Ht!Hs$8#((&;zr$TIOEG;Z7 z@LUWu*&qh%L!_jnsm&{8?^!)!Wk?@MMb%{ePRf%0|=@*@(HY=il?Tga{EH4qxvIv(ca)R=-l7m z=dj0mge~-X6I1W@6l_i33LLtW&2z{I<5w2)1HBr?f(#o-m~a)XCyiluc>E>604H)GzA+XomH+?%07*qoM6N<$f}$awVgLXD literal 0 HcmV?d00001 diff --git a/module/viewer/img/prettyPhoto/light_square/default_thumbnail.gif b/module/viewer/img/prettyPhoto/light_square/default_thumbnail.gif new file mode 100644 index 0000000000000000000000000000000000000000..2b1280f32756805aaa557cea32c70b05a2aa46b4 GIT binary patch literal 227 zcmZ?wbhEHbG-6O>IKlt||NsBb%*?E=uIA+AG%zrD`0!y=R1_N<+vm@pjg5^ZBqW4{ zgcKDO=ggUN^5n@6A3hv7aNygwZyp{VGiT1cdi82iQIVXS9M~i*gyK&Yu&54*1lh^J znxLT2my$UzW7WEx*ZT@|&X?rguUPlK=KX)mqpTdl9&9X0-U1vFe5XV=OIC<1TA^wB zAR@v0R&G+mkFG;kP93Sa$EGmNNLpZ-!L!AgPrAh9_7P-L(M E0LAB0sQ>@~ literal 0 HcmV?d00001 diff --git a/module/viewer/img/prettyPhoto/light_square/loader.gif b/module/viewer/img/prettyPhoto/light_square/loader.gif new file mode 100644 index 0000000000000000000000000000000000000000..7ac990cf04f2323f9723518bfd72ce102222cefa GIT binary patch literal 2545 zcma*pYg7~I83*u}xzA)~n25ScX&WZP5>nU=1T3OL6cUK&3gY5=2L-vPKosR#4J1Gy z2{*Y2f`*F<925Z+DqcWPab1;V*Q&?%tge1gx39sBO@dC?%nI@=>b1`dA^f;rd<;kzBEP~@QDg`5nuHDmwWi`ccB(8fJu!D@W@6GOX&Kuyf#(~9#Kot4om)5$3D8qAS)~A$Ca-6yH;bP-YR%)e z*uVwm#a35*X`LHGj32c;jsl4QZfgsvW!V?{2-SqnJnoXXF*nkrHs1S%=LGrPst~{V zbIXcXr&l++uUTGfQbH(6qL7Kn#+Xt|g{`v4+z9V)In}XN;&Aif7dZ&S7naR;h=?Fn^{lc|@~&lZlv?W9&si{Zho3Zq zBNC0W8pT9f=}<$GQHasxVL1urLe*G$-i1I28VmOw4D1-nlxMUF7p{*V9W9#? zG3-PbWllts&>7IxQA0d2*lgcSw`;G+rpt*+JWGhuM10z1YIElzOCrY2>B0NtO_MPS zMFf29+_^(8vP$B!PKEl9XU62S@@i=sRcJ^lp7MFFlGzbm>4Ok7O@u`=7$RC~4%Sy4 zYHq1ICcqWPd4_@-lucMS20@nSCdAI1T?+2+dcgowe`%@+K-I${;uYHgEWPq*J&<;{Drqc!cL#1&wL zi~k_=rv}{|hWqv;9yTrI81Aln{6ubW*40;m3xk6_R;~^o)wq1blF3R~tzpvi6+Rf{ zO@-+>SE~;p9EM~ zU%BS@TGN0@Gf>_;Jmxbp+J13zX24k|z@bQPb{EF0CmfYbxJ~O%k&CRSN)_G#!raT! zB2RD$R7b>ld3eqnaC6j5`6O>B8pXLa+91{US;KR#c0HAi>FV66qJsEf-$^exLCvJ- z%W|Bbzf?`*EQ`~OSQ*Od+B(aTqp3|iTw(MPFU$~VJ?;aGI!+E-Q!o?glyj^!ZbYbP z<81oFtestXwVDMoCi>Qzy^KTP|UDdNG+sSR`)Vuyu=yjHg}M zH5*jBS^y(;6%bRP17M-JlrwwBuLqQr?LxNQ2Ap(AZMr6W(R`uRYsO5SbV3s5B{#F3 z?bTf&Y=oM+5~VulI}4c$ywg?lF2$O-J>>{pyh0HWwX(|vc5$0dm&0?WCd+4+EVI!Y zSIvL^QCh;@6C7H)WSzV1jZquFVu}7kr(#T4NoZNQwWz+Hsot|!kK&TG%XbyRqHrU> zrDUs0vWz(H*cQ)oToQ|KQbzl`y7D9&Rj64em4>mS`oNM&In6ragv)*h3eOeJDClzv zrUIRU#P6attq&SbC2NImfWuB$|KFHY&nHXNgaXGshn8el`2t4$ssAr zg-enc+Mjah;dVLBDhMKtMEzQ6_8=ffITG6I%4%_Z1t~EgEIs%Y50R-}{lXPtaRnGM z%m{fOr=JJ$_yGCStL)*PzUStktKI5vCo@J|sw0KJ8P70OktWe{=ZBoUg49f1TqwLl zj*zTG2hq?vo)*iz!b|MDT0pU`bU3<|A(po40|gRSfg_q4KxI5qwo& z&vU_ttugmMuaC9=bfLnK70l9k%ub9E@1oeeAm5%70H@0l36AOzh_dm7SnIW36a>X1 zM~QH{g@HC5TaYNAZGeh}>7I}Ph};P1A^_1^orKh*jUSKaVq_nG>tL@gP?*|emk;O8 z$Qb+&V?7I{%@YTZ<%k{ecMc$xmSy4qQV}Kg5QnSP5?=@`DvWA}t|^%OI}h zP*!BY9Om*eGGKAoU~X{US5!@krn;xAr)PRb>5@v*UH$64dSAWw>UGt4oYmUe%EIEl zgyO5dyc@tXZ>89XfRAv1&Fe z;D+2!b8|C#C4-^>4Aup(RGlb3^U!0L9dz#8nbW9!h}W+Ov=wR$8zBNbCvux=fF84m zfx-M?=Iz_J=QD|Wly>df@pjcs;2!9QS;pW{K?5bBAS!r+5BPyj25V^@7^lkH3KsaI zf)8lW-mzmxHe<#N-v7jj6Wmo*O9NO_rcB|qM~@!mdco4bkLW(%x^?S!60kC?h9 z-MV$-?$f`2e>Qyha1LTaLj${d^(qIeu&|JWEn^K&d;0WgY{5et^my>#0jHI&34S#G0s_8Fx?~9&Q~6{{%aUM$My4Lp+r(#y zw6M_-E?2^ME(zL4j~=n*%a?PdtE;P7*REZ;wba(u#(ZDqKi~)J89#nJw}|cAx3i|E zCO(U3FE20W02CCw&x?2M+Qr@R%$YN6;J|?~S3G?9FjofFfJuU-SjVd7j5?hpXaETP zr%js{3mpDR9xzlJNpa?p1D`gPt0SA>-o7ZvQMM zv7I}2vem0s^Y-rDyT@Ge^5x4sP@g?}miO0Q4w3>`}Xb2V^K{_4Vyf9G8;2y z3eHtW2kO9q1MJ3)8$5m@4kOfHL9+G}Z##!2U=eDokTV&t$UF!ZbLGkv9>`^yaO~JI zo=!kn1au4x!4(zh1^_?-fQW&hM@1}wmBHQc3^;2T-~Ci zg60Gkaxu6tba4Vr0QQaCtw7@XJ#`#xVrA0rQ874~xWas4aWa;nz!Crul*TiexPl&T zjB5!np7$b%OjkbLQ~zNwBP&4|ooGJjaAfcO*Ht>2jWw zc9910Ee&$B31DCZ>(V8UP{^)W-AL`D>jzMr_*t!AD9Ed7WdHy`;JFnn6tv+v=p|T+ zb$z>T-MXLD>8U0G6KIC!xm_*OwE#3I3F}l7SqYj`u>uLuiPv5NzWRgh9ddQ|#?Hn&Ui9NHk1o&4QHf*^0(S8_#Rzt%6KtjHUpiJ8Xv$HZ(EGBMs0u5-X z|38V(dUXTwBiI2N1=CxE?s@8v(Oc9KG`Xt*Abi`Rw!F^3Ju9ixcX&gm`hRr@Lha6n zAYpM|vO@?$z>->c45N3zR$ah!+80wd=B%Z*w${~7WKeRGZei+ilp08#X#HB{f{+^* zFjbh`8nJHgsxz+}oZ8P6kW|Y}7%+7}OP4N<-Q!v}v$)3IyKIx!rh``HYWB}a@*Su2B2l-t zbIo|;No5Z9Q68oyuWn{j&6k{BklmyrvcH|B+O>O?>&we`ynM$^zT_p-_e0@SS=k49 znA2X9+X0EMVH)LOsg~>OewfpKm76re>wZ`&<@)yWZ92QjNH|j=H(|gi2Kj2r_=7K( zI~{?@O&Bl=+`b-0;IYdEBM`a1y-UU$WOxV?9)ctm^sRzT4T89_o|fgV>aC@hUqqo*TV=^Q7?xtsXheBwz`=5PUkdu-7AzIhajnt z>x+fixrc7>xomdJvW(5sQ|^&{Db5q5_! zZsi7XAd+nt58`cATLnS7B>fld3K1Tx%@x z`?$SmFCgmxvimAjTJ489?N{0DMR}d+@DRiY_sxhykW_rH zN>_rC>uXvOmJqNIupmn;hV0m}V<3Gjrdm#Qf@nTZbwAZTt5&W084Yg#zEaZp%{MJ9 zjFiG(+N@nG5iVa_;$-#{HrbW=F z0pn*Z*HZl*)qjb&)hMpfwpP#>m1OY^G}AZTjC1?N+s&IdCxvggTM=&Wgn)%bDY^3W zh4Q1W^id>MG5I>wAa)mODL6Nw!R@|PviPQjg^4Ym3if`V3W{|SwNSKG2pXf3EWUxR zlEMO@)F(>&L#jP2w3n&wi$=$fW-vw zrUdu~4w#yGH$x$cE6q0ag$BF}ZIan$0a~+1zQG24B@nj=upSA;Dn%T^umAsE(BvEN zR%yQ^eoqz99uZ%F_8Sq?@-xZ8;uSxByfyRwN120#H7G0C3Yz(y!UA;be1ie+2F2CZ z5kF~Nm2}-5ve^HA&$S_wEUZqs&l8~K+0fS+@UF8-HSz>lc^>%&4p^;N+GXh~6k?jR zqSk=7m9H!-gbc5Ig9S`v+9xc^>2k0WGAnnvwWH(9G&z_N-?Rw&Vgqjy*#<1i?R^8P|~ zJJk+0_ZbJ+FGOy%F-b}wX~jQXYio0#kueNF{Ye1#>o97$5BhM;T~vRdIyQvL{VEAJ z{WsNbsP+p1b6>F8cTL2%wjp5d3cj0)?{d8g0dp?cP56T9IPuaPCaw+XRdhaUg{002ovPDHLkV1kA;p5g!i literal 0 HcmV?d00001 diff --git a/module/viewer/img/progressbar.gif b/module/viewer/img/progressbar.gif new file mode 100644 index 0000000000000000000000000000000000000000..d84f653789e5008da64ff04ee109471284a9e284 GIT binary patch literal 10819 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 literal 0 HcmV?d00001 diff --git a/module/viewer/img/query_mode_on.png b/module/viewer/img/query_mode_on.png new file mode 100644 index 0000000000000000000000000000000000000000..b206849a9b5124eeed14faca824715ca407544f5 GIT binary patch literal 1827 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`GjEX7WqAsj$Z!;#Vf4nJ zaD4z_MyE9xV%QuQiw3m9zdD+&^mvr|hHl2X$%^K6wA z6cm&cGE;1o!cBb*d<&dYGcrA@ic*8C{6dnevXd=SlRtPXT0Z zVp4u-iLH_n$Rap^dM>d5Zc$z_H1L4Is9%v-pl_&Wpbs}0sL=)}Xysg#npl!w6q28x zV+ZlRTV_#ed45rLv4V53u?q!pi6yCa!0@opH8j#SG72#=wlc7^GBJok z(hpIDrrkF`B{QuORl9MBfuWVLF%UtuBPoJvx6ua$1X93&LmlKNG;u-!mXZt)uY%H| z9B{OxB+eNC!Hzx-d^4olv*Z%zH z-+RwrKP_ldFnAIW!r-9!w20AfBblSG+CF1 z$Q)Zg}L zIog_5tlIeSPNev$Q)?4)O1bAdE(j>N@F7d$ibA%3zUU znw4?=++oT_kW{b*C^dHm!2hf-I8s={Ge3}r~FF&EX2}icXT3YD5$7-lBMv0H*ND$JDJWk6=A8f&P=U}x8-IyaOB77nZ9SE_xbtO9+`N!{lVwj z1+B*>?Rs!t|6r)_o!!zopr0NjIFC;$Ke literal 0 HcmV?d00001 diff --git a/module/viewer/img/queryable.png b/module/viewer/img/queryable.png new file mode 100644 index 0000000000000000000000000000000000000000..dc286e44e0b9b5678067c1f125e3b346d33e701e GIT binary patch literal 322 zcmeAS@N?(olHy`uVBq!ia0vp^d_c^@!3HFQ8hUO4DVAa<&kznEsNqQI0P;BtJR*x3 z7`Q%wFr(8NlNmrki4xa{lHmNblJdl&R0hYC{G?O`x6Go{^8BLgV*kzZen2&1AT`cK zsfi_-`FRQIK_3GYK0^XBhRZ>A3Xfge|blL-Ia7@mVo;ox&KOh4VEs?;o~oDTkU3hzF~5E z`>}OgJf}YtamQ@rf0{SRU3x`1%MNDkd;de2Eh673D(zvg^wpnXS){N9=u!qxS3j3^ HP64Tx0C=30lFLg1K^(`wyAnpvLzWQ)dol?P=>Z85n9u_|m;{xVSl87ATbJ3< z3c7X|xf;w~ygf1c5%ueA+q%ZuK&-|E~-~1kcTvJUmF9X;$ zC`l|WD4SbJ#r*^qy5LCFEHe_1ucD>C9wG7dA;{mVbRXVj#y|R}-wU1I?eb#ldyaYt z3kXOa#-6NTKj)O-InI03q>SU7wH-Chm>B|OJrQMGX55z*e8xE?_?B}?%ksNb#vvn} zGZ=p|o=xkP2FN@X)l9<9$ft~hJb&>u8UyA>0avZ*OIpD772x$Xeg0u!a09rXYWnJH zPEDktnw6QFbX-!;0?_ed+jSq{J_Z_P+y1_=?ZzdG@eEWAtw>70b&=#S&~7hs6MNAE zhtP^e{*FSx`7*Gus{L<{)> zu}oFd+cf&WqWZp*TeM&vkX&|$DiJnaIt#dK7O74G%8H>)1eD28XojEr0p&M$wvB-o zTL1t908mU+MbOX9o12jM`}XPQEoWBlUP<(w6n6q!^4GygxA;2b#!#$-Ou{=>-YEf=;z_a#I>ZLn9a+(=jY=0_44@l z_3+=T8yOi$Mn&%I-ezTG=;q<;>gDmkDyXQP?(ORO`~KeB%lrEIX=!OHC@B8=?a{bp z%*@LK1O@f=^}@lx`S|vBb8OPm(z36n%*?^&FMRSEC2lQ>gnX^ z=Hcz_?e_HR?(X4@jEl9hqwm2rm6VhH{QJGTto{A}kdKYLy0m6wUev2BYH4DVl98&a zru6dbl#+y9TvY4FR`~e!u&=J|z&L$;ajcCo|NZu)p_Gk`f85*Gf`NDI>EySqjrjTg zxwohB@9M6soRX1`YkmQ?Ca_A@#gF6>(tW2=H=yA zRZ!vK;K9GJeSCVUsHFe@`{&Ge+1AI}z-{~a@&Et-{rvd;{{645rmv-i`1$r;UR(M6 z_v!5C>gnhI{`r}jm;V3$`~Ca&_V(xK@2#w+pP!;JF)f*xmjC+fVPIeX|Nr{=_w4NF z{QUd<{rvp<`uh3!@9*#X`}zC&`276*^z`)l`udiYmH+*o3S`TqU<@bK{S z^Yi}w{p{=J?Ca*w3q$m;3X#{dBO{Q3X?|LW`I z`uY0R(!>A%{mRF<*w)7S`T6wp^ZNSvo`W-?pr5Iyn$yw1*VV+2kCX84@6pb{>gww9 z^75IPj=;aZ>FDOcoi8FHAF#2v+S}mn@b2&M@sW^}?CIgp$gltZ|NsC0?C9Rn(9pNH zu8E0-dulb6l$4c~l==Di`uOs{rd9d<_vhy1sHK<6z@N>{(d+8y*VM)8(SQ8@`wP5Z z3IG5BT1iAfR49>Uk}+$-Kp2Kk0vQVCmJmotr*emo?KZPrK>80H1%)gQous%p=&!g= zZrA0)DS>1RcBoq$w+@BQow|1HcQLI}pF8sLz0XUgLyxYFFW7EYXk+)qf0S!)(ALc^ z1h7T8$O#$(39Lj@wwDdf3?i&oAY_Ex6!`sTaLqxXh;X$ zY1?;Tb$-P>9i*)7H-PZX9I=$$H+^RC8v%x};jpg5mngm_hNG~2Kk*Ll;oHKC6Q7vf zPcZ5cm=;N3Kr?{_oS*bi-*&$Vf#!*Xkgq;kojr!m)7|c)eGES;bEA)yi@5Uu0000< KMNUMnLSTZbgw{R) literal 0 HcmV?d00001 diff --git a/module/viewer/img/remove_point_on.png b/module/viewer/img/remove_point_on.png new file mode 100644 index 0000000000000000000000000000000000000000..cc8d7b2c679d5b2588363020226523f455cb50e3 GIT binary patch literal 1461 zcmV;m1xosfP)X+uL$Nkc;* zP;zf(X>4Tx04UF`(z{E;KpY3~Zz7^-)xr8e5He|zR!UW{Ac76}K!;cawTq-_tc98$ zm#YtObuYMygAZ^LaZw!o1G)*ih#=_TCI~K4;$2SZR9*bRkZS)p+2nD8bejN1^l*31ky9|+Thq|RO9Zp}&`3a6zngg30Lc=v`o>SS^b z_Z#Jrnk@xQ_BEx$LtK(=WvyT-H$e!Fa5aGeyHO~cxZV-1G2STs5!)_noxH+Qyzr2!)V z00RI}OjJeC&&`{gkof!d>F49|@$pwxRkgILy}i6+SU1AHv^h99q@<(Y-rR+RcVxL8AwJ&?(E)XWo78*;p^(<@xUsmsGaWZ>iYZs-rLLj`uS;TX(}iv{`&3FxMj@D z%LD`k_4W0_!NB?W_I7h@($dnhucpk*!RF)A_V@nz_we-f{psoH<+m&U{PF7P&I63`1P=_uI<1$eSC4OjWPfI_N1Ydjf{WX+t-4DckAiox2=u%`Tn`L zr}6LVuB@Drk&olz+_JEsxVX1)Z)x@Q?v#{@?dGARA>+9>((!=KE_{p;)I`T6<&{rvFo@bmNY z{{8*z>*nn1=l0cb>+I&y(Z;N-p{|P_>+9u}k&5r{?(FR5>+I*&!GZkw?*IS){rT+t z`}_X?|Nj2}Db2r0Q&s-|NsB$>*f0S z`qk3I|Ns5U$GF(m#`^jB^z`%k`uU!NGohfLsi&IL(ZJW$#E*}Y@bB-@&cN#G>hkjP znVF8jzrN|{=E0pWA|fBKvA5dW;O_A5@9^=Fkd*A{;m^pg|NsC0|Nrdh-qFy|x3{i| ziG_P=HIgd9AtXtaO76qgu=1b<>&qLh>oh7SHle*Q!wBXx8M{>J%I2g8ii(Ixn2&UaPLGEzsE z0IG+Gd!R}{)kmqThoeY9)kh&Lgh*7Rx@#Xt7Kcfsy7Feh?M0HPNOes$GE&Esh%-tx zDuap`fdEXxD6Gr_E!fdR7fC_`yMzXVCAO$le{acvoER7nNU@|l`Z_W&tUqDS+Vv91_XzL_ zalL!z+VNutH*Q?BfB*iP>WXb!S6{q%?97>i+qSH_e*Ns(vxjb6KX>Wk@s5s;9Xr-v zx^&#t)p^gJ?P;mW6DLlbH*fO)|Nmb+e+VRxvwVpInki8d%*{s z?|WZ9Jn;Yj^4$unLr-oy@_mx}!c2!#rlwL|cYYbZf6eZ>Gx8Vfh7cPC0Ts@B7dzSO z7#5yl^Vo2TX^pan(km{VGneZ(#B61gt`ljxf4K3`*P?0<@pSE7XE(n{Sy@xxe|lx< hKZ&JtqUS%1yjNnc!4oD@T>x|kgQu&X%Q~loCII>$tm^;( literal 0 HcmV?d00001 diff --git a/module/viewer/img/save_features_on.png b/module/viewer/img/save_features_on.png new file mode 100644 index 0000000000000000000000000000000000000000..5640ae888ba2bee0e9758d24e2cf144db4cf685f GIT binary patch literal 361 zcmeAS@N?(olHy`uVBq!ia0vp^5NU@|l`Z_W&tUqDS+Vv91_YUw0 zaecO3N95!Uc7kh(xv0uwyZjP_R#g~XK!3Tw`0e84@=%l z7ms&zbYz7H9hsvvapJ`O-nM!3CV#lU`r`qu|NsBzy?ZzdXsl#OkY6y6ixn_1ns99g zD{_q}3C>R|DNig)WpGT%PfAtr%uP&B4N6T+sVqF1Y6DbM@9E+g0(9P`SpGu_JgpDQ zHk{4B>u34lfBj1F?lrSrd~5V8Crx5o5)-s|>hA*0H)CVz>YJ l%Nthv`GU@^Jzt>VA7!Vxh4*CQL!eU_JYD@<);T3K0RTl8rM>_F literal 0 HcmV?d00001 diff --git a/module/viewer/img/slider.png b/module/viewer/img/slider.png new file mode 100644 index 0000000000000000000000000000000000000000..3ee254ab4423a3e1718c29c3eed974166afa4485 GIT binary patch literal 303 zcmeAS@N?(olHy`uVBq!ia0vp^B0$W^!3HFa4)S;aDVAa<&kznEsNqQI07({jL>4nJ za0`Jj1Qo1uOb>bZxCbjZ*ZXw3Ei6{Sa&XL_U^)=sUxU*GC}Lg@B3+ZIn3p3X^`vv#cGE>Axt?iT%b>36;l z88fD*L{3}pdc2U~LX`8R|A%;bCmecy;+>t&&y$t&*0%{Z?!Fwg_gQu&X%Q~loCIG0>a=!oo literal 0 HcmV?d00001 diff --git a/module/viewer/img/south-mini.png b/module/viewer/img/south-mini.png new file mode 100644 index 0000000000000000000000000000000000000000..06610336a48b24e93c43ecc2e1e0f8c43d87cb6c GIT binary patch literal 356 zcmeAS@N?(olHy`uVBq!ia0vp^LLkh+1|-AI^@Rf|mSQK*5Dp-y;YjHK@;M7UB8wRq zxPc0}g%~g0t@{HMlrM3OC<)F_D=AMbN@eg(OfJgLO-;#6RB+2IN-fVX$}U#0*qU*v z0;u%1r;B5VMeounj(vv}cwFlPRQ;wfPYC6kZC$WV;pl+|1mvMeG)49V6vpZF$ zr6%?WGCX)^U_3+8>vF^3vsvW;KurN4r2nf!Q zbQ1kD$+LTv+@)`e-Mv=s4)bC>8SYjdcy;=VcN=fjAI?48*}rJD^~<&OB2VY+-ZVw1 z=v?xmd27@wyQ-$&J+)3H-Zk`EUwYO{o~su_)zZG{trFg^q@+-3k}LZ5H(#i$=F?A- yD?ciI%30s3@~kqg+GUdS)qBT${%7`2v)>YRi1q8MpP4{!GI+ZBxvX^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<c1}I=;VrF4wW9Q)H;sz?% zD!{d!pzFb!U9xX3zTPI5o8roG<0MW4oqZMDikqloVbuf*=gfJ(V&YTRE(2~ znmD<{#3dx9RMpfqG__1j&CD$#!}nk3u9H z9^3d{rOtESCL#RZ<6iThta<&5&*}NCU2QNuXhLF0?G5qYtN;4{RFK-nU#i-pUoBI3 rXX=?w$rJ3Cx;DBpgyq^@{mQa0BjnDa%523~>{}xjbunlF@&B6u@=OB$ literal 0 HcmV?d00001 diff --git a/module/viewer/img/style/10.png b/module/viewer/img/style/10.png new file mode 100644 index 0000000000000000000000000000000000000000..1ccd23a89e7e304d36b4e91c39cad1478eb45e4a GIT binary patch literal 737 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<c1}I=;VrF4wW9Q)H;sz?% zD!{d!pzFb!U9xX3zTPI5o8roG<0MW4oqZMDikqloVbuf*=gfJ(V&YTRE(2~ znmD<{#3dx9RMpfqG__1j&CD$#!}nk3u9H z9^3d{rOtESCL#RZ<6iThta<&5&*}NCU2QNuXhLF0?G5qYtN;4{RFK-nU#i-pUoBI3 rXX=?w$rJ3Cx;DBpgyq^@{mQa0BjnDa%523~>{}xjbunlF@&B6u@=OB$ literal 0 HcmV?d00001 diff --git a/module/viewer/img/style/11.png b/module/viewer/img/style/11.png new file mode 100644 index 0000000000000000000000000000000000000000..52dae4b30fda790bd6037e1d4da412c491b2531b GIT binary patch literal 714 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<c1}I=;VrF4wW9Q)H;sz?% zD!{d!pzFb!U9xX3zTPI5o8roG<0MW4oqZMDikqloVbuf*=gfJ(V&YTRE(2~ znmD<{#3dx9RMpfqG__1j&CD$#!}nh)lQ^!cPpV)jRqIp{T<5Ryf#H>}nZ>#H zMt(8>ylh#EuB}zqPj-Lw>X&Q%{M64?BGbb>c5mxF!1j(+WJ|bD=%nzSN;$C)KYnKH VxpdK$OUr!I9i}dgW$gcN0s!-^^eO-V literal 0 HcmV?d00001 diff --git a/module/viewer/img/style/12.png b/module/viewer/img/style/12.png new file mode 100644 index 0000000000000000000000000000000000000000..075870b08b667dc430e4746f762e46caacc124b5 GIT binary patch literal 1176 zcmex= zRY=j$kxe)-kzJ`!#HexNLJno8jR!@8E`CrkPAY2R|V^&07y2J$~}^+4C1KUw!=a z`ODXD-+%o41@ado12e>1aG#<1OAzQUCSV+}u!H=?$W#u*%z`YeiiT`Lj)Clng~Cck zjT|CQ6Blkg$f;}`^g%SK=pvVxipfLOk07sseMX$en#l4Q++zrT-D2QjW&}navmk># z!{1-?O18B=nRr#X*W1|eKmfbS@9@sLqyHH`1pa4e+W#Tow7qaljqJy>+k2Hil-`QW zdS+|)?#wN(hh2rmBB@uK>}1UqZxv)8w}0>;|JJnc-y(s!BLBF|b`mfCarhBSVTJVJ zvTGUV%S)?Q8aAxq+HdT&LGrFsleZhgv;8*q52oFhFX6v&`ybcm562H%r602Ii)Xdr z{W$sI-u{NXq#u(XJp1tS+8@^?$M*R?k>4{h)yRFDnI((ui4#8?7jyr9b!qwKhw+b} zPFee1d^hW5W#yBB=D zcYg1ZNB^GxxN95i#(u=VX&z10iu{MdddPV%Gc`PQv0SGPo#*6MLzzoaklR4@0; zs$-H<`c!-j-ek@ftYiD3{+Mm$!{6`4E9?*5)7<-E?x$B(vd7jhxqaVzaqLRgJl$C# z$vg{IO?ctVw0NHO%0nAz?P5W8)?Vz`2jlsfFl3|1P~w^4;#UX-5^G+7=K5xVj{%u1hP4Q7sL~+ zcrU~r1M+cqevAYWVR3t%?MiswR{n@0o)EWq~%Aa4Nn=%fNiC|v?`h`TNG z;@S}_#3Gah^@py*|SHNQr+2_#-lW~h}VROLdfXxA$12zY24*V}2 zFts{luF&b!0v1cDWr}4g3C5JF6fA>S&EhcGED#)OP>ZEWn2s*N66H!E`sBnZlrEPE z(YOE+Tci%hR>)_kYp@0Ba~Dd}lcanZ8X7_iHV6y~wF1+L=>|ozQY$bBQFCzt#CSIg zrJGZ9NkVjyXdXRWrNQX_Ob(NShS2DAday>8Ac%>Gv<`<)Le$Druh%p6Jf=#M$l~z% zd={I_;&K@cj?yQtM?Y@}^D%rj=^sYMorAq~mqP5>={Bh@$vJ{bA)PR`*Xd zq#^y4;lN<%k|11ziFH^6Y$5mtjKStJxa@`aW)RWpR+nulWev|CS_sCm;zJkv~VFgtUZ7RrFZb)VAfw}8Zp(-RFSA(_>haGPz=^>9wLZRYIS0z6pM-oNllf@ z1PS7V0EtW%z>tV}G6shu6Enmz9)}_0@nnGkoax*Ij>No%BGJIHf4hnnmGA?G{{pN3 zXBh05#q*KB4qBFxFK?-6n`Btd+U&B~H7o~)m2CUEY<3OHfng=vzOE6oi}rRqjVa+C zS`RnNrduE!5D9qTS0WxH1iz9=B!omEQz+&}wYQ^C?Wq)sor9e{4G)MM9cYgD175^3 zlt@MpGL1^1np1{#F`WiZcEAmcM+hh&IuQ^jf~f{ff+vh*Gd=v&(;V=`kwm6YAq@wZ zaO6EmA3-2#GGq+1KgUlbNls*EPtFXA%X~2vO&P<@%q_I@3M;F2jcMre=1DYb>}g}i zjdydO>@&r8s-J(rhk?`ig7Ao$k+Wt;%~`PUli0XLiqDBfRw=mK61BBK|HJ=S{ZdG?(xL;jiTty<(1o;yA@={xMekcSzYFZKH>`r?V=+MtGIJ5wUVneO!^9ltHTos-(snRCA4#(KXl zm5YSCadTkQ17&f^z8>Dg(&n`<)Lq*i3%ly(8Kvzy6No&SoyN?%yWww z{*SQ5#jCfL<^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<c1}I=;VrF4wW9Q)H;sz?% zD!{d!pzFb!U9xX3zTPI5o8roG<0MW4oqZMDikqloVbuf*=gfJ(V&YTRE(2~ znmD<{#3dx9RMpfqG__1j&CD$#!}njOubZB(6}lLEb=i(7Z?%$pUm zXz|;uKepoaKV^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<c1}I=;VrF4wW9Q)H;sz?% zD!{d!pzFb!U9xX3zTPI5o8roG<0MW4oqZMDikqloVbuf*=gfJ(V&YTRE(2~ znmD<{#3dx9RMpfqG__1j&CD$#!}njuK8km&{bQddIpu7*=I#8v{Z(%N8Mtg* zA8FU~-)u`Yjy+X&`}X>K6Zaq5yvO?C?fz}D<*|uot2It3{@(Wbro-2N@iT3wWE?a6 zc6Faz_nP@X%j;L(Z$Es<;MXzbhc9-W{Le7G{8QBITOr#oXO?}+3Rq&^Gjp1WC0G65 zh(+rHV>Z>C-5v30&dw!IrmhQ`?6F~XXm{|Wn^K=tZcLIp{HN;k`|ylKonAp(?;W1< RRAuMfHzI+qp6vf`0s#LhF%|#- literal 0 HcmV?d00001 diff --git a/module/viewer/img/style/17.png b/module/viewer/img/style/17.png new file mode 100644 index 0000000000000000000000000000000000000000..93ee6078af70effd6e5b82239942fd217f8e3bb8 GIT binary patch literal 822 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<c1}I=;VrF4wW9Q)H;sz?% zD!{d!pzFb!U9xX3zTPI5o8roG<0MW4oqZMDikqloVbuf*=gfJ(V&YTRE(2~ znmD<{#3dx9RMpfqG__1j&CD$#!}niL_M|@6*kjMQb*r}8Vx+Q}@lu-t{6=%I&jKSDg3!_uIEGSRc&Y+M@V%j{o6{rIY_NDBn7mu=4Wq zuV>N^Lik%g-2MA*`NHVCSz`Os=N?!7eRy;7wpxv~S=#4Ts%l!Qru>p~ja+&5l-9{F zZ&KoaqRs#h>T290xq1CBca$H^zUUh2c`C3g?_2z8y|tdF1cJ&vGrw^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<c1}I=;VrF4wW9Q)H;sz?% zD!{d!pzFb!U9xX3zTPI5o8roG<0MW4oqZMDikqloVbuf*=gfJ(V&YTRE(2~ znmD<{#3dx9RMpfqG__1j&CD$#!}njuKZ=eCLj`ndnU2>^^@A-n(p literal 0 HcmV?d00001 diff --git a/module/viewer/img/style/19.png b/module/viewer/img/style/19.png new file mode 100644 index 0000000000000000000000000000000000000000..2c892fb9ccb2ddcfa4d8b29ec27e4cfc4ed92d81 GIT binary patch literal 818 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<c1}I=;VrF4wW9Q)H;sz?% zD!{d!pzFb!U9xX3zTPI5o8roG<0MW4oqZMDikqloVbuf*=gfJ(V&YTRE(2~ znmD<{#3dx9RMpfqG__1j&CD$#!}nhYKZbX$`J=mh$)?43;?CWRT{qzJ2}2Ry@+~^y%F{bv^SJS^0{^dgV%8i%sH4 zxFTt66JVI)_J!ql^7VPo*NWD4J)X03$=$U@JwHus&2o!mv%Ed-2ev8m6mM4znDd~F bee(G@-;6+4p*c(Q(yJK)T}2h@|K9`vpDQhz literal 0 HcmV?d00001 diff --git a/module/viewer/img/style/2.png b/module/viewer/img/style/2.png new file mode 100644 index 0000000000000000000000000000000000000000..2f90016c53031f5bb05db496a87e47d7dc5be72b GIT binary patch literal 797 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<c1}I=;VrF4wW9Q)H;sz?% zD!{d!pzFb!U9xX3zTPI5o8roG<0MW4oqZMDikqloVbuf*=gfJ(V&YTRE(2~ znmD<{#3dx9RMpfqG__1j&CD$#!}njOubZB(6}lLEb=i(7Z?%$pUm zXz|;uKepoaKV^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<c1}I=;VrF4wW9Q)H;sz?% zD!{d!pzFb!U9xX3zTPI5o8roG<0MW4oqZMDikqloVbuf*=gfJ(V&YTRE(2~ znmD<{#3dx9RMpfqG__1j&CD$#!}njSYinhD9A}76Jg3}SwR6$0U)B=M2Kvf# z+@-!22SnUBp=!Q;iS6w^_Kf2T)+Vw{xB2$xoQ#`N(fq3){xgV&U((+F`OUt3r>C2J zuD!U^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<c1}I=;VrF4wW9Q)H;sz?% zD!{d!pzFb!U9xX3zTPI5o8roG<0MW4oqZMDikqloVbuf*=gfJ(V&YTRE(2~ znmD<{#3dx9RMpfqG__1j&CD$#!}nh)lQ^!cPpV)jRqIp{T<5Ryf#H>}nZ>#H zMt(8>ylh#EuB}zqPj-Lw>X&Q%{M64?BGbb>c5mxF!1j(+WJ|bD=%nzSN;$C)KYnKH VxpdK$OUr!I9i}dgW$gcN0s!-^^eO-V literal 0 HcmV?d00001 diff --git a/module/viewer/img/style/22.png b/module/viewer/img/style/22.png new file mode 100644 index 0000000000000000000000000000000000000000..6e75ac35b2d89d3ad64c345ac02ae576037eaf66 GIT binary patch literal 726 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<c1}I=;VrF4wW9Q)H;sz?% zD!{d!pzFb!U9xX3zTPI5o8roG<0MW4oqZMDikqloVbuf*=gfJ(V&YTRE(2~ znmD<{#3dx9RMpfqG__1j&CD$#!}niZmDfbSCSR=0m{;0b8}TJRDn-ETy;WX{ zE&KQEvqv6f`7OV?;l6zMCGFks?z?`j5|>zA>@myenW-K_P7$lfEA0y{l}U^4zP&o( hn8bw>Dq7}@4Vhm8y##uqpN8$;Eqka-W3}M_n*g=M{e%Dj literal 0 HcmV?d00001 diff --git a/module/viewer/img/style/23.png b/module/viewer/img/style/23.png new file mode 100644 index 0000000000000000000000000000000000000000..a2cae6fd312ad44253bea9c03fc3dc12b373dbac GIT binary patch literal 737 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<c1}I=;VrF4wW9Q)H;sz?% zD!{d!pzFb!U9xX3zTPI5o8roG<0MW4oqZMDikqloVbuf*=gfJ(V&YTRE(2~ znmD<{#3dx9RMpfqG__1j&CD$#!}ninOG^}`!>8LX6%Th3+*(=uD*SpWIocGDK2m`gXdGVhtN+Ul)Z*QBm*FAfDPm+*=? utNZ)s%C-t0{Lb!AFmfde-i-7fdt0@ literal 0 HcmV?d00001 diff --git a/module/viewer/img/style/24.png b/module/viewer/img/style/24.png new file mode 100644 index 0000000000000000000000000000000000000000..d7a78c312d249081927f27ec6f9acd17deaf28b6 GIT binary patch literal 804 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<c1}I=;VrF4wW9Q)H;sz?% zD!{d!pzFb!U9xX3zTPI5o8roG<0MW4oqZMDikqloVbuf*=gfJ(V&YTRE(2~ znmD<{#3dx9RMpfqG__1j&CD$#!}njuKZf>8*}avoPp;k)=;WCrG-qjE NdNr#^pwHz0HvvI#F8lxh literal 0 HcmV?d00001 diff --git a/module/viewer/img/style/25.png b/module/viewer/img/style/25.png new file mode 100644 index 0000000000000000000000000000000000000000..ce85fc61b8430a2b62dbb94543c61dfc6a8c2e8f GIT binary patch literal 6140 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 J?}9C5{|0}D?xz3% literal 0 HcmV?d00001 diff --git a/module/viewer/img/style/28.png b/module/viewer/img/style/28.png new file mode 100644 index 0000000000000000000000000000000000000000..1dc3a679f671013645db63555cfbcc90fd08bc70 GIT binary patch literal 1757 zcmbW0eKeF=9LJyW%$uQ?G2YVdPI*g|B8p-anaOA|Lr9GYsf-*4iG&F=C1ph>lGS>d zMwHSNQ9>z|5V06}8%=1Y8p$-J@$55o&h9_^$L{{_x!-f|x!-%w_j7*dLjBMvu$V$} zBLN5m03hH2K!bn_poUPDO4U?_1XYScB0(e?g+_my7Ns6J{Urt_rYp==n%mf}-(Y9I(PgVEiM-8?;_b7;*Ux`vK*-+EeftlDF=GzJ9*&DY zl90yc96ynMG9%|~F85qs{`rEE(lXv9e);8!8-km+YHDxS)!%>6^6*jX<0ntMU-b0; z(bqp9921Sd62G39oO(0;Vdmqk{FCDI7Zn!*0Ka3w`j1?Am`hF71B{9bp%w>E5RXJH zw?b=ep<;rf2!_@vSZ(L*;_7B~qjfZyPH=P=PS@CG%w$@H_Kob{fu;U0vcJIo<`M#$ zAOdb4hzFbiWsy<<0n8yMxtD^jmo81TbxL>etYTQ6A6uj;w6LkqoXO%IE?-4WsCn-8 zv|P+dY?b+WDl1q_RvKS^>B2mY?O4Mc3f(Ie+up?K5)vu9cDA)gUne(>Z}I@GkeS`O)VWr) zSRd!$=zOh?v?I@^+IBgmj35{AW zhw0d`=aooh1H}Scn!dZba7>44cXL)b@vdP~X#oMq5eP_4l@M<}94?l{h(to7&eZzM z*fK@xQ=$7&hW6CdI_JJKWW$xTC8SXR6V*h&QsJj3J35ZJKO*GIXBA}8wSiMEM_21L zH7z88p09*zDmG_)*+$ z_d$B~SxJR)j+@65vjJj$JdeA_y2Fqy>-S^JdwSixA_J^r3he_kUUspWuxFuYCP3SUD zOPjNUfPSNgj4zSQkz+H7$wWK@TgG$m7nz%RSQYM|95Sa6s0BGR+UZ!zTZ>Is7hcm8 zNITUtT1G=`&2h)gZ}9D$%X9+#nF5Y0E<4v}+{|^x_yVP4`uS|*K%ShcAkUe_d%S2E#g-ljZq(# z%**ox1Q71pmN11KCuFxJ87!B2$oc&6gkVX6?eOVO zv?j~9d)e(^(D*`L+)61a+EF6w6kYsESSo+2h?`D`#S$5yoxGmE0=&XmGZ{krlMxa>mnJ2h23^x78%N}Ks( zUpDPcTySCE5zcl9(7N1V6N)8y`}7q168Hgr5%fn3+vxUnS4+a>pT^#2eKnc(Zu;Wa z5{Zyly)pP%us1It=@s2L^Eip@MRw+&*@DS-JpuvJ4Kj^DWj+LiUQ|!ioA#)xtuNy4 zH+rK*Hk}+V2rG)qSeKGZI#cc_pJ>qejE-%ubXY|VKeddIgM!zfBMpW3GLd{z$0RgHgz)*8u%0WN(Mau literal 0 HcmV?d00001 diff --git a/module/viewer/img/style/29.png b/module/viewer/img/style/29.png new file mode 100644 index 0000000000000000000000000000000000000000..290e574ff960f1d9d510a14c1bd719faa72d0307 GIT binary patch literal 1640 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 literal 0 HcmV?d00001 diff --git a/module/viewer/img/style/34.png b/module/viewer/img/style/34.png new file mode 100644 index 0000000000000000000000000000000000000000..1dc3a679f671013645db63555cfbcc90fd08bc70 GIT binary patch literal 1757 zcmbW0eKeF=9LJyW%$uQ?G2YVdPI*g|B8p-anaOA|Lr9GYsf-*4iG&F=C1ph>lGS>d zMwHSNQ9>z|5V06}8%=1Y8p$-J@$55o&h9_^$L{{_x!-f|x!-%w_j7*dLjBMvu$V$} zBLN5m03hH2K!bn_poUPDO4U?_1XYScB0(e?g+_my7Ns6J{Urt_rYp==n%mf}-(Y9I(PgVEiM-8?;_b7;*Ux`vK*-+EeftlDF=GzJ9*&DY zl90yc96ynMG9%|~F85qs{`rEE(lXv9e);8!8-km+YHDxS)!%>6^6*jX<0ntMU-b0; z(bqp9921Sd62G39oO(0;Vdmqk{FCDI7Zn!*0Ka3w`j1?Am`hF71B{9bp%w>E5RXJH zw?b=ep<;rf2!_@vSZ(L*;_7B~qjfZyPH=P=PS@CG%w$@H_Kob{fu;U0vcJIo<`M#$ zAOdb4hzFbiWsy<<0n8yMxtD^jmo81TbxL>etYTQ6A6uj;w6LkqoXO%IE?-4WsCn-8 zv|P+dY?b+WDl1q_RvKS^>B2mY?O4Mc3f(Ie+up?K5)vu9cDA)gUne(>Z}I@GkeS`O)VWr) zSRd!$=zOh?v?I@^+IBgmj35{AW zhw0d`=aooh1H}Scn!dZba7>44cXL)b@vdP~X#oMq5eP_4l@M<}94?l{h(to7&eZzM z*fK@xQ=$7&hW6CdI_JJKWW$xTC8SXR6V*h&QsJj3J35ZJKO*GIXBA}8wSiMEM_21L zH7z88p09*zDmG_)*+$ z_d$B~SxJR)j+@65vjJj$JdeA_y2Fqy>-S^JdwSixA_J^r3he_kUUspWuxFuYCP3SUD zOPjNUfPSNgj4zSQkz+H7$wWK@TgG$m7nz%RSQYM|95Sa6s0BGR+UZ!zTZ>Is7hcm8 zNITUtT1G=`&2h)gZ}9D$%X9+#nF5Y0E<4v}+{|^x_yVP4`uS|*K%ShcAkUe_d%S2E#g-ljZq(# z%**ox1Q71pmN11KCuFxJ87!B2$oc&6gkVX6?eOVO zv?j~9d)e(^(D*`L+)61a+EF6w6kYsESSo+2h?`D`#S$5yoxGmE0=&XmGZ{krlMxa>mnJ2h23^x78%N}Ks( zUpDPcTySCE5zcl9(7N1V6N)8y`}7q168Hgr5%fn3+vxUnS4+a>pT^#2eKnc(Zu;Wa z5{Zyly)pP%us1It=@s2L^Eip@MRw+&*@DS-JpuvJ4Kj^DWj+LiUQ|!ioA#)xtuNy4 zH+rK*Hk}+V2rG)qSeKGZI#cc_pJ>qejE-%ubXY|VKeddIgM!zfBMpW3GLd{z$0RgHgz)*8u%0WN(Mau literal 0 HcmV?d00001 diff --git a/module/viewer/img/style/35.png b/module/viewer/img/style/35.png new file mode 100644 index 0000000000000000000000000000000000000000..1dc3a679f671013645db63555cfbcc90fd08bc70 GIT binary patch literal 1757 zcmbW0eKeF=9LJyW%$uQ?G2YVdPI*g|B8p-anaOA|Lr9GYsf-*4iG&F=C1ph>lGS>d zMwHSNQ9>z|5V06}8%=1Y8p$-J@$55o&h9_^$L{{_x!-f|x!-%w_j7*dLjBMvu$V$} zBLN5m03hH2K!bn_poUPDO4U?_1XYScB0(e?g+_my7Ns6J{Urt_rYp==n%mf}-(Y9I(PgVEiM-8?;_b7;*Ux`vK*-+EeftlDF=GzJ9*&DY zl90yc96ynMG9%|~F85qs{`rEE(lXv9e);8!8-km+YHDxS)!%>6^6*jX<0ntMU-b0; z(bqp9921Sd62G39oO(0;Vdmqk{FCDI7Zn!*0Ka3w`j1?Am`hF71B{9bp%w>E5RXJH zw?b=ep<;rf2!_@vSZ(L*;_7B~qjfZyPH=P=PS@CG%w$@H_Kob{fu;U0vcJIo<`M#$ zAOdb4hzFbiWsy<<0n8yMxtD^jmo81TbxL>etYTQ6A6uj;w6LkqoXO%IE?-4WsCn-8 zv|P+dY?b+WDl1q_RvKS^>B2mY?O4Mc3f(Ie+up?K5)vu9cDA)gUne(>Z}I@GkeS`O)VWr) zSRd!$=zOh?v?I@^+IBgmj35{AW zhw0d`=aooh1H}Scn!dZba7>44cXL)b@vdP~X#oMq5eP_4l@M<}94?l{h(to7&eZzM z*fK@xQ=$7&hW6CdI_JJKWW$xTC8SXR6V*h&QsJj3J35ZJKO*GIXBA}8wSiMEM_21L zH7z88p09*zDmG_)*+$ z_d$B~SxJR)j+@65vjJj$JdeA_y2Fqy>-S^JdwSixA_J^r3he_kUUspWuxFuYCP3SUD zOPjNUfPSNgj4zSQkz+H7$wWK@TgG$m7nz%RSQYM|95Sa6s0BGR+UZ!zTZ>Is7hcm8 zNITUtT1G=`&2h)gZ}9D$%X9+#nF5Y0E<4v}+{|^x_yVP4`uS|*K%ShcAkUe_d%S2E#g-ljZq(# z%**ox1Q71pmN11KCuFxJ87!B2$oc&6gkVX6?eOVO zv?j~9d)e(^(D*`L+)61a+EF6w6kYsESSo+2h?`D`#S$5yoxGmE0=&XmGZ{krlMxa>mnJ2h23^x78%N}Ks( zUpDPcTySCE5zcl9(7N1V6N)8y`}7q168Hgr5%fn3+vxUnS4+a>pT^#2eKnc(Zu;Wa z5{Zyly)pP%us1It=@s2L^Eip@MRw+&*@DS-JpuvJ4Kj^DWj+LiUQ|!ioA#)xtuNy4 zH+rK*Hk}+V2rG)qSeKGZI#cc_pJ>qejE-%ubXY|VKeddIgM!zfBMpW3GLd{z$0RgHgz)*8u%0WN(Mau literal 0 HcmV?d00001 diff --git a/module/viewer/img/style/36.png b/module/viewer/img/style/36.png new file mode 100644 index 0000000000000000000000000000000000000000..1dc3a679f671013645db63555cfbcc90fd08bc70 GIT binary patch literal 1757 zcmbW0eKeF=9LJyW%$uQ?G2YVdPI*g|B8p-anaOA|Lr9GYsf-*4iG&F=C1ph>lGS>d zMwHSNQ9>z|5V06}8%=1Y8p$-J@$55o&h9_^$L{{_x!-f|x!-%w_j7*dLjBMvu$V$} zBLN5m03hH2K!bn_poUPDO4U?_1XYScB0(e?g+_my7Ns6J{Urt_rYp==n%mf}-(Y9I(PgVEiM-8?;_b7;*Ux`vK*-+EeftlDF=GzJ9*&DY zl90yc96ynMG9%|~F85qs{`rEE(lXv9e);8!8-km+YHDxS)!%>6^6*jX<0ntMU-b0; z(bqp9921Sd62G39oO(0;Vdmqk{FCDI7Zn!*0Ka3w`j1?Am`hF71B{9bp%w>E5RXJH zw?b=ep<;rf2!_@vSZ(L*;_7B~qjfZyPH=P=PS@CG%w$@H_Kob{fu;U0vcJIo<`M#$ zAOdb4hzFbiWsy<<0n8yMxtD^jmo81TbxL>etYTQ6A6uj;w6LkqoXO%IE?-4WsCn-8 zv|P+dY?b+WDl1q_RvKS^>B2mY?O4Mc3f(Ie+up?K5)vu9cDA)gUne(>Z}I@GkeS`O)VWr) zSRd!$=zOh?v?I@^+IBgmj35{AW zhw0d`=aooh1H}Scn!dZba7>44cXL)b@vdP~X#oMq5eP_4l@M<}94?l{h(to7&eZzM z*fK@xQ=$7&hW6CdI_JJKWW$xTC8SXR6V*h&QsJj3J35ZJKO*GIXBA}8wSiMEM_21L zH7z88p09*zDmG_)*+$ z_d$B~SxJR)j+@65vjJj$JdeA_y2Fqy>-S^JdwSixA_J^r3he_kUUspWuxFuYCP3SUD zOPjNUfPSNgj4zSQkz+H7$wWK@TgG$m7nz%RSQYM|95Sa6s0BGR+UZ!zTZ>Is7hcm8 zNITUtT1G=`&2h)gZ}9D$%X9+#nF5Y0E<4v}+{|^x_yVP4`uS|*K%ShcAkUe_d%S2E#g-ljZq(# z%**ox1Q71pmN11KCuFxJ87!B2$oc&6gkVX6?eOVO zv?j~9d)e(^(D*`L+)61a+EF6w6kYsESSo+2h?`D`#S$5yoxGmE0=&XmGZ{krlMxa>mnJ2h23^x78%N}Ks( zUpDPcTySCE5zcl9(7N1V6N)8y`}7q168Hgr5%fn3+vxUnS4+a>pT^#2eKnc(Zu;Wa z5{Zyly)pP%us1It=@s2L^Eip@MRw+&*@DS-JpuvJ4Kj^DWj+LiUQ|!ioA#)xtuNy4 zH+rK*Hk}+V2rG)qSeKGZI#cc_pJ>qejE-%ubXY|VKeddIgM!zfBMpW3GLd{z$0RgHgz)*8u%0WN(Mau literal 0 HcmV?d00001 diff --git a/module/viewer/img/style/37.png b/module/viewer/img/style/37.png new file mode 100644 index 0000000000000000000000000000000000000000..1dc3a679f671013645db63555cfbcc90fd08bc70 GIT binary patch literal 1757 zcmbW0eKeF=9LJyW%$uQ?G2YVdPI*g|B8p-anaOA|Lr9GYsf-*4iG&F=C1ph>lGS>d zMwHSNQ9>z|5V06}8%=1Y8p$-J@$55o&h9_^$L{{_x!-f|x!-%w_j7*dLjBMvu$V$} zBLN5m03hH2K!bn_poUPDO4U?_1XYScB0(e?g+_my7Ns6J{Urt_rYp==n%mf}-(Y9I(PgVEiM-8?;_b7;*Ux`vK*-+EeftlDF=GzJ9*&DY zl90yc96ynMG9%|~F85qs{`rEE(lXv9e);8!8-km+YHDxS)!%>6^6*jX<0ntMU-b0; z(bqp9921Sd62G39oO(0;Vdmqk{FCDI7Zn!*0Ka3w`j1?Am`hF71B{9bp%w>E5RXJH zw?b=ep<;rf2!_@vSZ(L*;_7B~qjfZyPH=P=PS@CG%w$@H_Kob{fu;U0vcJIo<`M#$ zAOdb4hzFbiWsy<<0n8yMxtD^jmo81TbxL>etYTQ6A6uj;w6LkqoXO%IE?-4WsCn-8 zv|P+dY?b+WDl1q_RvKS^>B2mY?O4Mc3f(Ie+up?K5)vu9cDA)gUne(>Z}I@GkeS`O)VWr) zSRd!$=zOh?v?I@^+IBgmj35{AW zhw0d`=aooh1H}Scn!dZba7>44cXL)b@vdP~X#oMq5eP_4l@M<}94?l{h(to7&eZzM z*fK@xQ=$7&hW6CdI_JJKWW$xTC8SXR6V*h&QsJj3J35ZJKO*GIXBA}8wSiMEM_21L zH7z88p09*zDmG_)*+$ z_d$B~SxJR)j+@65vjJj$JdeA_y2Fqy>-S^JdwSixA_J^r3he_kUUspWuxFuYCP3SUD zOPjNUfPSNgj4zSQkz+H7$wWK@TgG$m7nz%RSQYM|95Sa6s0BGR+UZ!zTZ>Is7hcm8 zNITUtT1G=`&2h)gZ}9D$%X9+#nF5Y0E<4v}+{|^x_yVP4`uS|*K%ShcAkUe_d%S2E#g-ljZq(# z%**ox1Q71pmN11KCuFxJ87!B2$oc&6gkVX6?eOVO zv?j~9d)e(^(D*`L+)61a+EF6w6kYsESSo+2h?`D`#S$5yoxGmE0=&XmGZ{krlMxa>mnJ2h23^x78%N}Ks( zUpDPcTySCE5zcl9(7N1V6N)8y`}7q168Hgr5%fn3+vxUnS4+a>pT^#2eKnc(Zu;Wa z5{Zyly)pP%us1It=@s2L^Eip@MRw+&*@DS-JpuvJ4Kj^DWj+LiUQ|!ioA#)xtuNy4 zH+rK*Hk}+V2rG)qSeKGZI#cc_pJ>qejE-%ubXY|VKeddIgM!zfBMpW3GLd{z$0RgHgz)*8u%0WN(Mau literal 0 HcmV?d00001 diff --git a/module/viewer/img/style/38.png b/module/viewer/img/style/38.png new file mode 100644 index 0000000000000000000000000000000000000000..290e574ff960f1d9d510a14c1bd719faa72d0307 GIT binary patch literal 1640 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 S`xVZT#*#bRlisX!U;YD6=%c>? literal 0 HcmV?d00001 diff --git a/module/viewer/img/style/8.png b/module/viewer/img/style/8.png new file mode 100644 index 0000000000000000000000000000000000000000..a8c7b6b59ba83ec86ab2a23e5b94795da4066c03 GIT binary patch literal 791 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<c1}I=;VrF4wW9Q)H;sz?% zD!{d!pzFb!U9xX3zTPI5o8roG<0MW4oqZMDikqloVbuf*=gfJ(V&YTRE(2~ znmD<{#3dx9RMpfqG__1j&CD$#!}niLZAu@nmS=gHsnU_RReSQ&n-RxPpZm+s zJYlD@`UjbdkJrma{80DyRBb~ zADOOf=u+t|@}|p*?cg7KBL{1H-aA>}<776@kK5XIJ!F#Yb%8@gD{lU)IOc9)DQTOr xHcEq8>G5GH)9anOf1GVwin6AClt`MpQ)|id^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<c1}I=;VrF4wW9Q)H;sz?% zD!{d!pzFb!U9xX3zTPI5o8roG<0MW4oqZMDikqloVbuf*=gfJ(V&YTRE(2~ znmD<{#3dx9RMpfqG__1j&CD$#!}nj$YZ4!G>vOzZX>#Jb`E}l>kr9W_Y&VkY zVqdPTzWqvrzeL5M(}%3Ge2r|+emz_n7H05S_e}eu#+N5fzWu5o)6f3H?yIT#$M~+h zdNu9^J3NjXMz~eEN_>4j`RiAehEge!U2A^H&e?T$kJzut$7grs-q@sE#ZO?-Yys@~J~KCb;Cn7qWzcj|95hfRT-J_;#BGNdJZ`)8ua zJU3jAX;N)No$;&MZ~PwLSe7*(IazM+u!+xu{aNTq+xsmnEldK}nspBt?1^Xn?02<4 anjw3RLZ|b*c{)IsFnGH9xvXc~20R3yabv zpFOqmmd|Z(_Ng2zT$0NWSMTS)%}?muPTnv4whRi5r+x`N@O1)umBG{1&t;ucLK6Ul C@QK_2 literal 0 HcmV?d00001 diff --git a/module/viewer/img/white.png b/module/viewer/img/white.png new file mode 100644 index 0000000000000000000000000000000000000000..45cafef25e7aa15104346636d8d88fd3cdf3caa5 GIT binary patch literal 134 zcmeAS@N?(olHy`uVBq!ia0vp^AT}2V8<6ZZI=>f4F%}28J29*~C-V}>VM%xNb!1@J z*w6hZkrl}2EbxddW?8eR=RL1|AH#}JL+>`D_GlfE4sv1V ZXULqzBCyG5$$y|S22WQ%mvv4FO#n~MAF}`e literal 0 HcmV?d00001 diff --git a/module/viewer/img/zoom-minus-mini.png b/module/viewer/img/zoom-minus-mini.png new file mode 100644 index 0000000000000000000000000000000000000000..3f8fe32584897c508c1ad7088a688cb20105e625 GIT binary patch literal 340 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 literal 0 HcmV?d00001 diff --git a/module/viewer/img/zoombar.png b/module/viewer/img/zoombar.png new file mode 100644 index 0000000000000000000000000000000000000000..fca9b491f4b11e887c6bba6ea7ac8442e1b12785 GIT binary patch literal 243 zcmeAS@N?(olHy`uVBq!ia0vp^LJSOy92{&wR?wFvazKiu*vT`50|;t3QaXTq&H|6f zVg?4T4bP0l+XkKh7?1! literal 0 HcmV?d00001 diff --git a/module/viewer/lib/css/prettyPhoto.css b/module/viewer/lib/css/prettyPhoto.css new file mode 100644 index 0000000..7e258f2 --- /dev/null +++ b/module/viewer/lib/css/prettyPhoto.css @@ -0,0 +1,170 @@ +div.pp_default .pp_top,div.pp_default .pp_top .pp_middle,div.pp_default .pp_top .pp_left,div.pp_default .pp_top .pp_right,div.pp_default .pp_bottom,div.pp_default .pp_bottom .pp_left,div.pp_default .pp_bottom .pp_middle,div.pp_default .pp_bottom .pp_right{height:13px} +div.pp_default .pp_top .pp_left{background:url(../../img/prettyPhoto/default/sprite.png) -78px -93px no-repeat} +div.pp_default .pp_top .pp_middle{background:url(../../img/prettyPhoto/default/sprite_x.png) top left repeat-x} +div.pp_default .pp_top .pp_right{background:url(../../img/prettyPhoto/default/sprite.png) -112px -93px no-repeat} +div.pp_default .pp_content .ppt{color:#f8f8f8} +div.pp_default .pp_content_container .pp_left{background:url(../../img/prettyPhoto/default/sprite_y.png) -7px 0 repeat-y;padding-left:13px} +div.pp_default .pp_content_container .pp_right{background:url(../../img/prettyPhoto/default/sprite_y.png) top right repeat-y;padding-right:13px} +div.pp_default .pp_next:hover{background:url(../../img/prettyPhoto/default/sprite_next.png) center right no-repeat;cursor:pointer} +div.pp_default .pp_previous:hover{background:url(../../img/prettyPhoto/default/sprite_prev.png) center left no-repeat;cursor:pointer} +div.pp_default .pp_expand{background:url(../../img/prettyPhoto/default/sprite.png) 0 -29px no-repeat;cursor:pointer;height:28px;width:28px} +div.pp_default .pp_expand:hover{background:url(../../img/prettyPhoto/default/sprite.png) 0 -56px no-repeat;cursor:pointer} +div.pp_default .pp_contract{background:url(../../img/prettyPhoto/default/sprite.png) 0 -84px no-repeat;cursor:pointer;height:28px;width:28px} +div.pp_default .pp_contract:hover{background:url(../../img/prettyPhoto/default/sprite.png) 0 -113px no-repeat;cursor:pointer} +div.pp_default .pp_close{background:url(../../img/prettyPhoto/default/sprite.png) 2px 1px no-repeat;cursor:pointer;height:30px;width:30px} +div.pp_default .pp_gallery ul li a{background:url(../../img/prettyPhoto/default/default_thumb.png) center center #f8f8f8;border:1px solid #aaa} +div.pp_default .pp_social{margin-top:7px} +div.pp_default .pp_gallery a.pp_arrow_previous,div.pp_default .pp_gallery a.pp_arrow_next{left:auto;position:static} +div.pp_default .pp_nav .pp_play,div.pp_default .pp_nav .pp_pause{background:url(../../img/prettyPhoto/default/sprite.png) -51px 1px no-repeat;height:30px;width:30px} +div.pp_default .pp_nav .pp_pause{background-position:-51px -29px} +div.pp_default a.pp_arrow_previous,div.pp_default a.pp_arrow_next{background:url(../../img/prettyPhoto/default/sprite.png) -31px -3px no-repeat;height:20px;margin:4px 0 0;width:20px} +div.pp_default a.pp_arrow_next{background-position:-82px -3px;left:52px} +div.pp_default .pp_content_container .pp_details{margin-top:5px} +div.pp_default .pp_nav{clear:none;height:30px;position:relative;width:110px} +div.pp_default .pp_nav .currentTextHolder{color:#999;font-family:Georgia;font-size:11px;font-style:italic;left:75px;line-height:25px;margin:0;padding:0 0 0 10px;position:absolute;top:2px} +div.pp_default .pp_close:hover,div.pp_default .pp_nav .pp_play:hover,div.pp_default .pp_nav .pp_pause:hover,div.pp_default .pp_arrow_next:hover,div.pp_default .pp_arrow_previous:hover{opacity:0.7} +div.pp_default .pp_description{font-size:11px;font-weight:700;line-height:14px;margin:5px 50px 5px 0} +div.pp_default .pp_bottom .pp_left{background:url(../../img/prettyPhoto/default/sprite.png) -78px -127px no-repeat} +div.pp_default .pp_bottom .pp_middle{background:url(../../img/prettyPhoto/default/sprite_x.png) bottom left repeat-x} +div.pp_default .pp_bottom .pp_right{background:url(../../img/prettyPhoto/default/sprite.png) -112px -127px no-repeat} +div.pp_default .pp_loaderIcon{background:url(../../img/prettyPhoto/default/loader.gif) center center no-repeat} +div.light_rounded .pp_top .pp_left{background:url(../../img/prettyPhoto/light_rounded/sprite.png) -88px -53px no-repeat} +div.light_rounded .pp_top .pp_right{background:url(../../img/prettyPhoto/light_rounded/sprite.png) -110px -53px no-repeat} +div.light_rounded .pp_next:hover{background:url(../../img/prettyPhoto/light_rounded/btnNext.png) center right no-repeat;cursor:pointer} +div.light_rounded .pp_previous:hover{background:url(../../img/prettyPhoto/light_rounded/btnPrevious.png) center left no-repeat;cursor:pointer} +div.light_rounded .pp_expand{background:url(../../img/prettyPhoto/light_rounded/sprite.png) -31px -26px no-repeat;cursor:pointer} +div.light_rounded .pp_expand:hover{background:url(../../img/prettyPhoto/light_rounded/sprite.png) -31px -47px no-repeat;cursor:pointer} +div.light_rounded .pp_contract{background:url(../../img/prettyPhoto/light_rounded/sprite.png) 0 -26px no-repeat;cursor:pointer} +div.light_rounded .pp_contract:hover{background:url(../../img/prettyPhoto/light_rounded/sprite.png) 0 -47px no-repeat;cursor:pointer} +div.light_rounded .pp_close{background:url(../../img/prettyPhoto/light_rounded/sprite.png) -1px -1px no-repeat;cursor:pointer;height:22px;width:75px} +div.light_rounded .pp_nav .pp_play{background:url(../../img/prettyPhoto/light_rounded/sprite.png) -1px -100px no-repeat;height:15px;width:14px} +div.light_rounded .pp_nav .pp_pause{background:url(../../img/prettyPhoto/light_rounded/sprite.png) -24px -100px no-repeat;height:15px;width:14px} +div.light_rounded .pp_arrow_previous{background:url(../../img/prettyPhoto/light_rounded/sprite.png) 0 -71px no-repeat} +div.light_rounded .pp_arrow_next{background:url(../../img/prettyPhoto/light_rounded/sprite.png) -22px -71px no-repeat} +div.light_rounded .pp_bottom .pp_left{background:url(../../img/prettyPhoto/light_rounded/sprite.png) -88px -80px no-repeat} +div.light_rounded .pp_bottom .pp_right{background:url(../../img/prettyPhoto/light_rounded/sprite.png) -110px -80px no-repeat} +div.dark_rounded .pp_top .pp_left{background:url(../../img/prettyPhoto/dark_rounded/sprite.png) -88px -53px no-repeat} +div.dark_rounded .pp_top .pp_right{background:url(../../img/prettyPhoto/dark_rounded/sprite.png) -110px -53px no-repeat} +div.dark_rounded .pp_content_container .pp_left{background:url(../../img/prettyPhoto/dark_rounded/contentPattern.png) top left repeat-y} +div.dark_rounded .pp_content_container .pp_right{background:url(../../img/prettyPhoto/dark_rounded/contentPattern.png) top right repeat-y} +div.dark_rounded .pp_next:hover{background:url(../../img/prettyPhoto/dark_rounded/btnNext.png) center right no-repeat;cursor:pointer} +div.dark_rounded .pp_previous:hover{background:url(../../img/prettyPhoto/dark_rounded/btnPrevious.png) center left no-repeat;cursor:pointer} +div.dark_rounded .pp_expand{background:url(../../img/prettyPhoto/dark_rounded/sprite.png) -31px -26px no-repeat;cursor:pointer} +div.dark_rounded .pp_expand:hover{background:url(../../img/prettyPhoto/dark_rounded/sprite.png) -31px -47px no-repeat;cursor:pointer} +div.dark_rounded .pp_contract{background:url(../../img/prettyPhoto/dark_rounded/sprite.png) 0 -26px no-repeat;cursor:pointer} +div.dark_rounded .pp_contract:hover{background:url(../../img/prettyPhoto/dark_rounded/sprite.png) 0 -47px no-repeat;cursor:pointer} +div.dark_rounded .pp_close{background:url(../../img/prettyPhoto/dark_rounded/sprite.png) -1px -1px no-repeat;cursor:pointer;height:22px;width:75px} +div.dark_rounded .pp_description{color:#fff;margin-right:85px} +div.dark_rounded .pp_nav .pp_play{background:url(../../img/prettyPhoto/dark_rounded/sprite.png) -1px -100px no-repeat;height:15px;width:14px} +div.dark_rounded .pp_nav .pp_pause{background:url(../../img/prettyPhoto/dark_rounded/sprite.png) -24px -100px no-repeat;height:15px;width:14px} +div.dark_rounded .pp_arrow_previous{background:url(../../img/prettyPhoto/dark_rounded/sprite.png) 0 -71px no-repeat} +div.dark_rounded .pp_arrow_next{background:url(../../img/prettyPhoto/dark_rounded/sprite.png) -22px -71px no-repeat} +div.dark_rounded .pp_bottom .pp_left{background:url(../../img/prettyPhoto/dark_rounded/sprite.png) -88px -80px no-repeat} +div.dark_rounded .pp_bottom .pp_right{background:url(../../img/prettyPhoto/dark_rounded/sprite.png) -110px -80px no-repeat} +div.dark_rounded .pp_loaderIcon{background:url(../../img/prettyPhoto/dark_rounded/loader.gif) center center no-repeat} +div.dark_square .pp_left,div.dark_square .pp_middle,div.dark_square .pp_right{background:#000} +div.dark_square .pp_description{color:#fff;margin:0 85px 0 0} +div.dark_square .pp_loaderIcon{background:url(../../img/prettyPhoto/dark_square/loader.gif) center center no-repeat} +div.dark_square .pp_expand{background:url(../../img/prettyPhoto/dark_square/sprite.png) -31px -26px no-repeat;cursor:pointer} +div.dark_square .pp_expand:hover{background:url(../../img/prettyPhoto/dark_square/sprite.png) -31px -47px no-repeat;cursor:pointer} +div.dark_square .pp_contract{background:url(../../img/prettyPhoto/dark_square/sprite.png) 0 -26px no-repeat;cursor:pointer} +div.dark_square .pp_contract:hover{background:url(../../img/prettyPhoto/dark_square/sprite.png) 0 -47px no-repeat;cursor:pointer} +div.dark_square .pp_close{background:url(../../img/prettyPhoto/dark_square/sprite.png) -1px -1px no-repeat;cursor:pointer;height:22px;width:75px} +div.dark_square .pp_nav{clear:none} +div.dark_square .pp_nav .pp_play{background:url(../../img/prettyPhoto/dark_square/sprite.png) -1px -100px no-repeat;height:15px;width:14px} +div.dark_square .pp_nav .pp_pause{background:url(../../img/prettyPhoto/dark_square/sprite.png) -24px -100px no-repeat;height:15px;width:14px} +div.dark_square .pp_arrow_previous{background:url(../../img/prettyPhoto/dark_square/sprite.png) 0 -71px no-repeat} +div.dark_square .pp_arrow_next{background:url(../../img/prettyPhoto/dark_square/sprite.png) -22px -71px no-repeat} +div.dark_square .pp_next:hover{background:url(../../img/prettyPhoto/dark_square/btnNext.png) center right no-repeat;cursor:pointer} +div.dark_square .pp_previous:hover{background:url(../../img/prettyPhoto/dark_square/btnPrevious.png) center left no-repeat;cursor:pointer} +div.light_square .pp_expand{background:url(../../img/prettyPhoto/light_square/sprite.png) -31px -26px no-repeat;cursor:pointer} +div.light_square .pp_expand:hover{background:url(../../img/prettyPhoto/light_square/sprite.png) -31px -47px no-repeat;cursor:pointer} +div.light_square .pp_contract{background:url(../../img/prettyPhoto/light_square/sprite.png) 0 -26px no-repeat;cursor:pointer} +div.light_square .pp_contract:hover{background:url(../../img/prettyPhoto/light_square/sprite.png) 0 -47px no-repeat;cursor:pointer} +div.light_square .pp_close{background:url(../../img/prettyPhoto/light_square/sprite.png) -1px -1px no-repeat;cursor:pointer;height:22px;width:75px} +div.light_square .pp_nav .pp_play{background:url(../../img/prettyPhoto/light_square/sprite.png) -1px -100px no-repeat;height:15px;width:14px} +div.light_square .pp_nav .pp_pause{background:url(../../img/prettyPhoto/light_square/sprite.png) -24px -100px no-repeat;height:15px;width:14px} +div.light_square .pp_arrow_previous{background:url(../../img/prettyPhoto/light_square/sprite.png) 0 -71px no-repeat} +div.light_square .pp_arrow_next{background:url(../../img/prettyPhoto/light_square/sprite.png) -22px -71px no-repeat} +div.light_square .pp_next:hover{background:url(../../img/prettyPhoto/light_square/btnNext.png) center right no-repeat;cursor:pointer} +div.light_square .pp_previous:hover{background:url(../../img/prettyPhoto/light_square/btnPrevious.png) center left no-repeat;cursor:pointer} +div.facebook .pp_top .pp_left{background:url(../../img/prettyPhoto/facebook/sprite.png) -88px -53px no-repeat} +div.facebook .pp_top .pp_middle{background:url(../../img/prettyPhoto/facebook/contentPatternTop.png) top left repeat-x} +div.facebook .pp_top .pp_right{background:url(../../img/prettyPhoto/facebook/sprite.png) -110px -53px no-repeat} +div.facebook .pp_content_container .pp_left{background:url(../../img/prettyPhoto/facebook/contentPatternLeft.png) top left repeat-y} +div.facebook .pp_content_container .pp_right{background:url(../../img/prettyPhoto/facebook/contentPatternRight.png) top right repeat-y} +div.facebook .pp_expand{background:url(../../img/prettyPhoto/facebook/sprite.png) -31px -26px no-repeat;cursor:pointer} +div.facebook .pp_expand:hover{background:url(../../img/prettyPhoto/facebook/sprite.png) -31px -47px no-repeat;cursor:pointer} +div.facebook .pp_contract{background:url(../../img/prettyPhoto/facebook/sprite.png) 0 -26px no-repeat;cursor:pointer} +div.facebook .pp_contract:hover{background:url(../../img/prettyPhoto/facebook/sprite.png) 0 -47px no-repeat;cursor:pointer} +div.facebook .pp_close{background:url(../../img/prettyPhoto/facebook/sprite.png) -1px -1px no-repeat;cursor:pointer;height:22px;width:22px} +div.facebook .pp_description{margin:0 37px 0 0} +div.facebook .pp_loaderIcon{background:url(../../img/prettyPhoto/facebook/loader.gif) center center no-repeat} +div.facebook .pp_arrow_previous{background:url(../../img/prettyPhoto/facebook/sprite.png) 0 -71px no-repeat;height:22px;margin-top:0;width:22px} +div.facebook .pp_arrow_previous.disabled{background-position:0 -96px;cursor:default} +div.facebook .pp_arrow_next{background:url(../../img/prettyPhoto/facebook/sprite.png) -32px -71px no-repeat;height:22px;margin-top:0;width:22px} +div.facebook .pp_arrow_next.disabled{background-position:-32px -96px;cursor:default} +div.facebook .pp_nav{margin-top:0} +div.facebook .pp_nav p{font-size:15px;padding:0 3px 0 4px} +div.facebook .pp_nav .pp_play{background:url(../../img/prettyPhoto/facebook/sprite.png) -1px -123px no-repeat;height:22px;width:22px} +div.facebook .pp_nav .pp_pause{background:url(../../img/prettyPhoto/facebook/sprite.png) -32px -123px no-repeat;height:22px;width:22px} +div.facebook .pp_next:hover{background:url(../../img/prettyPhoto/facebook/btnNext.png) center right no-repeat;cursor:pointer} +div.facebook .pp_previous:hover{background:url(../../img/prettyPhoto/facebook/btnPrevious.png) center left no-repeat;cursor:pointer} +div.facebook .pp_bottom .pp_left{background:url(../../img/prettyPhoto/facebook/sprite.png) -88px -80px no-repeat} +div.facebook .pp_bottom .pp_middle{background:url(../../img/prettyPhoto/facebook/contentPatternBottom.png) top left repeat-x} +div.facebook .pp_bottom .pp_right{background:url(../../img/prettyPhoto/facebook/sprite.png) -110px -80px no-repeat} +div.pp_pic_holder a:focus{outline:none} +div.pp_overlay{background:#000;display:none;left:0;position:absolute;top:0;width:100%;z-index:9500} +div.pp_pic_holder{display:none;position:absolute;width:100px;z-index:10000} +.pp_content{height:40px;min-width:40px} +* html .pp_content{width:40px} +.pp_content_container{position:relative;text-align:left;width:100%} +.pp_content_container .pp_left{padding-left:20px} +.pp_content_container .pp_right{padding-right:20px} +.pp_content_container .pp_details{float:left;margin:10px 0 2px} +.pp_description{display:none;margin:0} +.pp_social{float:left;margin:0} +.pp_social .facebook{float:left;margin-left:5px;overflow:hidden;width:55px} +.pp_social .twitter{float:left} +.pp_nav{clear:right;float:left;margin:3px 10px 0 0} +.pp_nav p{float:left;margin:2px 4px;white-space:nowrap} +.pp_nav .pp_play,.pp_nav .pp_pause{float:left;margin-right:4px;text-indent:-10000px} +a.pp_arrow_previous,a.pp_arrow_next{display:block;float:left;height:15px;margin-top:3px;overflow:hidden;text-indent:-10000px;width:14px} +.pp_hoverContainer{position:absolute;top:0;width:100%;z-index:2000} +.pp_gallery{display:none;left:50%;margin-top:-50px;position:absolute;z-index:10000} +.pp_gallery div{float:left;overflow:hidden;position:relative} +.pp_gallery ul{float:left;height:35px;margin:0 0 0 5px;padding:0;position:relative;white-space:nowrap} +.pp_gallery ul a{border:1px rgba(0,0,0,0.5) solid;display:block;float:left;height:33px;overflow:hidden} +.pp_gallery ul a img{border:0} +.pp_gallery li{display:block;float:left;margin:0 5px 0 0;padding:0} +.pp_gallery li.default a{background:url(../../img/prettyPhoto/facebook/default_thumbnail.gif) 0 0 no-repeat;display:block;height:33px;width:50px} +.pp_gallery .pp_arrow_previous,.pp_gallery .pp_arrow_next{margin-top:7px!important} +a.pp_next{background:url(../../img/prettyPhoto/light_rounded/btnNext.png) 10000px 10000px no-repeat;display:block;float:right;height:100%;text-indent:-10000px;width:49%} +a.pp_previous{background:url(../../img/prettyPhoto/light_rounded/btnNext.png) 10000px 10000px no-repeat;display:block;float:left;height:100%;text-indent:-10000px;width:49%} +a.pp_expand,a.pp_contract{cursor:pointer;display:none;height:20px;position:absolute;right:30px;text-indent:-10000px;top:10px;width:20px;z-index:20000} +a.pp_close{display:block;line-height:22px;position:absolute;right:0;text-indent:-10000px;top:0} +.pp_loaderIcon{display:block;height:24px;left:50%;margin:-12px 0 0 -12px;position:absolute;top:50%;width:24px} +#pp_full_res{line-height:1!important} +#pp_full_res .pp_inline{text-align:left} +#pp_full_res .pp_inline p{margin:0 0 15px} +div.ppt{color:#fff;display:none;font-size:17px;margin:0 0 5px 15px;z-index:9999} +div.pp_default .pp_content,div.light_rounded .pp_content{background-color:#fff} +div.pp_default #pp_full_res .pp_inline,div.light_rounded .pp_content .ppt,div.light_rounded #pp_full_res .pp_inline,div.light_square .pp_content .ppt,div.light_square #pp_full_res .pp_inline,div.facebook .pp_content .ppt,div.facebook #pp_full_res .pp_inline{color:#000} +div.pp_default .pp_gallery ul li a:hover,div.pp_default .pp_gallery ul li.selected a,.pp_gallery ul a:hover,.pp_gallery li.selected a{border-color:#fff} +div.pp_default .pp_details,div.light_rounded .pp_details,div.dark_rounded .pp_details,div.dark_square .pp_details,div.light_square .pp_details,div.facebook .pp_details{position:relative} +div.light_rounded .pp_top .pp_middle,div.light_rounded .pp_content_container .pp_left,div.light_rounded .pp_content_container .pp_right,div.light_rounded .pp_bottom .pp_middle,div.light_square .pp_left,div.light_square .pp_middle,div.light_square .pp_right,div.light_square .pp_content,div.facebook .pp_content{background:#fff} +div.light_rounded .pp_description,div.light_square .pp_description{margin-right:85px} +div.light_rounded .pp_gallery a.pp_arrow_previous,div.light_rounded .pp_gallery a.pp_arrow_next,div.dark_rounded .pp_gallery a.pp_arrow_previous,div.dark_rounded .pp_gallery a.pp_arrow_next,div.dark_square .pp_gallery a.pp_arrow_previous,div.dark_square .pp_gallery a.pp_arrow_next,div.light_square .pp_gallery a.pp_arrow_previous,div.light_square .pp_gallery a.pp_arrow_next{margin-top:12px!important} +div.light_rounded .pp_arrow_previous.disabled,div.dark_rounded .pp_arrow_previous.disabled,div.dark_square .pp_arrow_previous.disabled,div.light_square .pp_arrow_previous.disabled{background-position:0 -87px;cursor:default} +div.light_rounded .pp_arrow_next.disabled,div.dark_rounded .pp_arrow_next.disabled,div.dark_square .pp_arrow_next.disabled,div.light_square .pp_arrow_next.disabled{background-position:-22px -87px;cursor:default} +div.light_rounded .pp_loaderIcon,div.light_square .pp_loaderIcon{background:url(../../img/prettyPhoto/light_rounded/loader.gif) center center no-repeat} +div.dark_rounded .pp_top .pp_middle,div.dark_rounded .pp_content,div.dark_rounded .pp_bottom .pp_middle{background:url(../../img/prettyPhoto/dark_rounded/contentPattern.png) top left repeat} +div.dark_rounded .currentTextHolder,div.dark_square .currentTextHolder{color:#c4c4c4} +div.dark_rounded #pp_full_res .pp_inline,div.dark_square #pp_full_res .pp_inline{color:#fff} +.pp_top,.pp_bottom{height:20px;position:relative} +* html .pp_top,* html .pp_bottom{padding:0 20px} +.pp_top .pp_left,.pp_bottom .pp_left{height:20px;left:0;position:absolute;width:20px} +.pp_top .pp_middle,.pp_bottom .pp_middle{height:20px;left:20px;position:absolute;right:20px} +* html .pp_top .pp_middle,* html .pp_bottom .pp_middle{left:0;position:static} +.pp_top .pp_right,.pp_bottom .pp_right{height:20px;left:auto;position:absolute;right:0;top:0;width:20px} +.pp_fade,.pp_gallery li.default a img{display:none} \ No newline at end of file diff --git a/module/viewer/lib/css/style.css b/module/viewer/lib/css/style.css new file mode 100644 index 0000000..8f1571e --- /dev/null +++ b/module/viewer/lib/css/style.css @@ -0,0 +1,696 @@ +div.olMap { + z-index: 0; + padding: 0px!important; + margin: 0px!important; + cursor: default; +} + +div.olMapViewport { + text-align: left; +} + +div.olLayerDiv { + -moz-user-select: none; +} + +.olLayerGoogleCopyright { + left: 2px; + bottom: 2px; +} +.olLayerGooglePoweredBy { + left: 2px; + bottom: 15px; +} +.olControlAttribution { + font-size: smaller; + right: 3px; + bottom: 4.5em; + position: absolute; + display: block; +} +.olControlScale { + left: 70px; + bottom: 10px; + display: block; + position: absolute; + font-size: smaller; +} +.olControlScaleLine { + display: block; + position: absolute; + left: 10px; + bottom: 15px; + font-size: xx-small; +} +.olControlScaleLineBottom { + border: solid 2px black; + border-bottom: none; + margin-top:-2px; + text-align: center; +} +.olControlScaleLineTop { + border: solid 2px black; + border-top: none; + text-align: center; +} + +.olControlPermalink { + right: 3px; + bottom: 1.5em; + display: block; + position: absolute; + font-size: smaller; +} + +div.olControlMousePosition { + bottom: 0em; + right: 3px; + display: block; + position: absolute; + font-family: Arial; + font-size: smaller; +} + +.olControlOverviewMapContainer { + position: absolute; + bottom: 0px; + right: 0px; +} + +.olControlOverviewMapElement { + padding: 10px 18px 10px 10px; + background-color: #00008B; + -moz-border-radius: 1em 0 0 0; +} + +.olControlOverviewMapMinimizeButton { + right: 0px; + bottom: 80px; +} + +.olControlOverviewMapMaximizeButton { + right: 0px; + bottom: 80px; +} + +.olControlOverviewMapExtentRectangle { + overflow: hidden; + background-image: url("../../img/blank.gif"); + cursor: move; + border: 2px dotted red; +} +.olControlOverviewMapRectReplacement { + overflow: hidden; + cursor: move; + background-image: url("../../img/overview_replacement.gif"); + background-repeat: no-repeat; + background-position: center; +} + +.olLayerGeoRSSDescription { + float:left; + width:100%; + overflow:auto; + font-size:1.0em; +} +.olLayerGeoRSSClose { + float:right; + color:gray; + font-size:1.2em; + margin-right:6px; + font-family:sans-serif; +} +.olLayerGeoRSSTitle { + float:left;font-size:1.2em; +} + +.olPopupContent { + padding:5px; + overflow: auto; +} +.olControlNavToolbar { + width:0px; + height:0px; +} +.olControlNavToolbar div { + display:block; + width: 28px; + height: 28px; + top: 300px; + left: 6px; + position: relative; +} + +.olControlNavigationHistory { + background-image: url("../../img/navigation_history.png"); + background-repeat: no-repeat; + width: 24px; + height: 24px; + +} +.olControlNavigationHistoryPreviousItemActive { + background-position: 0px 0px; +} +.olControlNavigationHistoryPreviousItemInactive { + background-position: 0px -24px; +} +.olControlNavigationHistoryNextItemActive { + background-position: -24px 0px; +} +.olControlNavigationHistoryNextItemInactive { + background-position: -24px -24px; +} + +.olControlNavToolbar .olControlNavigationItemActive { + background-image: url("../../img/panning-hand-on.png"); + background-repeat: no-repeat; +} +.olControlNavToolbar .olControlNavigationItemInactive { + background-image: url("../../img/panning-hand-off.png"); + background-repeat: no-repeat; +} +.olControlNavToolbar .olControlZoomBoxItemActive { + background-image: url("../../img/drag-rectangle-on.png"); + background-color: orange; + background-repeat: no-repeat; +} +.olControlNavToolbar .olControlZoomBoxItemInactive { + background-image: url("../../img/drag-rectangle-off.png"); + background-repeat: no-repeat; +} +.olControlEditingToolbar { + float:right; + right: 0px; + height: 30px; + width: 200px; +} +.olControlEditingToolbar div { + background-image: url("../../img/editing_tool_bar.png"); + background-repeat: no-repeat; + float:right; + width: 24px; + height: 24px; + margin: 5px; +} +.olControlEditingToolbar .olControlNavigationItemActive { + background-position: -103px -23px; +} +.olControlEditingToolbar .olControlNavigationItemInactive { + background-position: -103px -0px; +} +.olControlEditingToolbar .olControlDrawFeaturePointItemActive { + background-position: -77px -23px; +} +.olControlEditingToolbar .olControlDrawFeaturePointItemInactive { + background-position: -77px -0px; +} +.olControlEditingToolbar .olControlDrawFeaturePathItemInactive { + background-position: -51px 0px; +} +.olControlEditingToolbar .olControlDrawFeaturePathItemActive { + background-position: -51px -23px; +} +.olControlEditingToolbar .olControlDrawFeaturePolygonItemInactive { + background-position: -26px 0px; +} +.olControlEditingToolbar .olControlDrawFeaturePolygonItemActive { + background-position: -26px -23px ; +} +div.olControlSaveFeaturesItemActive { + background-image: url(../../img/save_features_on.png); + background-repeat: no-repeat; + background-position: 0px 1px; +} +div.olControlSaveFeaturesItemInactive { + background-image: url(../../img/save_features_off.png); + background-repeat: no-repeat; + background-position: 0px 1px; +} + +div.olControlDeleteFeatureItemActive { + background-image: url(../../img/remove_point_on.png); + background-repeat: no-repeat; + background-position: 0px 1px; +} +div.olControlDeleteFeatureItemInactive { + background-image: url(../../img/remove_point_off.png); + background-repeat: no-repeat; + background-position: 0px 1px; +} + +.olHandlerBoxZoomBox { + border: 2px solid red; + position: absolute; + background-color: white; + opacity: 0.50; + font-size: 1px; + filter: alpha(opacity=50); +} +.olHandlerBoxSelectFeature { + border: 2px solid blue; + position: absolute; + background-color: white; + opacity: 0.50; + font-size: 1px; + filter: alpha(opacity=50); +} + +.olControlPanPanel { + top: 10px; + left: 5px; +} + +.olControlPanPanel div { + background-image: url(../../img/pan-panel.png); + height: 18px; + width: 18px; + cursor: pointer; + position: absolute; +} + +.olControlPanPanel .olControlPanNorthItemInactive { + top: 0px; + left: 9px; + background-position: 0px 0px; +} +.olControlPanPanel .olControlPanSouthItemInactive { + top: 36px; + left: 9px; + background-position: 18px 0px; +} +.olControlPanPanel .olControlPanWestItemInactive { + position: absolute; + top: 18px; + left: 0px; + background-position: 0px 18px; +} +.olControlPanPanel .olControlPanEastItemInactive { + top: 18px; + left: 18px; + background-position: 18px 18px; +} + +.olControlZoomPanel { + top: 71px; + left: 14px; +} + +.olControlZoomPanel div { + background-image: url(../../img/zoom-panel.png); + position: absolute; + height: 18px; + width: 18px; + cursor: pointer; +} + +.olControlZoomPanel .olControlZoomInItemInactive { + top: 0px; + left: 0px; + background-position: 0px 0px; +} + +.olControlZoomPanel .olControlZoomToMaxExtentItemInactive { + top: 18px; + left: 0px; + background-position: 0px -18px; +} + +.olControlZoomPanel .olControlZoomOutItemInactive { + top: 36px; + left: 0px; + background-position: 0px 18px; +} + +.olPopupCloseBox { + background: url("../../img/close.gif") no-repeat; + cursor: pointer; +} + +.olFramedCloudPopupContent { + padding: 5px; + overflow: auto; +} + +.olControlNoSelect { + -moz-user-select: none; +} + +.olImageLoadError { + background-color: pink; + opacity: 0.5; + filter: alpha(opacity=50); /* IE */ +} + +/** + * Cursor styles +*/ + +.olCursorWait { + cursor: wait; +} +.olDragDown { + cursor: move; +} +.olDrawBox { + cursor: crosshair; +} +.olControlDragFeatureOver { + cursor: move; +} +.olControlDragFeatureActive.olControlDragFeatureOver.olDragDown { + cursor: -moz-grabbing; +} + +/** + * Layer switcher +*/ +.olControlLayerSwitcher { + position: absolute; + top: 25px; + right: 0px; + width: 20em; + font-family: sans-serif; + font-weight: bold; + margin-top: 3px; + margin-left: 3px; + margin-bottom: 3px; + font-size: smaller; + color: white; + background-color: transparent; +} + +.olControlLayerSwitcher .layersDiv { + padding-top: 5px; + padding-left: 10px; + padding-bottom: 5px; + padding-right: 75px; + background-color: darkblue; + width: 100%; + height: 100%; +} + +.olControlLayerSwitcher .layersDiv .baseLbl, +.olControlLayerSwitcher .layersDiv .dataLbl { + margin-top: 3px; + margin-left: 3px; + margin-bottom: 3px; +} + +.olControlLayerSwitcher .layersDiv .baseLayersDiv, +.olControlLayerSwitcher .layersDiv .dataLayersDiv { + padding-left: 10px; +} + +.olControlLayerSwitcher .maximizeDiv, +.olControlLayerSwitcher .minimizeDiv { + top: 5px; + right: 0px; +} + +.customEditingToolbar { + float: right; + right: 0px; + height: 30px; + width: 220px; +} +.customEditingToolbar div { + float: right; + margin: 5px; + width: 24px; + height: 24px; +} + + + + + + + + + + + + + + + + + + + + + + + + + +/** +VRCH INDEX +*/ + +body +{ + font-family: Arial, Helvetica, sans-serif; + font-size: 80%; + color: white; +} + +p +{ + margin: 0; +} +.olControlPanel +{ + margin: 0px; + padding: 2px 0px 2px 0px; + + +} +.olControlPanel div +{ + + display:block; + width: 24px; + height: 24px; + float: left; /* remove this if you want a vertical toolbar */ + margin: 0px 2px 0px 2px; + + +} +.olControlPanel .olControlPanMapItemActive +{ + background-image: url("../../img/pan-on.png"); +} +.olControlPanel .olControlPanMapItemInactive +{ + background-image: url("../../img/pan-off.png"); +} +.olControlPanel .olControlZoomBoxItemInactive +{ + background-image: url("../../img/drag-rectangle-off.png"); +} +.olControlPanel .olControlZoomBoxItemActive +{ + background-image: url("../../img/drag-rectangle-on.png"); +} +.olControlPanel .olControlZoomToMaxExtentItemInactive +{ + background-image: url("../../img/zoom-world-mini.png"); +} +.olControlPanel .olControlFeatureInfoItemActive +{ + background-image: url("../../img/query_mode_on.png"); +} +.olControlPanel .olControlFeatureInfoItemInactive +{ + background-image: url("../../img/query_mode_off.png"); +} +.olControlPanel .olControlKnItemActive +{ + background-image: url("../../img/kn_on.png"); +} +.olControlPanel .olControlKnItemInactive +{ + background-image: url("../../img/kn_off.png"); +} +.olControlPanel .olControlZoomOutBoxItemActive +{ + background-image: url("../../img/zoom_out_on.png"); +} +.olControlPanel .olControlZoomOutBoxItemInactive +{ + background-image: url("../../img/zoom_out_off.png"); +} +.olControlPanel .olControlMeasureDistanceItemInactive +{ + background-image: url( "../../img/distance_off.png" ); +} +.olControlPanel .olControlMeasureDistanceItemActive +{ + background-image: url( "../../img/distance_on.png" ); +} +.olControlPanel .olControlMeasureAreaItemActive +{ + background-image: url( "../../img/area_on.png" ); +} +.olControlPanel .olControlMeasureAreaItemInactive +{ + background-image: url( "../../img/area_off.png" ); +} +#mapStatus +{ + + +} +#mapStatus div +{ + float: left; + display: inline-block; + padding: 4px 6px 4px 6px; +} +#mapOutput sup +{ + height: 0; + line-height: 1; + vertical-align: text-top; + _vertical-align: text-top; + position: relative; + font-size: 8px; +} +.olControlEditingToolbar +{ + float:left; + width: 116px; +} + +/** +spodek index +*/ +body{ + margin:0; + padding:0; + border:0; +} + + +#panel{ + +} + +html, body, #map{ + width:100%; + height:100%; +} + +/* +#toolbar{ + top:0; + margin:0; + padding:0; + + height: 3em; + + width: 100%; + background-color: lightblue; + z-index:999; +} +#tabMenuContent{ + display: block; + visibility: visible; + position: absolute; + right: 0.9em; + top: 4em; + width: 300px; + overflow: auto; + z-index:999; + background-color: lightblue; +} +.tabMenu{ + float:right; + width: 300px; +} +.tabMenu td{ + cursor: pointer; + width: 30%; + display: inline; + padding:0.3em; +} +.tabMenu td:hover{ + font-weight: bold; +} + + + +*/ + + + +#menu{ + position: absolute; + top: 0; + right: 0; + bottom: 0; + height: 100%; + z-index: 1666; +} +#toolbar{ + text-align: center; + background-color: rgb(255,199,52); + width: 300px; +} +.tabMenuContent{ + display: none; + overflow: auto; + padding: 5px; +} +#tabMenuContent:hover{ + opacity: 1; +} +td#tabMenuContent{ + opacity: 0.5; + vertical-align: top; + width: 268px; + z-index: 1666; + background-color: rgb(100,157,220); +} +#menuList{ + vertical-align: top; + height: 100%; + width: 30px; + background-color: rgb(17,47,81); + z-index: 1666; + margin: 0; + padding: 0; + border: 0; +} + + + +.menuItem ul{ + margin: 0; + padding: 0; + width: 100%; +} +.menuItem li{ + width: 100%; + display: block; + height: 95px; + cursor: pointer; + border: #00008B; + background-position: center; + background-repeat: no-repeat; + font-size: 0em; + margin: 0; + padding: 0; +} +.menuItem li:hover{ + background-color: rgb(49,110,184); +} + + +.menuItem li.active{ + background-color: rgb(49,110,184); +} + + +a { color:white; } \ No newline at end of file diff --git a/module/viewer/lib/js/defs/EPSG102067.js b/module/viewer/lib/js/defs/EPSG102067.js new file mode 100644 index 0000000..d2ade71 --- /dev/null +++ b/module/viewer/lib/js/defs/EPSG102067.js @@ -0,0 +1 @@ +Proj4js.defs["ESRI:102067"] = "+proj=krovak +lat_0=49.5 +lon_0=24.83333333333333 +alpha=30.28813975277778 +k=0.9999 +x_0=0 +y_0=0 +ellps=bessel +units=m +no_defs"; \ No newline at end of file diff --git a/module/viewer/lib/js/defs/EPSG102757.js b/module/viewer/lib/js/defs/EPSG102757.js new file mode 100644 index 0000000..4685c21 --- /dev/null +++ b/module/viewer/lib/js/defs/EPSG102757.js @@ -0,0 +1 @@ +Proj4js.defs["EPSG:102757"] = "+title=NAD 1983 StatePlane Wyoming West Central FIPS 4903 Feet +proj=tmerc +lat_0=40.5 +lon_0=-108.75 +x_0=600000.0 +y_0=0 +k=0.999938 +a=6378137.0 +b=6356752.3141403 +to_meter=0.3048006096012192"; diff --git a/module/viewer/lib/js/defs/EPSG102758.js b/module/viewer/lib/js/defs/EPSG102758.js new file mode 100644 index 0000000..ba07ea2 --- /dev/null +++ b/module/viewer/lib/js/defs/EPSG102758.js @@ -0,0 +1 @@ +Proj4js.defs["EPSG:102758"] = "+title=NAD 1983 StatePlane Wyoming West FIPS 4904 Feet +proj=tmerc +lat_0=40.5 +lon_0=-110.0833333333333 +x_0=800000 +y_0=100000 +k=0.999938 +a=6378137.0 +b=6356752.3141403 +to_meter=0.3048006096012192"; diff --git a/module/viewer/lib/js/defs/EPSG21781.js b/module/viewer/lib/js/defs/EPSG21781.js new file mode 100644 index 0000000..c81c87a --- /dev/null +++ b/module/viewer/lib/js/defs/EPSG21781.js @@ -0,0 +1 @@ +Proj4js.defs["EPSG:21781"] = "+title=CH1903 / LV03 +proj=somerc +lat_0=46.95240555555556 +lon_0=7.439583333333333 +x_0=600000 +y_0=200000 +ellps=bessel +towgs84=674.374,15.056,405.346,0,0,0,0 +units=m +no_defs"; diff --git a/module/viewer/lib/js/defs/EPSG26591.js b/module/viewer/lib/js/defs/EPSG26591.js new file mode 100644 index 0000000..1af0255 --- /dev/null +++ b/module/viewer/lib/js/defs/EPSG26591.js @@ -0,0 +1 @@ +Proj4js.defs["EPSG:26591"] = "+title= Monte Mario (Rome) / Italy zone 1 EPSG:26591 +proj=tmerc +lat_0=0 +lon_0=-3.45233333333333 +from_greenwich=12.45233333333333 +k=0.999600 +x_0=1500000 +y_0=0 +a=6378388.0, +b=6356911.94612795 +units=m"; diff --git a/module/viewer/lib/js/defs/EPSG26912.js b/module/viewer/lib/js/defs/EPSG26912.js new file mode 100644 index 0000000..ee8473c --- /dev/null +++ b/module/viewer/lib/js/defs/EPSG26912.js @@ -0,0 +1 @@ +Proj4js.defs["EPSG26912"] = "+title=NAD83 / UTM zone 12N +proj=utm +zone=12 +a=6378137.0 +b=6356752.3141403"; diff --git a/module/viewer/lib/js/defs/EPSG27200.js b/module/viewer/lib/js/defs/EPSG27200.js new file mode 100644 index 0000000..5f0ea89 --- /dev/null +++ b/module/viewer/lib/js/defs/EPSG27200.js @@ -0,0 +1,5 @@ +Proj4js.defs["EPSG:27200"] = "+title=New Zealand Map Grid\ + +proj=nzmg \ + +lat_0=-41 +lon_0=173 \ + +x_0=2510000 +y_0=6023150 \ + +ellps=intl +datum=nzgd49 +units=m +no_defs" diff --git a/module/viewer/lib/js/defs/EPSG27563.js b/module/viewer/lib/js/defs/EPSG27563.js new file mode 100644 index 0000000..d798a14 --- /dev/null +++ b/module/viewer/lib/js/defs/EPSG27563.js @@ -0,0 +1 @@ +Proj4js.defs["EPSG:27563"]="+title=NTF (Paris)/Lambert Sud France +proj=lcc +lat_1=44.10000000000001 +lat_0=44.10000000000001 +lon_0=0 +k_0=0.9998774990000001 +x_0=600000 +y_0=200000 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +no_defs "; diff --git a/module/viewer/lib/js/defs/EPSG41001.js b/module/viewer/lib/js/defs/EPSG41001.js new file mode 100644 index 0000000..65db921 --- /dev/null +++ b/module/viewer/lib/js/defs/EPSG41001.js @@ -0,0 +1 @@ +Proj4js.defs["EPSG:41001"] = "+title=simple mercator EPSG:41001 +proj=merc +lat_ts=0 +lon_0=0 +k=1.000000 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m"; diff --git a/module/viewer/lib/js/defs/EPSG4139.js b/module/viewer/lib/js/defs/EPSG4139.js new file mode 100644 index 0000000..1f543df --- /dev/null +++ b/module/viewer/lib/js/defs/EPSG4139.js @@ -0,0 +1 @@ +Proj4js.defs["EPSG:4139"] = "+title=Puerto Rico EPSG:4139 (3 param datum shift) +proj=longlat +towgs84 = 11,72,-101,0,0,0,0 +a=6378206.4 +b=6356583.8"; diff --git a/module/viewer/lib/js/defs/EPSG4181.js b/module/viewer/lib/js/defs/EPSG4181.js new file mode 100644 index 0000000..5804a3b --- /dev/null +++ b/module/viewer/lib/js/defs/EPSG4181.js @@ -0,0 +1 @@ +Proj4js.defs["EPSG:4181"] = "+title=Luxembourg 1930 EPSG:4181 (7 param datum shift) +proj=longlat +towgs84=-193,13.7,-39.3,-0.41,-2.933,2.688,0.43 +a=6378388.0, +b=6356911.94612795"; diff --git a/module/viewer/lib/js/defs/EPSG42304.js b/module/viewer/lib/js/defs/EPSG42304.js new file mode 100644 index 0000000..91a220e --- /dev/null +++ b/module/viewer/lib/js/defs/EPSG42304.js @@ -0,0 +1 @@ +Proj4js.defs["EPSG:42304"]="+title=Atlas of Canada, LCC +proj=lcc +lat_1=49 +lat_2=77 +lat_0=49 +lon_0=-95 +x_0=0 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs"; \ No newline at end of file diff --git a/module/viewer/lib/js/defs/EPSG4272.js b/module/viewer/lib/js/defs/EPSG4272.js new file mode 100644 index 0000000..55cda90 --- /dev/null +++ b/module/viewer/lib/js/defs/EPSG4272.js @@ -0,0 +1 @@ +Proj4js.defs["EPSG:4272"] = "+title=NZGD49 +proj=longlat +ellps=intl +datum=nzgd49 +no_defs "; diff --git a/module/viewer/lib/js/defs/EPSG4302.js b/module/viewer/lib/js/defs/EPSG4302.js new file mode 100644 index 0000000..4c875da --- /dev/null +++ b/module/viewer/lib/js/defs/EPSG4302.js @@ -0,0 +1,2 @@ +Proj4js.defs["EPSG:4302"] = "+title=Trinidad 1903 EPSG:4302 (7 param datum shift) +proj=longlat +a=6378293.63683822 +b=6356617.979337744 +towgs84=-61.702,284.488,472.052,0,0,0,0"; + diff --git a/module/viewer/lib/js/defs/EPSG900913.js b/module/viewer/lib/js/defs/EPSG900913.js new file mode 100644 index 0000000..d129b48 --- /dev/null +++ b/module/viewer/lib/js/defs/EPSG900913.js @@ -0,0 +1,5 @@ +// Google Mercator projection +// Used in combination with GoogleMercator layer type in OpenLayers +//+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0 +k=1.0 +units=m +nadgrids=@null +no_defs + +Proj4js.defs["EPSG:900913"]= "+title=GoogleMercator +proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0 +k=1.0 +units=m +nadgrids=@null +no_defs"; diff --git a/module/viewer/lib/js/defs/EPSG900913.txt b/module/viewer/lib/js/defs/EPSG900913.txt new file mode 100644 index 0000000..54016a4 --- /dev/null +++ b/module/viewer/lib/js/defs/EPSG900913.txt @@ -0,0 +1,11 @@ +// Google Mercator projection +// Used in combination with GoogleMercator layer type in OpenLayers +//+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0 +k=1.0 +units=m +nadgrids=@null +no_defs + +csList.EPSG900913= "\ + +title= Google Mercator EPSG:900913\ + +proj=merc +a=6378137 +b=6378137 \ + +lat_ts=0.0 +lon_0=0.0 \ + +x_0=0.0 +y_0=0 +k=1.0 \ + +units=m +nadgrids=@null +no_defs \ +"; diff --git a/module/viewer/lib/js/defs/GOOGLE.js b/module/viewer/lib/js/defs/GOOGLE.js new file mode 100644 index 0000000..cdb075a --- /dev/null +++ b/module/viewer/lib/js/defs/GOOGLE.js @@ -0,0 +1,2 @@ +Proj4js.defs["GOOGLE"]="+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0 +k=1.0 +units=m +nadgrids=@null +no_defs"; +Proj4js.defs["EPSG:900913"]=Proj4js.defs["GOOGLE"]; diff --git a/module/viewer/lib/js/jquery.js b/module/viewer/lib/js/jquery.js new file mode 100644 index 0000000..eb6a596 --- /dev/null +++ b/module/viewer/lib/js/jquery.js @@ -0,0 +1,18 @@ +/*! + * jQuery JavaScript Library v1.6.1 + * 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: Thu May 12 15:04:36 2011 -0400 + */ +(function(a,b){function cy(a){return f.isWindow(a)?a:a.nodeType===9?a.defaultView||a.parentWindow:!1}function cv(a){if(!cj[a]){var b=f("<"+a+">").appendTo("body"),d=b.css("display");b.remove();if(d==="none"||d===""){ck||(ck=c.createElement("iframe"),ck.frameBorder=ck.width=ck.height=0),c.body.appendChild(ck);if(!cl||!ck.createElement)cl=(ck.contentWindow||ck.contentDocument).document,cl.write("");b=cl.createElement(a),cl.body.appendChild(b),d=f.css(b,"display"),c.body.removeChild(ck)}cj[a]=d}return cj[a]}function cu(a,b){var c={};f.each(cp.concat.apply([],cp.slice(0,b)),function(){c[this]=a});return c}function ct(){cq=b}function cs(){setTimeout(ct,0);return cq=f.now()}function ci(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}function ch(){try{return new a.XMLHttpRequest}catch(b){}}function cb(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=0===c})}function W(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function O(a,b){return(a&&a!=="*"?a+".":"")+b.replace(A,"`").replace(B,"&")}function N(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;ic)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 L(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 F(){return!0}function E(){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-$2").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 H(){if(!e.isReady){try{c.documentElement.doScroll("left")}catch(a){setTimeout(H,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=d.userAgent,x,y,z,A=Object.prototype.toString,B=Object.prototype.hasOwnProperty,C=Array.prototype.push,D=Array.prototype.slice,E=String.prototype.trim,F=Array.prototype.indexOf,G={};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.1",length:0,size:function(){return this.length},toArray:function(){return D.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)?C.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(),y.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(D.apply(this,arguments),"slice",D.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:C,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(;j0)return;y.resolveWith(c,[e]),e.fn.trigger&&e(c).trigger("ready").unbind("ready")}},bindReady:function(){if(!y){y=e._Deferred();if(c.readyState==="complete")return setTimeout(e.ready,1);if(c.addEventListener)c.addEventListener("DOMContentLoaded",z,!1),a.addEventListener("load",e.ready,!1);else if(c.attachEvent){c.attachEvent("onreadystatechange",z),a.attachEvent("onload",e.ready);var b=!1;try{b=a.frameElement==null}catch(d){}c.documentElement.doScroll&&b&&H()}}},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):G[A.call(a)]||"object"},isPlainObject:function(a){if(!a||e.type(a)!=="object"||a.nodeType||e.isWindow(a))return!1;if(a.constructor&&!B.call(a,"constructor")&&!B.call(a.constructor.prototype,"isPrototypeOf"))return!1;var c;for(c in a);return c===b||B.call(a,c)},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(b,c,d){a.DOMParser?(d=new DOMParser,c=d.parseFromString(b,"text/xml")):(c=new ActiveXObject("Microsoft.XMLDOM"),c.async="false",c.loadXML(b)),d=c.documentElement,(!d||!d.nodeName||d.nodeName==="parsererror")&&e.error("Invalid XML: "+b);return c},noop:function(){},globalEval:function(b){b&&j.test(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},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(;g0&&a[0]&&a[j-1]||j===0||e.isArray(a));if(k)for(;i1?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
    a",d=a.getElementsByTagName("*"),e=a.getElementsByTagName("a")[0];if(!d||!d.length||!e)return{};f=c.createElement("select"),g=f.appendChild(c.createElement("option")),h=a.getElementsByTagName("input")[0],j={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:h.value==="on",optSelected:g.selected,getSetAttribute:a.className!=="t",submitBubbles:!0,changeBubbles:!0,focusinBubbles:!1,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0},h.checked=!0,j.noCloneChecked=h.cloneNode(!0).checked,f.disabled=!0,j.optDisabled=!g.disabled;try{delete a.test}catch(s){j.deleteExpando=!1}!a.addEventListener&&a.attachEvent&&a.fireEvent&&(a.attachEvent("onclick",function b(){j.noCloneEvent=!1,a.detachEvent("onclick",b)}),a.cloneNode(!0).fireEvent("onclick")),h=c.createElement("input"),h.value="t",h.setAttribute("type","radio"),j.radioValue=h.value==="t",h.setAttribute("checked","checked"),a.appendChild(h),k=c.createDocumentFragment(),k.appendChild(a.firstChild),j.checkClone=k.cloneNode(!0).cloneNode(!0).lastChild.checked,a.innerHTML="",a.style.width=a.style.paddingLeft="1px",l=c.createElement("body"),m={visibility:"hidden",width:0,height:0,border:0,margin:0,background:"none"};for(q in m)l.style[q]=m[q];l.appendChild(a),b.insertBefore(l,b.firstChild),j.appendChecked=h.checked,j.boxModel=a.offsetWidth===2,"zoom"in a.style&&(a.style.display="inline",a.style.zoom=1,j.inlineBlockNeedsLayout=a.offsetWidth===2,a.style.display="",a.innerHTML="