From 2202503b19459f4f2ee666076ad108cd68073a56 Mon Sep 17 00:00:00 2001 From: virgil1985 Date: Thu, 19 Dec 2024 13:50:13 +0200 Subject: [PATCH] * release v1.0.0 --- .dbconnection | 4 + .gitignore | 8 + .gitlab-ci.yml | 68 + .project | 23 + ....eclipse.wst.common.project.facet.core.xml | 5 + Dbs/sports2000/data/country.d | 22 + Dbs/sports2000/data/customer.d | 95 + Dbs/sports2000/data/invoice.d | 159 + Dbs/sports2000/data/item.d | 67 + Dbs/sports2000/data/order-li.d | 885 ++ Dbs/sports2000/data/order.d | 219 + Dbs/sports2000/data/ref-call.d | 25 + Dbs/sports2000/data/salesrep.d | 21 + Dbs/sports2000/data/state.d | 63 + Dbs/sports2000/df/sports2000.df | 801 ++ Dbs/sports2000/st/sports2000.st | 14 + Doc/Utils/BufferUtil.cls.html | 416 + Doc/Utils/CharacterExtentUtil.cls.html | 523 + Doc/Utils/DataConversionUtil.cls.html | 1165 ++ Doc/Utils/DateUtil.cls.html | 605 + Doc/Utils/DecimalExtentUtil.cls.html | 726 ++ Doc/Utils/DecimalUtil.cls.html | 762 ++ Doc/Utils/EmailSenderUnixUtil.cls.html | 226 + Doc/Utils/EmailSenderWindowsUtil.cls.html | 211 + Doc/Utils/EmailUtil.cls.html | 242 + Doc/Utils/FileUtil.cls.html | 810 ++ Doc/Utils/Int64Util.cls.html | 503 + Doc/Utils/Integer64ExtentUtil.cls.html | 727 ++ Doc/Utils/IntegerExtentUtil.cls.html | 727 ++ Doc/Utils/IntegerUtil.cls.html | 814 ++ Doc/Utils/ListUtil.cls.html | 1901 +++ Doc/Utils/LogicalUtil.cls.html | 615 + Doc/Utils/LongcharUtil.cls.html | 1088 ++ Doc/Utils/MathUtil.cls.html | 1018 ++ Doc/Utils/MeasurementUnitUtil.cls.html | 1262 ++ Doc/Utils/MemptrUtil.cls.html | 626 + Doc/Utils/QueryUtil.cls.html | 632 + Doc/Utils/RegexLinuxUtil.cls.html | 252 + Doc/Utils/SessionUtil.cls.html | 456 + Doc/Utils/StringUtil.cls.html | 1088 ++ Doc/Utils/ValidatorUtil.cls.html | 812 ++ Doc/Utils/package.html | 358 + Doc/css/nav-style.css | 278 + Doc/css/stylesheet.css | 305 + Doc/images/cls_file.gif | Bin 0 -> 576 bytes Doc/images/collapse.png | Bin 0 -> 338 bytes Doc/images/expand.png | Bin 0 -> 282 bytes Doc/images/fldr_obj.gif | Bin 0 -> 216 bytes Doc/images/i_file.gif | Bin 0 -> 578 bytes Doc/images/oe-30-white.jpg | Bin 0 -> 4575 bytes Doc/images/p_file.gif | Bin 0 -> 578 bytes Doc/images/search.png | Bin 0 -> 481 bytes Doc/images/skin.png | Bin 0 -> 52635 bytes Doc/index.html | 156 + Doc/js/abldoc-functions.js | 355 + Doc/js/jquery-1.11.2.js | 10346 ++++++++++++++++ Doc/js/jquery.slimscroll.min.js | 16 + Doc/js/jquery.slimscrollHorizontal.min.js | 1 + Doc/overview.html | 58 + Lib/README.txt | 8 + Lib/Utils.pl | Bin 0 -> 589418 bytes Lib/regm.c | 36 + Scripts/.gitignore | 1 + Scripts/common-build-tasks.xml | 140 + Scripts/deploy-app.sh | 27 + Scripts/dotpropath-to-pctpropath.xsl | 41 + Scripts/generate-pl-file.bat | 3 + Scripts/standardpaths.xml | 71 + Tests/BufferUtilUnitTests.cls | 185 + Tests/CharacterExtentUtilUnitTest.cls | 280 + Tests/DataConversionUtilUnitTest.cls | 420 + Tests/DateUtilUnitTest.cls | 186 + Tests/DecimalExtentUtilUnitTest.cls | 360 + Tests/DecimalUtilUnitTest.cls | 336 + Tests/EmailUtilUnitTest.cls | 90 + .../FileUtilTestData/CopyFile/FileToCopy.txt | 2 + .../CopyFile/FolderToCopyTo/FileToCopy.txt | 2 + .../CreateFolder/AlreadyExists/file.txt | 0 Tests/FileUtilTestData/CreateFolder/file.txt | 0 .../NotEmpty/NotEmpty33/file.txt | 0 .../DeleteEmptyFolders/file1.txt | 0 .../NotEmpty/NotEmpty33/file.txt | 0 .../DeleteEmptyFoldersCopy/file1.txt | 0 .../DeleteFolder/FolderToDelete/file.txt | 0 Tests/FileUtilTestData/DeleteFolder/file.txt | 0 Tests/FileUtilTestData/FindFile/file.txt | 0 Tests/FileUtilTestData/FolderExists/file.txt | 0 .../GetFileExtension/file1.txt | 0 .../GetFileExtension/file2.docx | 0 .../GetFileExtension/file3.bmp | 0 .../GetParentFolder/Folder1/Folder2/File.txt | 0 .../MoveFile/Folder/anotherfile.txt | 0 Tests/FileUtilTestData/MoveFile/file.txt | 0 Tests/FileUtilUnitTest.cls | 358 + Tests/Int64UtilUnitTest.cls | 116 + Tests/Integer64ExtentUtilUnitTest.cls | 365 + Tests/IntegerExtentUtilUnitTest.cls | 367 + Tests/IntegerUtilUnitTests.cls | 324 + Tests/ListUtilUnitTest.cls | 571 + Tests/LogicalUtilUnitTest.cls | 126 + Tests/LongcharUtilUnitTest.cls | 238 + Tests/MathUtilUnitTest.cls | 249 + Tests/MeasurementUnitUtilTests.cls | 282 + Tests/MemptrUtilUnitTest.cls | 216 + Tests/NotExistent | 2 + Tests/QueryUtilUnitTest.cls | 231 + Tests/SessionUtilUnitTest.cls | 115 + Tests/StringUtilUnitTest.cls | 238 + Tests/TestData/BufferUtilData.json | 9 + Tests/TestData/ttBufferUtilTestData.i | 25 + Tests/ValidatorUtilUnitTest.cls | 189 + Utils/BufferUtil.cls | 130 + Utils/CharacterExtentUtil.cls | 157 + Utils/DataConversionUtil.cls | 324 + Utils/DateUtil.cls | 210 + Utils/DecimalExtentUtil.cls | 237 + Utils/DecimalUtil.cls | 166 + Utils/EmailSenderUnixUtil.cls | 89 + Utils/EmailSenderWindowsUtil.cls | 95 + Utils/EmailUtil.cls | 57 + Utils/FileUtil.cls | 296 + Utils/Int64Util.cls | 142 + Utils/Integer64ExtentUtil.cls | 240 + Utils/IntegerExtentUtil.cls | 240 + Utils/IntegerUtil.cls | 181 + Utils/ListUtil.cls | 581 + Utils/LogicalUtil.cls | 135 + Utils/LongcharUtil.cls | 327 + Utils/MathUtil.cls | 459 + Utils/MeasurementUnitUtil.cls | 279 + Utils/MemptrUtil.cls | 156 + Utils/QueryUtil.cls | 254 + Utils/RegexLinuxUtil.cls | 97 + Utils/SessionUtil.cls | 92 + Utils/StringUtil.cls | 327 + Utils/ValidatorUtil.cls | 242 + build.config | 234 + build.properties | 13 + build.xml | 190 + generate_markdown.py | 162 + oeessentials_github.code-workspace | 8 + 141 files changed, 44888 insertions(+) create mode 100644 .dbconnection create mode 100644 .gitignore create mode 100644 .gitlab-ci.yml create mode 100644 .project create mode 100644 .settings/org.eclipse.wst.common.project.facet.core.xml create mode 100644 Dbs/sports2000/data/country.d create mode 100644 Dbs/sports2000/data/customer.d create mode 100644 Dbs/sports2000/data/invoice.d create mode 100644 Dbs/sports2000/data/item.d create mode 100644 Dbs/sports2000/data/order-li.d create mode 100644 Dbs/sports2000/data/order.d create mode 100644 Dbs/sports2000/data/ref-call.d create mode 100644 Dbs/sports2000/data/salesrep.d create mode 100644 Dbs/sports2000/data/state.d create mode 100644 Dbs/sports2000/df/sports2000.df create mode 100644 Dbs/sports2000/st/sports2000.st create mode 100644 Doc/Utils/BufferUtil.cls.html create mode 100644 Doc/Utils/CharacterExtentUtil.cls.html create mode 100644 Doc/Utils/DataConversionUtil.cls.html create mode 100644 Doc/Utils/DateUtil.cls.html create mode 100644 Doc/Utils/DecimalExtentUtil.cls.html create mode 100644 Doc/Utils/DecimalUtil.cls.html create mode 100644 Doc/Utils/EmailSenderUnixUtil.cls.html create mode 100644 Doc/Utils/EmailSenderWindowsUtil.cls.html create mode 100644 Doc/Utils/EmailUtil.cls.html create mode 100644 Doc/Utils/FileUtil.cls.html create mode 100644 Doc/Utils/Int64Util.cls.html create mode 100644 Doc/Utils/Integer64ExtentUtil.cls.html create mode 100644 Doc/Utils/IntegerExtentUtil.cls.html create mode 100644 Doc/Utils/IntegerUtil.cls.html create mode 100644 Doc/Utils/ListUtil.cls.html create mode 100644 Doc/Utils/LogicalUtil.cls.html create mode 100644 Doc/Utils/LongcharUtil.cls.html create mode 100644 Doc/Utils/MathUtil.cls.html create mode 100644 Doc/Utils/MeasurementUnitUtil.cls.html create mode 100644 Doc/Utils/MemptrUtil.cls.html create mode 100644 Doc/Utils/QueryUtil.cls.html create mode 100644 Doc/Utils/RegexLinuxUtil.cls.html create mode 100644 Doc/Utils/SessionUtil.cls.html create mode 100644 Doc/Utils/StringUtil.cls.html create mode 100644 Doc/Utils/ValidatorUtil.cls.html create mode 100644 Doc/Utils/package.html create mode 100644 Doc/css/nav-style.css create mode 100644 Doc/css/stylesheet.css create mode 100644 Doc/images/cls_file.gif create mode 100644 Doc/images/collapse.png create mode 100644 Doc/images/expand.png create mode 100644 Doc/images/fldr_obj.gif create mode 100644 Doc/images/i_file.gif create mode 100644 Doc/images/oe-30-white.jpg create mode 100644 Doc/images/p_file.gif create mode 100644 Doc/images/search.png create mode 100644 Doc/images/skin.png create mode 100644 Doc/index.html create mode 100644 Doc/js/abldoc-functions.js create mode 100644 Doc/js/jquery-1.11.2.js create mode 100644 Doc/js/jquery.slimscroll.min.js create mode 100644 Doc/js/jquery.slimscrollHorizontal.min.js create mode 100644 Doc/overview.html create mode 100644 Lib/README.txt create mode 100644 Lib/Utils.pl create mode 100644 Lib/regm.c create mode 100644 Scripts/.gitignore create mode 100644 Scripts/common-build-tasks.xml create mode 100644 Scripts/deploy-app.sh create mode 100644 Scripts/dotpropath-to-pctpropath.xsl create mode 100644 Scripts/generate-pl-file.bat create mode 100644 Scripts/standardpaths.xml create mode 100644 Tests/BufferUtilUnitTests.cls create mode 100644 Tests/CharacterExtentUtilUnitTest.cls create mode 100644 Tests/DataConversionUtilUnitTest.cls create mode 100644 Tests/DateUtilUnitTest.cls create mode 100644 Tests/DecimalExtentUtilUnitTest.cls create mode 100644 Tests/DecimalUtilUnitTest.cls create mode 100644 Tests/EmailUtilUnitTest.cls create mode 100644 Tests/FileUtilTestData/CopyFile/FileToCopy.txt create mode 100644 Tests/FileUtilTestData/CopyFile/FolderToCopyTo/FileToCopy.txt create mode 100644 Tests/FileUtilTestData/CreateFolder/AlreadyExists/file.txt create mode 100644 Tests/FileUtilTestData/CreateFolder/file.txt create mode 100644 Tests/FileUtilTestData/DeleteEmptyFolders/NotEmpty/NotEmpty33/file.txt create mode 100644 Tests/FileUtilTestData/DeleteEmptyFolders/file1.txt create mode 100644 Tests/FileUtilTestData/DeleteEmptyFoldersCopy/NotEmpty/NotEmpty33/file.txt create mode 100644 Tests/FileUtilTestData/DeleteEmptyFoldersCopy/file1.txt create mode 100644 Tests/FileUtilTestData/DeleteFolder/FolderToDelete/file.txt create mode 100644 Tests/FileUtilTestData/DeleteFolder/file.txt create mode 100644 Tests/FileUtilTestData/FindFile/file.txt create mode 100644 Tests/FileUtilTestData/FolderExists/file.txt create mode 100644 Tests/FileUtilTestData/GetFileExtension/file1.txt create mode 100644 Tests/FileUtilTestData/GetFileExtension/file2.docx create mode 100644 Tests/FileUtilTestData/GetFileExtension/file3.bmp create mode 100644 Tests/FileUtilTestData/GetParentFolder/Folder1/Folder2/File.txt create mode 100644 Tests/FileUtilTestData/MoveFile/Folder/anotherfile.txt create mode 100644 Tests/FileUtilTestData/MoveFile/file.txt create mode 100644 Tests/FileUtilUnitTest.cls create mode 100644 Tests/Int64UtilUnitTest.cls create mode 100644 Tests/Integer64ExtentUtilUnitTest.cls create mode 100644 Tests/IntegerExtentUtilUnitTest.cls create mode 100644 Tests/IntegerUtilUnitTests.cls create mode 100644 Tests/ListUtilUnitTest.cls create mode 100644 Tests/LogicalUtilUnitTest.cls create mode 100644 Tests/LongcharUtilUnitTest.cls create mode 100644 Tests/MathUtilUnitTest.cls create mode 100644 Tests/MeasurementUnitUtilTests.cls create mode 100644 Tests/MemptrUtilUnitTest.cls create mode 100644 Tests/NotExistent create mode 100644 Tests/QueryUtilUnitTest.cls create mode 100644 Tests/SessionUtilUnitTest.cls create mode 100644 Tests/StringUtilUnitTest.cls create mode 100644 Tests/TestData/BufferUtilData.json create mode 100644 Tests/TestData/ttBufferUtilTestData.i create mode 100644 Tests/ValidatorUtilUnitTest.cls create mode 100644 Utils/BufferUtil.cls create mode 100644 Utils/CharacterExtentUtil.cls create mode 100644 Utils/DataConversionUtil.cls create mode 100644 Utils/DateUtil.cls create mode 100644 Utils/DecimalExtentUtil.cls create mode 100644 Utils/DecimalUtil.cls create mode 100644 Utils/EmailSenderUnixUtil.cls create mode 100644 Utils/EmailSenderWindowsUtil.cls create mode 100644 Utils/EmailUtil.cls create mode 100644 Utils/FileUtil.cls create mode 100644 Utils/Int64Util.cls create mode 100644 Utils/Integer64ExtentUtil.cls create mode 100644 Utils/IntegerExtentUtil.cls create mode 100644 Utils/IntegerUtil.cls create mode 100644 Utils/ListUtil.cls create mode 100644 Utils/LogicalUtil.cls create mode 100644 Utils/LongcharUtil.cls create mode 100644 Utils/MathUtil.cls create mode 100644 Utils/MeasurementUnitUtil.cls create mode 100644 Utils/MemptrUtil.cls create mode 100644 Utils/QueryUtil.cls create mode 100644 Utils/RegexLinuxUtil.cls create mode 100644 Utils/SessionUtil.cls create mode 100644 Utils/StringUtil.cls create mode 100644 Utils/ValidatorUtil.cls create mode 100644 build.config create mode 100644 build.properties create mode 100644 build.xml create mode 100644 generate_markdown.py create mode 100644 oeessentials_github.code-workspace diff --git a/.dbconnection b/.dbconnection new file mode 100644 index 0000000..78eb9c7 --- /dev/null +++ b/.dbconnection @@ -0,0 +1,4 @@ + + + + diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..57f757c --- /dev/null +++ b/.gitignore @@ -0,0 +1,8 @@ +# Files/folders to ignore + +# Ignore all .r files +*.r +protrace.* +.propath +results.xml +Utils/test.p diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml new file mode 100644 index 0000000..eb7a05e --- /dev/null +++ b/.gitlab-ci.yml @@ -0,0 +1,68 @@ +stages: + - Compile Application + - Test + - Pages + - Update_ReadMe + +Compile Project: + stage: Compile Application + tags: + - docker + - linux + image: "git.wayfare.ro:5050/docker/openedge:12.7-dev" + cache: + key: $CI_COMMIT_REF_SLUG + paths: + - deploy + when: on_success + policy: pull-push + before_script: + - mkdir -p $HOME/.docker + - echo $DOCKER_AUTH_CONFIG > $HOME/.docker/config.json + script: + - ant -f ./build.xml -DDLC=$DLC + except: + - reset_dev + - reset_prod + artifacts: + name: "build-job-$CI_JOB_ID" + paths: + - ./ + when: + +Run unit tets: + stage: Test + tags: + - docker + - linux + image: "git.wayfare.ro:5050/docker/openedge:12.7-dev" + artifacts: + untracked: true + expire_in: 10 mins + paths: + - Results/results.xml + when: always + reports: + junit: Results/results.xml + before_script: + - mkdir -p $HOME/.docker + - echo $DOCKER_AUTH_CONFIG > $HOME/.docker/config.json + - apt-get update + - apt-get install -y gcc + - apt-get install -y libpcre3-dev + - gcc -c Lib/regm.c -fPIC -lpcre -o regm.o + - gcc -shared regm.o -lpcre -o regm.so + script: + - ant -f ./build.xml test_app -DDLC=$DLC + except: + - reset_dev + - reset_prod + +Pages: + stage: Pages + script: + - mkdir public + - cp -r Doc/* public + artifacts: + paths: + - public \ No newline at end of file diff --git a/.project b/.project new file mode 100644 index 0000000..e40e3c5 --- /dev/null +++ b/.project @@ -0,0 +1,23 @@ + + + OEEssential + + + + + + com.openedge.pdt.text.progressBuilder + + + + + org.eclipse.wst.common.project.facet.core.builder + + + + + + com.openedge.pdt.text.progressNature + org.eclipse.wst.common.project.facet.core.nature + + diff --git a/.settings/org.eclipse.wst.common.project.facet.core.xml b/.settings/org.eclipse.wst.common.project.facet.core.xml new file mode 100644 index 0000000..6bd5ee3 --- /dev/null +++ b/.settings/org.eclipse.wst.common.project.facet.core.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/Dbs/sports2000/data/country.d b/Dbs/sports2000/data/country.d new file mode 100644 index 0000000..bde6ef0 --- /dev/null +++ b/Dbs/sports2000/data/country.d @@ -0,0 +1,22 @@ +"Canada" "City" "Province" "Postal Code" "X9X 9X9" "(999) 999-9999" "$" "DMY" +"Deutschland" "Stadt" "" "Postleitzahl" "9999" "X(15)" "D" "DMY" +"Italia" "Citta" "Provincia" "Postale" "" "" "L" "DMY" +"Austria" "Stadt" "Region" "PLZ" "XXXXXXXX" "XXXXXXXXXXXXXXX" "OS" "DMY" +"Finland" "Kaupunki" "Maakunta" "Postinumero" "99999" "(X99) X99 999X" "Mk" "DMY" +"France" "Ville" "Region" "Code postal" "99999" "9 99-99-99-99" "Fr" "DMY" +"Nederland" "Plaats" "Regio" "Postkode" "9999 !!" "" "Hfl" "DMY" +"Sverige" "Postadress" "" "Postnr" "999 99" "x(16)" "SEK" "YMD" +"United Kingdom" "Town/City" "County" "Post Code" "x(8)" "x(12)" "P" "DMY" +"USA" "City" "State" "Zip Code" "99999-9999" "(999) 999-9999" "$" "MDY" +. +PSC +filename=Local-Default +records=0000000000010 +ldbname=OETraining2024_Sportsdb +timestamp=2024/07/03-08:21:44 +numformat=44,46 +dateformat=mdy-1950 +map=NO-MAP +cpstream=ISO8859-1 +. +0000000717 diff --git a/Dbs/sports2000/data/customer.d b/Dbs/sports2000/data/customer.d new file mode 100644 index 0000000..2031cdb --- /dev/null +++ b/Dbs/sports2000/data/customer.d @@ -0,0 +1,95 @@ +1 "USA" "Lift Line Skiing" "276 North Street" "" "Boston" "MA" "02114" "Gloria Shepley" "(617) 450-0087" "HXM" 66700 42568 "Net30" 35 "This customer is on credit hold." +2 "Finland" "Urpon Frisbee" "Rattipolku 3" "" "Valkeala" "Uusimaa" "45360" "Urpo Leppakoski" "(60) 532 5471" "DKP" 27600 17166 "Net30" 35 "Ship all products 2nd Day Air." +3 "USA" "Hoops Croquet Co." "Suite 415" "40 Grove St." "Hingham" "MA" "02111" "Michael Traitser" "(617) 366-1557" "HXM" 75000 66421 "Net30" 10 "This customer is now OFF credit hold." +4 "United Kingdom" "Go Fishing Ltd" "Unit 2" "83 Ponders End Rd" "Harrow" "Middlesex" "HA8 7BN" "Alan Frogbrook" "081 883 6827" "SLS" 15000 689 "Net30" 10 "" +5 "USA" "Match Point Tennis" "66 Homer Ave" "" "Como" "MA" "75431" "Robert Dorr" "(817) 498-2801" "JAL" 11000 0 "Net30" 50 "" +6 "United Kingdom" "Fanatical Athletes" "20 Bicep Bridge Rd" "Leyton" "Aberdeen" "Grampian" "AB9 2YY" "Andrew Strong" "0224 692 903" "SLS" 38900 37697 "Net30" 0 "Ship C.O.D. at all times." +7 "Finland" "Aerobics valine KY" "Peltolantie 2" "" "Tikkurila" "Uusimaa" "1234" "Elli Ilmanen" "(90) 054 6399" "DKP" 13500 10439 "Net30" 15 "" +8 "Sverige" "Game Set Match" "Box 60" "" "Sundsvall" "" "851 14" "Tore Break" "060-60 62 61" "RDR" 15000 3373 "Net30" 50 "This customer is back on Credit Hold." +9 "Finland" "Pihtiputaan Pyora" "Putikontie 2" "" "Pihtipudas" "Etela-Savo" "44800" "Markku Ventolinen" "(60) 162 5007" "DKP" 29900 25792 "Net30" 10 "Call for shipping instructions." +10 "United Kingdom" "Just Joggers Limited" "Fairwind Trading Est" "Shoe Lane" "Ramsbottom" "Lancashire" "BL0 9ND" "George Lacey" "070 682 2887" "SLS" 22000 16621 "Net30" 20 "" +11 "Finland" "Keilailu ja Biljardi" "Vattuniemenkuja 8 A" "" "Helsinki" "Uusimaa" "210" "Riitta Hammermaki" "(91) 972 3478" "DKP" 10900 7284 "Net30" 25 "" +12 "Finland" "Surf Lautaveikkoset" "Venemestarinkatu 35" "" "Salo" "Varsinais-Suomi" "24240" "Veikko Lehtisoini" "(51) 254 2180" "DKP" 6500 0 "Net30" 35 "" +13 "Finland" "Biljardi ja tennis" "Urheilutie 1" "" "Mantsala" "Uusimaa" "4600" "Tuomo A.T. Mattinen" "(40) 523 3088" "DKP" 18200 8490 "Net30" 50 "Do not ship through US Mail." +14 "France" "Paris St Germain" "113, avenue du Stade" "BP 338" "Paris" "Seine" "75012" "Philippe Dasgil" "1 42 25 68 78" "DOS" 25500 19428 "Net30" 20 "" +15 "USA" "Hoopla Basketball" "87 Calumnet St" "" "Egg Harbor" "NJ" "08215" "Robert Johns" "(609) 367-3875" "HXM" 8500 3234 "Net30" 45 "This customer is OFF credit hold!" +16 "USA" "Thundering Surf Inc." "354 Market St." "" "Coffee City" "TX" "75763" "Fran Horan" "(512) 542-1804" "JAL" 16300 9037 "Net30" 40 "" +17 "United Kingdom" "High Tide Sailing" "178 Schooner Hill" "South Killingholme" "Immingham" "Humberside" "DN40 3LU" "Angela Tackle" "0469 73211" "SLS" 10500 5889 "Net30" 25 "Speak with Captain Bob before shipping any products." +18 "Finland" "Antin Metsastysase" "Vanhainkodinkuja 1" "" "Sysma" "Keski-Suomi" "19700" "Antti Oyrinmetsa" "(71) 432 1317" "DKP" 21300 13073 "Net30" 35 "" +19 "USA" "Buffalo Shuffleboard" "155 Carolina Ave" "" "Buffalo" "NY" "13142" "George Buitkus" "(716) 344-0966" "HXM" 35800 27658 "Net30" 20 "Ship to Green Bay warehouse." +20 "Finland" "Espoon Pallokeskus" "Sinikalliontie 18" "" "Espoo" "Uusimaa" "1200" "Pekka Maukajarvi" "(90) 083 7737" "DKP" 12500 0 "Net30" 25 "" +21 "USA" "Pedal Power Cycles" "11 Perkins St" "" "Boston" "MA" "02145" "Alicia Primes" "(617) 245-6969" "HXM" 6000 0 "Net30" 50 "" +22 "Finland" "Kesport Katiska" "Koskisillantie 4" "" "Forssa" "Etela-Hame" "30100" "Pentti Koskinen" "(91) 676 4644" "DKP" 31000 14922 "Net30" 50 "Credit Hold." +24 "Finland" "Jazz Futis Kauppa" "Yrjonkatu 10" "" "Pori" "Satakunta" "28100" "Markku Yla-Liedeoja" "(60) 349 9254" "DKP" 96200 61767 "Net30" 35 "" +25 "France" "La Boule Lyonnaise" "rue de la gare" "Z.A. Bellecourt" "Lyon" "Rhone" "69010" "Mr Roulemousse" "78 98 23 25" "DOS" 13000 8662 "Net30" 30 "Ship all products overnight." +26 "United Kingdom" "Bulls Eye Sports" "Highscore House" "180 Goodshot Street" "Leeds" "West Yorkshire" "LS17 8TS" "Kevin Batter" "0347 21348" "SLS" 47700 23235 "Net30" 50 "" +27 "Austria" "Bumm Bumm Tennis" "Weizenmarkt 17" "" "Wien" "Ost" "A-1020" "Hr. Ballerer" "0222/924376/12" "GPE" 46500 45318 "Net30" 0 "" +28 "Finland" "Luistin ja Pyora Oy" "Ruutintie 7 A" "" "Laihia" "Etela-Pohjanmaa" "66400" "Jarkko J. Scott" "(30) 731 1978" "DKP" 57700 31092 "Net30" 45 "Mark shipments ""FRAGILE"" regardless of contents." +29 "USA" "Bug in a Rug-by" "120 Henry St" "" "Yamhill" "OR" "97148" "Chip Clark" "(503) 743-1318" "KIK" 33700 16233 "Net30" 50 "" +30 "USA" "Fast Flipper Pinball" "11 Centre St" "" "Troy" "NC" "27371" "Shaun Peacock" "(919) 330-2993" "HXM" 53400 28705 "Net30" 45 "They are now OFF credit hold." +31 "Finland" "Jaakon Jumppavaline" "Kauppiaskatu 9 B" "" "Turku" "Varsinais-Suomi" "20100" "Heikki Waljakkala" "(61) 749 9273" "DKP" 12500 8087 "Net30" 20 "" +32 "Finland" "Kiiskin Jaavarustus" "Kiiskinmaenkatu 5-7" "" "Mikkeli" "Etela-Savo" "50130" "Ismo Alatasanko" "(21) 826 5779" "DKP" 20300 10490 "Net30" 45 "" +33 "Finland" "Tennis Agentti" "Vapaudenkatu 35" "" "Rovaniemi" "Lappi" "30456" "Jorma Jankakoli" "(98) 829 8224" "DKP" 23000 11988 "Net30" 45 "" +34 "USA" "Quick Toss Lacrosse" "1a Garden Ct" "" "Ada" "OH" "45810" "Salvatore Riccio" "(216) 783-1877" "JAL" 58000 39745 "Net30" 30 "" +35 "Finland" "Penan Sporttiklubi" "Salmentie 10" "" "Alavus" "Etela-Pohjanmaa" "63300" "Pentti Ala-Julkku" "(70) 227 2926" "DKP" 11000 0 "Net30" 40 "" +36 "France" "La voile en folie" "rue de l'Ocean" "allee de Paris" "Brest" "Bretagne" "29100" "Mr Breiz" "98 65 78 02" "DOS" 15000 2592 "Net30" 50 "FAX shipping confirmation ASAP after order is shipped." +37 "Austria" "ABC Mountain Bikes" "Alttorstr. 23" "" "Salzburg" "West" "A-5020" "Hr. Gasgeb" "0662/43728/12" "GPE" 14100 11641 "Net30" 10 "" +38 "Finland" "Hoopelin Pesapallo" "Hameenkatu 16" "" "Hyvinkaa" "Uusimaa" "5800" "Roope Paukku" "(60) 936 7387" "DKP" 5800 4104 "Net30" 10 "This customer is now ON credit hold." +39 "Finland" "Uintivaline Rapyla" "Koulukatu 16 A" "" "Janisjarvi" "Keski-Suomi" "13100" "Antti Rastio" "(91) 249 8849" "DKP" 10000 0 "Net30" 45 "" +40 "Finland" "Heikin Kuntosali" "Alikeravantie 6" "" "Kerava" "Uusimaa" "4240" "Heikki Niemelainen" "(60) 722 3987" "DKP" 49300 40875 "Net30" 15 "Ship only to London warehouse." +41 "USA" "On Target Rifles" "22 Highwood Av." "" "Osyka" "MS" "39657" "Mark Little" "(601) 625-0070" "JAL" 58000 56784 "Net30" 0 "" +42 "United Kingdom" "Stall-Turn Flying" "Hurricane Lane" "" "Skye Green" "Essex" "SS4 3QL" "Nancy Trainer" "0702 258 133" "SLS" 40900 19862 "Net30" 50 "" +43 "USA" "Sub Par Golf" "60 Alpine St" "" "Winter Park" "CO" "80482" "Irving Nigrini" "(303) 444-6387" "JAL" 37000 19675 "Net30" 45 "Ship all products 2nd Day Air." +44 "USA" "Ship Shape Yachting" "34 Oak St" "" "Sport Hill" "CT" "06612" "Bernie Eldridge" "(203) 536-0131" "HXM" 13500 0 "Net30" 20 "Ship all products for Saturday Delivery." +45 "Nederland" "SC Ren Je Rot" "Hoofdstraat 45" "" "Utrecht" "Utrecht" "3572 LA" "R. Trimmer" "030-773411" "BBB" 13000 10055 "Net30" 15 "" +46 "France" "Olympique marseilles" "rue de la pastaga" "" "Marseille" "Midi" "13000" "Denis Papin" "23 58 56 86" "DOS" 45600 33284 "Net30" 25 "" +47 "USA" "Batter Up Baseball" "1286 Adams Drive" "" "Wingo" "KY" "42088" "Bernie Moss" "(502) 325-5709" "HXM" 7500 1949 "Net30" 25 "" +48 "Finland" "Purjehdustarvike Oy" "Nasilinnankatu 7 B" "" "Tampere" "Etela-Hame" "33100" "Pentti Pekanmaa" "(20) 353 6013" "DKP" 7000 1025 "Net30" 5 "Credit Hold...See Barbara for Clearance." +49 "Finland" "Jortsin Kesport" "Terveyskatu 10" "" "Aanekoski" "Keski-Suomi" "20450" "Jorgen Salomaki" "(50) 232 5570" "DKP" 23000 18555 "Net30" 15 "" +50 "USA" "Chip's Poker" "33 Kelton St" "" "Dupont" "FL" "32010" "Kevin Koppel" "(904) 567-8223" "HXM" 20100 14192 "Net30" 25 "Ship all products with Saturday Delivery." +51 "USA" "Butternut Squash Inc" "113 Russell Av" "" "El Centro" "CA" "92243" "Quoc Tran" "(818) 482-7000" "KIK" 26800 25564 "Net30" 0 "" +52 "Finland" "Hangon Potkulauta KY" "Puistokatu 7 A 45" "" "Hanko" "Uusimaa" "10900" "Kaisa Kulmiainen" "(20) 757 7200" "DKP" 11800 7402 "Net30" 30 "This customer is now OFF credit hold." +53 "Sverige" "Offside Hockey" "Puckgatan 12" "" "Gavle" "" "801 00" "Sven Tumba" "026-102 15" "RDR" 15000 7851 "Net30" 10 "" +54 "United Kingdom" "Spokes Cycles" "2a The Pump" "West Riding" "Ipswich" "Suffolk" "IP2 8HL" "Norman Walker" "0473 690 383" "SLS" 10000 868 "Net30" 35 "" +55 "USA" "Shark Snack Snorkel" "457 Ocean Drive" "" "San Diego" "CA" "93441" "Joao Borges" "(714) 321-3173" "KIK" 15000 1837 "Net30" 35 "" +56 "Finland" "Super Golf Center" "Keskuskatu 27" "" "Pieksamaki" "Etela-Savo" "76100" "Jaana Kauppalainen" "(30) 344 4638" "DKP" 13000 11805 "Net30" 0 "" +57 "Nederland" "Golf CLub Holland" "Grasduinen 1" "" "Eindhoven" "Z-Holland" "5641 HG" "H. Hoedjes" "040-667711" "BBB" 12500 0 "Net30" 5 "" +58 "USA" "Flying Fat Aerobics" "39 Dalton St" "" "Harfield" "NY" "14728" "Ellyn Krol" "(716) 327-6100" "HXM" 10700 7616 "Net30" 20 "" +59 "Finland" "Holvin juoksukeskus" "Maaherrankatu 15" "" "Kuopio" "Etela-Savo" "70100" "Kari Jokinen" "(90) 473 4786" "DKP" 5500 519 "Net30" 25 "" +60 "Nederland" "Hou Hoog die Bal" "Kerklaan 8" "" "Amsterdam" "N-Holland" "1064 HE" "S. Volley" "020-6002113" "BBB" 10500 2949 "Net30" 20 "" +61 "Finland" "Squash Mestarihalli" "Keskuskatu 8" "" "Parkano" "Etela-Pohjanmaa" "39700" "Heikki Yli-Moijonen" "(81) 848 2700" "DKP" 32300 27999 "Net30" 10 "" +62 "USA" "Hearts Darts" "209 Lewis Circle" "" "Flushing" "NY" "14731" "Alan Johnson" "(607) 223-9871" "HXM" 24000 11400 "Net30" 50 "" +63 "Finland" "Luopioisten Biljardi" "Anna-Liisankatu 9" "" "Kemi" "Pohjois-Pohjanmaa" "98100" "Elina Kirjavainen" "(81) 866 6406" "DKP" 11800 9517 "Net30" 10 "" +64 "Finland" "Hamahakkimies KY" "Tainionkoskenkatu 20" "" "Imatra" "Pohjois-Karjala" "55120" "Marja Kantokoski" "(50) 374 3131" "DKP" 6000 2459 "Net30" 40 "" +65 "Sverige" "Lagt Kort Ligger" "Bridgevagen 106" "" "Malmo" "" "202 11" "Kurt Synare" "040-15 10 00" "RDR" 51700 40439 "Net30" 20 "" +66 "USA" "First Down Football" "354 Edmonds Ave" "" "Loudon" "NH" "03301" "Marcia Shirkey" "(603) 499-2544" "HXM" 82200 76904 "Net30" 5 "Credit Hold." +67 "USA" "Stay Afloat Swimming" "128 High Street" "" "Lula" "GA" "30554" "Keith Doherty" "(912) 498-8492" "HXM" 19200 12581 "Net30" 30 "" +68 "USA" "UFO Frisbee" "48 River St." "" "Pierre" "ND" "58147" "Hector D'Amato" "(605) 325-4715" "JAL" 8000 7052 "Net30" 10 "Ship all products by AIR." +69 "Finland" "Sukellusvarustus" "Kallonkuljunkuja 2" "" "Turku" "Varsinais-Suomi" "20540" "Pekka Savujoki" "(92) 154 4444" "DKP" 16200 9771 "Net30" 35 "" +70 "United Kingdom" "U-Jump Parachuting" "10 Ripcord Row" "" "Felldown" "Hampshire" "RG21 2QE" "Will B Scarey" "0420 62152" "SLS" 21500 14225 "Net30" 30 "Ship all products by Air." +71 "USA" "Pocket Billiards Co." "44 Saunders Ave." "" "Phelan" "CA" "92371" "Leon Aida" "(818) 666-4063" "KIK" 5000 0 "Net30" 50 "" +72 "USA" "Birdy's Badminton" "125 Federal St" "" "Hydro" "OK" "73048" "Orrin Meagher" "(405) 233-0881" "JAL" 52900 28442 "Net30" 45 "Speak to Debbie before shipping any products." +73 "Austria" "Auffi Bergausrustung" "Tiroler Landesstr. 5" "" "Innsbruck" "West" "A-6020" "Fr. Abseiler" "0512/31644" "GPE" 24800 17673 "Net30" 25 "" +74 "USA" "Dark Alley Bowling" "45 Chestnut St" "" "Locust" "NC" "28097" "Rick Kammer" "(919) 723-4787" "HXM" 10000 0 "Net30" 5 "" +75 "USA" "Hard Knocks Skating" "97 Morton St." "" "Laramie" "WY" "82070" "Carol Lynn" "(307) 311-9788" "KIK" 46400 38424 "Net30" 15 "" +76 "Finland" "Kempeleen Intersport" "Harjusenkatu 21" "" "Oulu" "Pohjois-Pohjanmaa" "90120" "Paavo Heikinmaki" "(91) 933 0299" "DKP" 18900 11516 "Net30" 35 "" +77 "France" "Le Hollandais volant" "35, rue des Oiseaux" "3eme etage" "Rennes" "Bretagne" "35000" "Alain Verse" "99 86 12 48" "DOS" 9500 0 "Net30" 10 "This customer is now ON credit hold." +78 "USA" "Jack's Jacks" "45 Walnut Ave." "" "Boston" "MA" "02155" "Christina Zugrulow" "(617) 499-2733" "HXM" 9500 0 "Net30" 40 "" +79 "USA" "Blue Line Hockey" "15 Farquah Ct" "" "Orrington" "ME" "04474" "Pierre Buffle" "(207) 577-2003" "HXM" 11500 0 "Net30" 35 "Ship all products with Saturday Delivery." +80 "USA" "StickyWicket Cricket" "456 Hampstead Road" "" "Nisswa" "MN" "56468" "Dory Schweitzer" "(218) 265-7798" "JAL" 54800 34853 "Net30" 35 "" +81 "USA" "Off The Wall" "20 Leedsville Ave" "" "Export" "PA" "15632" "Nicole Beller" "(717) 367-9777" "HXM" 6200 3742 "Net30" 25 "" +82 "USA" "Second Skin Scuba" "79 Farrar Ave" "" "Yuma" "AZ" "85369" "Ron Ferrante" "(602) 542-0365" "JAL" 38700 28115 "Net30" 25 "" +83 "USA" "Fallen Arch Running" "49 Millmont St" "" "Codys Corner" "FL" "32010" "Kevin Mallone" "(904) 734-7868" "HXM" 73500 68716 "Net30" 5 "" +84 "USA" "Spike's Volleyball" "34 Dudley St" "" "Genoa" "NV" "89411" "Craig Eleazer" "(702) 272-9264" "KIK" 20400 18267 "Net30" 5 "" +. +PSC +filename=Customer +records=0000000000083 +ldbname=OETraining2024_Sportsdb +timestamp=2024/07/03-08:21:44 +numformat=44,46 +dateformat=mdy-1950 +map=NO-MAP +cpstream=ISO8859-1 +. +0000013028 diff --git a/Dbs/sports2000/data/invoice.d b/Dbs/sports2000/data/invoice.d new file mode 100644 index 0000000..c459a5a --- /dev/null +++ b/Dbs/sports2000/data/invoice.d @@ -0,0 +1,159 @@ +1 53 02/08/93 4402.02 5062.32 0 1 660.3 +2 81 01/15/93 2812.98 2812.98 0 2 0 +3 66 02/17/93 23504.59 23504.59 0 3 0 +4 83 01/25/93 11756.67 11756.67 0 4 0 +5 72 01/21/93 15126.78 15126.78 0 5 0 +6 1 02/08/93 1829.5 1829.5 0 6 0 +7 51 02/08/93 6337.38 4753.03 1584.35 7 0 +8 38 01/14/93 4104 4719.6 0 8 615.6 +9 51 01/27/93 251.26 251.26 0 9 0 +10 11 02/11/93 771.59 887.33 0 10 115.74 +11 28 02/16/93 3990.23 4588.76 0 11 598.53 +12 37 02/05/93 10288.58 11831.87 0 12 1543.29 +13 69 01/15/93 5267.67 6057.82 0 13 790.15 +14 82 01/21/93 487.59 487.59 0 14 0 +15 61 01/22/93 4603.72 5294.28 0 15 690.56 +16 11 02/19/93 342 393.3 0 16 51.3 +17 48 02/12/93 1024.99 1178.74 0 17 153.75 +18 30 02/22/93 14530.46 14530.46 0 18 0 +19 58 01/27/93 981.6 981.6 0 19 0 +20 14 02/17/93 19108.2 21974.43 0 20 2866.23 +21 4 01/25/93 688.37 791.63 0 21 103.26 +22 70 03/01/93 4807.68 5528.83 0 22 721.15 +23 16 02/05/93 2002.74 2002.74 0 23 0 +24 73 02/05/93 5841.4 6717.61 0 24 876.21 +25 10 02/12/93 4586.99 5275.04 0 25 688.05 +26 53 01/28/93 3450.34 3967.89 0 26 517.55 +27 59 02/15/93 518.74 596.55 0 27 77.81 +28 32 02/03/93 5655.2 6503.48 0 28 848.28 +29 60 02/22/93 496.61 571.1 0 29 74.49 +30 40 02/26/93 7108.09 8174.3 0 30 1066.21 +31 40 02/15/93 5721.46 6579.68 0 31 858.22 +32 70 02/10/93 2747.3 3159.4 0 32 412.1 +33 58 01/25/93 6633.6 6633.6 0 33 0 +34 32 02/04/93 4835.33 5560.63 0 34 725.3 +35 73 02/26/93 6091.48 7005.2 0 35 913.72 +36 1 03/08/93 492.25 492.25 0 36 0 +37 28 02/26/93 3069.04 3529.4 0 37 460.36 +38 67 02/23/93 1886.68 1886.68 0 38 0 +39 75 02/15/93 6981.83 6981.83 0 39 0 +40 30 02/26/93 3115.23 3115.23 0 40 0 +41 16 02/01/93 3668.92 3668.92 0 41 0 +42 26 02/15/93 7886.92 9069.96 0 42 1183.04 +43 27 02/25/93 472.45 543.32 0 43 70.87 +44 50 02/12/93 6517.91 6517.91 0 44 0 +45 26 02/22/93 1012 1163.8 0 45 151.8 +46 83 02/16/93 29762.58 29762.58 0 46 0 +47 62 03/03/93 11397.99 11397.99 0 47 0 +48 9 03/04/93 6428.08 7392.29 0 48 964.21 +49 68 02/08/93 7051.19 7051.19 0 49 0 +50 52 02/01/93 446.09 513 0 50 66.91 +51 31 02/24/93 3110.99 3577.64 0 51 466.65 +52 27 02/22/93 7535.42 8665.73 0 52 1130.31 +53 33 02/25/93 2610.89 3002.52 0 53 391.63 +54 25 02/12/93 4377.05 5033.61 0 54 656.56 +55 3 03/19/93 9510.21 0 0 55 0 +56 11 02/12/93 435.87 501.25 0 56 65.38 +57 84 03/03/93 4090.13 4090.13 0 57 0 +58 15 02/05/93 3234.55 3234.55 0 58 0 +59 6 03/05/93 3621.32 4164.52 0 59 543.2 +60 37 03/02/93 1351.61 1419.19 135.16 60 202.74 +61 61 03/08/93 5200.38 5980.44 0 61 780.06 +62 34 02/25/93 17502.95 17502.95 0 62 0 +63 41 03/03/93 11217.96 11217.96 0 63 0 +64 40 03/08/93 26912.81 30949.73 0 64 4036.92 +65 56 02/19/93 4193.1 4822.07 0 65 628.97 +66 66 03/08/93 36587.69 36587.69 0 66 0 +67 46 02/19/93 650.31 747.86 0 67 97.55 +68 13 03/15/93 1005 0 0 68 150.75 +69 83 03/11/93 14513.86 14513.86 0 69 0 +70 34 03/01/93 8668.27 8668.27 0 70 0 +71 75 02/22/93 6050.7 6050.7 0 71 0 +72 42 03/08/93 5638.75 6484.56 0 72 845.81 +73 67 03/19/93 569.8 0 0 73 0 +74 61 03/15/93 1550.79 0 0 74 232.62 +75 9 03/01/93 950.4 1092.96 0 75 142.56 +76 67 02/22/93 4329.98 4329.98 0 76 0 +77 72 03/08/93 4803.08 4803.08 0 77 0 +78 41 03/01/93 184 184 0 78 0 +79 1 02/26/93 34707.84 34707.84 0 79 0 +80 66 03/10/93 8187.39 6959.28 1228.11 80 0 +81 69 03/12/93 4502.45 5177.82 0 81 675.37 +82 29 03/12/93 1471.14 1471.14 0 82 0 +83 51 03/02/93 11975.88 11975.88 0 83 0 +84 31 03/17/93 4975.62 0 0 84 746.34 +85 70 03/26/93 3824.11 0 0 85 573.62 +86 33 03/12/93 3727.24 4286.33 0 86 559.09 +87 28 02/26/93 5084.64 5847.34 0 87 762.7 +88 24 03/16/93 5658.34 0 0 88 848.75 +89 42 03/11/93 2072.63 2383.52 0 89 310.89 +90 9 03/01/93 7166.87 8241.9 0 90 1075.03 +91 46 02/22/93 8704.73 10010.44 0 91 1305.71 +92 76 03/22/93 2906.87 0 0 92 436.03 +93 84 03/02/93 4977.34 4977.34 0 93 0 +94 2 03/10/93 4928.73 5668.04 0 94 739.31 +95 27 03/26/93 18053 0 0 95 2707.95 +96 25 03/18/93 4285.93 0 0 96 642.89 +97 43 03/19/93 3076.93 0 0 97 0 +98 26 03/03/93 9911.25 11397.94 0 98 1486.69 +99 9 03/10/93 380.67 437.77 0 99 57.1 +100 43 03/26/93 5597.71 0 0 100 0 +101 14 03/22/93 319.6 0 0 101 47.94 +102 28 04/13/93 9721.35 0 0 102 1458.2 +103 67 03/12/93 5725.56 5725.56 0 103 0 +104 50 04/02/93 5413.1 0 811.97 104 0 +105 55 04/06/93 259.87 0 0 105 0 +106 80 03/24/93 3727.75 0 0 106 0 +107 76 04/06/93 8609.73 0 0 107 1291.46 +108 9 03/22/93 10866.06 0 0 108 1629.91 +109 81 03/24/93 241.55 0 0 109 0 +110 34 03/24/93 3389.44 0 0 110 0 +111 19 03/15/93 2420.8 0 0 111 0 +112 18 03/11/93 4742.6 5453.99 0 112 711.39 +113 30 03/30/93 4038.31 0 0 113 0 +114 65 03/19/93 40439.43 0 0 114 6065.91 +115 36 03/26/93 2590.76 0 0 115 388.61 +116 27 03/26/93 19075.61 0 0 117 2861.34 +117 7 04/05/93 2952.42 0 0 118 442.86 +118 46 04/12/93 22266.26 0 0 119 3339.94 +119 52 03/18/93 3523.51 0 0 120 528.53 +120 30 04/09/93 6604.32 0 0 121 0 +121 27 04/12/93 180.81 0 0 122 27.12 +122 81 03/19/93 687 0 0 123 0 +123 82 04/08/93 3678.77 0 0 124 0 +124 2 03/26/93 2669.86 0 0 125 400.48 +125 67 03/22/93 68.55 0 0 126 0 +126 43 03/26/93 5511.94 0 0 127 0 +127 45 04/02/93 10055.51 0 0 128 1508.33 +128 22 03/29/93 2850.73 0 0 129 427.61 +129 33 04/09/93 117.81 0 29.45 131 17.67 +130 83 03/30/93 9146.38 0 0 132 0 +131 16 04/05/93 3365.7 0 0 134 0 +132 6 04/09/93 541.75 0 0 135 81.26 +133 46 04/02/93 1367.35 0 0 136 205.1 +134 24 04/12/93 15147.81 0 0 138 2272.17 +135 42 03/23/93 3345.69 0 0 139 501.85 +136 40 04/09/93 1133.11 0 0 140 169.97 +137 7 04/12/93 4664.57 0 0 141 699.69 +138 75 04/14/93 14780.25 0 0 142 0 +139 43 03/19/93 5489.02 0 0 146 0 +140 34 04/05/93 6677.82 0 0 149 0 +141 19 04/02/93 25236.78 0 0 150 0 +142 46 04/05/93 292.95 0 0 156 43.94 +143 33 04/02/93 5531.85 0 0 159 829.78 +144 82 04/12/93 23947.6 0 0 161 0 +145 6 03/29/93 4953.75 0 0 165 743.06 +146 1 04/09/93 4605.91 0 0 177 0 +147 61 04/12/93 6302.15 0 0 178 945.32 +. +PSC +filename=Invoice +records=0000000000147 +ldbname=OETraining2024_Sportsdb +timestamp=2024/07/03-08:21:44 +numformat=44,46 +dateformat=mdy-1950 +map=NO-MAP +cpstream=ISO8859-1 +. +0000005842 diff --git a/Dbs/sports2000/data/item.d b/Dbs/sports2000/data/item.d new file mode 100644 index 0000000..baab2a9 --- /dev/null +++ b/Dbs/sports2000/data/item.d @@ -0,0 +1,67 @@ +1 "Fins" 3437 0 80 1 2 12 "Don't be caught dead without these! These real shark-skin fins will knock 'em dead at the beach. They'll see you coming from miles away while you're wearing the Original ""Fins"" by Bench/Lee. " +2 "Tennis Racquet" 64.5 0 151 7 7 14 "Use what the Pros use. Specify Graphite, Non-Rainforest Wood, or Aluminum. " +3 "Sweat Band" 2.55 142 335 59 65 11 "Keep your cool with Sweat Bands from Body Mist Inc. " +4 "Cycle Helmet" 75 141 126 41 56 5 "ANSI, ASCII, VHS, TCP/IP approved Cycle Helmets. You'll be styling around town in no time. Safety First with the official Cycle Helmet of the Iowa Racing Team." +5 "Leotard - Black" 19.95 56 340 30 27 0 "The sports unitard is one piece in cotton/Lycra spandex. Scooped tank front and racer back. " +6 "Ski Poles" 27.5 15 284 5 5 4 "Graphite ski poles. A great addition to your ski arsenal. Priced to sell!" +7 "Buoyancy Vest" 125 37 289 15 15 0 "Stay afloat with your own helium buoyancy vest. " +8 "Runner's Vest" 9.85 38 46 19 12 11 "This is really the Buoyancy Vest without the helium." +9 "Swim Goggles" 18 0 369 4 3 0 "Now where did I put those? These goggles will never get lost. They come with their own strap." +10 "Bowling Bag" 50 37 261 13 9 0 "Get ready Norton, we're going bowling. And won't your friends be envious when they see you walk in with your new Kram/Den Bowling Bag!" +11 "Lacrosse Stick" 34 51 427 19 15 0 "Slashing in for a score, you'll look like a pro with The Crugger Lacrosse Stick." +12 "Rugby Shirt" 34 61 247 30 28 0 "Look your best on or off the field. Available in three different color combinations: Gold and Purple, Red and White, or Black and Blue." +13 "Squash Glove" 10.99 0 96 24 16 0 "Keep a grip while smashing the competition. " +14 "Knee Guards" 15 86 625 59 50 6 "Great for gardening. Great for Hockey. " +15 "Football Helmet" 45 10 55 14 14 3 "See Cycle Helmet." +16 "Baseball Bat" 13.95 98 51 44 32 8 "This one's a real slugger. You'll crack them out of the park with this one." +17 "Tennis Balls" 5.95 258 368 65 74 14 "Three to a package. Available in white or florescent yellow." +18 "Wet Suit" 225 10 160 3 4 12 "This one piece, rubber suit will keep your warm in those chilly seas. Great for diving and surfing." +19 "Ski Wax - Red" 2.75 0 210 33 22 4 "It's red. It's wax. It helps you ski." +20 "Skis" 225 0 345 8 2 4 "They're for Nordic events! No, they're for Alpine events! Actually, they're great for both! " +21 "Ski Bindings" 56.5 0 308 16 8 4 "After the fall, these sure-grip bindings will break before you do." +22 "Squash Racquet" 32 12 426 18 15 0 "Use what the Pros use. Specify Graphite, Non-Rainforest Wood, or Aluminum." +23 "Squash Balls" 7.99 48 202 56 50 0 "Their round and they bounce. These long lasting rubber Sqash Balls are great for stick-ball too." +24 "Snorkel" 13.95 0 169 17 17 0 "On the reef or in a lake, the Ultra-Snorkel by AirWaves will take your breath away." +25 "Ski boots" 121 34 166 12 7 4 "" +26 "Ski mask" 4.99 110 306 42 38 4 "Looking to keep warm or just cause a scare at a local bank, the Ski Mask from CoverAll will pull off the job." +27 "Parka" 98 67 449 30 17 4 "Field tested by the Navy in Antartica." +28 "Ski Gloves" 23 32 489 10 8 4 "Field tested with the Parka." +29 "Gloves" 13.5 159 191 62 24 0 "See Ski Gloves." +30 "Windbreaker" 42.75 23 122 11 4 1 "Out for a day of sailing? Keep yourself warm with the jacket worn by the America's Cup champion." +31 "Sneakers" 31 213 317 102 97 11 "Did you ever want to leap tall opponents at a single bound? The AirKent cross-trainers are a super buy." +32 "Tennis Shorts" 19.99 27 286 12 5 14 "Available in traditional white, blue, tan, green, or pink." +33 "Shorts" 13.99 59 105 27 27 0 "See Tennis Shorts" +34 "Basketball" 14.27 18 291 5 5 16 "" +35 "Volleyball" 12.79 32 93 10 10 0 "" +36 "Soccer ball" 15.51 21 56 5 4 17 "" +37 "Football" 12.5 47 201 22 15 15 "" +38 "Bowling Shoes" 76 12 152 6 2 0 "" +39 "Bowling ball" 34 9 203 4 4 0 "" +40 "Ice Skates" 61 14 329 4 3 13 "" +41 "Hockey puck" 7.49 23 43 9 9 7 "Take a shot on goal with the Professional Model Hockey Puck from Rick-L's." +42 "Hockey stick" 37 39 38 12 14 7 "" +43 "Frisbee" 13.97 121 359 41 51 0 "" +44 "Shuttle cocks" 3.99 4 302 2 2 0 "Authentic original reproductions of the actual shuttlecocks that might have been used during the early days of the sport." +45 "Golf shoes" 81 8 386 2 3 1 "" +46 "Golf clubs" 317 19 243 8 8 1 "" +47 "Golf balls" 11.77 71 217 20 20 1 "" +48 "Sweat suit" 42 35 321 14 9 0 "" +49 "Whistle" 6.78 24 66 10 3 0 "" +50 "Croquet mallets" 13.99 22 376 6 5 0 "" +51 "Hoops" 14.78 35 210 16 13 0 "" +52 "Croquet ball" 3.69 27 404 14 8 0 "" +53 "Swimming trunks" 8.77 77 163 38 14 0 "" +54 "Shin pads" 4.86 32 343 15 6 6 "" +55 "Stop watch" 23.85 12 205 5 5 0 "" +. +PSC +filename=Item +records=0000000000055 +ldbname=OETraining2024_Sportsdb +timestamp=2024/07/03-08:21:44 +numformat=44,46 +dateformat=mdy-1950 +map=NO-MAP +cpstream=ISO8859-1 +. +0000004801 diff --git a/Dbs/sports2000/data/order-li.d b/Dbs/sports2000/data/order-li.d new file mode 100644 index 0000000..c821f67 --- /dev/null +++ b/Dbs/sports2000/data/order-li.d @@ -0,0 +1,885 @@ +1 1 54 4.86 30 10 131.22 no +1 2 55 23.85 21 10 450.77 no +1 3 53 8.77 75 10 591.98 no +1 4 28 23 39 10 807.3 no +1 5 39 34 75 10 2295 no +1 6 26 4.99 28 10 125.75 no +2 1 19 2.75 48 25 99 no +2 2 49 6.78 14 25 71.19 no +2 3 13 10.99 79 25 651.16 no +2 4 37 12.5 23 25 215.63 no +2 5 42 37 64 25 1776 no +3 1 45 81 95 5 7310.25 no +3 2 54 4.86 44 5 203.15 no +3 3 4 75 71 5 5058.75 no +3 4 30 42.75 90 5 3655.13 no +3 5 2 64.5 98 5 6004.95 no +3 6 32 19.99 67 5 1272.36 no +4 1 2 64.5 78 5 4779.45 no +4 2 30 42.75 38 5 1543.28 no +4 3 43 13.97 4 5 53.09 no +4 4 40 61 72 5 4172.4 no +4 5 8 9.85 21 5 196.51 no +4 6 53 8.77 97 5 808.16 no +4 7 19 2.75 78 5 203.78 no +5 1 52 3.69 31 45 62.91 no +5 2 16 13.95 82 45 629.15 no +5 3 3 2.55 69 45 96.77 no +5 4 12 34 83 45 1552.1 no +5 5 20 225 17 45 2103.75 no +5 6 45 81 12 45 534.6 no +5 7 18 225 82 45 10147.5 no +6 1 9 18 67 35 783.9 no +6 2 9 18 12 35 140.4 no +6 3 11 34 34 35 751.4 no +6 4 19 2.75 20 35 35.75 no +6 5 43 13.97 13 35 118.05 no +7 1 38 76 78 0 5928 no +7 2 49 6.78 48 0 325.44 no +7 3 33 13.99 6 0 83.94 no +8 1 38 76 60 10 4104 no +9 1 51 14.78 17 0 251.26 no +10 1 34 14.27 49 25 524.42 no +10 2 41 7.49 44 25 247.17 no +11 1 29 13.5 85 45 631.13 no +11 2 14 15 25 45 206.25 no +11 3 9 18 13 45 128.7 no +11 4 16 13.95 51 45 391.3 no +11 5 30 42.75 16 45 376.2 no +11 6 31 31 38 45 647.9 no +11 7 15 45 65 45 1608.75 no +12 1 9 18 91 10 1474.2 no +12 2 43 13.97 10 10 125.73 no +12 3 35 12.79 97 10 1116.57 no +12 4 45 81 59 10 4301.1 no +12 5 47 11.77 46 10 487.28 no +12 6 37 12.5 58 10 652.5 no +12 7 22 32 74 10 2131.2 no +13 1 9 18 84 35 982.8 no +13 2 40 61 16 35 634.4 no +13 3 36 15.51 61 35 614.97 no +13 4 5 19.95 40 35 518.7 no +13 5 25 121 32 35 2516.8 no +14 1 23 7.99 74 25 443.45 no +14 2 47 11.77 5 25 44.14 no +15 1 5 19.95 84 10 1508.22 no +15 2 12 34 88 10 2692.8 no +15 3 23 7.99 56 10 402.7 no +16 1 38 76 6 25 342 no +17 1 51 14.78 73 5 1024.99 no +18 1 55 23.85 10 45 131.18 no +18 2 37 12.5 91 45 625.63 no +18 3 46 317 79 45 13773.65 no +19 1 9 18 59 20 849.6 no +19 2 14 15 11 20 132 no +20 1 24 13.95 66 20 736.56 no +20 2 8 9.85 25 20 197 no +20 3 40 61 10 20 488 no +20 4 16 13.95 64 20 714.24 no +20 5 37 12.5 71 20 710 no +20 6 20 225 79 20 14220 no +20 7 42 37 69 20 2042.4 no +21 1 43 13.97 38 10 477.77 no +21 2 9 18 13 10 210.6 no +22 1 13 10.99 5 30 38.47 no +22 2 45 81 54 30 3061.8 no +22 3 1 42.95 54 30 1623.51 no +22 4 23 7.99 15 30 83.9 no +23 1 18 225 3 40 405 no +23 2 1 42.95 62 40 1597.74 no +24 1 31 31 18 25 418.5 no +24 2 34 14.27 45 25 481.61 no +24 3 27 98 17 25 1249.5 no +24 4 54 4.86 22 25 80.19 no +24 5 28 23 87 25 1500.75 no +24 6 15 45 39 25 1316.25 no +24 7 32 19.99 53 25 794.6 no +25 1 2 64.5 7 20 361.2 no +25 2 30 42.75 14 20 478.8 no +25 3 49 6.78 33 20 178.99 no +25 4 15 45 71 20 2556 no +25 5 6 27.5 46 20 1012 no +26 1 51 14.78 87 10 1157.27 no +26 2 32 19.99 62 10 1115.44 no +26 3 51 14.78 74 10 984.35 no +26 4 1 42.95 5 10 193.28 no +27 1 55 23.85 29 25 518.74 no +28 1 42 37 31 45 630.85 no +28 2 42 37 64 45 1302.4 no +28 3 28 23 61 45 771.65 no +28 4 53 8.77 9 45 43.41 no +28 5 30 42.75 91 45 2139.64 no +28 6 31 31 45 45 767.25 no +29 1 51 14.78 42 20 496.61 no +30 1 41 7.49 88 15 560.25 no +30 2 2 64.5 64 15 3508.8 no +30 3 36 15.51 65 15 856.93 no +30 4 53 8.77 55 15 410 no +30 5 26 4.99 13 15 55.14 no +30 6 39 34 59 15 1705.1 no +30 7 43 13.97 1 15 11.87 no +31 1 49 6.78 98 15 564.77 no +31 2 6 27.5 86 15 2010.25 no +31 3 51 14.78 80 15 1005.04 no +31 4 36 15.51 68 15 896.48 no +31 5 53 8.77 43 15 320.54 no +31 6 37 12.5 87 15 924.38 no +32 1 6 27.5 11 30 211.75 no +32 2 3 2.55 29 30 51.77 no +32 3 30 42.75 83 30 2483.78 no +33 1 22 32 96 20 2457.6 yes +33 2 45 81 10 20 648 no +33 3 15 45 98 20 3528 no +34 1 39 34 35 45 654.5 yes +34 2 2 64.5 1 45 35.48 no +34 3 25 121 40 45 2662 no +34 4 31 31 87 45 1483.35 no +35 1 25 121 49 25 4446.75 no +35 2 29 13.5 59 25 597.38 no +35 3 54 4.86 50 25 182.25 no +35 4 47 11.77 98 25 865.1 no +36 1 3 2.55 62 35 102.77 no +36 2 41 7.49 80 35 389.48 no +37 1 35 12.79 52 45 365.79 no +37 2 15 45 76 45 1881 no +37 3 28 23 65 45 822.25 no +38 1 38 76 33 30 1755.6 no +38 2 41 7.49 25 30 131.08 no +39 1 23 7.99 14 15 95.08 no +39 2 8 9.85 86 15 720.04 no +39 3 29 13.5 12 15 137.7 no +39 4 34 14.27 35 15 424.53 no +39 5 37 12.5 67 15 711.88 no +39 6 18 225 16 15 3060 no +39 7 27 98 22 15 1832.6 no +40 1 37 12.5 99 45 680.63 no +40 2 8 9.85 23 45 124.6 no +40 3 10 50 84 45 2310 no +41 1 17 5.95 99 40 353.43 no +41 2 45 81 63 40 3061.8 no +41 3 54 4.86 87 40 253.69 no +42 1 9 18 17 50 153 no +42 2 18 225 57 50 6412.5 no +42 3 48 42 28 50 588 no +42 4 34 14.27 65 50 463.78 no +42 5 41 7.49 72 50 269.64 no +43 1 1 42.95 11 0 472.45 no +44 1 30 42.75 22 25 705.38 no +44 2 26 4.99 46 25 172.16 no +44 3 6 27.5 83 25 1711.88 no +44 4 50 13.99 18 25 188.87 no +44 5 48 42 94 25 2961 no +44 6 44 3.99 36 25 107.73 no +44 7 47 11.77 76 25 670.89 no +45 1 28 23 88 50 1012 no +46 1 17 5.95 64 5 361.76 no +46 2 16 13.95 37 5 490.34 no +46 3 31 31 9 5 265.05 no +46 4 46 317 66 5 19875.9 no +46 5 9 18 31 5 530.1 no +46 6 23 7.99 92 5 698.33 no +46 7 45 81 98 5 7541.1 no +47 1 4 75 15 50 562.5 no +47 2 9 18 91 50 819 no +47 3 49 6.78 22 50 74.58 no +47 4 43 13.97 6 50 41.91 no +47 5 20 225 87 50 9787.5 no +47 6 37 12.5 18 50 112.5 no +48 1 17 5.95 16 10 85.68 no +48 2 32 19.99 80 10 1439.28 no +48 3 41 7.49 9 10 60.67 no +48 4 39 34 52 10 1591.2 no +48 5 37 12.5 69 10 776.25 no +48 6 10 50 55 10 2475 no +49 1 16 13.95 47 10 590.09 no +49 2 48 42 81 10 3061.8 no +49 3 4 75 23 10 1552.5 no +49 4 30 42.75 48 10 1846.8 no +50 1 23 7.99 39 30 218.13 no +50 2 35 12.79 20 30 179.06 no +50 3 43 13.97 5 30 48.9 no +51 1 16 13.95 90 20 1004.4 no +51 2 9 18 19 20 273.6 no +51 3 17 5.95 80 20 380.8 no +51 4 17 5.95 34 20 161.84 no +51 5 35 12.79 86 20 879.95 no +51 6 29 13.5 38 20 410.4 no +52 1 1 42.95 4 0 171.8 no +52 2 22 32 69 0 2208 no +52 3 17 5.95 3 0 17.85 no +52 4 1 42.95 74 0 3178.3 no +52 5 16 13.95 86 0 1199.7 no +52 6 14 15 20 0 300 no +52 7 32 19.99 23 0 459.77 no +53 1 47 11.77 49 45 317.2 no +53 2 15 45 23 45 569.25 no +53 3 1 42.95 73 45 1724.44 no +54 1 55 23.85 3 30 50.09 no +54 2 17 5.95 26 30 108.29 no +54 3 19 2.75 63 30 121.28 no +54 4 50 13.99 59 30 577.79 no +54 5 40 61 64 30 2732.8 no +54 6 29 13.5 76 30 718.2 no +54 7 27 98 1 30 68.6 no +55 1 7 125 41 10 4612.5 no +55 2 1 42.95 2 10 77.31 no +55 3 22 32 83 10 2390.4 no +55 4 15 45 60 10 2430 no +56 1 49 6.78 40 25 203.4 no +56 2 52 3.69 84 25 232.47 no +57 1 41 7.49 50 5 355.78 no +57 2 8 9.85 10 5 93.58 no +57 3 48 42 64 5 2553.6 no +57 4 13 10.99 12 5 125.29 no +57 5 37 12.5 81 5 961.88 no +58 1 25 121 42 45 2795.1 no +58 2 23 7.99 100 45 439.45 no +59 1 7 125 25 0 3125 no +59 2 36 15.51 32 0 496.32 no +60 1 28 23 55 10 1138.5 no +60 2 53 8.77 27 10 213.11 no +61 1 4 75 28 10 1890 no +61 2 1 42.95 16 10 618.48 no +61 3 29 13.5 82 10 996.3 no +61 4 19 2.75 96 10 237.6 no +61 5 45 81 20 10 1458 no +62 1 53 8.77 22 30 135.06 no +62 2 26 4.99 25 30 87.33 no +62 3 31 31 53 30 1150.1 no +62 4 18 225 92 30 14490 no +62 5 31 31 44 30 954.8 no +62 6 32 19.99 49 30 685.66 no +63 1 31 31 56 0 1736 no +63 2 51 14.78 29 0 428.62 no +63 3 31 31 51 0 1581 no +63 4 48 42 46 0 1932 no +63 5 21 56.5 75 0 4237.5 no +63 6 36 15.51 84 0 1302.84 no +64 1 50 13.99 88 15 1046.45 no +64 2 25 121 2 15 205.7 no +64 3 53 8.77 50 15 372.73 no +64 4 24 13.95 84 15 996.03 no +64 5 46 317 86 15 23172.7 no +64 6 5 19.95 66 15 1119.2 no +65 1 32 19.99 90 0 1799.1 no +65 2 48 42 57 0 2394 no +66 1 24 13.95 95 5 1258.99 no +66 2 7 125 37 5 4393.75 no +66 3 23 7.99 79 5 599.65 no +66 4 18 225 46 5 9832.5 no +66 5 18 225 89 5 19023.75 no +66 6 33 13.99 11 5 146.2 no +66 7 40 61 23 5 1332.85 no +67 1 53 8.77 4 25 26.31 no +67 2 22 32 26 25 624 no +68 1 37 12.5 31 50 193.75 no +68 2 6 27.5 21 50 288.75 no +68 3 6 27.5 38 50 522.5 no +69 1 9 18 31 5 530.1 no +69 2 38 76 98 5 7075.6 no +69 3 48 42 17 5 678.3 no +69 4 39 34 68 5 2196.4 no +69 5 16 13.95 85 5 1126.46 no +69 6 39 34 90 5 2907 no +70 1 15 45 3 30 94.5 no +70 2 39 34 95 30 2261 no +70 3 54 4.86 24 30 81.65 no +70 4 20 225 27 30 4252.5 no +70 5 1 42.95 48 30 1443.12 no +70 6 14 15 51 30 535.5 no +71 1 40 61 90 15 4666.5 no +71 2 3 2.55 31 15 67.19 no +71 3 35 12.79 61 15 663.16 no +71 4 13 10.99 66 15 616.54 no +71 5 44 3.99 11 15 37.31 no +72 1 39 34 32 50 544 no +72 2 40 61 45 50 1372.5 no +72 3 11 34 91 50 1547 no +72 4 11 34 35 50 595 no +72 5 2 64.5 49 50 1580.25 no +73 1 21 56.5 8 30 316.4 no +73 2 45 81 2 30 113.4 no +73 3 10 50 4 30 140 no +74 1 42 37 29 10 965.7 no +74 2 8 9.85 66 10 585.09 no +75 1 22 32 33 10 950.4 no +76 1 30 42.75 83 30 2483.78 no +76 2 55 23.85 27 30 450.77 no +76 3 43 13.97 57 30 557.4 no +76 4 51 14.78 81 30 838.03 no +77 1 2 64.5 17 45 603.08 no +77 2 36 15.51 7 45 59.71 no +77 3 40 61 89 45 2985.95 no +77 4 55 23.85 88 45 1154.34 no +78 1 28 23 8 0 184 no +79 1 26 4.99 5 35 16.22 no +79 2 31 31 60 35 1209 no +79 3 54 4.86 2 35 6.32 no +79 4 39 34 23 35 508.3 no +79 5 46 317 91 35 18750.55 no +79 6 46 317 69 35 14217.45 no +80 1 1 42.95 94 5 3835.44 no +80 2 28 23 67 5 1463.95 no +80 3 38 76 40 5 2888 no +81 1 5 19.95 87 35 1128.17 no +81 2 15 45 10 35 292.5 no +81 3 9 18 90 35 1053 no +81 4 17 5.95 92 35 355.81 no +81 5 28 23 95 35 1420.25 no +81 6 54 4.86 80 35 252.72 no +82 1 51 14.78 11 50 81.29 yes +82 2 52 3.69 57 50 105.17 no +82 3 41 7.49 41 50 153.55 no +82 4 43 13.97 48 50 335.28 no +82 5 21 56.5 11 50 310.75 no +82 6 24 13.95 26 50 181.35 no +82 7 29 13.5 45 50 303.75 no +83 1 54 4.86 58 0 281.88 no +83 2 25 121 84 0 10164 no +83 3 12 34 45 0 1530 no +84 1 11 34 79 20 2148.8 no +84 2 47 11.77 89 20 838.02 no +84 3 21 56.5 44 20 1988.8 no +85 1 18 225 2 30 315 no +85 2 11 34 98 30 2332.4 no +85 3 34 14.27 63 30 629.31 no +85 4 11 34 23 30 547.4 no +86 1 30 42.75 27 45 634.84 no +86 2 51 14.78 65 45 528.39 no +86 3 17 5.95 63 45 206.17 no +86 4 33 13.99 52 45 400.11 no +86 5 21 56.5 63 45 1957.73 no +87 1 36 15.51 80 45 682.44 no +87 2 28 23 53 45 670.45 no +87 3 7 125 13 45 893.75 no +87 4 2 64.5 80 45 2838 no +88 1 27 98 5 35 318.5 no +88 2 51 14.78 52 35 499.56 no +88 3 10 50 64 35 2080 no +88 4 7 125 25 35 2031.25 no +88 5 50 13.99 7 35 63.65 no +88 6 36 15.51 66 35 665.38 no +89 1 31 31 49 50 759.5 no +89 2 42 37 5 50 92.5 no +89 3 6 27.5 40 50 550 no +89 4 53 8.77 79 50 346.42 no +89 5 13 10.99 59 50 324.21 no +90 1 48 42 44 10 1663.2 no +90 2 13 10.99 18 10 178.04 no +90 3 34 14.27 31 10 398.13 no +90 4 4 75 73 10 4927.5 no +91 1 36 15.51 99 25 1151.62 no +91 2 53 8.77 5 25 32.89 no +91 3 37 12.5 47 25 440.63 no +91 4 22 32 97 25 2328 no +91 5 38 76 28 25 1596 no +91 6 2 64.5 55 25 2660.63 no +91 7 8 9.85 67 25 494.96 no +92 1 55 23.85 6 35 93.02 no +92 2 41 7.49 1 35 4.87 no +92 3 18 225 13 35 1901.25 no +92 4 5 19.95 70 35 907.73 no +93 1 17 5.95 84 5 474.81 no +93 2 38 76 62 5 4476.4 no +93 3 19 2.75 10 5 26.13 no +94 1 53 8.77 98 35 558.65 no +94 2 38 76 75 35 3705 no +94 3 35 12.79 80 35 665.08 no +95 1 18 225 73 0 16425 no +95 2 42 37 44 0 1628 no +96 1 30 42.75 89 30 2663.33 no +96 2 30 42.75 24 30 718.2 no +96 3 38 76 17 30 904.4 no +97 1 41 7.49 39 45 160.66 no +97 2 31 31 31 45 528.55 no +97 3 8 9.85 37 45 200.45 no +97 4 32 19.99 41 45 450.77 no +97 5 11 34 48 45 897.6 no +97 6 33 13.99 15 45 115.42 no +97 7 51 14.78 89 45 723.48 no +98 1 40 61 94 50 2867 no +98 2 32 19.99 59 50 589.71 no +98 3 51 14.78 36 50 266.04 no +98 4 7 125 57 50 3562.5 no +98 5 4 75 15 50 562.5 no +98 6 6 27.5 100 50 1375 no +98 7 45 81 17 50 688.5 no +99 1 23 7.99 3 10 21.57 no +99 2 44 3.99 100 10 359.1 no +100 1 1 42.95 39 45 921.28 no +100 2 37 12.5 61 45 419.38 no +100 3 40 61 82 45 2751.1 no +100 4 34 14.27 26 45 204.06 no +100 5 23 7.99 92 45 404.29 no +100 6 39 34 48 45 897.6 no +101 1 23 7.99 50 20 319.6 no +102 1 7 125 95 45 6531.25 no +102 2 5 19.95 50 45 548.63 no +102 3 8 9.85 92 45 498.41 no +102 4 11 34 91 45 1701.7 no +102 5 13 10.99 53 45 320.36 no +102 6 19 2.75 80 45 121 no +103 1 50 13.99 61 30 597.37 no +103 2 41 7.49 53 30 277.88 no +103 3 21 56.5 85 30 3361.75 no +103 4 43 13.97 74 30 723.65 no +103 5 24 13.95 27 30 263.66 no +103 6 41 7.49 38 30 199.23 no +103 7 23 7.99 54 30 302.02 no +104 1 13 10.99 99 25 816.01 no +104 2 55 23.85 97 25 1735.09 no +104 3 31 31 54 25 1255.5 no +104 4 11 34 8 25 204 no +104 5 12 34 55 25 1402.5 no +105 1 32 19.99 20 35 259.87 no +106 1 39 34 77 35 1701.7 no +106 2 48 42 24 35 655.2 no +106 3 42 37 57 35 1370.85 no +107 1 27 98 76 35 4841.2 no +107 2 18 225 17 35 2486.25 no +107 3 51 14.78 78 35 749.35 no +107 4 47 11.77 59 35 451.38 no +107 5 52 3.69 34 35 81.55 no +108 1 21 56.5 58 10 2949.3 no +108 2 20 225 24 10 4860 no +108 3 55 23.85 43 10 923 no +108 4 14 15 91 10 1228.5 no +108 5 43 13.97 72 10 905.26 no +109 1 41 7.49 43 25 241.55 no +110 1 11 34 57 30 1356.6 no +110 2 26 4.99 66 30 230.54 no +110 3 40 61 17 30 725.9 no +110 4 47 11.77 70 30 576.73 no +110 5 41 7.49 14 30 73.4 no +110 6 32 19.99 6 30 83.96 no +110 7 26 4.99 98 30 342.31 no +111 1 11 34 49 20 1332.8 no +111 2 12 34 40 20 1088 no +112 1 27 98 12 35 764.4 no +112 2 31 31 76 35 1531.4 no +112 3 45 81 40 35 2106 no +112 4 41 7.49 70 35 340.8 no +113 1 2 64.5 17 45 603.08 no +113 2 34 14.27 88 45 690.67 no +113 3 24 13.95 87 45 667.51 no +113 4 8 9.85 37 45 200.45 no +113 5 45 81 14 45 623.7 no +113 6 12 34 67 45 1252.9 no +114 1 3 2.55 57 20 116.28 yes +114 2 47 11.77 1 20 9.42 no +114 3 22 32 3 20 76.8 no +114 4 18 225 95 20 17100 no +114 5 46 317 90 20 22824 no +114 6 43 13.97 28 20 312.93 no +115 1 20 225 16 50 1800 no +115 2 5 19.95 20 50 199.5 no +115 3 34 14.27 31 50 221.19 no +115 4 53 8.77 12 50 52.62 no +115 5 5 19.95 2 50 19.95 no +115 6 17 5.95 100 50 297.5 no +116 1 6 27.5 11 45 166.38 no +116 2 17 5.95 76 45 248.71 no +117 1 14 15 93 0 1395 no +117 2 21 56.5 38 0 2147 no +117 3 15 45 96 0 4320 no +117 4 45 81 78 0 6318 no +117 5 10 50 87 0 4350 no +117 6 33 13.99 39 0 545.61 no +118 1 16 13.95 76 15 901.17 yes +118 2 36 15.51 73 15 962.4 no +118 3 40 61 21 15 1088.85 no +119 1 35 12.79 51 25 489.22 no +119 2 43 13.97 54 25 565.79 no +119 3 34 14.27 45 25 481.61 no +119 4 41 7.49 74 25 415.7 no +119 5 19 2.75 51 25 105.19 no +119 6 46 317 85 25 20208.75 no +120 1 26 4.99 91 30 317.86 no +120 2 2 64.5 71 30 3205.65 no +121 1 51 14.78 20 45 162.58 no +121 2 2 64.5 48 45 1702.8 no +121 3 55 23.85 45 45 590.29 no +121 4 31 31 48 45 818.4 no +121 5 2 64.5 80 45 2838 no +121 6 44 3.99 100 45 219.45 no +121 7 31 31 16 45 272.8 no +122 1 52 3.69 49 0 180.81 no +123 1 42 37 20 25 555 no +123 2 19 2.75 64 25 132 no +124 1 50 13.99 37 25 388.22 yes +124 2 27 98 23 25 1690.5 no +124 3 9 18 23 25 310.5 no +124 4 34 14.27 33 25 353.18 no +124 5 29 13.5 77 25 779.63 no +124 6 54 4.86 43 25 156.74 no +125 1 41 7.49 74 35 360.27 no +125 2 28 23 98 35 1465.1 no +125 3 43 13.97 93 35 844.49 no +126 1 33 13.99 7 30 68.55 no +127 1 13 10.99 60 45 362.67 no +127 2 38 76 90 45 3762 no +127 3 22 32 64 45 1126.4 no +127 4 16 13.95 34 45 260.87 no +128 1 21 56.5 55 15 2641.38 no +128 2 27 98 40 15 3332 no +128 3 21 56.5 85 15 4082.13 no +129 1 54 4.86 77 50 187.11 yes +129 2 50 13.99 29 50 202.86 no +129 3 54 4.86 62 50 150.66 no +129 4 55 23.85 78 50 930.15 no +129 5 55 23.85 54 50 643.95 no +129 6 22 32 46 50 736 no +130 1 51 14.78 54 0 798.12 no +130 2 46 317 79 0 25043 no +130 3 28 23 92 0 2116 no +130 4 24 13.95 14 0 195.3 no +130 5 34 14.27 30 0 428.1 no +131 1 17 5.95 36 45 117.81 no +132 1 33 13.99 23 5 305.68 no +132 2 2 64.5 84 5 5147.1 no +132 3 45 81 48 5 3693.6 no +133 1 24 13.95 43 0 599.85 no +133 2 52 3.69 78 0 287.82 no +133 3 45 81 38 0 3078 no +133 4 28 23 60 0 1380 no +133 5 43 13.97 100 0 1397 no +134 1 7 125 4 40 300 no +134 2 9 18 74 40 799.2 no +134 3 4 75 1 40 45 no +134 4 2 64.5 9 40 348.3 no +134 5 28 23 50 40 690 no +134 6 11 34 58 40 1183.2 no +135 1 8 9.85 55 0 541.75 no +136 1 39 34 17 25 433.5 no +136 2 53 8.77 69 25 453.85 no +136 3 22 32 20 25 480 no +137 1 45 81 88 50 3564 no +137 2 29 13.5 66 50 445.5 no +137 3 29 13.5 20 50 135 no +137 4 27 98 83 50 4067 no +138 1 50 13.99 75 35 682.01 no +138 2 47 11.77 71 35 543.19 no +138 3 43 13.97 53 35 481.27 no +138 4 27 98 43 35 2739.1 no +138 5 32 19.99 2 35 25.99 no +138 6 18 225 73 35 10676.25 no +139 1 8 9.85 83 50 408.78 no +139 2 41 7.49 30 50 112.35 no +139 3 45 81 39 50 1579.5 no +139 4 8 9.85 99 50 487.58 no +139 5 34 14.27 67 50 478.05 no +139 6 8 9.85 10 50 49.25 no +139 7 24 13.95 33 50 230.18 no +140 1 17 5.95 22 15 111.27 no +140 2 24 13.95 56 15 664.02 no +140 3 53 8.77 48 15 357.82 no +141 1 24 13.95 40 15 474.3 no +141 2 42 37 81 15 2547.45 no +141 3 41 7.49 94 15 598.45 no +141 4 14 15 28 15 357 no +141 5 41 7.49 58 15 369.26 no +141 6 26 4.99 75 15 318.11 no +142 1 14 15 13 15 165.75 no +142 2 25 121 71 15 7302.35 no +142 3 4 75 16 15 1020 no +142 4 25 121 57 15 5862.45 no +142 5 52 3.69 81 15 254.06 no +142 6 52 3.69 56 15 175.64 no +143 1 31 31 38 30 824.6 no +143 2 26 4.99 59 30 206.09 no +143 3 18 225 10 30 1575 no +143 4 3 2.55 75 30 133.88 no +143 5 47 11.77 55 30 453.15 no +143 6 53 8.77 39 30 239.42 no +144 1 40 61 65 35 2577.25 no +144 2 22 32 88 35 1830.4 no +144 3 13 10.99 28 35 200.02 no +144 4 44 3.99 64 35 165.98 no +144 5 14 15 55 35 536.25 no +144 6 27 98 28 35 1783.6 no +144 7 48 42 55 35 1501.5 no +145 1 24 13.95 34 35 308.3 no +146 1 10 50 12 45 330 no +146 2 49 6.78 18 45 67.12 no +146 3 10 50 35 45 962.5 no +146 4 9 18 13 45 128.7 no +146 5 38 76 83 45 3469.4 no +146 6 28 23 42 45 531.3 no +147 1 46 317 95 35 19574.75 no +147 2 20 225 41 35 5996.25 no +147 3 11 34 98 35 2165.8 no +147 4 45 81 68 35 3580.2 no +147 5 37 12.5 65 35 528.13 no +147 6 23 7.99 41 35 212.93 no +148 1 21 56.5 16 10 813.6 no +148 2 10 50 18 10 810 no +148 3 33 13.99 26 10 327.37 no +148 4 17 5.95 98 10 524.79 no +148 5 48 42 17 10 642.6 no +148 6 20 225 26 10 5265 no +148 7 39 34 64 10 1958.4 no +149 1 48 42 91 30 2675.4 no +149 2 50 13.99 61 30 597.37 no +149 3 55 23.85 41 30 684.5 no +149 4 52 3.69 27 30 69.74 no +149 5 39 34 80 30 1904 no +149 6 43 13.97 71 30 694.31 no +149 7 4 75 1 30 52.5 no +150 1 12 34 97 20 2638.4 no +150 2 27 98 24 20 1881.6 no +150 3 15 45 18 20 648 no +150 4 26 4.99 2 20 7.98 no +150 5 12 34 89 20 2420.8 no +150 6 18 225 98 20 17640 no +151 1 10 50 36 50 900 no +151 2 4 75 20 50 750 no +151 3 40 61 85 50 2592.5 no +151 4 28 23 69 50 793.5 no +151 5 28 23 63 50 724.5 no +152 1 44 3.99 86 50 171.57 no +152 2 7 125 68 50 4250 no +153 1 44 3.99 66 30 184.34 no +153 2 28 23 82 30 1320.2 no +153 3 50 13.99 89 30 871.58 no +153 4 41 7.49 43 30 225.45 no +153 5 26 4.99 70 30 244.51 no +154 1 35 12.79 36 25 345.33 no +154 2 38 76 43 25 2451 no +154 3 48 42 20 25 630 no +154 4 6 27.5 96 25 1980 no +154 5 50 13.99 46 25 482.66 no +155 1 31 31 70 35 1410.5 no +155 2 52 3.69 69 35 165.5 no +156 1 24 13.95 28 25 292.95 no +157 1 22 32 37 50 592 no +158 1 32 19.99 58 50 579.71 no +159 1 30 42.75 64 45 1504.8 no +159 2 2 64.5 20 45 709.5 no +159 3 14 15 6 45 49.5 no +159 4 54 4.86 31 45 82.86 no +159 5 11 34 53 45 991.1 no +159 6 30 42.75 67 45 1575.34 no +159 7 4 75 15 45 618.75 no +160 1 22 32 70 10 2016 no +160 2 23 7.99 1 10 7.19 no +160 3 28 23 57 10 1179.9 no +160 4 6 27.5 80 10 1980 no +160 5 52 3.69 9 10 29.89 no +160 6 14 15 92 10 1242 no +160 7 14 15 49 10 661.5 no +161 1 54 4.86 6 25 21.87 no +161 2 36 15.51 73 25 849.17 no +161 3 55 23.85 58 25 1037.48 no +161 4 18 225 98 25 16537.5 no +161 5 49 6.78 48 25 244.08 no +161 6 19 2.75 40 25 82.5 no +161 7 4 75 92 25 5175 no +162 1 51 14.78 89 25 986.57 no +162 2 30 42.75 61 25 1955.81 no +162 3 9 18 86 25 1161 no +162 4 6 27.5 7 25 144.38 no +162 5 43 13.97 18 25 188.6 no +162 6 14 15 100 25 1125 no +162 7 51 14.78 16 25 177.36 no +163 1 20 225 79 10 15997.5 no +163 2 50 13.99 21 10 264.41 no +163 3 14 15 41 10 553.5 no +163 4 40 61 77 10 4227.3 no +163 5 42 37 38 10 1265.4 no +163 6 52 3.69 95 10 315.5 no +164 1 23 7.99 64 50 255.68 no +165 1 41 7.49 65 0 486.85 no +165 2 50 13.99 10 0 139.9 no +165 3 12 34 25 0 850 no +165 4 40 61 57 0 3477 no +166 1 25 121 96 15 9873.6 no +166 2 12 34 36 15 1040.4 no +166 3 45 81 57 15 3924.45 no +166 4 9 18 30 15 459 no +166 5 39 34 84 15 2427.6 no +166 6 23 7.99 89 15 604.44 no +166 7 52 3.69 72 15 225.83 no +167 1 48 42 21 10 793.8 no +167 2 14 15 19 10 256.5 no +167 3 7 125 72 10 8100 no +167 4 5 19.95 22 10 395.01 no +167 5 47 11.77 77 10 815.66 no +167 6 5 19.95 38 10 682.29 no +168 1 21 56.5 49 25 2076.38 no +168 2 3 2.55 91 25 174.04 no +168 3 49 6.78 2 25 10.17 no +169 1 27 98 68 0 6664 no +169 2 54 4.86 44 0 213.84 no +169 3 3 2.55 48 0 122.4 no +170 1 11 34 80 35 1768 yes +171 1 13 10.99 22 35 157.16 no +171 2 5 19.95 96 35 1244.88 no +171 3 32 19.99 78 35 1013.49 no +171 4 10 50 1 35 32.5 no +171 5 20 225 44 35 6435 no +171 6 31 31 34 35 685.1 no +172 1 18 225 66 0 14850 no +172 2 14 15 12 0 180 no +173 1 2 64.5 35 35 1467.38 no +173 2 17 5.95 90 35 348.08 no +173 3 50 13.99 90 35 818.42 no +173 4 44 3.99 16 35 41.5 no +173 5 4 75 27 35 1316.25 no +173 6 39 34 33 35 729.3 no +174 1 3 2.55 63 40 96.39 no +174 2 19 2.75 89 40 146.85 no +174 3 21 56.5 27 40 915.3 no +174 4 29 13.5 4 40 32.4 no +174 5 33 13.99 13 40 109.12 no +174 6 5 19.95 87 40 1041.39 no +174 7 9 18 11 40 118.8 no +175 1 48 42 57 15 2034.9 no +175 2 31 31 77 15 2028.95 no +175 3 38 76 46 15 2971.6 no +175 4 24 13.95 13 15 154.15 no +175 5 20 225 1 15 191.25 no +175 6 12 34 99 15 2861.1 no +175 7 43 13.97 31 15 368.11 no +176 1 29 13.5 22 45 163.35 no +176 2 25 121 54 45 3593.7 no +176 3 14 15 36 45 297 no +176 4 52 3.69 1 45 2.03 no +176 5 11 34 61 45 1140.7 no +176 6 25 121 16 45 1064.8 no +176 7 2 64.5 30 45 1064.25 no +177 1 9 18 81 35 947.7 no +177 2 29 13.5 31 35 272.03 no +177 3 30 42.75 70 35 1945.13 no +177 4 14 15 61 35 594.75 no +177 5 31 31 42 35 846.3 no +178 1 22 32 63 10 1814.4 no +178 2 35 12.79 82 10 943.9 no +178 3 31 31 80 10 2232 no +178 4 52 3.69 77 10 255.72 no +178 5 43 13.97 84 10 1056.13 no +179 1 32 19.99 38 25 569.72 no +179 2 30 42.75 43 25 1378.69 no +180 1 54 4.86 24 45 64.15 no +180 2 54 4.86 82 45 219.19 no +180 3 38 76 20 45 836 no +180 4 14 15 8 45 66 no +181 1 22 32 92 35 1913.6 no +181 2 54 4.86 31 35 97.93 no +181 3 9 18 90 35 1053 no +181 4 6 27.5 36 35 643.5 no +181 5 55 23.85 39 35 604.6 no +181 6 12 34 72 35 1591.2 no +181 7 37 12.5 81 35 658.13 no +182 1 6 27.5 54 0 1485 no +182 2 48 42 68 0 2856 no +182 3 8 9.85 46 0 453.1 no +182 4 13 10.99 46 0 505.54 no +182 5 28 23 2 0 46 no +182 6 22 32 57 0 1824 no +183 1 36 15.51 56 0 868.56 no +184 1 53 8.77 77 20 540.23 no +184 2 27 98 3 20 235.2 no +184 3 39 34 22 20 598.4 no +184 4 43 13.97 86 20 961.14 no +184 5 34 14.27 92 20 1050.27 no +184 6 5 19.95 97 20 1548.12 no +184 7 10 50 50 20 2000 no +185 1 43 13.97 99 35 898.97 no +185 2 29 13.5 4 35 35.1 no +186 1 48 42 73 15 2606.1 no +186 2 30 42.75 6 15 218.03 no +187 1 27 98 38 5 3537.8 no +188 1 17 5.95 91 30 379.02 no +188 2 9 18 96 30 1209.6 no +188 3 38 76 36 30 1915.2 no +189 1 54 4.86 6 10 26.24 no +189 2 44 3.99 70 10 251.37 no +189 3 49 6.78 37 10 225.77 no +189 4 40 61 19 10 1043.1 no +189 5 20 225 72 10 14580 no +190 1 10 50 80 10 3600 no +190 2 40 61 46 10 2525.4 no +190 3 55 23.85 52 10 1116.18 no +190 4 3 2.55 21 10 48.2 no +191 1 12 34 25 20 680 no +191 2 26 4.99 74 20 295.41 no +191 3 21 56.5 84 20 3796.8 no +192 1 50 13.99 32 50 223.84 no +192 2 31 31 67 50 1038.5 no +192 3 18 225 84 50 9450 no +192 4 26 4.99 38 50 94.81 no +192 5 21 56.5 93 50 2627.25 no +192 6 51 14.78 51 50 376.89 no +192 7 38 76 3 50 114 no +193 1 48 42 10 5 399 no +193 2 50 13.99 98 5 1302.47 no +193 3 9 18 56 5 957.6 no +193 4 34 14.27 3 5 40.67 no +193 5 34 14.27 84 5 1138.75 no +193 6 2 64.5 86 5 5269.65 no +194 1 53 8.77 47 20 329.75 no +195 1 47 11.77 85 0 1000.45 no +195 2 40 61 37 0 2257 no +195 3 34 14.27 82 0 1170.14 no +195 4 38 76 4 0 304 no +195 5 20 225 82 0 18450 no +196 1 32 19.99 64 35 831.58 no +196 2 23 7.99 7 35 36.35 no +197 1 35 12.79 57 45 400.97 no +197 2 7 125 96 45 6600 no +197 3 11 34 74 45 1383.8 no +197 4 14 15 74 45 610.5 no +197 5 49 6.78 27 45 100.68 no +197 6 12 34 7 45 130.9 no +198 1 32 19.99 48 50 479.76 no +198 2 55 23.85 59 50 703.58 no +198 3 22 32 9 50 144 no +198 4 54 4.86 90 50 218.7 no +198 5 17 5.95 13 50 38.68 no +198 6 12 34 8 50 136 no +199 1 16 13.95 51 5 675.88 no +199 2 10 50 76 5 3610 no +199 3 14 15 88 5 1254 no +199 4 30 42.75 12 5 487.35 no +199 5 21 56.5 39 5 2093.33 no +199 6 52 3.69 49 5 171.77 no +199 7 43 13.97 25 5 331.79 no +200 1 24 13.95 65 35 589.39 no +200 2 7 125 53 35 4306.25 no +200 3 27 98 88 35 5605.6 no +200 4 37 12.5 55 35 446.88 no +200 5 11 34 57 35 1259.7 no +200 6 31 31 31 35 624.65 no +200 7 19 2.75 30 35 53.63 no +201 1 55 23.85 19 35 294.55 yes +201 2 45 81 70 35 3685.5 no +201 3 27 98 96 35 6115.2 no +201 4 45 81 65 35 3422.25 no +202 1 14 15 51 50 382.5 no +202 2 55 23.85 36 50 429.3 no +202 3 54 4.86 66 50 160.38 no +202 4 26 4.99 65 50 162.18 no +202 5 46 317 69 50 10936.5 no +203 1 3 2.55 37 5 89.63 no +204 1 22 32 73 50 1168 no +204 2 27 98 45 50 2205 no +205 1 15 45 55 10 2227.5 no +206 1 29 13.5 75 20 810 no +206 2 11 34 57 20 1550.4 no +206 3 52 3.69 31 20 91.51 no +207 1 28 23 23 25 396.75 no +207 2 4 75 79 25 4443.75 no +207 3 19 2.75 91 25 187.69 no +207 4 28 23 41 25 707.25 no +. +PSC +filename=Order-Line +records=0000000000873 +ldbname=OETraining2024_Sportsdb +timestamp=2024/07/03-08:21:44 +numformat=44,46 +dateformat=mdy-1950 +map=NO-MAP +cpstream=ISO8859-1 +. +0000025399 diff --git a/Dbs/sports2000/data/order.d b/Dbs/sports2000/data/order.d new file mode 100644 index 0000000..a64bafe --- /dev/null +++ b/Dbs/sports2000/data/order.d @@ -0,0 +1,219 @@ +1 53 01/01/93 02/08/93 02/03/93 "FlyByNight Courier" "" "" "Net30" "RDR" +2 81 01/04/93 01/15/93 01/15/93 "Walkers Delivery" "" "" "Net30" "HXM" +3 66 01/04/93 02/17/93 02/16/93 "Standard Mail" "" "" "Net30" "HXM" +4 83 01/05/93 01/25/93 01/26/93 "Standard Mail" "" "" "Net30" "HXM" +5 72 01/05/93 01/21/93 01/20/93 "Standard Mail" "" "" "Net30" "JAL" +6 1 01/05/93 02/08/93 02/03/93 "Standard Mail" "" "" "Net30" "HXM" +7 51 01/06/93 02/08/93 02/08/93 "Standard Mail" "" "" "Net30" "KIK" +8 38 01/06/93 01/14/93 01/18/93 "Standard Mail" "" "" "Net30" "DKP" +9 51 01/06/93 01/27/93 02/01/93 "Standard Mail" "" "" "Net30" "KIK" +10 11 01/06/93 02/11/93 02/12/93 "FlyByNight Courier" "" "" "Net30" "DKP" +11 28 01/06/93 02/16/93 02/15/93 "Walkers Delivery" "" "" "Net30" "DKP" +12 37 01/07/93 02/05/93 02/10/93 "Walkers Delivery" "" "" "Net30" "GPE" +13 69 01/08/93 01/15/93 01/21/93 "FlyByNight Courier" "" "" "Net30" "DKP" +14 82 01/08/93 01/21/93 01/20/93 "Standard Mail" "" "" "Net30" "JAL" +15 61 01/08/93 01/22/93 01/20/93 "Standard Mail" "" "" "Net30" "DKP" +16 11 01/08/93 02/19/93 02/15/93 "Standard Mail" "" "" "Net30" "DKP" +17 48 01/11/93 02/12/93 02/08/93 "FlyByNight Courier" "" "" "Net30" "DKP" +18 30 01/11/93 02/22/93 02/23/93 "FlyByNight Courier" "" "" "Net30" "HXM" +19 58 01/11/93 01/27/93 01/22/93 "Standard Mail" "" "" "Net30" "HXM" +20 14 01/11/93 02/17/93 02/17/93 "FlyByNight Courier" "" "" "Net30" "DOS" +21 4 01/12/93 01/25/93 01/22/93 "Standard Mail" "" "" "Net30" "SLS" +22 70 01/12/93 03/01/93 02/23/93 "FlyByNight Courier" "" "" "Net30" "SLS" +23 16 01/12/93 02/05/93 02/05/93 "FlyByNight Courier" "" "" "Net30" "JAL" +24 73 01/12/93 02/05/93 02/05/93 "Standard Mail" "" "" "Net30" "GPE" +25 10 01/13/93 02/12/93 02/12/93 "FlyByNight Courier" "" "" "Net30" "SLS" +26 53 01/13/93 01/28/93 01/29/93 "Standard Mail" "" "" "Net30" "RDR" +27 59 01/13/93 02/15/93 02/12/93 "Standard Mail" "" "" "Net30" "DKP" +28 32 01/14/93 02/03/93 02/05/93 "Standard Mail" "" "" "Net30" "DKP" +29 60 01/15/93 02/22/93 02/17/93 "Standard Mail" "" "" "Net30" "BBB" +30 40 01/15/93 02/26/93 02/26/93 "Standard Mail" "" "" "Net30" "DKP" +31 40 01/18/93 02/15/93 02/11/93 "Standard Mail" "" "" "Net30" "DKP" +32 70 01/18/93 02/10/93 02/12/93 "FlyByNight Courier" "" "" "Net30" "SLS" +33 58 01/18/93 01/25/93 01/28/93 "Standard Mail" "" "" "Net30" "HXM" +34 32 01/18/93 02/04/93 02/08/93 "Standard Mail" "" "" "Net30" "DKP" +35 73 01/19/93 02/26/93 03/01/93 "Walkers Delivery" "" "" "Net30" "GPE" +36 1 01/19/93 03/08/93 03/04/93 "FlyByNight Courier" "" "" "Net30" "HXM" +37 28 01/19/93 02/26/93 03/03/93 "Walkers Delivery" "" "" "Net30" "DKP" +38 67 01/19/93 02/23/93 02/19/93 "Standard Mail" "" "" "Net30" "HXM" +39 75 01/20/93 02/15/93 02/18/93 "Standard Mail" "" "" "Net30" "KIK" +40 30 01/20/93 02/26/93 02/22/93 "Walkers Delivery" "" "" "Net30" "HXM" +41 16 01/20/93 02/01/93 02/01/93 "Standard Mail" "" "" "Net30" "JAL" +42 26 01/21/93 02/15/93 02/15/93 "Standard Mail" "" "" "Net30" "SLS" +43 27 01/22/93 02/25/93 02/22/93 "Standard Mail" "" "" "Net30" "GPE" +44 50 01/25/93 02/12/93 02/17/93 "FlyByNight Courier" "" "" "Net30" "HXM" +45 26 01/26/93 02/22/93 02/25/93 "Standard Mail" "" "" "Net30" "SLS" +46 83 01/26/93 02/16/93 02/15/93 "FlyByNight Courier" "" "" "Net30" "HXM" +47 62 01/26/93 03/03/93 03/05/93 "Standard Mail" "" "" "Net30" "HXM" +48 9 01/26/93 03/04/93 03/01/93 "FlyByNight Courier" "" "" "Net30" "DKP" +49 68 01/26/93 02/08/93 02/12/93 "Walkers Delivery" "" "" "Net30" "JAL" +50 52 01/27/93 02/01/93 02/05/93 "Standard Mail" "" "" "Net30" "DKP" +51 31 01/28/93 02/24/93 02/19/93 "Standard Mail" "" "" "Net30" "DKP" +52 27 01/28/93 02/22/93 02/17/93 "FlyByNight Courier" "" "" "Net30" "GPE" +53 33 01/28/93 02/25/93 03/01/93 "FlyByNight Courier" "" "" "Net30" "DKP" +54 25 01/28/93 02/12/93 02/15/93 "FlyByNight Courier" "" "" "Net30" "DOS" +55 3 01/29/93 03/19/93 03/15/93 "Standard Mail" "" "" "Net30" "HXM" +56 11 01/29/93 02/12/93 02/08/93 "FlyByNight Courier" "" "" "Net30" "DKP" +57 84 01/29/93 03/03/93 03/05/93 "Standard Mail" "" "" "Net30" "KIK" +58 15 01/29/93 02/05/93 02/09/93 "Walkers Delivery" "" "" "Net30" "HXM" +59 6 01/29/93 03/05/93 03/05/93 "Standard Mail" "" "" "Net30" "SLS" +60 37 02/01/93 03/02/93 03/05/93 "Standard Mail" "" "" "Net30" "GPE" +61 61 02/01/93 03/08/93 03/09/93 "Standard Mail" "" "" "Net30" "DKP" +62 34 02/02/93 02/25/93 02/25/93 "Standard Mail" "" "" "Net30" "JAL" +63 41 02/02/93 03/03/93 03/08/93 "Walkers Delivery" "" "" "Net30" "JAL" +64 40 02/02/93 03/08/93 03/04/93 "Walkers Delivery" "" "" "Net30" "DKP" +65 56 02/03/93 02/19/93 02/19/93 "FlyByNight Courier" "" "" "Net30" "DKP" +66 66 02/03/93 03/08/93 03/09/93 "Standard Mail" "" "" "Net30" "HXM" +67 46 02/03/93 02/19/93 02/24/93 "Standard Mail" "" "" "Net30" "DOS" +68 13 02/04/93 03/15/93 03/19/93 "Standard Mail" "" "" "Net30" "DKP" +69 83 02/04/93 03/11/93 03/11/93 "Standard Mail" "" "" "Net30" "HXM" +70 34 02/05/93 03/01/93 03/05/93 "Walkers Delivery" "" "" "Net30" "JAL" +71 75 02/05/93 02/22/93 02/17/93 "Standard Mail" "" "" "Net30" "KIK" +72 42 02/08/93 03/08/93 03/11/93 "Standard Mail" "" "" "Net30" "SLS" +73 67 02/09/93 03/19/93 03/19/93 "Walkers Delivery" "" "" "Net30" "HXM" +74 61 02/09/93 03/15/93 03/12/93 "Standard Mail" "" "" "Net30" "DKP" +75 9 02/09/93 03/01/93 03/02/93 "Standard Mail" "" "" "Net30" "DKP" +76 67 02/09/93 02/22/93 02/19/93 "Standard Mail" "" "" "Net30" "HXM" +77 72 02/09/93 03/08/93 03/08/93 "Walkers Delivery" "" "" "Net30" "JAL" +78 41 02/10/93 03/01/93 02/24/93 "Standard Mail" "" "" "Net30" "JAL" +79 1 02/10/93 02/26/93 02/26/93 "Standard Mail" "" "" "Net30" "HXM" +80 66 02/10/93 03/10/93 03/15/93 "Walkers Delivery" "" "" "Net30" "HXM" +81 69 02/10/93 03/12/93 03/10/93 "Standard Mail" "" "" "Net30" "DKP" +82 29 02/11/93 03/12/93 03/17/93 "Standard Mail" "" "" "Net30" "KIK" +83 51 02/11/93 03/02/93 02/26/93 "FlyByNight Courier" "" "" "Net30" "KIK" +84 31 02/11/93 03/17/93 03/12/93 "Standard Mail" "" "" "Net30" "DKP" +85 70 02/11/93 03/26/93 03/25/93 "FlyByNight Courier" "" "" "Net30" "SLS" +86 33 02/11/93 03/12/93 03/08/93 "FlyByNight Courier" "" "" "Net30" "DKP" +87 28 02/12/93 02/26/93 02/26/93 "Standard Mail" "" "" "Net30" "DKP" +88 24 02/12/93 03/16/93 03/15/93 "FlyByNight Courier" "" "" "Net30" "DKP" +89 42 02/12/93 03/11/93 03/10/93 "Standard Mail" "" "" "Net30" "SLS" +90 9 02/15/93 03/01/93 03/03/93 "FlyByNight Courier" "" "" "Net30" "DKP" +91 46 02/15/93 02/22/93 02/26/93 "Standard Mail" "" "" "Net30" "DOS" +92 76 02/15/93 03/22/93 03/24/93 "Walkers Delivery" "" "" "Net30" "DKP" +93 84 02/15/93 03/02/93 03/04/93 "Standard Mail" "" "" "Net30" "KIK" +94 2 02/16/93 03/10/93 03/15/93 "Standard Mail" "" "" "Net30" "DKP" +95 27 02/17/93 03/26/93 03/23/93 "FlyByNight Courier" "" "" "Net30" "GPE" +96 25 02/17/93 03/18/93 03/15/93 "FlyByNight Courier" "" "" "Net30" "DOS" +97 43 02/17/93 03/19/93 03/24/93 "Standard Mail" "" "" "Net30" "JAL" +98 26 02/18/93 03/03/93 03/02/93 "Standard Mail" "" "" "Net30" "SLS" +99 9 02/19/93 03/10/93 03/15/93 "Walkers Delivery" "" "" "Net30" "DKP" +100 43 02/22/93 03/26/93 04/01/93 "Standard Mail" "" "" "Net30" "JAL" +101 14 02/23/93 03/22/93 03/17/93 "FlyByNight Courier" "" "" "Net30" "DOS" +102 28 02/23/93 04/13/93 04/08/93 "Standard Mail" "" "" "Net30" "DKP" +103 67 02/23/93 03/12/93 03/08/93 "Walkers Delivery" "" "" "Net30" "HXM" +104 50 02/23/93 04/02/93 04/02/93 "Standard Mail" "" "" "Net30" "HXM" +105 55 02/23/93 04/06/93 04/02/93 "Standard Mail" "" "" "Net30" "KIK" +106 80 02/24/93 03/24/93 03/19/93 "FlyByNight Courier" "" "" "Net30" "JAL" +107 76 02/24/93 04/06/93 04/07/93 "Walkers Delivery" "" "" "Net30" "DKP" +108 9 02/24/93 03/22/93 03/16/93 "Standard Mail" "" "" "Net30" "DKP" +109 81 02/25/93 03/24/93 03/29/93 "Standard Mail" "" "" "Net30" "HXM" +110 34 02/26/93 03/24/93 03/22/93 "FlyByNight Courier" "" "" "Net30" "JAL" +111 19 02/26/93 03/15/93 03/17/93 "Walkers Delivery" "" "" "Net30" "HXM" +112 18 02/26/93 03/11/93 03/15/93 "FlyByNight Courier" "" "" "Net30" "DKP" +113 30 02/26/93 03/30/93 03/25/93 "FlyByNight Courier" "" "" "Net30" "HXM" +114 65 02/26/93 03/19/93 03/22/93 "Standard Mail" "" "" "Net30" "RDR" +115 36 03/01/93 03/26/93 03/23/93 "Standard Mail" "" "" "Net30" "DOS" +116 30 03/01/93 ? 04/15/93 "Standard Mail" "" "" "Net30" "HXM" +117 27 03/01/93 03/26/93 03/25/93 "Standard Mail" "" "" "Net30" "GPE" +118 7 03/01/93 04/05/93 04/02/93 "FlyByNight Courier" "" "" "Net30" "DKP" +119 46 03/02/93 04/12/93 04/16/93 "Walkers Delivery" "" "" "Net30" "DOS" +120 52 03/02/93 03/18/93 03/15/93 "Standard Mail" "" "" "Net30" "DKP" +121 30 03/02/93 04/09/93 04/07/93 "FlyByNight Courier" "" "" "Net30" "HXM" +122 27 03/02/93 04/12/93 04/12/93 "Standard Mail" "" "" "Net30" "GPE" +123 81 03/03/93 03/19/93 03/22/93 "Walkers Delivery" "" "" "Net30" "HXM" +124 82 03/03/93 04/08/93 04/07/93 "Walkers Delivery" "" "" "Net30" "JAL" +125 2 03/03/93 03/26/93 03/22/93 "FlyByNight Courier" "" "" "Net30" "DKP" +126 67 03/03/93 03/22/93 03/25/93 "Standard Mail" "" "" "Net30" "HXM" +127 43 03/04/93 03/26/93 03/23/93 "Standard Mail" "" "" "Net30" "JAL" +128 45 03/04/93 04/02/93 04/08/93 "FlyByNight Courier" "" "" "Net30" "BBB" +129 22 03/05/93 03/29/93 04/02/93 "FlyByNight Courier" "" "" "Net30" "DKP" +130 6 03/05/93 ? 04/19/93 "Standard Mail" "" "" "Net30" "SLS" +131 33 03/05/93 04/09/93 04/12/93 "FlyByNight Courier" "" "" "Net30" "DKP" +132 83 03/08/93 03/30/93 04/02/93 "FlyByNight Courier" "" "" "Net30" "HXM" +133 56 03/09/93 ? 04/21/93 "Walkers Delivery" "" "" "Net30" "DKP" +134 16 03/09/93 04/05/93 04/01/93 "Standard Mail" "" "" "Net30" "JAL" +135 6 03/09/93 04/09/93 04/13/93 "FlyByNight Courier" "" "" "Net30" "SLS" +136 46 03/09/93 04/02/93 03/29/93 "Walkers Delivery" "" "" "Net30" "DOS" +137 42 03/10/93 ? 04/20/93 "Standard Mail" "" "" "Net30" "SLS" +138 24 03/10/93 04/12/93 04/09/93 "Standard Mail" "" "" "Net30" "DKP" +139 42 03/10/93 03/23/93 03/19/93 "Standard Mail" "" "" "Net30" "SLS" +140 40 03/10/93 04/09/93 04/13/93 "FlyByNight Courier" "" "" "Net30" "DKP" +141 7 03/10/93 04/12/93 04/16/93 "Walkers Delivery" "" "" "Net30" "DKP" +142 75 03/11/93 04/14/93 04/16/93 "Walkers Delivery" "" "" "Net30" "KIK" +143 52 03/11/93 ? 04/23/93 "Walkers Delivery" "" "" "Net30" "DKP" +144 24 03/11/93 ? 04/23/93 "FlyByNight Courier" "" "" "Net30" "DKP" +145 24 03/12/93 ? 04/19/93 "Standard Mail" "" "" "Net30" "DKP" +146 43 03/12/93 03/19/93 03/24/93 "Standard Mail" "" "" "Net30" "JAL" +147 24 03/15/93 ? 04/20/93 "Standard Mail" "" "" "Net30" "DKP" +148 61 03/16/93 ? 04/29/93 "Standard Mail" "" "" "Net30" "DKP" +149 34 03/16/93 04/05/93 04/09/93 "Standard Mail" "" "" "Net30" "JAL" +150 19 03/17/93 04/02/93 04/06/93 "FlyByNight Courier" "" "" "Net30" "HXM" +151 13 03/17/93 ? 04/27/93 "Standard Mail" "" "" "Net30" "DKP" +152 26 03/18/93 ? 04/20/93 "FlyByNight Courier" "" "" "Net30" "SLS" +153 70 03/18/93 ? 04/28/93 "Standard Mail" "" "" "Net30" "SLS" +154 17 03/18/93 ? 04/19/93 "Walkers Delivery" "" "" "Net30" "SLS" +155 55 03/19/93 ? 04/27/93 "Standard Mail" "" "" "Net30" "KIK" +156 46 03/22/93 04/05/93 04/08/93 "FlyByNight Courier" "" "" "Net30" "DOS" +157 42 03/22/93 ? 04/22/93 "Standard Mail" "" "" "Net30" "SLS" +158 29 03/22/93 ? 04/23/93 "Standard Mail" "" "" "Net30" "KIK" +159 33 03/22/93 04/02/93 04/07/93 "Standard Mail" "" "" "Net30" "DKP" +160 3 03/22/93 ? 04/23/93 "Walkers Delivery" "" "" "Net30" "HXM" +161 82 03/23/93 04/12/93 04/16/93 "Standard Mail" "" "" "Net30" "JAL" +162 73 03/23/93 ? 04/23/93 "FlyByNight Courier" "" "" "Net30" "GPE" +163 3 03/23/93 ? 04/19/93 "Standard Mail" "" "" "Net30" "HXM" +164 29 03/23/93 ? 04/23/93 "Walkers Delivery" "" "" "Net30" "KIK" +165 6 03/23/93 03/29/93 04/02/93 "Walkers Delivery" "" "" "Net30" "SLS" +166 49 03/24/93 ? 05/07/93 "Standard Mail" "" "" "Net30" "DKP" +167 3 03/24/93 ? 04/19/93 "Standard Mail" "" "" "Net30" "HXM" +168 50 03/24/93 ? 05/07/93 "FlyByNight Courier" "" "" "Net30" "HXM" +169 51 03/25/93 ? 05/05/93 "Standard Mail" "" "" "Net30" "KIK" +170 18 03/25/93 ? 04/29/93 "FlyByNight Courier" "" "" "Net30" "DKP" +171 2 03/26/93 ? 04/19/93 "Standard Mail" "" "" "Net30" "DKP" +172 41 03/29/93 ? 04/20/93 "FlyByNight Courier" "" "" "Net30" "JAL" +173 80 03/29/93 ? 05/07/93 "FlyByNight Courier" "" "" "Net30" "JAL" +174 64 03/29/93 ? 04/22/93 "FlyByNight Courier" "" "" "Net30" "DKP" +175 75 03/29/93 ? 05/11/93 "Standard Mail" "" "" "Net30" "KIK" +176 72 03/30/93 ? 04/16/93 "Walkers Delivery" "" "" "Net30" "JAL" +177 1 03/30/93 04/09/93 04/09/93 "Standard Mail" "" "" "Net30" "HXM" +178 61 03/30/93 04/12/93 04/09/93 "Standard Mail" "" "" "Net30" "DKP" +179 47 03/30/93 ? 04/12/93 "Standard Mail" "" "" "Net30" "HXM" +180 72 03/31/93 ? 05/13/93 "FlyByNight Courier" "" "" "Net30" "JAL" +181 18 03/31/93 ? 05/03/93 "FlyByNight Courier" "" "" "Net30" "DKP" +182 41 04/01/93 ? 04/13/93 "Standard Mail" "" "" "Net30" "JAL" +183 56 04/02/93 ? 04/26/93 "FlyByNight Courier" "" "" "Net30" "DKP" +184 10 04/02/93 ? 04/27/93 "Standard Mail" "" "" "Net30" "SLS" +185 1 04/05/93 ? 05/19/93 "Walkers Delivery" "" "" "Net30" "HXM" +186 7 04/05/93 ? 05/20/93 "Standard Mail" "" "" "Net30" "DKP" +187 83 04/06/93 ? 05/18/93 "Standard Mail" "" "" "Net30" "HXM" +188 34 04/06/93 ? 04/30/93 "FlyByNight Courier" "" "" "Net30" "JAL" +189 3 04/06/93 ? 05/10/93 "Standard Mail" "" "" "Net30" "HXM" +190 63 04/07/93 ? 05/10/93 "Standard Mail" "" "" "Net30" "DKP" +191 10 04/07/93 ? 05/19/93 "Standard Mail" "" "" "Net30" "SLS" +192 29 04/07/93 ? 05/17/93 "Standard Mail" "" "" "Net30" "KIK" +193 84 04/07/93 ? 04/26/93 "Standard Mail" "" "" "Net30" "KIK" +194 10 04/07/93 ? 04/19/93 "FlyByNight Courier" "" "" "Net30" "SLS" +195 41 04/08/93 ? 04/23/93 "Standard Mail" "" "" "Net30" "JAL" +196 54 04/08/93 ? 05/10/93 "FlyByNight Courier" "" "" "Net30" "SLS" +197 28 04/09/93 ? 05/19/93 "Standard Mail" "" "" "Net30" "DKP" +198 13 04/09/93 ? 05/10/93 "Walkers Delivery" "" "" "Net30" "DKP" +199 66 04/09/93 ? 05/24/93 "Standard Mail" "" "" "Net30" "HXM" +200 80 04/09/93 ? 05/11/93 "Standard Mail" "" "" "Net30" "JAL" +201 80 04/12/93 ? 04/26/93 "Standard Mail" "" "" "Net30" "JAL" +202 22 04/12/93 ? 05/11/93 "Standard Mail" "" "" "Net30" "DKP" +203 84 04/12/93 ? 05/21/93 "Standard Mail" "" "" "Net30" "KIK" +204 8 04/12/93 ? 05/19/93 "Walkers Delivery" "" "" "Net30" "RDR" +205 63 04/13/93 ? 05/25/93 "Standard Mail" "" "" "Net30" "DKP" +206 60 04/13/93 ? 05/18/93 "Standard Mail" "" "" "Net30" "BBB" +207 11 04/13/93 ? 05/10/93 "Standard Mail" "" "" "Net30" "DKP" +. +PSC +filename=Order +records=0000000000207 +ldbname=OETraining2024_Sportsdb +timestamp=2024/07/03-08:21:44 +numformat=44,46 +dateformat=mdy-1950 +map=NO-MAP +cpstream=ISO8859-1 +. +0000014530 diff --git a/Dbs/sports2000/data/ref-call.d b/Dbs/sports2000/data/ref-call.d new file mode 100644 index 0000000..87eabf5 --- /dev/null +++ b/Dbs/sports2000/data/ref-call.d @@ -0,0 +1,25 @@ +"000001" 2 03/28/93 "DKP" "" "Ordered frisbees. We sent Ultimate style, they want Guts. Guts are on backorder, I told them they would receive them by May." +"000002" 21 04/14/93 "HXM" "" "Order of sweat bands were wrong color, and cycle helmets were all a size larger than ordered. They are very upset and threaten to pull their account. I told them I would straighten the situation out and make sure they were happy." +"000003" 56 01/07/93 "DKP" "" "Want us to drop ship for their customers so they don't have to keep such a large inventory. I told them I would discuss it with management and let them know." +"000004" 6 01/29/93 "SLS" "" "Ordered footballs. We sent American footballs, they want soccer balls. They realize it was their error and will pay extra shipping if we can ship as quickly as possible." +"000005" 15 04/23/93 "HXM" "" "Have a shot at a contract with the New Jersey Nets. Need to stage a presentation for Chuck Daly and want us to help them create sweat suit designs. " +"000006" 2 05/05/93 "DKP" "000001" "Received Guts frisbees and are satisfied." +"000007" 37 05/27/93 "GPE" "" "Want to know if we can get Merlin mountain bikes frames. I told them I would call Merlin in Massachusetts and inquire." +"000008" 56 03/04/93 "DKP" "000003" "I told them I spoke to management and they were not convinced that Super Golf would buy as much if they didn't have to warehouse. Dick at Super Golf told me if we could drop ship golf club sets only he could guarantee us a minimum order for the year. I told him I would get back to him." +"000009" 15 06/06/93 "HXM" "000005" "Presentation to Nets went great! They agreed to buy warm-up suits, shorts, knee guards, and sweat bands." +"000010" 6 03/10/93 "SLS" "000004" "Received shipment of soccer balls. Decided to keep footballs as well. They think they can market them effectively. Keep track of progress to see if we should target other U.K. companies for football equipment. " +"000011" 21 05/10/93 "HXM" "000002" "Corrected order and sent a free box of Pearl Izumi gel gloves. They agreed to give us another chance." +"000012" 37 06/01/93 "GPE" "000007" "Merlin is such a high end product, they will deal with them directly. Passed along account info to Dave at Merlin." +"000013" 56 04/08/93 "DKP" "000003" "Contract went out to Super Golf today agreeing to drop ship sets of golf clubs if they guarantee us they will buy as much as they did last year. They will continue to warehouse shoes and balls." +. +PSC +filename=Ref-Call +records=0000000000013 +ldbname=OETraining2024_Sportsdb +timestamp=2024/07/03-08:21:44 +numformat=44,46 +dateformat=mdy-1950 +map=NO-MAP +cpstream=ISO8859-1 +. +0000002477 diff --git a/Dbs/sports2000/data/salesrep.d b/Dbs/sports2000/data/salesrep.d new file mode 100644 index 0000000..b651784 --- /dev/null +++ b/Dbs/sports2000/data/salesrep.d @@ -0,0 +1,21 @@ +"BBB" "Brawn , Bubba B." "East" 1600 1648 1697 1748 1800 1854 1910 1967 2026 2087 2150 2215 +"DKP" "Pitt , Dirk K." "Central" 1800 1854 1910 1967 2026 2087 2150 2215 2281 2349 2419 2492 +"DOS" "Donna Swindall" "Southern" 3800 3914 4031 4152 4277 4405 4537 4673 4813 4957 5106 5259 +"GPE" "Gilles Ehrer" "Bretagne" 1600 1648 1697 1748 1800 1854 1910 1967 2026 2087 2150 2215 +"HXM" "Harry Munvig" "Sverige" 3800 3914 4031 4152 4277 4405 4537 4673 4813 4957 5106 5259 +"JAL" "Jan Loopsnel" "Noord" 2200 2266 2334 2404 2476 2550 2627 2706 2787 2871 2957 3046 +"KIK" "Kari Iso-Kauppinen" "Finland" 1800 1854 1910 1967 2026 2087 2150 2215 2281 2349 2419 2492 +"RDR" "Robert Roller" "Austria" 4200 4326 4456 4590 4728 4870 5016 5166 5321 5481 5645 5814 +"SLS" "Smith , Spike Louise" "West" 3000 3090 3183 3278 3376 3477 3581 3688 3799 3913 4030 4151 +. +PSC +filename=Salesrep +records=0000000000009 +ldbname=OETraining2024_Sportsdb +timestamp=2024/07/03-08:21:44 +numformat=44,46 +dateformat=mdy-1950 +map=NO-MAP +cpstream=ISO8859-1 +. +0000000848 diff --git a/Dbs/sports2000/data/state.d b/Dbs/sports2000/data/state.d new file mode 100644 index 0000000..8f37974 --- /dev/null +++ b/Dbs/sports2000/data/state.d @@ -0,0 +1,63 @@ +"AK" "Alaska" "West" +"AL" "Alabama" "South" +"AR" "Arkansas" "Central" +"AZ" "Arizona" "West" +"CA" "California" "West" +"CO" "Colorado" "West" +"CT" "Connecticut" "East" +"DC" "Dst of Columbia" "East" +"DE" "Delaware" "East" +"FL" "Florida" "East" +"GA" "Georgia" "East" +"HI" "Hawaii" "West" +"IA" "Iowa" "Central" +"ID" "Idaho" "West" +"IL" "Illinois" "Central" +"IN" "Indiana" "East" +"KS" "Kansas" "Central" +"KY" "Kentucky" "East" +"LA" "Louisiana" "Central" +"MA" "Massachusetts" "East" +"MD" "Maryland" "East" +"ME" "Maine" "East" +"MI" "Michigan" "East" +"MN" "Minnesota" "Central" +"MO" "Missouri" "Central" +"MS" "Mississippi" "Central" +"MT" "Montana" "West" +"NC" "North Carolina" "East" +"ND" "North Dakota" "Central" +"NE" "Nebraska" "Central" +"NH" "New Hampshire" "East" +"NJ" "New Jersey" "East" +"NM" "New Mexico" "West" +"NV" "Nevada" "West" +"NY" "New York" "East" +"OH" "Ohio" "East" +"OK" "Oklahoma" "Central" +"OR" "Oregon" "West" +"PA" "Pennsylvania" "East" +"RI" "Rhode Island" "East" +"SC" "South Carolina" "East" +"SD" "South Dakota" "Central" +"TN" "Tennessee" "East" +"TX" "Texas" "Central" +"UT" "Utah" "West" +"VA" "Virginia" "East" +"VT" "Vermont" "East" +"WA" "Washington" "West" +"WI" "Wisconsin" "Central" +"WV" "West Virginia" "East" +"WY" "Wyoming" "West" +. +PSC +filename=State +records=0000000000051 +ldbname=OETraining2024_Sportsdb +timestamp=2024/07/03-08:21:44 +numformat=44,46 +dateformat=mdy-1950 +map=NO-MAP +cpstream=ISO8859-1 +. +0000001299 diff --git a/Dbs/sports2000/df/sports2000.df b/Dbs/sports2000/df/sports2000.df new file mode 100644 index 0000000..265909d --- /dev/null +++ b/Dbs/sports2000/df/sports2000.df @@ -0,0 +1,801 @@ +ADD SEQUENCE "Next-Cust-Num" + INITIAL 1000 + INCREMENT 5 + CYCLE-ON-LIMIT no + MIN-VAL 1000 + +ADD SEQUENCE "Next-Inv-Num" + INITIAL 1000 + INCREMENT 1 + CYCLE-ON-LIMIT no + MIN-VAL 1000 + +ADD SEQUENCE "Next-Ord-Num" + INITIAL 1000 + INCREMENT 5 + CYCLE-ON-LIMIT no + MIN-VAL 1000 + +ADD SEQUENCE "Next-Item-Num" + INITIAL 100 + INCREMENT 10 + CYCLE-ON-LIMIT no + MIN-VAL 100 + +ADD SEQUENCE "Next-Ref-Num" + INITIAL 1 + INCREMENT 1 + CYCLE-ON-LIMIT no + MIN-VAL 1 + +ADD TABLE "Customer" + AREA "Customer/Order Area" + DESCRIPTION "Customer information" + DUMP-NAME "customer" + TABLE-TRIGGER "CREATE" NO-OVERRIDE PROCEDURE "sports/crcust.p" CRC "?" + TABLE-TRIGGER "DELETE" NO-OVERRIDE PROCEDURE "sports/delcust.p" CRC "?" + TABLE-TRIGGER "WRITE" NO-OVERRIDE PROCEDURE "sports/wrcust.p" CRC "?" + +ADD FIELD "Cust-Num" OF "Customer" AS integer + FORMAT ">>>>9" + INITIAL "0" + POSITION 2 + MAX-WIDTH 4 + VALEXP "cust-num > 0" + VALMSG "Customer number must be greater than zero" + ORDER 10 + +ADD FIELD "Name" OF "Customer" AS character + FORMAT "x(20)" + INITIAL "" + POSITION 3 + MAX-WIDTH 40 + ORDER 30 + +ADD FIELD "Address" OF "Customer" AS character + FORMAT "x(20)" + INITIAL "" + POSITION 4 + MAX-WIDTH 40 + ORDER 40 + +ADD FIELD "Address2" OF "Customer" AS character + FORMAT "x(20)" + INITIAL "" + POSITION 5 + MAX-WIDTH 40 + ORDER 50 + +ADD FIELD "City" OF "Customer" AS character + FORMAT "x(12)" + INITIAL "" + POSITION 6 + MAX-WIDTH 24 + ORDER 60 + +ADD FIELD "State" OF "Customer" AS character + DESCRIPTION "Label/Valexp/Valmsg/Help are set based on value of NON-US field!" + FORMAT "x(20)" + INITIAL "" + POSITION 7 + MAX-WIDTH 40 + HELP "Enter standard state abbreviation" + ORDER 70 + FIELD-TRIGGER "ASSIGN" NO-OVERRIDE PROCEDURE "sports/asstate.p" CRC "?" + +ADD FIELD "Country" OF "Customer" AS character + FORMAT "x(20)" + INITIAL "USA" + POSITION 8 + MAX-WIDTH 40 + ORDER 15 + +ADD FIELD "Phone" OF "Customer" AS character + DESCRIPTION "Format/Label/Help based on status of NON-US field." + FORMAT "x(20)" + INITIAL "" + POSITION 9 + MAX-WIDTH 40 + ORDER 115 + +ADD FIELD "Contact" OF "Customer" AS character + FORMAT "x(20)" + INITIAL "" + POSITION 10 + MAX-WIDTH 40 + ORDER 110 + +ADD FIELD "Sales-Rep" OF "Customer" AS character + FORMAT "X(4)" + INITIAL "" + POSITION 11 + MAX-WIDTH 8 + VALEXP "CAN-FIND(Salesrep OF Customer)" + VALMSG "The Sales Rep's name you've entered must exist in the Salesrep table." + ORDER 125 + +ADD FIELD "Comments" OF "Customer" AS character + FORMAT "x(60)" + INITIAL "" + POSITION 12 + MAX-WIDTH 120 + ORDER 180 + +ADD FIELD "Credit-Limit" OF "Customer" AS decimal + DESCRIPTION "Maximum credit" + FORMAT "->,>>>,>>9" + INITIAL "1500" + POSITION 13 + MAX-WIDTH 17 + VALEXP "Credit-Limit >= 0 AND Credit-Limit <= 9999999" + VALMSG "Credit Limit must be >= 0 and <= 9,999,999" + HELP "Please enter a Credit Limit" + DECIMALS 2 + ORDER 130 + +ADD FIELD "Balance" OF "Customer" AS decimal + FORMAT "->,>>>,>>9.99" + INITIAL "0" + POSITION 14 + MAX-WIDTH 17 + DECIMALS 2 + ORDER 140 + +ADD FIELD "Terms" OF "Customer" AS character + FORMAT "x(20)" + INITIAL "Net30" + POSITION 15 + MAX-WIDTH 40 + ORDER 150 + +ADD FIELD "Discount" OF "Customer" AS integer + FORMAT ">>9%" + INITIAL "0" + POSITION 16 + MAX-WIDTH 4 + VALEXP "Discount >= 0" + VALMSG "Discount must be greater or equal to 0" + HELP "Enter a percentage from 0 to 999" + ORDER 170 + +ADD FIELD "Postal-Code" OF "Customer" AS character + DESCRIPTION "Format/Label/Help Message based on status of NON-US field." + FORMAT "x(10)" + INITIAL "" + POSITION 17 + MAX-WIDTH 20 + HELP "Please enter the appropriate Postal Code." + ORDER 80 + +ADD INDEX "Cust-Num" ON "Customer" + AREA "Primary Index Area" + UNIQUE + PRIMARY + INDEX-FIELD "Cust-Num" ASCENDING + +ADD INDEX "Comments" ON "Customer" + AREA "Customer Index Area" + WORD + INDEX-FIELD "Comments" ASCENDING + +ADD INDEX "Country-Post" ON "Customer" + AREA "Customer Index Area" + INDEX-FIELD "Country" ASCENDING + INDEX-FIELD "Postal-Code" ASCENDING + +ADD INDEX "Name" ON "Customer" + AREA "Customer Index Area" + INDEX-FIELD "Name" ASCENDING + +ADD INDEX "Sales-Rep" ON "Customer" + AREA "Customer/Order Area" + INDEX-FIELD "Sales-Rep" ASCENDING + +ADD TABLE "Invoice" + AREA "Info Area" + DESCRIPTION "This contains transactions for the Receivables system" + DUMP-NAME "invoice" + TABLE-TRIGGER "CREATE" NO-OVERRIDE PROCEDURE "sports/crinv.p" CRC "?" + TABLE-TRIGGER "DELETE" NO-OVERRIDE PROCEDURE "sports/delinv.p" CRC "?" + +ADD FIELD "Invoice-Num" OF "Invoice" AS integer + FORMAT ">>>>>9" + INITIAL "0" + POSITION 2 + MAX-WIDTH 4 + VALEXP "invoice-num > 0" + VALMSG "Invoice number cannot be zero" + ORDER 10 + +ADD FIELD "Cust-Num" OF "Invoice" AS integer + FORMAT ">>>>9" + INITIAL "0" + POSITION 3 + MAX-WIDTH 4 + VALEXP "CAN-FIND(customer OF invoice)" + VALMSG "The Customer number entered must be a valid one." + ORDER 20 + +ADD FIELD "Invoice-Date" OF "Invoice" AS date + FORMAT "99/99/99" + INITIAL ? + POSITION 4 + MAX-WIDTH 4 + ORDER 30 + +ADD FIELD "Amount" OF "Invoice" AS decimal + FORMAT "->>,>>9.99" + INITIAL "0" + POSITION 5 + MAX-WIDTH 17 + HELP "Enter total invoice amount including shipping and sales tax" + DECIMALS 2 + ORDER 40 + +ADD FIELD "Total-Paid" OF "Invoice" AS decimal + FORMAT "->>,>>9.99" + INITIAL "0" + POSITION 6 + MAX-WIDTH 17 + DECIMALS 2 + ORDER 50 + +ADD FIELD "Adjustment" OF "Invoice" AS decimal + FORMAT "->>,>>9.99" + INITIAL "0" + POSITION 7 + MAX-WIDTH 17 + DECIMALS 2 + ORDER 60 + +ADD FIELD "Order-Num" OF "Invoice" AS integer + FORMAT ">>>>9" + INITIAL "0" + POSITION 8 + MAX-WIDTH 4 + VALMSG "The Order number entered must be a valid one." + ORDER 80 + +ADD FIELD "Ship-Charge" OF "Invoice" AS decimal + FORMAT "->>,>>9.99" + INITIAL "0" + POSITION 9 + MAX-WIDTH 17 + DECIMALS 2 + ORDER 120 + +ADD INDEX "Invoice-Num" ON "Invoice" + AREA "Info Area" + UNIQUE + PRIMARY + INDEX-FIELD "Invoice-Num" ASCENDING + +ADD INDEX "Cust-Num" ON "Invoice" + AREA "Info Area" + INDEX-FIELD "Cust-Num" ASCENDING + +ADD INDEX "Invoice-Date" ON "Invoice" + AREA "Info Area" + INDEX-FIELD "Invoice-Date" ASCENDING + +ADD INDEX "Order-Num" ON "Invoice" + AREA "Info Area" + INDEX-FIELD "Order-Num" ASCENDING + +ADD TABLE "Item" + AREA "Info Area" + DESCRIPTION "Item file" + VALEXP "NOT (CAN-FIND(FIRST order-line OF item))" + VALMSG "Cannot delete Item, order-line records exist with this item" + DUMP-NAME "item" + TABLE-TRIGGER "CREATE" NO-OVERRIDE PROCEDURE "sports/critem.p" CRC "?" + TABLE-TRIGGER "WRITE" NO-OVERRIDE PROCEDURE "sports/writem.p" CRC "?" + +ADD FIELD "Item-num" OF "Item" AS integer + FORMAT "99999" + INITIAL "0" + POSITION 2 + MAX-WIDTH 4 + VALEXP "item-num >= 0" + VALMSG "Item number must be greater or equal to 0" + HELP "Enter a number between 1 and 99999" + ORDER 10 + +ADD FIELD "Item-Name" OF "Item" AS character + FORMAT "x(15)" + INITIAL "" + POSITION 3 + MAX-WIDTH 30 + ORDER 20 + +ADD FIELD "Cat-Page" OF "Item" AS integer + FORMAT ">>9" + INITIAL "0" + POSITION 4 + MAX-WIDTH 4 + ORDER 100 + +ADD FIELD "Price" OF "Item" AS decimal + FORMAT "->,>>>,>>9.99" + INITIAL "0" + POSITION 5 + MAX-WIDTH 17 + DECIMALS 2 + ORDER 22 + +ADD FIELD "Cat-Description" OF "Item" AS character + FORMAT "x(200)" + INITIAL "" + LABEL "Cat-Description" + POSITION 6 + MAX-WIDTH 400 + VIEW-AS "VIEW-AS EDITOR SIZE 41 BY 5 SCROLLBAR-VERTICAL " + ORDER 110 + +ADD FIELD "On-hand" OF "Item" AS integer + FORMAT "->>>>9" + INITIAL "0" + POSITION 7 + MAX-WIDTH 4 + ORDER 50 + +ADD FIELD "Allocated" OF "Item" AS integer + FORMAT "->>>>9" + INITIAL "0" + POSITION 8 + MAX-WIDTH 4 + ORDER 60 + +ADD FIELD "Re-Order" OF "Item" AS integer + FORMAT "->>>>9" + INITIAL "0" + POSITION 9 + MAX-WIDTH 4 + ORDER 80 + +ADD FIELD "On-Order" OF "Item" AS integer + FORMAT "->>>>9" + INITIAL "0" + POSITION 10 + MAX-WIDTH 4 + ORDER 90 + +ADD INDEX "Item-Num" ON "Item" + AREA "Info Area" + UNIQUE + PRIMARY + INDEX-FIELD "Item-num" ASCENDING + +ADD INDEX "Cat-Description" ON "Item" + AREA "Info Area" + WORD + INDEX-FIELD "Cat-Description" ASCENDING + +ADD INDEX "Item-Name" ON "Item" + AREA "Info Area" + WORD + INDEX-FIELD "Item-Name" ASCENDING + +ADD TABLE "Local-Default" + AREA "Info Area" + VALEXP "NOT (CAN-FIND(FIRST Customer WHERE Customer.Country = + Local-Default.Country))" + VALMSG "This record cannot be deleted if used in at least one Customer record." + DUMP-NAME "country" + +ADD FIELD "Country" OF "Local-Default" AS character + FORMAT "x(20)" + INITIAL "" + POSITION 2 + MAX-WIDTH 40 + ORDER 10 + +ADD FIELD "Region1-Label" OF "Local-Default" AS character + FORMAT "x(12)" + INITIAL "" + POSITION 3 + MAX-WIDTH 24 + ORDER 20 + +ADD FIELD "Region2-Label" OF "Local-Default" AS character + FORMAT "x(15)" + INITIAL "" + POSITION 4 + MAX-WIDTH 30 + ORDER 30 + +ADD FIELD "Postal-Label" OF "Local-Default" AS character + FORMAT "x(15)" + INITIAL "" + POSITION 5 + MAX-WIDTH 30 + ORDER 40 + +ADD FIELD "Postal-Format" OF "Local-Default" AS character + FORMAT "x(15)" + INITIAL "" + POSITION 6 + MAX-WIDTH 30 + ORDER 50 + +ADD FIELD "Tel-Format" OF "Local-Default" AS character + FORMAT "x(15)" + INITIAL "" + POSITION 7 + MAX-WIDTH 30 + ORDER 60 + +ADD FIELD "Date-Format" OF "Local-Default" AS character + FORMAT "x(8)" + INITIAL "MDY" + POSITION 8 + MAX-WIDTH 16 + ORDER 80 + +ADD FIELD "Currency-Symbol" OF "Local-Default" AS character + FORMAT "x(6)" + INITIAL "" + POSITION 9 + MAX-WIDTH 12 + ORDER 70 + +ADD TABLE "Order" + AREA "Customer/Order Area" + DESCRIPTION "Order header information" + VALEXP "1 = 1" + DUMP-NAME "order" + TABLE-TRIGGER "CREATE" NO-OVERRIDE PROCEDURE "sports/crord.p" CRC "?" + +ADD FIELD "Order-num" OF "Order" AS integer + FORMAT ">>>>9" + INITIAL "0" + POSITION 2 + MAX-WIDTH 4 + VALEXP "order-num > 0" + VALMSG "Order number must be greater than zero" + HELP "Enter an order number between 1 and 99999" + ORDER 10 + +ADD FIELD "Cust-Num" OF "Order" AS integer + DESCRIPTION " Help:Name" + FORMAT ">>>>9" + INITIAL "0" + POSITION 3 + MAX-WIDTH 4 + VALEXP "CAN-FIND(customer OF order)" + VALMSG "Customer must already exist" + HELP "Enter an existing customer number" + ORDER 20 + +ADD FIELD "Order-Date" OF "Order" AS date + FORMAT "99/99/99" + INITIAL "TODAY" + LABEL "Ordered" + POSITION 4 + MAX-WIDTH 4 + HELP "Date of order" + ORDER 90 + +ADD FIELD "Ship-Date" OF "Order" AS date + FORMAT "99/99/99" + INITIAL ? + LABEL "Shipped" + POSITION 5 + MAX-WIDTH 4 + ORDER 100 + +ADD FIELD "Promise-Date" OF "Order" AS date + FORMAT "99/99/99" + INITIAL ? + LABEL "Promised" + POSITION 6 + MAX-WIDTH 4 + ORDER 110 + +ADD FIELD "Carrier" OF "Order" AS character + DESCRIPTION "Should lookup valid carriers." + FORMAT "x(20)" + INITIAL "" + POSITION 7 + MAX-WIDTH 40 + ORDER 120 + +ADD FIELD "Instructions" OF "Order" AS character + FORMAT "x(20)" + INITIAL "" + POSITION 8 + MAX-WIDTH 40 + ORDER 130 + +ADD FIELD "PO" OF "Order" AS character + FORMAT "x(20)" + INITIAL "" + POSITION 9 + MAX-WIDTH 40 + ORDER 140 + +ADD FIELD "Terms" OF "Order" AS character + DESCRIPTION "This should default to the TERMS specified by the CUSTOMER record." + FORMAT "x(20)" + INITIAL "Net30" + POSITION 10 + MAX-WIDTH 40 + ORDER 150 + +ADD FIELD "Sales-Rep" OF "Order" AS character + FORMAT "x(4)" + INITIAL "" + POSITION 11 + MAX-WIDTH 8 + ORDER 160 + +ADD INDEX "Order-Num" ON "Order" + AREA "Primary Index Area" + UNIQUE + PRIMARY + INDEX-FIELD "Order-num" ASCENDING + +ADD INDEX "Cust-Order" ON "Order" + AREA "Customer/Order Area" + UNIQUE + INDEX-FIELD "Cust-Num" ASCENDING + INDEX-FIELD "Order-num" ASCENDING + +ADD INDEX "Order-Date" ON "Order" + AREA "Order Index Area" + INDEX-FIELD "Order-Date" ASCENDING + +ADD INDEX "Sales-Rep" ON "Order" + AREA "Order Index Area" + INDEX-FIELD "Sales-Rep" ASCENDING + +ADD TABLE "Order-Line" + AREA "Customer/Order Area" + DESCRIPTION "Order line information" + DUMP-NAME "order-li" + TABLE-TRIGGER "CREATE" NO-OVERRIDE PROCEDURE "sports/crordl.p" CRC "?" + TABLE-TRIGGER "DELETE" NO-OVERRIDE PROCEDURE "sports/delordl.p" CRC "?" + TABLE-TRIGGER "WRITE" NO-OVERRIDE PROCEDURE "sports/wrordl.p" CRC "?" + +ADD FIELD "Order-num" OF "Order-Line" AS integer + FORMAT ">>>>9" + INITIAL "0" + POSITION 2 + MAX-WIDTH 4 + VALEXP "CAN-FIND(order OF order-line)" + VALMSG "Order must exist" + HELP "Order number for this order line" + ORDER 10 + +ADD FIELD "Line-num" OF "Order-Line" AS integer + DESCRIPTION "To be generated automatically by key value generator!" + FORMAT ">>9" + INITIAL "0" + POSITION 3 + MAX-WIDTH 4 + ORDER 20 + +ADD FIELD "Item-num" OF "Order-Line" AS integer + DESCRIPTION " Help:Idesc" + FORMAT "99999" + INITIAL "0" + POSITION 4 + MAX-WIDTH 4 + VALEXP "CAN-FIND(item OF order-line)" + VALMSG "Item must be on file" + HELP "Item number" + ORDER 30 + +ADD FIELD "Price" OF "Order-Line" AS decimal + DESCRIPTION "This field should get its default from the ITEM file's price field." + FORMAT "->,>>>,>>9.99" + INITIAL "0" + POSITION 5 + MAX-WIDTH 17 + DECIMALS 2 + ORDER 40 + +ADD FIELD "Qty" OF "Order-Line" AS integer + FORMAT "->>>>9" + INITIAL "0" + POSITION 6 + MAX-WIDTH 4 + ORDER 50 + +ADD FIELD "Discount" OF "Order-Line" AS integer + FORMAT ">>9%" + INITIAL "0" + POSITION 7 + MAX-WIDTH 4 + ORDER 70 + +ADD FIELD "Extended-Price" OF "Order-Line" AS decimal + FORMAT "->>,>>9.99" + INITIAL "0" + POSITION 8 + MAX-WIDTH 17 + DECIMALS 2 + ORDER 80 + +ADD FIELD "Backorder" OF "Order-Line" AS logical + DESCRIPTION "Whether this order item is on back order" + FORMAT "yes/no" + INITIAL "no" + LABEL "Back Order" + POSITION 9 + MAX-WIDTH 1 + ORDER 90 + +ADD INDEX "order-line" ON "Order-Line" + AREA "Primary Index Area" + UNIQUE + PRIMARY + INDEX-FIELD "Order-num" ASCENDING + INDEX-FIELD "Line-num" ASCENDING + +ADD INDEX "item-num" ON "Order-Line" + AREA "Order Index Area" + INDEX-FIELD "Item-num" ASCENDING + +ADD TABLE "Ref-Call" + AREA "Info Area" + DUMP-NAME "ref-call" + TABLE-TRIGGER "CREATE" NO-OVERRIDE PROCEDURE "sports/ref_call.p" CRC "?" + +ADD FIELD "Call-Num" OF "Ref-Call" AS character + FORMAT "X(6)" + INITIAL "" + POSITION 2 + MAX-WIDTH 12 + ORDER 10 + +ADD FIELD "Cust-Num" OF "Ref-Call" AS integer + FORMAT ">>>>9" + INITIAL "0" + POSITION 3 + MAX-WIDTH 4 + VALEXP "cust-num > 0" + VALMSG "Customer number must be greater than zero" + ORDER 20 + +ADD FIELD "Call-Date" OF "Ref-Call" AS date + FORMAT "99/99/99" + INITIAL ? + POSITION 4 + MAX-WIDTH 4 + ORDER 30 + +ADD FIELD "Sales-Rep" OF "Ref-Call" AS character + FORMAT "x(4)" + INITIAL "" + POSITION 5 + MAX-WIDTH 8 + ORDER 40 + +ADD FIELD "Parent" OF "Ref-Call" AS character + FORMAT "X(6)" + INITIAL "" + POSITION 6 + MAX-WIDTH 12 + ORDER 50 + +ADD FIELD "Txt" OF "Ref-Call" AS character + FORMAT "X(300)" + INITIAL "" + POSITION 7 + MAX-WIDTH 600 + VIEW-AS "VIEW-AS EDITOR + SCROLLBAR-HORIZONTAL SCROLLBAR-VERTICAL + SIZE 60 BY 5 +" + ORDER 60 + +ADD INDEX "Call-Num" ON "Ref-Call" + AREA "Info Area" + UNIQUE + PRIMARY + INDEX-FIELD "Call-Num" ASCENDING + +ADD INDEX "Cust-Num" ON "Ref-Call" + AREA "Info Area" + UNIQUE + INDEX-FIELD "Cust-Num" ASCENDING + INDEX-FIELD "Call-Num" ASCENDING + +ADD INDEX "Sibling" ON "Ref-Call" + AREA "Info Area" + UNIQUE + INDEX-FIELD "Parent" ASCENDING + INDEX-FIELD "Call-Num" ASCENDING ABBREVIATED + +ADD INDEX "Txt" ON "Ref-Call" + AREA "Info Area" + WORD + INDEX-FIELD "Txt" ASCENDING + +ADD TABLE "Salesrep" + AREA "Info Area" + DESCRIPTION "Sales representative information" + VALEXP "NOT CAN-FIND(FIRST Customer Of Salesrep)" + VALMSG "Cannot delete if used in one or more customer records." + DUMP-NAME "salesrep" + +ADD FIELD "Rep-Name" OF "Salesrep" AS character + FORMAT "x(30)" + INITIAL "" + POSITION 2 + MAX-WIDTH 60 + HELP "Name of Salesman" + ORDER 20 + +ADD FIELD "Region" OF "Salesrep" AS character + FORMAT "x(8)" + INITIAL "" + POSITION 3 + MAX-WIDTH 16 + HELP "Sales Region covered by this salesman" + ORDER 30 + +ADD FIELD "Sales-Rep" OF "Salesrep" AS character + FORMAT "x(4)" + INITIAL "" + POSITION 4 + MAX-WIDTH 8 + ORDER 1 + +ADD FIELD "Month-Quota" OF "Salesrep" AS integer + FORMAT "->,>>>,>>9" + INITIAL "0" + POSITION 5 + MAX-WIDTH 264 + EXTENT 12 + ORDER 40 + +ADD INDEX "Sales-Rep" ON "Salesrep" + AREA "Info Area" + UNIQUE + PRIMARY + INDEX-FIELD "Sales-Rep" ASCENDING + +ADD TABLE "State" + AREA "Info Area" + DESCRIPTION "Table of state abbreviation with sales regions" + VALEXP "NOT (CAN-FIND(FIRST customer OF state))" + VALMSG "This state record is used by at least one Customer record." + DUMP-NAME "state" + +ADD FIELD "State" OF "State" AS character + FORMAT "!!" + INITIAL "" + POSITION 2 + MAX-WIDTH 4 + HELP "State abbreviation" + ORDER 10 + +ADD FIELD "State-Name" OF "State" AS character + FORMAT "x(15)" + INITIAL "" + POSITION 3 + MAX-WIDTH 30 + HELP "Full state name" + ORDER 20 + +ADD FIELD "Region" OF "State" AS character + FORMAT "x(8)" + INITIAL "" + POSITION 4 + MAX-WIDTH 16 + HELP "Sales region for state" + ORDER 30 + +ADD INDEX "State" ON "State" + AREA "Info Area" + UNIQUE + PRIMARY + INDEX-FIELD "State" ASCENDING + +. +PSC +cpstream=ISO8859-1 +. +0000017819 diff --git a/Dbs/sports2000/st/sports2000.st b/Dbs/sports2000/st/sports2000.st new file mode 100644 index 0000000..12bfe1d --- /dev/null +++ b/Dbs/sports2000/st/sports2000.st @@ -0,0 +1,14 @@ +# +b . +# +d "Schema Area":6,32;1 . +# +d "Info Area":7,32;1 . +# +d "Customer/Order Area":8,32;8 . +# +d "Primary Index Area":9,1;8 . +# +d "Customer Index Area":10,1;64 . +# +d "Order Index Area":11,32;64 . diff --git a/Doc/Utils/BufferUtil.cls.html b/Doc/Utils/BufferUtil.cls.html new file mode 100644 index 0000000..1684644 --- /dev/null +++ b/Doc/Utils/BufferUtil.cls.html @@ -0,0 +1,416 @@ + + + + +BufferUtil.cls + + + + + + + +
+ Utils: BufferUtil CLASS +
+
+ +
+ BufferUtil + + CLASS
+ + +
+ Purpose: + Main helper class to handle buffer operations +
+ Description: + +
+ Author(s): + Wayfare +
+ Notes: + +
+ Created: + Tue Oct 22 14:54:04 EEST 2024 +
+
+ + + + + +
Super Class
+
+ + Progress.Lang.Object + +
+ + + + + + + + +
+ Methods
+
+ + + + + + + + + + + + + + + + + +
+ + + +
+ + + +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Method Detail
+
+ +
+ +
CreateBuffer method
+ +
+ + Purpose: + Creates a buffer for the specified table +
+ Description: + +
+ +
+
+ Return type:  HANDLE +   handle, a handle to the created buffer +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ CreateBuffer(INPUT:character):HANDLE +
+ +
+ Parameters  +
+
+ ipcTableName  + CHARACTER +   as character, the name of the table for which the buffer is to be created +
+ +
+ +
GetBufferFieldValue method
+ +
+ + Purpose: + Retrieves the value of a field in the buffer +
+ Description: + +
+ +
+
+ Return type:  CHARACTER +   character, the value of the field as a string +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ GetBufferFieldValue(INPUT:handle,INPUT:character):CHARACTER +
+ +
+ Parameters  +
+
+ iphBuffer  + HANDLE +   as handle, the handle of the buffer +
+
+ ipcFieldName  + CHARACTER +   as character, the name of the field +
+ +
+ +
GetFieldNames method
+ +
+ + Purpose: + Retrieves the names of all fields in the buffer +
+ Description: + +
+ +
+
+ Return type:  CHARACTER +   character, a comma-separated string containing all field names +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ GetFieldNames(INPUT:handle):CHARACTER +
+ +
+ Parameters  +
+
+ iphBuffer  + HANDLE +   as handle, the handle of the buffer +
+ +
+ +
HasField method
+ +
+ + Purpose: + Checks if a buffer has a specific field +
+ Description: + +
+ +
+
+ Return type:  LOGICAL +   logical, true if the field exists in the buffer, false otherwise +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ HasField(INPUT:handle,INPUT:character):LOGICAL +
+ +
+ Parameters  +
+
+ iphBuffer  + HANDLE +   as handle, the handle of the buffer to check +
+
+ ipcFieldName  + CHARACTER +   as character, the name of the field to check +
+ +
+ +
SetBufferFieldValue method
+ +
+ + Purpose: + Sets the value of a field in the buffer +
+ Description: + +
+ +
+
+ Return type:  LOGICAL +   logical, true if the value was successfully set, false otherwise +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ SetBufferFieldValue(INPUT:handle,INPUT:character,INPUT:character):LOGICAL +
+ +
+ Parameters  +
+
+ iphBuffer  + HANDLE +   as handle, the handle of the buffer +
+
+ ipcFieldName  + CHARACTER +   as character, the name of the field +
+
+ ipcValue  + CHARACTER +   as character, the new value to set for the field +
+ + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Doc/Utils/CharacterExtentUtil.cls.html b/Doc/Utils/CharacterExtentUtil.cls.html new file mode 100644 index 0000000..230691f --- /dev/null +++ b/Doc/Utils/CharacterExtentUtil.cls.html @@ -0,0 +1,523 @@ + + + + +CharacterExtentUtil.cls + + + + + + + +
+ Utils: CharacterExtentUtil CLASS +
+
+ +
+ CharacterExtentUtil + + CLASS
+ + +
+ Purpose: + Main helper class to handle character extent operations +
+ Description: + +
+ Author(s): + Wayfare +
+ Notes: + +
+ Created: + Wed Oct 23 14:16:49 EEST 2024 +
+
+ + + + + +
Super Class
+
+ + Progress.Lang.Object + +
+ + + + + + + + +
+ Methods
+
+ + + + + + + + + + + + + + + + + + + + + +
+ + + +
+ + + +
+ + + +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Method Detail
+
+ +
+ +
AddElement method
+ +
+ + Purpose: + Add element to the array at the last position +
+ Description: + +
+ +
+
+ Return type:  CHARACTER +   character extent, the array with the added element +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ AddElement(INPUT:character[],INPUT:character):CHARACTER[] +
+ +
+ Parameters  +
+
+ ipceArray  + CHARACTER +   as character extent, the array +
+
+ ipcElement  + CHARACTER +   as character, the element to add +
+ +
+ +
AddElement method
+ +
+ + Purpose: + Add element to array +
+ Description: + +
+ +
+
+ Return type:  CHARACTER +   character extent, the array with the added element +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ AddElement(INPUT:character[],INPUT:integer,INPUT:character):CHARACTER[] +
+ +
+ Parameters  +
+
+ ipceArray  + CHARACTER +   as character extent, the array +
+
+ ipiPosition  + INTEGER +   as integer, the position to add the element to +
+
+ ipcElement  + CHARACTER +   as character, the element to add +
+ +
+ +
GetFirstElement method
+ +
+ + Purpose: + Returns the first element of an array +
+ Description: + +
+ +
+
+ Return type:  CHARACTER +   character, the first element of the array +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ GetFirstElement(INPUT:character[]):CHARACTER +
+ +
+ Parameters  +
+
+ ipceArray  + CHARACTER +   as character extent, the array +
+ +
+ +
GetLastElement method
+ +
+ + Purpose: + Returns the last element of an array +
+ Description: + +
+ +
+
+ Return type:  CHARACTER +   character, the last element of the array +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ GetLastElement(INPUT:character[]):CHARACTER +
+ +
+ Parameters  +
+
+ ipceArray  + CHARACTER +   as character extent, the array +
+ +
+ +
HasElement method
+ +
+ + Purpose: + Checks if array contains an element +
+ Description: + +
+ +
+
+ Return type:  LOGICAL +   logical, whether the element exists or not +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ HasElement(INPUT:character[],INPUT:character):LOGICAL +
+ +
+ Parameters  +
+
+ ipceArray  + CHARACTER +   as character extent, the array +
+
+ ipcElement  + CHARACTER +   as character, the element to search for +
+ +
+ +
ListToCharacterExtent method
+ +
+ + Purpose: + Fills an array with the values provided in a list +
+ Description: + +
+ +
+
+ Return type:  CHARACTER +   character extent, an array containing the elements of the list +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ ListToCharacterExtent(INPUT:character,INPUT:character):CHARACTER[] +
+ +
+ Parameters  +
+
+ ipcList  + CHARACTER +   as character, the list +
+
+ ipcSeparator  + CHARACTER +   as character, the list separator +
+ +
+ +
RemoveFirstElement method
+ +
+ + Purpose: + Removes the first element of an array +
+ Description: + +
+ +
+
+ Return type:  CHARACTER +   character extent, the array without the first element +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ RemoveFirstElement(INPUT:character[]):CHARACTER[] +
+ +
+ Parameters  +
+
+ ipceArray  + CHARACTER +   as character extent, the array +
+ + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Doc/Utils/DataConversionUtil.cls.html b/Doc/Utils/DataConversionUtil.cls.html new file mode 100644 index 0000000..3c0b423 --- /dev/null +++ b/Doc/Utils/DataConversionUtil.cls.html @@ -0,0 +1,1165 @@ + + + + +DataConversionUtil.cls + + + + + + + +
+ Utils: DataConversionUtil CLASS +
+
+ +
+ DataConversionUtil + + CLASS
+ + +
+ Purpose: + Main helper class to handle data conversion operations +
+ Description: + +
+ Author(s): + Wayfare +
+ Notes: + +
+ Created: + Mon Oct 18 11:55:04 EEST 2024 +
+
+ + + + + +
Super Class
+
+ + Progress.Lang.Object + +
+ + + + + + + + +
+ Methods
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Method Detail
+
+ +
+ +
DateTimeToString method
+ +
+ + Purpose: + Converts a DATETIME to its string representation +
+ Description: + +
+ +
+
+ Return type:  CHARACTER +   character, string representation of the DATETIME +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ DateTimeToString(INPUT:datetime):CHARACTER +
+ +
+ Parameters  +
+
+ ipdtDateTime  + DATETIME +   as datetime, the datetime to be converted +
+ +
+ +
DateTimeTzToString method
+ +
+ + Purpose: + Converts a DATETIMETZ to its string representation +
+ Description: + +
+ +
+
+ Return type:  CHARACTER +   character, string representation of the DATETIMETZ +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ DateTimeTzToString(INPUT:datetime-tz):CHARACTER +
+ +
+ Parameters  +
+
+ ipdtzDateTimeTz  + DATETIME-TZ +   as datetime-tz, the datetime with timezone to be converted +
+ +
+ +
DateToISOString method
+ +
+ + Purpose: + Converts a date to ISO 8601 format (YYYY-MM-DD) +
+ Description: + +
+ +
+
+ Return type:  CHARACTER +   character, ISO formatted date string (YYYY-MM-DD) +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ DateToISOString(INPUT:date):CHARACTER +
+ +
+ Parameters  +
+
+ ipdDate  + DATE +   as date, the date to be converted +
+ +
+ +
DateToString method
+ +
+ + Purpose: + Converts a DATE to its string representation +
+ Description: + +
+ +
+
+ Return type:  CHARACTER +   character, string representation of the DATE +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ DateToString(INPUT:date):CHARACTER +
+ +
+ Parameters  +
+
+ ipdDate  + DATE +   as date, the date to be converted +
+ +
+ +
DecimalToString method
+ +
+ + Purpose: + Converts a DECIMAL to its string representation +
+ Description: + +
+ +
+
+ Return type:  CHARACTER +   character, string representation of the decimal +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ DecimalToString(INPUT:decimal):CHARACTER +
+ +
+ Parameters  +
+
+ ipdeValue  + DECIMAL +   as decimal, the decimal to be converted +
+ +
+ +
FormatDate method
+ +
+ + Purpose: + Formats a date to a specified format +
+ Description: + +
+ +
+
+ Return type:  CHARACTER +   character, formatted date string +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ FormatDate(INPUT:date,INPUT:character):CHARACTER +
+ +
+ Parameters  +
+
+ ipdDate  + DATE +   as date, the date to be formatted +
+
+ ipcFormat  + CHARACTER +   as character, the date format (e.g., 'YYYY-MM-DD') +
+ +
+ +
FormatDateTime method
+ +
+ + Purpose: + Dynamically formats a datetime based on the format string passed (e.g., 'YYYY-MM-DD HH:MM:SS') +
+ Description: + +
+ +
+
+ Return type:  CHARACTER +   character, formatted datetime string +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ FormatDateTime(INPUT:datetime,INPUT:character):CHARACTER +
+ +
+ Parameters  +
+
+ ipdtDateTime  + DATETIME +   as datetime, the datetime to be formatted +
+
+ ipcFormat  + CHARACTER +   as character, the format for the datetime (e.g., 'YYYY-MM-DD HH:MM:SS') +
+ +
+ +
FormatDateTimeTz method
+ +
+ + Purpose: + Dynamically formats a datetime with timezone based on the format string passed (e.g., 'YYYY-MM-DDTHH:MI:SS±TZ') +
+ Description: + +
+ +
+
+ Return type:  CHARACTER +   character, formatted datetime string +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ FormatDateTimeTz(INPUT:datetime-tz,INPUT:character):CHARACTER +
+ +
+ Parameters  +
+
+ ipdtzDateTimeTz  + DATETIME-TZ +   as datetime-tz, the datetime with timezone to be formatted +
+
+ ipcFormat  + CHARACTER +   as character, the format for the datetime (e.g., 'YYYY-MM-DDTHH:MI:SS±TZ') +
+ +
+ +
FormatInputDate method
+ +
+ + Purpose: + Formats a date and time (including timezone if applicable) based on the input format string and components provided +
+ Description: + +
+ +
+
+ Return type:  CHARACTER +   character, formatted date and time string based on the provided format +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ FormatInputDate(INPUT:character,INPUT:integer,INPUT:integer,INPUT:integer,INPUT:integer,INPUT:integer,INPUT:integer,INPUT:character):CHARACTER +
+ +
+ Parameters  +
+
+ ipcFormat  + CHARACTER +   as character, the format for the date and time (e.g., 'YYYY-MM-DD HH:MI:SS') +
+
+ ipiYear  + INTEGER +   as integer, the year component of the date +
+
+ ipiMonth  + INTEGER +   as integer, the month component of the date +
+
+ ipiDay  + INTEGER +   as integer, the day component of the date +
+
+ ipiHour  + INTEGER +   as integer, the hour component of the time (optional, pass ? if not used) +
+
+ ipiMinute  + INTEGER +   as integer, the minute component of the time (optional, pass ? if not used) +
+
+ ipiSecond  + INTEGER +   as integer, the second component of the time (optional, pass ? if not used) +
+
+ ipcTZ  + CHARACTER +   as character, the timezone string (optional, pass ? if not used) +
+ +
+ +
Int64ToString method
+ +
+ + Purpose: + Converts an INT64 to its string representation +
+ Description: + +
+ +
+
+ Return type:  CHARACTER +   character, string representation of the INT64 +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ Int64ToString(INPUT:int64):CHARACTER +
+ +
+ Parameters  +
+
+ ipi64Value  + INT64 +   as int64, the INT64 to be converted +
+ +
+ +
IntegerToString method
+ +
+ + Purpose: + Converts an INTEGER to its string representation +
+ Description: + +
+ +
+
+ Return type:  CHARACTER +   character, string representation of the integer +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ IntegerToString(INPUT:integer):CHARACTER +
+ +
+ Parameters  +
+
+ ipiValue  + INTEGER +   as integer, the integer to be converted +
+ +
+ +
LogicalToString method
+ +
+ + Purpose: + Converts a LOGICAL to its string representation (either "TRUE"/"FALSE" or "1"/"0") +
+ Description: + +
+ +
+
+ Return type:  CHARACTER +   character, string representation of the logical ("TRUE"/"FALSE" or "1"/"0") +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ LogicalToString(INPUT:logical,INPUT:logical):CHARACTER +
+ +
+ Parameters  +
+
+ iplValue  + LOGICAL +   as logical, the logical to be converted +
+
+ iplUseNumeric  + LOGICAL +   as logical, indicating whether to return "1"/"0" or "TRUE"/"FALSE" +
+ +
+ +
StringToDate method
+ +
+ + Purpose: + Converts a string to a date +
+ Description: + +
+ +
+
+ Return type:  DATE +   date, date object +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ StringToDate(INPUT:character):DATE +
+ +
+ Parameters  +
+
+ ipcDateString  + CHARACTER +   as character, the string representation of the date +
+ +
+ +
StringToDateTime method
+ +
+ + Purpose: + Converts a string to a DATETIME +
+ Description: + +
+ +
+
+ Return type:  DATETIME +   datetime, datetime value +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ StringToDateTime(INPUT:character):DATETIME +
+ +
+ Parameters  +
+
+ ipcValue  + CHARACTER +   as character, the string representation of the datetime +
+ +
+ +
StringToDateTimeTz method
+ +
+ + Purpose: + Converts a string to a DATETIMETZ +
+ Description: + +
+ +
+
+ Return type:  DATETIME-TZ +   datetime-tz, DATETIMETZ value +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ StringToDateTimeTz(INPUT:character):DATETIME-TZ +
+ +
+ Parameters  +
+
+ ipcValue  + CHARACTER +   as character, the string representation of the datetime with timezone +
+ +
+ +
StringToDecimal method
+ +
+ + Purpose: + Converts a string to a DECIMAL +
+ Description: + +
+ +
+
+ Return type:  DECIMAL +   decimal, decimal value +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ StringToDecimal(INPUT:character):DECIMAL +
+ +
+ Parameters  +
+
+ ipcValue  + CHARACTER +   as character, the string representation of the decimal +
+ +
+ +
StringToInt64 method
+ +
+ + Purpose: + Converts a string to an INT64 +
+ Description: + +
+ +
+
+ Return type:  INT64 +   int64, INT64 value +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ StringToInt64(INPUT:character):INT64 +
+ +
+ Parameters  +
+
+ ipcValue  + CHARACTER +   as character, the string representation of the INT64 +
+ +
+ +
StringToInteger method
+ +
+ + Purpose: + Converts a string to an INTEGER +
+ Description: + +
+ +
+
+ Return type:  INTEGER +   integer, integer value +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ StringToInteger(INPUT:character):INTEGER +
+ +
+ Parameters  +
+
+ ipcValue  + CHARACTER +   as character, the string representation of the integer +
+ +
+ +
StringToLogical method
+ +
+ + Purpose: + Converts a string to a LOGICAL +
+ Description: + +
+ +
+
+ Return type:  LOGICAL +   logical, logical value (true or false) +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ StringToLogical(INPUT:character):LOGICAL +
+ +
+ Parameters  +
+
+ ipcValue  + CHARACTER +   as character, the string representation of the logical (e.g., "TRUE", "FALSE", "1", "0") +
+ + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Doc/Utils/DateUtil.cls.html b/Doc/Utils/DateUtil.cls.html new file mode 100644 index 0000000..2333161 --- /dev/null +++ b/Doc/Utils/DateUtil.cls.html @@ -0,0 +1,605 @@ + + + + +DateUtil.cls + + + + + + + +
+ Utils: DateUtil CLASS +
+
+ +
+ DateUtil + + CLASS
+ + +
+ Purpose: + Main helper class to handle Date operations +
+ Description: + +
+ Author(s): + Wayfare +
+ Notes: + +
+ Created: + Fri Oct 18 13:54:46 EEST 2024 +
+
+ + + + + +
Super Class
+
+ + Progress.Lang.Object + +
+ + + + + + + + +
+ Methods
+
+ + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Method Detail
+
+ +
+ +
GetFirstDayOfMonth method
+ +
+ + Purpose: + Return the first day of the month of a given date +
+ Description: + +
+ +
+
+ Return type:  DATE +   date, the first day of the month +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ GetFirstDayOfMonth(INPUT:date):DATE +
+ +
+ Parameters  +
+
+ ipdDate  + DATE +   as date, the date to get the first day of the month for +
+ +
+ +
GetFirstDayOfYear method
+ +
+ + Purpose: + Return the first day of the year of a given date +
+ Description: + +
+ +
+
+ Return type:  DATE +   date, the first day of the year +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ GetFirstDayOfYear(INPUT:date):DATE +
+ +
+ Parameters  +
+
+ ipdDate  + DATE +   as date, the date to get the first day of the year for +
+ +
+ +
GetFirstDayOfYearByYear method
+ +
+ + Purpose: + Return the first day of the year of a given year +
+ Description: + +
+ +
+
+ Return type:  DATE +   date, the first day of the year +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ GetFirstDayOfYearByYear(INPUT:integer):DATE +
+ +
+ Parameters  +
+
+ ipiYear  + INTEGER +   as integer, the year to get the first day of +
+ +
+ +
GetISOWeekday method
+ +
+ + Purpose: + Return the ISO weekday of a given date +
+ Description: + +
+ +
+
+ Return type:  INTEGER +   integer, the ISO weekday +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ GetISOWeekday(INPUT:date):INTEGER +
+ +
+ Parameters  +
+
+ ipdDate  + DATE +   as date, the date to get the weekday for +
+ +
+ +
GetISOWeekNumber method
+ +
+ + Purpose: + Return the week number of a given date +
+ Description: + +
+ +
+
+ Return type:  INTEGER +   integer, the week number +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ GetISOWeekNumber(INPUT:date):INTEGER +
+ +
+ Parameters  +
+
+ ipdDate  + DATE +   as date, the date to get the week number for +
+ +
+ +
GetLastDayOfMonth method
+ +
+ + Purpose: + Return the last day of the month of a given date +
+ Description: + +
+ +
+
+ Return type:  DATE +   date, the last day of the month +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ GetLastDayOfMonth(INPUT:date):DATE +
+ +
+ Parameters  +
+
+ ipdDate  + DATE +   as date, the date to get the last day of the month for +
+ +
+ +
GetLastDayOfYear method
+ +
+ + Purpose: + Return the last day of the year of a given date +
+ Description: + +
+ +
+
+ Return type:  DATE +   date, the last day of the year +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ GetLastDayOfYear(INPUT:date):DATE +
+ +
+ Parameters  +
+
+ ipdDate  + DATE +   as date, the date to get the last day of the year for +
+ +
+ +
GetLastDayOfYearByYear method
+ +
+ + Purpose: + Return the last day of the year of a given year +
+ Description: + +
+ +
+
+ Return type:  DATE +   date, the last day of the year +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ GetLastDayOfYearByYear(INPUT:integer):DATE +
+ +
+ Parameters  +
+
+ ipiYear  + INTEGER +   as integer, the year to get the last day of +
+ +
+ +
NumDaysInMonth method
+ +
+ + Purpose: + Return the number of days in a given month and year +
+ Description: + +
+ +
+
+ Return type:  INTEGER +   integer, the number of days +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ NumDaysInMonth(INPUT:integer,INPUT:integer):INTEGER +
+ +
+ Parameters  +
+
+ ipiMonth  + INTEGER +   as integer, the month +
+
+ ipiYear  + INTEGER +   as integer, the year +
+ + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Doc/Utils/DecimalExtentUtil.cls.html b/Doc/Utils/DecimalExtentUtil.cls.html new file mode 100644 index 0000000..d54b0bd --- /dev/null +++ b/Doc/Utils/DecimalExtentUtil.cls.html @@ -0,0 +1,726 @@ + + + + +DecimalExtentUtil.cls + + + + + + + +
+ Utils: DecimalExtentUtil CLASS +
+
+ +
+ DecimalExtentUtil + + CLASS
+ + +
+ Purpose: + Main helper class to handle decimal extent operations +
+ Description: + +
+ Author(s): + Wayfare +
+ Notes: + +
+ Created: + Wed Oct 23 14:16:49 EEST 2024 +
+
+ + + + + +
Super Class
+
+ + Progress.Lang.Object + +
+ + + + + + + + +
+ Methods
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Method Detail
+
+ +
+ +
AddElement method
+ +
+ + Purpose: + Add element to the array at the last position +
+ Description: + +
+ +
+
+ Return type:  DECIMAL +   decimal extent, the array with the added element +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ AddElement(INPUT:decimal[],INPUT:decimal):DECIMAL[] +
+ +
+ Parameters  +
+
+ ipdeeArray  + DECIMAL +   as decimal extent, the array +
+
+ ipdeElement  + DECIMAL +   as decimal, the element to add +
+ +
+ +
AddElement method
+ +
+ + Purpose: + Add element to array +
+ Description: + +
+ +
+
+ Return type:  DECIMAL +   decimal extent, the array with the added element +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ AddElement(INPUT:decimal[],INPUT:integer,INPUT:decimal):DECIMAL[] +
+ +
+ Parameters  +
+
+ ipdeeArray  + DECIMAL +   as decimal extent, the array +
+
+ ipiPosition  + INTEGER +   as integer, the position to add the element to +
+
+ ipdeElement  + DECIMAL +   as decimal, the element to add +
+ +
+ +
GetAverage method
+ +
+ + Purpose: + Returns the average of all elements in an array +
+ Description: + +
+ +
+
+ Return type:  DECIMAL +   decimal, the average of the array +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ GetAverage(INPUT:decimal[]):DECIMAL +
+ +
+ Parameters  +
+
+ ipdeeArray  + DECIMAL +   as decimal extent, the array +
+ +
+ +
GetFirstElement method
+ +
+ + Purpose: + Returns the first element of an array +
+ Description: + +
+ +
+
+ Return type:  DECIMAL +   decimal, the first element of the array +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ GetFirstElement(INPUT:decimal[]):DECIMAL +
+ +
+ Parameters  +
+
+ ipdeeArray  + DECIMAL +   as decimal extent, the array +
+ +
+ +
GetLastElement method
+ +
+ + Purpose: + Returns the last element of an array +
+ Description: + +
+ +
+
+ Return type:  DECIMAL +   decimal, the last element of the array +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ GetLastElement(INPUT:decimal[]):DECIMAL +
+ +
+ Parameters  +
+
+ ipdeeArray  + DECIMAL +   as decimal extent, the array +
+ +
+ +
GetMaxValue method
+ +
+ + Purpose: + Returns the maximum value of an array +
+ Description: + +
+ +
+
+ Return type:  DECIMAL +   decimal, the maximum value of the array +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ GetMaxValue(INPUT:decimal[]):DECIMAL +
+ +
+ Parameters  +
+
+ ipdeeArray  + DECIMAL +   as decimal extent, the array +
+ +
+ +
GetMinValue method
+ +
+ + Purpose: + Returns the minimum value of an array +
+ Description: + +
+ +
+
+ Return type:  DECIMAL +   decimal, the minimum value of the array +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ GetMinValue(INPUT:decimal[]):DECIMAL +
+ +
+ Parameters  +
+
+ ipdeeArray  + DECIMAL +
+ +
+ +
GetSum method
+ +
+ + Purpose: + Returns the sum of all the elements of an array +
+ Description: + +
+ +
+
+ Return type:  DECIMAL +   decimal, the sum of the array +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ GetSum(INPUT:decimal[]):DECIMAL +
+ +
+ Parameters  +
+
+ ipdeeArray  + DECIMAL +   as decimal extent, the array +
+ +
+ +
HasElement method
+ +
+ + Purpose: + Checks if array contains an element +
+ Description: + +
+ +
+
+ Return type:  LOGICAL +   logical, whether the element exists or not +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ HasElement(INPUT:decimal[],INPUT:decimal):LOGICAL +
+ +
+ Parameters  +
+
+ ipdeeArray  + DECIMAL +   as decimal extent, the array +
+
+ ipdeElement  + DECIMAL +   as decimal, the element to search for +
+ +
+ +
ListToDecimalExtent method
+ +
+ + Purpose: + Fills an array with the values provided in a list +
+ Description: + +
+ +
+
+ Return type:  DECIMAL +   decimal extent, an array containing the elements of the list +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ ListToDecimalExtent(INPUT:character,INPUT:character):DECIMAL[] +
+ +
+ Parameters  +
+
+ ipcList  + CHARACTER +   as character, the list +
+
+ ipcSeparator  + CHARACTER +   as character, the list separator +
+ +
+ +
RemoveFirstElement method
+ +
+ + Purpose: + Removes the first element of an array +
+ Description: + +
+ +
+
+ Return type:  DECIMAL +   decimal extent, the array without the first element +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ RemoveFirstElement(INPUT:decimal[]):DECIMAL[] +
+ +
+ Parameters  +
+
+ ipdeeArray  + DECIMAL +   as decimal extent, the array +
+ + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Doc/Utils/DecimalUtil.cls.html b/Doc/Utils/DecimalUtil.cls.html new file mode 100644 index 0000000..5da3d33 --- /dev/null +++ b/Doc/Utils/DecimalUtil.cls.html @@ -0,0 +1,762 @@ + + + + +DecimalUtil.cls + + + + + + + +
+ Utils: DecimalUtil CLASS +
+
+ +
+ DecimalUtil + + CLASS
+ + +
+ Purpose: + Main helper class to handle Decimal operations +
+ Description: + +
+ Author(s): + Wayfare +
+ Notes: + +
+ Created: + Thu Oct 17 12:29:43 EEST 2024 +
+
+ + + + + +
Super Class
+
+ + Progress.Lang.Object + +
+ + + + + + + + +
+ Methods
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Method Detail
+
+ +
+ +
Abs method
+ +
+ + Purpose: + Return the absolute value of a given decimal +
+ Description: + +
+ +
+
+ Return type:  DECIMAL +   decimal, the absolute value +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ Abs(INPUT:decimal):DECIMAL +
+ +
+ Parameters  +
+
+ ipdeDecimal  + DECIMAL +   as decimal, the decimal to convert +
+ +
+ +
InRange method
+ +
+ + Purpose: + Check if a given decimal is in a specified range +
+ Description: + +
+ +
+
+ Return type:  LOGICAL +   logical, true if it is in the range and false otherwise +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ InRange(INPUT:decimal,INPUT:decimal,INPUT:decimal):LOGICAL +
+ +
+ Parameters  +
+
+ ipdeDecimal  + DECIMAL +   as decimal, the decimal to check +
+
+ ipdeMin  + DECIMAL +   as decimal, the lower bound of the range +
+
+ ipdeMax  + DECIMAL +   as decimal, the upper bound of the range +
+ +
+ +
IsNegative method
+ +
+ + Purpose: + Check if a given decimal is negative +
+ Description: + +
+ +
+
+ Return type:  LOGICAL +   logical, true if it is negative and false otherwise +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ IsNegative(INPUT:decimal):LOGICAL +
+ +
+ Parameters  +
+
+ ipdeDecimal  + DECIMAL +   as decimal, the decimal to check +
+ +
+ +
IsNotNull method
+ +
+ + Purpose: + Check if a given decimal is different from null +
+ Description: + +
+ +
+
+ Return type:  LOGICAL +   logical, true if it is not null and false otherwise +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ IsNotNull(INPUT:decimal):LOGICAL +
+ +
+ Parameters  +
+
+ ipdeDecimal  + DECIMAL +   as decimal, the decimal to check +
+ +
+ +
IsNotNullOrZero method
+ +
+ + Purpose: + Check if a given decimal is different from null and zero +
+ Description: + +
+ +
+
+ Return type:  LOGICAL +   logical, true if it is not null or zero and false otherwise +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ IsNotNullOrZero(INPUT:decimal):LOGICAL +
+ +
+ Parameters  +
+
+ ipdeDecimal  + DECIMAL +   as decimal, the decimal to check +
+ +
+ +
IsNotZero method
+ +
+ + Purpose: + Check if a given decimal is different from zero +
+ Description: + +
+ +
+
+ Return type:  LOGICAL +   logical, true if it is not zero and false otherwise +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ IsNotZero(INPUT:decimal):LOGICAL +
+ +
+ Parameters  +
+
+ ipdeDecimal  + DECIMAL +   as decimal, the decimal to check +
+ +
+ +
IsNull method
+ +
+ + Purpose: + Check if a given decimal is null +
+ Description: + +
+ +
+
+ Return type:  LOGICAL +   logical, true if it is null and false otherwise +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ IsNull(INPUT:decimal):LOGICAL +
+ +
+ Parameters  +
+
+ ipdeDecimal  + DECIMAL +   as decimal, the decimal to check +
+ +
+ +
IsNullOrZero method
+ +
+ + Purpose: + Check if a given decimal is null or zero +
+ Description: + +
+ +
+
+ Return type:  LOGICAL +   logical, true if it is null or zero and false otherwise +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ IsNullOrZero(INPUT:decimal):LOGICAL +
+ +
+ Parameters  +
+
+ ipdeDecimal  + DECIMAL +   as decimal, the decimal to check +
+ +
+ +
IsPositive method
+ +
+ + Purpose: + Check if a given decimal is positive +
+ Description: + +
+ +
+
+ Return type:  LOGICAL +   logical, true if it is positive and false otherwise +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ IsPositive(INPUT:decimal):LOGICAL +
+ +
+ Parameters  +
+
+ ipdeDecimal  + DECIMAL +   as decimal, the decimal to check +
+ +
+ +
IsZero method
+ +
+ + Purpose: + Check if a given decimal is zero +
+ Description: + +
+ +
+
+ Return type:  LOGICAL +   logical, true if it is zero and false otherwise +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ IsZero(INPUT:decimal):LOGICAL +
+ +
+ Parameters  +
+
+ ipdeDecimal  + DECIMAL +   as decimal, the decimal to check +
+ +
+ +
RoundDecimal method
+ +
+ + Purpose: + Round a decimal to an integer value +
+ Description: + +
+ +
+
+ Return type:  INTEGER +   integer, the rounded value +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ RoundDecimal(INPUT:decimal):INTEGER +
+ +
+ Parameters  +
+
+ ipdeDecimal  + DECIMAL +   as decimal, the decimal to round +
+ +
+ +
ToString method
+ +
+ + Purpose: + Convert a given decimal to string +
+ Description: + +
+ +
+
+ Return type:  CHARACTER +   character, the string value of the decimal +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ ToString(INPUT:decimal):CHARACTER +
+ +
+ Parameters  +
+
+ ipdeDecimal  + DECIMAL +   as decimal, the decimal to convert +
+ + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Doc/Utils/EmailSenderUnixUtil.cls.html b/Doc/Utils/EmailSenderUnixUtil.cls.html new file mode 100644 index 0000000..e0764ae --- /dev/null +++ b/Doc/Utils/EmailSenderUnixUtil.cls.html @@ -0,0 +1,226 @@ + + + + +EmailSenderUnixUtil.cls + + + + + + + +
+ Utils: EmailSenderUnixUtil CLASS +
+
+ +
+ EmailSenderUnixUtil + + CLASS
+ + +
+ Purpose: + Main helper class for sending email on Unix +
+ Description: + +
+ Author(s): + Wayfare +
+ Notes: + +
+ Created: + Thu Dec 05 11:43:32 EET 2024 +
+
+ + + + + +
Super Class
+
+ + Progress.Lang.Object + +
+ + + + + + + + +
+ Methods
+
+ + + + + + + + + +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Method Detail
+
+ +
+ +
SendEmail method
+ +
+ + Purpose: + Send an email on Linux using curl +
+ Description: + +
+ +
+
+ Return type:  VOID +  
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ SendEmail(INPUT:character,INPUT:character,INPUT:character,INPUT:character,INPUT:character,INPUT:integer,INPUT:character,INPUT:character) +
+ +
+ Parameters  +
+
+ ipcToEmails  + CHARACTER +   as character, the list of recipient emails, separated by commas +
+
+ ipcFromEmail  + CHARACTER +   as character, the sender's email address +
+
+ ipcSubject  + CHARACTER +   as character, the email subject +
+
+ ipcBody  + CHARACTER +   as character, the email body +
+
+ ipcSmtpHost  + CHARACTER +   as character, the SMTP host +
+
+ ipcSmtpPort  + INTEGER +   as integer, the SMTP port +
+
+ ipcSmtpUser  + CHARACTER +   as character, the SMTP username +
+
+ ipcSmtpPassword  + CHARACTER +   as character, the SMTP password +
+ + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Doc/Utils/EmailSenderWindowsUtil.cls.html b/Doc/Utils/EmailSenderWindowsUtil.cls.html new file mode 100644 index 0000000..f23f4ee --- /dev/null +++ b/Doc/Utils/EmailSenderWindowsUtil.cls.html @@ -0,0 +1,211 @@ + + + + +EmailSenderWindowsUtil.cls + + + + + + + +
+ Utils: EmailSenderWindowsUtil CLASS +
+
+ +
+ EmailSenderWindowsUtil + + CLASS
+ + +
+ Purpose: + Main helper class for sending email on Windows +
+ Description: + +
+ Author(s): + Wayfare +
+ Notes: + +
+ Created: + Thu Nov 07 13:53:11 EET 2024 +
+
+ + + + + +
Super Class
+
+ + Progress.Lang.Object + +
+ + + + + + + + +
+ Methods
+
+ + + + + + + + + +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Method Detail
+
+ +
+ +
SendEmail method
+ +
+ + Purpose: + Send an email on Windows +
+ Description: + +
+ +
+
+ Return type:  VOID +  
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ SendEmail(INPUT:character,INPUT:character,INPUT:character,INPUT:character,INPUT:character) +
+ +
+ Parameters  +
+
+ ipcToEmails  + CHARACTER +   as character, the list of recipient emails separated by commas +
+
+ ipcFromEmail  + CHARACTER +   as character, the sender's email address +
+
+ ipcFromUserName  + CHARACTER +   as character, the sender's username +
+
+ ipcSubject  + CHARACTER +   as character, the subject of the email +
+
+ ipcBody  + CHARACTER +   as character, the body of the email +
+ + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Doc/Utils/EmailUtil.cls.html b/Doc/Utils/EmailUtil.cls.html new file mode 100644 index 0000000..931c7d3 --- /dev/null +++ b/Doc/Utils/EmailUtil.cls.html @@ -0,0 +1,242 @@ + + + + +EmailUtil.cls + + + + + + + +
+ Utils: EmailUtil CLASS +
+
+ +
+ EmailUtil + + CLASS
+ + +
+ Purpose: + Main helper class to handle email operations +
+ Description: + +
+ Author(s): + Wayfare +
+ Notes: + +
+ Created: + Fri Oct 25 11:52:34 EEST 2024 +
+
+ + + + + +
Super Class
+
+ + Progress.Lang.Object + +
+ + + + + + + + +
+ Methods
+
+ + + + + + + + + + +
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Method Detail
+
+ +
+ +
GetDomain method
+ +
+ + Purpose: + Return the domain of an email +
+ Description: + +
+ +
+
+ Return type:  CHARACTER +   character, the domain +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ GetDomain(INPUT:character):CHARACTER +
+ +
+ Parameters  +
+
+ ipcEmail  + CHARACTER +   as character, the email string to get the domain from +
+ +
+ +
GetUserName method
+ +
+ + Purpose: + Return the username of an email +
+ Description: + +
+ +
+
+ Return type:  CHARACTER +   character, the username +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ GetUserName(INPUT:character):CHARACTER +
+ +
+ Parameters  +
+
+ ipcEmail  + CHARACTER +   as character, the email string to get the username from +
+ + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Doc/Utils/FileUtil.cls.html b/Doc/Utils/FileUtil.cls.html new file mode 100644 index 0000000..7943838 --- /dev/null +++ b/Doc/Utils/FileUtil.cls.html @@ -0,0 +1,810 @@ + + + + +FileUtil.cls + + + + + + + +
+ Utils: FileUtil CLASS +
+
+ +
+ FileUtil + + CLASS
+ + +
+ Purpose: + Main helper class to handle file operations +
+ Description: + +
+ Author(s): + Wayfare +
+ Notes: + +
+ Created: + Thu Oct 24 13:13:38 EEST 2024 +
+
+ + + + + +
Super Class
+
+ + Progress.Lang.Object + +
+ + + + + + + + +
+ Methods
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Method Detail
+
+ +
+ +
CopyFile method
+ +
+ + Purpose: + Copy a file from one location to another +
+ Description: + +
+ +
+
+ Return type:  LOGICAL +   logical, whether the file was successfully copied +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ CopyFile(INPUT:character,INPUT:character,INPUT:character):LOGICAL +
+ +
+ Parameters  +
+
+ ipcSourcePath  + CHARACTER +   as character, the path for the file to copy +
+
+ ipcTargetPath  + CHARACTER +   as character, the path where the file will be copied +
+
+ ipcFileName  + CHARACTER +   as character, the name for the copied file +
+ +
+ +
CreateFolder method
+ +
+ + Purpose: + Create a new folder +
+ Description: + +
+ +
+
+ Return type:  LOGICAL +   logical, whether the folder was successfully created +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ CreateFolder(INPUT:character):LOGICAL +
+ +
+ Parameters  +
+
+ ipcPath  + CHARACTER +   as character, the path where to create the folder +
+ +
+ +
DeleteEmptyFolders method
+ +
+ + Purpose: + Delete all empty folders +
+ Description: + +
+ +
+
+ Return type:  VOID +  
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ DeleteEmptyFolders(INPUT:character) +
+ +
+ Parameters  +
+
+ ipcPath  + CHARACTER +   as character, the path to start the delete process +
+ +
+ +
DeleteFolder method
+ +
+ + Purpose: + Delete a folder +
+ Description: + +
+ +
+
+ Return type:  LOGICAL +   logical, whether the folder was successfully deleted +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ DeleteFolder(INPUT:character):LOGICAL +
+ +
+ Parameters  +
+
+ ipcPath  + CHARACTER +   as character, the path to the folder to delete +
+ +
+ +
FindFile method
+ +
+ + Purpose: + Get the full path for the file +
+ Description: + +
+ +
+
+ Return type:  CHARACTER +   character, the full path to the file +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ FindFile(INPUT:character):CHARACTER +
+ +
+ Parameters  +
+
+ ipcPath  + CHARACTER +   as character, the path +
+ +
+ +
FolderExists method
+ +
+ + Purpose: + Check if a folder exists +
+ Description: + +
+ +
+
+ Return type:  LOGICAL +   logical, whether the folder exists +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ FolderExists(INPUT:character):LOGICAL +
+ +
+ Parameters  +
+
+ ipcPath  + CHARACTER +   as character, the path to the folder +
+ +
+ +
GetFileExtension method
+ +
+ + Purpose: + Get the file extension +
+ Description: + +
+ +
+
+ Return type:  CHARACTER +   character, the file extension +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ GetFileExtension(INPUT:character):CHARACTER +
+ +
+ Parameters  +
+
+ ipcPath  + CHARACTER +   as character, the path to the file +
+ +
+ +
GetOSFileSeparator method
+ +
+ + Purpose: + Get the file separator +
+ Description: + +
+ +
+
+ Return type:  CHARACTER +   character, the file separator +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ GetOSFileSeparator():CHARACTER +
+ + +
+ +
GetParentFolder method
+ +
+ + Purpose: + Get the parent folder +
+ Description: + +
+ +
+
+ Return type:  CHARACTER +   character, the parent folder for the specified path +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ GetParentFolder(INPUT:character):CHARACTER +
+ +
+ Parameters  +
+
+ ipcPath  + CHARACTER +   as character, the path to the folder +
+ +
+ +
GetParentFolderUnix method
+ +
+ + Purpose: + Get the parent folder for Unix +
+ Description: + +
+ +
+
+ Return type:  CHARACTER +   character, the parent folder for the specified path +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ GetParentFolderUnix(INPUT:character):CHARACTER +
+ +
+ Parameters  +
+
+ ipcPath  + CHARACTER +   as character, the path to the folder +
+ +
+ +
GetParentFolderWindows method
+ +
+ + Purpose: + Get the parent folder for Windows +
+ Description: + +
+ +
+
+ Return type:  CHARACTER +   character, the parent folder for the specified path +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ GetParentFolderWindows(INPUT:character):CHARACTER +
+ +
+ Parameters  +
+
+ ipcPath  + CHARACTER +   as character, the path to the folder +
+ +
+ +
MoveFile method
+ +
+ + Purpose: + Move a file +
+ Description: + +
+ +
+
+ Return type:  LOGICAL +   logical, whether the file was successfully moved +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ MoveFile(INPUT:character,INPUT:character):LOGICAL +
+ +
+ Parameters  +
+
+ ipcSourcePath  + CHARACTER +   as character, the path to the file to move +
+
+ ipcTargetPath  + CHARACTER +   as character, the path where to move the file +
+ +
+ +
NormalizePath method
+ +
+ + Purpose: + Normalize a path for Unix systems +
+ Description: + +
+ +
+
+ Return type:  CHARACTER +   character, the normalized path +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ NormalizePath(INPUT:character):CHARACTER +
+ +
+ Parameters  +
+
+ ipcPath  + CHARACTER +   as character, the path to be normalized +
+ + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Doc/Utils/Int64Util.cls.html b/Doc/Utils/Int64Util.cls.html new file mode 100644 index 0000000..16969ea --- /dev/null +++ b/Doc/Utils/Int64Util.cls.html @@ -0,0 +1,503 @@ + + + + +Int64Util.cls + + + + + + + +
+ Utils: Int64Util CLASS +
+
+ +
+ Int64Util + + CLASS
+ + +
+ Purpose: + Main helper class to handle int64 operations +
+ Description: + +
+ Author(s): + Wayfare +
+ Notes: + +
+ Created: + Fri Nov 22 15:22:33 EET 2024 +
+
+ + + + + +
Super Class
+
+ + Progress.Lang.Object + +
+ + + + + + + + +
+ Methods
+
+ + + + + + + + + + + + + + + + + + + + + +
+ + + +
+ + + +
+ + + +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Method Detail
+
+ +
+ +
GenerateRandomInt64 method
+ +
+ + Purpose: + Generate a random int64 within a specified range +
+ Description: + +
+ +
+
+ Return type:  INT64 +   int64, the generated random value +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ GenerateRandomInt64(INPUT:int64,INPUT:int64):INT64 +
+ +
+ Parameters  +
+
+ ipi64RangeStart  + INT64 +   as int64, the start of the range +
+
+ ipi64RangeEnd  + INT64 +   as int64, the end of the range +
+ +
+ +
IsNotNull method
+ +
+ + Purpose: + Check if a given int64 is different from null +
+ Description: + +
+ +
+
+ Return type:  LOGICAL +   logical, true if it is not null and false otherwise +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ IsNotNull(INPUT:int64):LOGICAL +
+ +
+ Parameters  +
+
+ ipi64Element  + INT64 +   as int64, the int64 to check +
+ +
+ +
IsNotNullOrZero method
+ +
+ + Purpose: + Check if a given int64 is different from null and zero +
+ Description: + +
+ +
+
+ Return type:  LOGICAL +   logical, true if it is not null or zero and false otherwise +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ IsNotNullOrZero(INPUT:int64):LOGICAL +
+ +
+ Parameters  +
+
+ ipi64Element  + INT64 +   as int64, the int64 to check +
+ +
+ +
IsNotZero method
+ +
+ + Purpose: + Check if a given int64 is different from zero +
+ Description: + +
+ +
+
+ Return type:  LOGICAL +   logical, true if it is not zero and false otherwise +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ IsNotZero(INPUT:int64):LOGICAL +
+ +
+ Parameters  +
+
+ ipi64Element  + INT64 +   as int64, the int64 to check +
+ +
+ +
IsNull method
+ +
+ + Purpose: + Check if a given int64 is null +
+ Description: + +
+ +
+
+ Return type:  LOGICAL +   logical, true if it is null and false otherwise +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ IsNull(INPUT:int64):LOGICAL +
+ +
+ Parameters  +
+
+ ipi64Element  + INT64 +   as int64, the int64 to check +
+ +
+ +
IsNullOrZero method
+ +
+ + Purpose: + Check if a given int64 is null or zero +
+ Description: + +
+ +
+
+ Return type:  LOGICAL +   logical, true if it is null or zero and false otherwise +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ IsNullOrZero(INPUT:int64):LOGICAL +
+ +
+ Parameters  +
+
+ ipi64Element  + INT64 +   as int64, the int64 to check +
+ +
+ +
IsZero method
+ +
+ + Purpose: + Check if a given int64 is zero +
+ Description: + +
+ +
+
+ Return type:  LOGICAL +   logical, true if it is zero and false otherwise +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ IsZero(INPUT:int64):LOGICAL +
+ +
+ Parameters  +
+
+ ipi64Element  + INT64 +   as int64, the int64 to check +
+ + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Doc/Utils/Integer64ExtentUtil.cls.html b/Doc/Utils/Integer64ExtentUtil.cls.html new file mode 100644 index 0000000..421be7a --- /dev/null +++ b/Doc/Utils/Integer64ExtentUtil.cls.html @@ -0,0 +1,727 @@ + + + + +Integer64ExtentUtil.cls + + + + + + + +
+ Utils: Integer64ExtentUtil CLASS +
+
+ +
+ Integer64ExtentUtil + + CLASS
+ + +
+ Purpose: + Main helper class to handle int64 extent operations +
+ Description: + +
+ Author(s): + Wayfare +
+ Notes: + +
+ Created: + Wed Oct 23 14:16:49 EEST 2024 +
+
+ + + + + +
Super Class
+
+ + Progress.Lang.Object + +
+ + + + + + + + +
+ Methods
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Method Detail
+
+ +
+ +
AddElement method
+ +
+ + Purpose: + Add an element to the array at the last position +
+ Description: + +
+ +
+
+ Return type:  INT64 +   int64 extent, the array with the added element +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ AddElement(INPUT:int64[],INPUT:int64):INT64[] +
+ +
+ Parameters  +
+
+ ipi64eArray  + INT64 +   as int64 extent, the array +
+
+ ipi64Element  + INT64 +   as int64, the element to add +
+ +
+ +
AddElement method
+ +
+ + Purpose: + Add an element to an array +
+ Description: + +
+ +
+
+ Return type:  INT64 +   int64 extent, the array with the added element +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ AddElement(INPUT:int64[],INPUT:integer,INPUT:int64):INT64[] +
+ +
+ Parameters  +
+
+ ipi64eArray  + INT64 +   as int64 extent, the array +
+
+ ipiPosition  + INTEGER +   as integer, the position to add the element to +
+
+ ipi64Element  + INT64 +   as int64, the element to add +
+ +
+ +
GetAverage method
+ +
+ + Purpose: + Returns the average of all elements in an array +
+ Description: + +
+ +
+
+ Return type:  DECIMAL +   decimal, the average of the array elements +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ GetAverage(INPUT:int64[]):DECIMAL +
+ +
+ Parameters  +
+
+ ipi64eArray  + INT64 +   as int64 extent, the array +
+ +
+ +
GetFirstElement method
+ +
+ + Purpose: + Returns the first element of an array +
+ Description: + +
+ +
+
+ Return type:  INT64 +   int64, the first element of the array +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ GetFirstElement(INPUT:int64[]):INT64 +
+ +
+ Parameters  +
+
+ ipi64eArray  + INT64 +   as int64 extent, the array +
+ +
+ +
GetLastElement method
+ +
+ + Purpose: + Returns the last element of an array +
+ Description: + +
+ +
+
+ Return type:  INT64 +   int64, the last element of the array +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ GetLastElement(INPUT:int64[]):INT64 +
+ +
+ Parameters  +
+
+ ipi64eArray  + INT64 +   as int64 extent, the array +
+ +
+ +
GetMaxValue method
+ +
+ + Purpose: + Returns the maximum value of an array +
+ Description: + +
+ +
+
+ Return type:  INT64 +   int64, the maximum value in the array +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ GetMaxValue(INPUT:int64[]):INT64 +
+ +
+ Parameters  +
+
+ ipi64eArray  + INT64 +   as int64 extent, the array +
+ +
+ +
GetMinValue method
+ +
+ + Purpose: + Returns the minimum value of an array +
+ Description: + +
+ +
+
+ Return type:  INT64 +   int64, the minimum value in the array +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ GetMinValue(INPUT:int64[]):INT64 +
+ +
+ Parameters  +
+
+ ipi64eArray  + INT64 +   as int64 extent, the array +
+ +
+ +
GetSum method
+ +
+ + Purpose: + Returns the sum of all the elements of an array +
+ Description: + +
+ +
+
+ Return type:  INT64 +   int64, the sum of the array elements +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ GetSum(INPUT:int64[]):INT64 +
+ +
+ Parameters  +
+
+ ipi64eArray  + INT64 +   as int64 extent, the array +
+ +
+ +
HasElement method
+ +
+ + Purpose: + Checks if an array contains a specific element +
+ Description: + +
+ +
+
+ Return type:  LOGICAL +   logical, whether the element exists in the array +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ HasElement(INPUT:int64[],INPUT:int64):LOGICAL +
+ +
+ Parameters  +
+
+ ipi64eArray  + INT64 +   as int64 extent, the array +
+
+ ipi64Element  + INT64 +   as int64, the element to search for +
+ +
+ +
ListToInt64Extent method
+ +
+ + Purpose: + Fills an array with values provided in a list +
+ Description: + +
+ +
+
+ Return type:  INT64 +   int64 extent, an array containing the elements of the list +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ ListToInt64Extent(INPUT:character,INPUT:character):INT64[] +
+ +
+ Parameters  +
+
+ ipcList  + CHARACTER +   as character, the list of values +
+
+ ipcSeparator  + CHARACTER +   as character, the list separator +
+ +
+ +
RemoveFirstElement method
+ +
+ + Purpose: + Removes the first element of an array +
+ Description: + +
+ +
+
+ Return type:  INT64 +   int64 extent, the array without the first element +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ RemoveFirstElement(INPUT:int64[]):INT64[] +
+ +
+ Parameters  +
+
+ ipi64eArray  + INT64 +   as int64 extent, the array +
+ + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Doc/Utils/IntegerExtentUtil.cls.html b/Doc/Utils/IntegerExtentUtil.cls.html new file mode 100644 index 0000000..f9f33cb --- /dev/null +++ b/Doc/Utils/IntegerExtentUtil.cls.html @@ -0,0 +1,727 @@ + + + + +IntegerExtentUtil.cls + + + + + + + +
+ Utils: IntegerExtentUtil CLASS +
+
+ +
+ IntegerExtentUtil + + CLASS
+ + +
+ Purpose: + Main helper class to handle integer extent operations +
+ Description: + +
+ Author(s): + Wayfare +
+ Notes: + +
+ Created: + Wed Oct 23 14:16:49 EEST 2024 +
+
+ + + + + +
Super Class
+
+ + Progress.Lang.Object + +
+ + + + + + + + +
+ Methods
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Method Detail
+
+ +
+ +
AddElement method
+ +
+ + Purpose: + Add an element to the array at the last position +
+ Description: + +
+ +
+
+ Return type:  INTEGER +   integer extent, the array with the added element +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ AddElement(INPUT:integer[],INPUT:integer):INTEGER[] +
+ +
+ Parameters  +
+
+ ipieArray  + INTEGER +   as integer extent, the array +
+
+ ipiElement  + INTEGER +   as integer, the element to add +
+ +
+ +
AddElement method
+ +
+ + Purpose: + Add an element to an array +
+ Description: + +
+ +
+
+ Return type:  INTEGER +   integer extent, the array with the added element +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ AddElement(INPUT:integer[],INPUT:integer,INPUT:integer):INTEGER[] +
+ +
+ Parameters  +
+
+ ipieArray  + INTEGER +   as integer extent, the array +
+
+ ipiPosition  + INTEGER +   as integer, the position to add the element to +
+
+ ipiElement  + INTEGER +   as integer, the element to add +
+ +
+ +
GetAverage method
+ +
+ + Purpose: + Returns the average of all elements in an array +
+ Description: + +
+ +
+
+ Return type:  DECIMAL +   decimal, the average of the array elements +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ GetAverage(INPUT:integer[]):DECIMAL +
+ +
+ Parameters  +
+
+ ipieArray  + INTEGER +   as integer extent, the array +
+ +
+ +
GetFirstElement method
+ +
+ + Purpose: + Returns the first element of an array +
+ Description: + +
+ +
+
+ Return type:  INTEGER +   integer, the first element of the array +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ GetFirstElement(INPUT:integer[]):INTEGER +
+ +
+ Parameters  +
+
+ ipieArray  + INTEGER +   as integer extent, the array +
+ +
+ +
GetLastElement method
+ +
+ + Purpose: + Returns the last element of an array +
+ Description: + +
+ +
+
+ Return type:  INTEGER +   integer, the last element of the array +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ GetLastElement(INPUT:integer[]):INTEGER +
+ +
+ Parameters  +
+
+ ipieArray  + INTEGER +   as integer extent, the array +
+ +
+ +
GetMaxValue method
+ +
+ + Purpose: + Returns the maximum value of an array +
+ Description: + +
+ +
+
+ Return type:  INTEGER +   integer, the maximum value in the array +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ GetMaxValue(INPUT:integer[]):INTEGER +
+ +
+ Parameters  +
+
+ ipieArray  + INTEGER +   as integer extent, the array +
+ +
+ +
GetMinValue method
+ +
+ + Purpose: + Returns the minimum value of an array +
+ Description: + +
+ +
+
+ Return type:  INTEGER +   integer, the minimum value in the array +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ GetMinValue(INPUT:integer[]):INTEGER +
+ +
+ Parameters  +
+
+ ipieArray  + INTEGER +   as integer extent, the array +
+ +
+ +
GetSum method
+ +
+ + Purpose: + Returns the sum of all the elements of an array +
+ Description: + +
+ +
+
+ Return type:  INTEGER +   integer, the sum of the array elements +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ GetSum(INPUT:integer[]):INTEGER +
+ +
+ Parameters  +
+
+ ipieArray  + INTEGER +   as integer extent, the array +
+ +
+ +
HasElement method
+ +
+ + Purpose: + Checks if an array contains a specific element +
+ Description: + +
+ +
+
+ Return type:  LOGICAL +   logical, whether the element exists in the array +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ HasElement(INPUT:integer[],INPUT:integer):LOGICAL +
+ +
+ Parameters  +
+
+ ipieArray  + INTEGER +   as integer extent, the array +
+
+ ipiElement  + INTEGER +   as integer, the element to search for +
+ +
+ +
ListToIntegerExtent method
+ +
+ + Purpose: + Fills an array with values provided in a list +
+ Description: + +
+ +
+
+ Return type:  INTEGER +   integer extent, an array containing the elements of the list +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ ListToIntegerExtent(INPUT:character,INPUT:character):INTEGER[] +
+ +
+ Parameters  +
+
+ ipcList  + CHARACTER +   as character, the list of values +
+
+ ipcSeparator  + CHARACTER +   as character, the list separator +
+ +
+ +
RemoveFirstElement method
+ +
+ + Purpose: + Removes the first element of an array +
+ Description: + +
+ +
+
+ Return type:  INTEGER +   integer extent, the array without the first element +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ RemoveFirstElement(INPUT:integer[]):INTEGER[] +
+ +
+ Parameters  +
+
+ ipieArray  + INTEGER +   as integer extent, the array +
+ + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Doc/Utils/IntegerUtil.cls.html b/Doc/Utils/IntegerUtil.cls.html new file mode 100644 index 0000000..75d997f --- /dev/null +++ b/Doc/Utils/IntegerUtil.cls.html @@ -0,0 +1,814 @@ + + + + +IntegerUtil.cls + + + + + + + +
+ Utils: IntegerUtil CLASS +
+
+ +
+ IntegerUtil + + CLASS
+ + +
+ Purpose: + Main helper class to handle Integer operations +
+ Description: + +
+ Author(s): + Wayfare +
+ Notes: + +
+ Created: + Thu Oct 17 10:21:37 EEST 2024 +
+
+ + + + + +
Super Class
+
+ + Progress.Lang.Object + +
+ + + + + + + + +
+ Methods
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Method Detail
+
+ +
+ +
Abs method
+ +
+ + Purpose: + Returns the absolute value of a given integer +
+ Description: + +
+ +
+
+ Return type:  INTEGER +   integer, the absolute value of the integer +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ Abs(INPUT:integer):INTEGER +
+ +
+ Parameters  +
+
+ ipiInteger  + INTEGER +   as integer, the integer to check +
+ +
+ +
InRange method
+ +
+ + Purpose: + Checks if a given integer is within a specified range (inclusive) +
+ Description: + +
+ +
+
+ Return type:  LOGICAL +   logical, true if the integer is within the range, false otherwise +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ InRange(INPUT:integer,INPUT:integer,INPUT:integer):LOGICAL +
+ +
+ Parameters  +
+
+ ipiInteger  + INTEGER +   as integer, the integer to check +
+
+ ipiMin  + INTEGER +   as integer, the lower bound of the range +
+
+ ipiMax  + INTEGER +   as integer, the upper bound of the range +
+ +
+ +
IsEven method
+ +
+ + Purpose: + Checks if a given integer is even +
+ Description: + +
+ +
+
+ Return type:  LOGICAL +   logical, true if the integer is even, false otherwise +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ IsEven(INPUT:integer):LOGICAL +
+ +
+ Parameters  +
+
+ ipiInteger  + INTEGER +   as integer, the integer to check +
+ +
+ +
IsNegative method
+ +
+ + Purpose: + Checks if a given integer is negative +
+ Description: + +
+ +
+
+ Return type:  LOGICAL +   logical, true if the integer is negative, false otherwise +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ IsNegative(INPUT:integer):LOGICAL +
+ +
+ Parameters  +
+
+ ipiInteger  + INTEGER +   as integer, the integer to check +
+ +
+ +
IsNotNull method
+ +
+ + Purpose: + Checks if a given integer is not null +
+ Description: + +
+ +
+
+ Return type:  LOGICAL +   logical, true if the integer is not null, false otherwise +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ IsNotNull(INPUT:integer):LOGICAL +
+ +
+ Parameters  +
+
+ ipiInteger  + INTEGER +   as integer, the integer to check +
+ +
+ +
IsNotNullOrZero method
+ +
+ + Purpose: + Checks if a given integer is not null or zero +
+ Description: + +
+ +
+
+ Return type:  LOGICAL +   logical, true if the integer is not null or zero, false otherwise +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ IsNotNullOrZero(INPUT:integer):LOGICAL +
+ +
+ Parameters  +
+
+ ipiInteger  + INTEGER +   as integer, the integer to check +
+ +
+ +
IsNotZero method
+ +
+ + Purpose: + Checks if a given integer is not zero +
+ Description: + +
+ +
+
+ Return type:  LOGICAL +   logical, true if the integer is not zero, false otherwise +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ IsNotZero(INPUT:integer):LOGICAL +
+ +
+ Parameters  +
+
+ ipiInteger  + INTEGER +   as integer, the integer to check +
+ +
+ +
IsNull method
+ +
+ + Purpose: + Checks if a given integer is null +
+ Description: + +
+ +
+
+ Return type:  LOGICAL +   logical, true if the integer is null, false otherwise +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ IsNull(INPUT:integer):LOGICAL +
+ +
+ Parameters  +
+
+ ipiInteger  + INTEGER +   as integer, the integer to check +
+ +
+ +
IsNullOrZero method
+ +
+ + Purpose: + Checks if a given integer is either null or zero +
+ Description: + +
+ +
+
+ Return type:  LOGICAL +   logical, true if the integer is either null or zero, false otherwise +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ IsNullOrZero(INPUT:integer):LOGICAL +
+ +
+ Parameters  +
+
+ ipiInteger  + INTEGER +   as integer, the integer to check +
+ +
+ +
IsOdd method
+ +
+ + Purpose: + Checks if a given integer is odd +
+ Description: + +
+ +
+
+ Return type:  LOGICAL +   logical, true if the integer is odd, false otherwise +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ IsOdd(INPUT:integer):LOGICAL +
+ +
+ Parameters  +
+
+ ipiInteger  + INTEGER +   as integer, the integer to check +
+ +
+ +
IsPositive method
+ +
+ + Purpose: + Checks if a given integer is positive (greater than zero) +
+ Description: + +
+ +
+
+ Return type:  LOGICAL +   logical, true if the integer is positive, false otherwise +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ IsPositive(INPUT:integer):LOGICAL +
+ +
+ Parameters  +
+
+ ipiInteger  + INTEGER +   as integer, the integer to check +
+ +
+ +
IsZero method
+ +
+ + Purpose: + Checks if a given integer is zero +
+ Description: + +
+ +
+
+ Return type:  LOGICAL +   logical, true if the integer is zero, false otherwise +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ IsZero(INPUT:integer):LOGICAL +
+ +
+ Parameters  +
+
+ ipiInteger  + INTEGER +   as integer, the integer to check +
+ +
+ +
ToString method
+ +
+ + Purpose: + Converts a given integer to its string representation +
+ Description: + +
+ +
+
+ Return type:  CHARACTER +   character, the string representation of the integer +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ ToString(INPUT:integer):CHARACTER +
+ +
+ Parameters  +
+
+ ipiInteger  + INTEGER +   as integer, the integer to be converted +
+ + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Doc/Utils/ListUtil.cls.html b/Doc/Utils/ListUtil.cls.html new file mode 100644 index 0000000..b5efae0 --- /dev/null +++ b/Doc/Utils/ListUtil.cls.html @@ -0,0 +1,1901 @@ + + + + +ListUtil.cls + + + + + + + +
+ Utils: ListUtil CLASS +
+
+ +
+ ListUtil + + CLASS
+ + +
+ Purpose: + Main helper class to handle List operations +
+ Description: + +
+ Author(s): + Wayfare +
+ Notes: + +
+ Created: + Tue Oct 22 15:53:05 EEST 2024 +
+
+ + + + + +
Super Class
+
+ + Progress.Lang.Object + +
+ + + + + + + + +
+ Methods
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Method Detail
+
+ +
+ +
AddElement method
+ +
+ + Purpose: + Adds a new element at the end of the list +
+ Description: + Default separator is "," +
+ +
+
+ Return type:  CHARACTER +   character, the list with the added element +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ AddElement(INPUT:character,INPUT:character):CHARACTER +
+ +
+ Parameters  +
+
+ ipcList  + CHARACTER +   as character, the list to add the element to +
+
+ ipcElement  + CHARACTER +   as character, the element to add +
+ +
+ +
AddElement method
+ +
+ + Purpose: + Adds a new element at the end of the list +
+ Description: + +
+ +
+
+ Return type:  CHARACTER +   character, the list with the added element +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ AddElement(INPUT:character,INPUT:character,INPUT:character):CHARACTER +
+ +
+ Parameters  +
+
+ ipcList  + CHARACTER +   as character, the list to add the element to +
+
+ ipcElement  + CHARACTER +   as character, the element to add +
+
+ ipcSeparator  + CHARACTER +   as character, the list separator +
+ +
+ +
AddElement method
+ +
+ + Purpose: + Adds a new element at the end of the list +
+ Description: + +
+ +
+
+ Return type:  VOID +  
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ AddElement(INPUT:List,INPUT:string) +
+ +
+ Parameters  +
+
+ ipltList  + OpenEdge.Core.Collections.List +   as List, the list to add the element to +
+
+ ipsElement  + OpenEdge.Core.String +   as string, the element to add +
+ +
+ +
AddElementByPosition method
+ +
+ + Purpose: + Adds a new list element at the specified position +
+ Description: + +
+ +
+
+ Return type:  CHARACTER +   character, the list with the added element +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ AddElementByPosition(INPUT:character,INPUT:character,INPUT:character,INPUT:integer):CHARACTER +
+ +
+ Parameters  +
+
+ ipcList  + CHARACTER +   as character, the list to add the element to +
+
+ ipcElement  + CHARACTER +   as character, the element to add +
+
+ ipcSeparator  + CHARACTER +   as character, the list separator +
+
+ ipiPosition  + INTEGER +   as integer, the position to add the element to +
+ +
+ +
AddElementByPosition method
+ +
+ + Purpose: + Adds a new list element at the specified position +
+ Description: + Default separator is "," +
+ +
+
+ Return type:  CHARACTER +   character, the list with the added element +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ AddElementByPosition(INPUT:character,INPUT:character,INPUT:integer):CHARACTER +
+ +
+ Parameters  +
+
+ ipcList  + CHARACTER +   as character, the list to add the element to +
+
+ ipcElement  + CHARACTER +   as character, the element to add +
+
+ ipiPosition  + INTEGER +   as integer, the position to add the element to +
+ +
+ +
AddElementByPosition method
+ +
+ + Purpose: + Adds a new list element at the specified position +
+ Description: + +
+ +
+
+ Return type:  VOID +  
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ AddElementByPosition(INPUT:List,INPUT:string,INPUT:integer) +
+ +
+ Parameters  +
+
+ ipltList  + OpenEdge.Core.Collections.List +   as List, the list to add the element to +
+
+ ipsElement  + OpenEdge.Core.String +   as string, the element to add +
+
+ ipiPosition  + INTEGER +   as integer, the position to add the element to +
+ +
+ +
GetFirstElement method
+ +
+ + Purpose: + Returns the first element from the list +
+ Description: + Default separator is "," +
+ +
+
+ Return type:  CHARACTER +   character, the first element of the list +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ GetFirstElement(INPUT:character):CHARACTER +
+ +
+ Parameters  +
+
+ ipcList  + CHARACTER +   as character, the list +
+ +
+ +
GetFirstElement method
+ +
+ + Purpose: + Returns the first element from the list +
+ Description: + +
+ +
+
+ Return type:  CHARACTER +   character, the first element of the list +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ GetFirstElement(INPUT:character,INPUT:character):CHARACTER +
+ +
+ Parameters  +
+
+ ipcList  + CHARACTER +   as character, the list +
+
+ ipcSeparator  + CHARACTER +   as character, the list separator +
+ +
+ +
GetFirstElement method
+ +
+ + Purpose: + Returns the first element from the list +
+ Description: + +
+ +
+
+ Return type:  CHARACTER +   character, the first element of the list +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ GetFirstElement(INPUT:List):CHARACTER +
+ +
+ Parameters  +
+
+ ipltList  + OpenEdge.Core.Collections.List +   as List, the list +
+ +
+ +
GetLastElement method
+ +
+ + Purpose: + Returns the last element from the list +
+ Description: + Default separator is "," +
+ +
+
+ Return type:  CHARACTER +   character, the last element of the list +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ GetLastElement(INPUT:character):CHARACTER +
+ +
+ Parameters  +
+
+ ipcList  + CHARACTER +   as character, the list +
+ +
+ +
GetLastElement method
+ +
+ + Purpose: + Returns the last element from the list +
+ Description: + +
+ +
+
+ Return type:  CHARACTER +   character, the last element of the list +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ GetLastElement(INPUT:character,INPUT:character):CHARACTER +
+ +
+ Parameters  +
+
+ ipcList  + CHARACTER +   as character, the list +
+
+ ipcSeparator  + CHARACTER +   as character, the list separator +
+ +
+ +
GetLastElement method
+ +
+ + Purpose: + Returns the last element from the list +
+ Description: + +
+ +
+
+ Return type:  CHARACTER +   character, the last element of the list +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ GetLastElement(INPUT:List):CHARACTER +
+ +
+ Parameters  +
+
+ ipltList  + OpenEdge.Core.Collections.List +   as List, the list +
+ +
+ +
HasDuplicates method
+ +
+ + Purpose: + Checks if the list has any duplicate elements +
+ Description: + Default separator is "," +
+ +
+
+ Return type:  LOGICAL +   logical, whether the list has duplicates +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ HasDuplicates(INPUT:character):LOGICAL +
+ +
+ Parameters  +
+
+ ipcList  + CHARACTER +   as character, the list to check +
+ +
+ +
HasDuplicates method
+ +
+ + Purpose: + Checks if the list has any duplicate elements +
+ Description: + +
+ +
+
+ Return type:  LOGICAL +   logical, whether the list has duplicates +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ HasDuplicates(INPUT:character,INPUT:character):LOGICAL +
+ +
+ Parameters  +
+
+ ipcList  + CHARACTER +   as character, the list to check +
+
+ ipcSeparator  + CHARACTER +   as character, the list separator +
+ +
+ +
HasDuplicates method
+ +
+ + Purpose: + Checks if the list has any duplicate elements +
+ Description: + +
+ +
+
+ Return type:  LOGICAL +   logical, whether the list has duplicates +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ HasDuplicates(INPUT:List):LOGICAL +
+ +
+ Parameters  +
+
+ ipltList  + OpenEdge.Core.Collections.List +   as List, the list to check +
+ +
+ +
HasElement method
+ +
+ + Purpose: + Checks if the list contains a specific element +
+ Description: + +
+ +
+
+ Return type:  LOGICAL +   logical, whether the list contains the element +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ HasElement(INPUT:character,INPUT:character):LOGICAL +
+ +
+ Parameters  +
+
+ ipcList  + CHARACTER +   as character, the list to search in +
+
+ ipcElement  + CHARACTER +   as character, the element to search for +
+ +
+ +
HasElement method
+ +
+ + Purpose: + Checks if the list contains a specific element +
+ Description: + +
+ +
+
+ Return type:  LOGICAL +   logical, whether the list contains the element +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ HasElement(INPUT:List,INPUT:string):LOGICAL +
+ +
+ Parameters  +
+
+ ipltList  + OpenEdge.Core.Collections.List +   as List, the list to search in +
+
+ ipsElement  + OpenEdge.Core.String +   as string, the element to search for +
+ +
+ +
HasEmptyElements method
+ +
+ + Purpose: + Checks if the list has any empty elements. +
+ Description: + Default separator is "," +
+ +
+
+ Return type:  LOGICAL +   logical, whether the list has empty elements +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ HasEmptyElements(INPUT:character):LOGICAL +
+ +
+ Parameters  +
+
+ ipcList  + CHARACTER +   as character, the list to check +
+ +
+ +
HasEmptyElements method
+ +
+ + Purpose: + Checks if the list has any empty elements +
+ Description: + +
+ +
+
+ Return type:  LOGICAL +   logical, whether the list has empty elements +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ HasEmptyElements(INPUT:character,INPUT:character):LOGICAL +
+ +
+ Parameters  +
+
+ ipcList  + CHARACTER +   as character, the list to check +
+
+ ipcSeparator  + CHARACTER +   as character, the list separator +
+ +
+ +
HasEmptyElements method
+ +
+ + Purpose: + Checks if the list has any empty elements +
+ Description: + +
+ +
+
+ Return type:  LOGICAL +   logical, whether the list has empty elements +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ HasEmptyElements(INPUT:List):LOGICAL +
+ +
+ Parameters  +
+
+ ipltList  + OpenEdge.Core.Collections.List +   as List, the list to check +
+ +
+ +
RemoveElement method
+ +
+ + Purpose: + Removes an element from the list +
+ Description: + Default separator is "," +
+ +
+
+ Return type:  CHARACTER +   character, the list with the element removed +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ RemoveElement(INPUT:character,INPUT:character):CHARACTER +
+ +
+ Parameters  +
+
+ ipcList  + CHARACTER +   as character, the list to remove the element from +
+
+ ipcElement  + CHARACTER +   as character, the element to remove +
+ +
+ +
RemoveElement method
+ +
+ + Purpose: + Removes an element from the list +
+ Description: + +
+ +
+
+ Return type:  CHARACTER +   character, the list with the element removed +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ RemoveElement(INPUT:character,INPUT:character,INPUT:character):CHARACTER +
+ +
+ Parameters  +
+
+ ipcList  + CHARACTER +   as character, the list to remove the element from +
+
+ ipcElement  + CHARACTER +   as character, the element to remove +
+
+ ipcSeparator  + CHARACTER +   as character, the list separator +
+ +
+ +
RemoveElement method
+ +
+ + Purpose: + Removes an element from the list +
+ Description: + +
+ +
+
+ Return type:  VOID +  
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ RemoveElement(INPUT:List,INPUT:string) +
+ +
+ Parameters  +
+
+ ipltList  + OpenEdge.Core.Collections.List +   as List, the list to remove the element from +
+
+ ipsElement  + OpenEdge.Core.String +   as string, the element to remove +
+ +
+ +
RemoveElementByPosition method
+ +
+ + Purpose: + Removes an element at the specified position +
+ Description: + Default separator is "," +
+ +
+
+ Return type:  CHARACTER +   character, the list with the element removed +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ RemoveElementByPosition(INPUT:character,INPUT:integer):CHARACTER +
+ +
+ Parameters  +
+
+ ipcList  + CHARACTER +   as character, the list to remove the element from +
+
+ ipiPosition  + INTEGER +   as integer, the position of the element to remove +
+ +
+ +
RemoveElementByPosition method
+ +
+ + Purpose: + Removes an element at the specified position +
+ Description: + +
+ +
+
+ Return type:  CHARACTER +   character, the list with the element removed +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ RemoveElementByPosition(INPUT:character,INPUT:integer,INPUT:character):CHARACTER +
+ +
+ Parameters  +
+
+ ipcList  + CHARACTER +   as character, the list to remove the element from +
+
+ ipiPosition  + INTEGER +   as integer, the position of the element to remove +
+
+ ipcSeparator  + CHARACTER +   as character, the list separator +
+ +
+ +
RemoveElementByPosition method
+ +
+ + Purpose: + Removes an element at the specified position +
+ Description: + +
+ +
+
+ Return type:  VOID +  
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ RemoveElementByPosition(INPUT:List,INPUT:integer) +
+ +
+ Parameters  +
+
+ ipltList  + OpenEdge.Core.Collections.List +   as List, the list to remove the element from +
+
+ ipiPosition  + INTEGER +   as integer, the position of the element to remove +
+ +
+ +
RemoveEmptyElements method
+ +
+ + Purpose: + Removes all empty elements from the list +
+ Description: + Default separator is "," +
+ +
+
+ Return type:  CHARACTER +   character, the list with no empty elements +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ RemoveEmptyElements(INPUT:character):CHARACTER +
+ +
+ Parameters  +
+
+ ipcList  + CHARACTER +   as character, the list to clean +
+ +
+ +
RemoveEmptyElements method
+ +
+ + Purpose: + Removes all empty elements from the list +
+ Description: + +
+ +
+
+ Return type:  CHARACTER +   character, the list with no empty elements +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ RemoveEmptyElements(INPUT:character,INPUT:character):CHARACTER +
+ +
+ Parameters  +
+
+ ipcList  + CHARACTER +   as character, the list to clean +
+
+ ipcSeparator  + CHARACTER +   as character, the list separator +
+ +
+ +
RemoveEmptyElements method
+ +
+ + Purpose: + Removes all empty elements from the list +
+ Description: + +
+ +
+
+ Return type:  VOID +  
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ RemoveEmptyElements(INPUT:List) +
+ +
+ Parameters  +
+
+ ipltList  + OpenEdge.Core.Collections.List +   as List, the list to clean +
+ +
+ +
SortList method
+ +
+ + Purpose: + Sorts the elements in the list using the default comparer +
+ Description: + Default separator is "," +
+ +
+
+ Return type:  CHARACTER +   character, the sorted list +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ SortList(INPUT:character):CHARACTER +
+ +
+ Parameters  +
+
+ ipcList  + CHARACTER +   as character, the list to sort +
+ +
+ +
SortList method
+ +
+ + Purpose: + Sorts the elements in the list using the default comparer +
+ Description: + +
+ +
+
+ Return type:  CHARACTER +   character, the sorted list +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ SortList(INPUT:character,INPUT:character):CHARACTER +
+ +
+ Parameters  +
+
+ ipcList  + CHARACTER +   as character, the list to sort +
+
+ ipcSeparator  + CHARACTER +   as character, the list separator +
+ +
+ +
SortList method
+ +
+ + Purpose: + Sorts the elements in the list using the default comparer +
+ Description: + +
+ +
+
+ Return type:  VOID +  
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ SortList(INPUT:List) +
+ +
+ Parameters  +
+
+ ipltList  + OpenEdge.Core.Collections.List +   as List, the list to sort +
+ + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Doc/Utils/LogicalUtil.cls.html b/Doc/Utils/LogicalUtil.cls.html new file mode 100644 index 0000000..152eb24 --- /dev/null +++ b/Doc/Utils/LogicalUtil.cls.html @@ -0,0 +1,615 @@ + + + + +LogicalUtil.cls + + + + + + + +
+ Utils: LogicalUtil CLASS +
+
+ +
+ LogicalUtil + + CLASS
+ + +
+ Purpose: + Main helper class to handle logical operations +
+ Description: + +
+ Author(s): + Wayfare +
+ Notes: + +
+ Created: + Tue Nov 26 10:35:54 EET 2024 +
+
+ + + + + +
Super Class
+
+ + Progress.Lang.Object + +
+ + + + + + + + +
+ Methods
+
+ + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Method Detail
+
+ +
+ +
IsFalse method
+ +
+ + Purpose: + Checks if a logical value is explicitly FALSE +
+ Description: + +
+ +
+
+ Return type:  LOGICAL +   logical, TRUE if the value is FALSE, otherwise FALSE +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ IsFalse(INPUT:logical):LOGICAL +
+ +
+ Parameters  +
+
+ iplValue  + LOGICAL +   as logical, the logical value to check +
+ +
+ +
IsNotNull method
+ +
+ + Purpose: + Checks if a logical value is not null (?) +
+ Description: + +
+ +
+
+ Return type:  LOGICAL +   logical, TRUE if not null, FALSE otherwise +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ IsNotNull(INPUT:logical):LOGICAL +
+ +
+ Parameters  +
+
+ iplValue  + LOGICAL +   as logical, the logical value to check +
+ +
+ +
IsNull method
+ +
+ + Purpose: + Checks if a logical value is null (?) +
+ Description: + +
+ +
+
+ Return type:  LOGICAL +   logical, TRUE if null, FALSE otherwise +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ IsNull(INPUT:logical):LOGICAL +
+ +
+ Parameters  +
+
+ iplValue  + LOGICAL +   as logical, the logical value to check +
+ +
+ +
IsTrue method
+ +
+ + Purpose: + Checks if a logical value is explicitly TRUE +
+ Description: + +
+ +
+
+ Return type:  LOGICAL +   logical, TRUE if the value is TRUE, otherwise FALSE +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ IsTrue(INPUT:logical):LOGICAL +
+ +
+ Parameters  +
+
+ iplValue  + LOGICAL +   as logical, the logical value to check +
+ +
+ +
LogicalAnd method
+ +
+ + Purpose: + Performs a logical AND operation between two logical values +
+ Description: + +
+ +
+
+ Return type:  LOGICAL +   logical, the result of the AND operation +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ LogicalAnd(INPUT:logical,INPUT:logical):LOGICAL +
+ +
+ Parameters  +
+
+ iplValue1  + LOGICAL +   as logical, the first logical value +
+
+ iplValue2  + LOGICAL +   as logical, the second logical value +
+ +
+ +
LogicalNot method
+ +
+ + Purpose: + Performs a logical NOT operation on a logical value +
+ Description: + +
+ +
+
+ Return type:  LOGICAL +   logical, the result of the NOT operation +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ LogicalNot(INPUT:logical):LOGICAL +
+ +
+ Parameters  +
+
+ iplValue  + LOGICAL +   as logical, the logical value to negate +
+ +
+ +
LogicalOr method
+ +
+ + Purpose: + Performs a logical OR operation between two logical values +
+ Description: + +
+ +
+
+ Return type:  LOGICAL +   logical, the result of the OR operation +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ LogicalOr(INPUT:logical,INPUT:logical):LOGICAL +
+ +
+ Parameters  +
+
+ iplValue1  + LOGICAL +   as logical, the first logical value +
+
+ iplValue2  + LOGICAL +   as logical, the second logical value +
+ +
+ +
LogicalXor method
+ +
+ + Purpose: + Performs a logical XOR (exclusive OR) operation between two logical values +
+ Description: + +
+ +
+
+ Return type:  LOGICAL +   logical, TRUE if exactly one of the inputs is TRUE, otherwise FALSE +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ LogicalXor(INPUT:logical,INPUT:logical):LOGICAL +
+ +
+ Parameters  +
+
+ iplValue1  + LOGICAL +   as logical, the first logical value +
+
+ iplValue2  + LOGICAL +   as logical, the second logical value +
+ +
+ +
ToString method
+ +
+ + Purpose: + Converts a logical value to its string representation +
+ Description: + +
+ +
+
+ Return type:  CHARACTER +   character, "TRUE", "FALSE", or "NULL" based on the input value +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ ToString(INPUT:logical):CHARACTER +
+ +
+ Parameters  +
+
+ iplValue  + LOGICAL +   as logical, the logical value to convert +
+ + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Doc/Utils/LongcharUtil.cls.html b/Doc/Utils/LongcharUtil.cls.html new file mode 100644 index 0000000..c20d0cc --- /dev/null +++ b/Doc/Utils/LongcharUtil.cls.html @@ -0,0 +1,1088 @@ + + + + +LongcharUtil.cls + + + + + + + +
+ Utils: LongcharUtil CLASS +
+
+ +
+ LongcharUtil + + CLASS
+ + +
+ Purpose: + Main helper class to handle longchar operations +
+ Description: + +
+ Author(s): + Wayfare +
+ Notes: + +
+ Created: + Fri Nov 22 12:41:52 EET 2024 +
+
+ + + + + +
Super Class
+
+ + Progress.Lang.Object + +
+ + + + + + + + +
+ Methods
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Method Detail
+
+ +
+ +
ContainsNumber method
+ +
+ + Purpose: + Check if a string contains a number +
+ Description: + +
+ +
+
+ Return type:  LOGICAL +   logical, TRUE if contains a number, FALSE otherwise +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ ContainsNumber(INPUT:longchar):LOGICAL +
+ +
+ Parameters  +
+
+ iplcString  + LONGCHAR +   as longchar, the string to check +
+ +
+ +
GetTokenValueFromString method
+ +
+ + Purpose: + Get the value of a token from a tokenized string +
+ Description: + +
+ +
+
+ Return type:  LONGCHAR +   longchar, the value of the token +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ GetTokenValueFromString(INPUT:longchar,INPUT:integer):LONGCHAR +
+ +
+ Parameters  +
+
+ iplcString  + LONGCHAR +   as longchar, the tokenized string +
+
+ ipiPosition  + INTEGER +   as integer, the position of the token +
+ +
+ +
IsEmpty method
+ +
+ + Purpose: + Check if a string is empty +
+ Description: + +
+ +
+
+ Return type:  LOGICAL +   logical, TRUE if empty, FALSE otherwise +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ IsEmpty(INPUT:longchar):LOGICAL +
+ +
+ Parameters  +
+
+ iplcString  + LONGCHAR +   as longchar, the string to check +
+ +
+ +
IsLowercase method
+ +
+ + Purpose: + Check if a string is lowercase +
+ Description: + +
+ +
+
+ Return type:  LOGICAL +   logical, TRUE if lowercase, FALSE otherwise +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ IsLowercase(INPUT:longchar):LOGICAL +
+ +
+ Parameters  +
+
+ iplcString  + LONGCHAR +   as longchar, the string to check +
+ +
+ +
IsNotEmpty method
+ +
+ + Purpose: + Check if a string is not empty +
+ Description: + +
+ +
+
+ Return type:  LOGICAL +   logical, TRUE if not empty, FALSE otherwise +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ IsNotEmpty(INPUT:longchar):LOGICAL +
+ +
+ Parameters  +
+
+ iplcString  + LONGCHAR +   as longchar, the string to check +
+ +
+ +
IsNotNull method
+ +
+ + Purpose: + Check if a string is not null +
+ Description: + +
+ +
+
+ Return type:  LOGICAL +   logical, TRUE if not null, FALSE otherwise +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ IsNotNull(INPUT:longchar):LOGICAL +
+ +
+ Parameters  +
+
+ iplcString  + LONGCHAR +   as longchar, the string to check +
+ +
+ +
IsNotNullOrEmpty method
+ +
+ + Purpose: + Check if a string is not null or empty +
+ Description: + +
+ +
+
+ Return type:  LOGICAL +   logical, TRUE if not null or empty, FALSE otherwise +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ IsNotNullOrEmpty(INPUT:longchar):LOGICAL +
+ +
+ Parameters  +
+
+ iplcString  + LONGCHAR +   as longchar, the string to check +
+ +
+ +
IsNull method
+ +
+ + Purpose: + Check if a string is null +
+ Description: + +
+ +
+
+ Return type:  LOGICAL +   logical, TRUE if null, FALSE otherwise +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ IsNull(INPUT:longchar):LOGICAL +
+ +
+ Parameters  +
+
+ iplcString  + LONGCHAR +   as longchar, the string to check +
+ +
+ +
IsNullOrEmpty method
+ +
+ + Purpose: + Check if a string is null or empty +
+ Description: + +
+ +
+
+ Return type:  LOGICAL +   logical, TRUE if null or empty, FALSE otherwise +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ IsNullOrEmpty(INPUT:longchar):LOGICAL +
+ +
+ Parameters  +
+
+ iplcString  + LONGCHAR +   as longchar, the string to check +
+ +
+ +
IsUppercase method
+ +
+ + Purpose: + Check if a string is uppercase +
+ Description: + +
+ +
+
+ Return type:  LOGICAL +   logical, TRUE if uppercase, FALSE otherwise +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ IsUppercase(INPUT:longchar):LOGICAL +
+ +
+ Parameters  +
+
+ iplcString  + LONGCHAR +   as longchar, the string to check +
+ +
+ +
Quote method
+ +
+ + Purpose: + Add quotes to a string +
+ Description: + +
+ +
+
+ Return type:  LONGCHAR +   longchar, the string with quotes added +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ Quote(INPUT:longchar):LONGCHAR +
+ +
+ Parameters  +
+
+ iplcString  + LONGCHAR +   as longchar, the string to modify +
+ +
+ +
RemoveTokenFromString method
+ +
+ + Purpose: + Remove a token from a tokenized string +
+ Description: + +
+ +
+
+ Return type:  LONGCHAR +   longchar, the tokenized string without the removed token +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ RemoveTokenFromString(INPUT:longchar,INPUT:integer):LONGCHAR +
+ +
+ Parameters  +
+
+ iplcString  + LONGCHAR +   as longchar, the tokenized string +
+
+ ipiPosition  + INTEGER +   as integer, the position of the token to remove +
+ +
+ +
SetTokenValueInString method
+ +
+ + Purpose: + Set the value of a token in a tokenized string +
+ Description: + +
+ +
+
+ Return type:  LONGCHAR +   longchar, the updated tokenized string +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ SetTokenValueInString(INPUT:longchar,INPUT:longchar,INPUT:integer):LONGCHAR +
+ +
+ Parameters  +
+
+ iplcString  + LONGCHAR +   as longchar, the tokenized string +
+
+ iplcTokenValue  + LONGCHAR +   as longchar, the token value to set +
+
+ ipiPosition  + INTEGER +   as integer, the position of the token +
+ +
+ +
StartWithCapital method
+ +
+ + Purpose: + Capitalize the first letter of a string +
+ Description: + +
+ +
+
+ Return type:  LONGCHAR +   longchar, the string with the first letter capitalized +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ StartWithCapital(INPUT:longchar):LONGCHAR +
+ +
+ Parameters  +
+
+ iplcString  + LONGCHAR +   as longchar, the string to modify +
+ +
+ +
StartWithLowercase method
+ +
+ + Purpose: + Lowercase the first letter of a string +
+ Description: + +
+ +
+
+ Return type:  LONGCHAR +   longchar, the string with the first letter lowercased +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ StartWithLowercase(INPUT:longchar):LONGCHAR +
+ +
+ Parameters  +
+
+ iplcString  + LONGCHAR +   as longchar, the string to modify +
+ +
+ +
StringToCamelCase method
+ +
+ + Purpose: + Format a string to camelCase +
+ Description: + +
+ +
+
+ Return type:  LONGCHAR +   longchar, the string in camelCase format +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ StringToCamelCase(INPUT:longchar,INPUT:character):LONGCHAR +
+ +
+ Parameters  +
+
+ iplcString  + LONGCHAR +   as longchar, the string to modify +
+
+ ipcSeparator  + CHARACTER +   as character, the string separator +
+ +
+ +
StringToPascalCase method
+ +
+ + Purpose: + Format a string to PascalCase +
+ Description: + +
+ +
+
+ Return type:  LONGCHAR +   longchar, the string in PascalCase format +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ StringToPascalCase(INPUT:longchar,INPUT:character):LONGCHAR +
+ +
+ Parameters  +
+
+ iplcString  + LONGCHAR +   as longchar, the string to modify +
+
+ ipcSeparator  + CHARACTER +   as character, the string separator +
+ +
+ +
UnQuote method
+ +
+ + Purpose: + Remove quotes from a string +
+ Description: + +
+ +
+
+ Return type:  LONGCHAR +   longchar, the string without quotes +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ UnQuote(INPUT:longchar):LONGCHAR +
+ +
+ Parameters  +
+
+ iplcString  + LONGCHAR +   as longchar, the string to modify +
+ + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Doc/Utils/MathUtil.cls.html b/Doc/Utils/MathUtil.cls.html new file mode 100644 index 0000000..ae08443 --- /dev/null +++ b/Doc/Utils/MathUtil.cls.html @@ -0,0 +1,1018 @@ + + + + +MathUtil.cls + + + + + + + +
+ Utils: MathUtil CLASS +
+
+ +
+ MathUtil + + CLASS
+ + +
+ Purpose: + Main helper class to handle math operations +
+ Description: + +
+ Author(s): + Wayfare +
+ Notes: + +
+ Created: + Fri Oct 25 10:38:16 EEST 2024 +
+
+ + + + + +
Super Class
+
+ + Progress.Lang.Object + +
+ + + + + + + + +
+ Methods
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Method Detail
+
+ +
+ +
CalculateAge method
+ +
+ + Purpose: + Calculate the age in years based on a birthdate +
+ Description: + +
+ +
+
+ Return type:  INTEGER +   integer, the calculated age in years +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ CalculateAge(INPUT:date):INTEGER +
+ +
+ Parameters  +
+
+ ipdBirthDate  + DATE +   as date, the date of birth +
+ +
+ +
CalculateAgeAtDate method
+ +
+ + Purpose: + Calculate age in years at a specific date +
+ Description: + +
+ +
+
+ Return type:  INTEGER +   integer, the calculated age at the specified date +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ CalculateAgeAtDate(INPUT:date,INPUT:date):INTEGER +
+ +
+ Parameters  +
+
+ ipdBirthDate  + DATE +   as date, the date of birth +
+
+ dAtDate  + DATE +   as date, the reference date to calculate the age at +
+ +
+ +
CalculateCos method
+ +
+ + Purpose: + Calculate the cosine using libm.so.6:cos +
+ Description: + +
+ +
+
+ Return type:  System.Decimal +   decimal, the cosine of the angle +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ CalculateCos(INPUT:decimal):DECIMAL +
+ +
+ Parameters  +
+
+ ipdeAngle  + System.Decimal +   as decimal, the angle in radians +
+ +
+ +
CalculateDetailedAge method
+ +
+ + Purpose: + Calculate the age in years, months, and days based on a birthdate +
+ Description: + +
+ +
+
+ Return type:  CHARACTER +   character, a string with the detailed age in "X years, Y months, Z days" format +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ CalculateDetailedAge(INPUT:date):CHARACTER +
+ +
+ Parameters  +
+
+ ipdBirthDate  + DATE +   as date, the date of birth +
+ +
+ +
CalculateSin method
+ +
+ + Purpose: + Calculate the sine using libm.so.6:sin +
+ Description: + +
+ +
+
+ Return type:  System.Decimal +   decimal, the sine of the angle +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ CalculateSin(INPUT:decimal):DECIMAL +
+ +
+ Parameters  +
+
+ ipdeAngle  + System.Decimal +   as decimal, the angle in radians +
+ +
+ +
CalculateTan method
+ +
+ + Purpose: + Calculate the tangent using libm.so.6:tan +
+ Description: + +
+ +
+
+ Return type:  System.Decimal +   decimal, the tangent of the angle +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ CalculateTan(INPUT:decimal):DECIMAL +
+ +
+ Parameters  +
+
+ ipdeAngle  + System.Decimal +   as decimal, the angle in radians +
+ +
+ +
CosDegrees method
+ +
+ + Purpose: + Calculate the cosine of an angle in degrees +
+ Description: + Uses the 'Cos' method of System.Math +
+ +
+
+ Return type:  System.Decimal +   decimal, the cosine of the angle +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ CosDegrees(INPUT:decimal):DECIMAL +
+ +
+ Parameters  +
+
+ ipdeDegrees  + System.Decimal +   as decimal, the angle in degrees +
+ +
+ +
CosRadians method
+ +
+ + Purpose: + Calculate the cosine of an angle in radians +
+ Description: + Uses the 'Cos' method of System.Math +
+ +
+
+ Return type:  System.Decimal +   decimal, the cosine of the angle +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ CosRadians(INPUT:decimal):DECIMAL +
+ +
+ Parameters  +
+
+ ipdeRadians  + System.Decimal +   as decimal, the angle in radians +
+ +
+ +
RoundDown method
+ +
+ + Purpose: + Rounds a decimal value down to the nearest whole number (floor) +
+ Description: + Uses truncate to achieve floor behavior for positive numbers, and adjusts for negative values +
+ +
+
+ Return type:  System.Decimal +   decimal, the rounded-down value +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ RoundDown(INPUT:decimal):DECIMAL +
+ +
+ Parameters  +
+
+ ipdeValue  + System.Decimal +   as decimal, the value to round down +
+ +
+ +
RoundToDecimalPlaces method
+ +
+ + Purpose: + Rounds a decimal value to a specified number of decimal places +
+ Description: + +
+ +
+
+ Return type:  System.Decimal +   decimal, the rounded value +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ RoundToDecimalPlaces(INPUT:decimal,INPUT:integer):DECIMAL +
+ +
+ Parameters  +
+
+ ipdeValue  + System.Decimal +   as decimal, the value to round +
+
+ ipiDecimals  + INTEGER +   as integer, the number of decimal places +
+ +
+ +
RoundToWhole method
+ +
+ + Purpose: + Rounds a decimal value to the nearest whole number +
+ Description: + +
+ +
+
+ Return type:  System.Decimal +   decimal, the rounded value +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ RoundToWhole(INPUT:decimal):DECIMAL +
+ +
+ Parameters  +
+
+ ipdeValue  + System.Decimal +   as decimal, the value to round +
+ +
+ +
RoundUp method
+ +
+ + Purpose: + Rounds a decimal value up to the nearest whole number (ceiling) +
+ Description: + Uses truncate and checks for fractional values to round up +
+ +
+
+ Return type:  System.Decimal +   decimal, the rounded-up value +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ RoundUp(INPUT:decimal):DECIMAL +
+ +
+ Parameters  +
+
+ ipdeValue  + System.Decimal +   as decimal, the value to round up +
+ +
+ +
SinDegrees method
+ +
+ + Purpose: + Calculate the sine of an angle in degrees +
+ Description: + Uses the 'Sin' method of System.Math +
+ +
+
+ Return type:  System.Decimal +   decimal, the sine of the angle +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ SinDegrees(INPUT:decimal):DECIMAL +
+ +
+ Parameters  +
+
+ ipdeDegrees  + System.Decimal +   as decimal, the angle in degrees +
+ +
+ +
SinRadians method
+ +
+ + Purpose: + Calculate the sine of an angle in radians +
+ Description: + Uses the 'Sin' method of System.Math +
+ +
+
+ Return type:  System.Decimal +   decimal, the sine of the angle +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ SinRadians(INPUT:decimal):DECIMAL +
+ +
+ Parameters  +
+
+ ipdeRadians  + System.Decimal +   as decimal, the angle in radians +
+ +
+ +
TanDegrees method
+ +
+ + Purpose: + Calculate the tangent of an angle in degrees +
+ Description: + Uses the 'Tan' method of System.Math +
+ +
+
+ Return type:  System.Decimal +   decimal, the tangent of the angle +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ TanDegrees(INPUT:decimal):DECIMAL +
+ +
+ Parameters  +
+
+ ipdeDegrees  + System.Decimal +   as decimal, the angle in degrees +
+ +
+ +
TanRadians method
+ +
+ + Purpose: + Calculate the tangent of an angle in radians +
+ Description: + Uses the 'Tan' method of System.Math +
+ +
+
+ Return type:  System.Decimal +   decimal, the tangent of the angle +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ TanRadians(INPUT:decimal):DECIMAL +
+ +
+ Parameters  +
+
+ ipdeRadians  + System.Decimal +   as decimal, the angle in radians +
+ +
+ +
TimeUntilBirthday method
+ +
+ + Purpose: + Calculate the number of days until the next birthday from today +
+ Description: + +
+ +
+
+ Return type:  INTEGER +   integer, the number of days until the next birthday +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ TimeUntilBirthday(INPUT:date):INTEGER +
+ +
+ Parameters  +
+
+ ipdBirthDate  + DATE +   as date, the date of birth +
+ + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Doc/Utils/MeasurementUnitUtil.cls.html b/Doc/Utils/MeasurementUnitUtil.cls.html new file mode 100644 index 0000000..7d3e6a4 --- /dev/null +++ b/Doc/Utils/MeasurementUnitUtil.cls.html @@ -0,0 +1,1262 @@ + + + + +MeasurementUnitUtil.cls + + + + + + + +
+ Utils: MeasurementUnitUtil CLASS +
+
+ +
+ MeasurementUnitUtil + + CLASS
+ + +
+ Purpose: + Main helper class to handle units of measurement operations +
+ Description: + +
+ Author(s): + Wayfare +
+ Notes: + +
+ Created: + Thu Oct 24 12:10:57 EEST 2024 +
+
+ + + + + +
Super Class
+
+ + Progress.Lang.Object + +
+ + + + + + + + +
+ Methods
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Method Detail
+
+ +
+ +
CelsiusToFahrenheit method
+ +
+ + Purpose: + Convert Celsius to Fahrenheit +
+ Description: + Formula: (Celsius * 9/5) + 32 +
+ +
+
+ Return type:  DECIMAL +   decimal, the temperature in Fahrenheit +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ CelsiusToFahrenheit(INPUT:decimal):DECIMAL +
+ +
+ Parameters  +
+
+ ipdeCelsius  + DECIMAL +   as decimal, the temperature in Celsius +
+ +
+ +
CentimetersToInches method
+ +
+ + Purpose: + Convert Centimeters to Inches +
+ Description: + 1 cm = 0.393701 inches +
+ +
+
+ Return type:  DECIMAL +   decimal, the value in inches +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ CentimetersToInches(INPUT:decimal):DECIMAL +
+ +
+ Parameters  +
+
+ ipdeCentimeters  + DECIMAL +   as decimal, the value in centimeters +
+ +
+ +
FahrenheitToCelsius method
+ +
+ + Purpose: + Convert Fahrenheit to Celsius +
+ Description: + Formula: (Fahrenheit - 32) * 5/9 +
+ +
+
+ Return type:  DECIMAL +   decimal, the temperature in Celsius +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ FahrenheitToCelsius(INPUT:decimal):DECIMAL +
+ +
+ Parameters  +
+
+ ipdeFahrenheit  + DECIMAL +   as decimal, the temperature in Fahrenheit +
+ +
+ +
FeetToMeters method
+ +
+ + Purpose: + Convert Feet to Meters +
+ Description: + 1 foot = 0.3048 meters +
+ +
+
+ Return type:  DECIMAL +   decimal, the value in meters +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ FeetToMeters(INPUT:decimal):DECIMAL +
+ +
+ Parameters  +
+
+ ipdeFeet  + DECIMAL +   as decimal, the value in feet +
+ +
+ +
GramsToOunces method
+ +
+ + Purpose: + Convert Grams to Ounces +
+ Description: + 1 gram = 0.035274 ounces +
+ +
+
+ Return type:  DECIMAL +   decimal, the value in ounces +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ GramsToOunces(INPUT:decimal):DECIMAL +
+ +
+ Parameters  +
+
+ ipdeGrams  + DECIMAL +   as decimal, the value in grams +
+ +
+ +
InchesToCentimeters method
+ +
+ + Purpose: + Convert Inches to Centimeters +
+ Description: + 1 inch = 2.54 cm +
+ +
+
+ Return type:  DECIMAL +   decimal, the value in centimeters +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ InchesToCentimeters(INPUT:decimal):DECIMAL +
+ +
+ Parameters  +
+
+ ipdeInches  + DECIMAL +   as decimal, the value in inches +
+ +
+ +
KilogramsToPounds method
+ +
+ + Purpose: + Convert Kilograms to Pounds +
+ Description: + 1 kilogram = 2.20462 pounds +
+ +
+
+ Return type:  DECIMAL +   decimal, the value in pounds +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ KilogramsToPounds(INPUT:decimal):DECIMAL +
+ +
+ Parameters  +
+
+ ipdeKilograms  + DECIMAL +   as decimal, the value in kilograms +
+ +
+ +
KilogramsToStones method
+ +
+ + Purpose: + Convert Kilograms to Stones +
+ Description: + 1 kilogram = 0.157473 stones +
+ +
+
+ Return type:  DECIMAL +   decimal, the value in stones +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ KilogramsToStones(INPUT:decimal):DECIMAL +
+ +
+ Parameters  +
+
+ ipdeKilograms  + DECIMAL +   as decimal, the value in kilograms +
+ +
+ +
KilometersToMiles method
+ +
+ + Purpose: + Convert Kilometers to Miles +
+ Description: + 1 kilometer = 0.621371 miles +
+ +
+
+ Return type:  DECIMAL +   decimal, the value in miles +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ KilometersToMiles(INPUT:decimal):DECIMAL +
+ +
+ Parameters  +
+
+ ipdeKilometers  + DECIMAL +   as decimal, the value in kilometers +
+ +
+ +
LitersToPints method
+ +
+ + Purpose: + Convert Liters to Pints +
+ Description: + 1 liter = 2.11338 pints +
+ +
+
+ Return type:  DECIMAL +   decimal, the value in pints +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ LitersToPints(INPUT:decimal):DECIMAL +
+ +
+ Parameters  +
+
+ ipdeLiters  + DECIMAL +   as decimal, the value in liters +
+ +
+ +
LitersToQuarts method
+ +
+ + Purpose: + Convert Liters to Quarts +
+ Description: + 1 liter = 1.05669 quarts +
+ +
+
+ Return type:  DECIMAL +   decimal, the value in quarts +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ LitersToQuarts(INPUT:decimal):DECIMAL +
+ +
+ Parameters  +
+
+ ipdeLiters  + DECIMAL +   as decimal, the value in liters +
+ +
+ +
LitersToUSGallons method
+ +
+ + Purpose: + Convert Liters to US Gallons +
+ Description: + 1 liter = 0.264172 US gallons +
+ +
+
+ Return type:  DECIMAL +   decimal, the value in US gallons +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ LitersToUSGallons(INPUT:decimal):DECIMAL +
+ +
+ Parameters  +
+
+ ipdeLiters  + DECIMAL +   as decimal, the value in liters +
+ +
+ +
MetersToFeet method
+ +
+ + Purpose: + Convert Meters to Feet +
+ Description: + 1 meter = 3.28084 feet +
+ +
+
+ Return type:  DECIMAL +   decimal, the value in feet +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ MetersToFeet(INPUT:decimal):DECIMAL +
+ +
+ Parameters  +
+
+ ipdeMeters  + DECIMAL +   as decimal, the value in meters +
+ +
+ +
MetersToYards method
+ +
+ + Purpose: + Convert Meters to Yards +
+ Description: + 1 meter = 1.09361 yards +
+ +
+
+ Return type:  DECIMAL +   decimal, the value in yards +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ MetersToYards(INPUT:decimal):DECIMAL +
+ +
+ Parameters  +
+
+ ipdeMeters  + DECIMAL +   as decimal, the value in meters +
+ +
+ +
MilesToKilometers method
+ +
+ + Purpose: + Convert Miles to Kilometers +
+ Description: + 1 mile = 1.60934 kilometers +
+ +
+
+ Return type:  DECIMAL +   decimal, the value in kilometers +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ MilesToKilometers(INPUT:decimal):DECIMAL +
+ +
+ Parameters  +
+
+ ipdeMiles  + DECIMAL +   as decimal, the value in miles +
+ +
+ +
OuncesToGrams method
+ +
+ + Purpose: + Convert Ounces to Grams +
+ Description: + 1 ounce = 28.3495 grams +
+ +
+
+ Return type:  DECIMAL +   decimal, the value in grams +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ OuncesToGrams(INPUT:decimal):DECIMAL +
+ +
+ Parameters  +
+
+ ipdeOunces  + DECIMAL +   as decimal, the value in ounces +
+ +
+ +
PintsToLiters method
+ +
+ + Purpose: + Convert Pints to Liters +
+ Description: + 1 pint = 0.473176 liters +
+ +
+
+ Return type:  DECIMAL +   decimal, the value in liters +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ PintsToLiters(INPUT:decimal):DECIMAL +
+ +
+ Parameters  +
+
+ ipdePints  + DECIMAL +   as decimal, the value in pints +
+ +
+ +
PoundsToKilograms method
+ +
+ + Purpose: + Convert Pounds to Kilograms +
+ Description: + 1 pound = 0.453592 kilograms +
+ +
+
+ Return type:  DECIMAL +   decimal, the value in kilograms +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ PoundsToKilograms(INPUT:decimal):DECIMAL +
+ +
+ Parameters  +
+
+ ipdePounds  + DECIMAL +   as decimal, the value in pounds +
+ +
+ +
QuartsToLiters method
+ +
+ + Purpose: + Convert Quarts to Liters +
+ Description: + 1 quart = 0.946353 liters +
+ +
+
+ Return type:  DECIMAL +   decimal, the value in liters +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ QuartsToLiters(INPUT:decimal):DECIMAL +
+ +
+ Parameters  +
+
+ ipdeQuarts  + DECIMAL +   as decimal, the value in quarts +
+ +
+ +
StonesToKilograms method
+ +
+ + Purpose: + Convert Stones to Kilograms +
+ Description: + 1 stone = 6.35029 kilograms +
+ +
+
+ Return type:  DECIMAL +   decimal, the value in kilograms +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ StonesToKilograms(INPUT:decimal):DECIMAL +
+ +
+ Parameters  +
+
+ ipdeStones  + DECIMAL +   as decimal, the value in stones +
+ +
+ +
USGallonsToLiters method
+ +
+ + Purpose: + Convert US Gallons to Liters +
+ Description: + 1 US gallon = 3.78541 liters +
+ +
+
+ Return type:  DECIMAL +   decimal, the value in liters +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ USGallonsToLiters(INPUT:decimal):DECIMAL +
+ +
+ Parameters  +
+
+ ipdeGallons  + DECIMAL +   as decimal, the value in US gallons +
+ +
+ +
YardsToMeters method
+ +
+ + Purpose: + Convert Yards to Meters +
+ Description: + 1 yard = 0.9144 meters +
+ +
+
+ Return type:  DECIMAL +   decimal, the value in meters +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ YardsToMeters(INPUT:decimal):DECIMAL +
+ +
+ Parameters  +
+
+ ipdeYards  + DECIMAL +   as decimal, the value in yards +
+ + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Doc/Utils/MemptrUtil.cls.html b/Doc/Utils/MemptrUtil.cls.html new file mode 100644 index 0000000..b87db5b --- /dev/null +++ b/Doc/Utils/MemptrUtil.cls.html @@ -0,0 +1,626 @@ + + + + +MemptrUtil.cls + + + + + + + +
+ Utils: MemptrUtil CLASS +
+
+ +
+ MemptrUtil + + CLASS
+ + +
+ Purpose: + Main helper class to handle memptr operations +
+ Description: + +
+ Author(s): + Wayfare +
+ Notes: + +
+ Created: + Mon Nov 25 10:35:24 EET 2024 +
+
+ + + + + +
Super Class
+
+ + Progress.Lang.Object + +
+ + + + + + + + +
+ Methods
+
+ + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Method Detail
+
+ +
+ +
AllocateMemory method
+ +
+ + Purpose: + Allocates memory for a memptr with the specified size +
+ Description: + +
+ +
+
+ Return type:  VOID +  
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ AllocateMemory(INPUT-OUTPUT:memptr,INPUT:integer) +
+ +
+ Parameters  +
+
+ iopmptrPointer  + MEMPTR +   as memptr, the memptr to allocate memory for +
+
+ ipiSize  + INTEGER +   as integer, the size in bytes to allocate +
+ +
+ +
CompareMemory method
+ +
+ + Purpose: + Compares two memptr blocks to check if their content is identical +
+ Description: + +
+ +
+
+ Return type:  LOGICAL +   logical, TRUE if the content is identical, FALSE otherwise +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ CompareMemory(INPUT:memptr,INPUT:memptr,INPUT:integer):LOGICAL +
+ +
+ Parameters  +
+
+ ipmptrPointer1  + MEMPTR +   as memptr, the first memptr +
+
+ ipmptrPointer2  + MEMPTR +   as memptr, the second memptr +
+
+ ipiSize  + INTEGER +   as integer, the number of bytes to compare +
+ +
+ +
CopyMemory method
+ +
+ + Purpose: + Copies data from one memptr to another +
+ Description: + +
+ +
+
+ Return type:  VOID +  
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ CopyMemory(INPUT:memptr,INPUT-OUTPUT:memptr,INPUT:integer) +
+ +
+ Parameters  +
+
+ ipmptrSource  + MEMPTR +   as memptr, the source memptr +
+
+ iopmptrTarget  + MEMPTR +   as memptr, the target memptr +
+
+ ipiSize  + INTEGER +   as integer, the number of bytes to copy +
+ +
+ +
FreeMemory method
+ +
+ + Purpose: + Frees the allocated memory for a memptr +
+ Description: + +
+ +
+
+ Return type:  VOID +  
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ FreeMemory(INPUT-OUTPUT:memptr) +
+ +
+ Parameters  +
+
+ iopmptrPointer  + MEMPTR +   as memptr, the memptr to free memory for +
+ +
+ +
FromString method
+ +
+ + Purpose: + Converts a string into a memptr +
+ Description: + +
+ +
+
+ Return type:  VOID +  
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ FromString(INPUT:character,INPUT-OUTPUT:memptr) +
+ +
+ Parameters  +
+
+ ipcData  + CHARACTER +   as character, the string to convert +
+
+ iopmptrPointer  + MEMPTR +   as memptr, the memptr to populate with string data +
+ +
+ +
GetSize method
+ +
+ + Purpose: + Retrieves the size of the memory block pointed to by the memptr +
+ Description: + +
+ +
+
+ Return type:  INT64 +   int64, the size of the memory block in bytes +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ GetSize(INPUT:memptr):INT64 +
+ +
+ Parameters  +
+
+ ipmptrPointer  + MEMPTR +   as memptr, the memptr to check +
+ +
+ +
IsNotNull method
+ +
+ + Purpose: + Determines if the given memptr is not null (allocated and non-zero size) +
+ Description: + +
+ +
+
+ Return type:  LOGICAL +   logical, TRUE if not null, FALSE otherwise +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ IsNotNull(INPUT:memptr):LOGICAL +
+ +
+ Parameters  +
+
+ ipmptrPointer  + MEMPTR +   as memptr, the memptr to check +
+ +
+ +
IsNull method
+ +
+ + Purpose: + Determines if the given memptr is null (unallocated or zero size) +
+ Description: + +
+ +
+
+ Return type:  LOGICAL +   logical, TRUE if null, FALSE otherwise +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ IsNull(INPUT:memptr):LOGICAL +
+ +
+ Parameters  +
+
+ ipmptrPointer  + MEMPTR +   as memptr, the memptr to check +
+ +
+ +
ToString method
+ +
+ + Purpose: + Converts the contents of a memptr to a string +
+ Description: + +
+ +
+
+ Return type:  CHARACTER +   character, the string representation of the memptr contents +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ ToString(INPUT:memptr):CHARACTER +
+ +
+ Parameters  +
+
+ ipmptrPointer  + MEMPTR +   as memptr, the memptr to convert +
+ + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Doc/Utils/QueryUtil.cls.html b/Doc/Utils/QueryUtil.cls.html new file mode 100644 index 0000000..57dce9c --- /dev/null +++ b/Doc/Utils/QueryUtil.cls.html @@ -0,0 +1,632 @@ + + + + +QueryUtil.cls + + + + + + + +
+ Utils: QueryUtil CLASS +
+
+ +
+ QueryUtil + + CLASS
+ + +
+ Purpose: + Main helper class to handle dynamic query operations +
+ Description: + +
+ Author(s): + Wayfare +
+ Notes: + +
+ Created: + Tue Oct 29 12:03:58 EET 2024 +
+
+ + + + + +
Super Class
+
+ + Progress.Lang.Object + +
+ + + + + + + + +
+ Methods
+
+ + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Method Detail
+
+ +
+ +
AddBuffer method
+ +
+ + Purpose: + Adds a buffer to an existing query +
+ Description: + +
+ +
+
+ Return type:  HANDLE +   handle, the handle of the query +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ AddBuffer(INPUT:handle,INPUT:character):HANDLE +
+ +
+ Parameters  +
+
+ iphQuery  + HANDLE +   as handle, the existing query handle +
+
+ ipcTableName  + CHARACTER +   as character, the name of the table to add +
+ +
+ +
AddExpression method
+ +
+ + Purpose: + Adds a filtering expression to the query +
+ Description: + +
+ +
+
+ Return type:  CHARACTER +   character, the modified query with the appended filter expression +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ AddExpression(INPUT:character,INPUT:character):CHARACTER +
+ +
+ Parameters  +
+
+ ipcQuery  + CHARACTER +   as character, the existing query string +
+
+ ipcExpressionForField  + CHARACTER +   as character, the filter expression to add +
+ +
+ +
GetExpressionForField method
+ +
+ + Purpose: + Retrieves the expression for a specified field in the WHERE clause of the query +
+ Description: + +
+ +
+
+ Return type:  CHARACTER +   character, the filter expression for the field or "" if not found +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ GetExpressionForField(INPUT:character,INPUT:character):CHARACTER +
+ +
+ Parameters  +
+
+ ipcQuery  + CHARACTER +   as character, the existing query string +
+
+ ipcField  + CHARACTER +   as character, the field to locate +
+ +
+ +
GetNumberOfResultsFromQuery method
+ +
+ + Purpose: + Retrieves the number of results from the provided query string and buffers +
+ Description: + +
+ +
+
+ Return type:  INT64 +   int64, the count of results matching the query +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ GetNumberOfResultsFromQuery(INPUT:character,INPUT:character):INT64 +
+ +
+ Parameters  +
+
+ ipcQuery  + CHARACTER +   as character, the query string +
+
+ ipcBufferNames  + CHARACTER +   as character, comma-separated buffer names to add to the query +
+ +
+ +
GetQuerySort method
+ +
+ + Purpose: + Retrieves the sort criteria from a given query string +
+ Description: + Assumes "BY" is used for the sorting expression and extracts it +
+ +
+
+ Return type:  CHARACTER +   character, the sorting expression after "BY" or an empty string if not found +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ GetQuerySort(INPUT:character):CHARACTER +
+ +
+ Parameters  +
+
+ ipcQuery  + CHARACTER +   as character, the full query string +
+ +
+ +
InitQuery method
+ +
+ + Purpose: + Initializes a dynamic query on the given table +
+ Description: + +
+ +
+
+ Return type:  HANDLE +   handle, the handle of the created query +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ InitQuery():HANDLE +
+ + +
+ +
PrepareQuery method
+ +
+ + Purpose: + Prepares the query with sorting and filtering expressions +
+ Description: + +
+ +
+
+ Return type:  CHARACTER +   character, the complete query string with WHERE and BY clauses +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ PrepareQuery(INPUT:character,INPUT:character,INPUT:character):CHARACTER +
+ +
+ Parameters  +
+
+ ipcTableName  + CHARACTER +   as character, the table name +
+
+ ipcFilterExpression  + CHARACTER +   as character, the filter expression to add +
+
+ ipcSortExpression  + CHARACTER +   as character, the sorting expression to add +
+ +
+ +
RemoveExpressionForField method
+ +
+ + Purpose: + Removes the expression for a specified field from the query +
+ Description: + +
+ +
+
+ Return type:  CHARACTER +   character, the modified query string without the specified field expression +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ RemoveExpressionForField(INPUT:character,INPUT:character):CHARACTER +
+ +
+ Parameters  +
+
+ ipcQuery  + CHARACTER +   as character, the existing query string +
+
+ ipcField  + CHARACTER +   as character, the field to remove +
+ +
+ +
SetQuerySort method
+ +
+ + Purpose: + Appends the sorting expression to the query string +
+ Description: + +
+ +
+
+ Return type:  CHARACTER +   character, the modified query string with the appended sort expression +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ SetQuerySort(INPUT:character,INPUT:character):CHARACTER +
+ +
+ Parameters  +
+
+ ipcQuery  + CHARACTER +   as character, the existing query string +
+
+ ipcSortExpression  + CHARACTER +   as character, the sorting expression to add +
+ + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Doc/Utils/RegexLinuxUtil.cls.html b/Doc/Utils/RegexLinuxUtil.cls.html new file mode 100644 index 0000000..a1b379b --- /dev/null +++ b/Doc/Utils/RegexLinuxUtil.cls.html @@ -0,0 +1,252 @@ + + + + +RegexLinuxUtil.cls + + + + + + + +
+ Utils: RegexLinuxUtil CLASS +
+
+ +
+ RegexLinuxUtil + + CLASS
+ + +
+ Purpose: + Utility class for regex matching on Linux +
+ Description: + +
+ Author(s): + Wayfare +
+ Notes: + +
+ Created: + Mon Nov 11 17:01:35 EET 2024 +
+
+ + + + + +
Super Class
+
+ + Progress.Lang.Object + +
+ + + + + + + + +
+ Methods
+
+ + + + + + + + + + +
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Method Detail
+
+ +
+ +
MatchRegex method
+ +
+ + Purpose: + Matches a string against a regex pattern using a Linux command +
+ Description: + This method uses 'perl' with command-line execution to perform regex matching +
+ +
+
+ Return type:  LOGICAL +   logical, TRUE if the pattern matches, FALSE otherwise +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ MatchRegex(INPUT:character,INPUT:character):LOGICAL +
+ +
+ Parameters  +
+
+ ipcPattern  + CHARACTER +   as character, the regex pattern to use for matching +
+
+ ipcTestString  + CHARACTER +   as character, the string to test against the regex +
+ +
+ +
MatchRegexWithLib method
+ +
+ + Purpose: + Matches a string against a regex pattern using a C library function +
+ Description: + This method calls the 'regex_match' function from the 'regm.so' library (based on 'regex.h') +
+ +
+
+ Return type:  LOGICAL +   logical, TRUE if the pattern matches, FALSE otherwise +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ MatchRegexWithLib(INPUT:character,INPUT:character):LOGICAL +
+ +
+ Parameters  +
+
+ ipcPattern  + CHARACTER +   as character, the regex pattern to use for matching +
+
+ ipcTestString  + CHARACTER +   as character, the string to test against the regex +
+ + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Doc/Utils/SessionUtil.cls.html b/Doc/Utils/SessionUtil.cls.html new file mode 100644 index 0000000..f9fd7c1 --- /dev/null +++ b/Doc/Utils/SessionUtil.cls.html @@ -0,0 +1,456 @@ + + + + +SessionUtil.cls + + + + + + + +
+ Utils: SessionUtil CLASS +
+
+ +
+ SessionUtil + + CLASS
+ + +
+ Purpose: + Main helper class to handle session operations +
+ Description: + +
+ Author(s): + Wayfare +
+ Notes: + +
+ Created: + Tue Nov 05 15:39:22 EET 2024 +
+
+ + + + + +
Super Class
+
+ + Progress.Lang.Object + +
+ + + + + + + + +
+ Methods
+
+ + + + + + + + + + + + + + + + + + + + + +
+ + + +
+ + + +
+ + + +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Method Detail
+
+ +
+ +
GetDateFormat method
+ +
+ + Purpose: + Retrieves the current session date format +
+ Description: + The format represents how dates are displayed, e.g., "mdy" +
+ +
+
+ Return type:  CHARACTER +   character, the current date format of the session +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ GetDateFormat():CHARACTER +
+ + +
+ +
GetNumericDecimalPoint method
+ +
+ + Purpose: + Retrieves the current numeric decimal point +
+ Description: + +
+ +
+
+ Return type:  CHARACTER +   character, the current numeric decimal point of the session +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ GetNumericDecimalPoint():CHARACTER +
+ + +
+ +
GetNumericFormat method
+ +
+ + Purpose: + Retrieves the current numeric format +
+ Description: + +
+ +
+
+ Return type:  CHARACTER +   character, the current numeric format of the session +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ GetNumericFormat():CHARACTER +
+ + +
+ +
GetNumericSeparator method
+ +
+ + Purpose: + Retrieves the current numeric separator +
+ Description: + +
+ +
+
+ Return type:  CHARACTER +   character, the current numeric separator of the session +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ GetNumericSeparator():CHARACTER +
+ + +
+ +
GetStartupParameters method
+ +
+ + Purpose: + Retrieves session startup parameters as a single character string +
+ Description: + +
+ +
+
+ Return type:  CHARACTER +   character, the startup parameters of the session +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ GetStartupParameters():CHARACTER +
+ + +
+ +
SetDateFormat method
+ +
+ + Purpose: + Sets the session date format to a specified format +
+ Description: + Accepted formats are: mdy, myd, dmy, dym, ymd, ydm +
+ +
+
+ Return type:  VOID +  
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ SetDateFormat(INPUT:character) +
+ +
+ Parameters  +
+
+ ipcDateFormat  + CHARACTER +   as character, the desired date format for the session +
+ +
+ +
SetNumericFormat method
+ +
+ + Purpose: + Sets the numeric format in the session +
+ Description: + +
+ +
+
+ Return type:  VOID +  
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ SetNumericFormat(INPUT:character) +
+ +
+ Parameters  +
+
+ ipcNumericFormat  + CHARACTER +   as character, the desired numeric format for the session +
+ + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Doc/Utils/StringUtil.cls.html b/Doc/Utils/StringUtil.cls.html new file mode 100644 index 0000000..ad4ff70 --- /dev/null +++ b/Doc/Utils/StringUtil.cls.html @@ -0,0 +1,1088 @@ + + + + +StringUtil.cls + + + + + + + +
+ Utils: StringUtil CLASS +
+
+ +
+ StringUtil + + CLASS
+ + +
+ Purpose: + Main helper class to handle character operations +
+ Description: + +
+ Author(s): + Wayfare +
+ Notes: + +
+ Created: + Thu Oct 17 14:27:41 EEST 2024 +
+
+ + + + + +
Super Class
+
+ + Progress.Lang.Object + +
+ + + + + + + + +
+ Methods
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Method Detail
+
+ +
+ +
ContainsNumber method
+ +
+ + Purpose: + Check if string contains a number +
+ Description: + +
+ +
+
+ Return type:  LOGICAL +   logical, TRUE if the string contains a number, FALSE otherwise +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ ContainsNumber(INPUT:character):LOGICAL +
+ +
+ Parameters  +
+
+ ipcString  + CHARACTER +   as character, the string to check +
+ +
+ +
GetTokenValueFromString method
+ +
+ + Purpose: + Returns the token value of a token string +
+ Description: + +
+ +
+
+ Return type:  CHARACTER +   character, the token value at the specified position +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ GetTokenValueFromString(INPUT:character,INPUT:integer):CHARACTER +
+ +
+ Parameters  +
+
+ ipcString  + CHARACTER +   as character, the string containing token values +
+
+ ipiPosition  + INTEGER +   as integer, the position of the token value to return +
+ +
+ +
IsEmpty method
+ +
+ + Purpose: + Check if string is empty +
+ Description: + +
+ +
+
+ Return type:  LOGICAL +   logical, TRUE if the string is empty, FALSE otherwise +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ IsEmpty(INPUT:character):LOGICAL +
+ +
+ Parameters  +
+
+ ipcString  + CHARACTER +   as character, the string to check +
+ +
+ +
IsLowercase method
+ +
+ + Purpose: + Check if string is lowercase +
+ Description: + +
+ +
+
+ Return type:  LOGICAL +   logical, TRUE if the string is lowercase, FALSE otherwise +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ IsLowercase(INPUT:character):LOGICAL +
+ +
+ Parameters  +
+
+ ipcString  + CHARACTER +   as character, the string to check +
+ +
+ +
IsNotEmpty method
+ +
+ + Purpose: + Check if string is not empty +
+ Description: + +
+ +
+
+ Return type:  LOGICAL +   logical, TRUE if the string is not empty, FALSE otherwise +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ IsNotEmpty(INPUT:character):LOGICAL +
+ +
+ Parameters  +
+
+ ipcString  + CHARACTER +   as character, the string to check +
+ +
+ +
IsNotNull method
+ +
+ + Purpose: + Check if string is not null +
+ Description: + +
+ +
+
+ Return type:  LOGICAL +   logical, TRUE if the string is not null, FALSE otherwise +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ IsNotNull(INPUT:character):LOGICAL +
+ +
+ Parameters  +
+
+ ipcString  + CHARACTER +   as character, the string to check +
+ +
+ +
IsNotNullOrEmpty method
+ +
+ + Purpose: + Check if string is not null nor empty +
+ Description: + +
+ +
+
+ Return type:  LOGICAL +   logical, TRUE if the string is not null nor empty, FALSE otherwise +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ IsNotNullOrEmpty(INPUT:character):LOGICAL +
+ +
+ Parameters  +
+
+ ipcString  + CHARACTER +   as character, the string to check +
+ +
+ +
IsNull method
+ +
+ + Purpose: + Check if string is null +
+ Description: + +
+ +
+
+ Return type:  LOGICAL +   logical, TRUE if the string is null, FALSE otherwise +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ IsNull(INPUT:character):LOGICAL +
+ +
+ Parameters  +
+
+ ipcString  + CHARACTER +   as character, the string to check +
+ +
+ +
IsNullOrEmpty method
+ +
+ + Purpose: + Check if string is null or empty +
+ Description: + +
+ +
+
+ Return type:  LOGICAL +   logical, TRUE if the string is null or empty, FALSE otherwise +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ IsNullOrEmpty(INPUT:character):LOGICAL +
+ +
+ Parameters  +
+
+ ipcString  + CHARACTER +   as character, the string to check +
+ +
+ +
IsUppercase method
+ +
+ + Purpose: + Check if string is uppercase +
+ Description: + +
+ +
+
+ Return type:  LOGICAL +   logical, TRUE if the string is uppercase, FALSE otherwise +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ IsUppercase(INPUT:character):LOGICAL +
+ +
+ Parameters  +
+
+ ipcString  + CHARACTER +   as character, the string to check +
+ +
+ +
Quote method
+ +
+ + Purpose: + Add quotes to a string. +
+ Description: + +
+ +
+
+ Return type:  CHARACTER +   character, the string with added quotes. +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ Quote(INPUT:character):CHARACTER +
+ +
+ Parameters  +
+
+ ipcString  + CHARACTER +   as character, the string to modify. +
+ +
+ +
RemoveTokenFromString method
+ +
+ + Purpose: + Removes a token from a token string +
+ Description: + +
+ +
+
+ Return type:  CHARACTER +   character, the token string without the removed token +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ RemoveTokenFromString(INPUT:character,INPUT:integer):CHARACTER +
+ +
+ Parameters  +
+
+ ipcString  + CHARACTER +   as character, the string to modify +
+
+ ipiPosition  + INTEGER +   as integer, the position of the token to remove +
+ +
+ +
SetTokenValueInString method
+ +
+ + Purpose: + Sets the token value in a token string +
+ Description: + +
+ +
+
+ Return type:  CHARACTER +   character, the token string with the updated token value +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ SetTokenValueInString(INPUT:character,INPUT:character,INPUT:integer):CHARACTER +
+ +
+ Parameters  +
+
+ ipcString  + CHARACTER +   as character, the string to modify +
+
+ ipcTokenValue  + CHARACTER +   as character, the token value to set +
+
+ ipiPosition  + INTEGER +   as integer, the position of the token to modify +
+ +
+ +
StartWithCapital method
+ +
+ + Purpose: + Capitalize the first letter of a string +
+ Description: + +
+ +
+
+ Return type:  CHARACTER +   character, the modified string with the first letter capitalized +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ StartWithCapital(INPUT:character):CHARACTER +
+ +
+ Parameters  +
+
+ ipcString  + CHARACTER +   as character, the string to modify +
+ +
+ +
StartWithLowercase method
+ +
+ + Purpose: + Lowercase the first letter of a string +
+ Description: + +
+ +
+
+ Return type:  CHARACTER +   character, the modified string with the first letter lowercased +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ StartWithLowercase(INPUT:character):CHARACTER +
+ +
+ Parameters  +
+
+ ipcString  + CHARACTER +   as character, the string to modify +
+ +
+ +
StringToCamelCase method
+ +
+ + Purpose: + Format character to camel case +
+ Description: + +
+ +
+
+ Return type:  CHARACTER +   character, the string formatted in camel case +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ StringToCamelCase(INPUT:character,INPUT:character):CHARACTER +
+ +
+ Parameters  +
+
+ ipcString  + CHARACTER +   as character, the string to modify +
+
+ ipcSeparator  + CHARACTER +   as character, the string separator +
+ +
+ +
StringToPascalCase method
+ +
+ + Purpose: + Format character to Pascal case +
+ Description: + +
+ +
+
+ Return type:  CHARACTER +   character, the string formatted in Pascal case +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ StringToPascalCase(INPUT:character,INPUT:character):CHARACTER +
+ +
+ Parameters  +
+
+ ipcString  + CHARACTER +   as character, the string to modify +
+
+ ipcSeparator  + CHARACTER +   as character, the string separator +
+ +
+ +
UnQuote method
+ +
+ + Purpose: + Remove quotes from a string +
+ Description: + +
+ +
+
+ Return type:  CHARACTER +   character, the string without quotes +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ UnQuote(INPUT:character):CHARACTER +
+ +
+ Parameters  +
+
+ ipcString  + CHARACTER +   as character, the string to modify +
+ + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Doc/Utils/ValidatorUtil.cls.html b/Doc/Utils/ValidatorUtil.cls.html new file mode 100644 index 0000000..4ebd1c6 --- /dev/null +++ b/Doc/Utils/ValidatorUtil.cls.html @@ -0,0 +1,812 @@ + + + + +ValidatorUtil.cls + + + + + + + +
+ Utils: ValidatorUtil CLASS +
+
+ +
+ ValidatorUtil + + CLASS
+ + +
+ Purpose: + Main helper class for validation +
+ Description: + +
+ Author(s): + Wayfare +
+ Notes: + +
+ Created: + Wed Nov 06 11:04:44 EET 2024 +
+
+ + + + + +
Super Class
+
+ + Progress.Lang.Object + +
+ + + + + + + + +
+ Methods
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Method Detail
+
+ +
+ +
CalculateLuhnChecksum method
+ +
+ + Purpose: + Calculates if a credit card number is valid based on the Luhn algorithm +
+ Description: + This method is used internally by the credit card validation methods +
+ +
+
+ Return type:  LOGICAL +   logical, TRUE if the number is valid per Luhn algorithm, FALSE otherwise +
+
+ Modifiers :  + PRIVATE   + STATIC   +
+ + + + + + +
+ Syntax  +
+ CalculateLuhnChecksum(INPUT:character):LOGICAL +
+ +
+ Parameters  +
+
+ ipcCardNumber  + CHARACTER +   as character, the credit card number to validate +
+ +
+ +
MatchPattern method
+ +
+ + Purpose: +
+ Description: +
+ +
+
+ Return type:  LOGICAL +  
+
+ Modifiers :  + PRIVATE   + STATIC   +
+ + + + + + +
+ Syntax  +
+ MatchPattern(INPUT:character,INPUT:character,INPUT:character,INPUT:logical):LOGICAL +
+ +
+ Parameters  +
+
+ ipcPattern  + CHARACTER +
+
+ ipcLinuxPattern  + CHARACTER +
+
+ ipcTestString  + CHARACTER +
+
+ useLib  + LOGICAL +
+ +
+ +
ValidateCreditCardNumber method
+ +
+ + Purpose: + Validates a credit card number using the Luhn algorithm +
+ Description: + On UNIX, this method uses the 'perl' command for regex matching +
+ +
+
+ Return type:  LOGICAL +   logical, TRUE if valid, FALSE otherwise +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ ValidateCreditCardNumber(INPUT:character):LOGICAL +
+ +
+ Parameters  +
+
+ ipcCardNumber  + CHARACTER +   as character, the credit card number to validate +
+ +
+ +
ValidateCreditCardNumberUnixLibrary method
+ +
+ + Purpose: + Validates a credit card number using the Luhn algorithm +
+ Description: + On UNIX, this method uses the C library 'regm.so' for regex matching +
+ +
+
+ Return type:  LOGICAL +   logical, TRUE if valid, FALSE otherwise +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ ValidateCreditCardNumberUnixLibrary(INPUT:character):LOGICAL +
+ +
+ Parameters  +
+
+ ipcCardNumber  + CHARACTER +   as character, the credit card number to validate +
+ +
+ +
ValidateEmailAddress method
+ +
+ + Purpose: + Validates if an email address is in a standard format +
+ Description: + On UNIX, this method uses the 'perl' command for regex matching +
+ +
+
+ Return type:  LOGICAL +   logical, TRUE if valid, FALSE otherwise +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ ValidateEmailAddress(INPUT:character):LOGICAL +
+ +
+ Parameters  +
+
+ ipcEmail  + CHARACTER +   as character, the email address to validate +
+ +
+ +
ValidateEmailAddressUnixLibrary method
+ +
+ + Purpose: + Validates if an email address is in a standard format +
+ Description: + On UNIX, this method uses the C library 'regm.so' for regex matching +
+ +
+
+ Return type:  LOGICAL +   logical, TRUE if valid, FALSE otherwise +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ ValidateEmailAddressUnixLibrary(INPUT:character):LOGICAL +
+ +
+ Parameters  +
+
+ ipcEmail  + CHARACTER +   as character, the email address to validate +
+ +
+ +
ValidateIPv4Address method
+ +
+ + Purpose: + Validates if an IP address is in a valid IPv4 format +
+ Description: + On UNIX, this method uses the 'perl' command for regex matching +
+ +
+
+ Return type:  LOGICAL +   logical, TRUE if valid, FALSE otherwise +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ ValidateIPv4Address(INPUT:character):LOGICAL +
+ +
+ Parameters  +
+
+ ipcIPAddress  + CHARACTER +   as character, the IP address to validate +
+ +
+ +
ValidateIPv6Address method
+ +
+ + Purpose: + Validates if an IP address is in a valid IPv6 format +
+ Description: + Accepts standard and shorthand IPv6 notations. On UNIX, this method uses the 'perl' command for regex matching +
+ +
+
+ Return type:  LOGICAL +   logical, TRUE if valid, FALSE otherwise +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ ValidateIPv6Address(INPUT:character):LOGICAL +
+ +
+ Parameters  +
+
+ ipcIPAddress  + CHARACTER +   as character, the IPv6 address to validate +
+ +
+ +
ValidateIPv6AddressUnixLibrary method
+ +
+ + Purpose: + Validates if an IP address is in a valid IPv6 format +
+ Description: + Accepts standard and shorthand IPv6 notations. On UNIX, this method uses the C library 'regm.so' for regex matching +
+ +
+
+ Return type:  LOGICAL +   logical, TRUE if valid, FALSE otherwise +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ ValidateIPv6AddressUnixLibrary(INPUT:character):LOGICAL +
+ +
+ Parameters  +
+
+ ipcIPAddress  + CHARACTER +   as character, the IPv6 address to validate +
+ +
+ +
ValidatePhoneNumber method
+ +
+ + Purpose: + Validates if a phone number is in a standard format +
+ Description: + On UNIX, this method uses the 'perl' command for regex matching +
+ +
+
+ Return type:  LOGICAL +   logical, TRUE if valid, FALSE otherwise +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ ValidatePhoneNumber(INPUT:character):LOGICAL +
+ +
+ Parameters  +
+
+ ipcPhoneNumber  + CHARACTER +   as character, the phone number to validate +
+ +
+ +
ValidatePhoneNumberUnixLibrary method
+ +
+ + Purpose: + Validates if a phone number is in a standard format +
+ Description: + On UNIX, this method uses the C library 'regm.so' for regex matching +
+ +
+
+ Return type:  LOGICAL +   logical, TRUE if valid, FALSE otherwise +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ ValidatePhoneNumberUnixLibrary(INPUT:character):LOGICAL +
+ +
+ Parameters  +
+
+ ipcPhoneNumber  + CHARACTER +   as character, the phone number to validate +
+ +
+ +
ValidateURL method
+ +
+ + Purpose: + Validates if a URL is in a standard format +
+ Description: + On UNIX, this method uses the 'perl' command for regex matching +
+ +
+
+ Return type:  LOGICAL +   logical, TRUE if valid, FALSE otherwise +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ ValidateURL(INPUT:character):LOGICAL +
+ +
+ Parameters  +
+
+ ipcURL  + CHARACTER +   as character, the URL to validate +
+ +
+ +
ValidateURLUnixLibrary method
+ +
+ + Purpose: + Validates if a URL is in a standard format +
+ Description: + On UNIX, this method uses the C library 'regm.so' for regex matching +
+ +
+
+ Return type:  LOGICAL +   logical, TRUE if valid, FALSE otherwise +
+
+ Modifiers :  + PUBLIC   + STATIC   +
+ + + + + + +
+ Syntax  +
+ ValidateURLUnixLibrary(INPUT:character):LOGICAL +
+ +
+ Parameters  +
+
+ ipcURL  + CHARACTER +   as character, the URL to validate +
+ + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Doc/Utils/package.html b/Doc/Utils/package.html new file mode 100644 index 0000000..d0809dc --- /dev/null +++ b/Doc/Utils/package.html @@ -0,0 +1,358 @@ + + + + +Utils + + + + + + + + + + +
Utils PACKAGE
+ + +
+ + +
+ + +
+ Classes and Interfaces
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ + + + + + + + \ No newline at end of file diff --git a/Doc/css/nav-style.css b/Doc/css/nav-style.css new file mode 100644 index 0000000..2d9536d --- /dev/null +++ b/Doc/css/nav-style.css @@ -0,0 +1,278 @@ +* {margin:0;padding:0} +body { + font-family: verdana; + font-size: 1em; +} + +h2 {color: white;} +html {overflow: hidden;} +body { + overflow: hidden; + padding: 0; + margin: 0; + width: 100%; + height: 100%; +} +#header{ + position: absolute; + top: 0px; + left: 0px; + width:100%; + height: 80px; + overflow: hidden; +} +#main { + position: absolute; + top: 140px; + left: 275px; + right: 13px; + bottom: 20px; + overflow: auto; +} +#side { + /*position: absolute; + top: 110px; + left: 20px; + bottom: 20px; + width: 270px; + overflow: auto;*/ + + padding-top: 10px; + padding-bottom: 10px; + /*margin: 0px 12px 15px; + min-height: 100px;*/ + + background-color: #FFFFFF; + /*border-style: solid; + border-color: #A4A4A4; + border-width: 1px;*/ + /*border-radius: 4px; + box-shadow: 1px 1px 4px 1px #A4A4A4; + margin-right: 4px;*/ + -webkit-box-sizing: border-box; /* Safari/Chrome, other WebKit */ -moz-box-sizing: border-box; /* Firefox, other Gecko */ box-sizing: border-box; + + +} + +#search{ + border-bottom: 1px solid #A4A4A4; +} + +#searchBox{ + border:none; + width:84%; +} + +h2,p {padding:10px;margin:0 0 .5em 0} + +iframe{ + width:100%; + height:100%; + position:absolute; + left:0; + top:0; +} + +/* ul.LinkedList { display: block; }*/ +/* ul.LinkedList ul { display: none; } */ +.HandCursorStyle { cursor: pointer; cursor: hand; } /* For IE */ + +/*#side li > ul +{ + margin-left:10px; + list-style-type:none; +} +#side ul +{ + //line-height:15px; + list-style-type:none; +}*/ +/*.treeexpand +{ + background-image:url('../images/collapse.png'); + background-repeat: no-repeat; + background-position: right 0px; + cursor:pointer; + +} +.treecollapse +{ + background-image:url('../images/expand.png'); + background-repeat: no-repeat; + background-position: right 0px; + cursor:pointer; +}*/ +.selected +{ + background: #54565b; +} +/*.treeentry { +font-family: Lato, Arial, sans-serif; +font-size: 12 pt; +cursor: pointer; +border-style: solid; +border-color: #CCCCCC; +border-width: 0 0 0 0; +margin: 0; +padding: 4px 0 4px 0; +}*/ + +.treeentry_selected, .treeentry_selected:hover { +background: #54565b; +} + +.doc_title { + color: #666; + font-family: Lato,Helvetica,Arial,Tahoma,sans-serif; + font-size: 18px; + font-style: normal; + font-variant: normal; + font-weight: bold; + margin: 0pt 0pt 12pt; + padding-bottom: 0%; + text-align: left; + text-indent: 0pt; + text-transform: none; + vertical-align: baseline; +} + +li > a { + color: #54565B; + font-family: Lato,Arial,sans-serif; + font-size: 14px; + text-decoration: none; + position: relative; + z-index: 50; +} + +a{ + cursor:pointer; +} + +.tree ul { + list-style: none outside none; + position: relative; + display: inline-block; + min-width: 100%; +} +.tree li a { + line-height: 20px; +} +.tree > ul > li > a { + color: #54565B; + display: block; + font-weight: normal; + position: relative; + text-decoration: none; +} +.tree li > a { + padding: 0 0 0 30px; +} +.tree li.parent > a:before { + background-image: url("../images/fldr_obj.gif"); + background-position: 0px centre; + content: ""; + display: block; + height: 15px; + left: 11px; + position: absolute; + top: 0px; + vertical-align: middle; + width: 16px; + z-index:100; +} +.tree li.INTERFACE > a:before, .tree li.CLASS > a:before { + background-image: url("../images/cls_file.gif") ; + background-position: 0px centre; + content: ""; + display: block; + height: 15px; + left: 11px; + position: absolute; + top: 0px; + vertical-align: middle; + width: 18px; + z-index:100; +} + +.tree li.PROCEDURE > a:before { + background-image: url("../images/p_file.gif") ; + background-position: 0px centre; + content: ""; + display: block; + height: 15px; + left: 11px; + position: absolute; + top: 0px; + vertical-align: middle; + width: 18px; + z-index:100; +} +.tree li.INCLUDE > a:before { + background-image: url("../images/i_file.gif") ; + background-position: 0px centre; + content: ""; + display: block; + height: 15px; + left: 11px; + position: absolute; + top: 0px; + vertical-align: middle; + width: 18px; + z-index:100; +} +.tree ul li.active > a:before { + background-position: 0 centre; +} + +.tree ul li ul { + /*border-left: 1px solid #D9DADB; + + + overflow: hidden;*/ + display: none; +} +.tree ul li ul li { + position: relative; +} +.tree ul li ul li:before { + border-bottom: 1px dashed #E2E2E3; + content: ""; + left: -20px; + position: absolute; + top: 12px; + width: 15px; +} + + +.whole-row-selection { + width: 100%; + height:22px; + cursor: pointer; + position: absolute; + left: 0px; + -moz-user-select: none; + z-index: 30; +} + +.remove-hover{ + background-color : white; +} + +.add-hover{ + color : #54565B; +} + +.tree-div{ + position: absolute; + width: 260px; + top: 140px; + overflow: hidden; + bottom: 10px; + left:12px; + border:1px solid #A4A4A4; +} + +.hover-bg{ + background-color : #F0F0F3 ; +} diff --git a/Doc/css/stylesheet.css b/Doc/css/stylesheet.css new file mode 100644 index 0000000..a3b6160 --- /dev/null +++ b/Doc/css/stylesheet.css @@ -0,0 +1,305 @@ + +/* Text size adjustments */ + +body { + -webkit-text-size-adjust: none; + -ms-text-size-adjust: none; + text-size-adjust: none; + font-family: Lato, Arial, sans-serif; + font-size: 10pt; + margin: 0; + padding: 12px; + padding-top: 0px;; + word-wrap: break-word; +} +a:link:active { color: #d3461e; font-weight: bold; text-decoration: none;} +a:link { color: #d3461e; font-weight: bold; text-decoration: none;} +a:visited { color: #ff4e00; font-weight: bold; text-decoration: none;} +a:link:hover, a:visited:hover { text-decoration: underline;} + + + +.api_title { + font-family: Lato, Arial, Tahoma; sans-serif; + font-size: 11px; + font-style: italic; + margin-bottom: 11px; + color: #666666; + +} + +.pkg_class_name a:link { + color: #9C332E; + text-decoration: none; +} + +.pkg_class_name a:visited { + color: #DC736E; + text-decoration: none; +} + +.pkg_class_name a:link:hover { + color: #9C332E; + text-decoration: underline; +} + +.pkg_class_name a:visited:hover { + color: #DC736E; + text-decoration: underline; +} + +div.copyright_style { + + font-size: 8pt; + font-family: Arial; + color: #666666; + text-align: center; + +} + +div.title_name, caption.title_name +{ + color: #666666; + font-family: Lato, Helvetica, Arial, Tahoma, Sans-Serif; + font-size: 18px; + font-style: normal; + font-variant: normal; + font-weight: bold; + margin-bottom: 12.0pt; + margin-left: 0pt; + margin-right: 0pt; + margin-top: 0pt; + padding-bottom: 0%; + text-align: Left; + text-indent: 0pt; + text-transform: none; + vertical-align: baseline; +} + +div.paragraph, caption.paragraph +{ + color: #666666; + font-family: Lato, Helvetica, Arial, Tahoma, Sans-Serif; + font-size: 14px; + font-style: normal; + font-variant: normal; + font-weight: normal; + margin-bottom: 10.0pt; + margin-left: 0pt; + margin-right: 0pt; + margin-top: 10.0pt; + text-align: Left; + text-indent: 0pt; + text-transform: none; + vertical-align: baseline; +} + +div.section, caption.section +{ + color: #666666; + font-family: Lato, Helvetica, Arial, Tahoma, Sans-Serif; + font-size: 15px; + font-style: normal; + font-variant: normal; + font-weight: bold; + margin-bottom: 1px; + margin-left: 0pt; + margin-right: 0pt; + margin-top: 11.0pt; + padding-bottom: 1px; + text-align: Left; + text-indent: 0pt; + text-transform: none; + vertical-align: baseline; +} + +div.anchor, caption.anchor +{ + color: #666666; + font-family: Lato, Helvetica, Arial, Tahoma, Sans-Serif; + font-size: 14px; + font-style: normal; + font-variant: normal; + font-weight: normal; + margin-bottom: 0.0pt; + margin-left: 0pt; + margin-right: 0pt; + margin-top: 0.0pt; + padding-top: -10px; + text-align: Left; + text-indent: 0pt; + text-transform: none; + vertical-align: baseline; +} + +table.table_summary { + border-color: #DCDCDC; + border-style: solid; + border-width: medium; + border-collapse: collapse; + margin: 0pt 0pt 12pt; + padding: 4pt; + text-align: left; + width: 378pt +} + +td.table_data { + background-color: #FFF; + border-color: #DCDCDC; + border-style: solid; + border-width: thin; + padding: 4pt; + vertical-align: top; + width: 188.947pt; +} + +div.cell_data, caption.cell_data { + color: #666; + font-family: Lato,Helvetica,Arial,Tahoma,sans-serif; + font-size: 14px; + font-style: normal; + font-variant: normal; + font-weight: normal; + margin: 6pt 0pt; + text-align: left; + text-indent: 0pt; + text-transform: none; + vertical-align: baseline; +} + +div.detail_field, caption.detail_field { + color: #666; + font-family: Lato,Helvetica,Arial,Tahoma,sans-serif; + font-size: 14px; + font-style: normal; + font-variant: normal; + font-weight: normal; + margin: 5.05pt 0pt 5.05pt 72pt; + text-align: left; + text-indent: -72pt; + text-transform: none; + vertical-align: baseline; +} + +span.detail_field_title { + display: inline-block; + margin: 0px; + padding: 0px; + text-indent: 0px; + width: 100pt; + color: #666; + font-family: Arial; + font-size: 10pt; + font-style: normal; + font-variant: normal; + font-weight: bold; + text-transform: none; + vertical-align: baseline; +} + +table.table_syntax { + border-color: #E0E0E0; + border-style: solid; + border-width: 4px; + border-collapse: collapse; + margin: 0pt 0pt 12pt; + padding: 9pt 6pt 6pt; + text-align: left; + width: 378pt; + overflow: auto; +} + + +div.syntax-title, caption.syntax-title { + color: #666; + font-family: Lato,Helvetica,Arial,Tahoma,sans-serif; + font-size: 14px; + font-style: normal; + font-variant: normal; + font-weight: bold; + margin: 5px 0pt; + padding-bottom: 10px; + text-align: left; + text-indent: 0pt; + text-transform: none; + vertical-align: baseline; +} + +div.parameter, caption.parameter { + color: #666; + font-family: "Courier New",monospace; + font-size: 14px; + font-style: normal; + font-variant: normal; + font-weight: normal; + margin: 11pt 0pt; + text-align: left; + text-indent: 0pt; + text-transform: none; + vertical-align: baseline; +} + +span.code +{ + color: #666666; + font-family: 'Courier New', Monospace; + font-size: 14px; + font-style: normal; + font-variant: normal; + font-weight: normal; + text-transform: none; + vertical-align: baseline; +} + +td.element_detail { + background-color: #FFFFFF; + border-bottom-color: #E0E0E0; + border-bottom-style: solid; + border-bottom-width: 1px; + border-left-color: #E0E0E0; + border-left-style: solid; + border-left-width: 1px; + border-right-color: #E0E0E0; + border-right-style: solid; + border-right-width: 1px; + border-top-color: #E0E0E0; + border-top-style: solid; + border-top-width: 1px; + padding-bottom: 6pt; + padding-left: 6pt; + padding-right: 6pt; + padding-top: 9pt; + vertical-align: top; + width: 378pt +} + +span.parameter_code { + color: #666; + font-family: "Courier New",monospace; + font-size: 14px; + font-style: italic; + font-variant: normal; + font-weight: normal; + text-transform: none; + vertical-align: baseline; +} + +hr { + border: none; + height: 1px; + color: grey; + background: grey; +} + +span.element_detail_code +{ + color: #666666; + font-family: 'Courier New', Monospace; + font-size: 14px; + font-style: italic; + font-variant: normal; + font-weight: normal; + text-transform: none; + vertical-align: baseline; + float: left; +} diff --git a/Doc/images/cls_file.gif b/Doc/images/cls_file.gif new file mode 100644 index 0000000000000000000000000000000000000000..3a613502b9972f930f22a1bbbdda89dbab32c7b2 GIT binary patch literal 576 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 b;!p@Y(b&kqsN=$uaG-(NO@f`3iNP8G%)!if literal 0 HcmV?d00001 diff --git a/Doc/images/search.png b/Doc/images/search.png new file mode 100644 index 0000000000000000000000000000000000000000..053f99eee4340a68ad3337e4ffc8becb473c9d08 GIT binary patch literal 481 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

aH*cVCo%Q1PBDdyD4 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 z z7s`ebAS2ujLnDnP8L zV&I{!@fk=LGui;MNe3G(=Vx-FA^BVw+BF9!~s>}El z9+1H?{va`;3tZ0p)cWP^bvuRIT(c``B5mQ~o$H3;-L`vu8^=Hpa^tGy(s5Hao4!WZ zE0c>0T9?ZwNZMg9tT7J8?mT>GlaqZ6#^w^-14;xTGwrsdKr4y|>-IxAMT@A3NaLnfM*< zOT}s@h7HHtSXSE{N+D>^YEiOWfT_^6{z_n(;SR(412Hg)XTZ9CKmup;K1uP7BjiZo zB+FR=Yi)V&$>EM&V)qEyCY!A`D~gtUxdU1roZ;+D(R*?E1{KUeQ3xtRYs5Y5>@;p-&N+TKf&3}`DUi) zzEKiQNfO;1xFeGen^MjK;)Y(Wa%E2?S66SeZttz|n7!n5P_r-%PVAt>axjzqUMVVqMRVQpnS- zpQf^C6m^mz>igr01?p2lbdD*Mw_%&$t|ATvCvpe;eUL#tOv4E=24$J)B_~8`~h+O zn3Rbkq7mGsb$2@58&2EnmD}qj^VR0lZ?Te9!ST+DZ+LNvS)Hafgf(m}yhShYA9RLU zoUo+X>|X#NYH@r*7lmv`Tp)s+Hc$5)Q^>kg72qkDK&ML`sSOukyB=N4(2o8<(fU`gxfvy+a?gnl~UXvLF>cmasD93J*O|p^rDn>TXWR-_x}D-d4hWp7A5`1xZ7lb zl5q(Bo)gHF@+MOdcDm2wZaT30q$;K;iS%w4mXGZS7z5Ba zyXDajfQA3+vdzEO1pn{0;QSwWJ;0j8)R5QfaazPobKVcvrD|Yt8#nIY&O$sR|C!Sn(!wEJ{(=#vx%#f@(UE$4;st+UjG#V7mYEn& z-9yplQLV8J$~QoQ;73&niV+mO!N1>QO1{3ohA*P~fv8=5!L#uSSLhBZyrSvSX2t&U`?N*A!*!upc+R*rXqydZd#QAe0* z&MRp5H){~1CymIh`$!aylL`H%iJZngKDVa*x z_5k4wNy7PfoRFk%YVPf1!XWwahpKIsV|rqL$+tF4*A7=c5vAFzEj+sFp@1I_4OQ#~ zZ(DC%RrMx_(1|py^fDW6UR_EpM7_$W&Yc$FQg|)n4aViKhlOtmg6`f9)v`uSzac{~ zP9YawRP(`7wj;(GJ4Tfx8fsMcK;0hSHfc_b`&UQ7tqIq-jXyu%pYMo>2)p&*JVE4n z2-mFltiRnB2xU8D-z5iz=vgRJN;{1ePcSnx|K6fZlfT^z9zI4Cj?>;^mfG8!n>~+$ zUf`aQpkv~oNrG?@8X%ss*nEvMmt$P_2>qlQj6Q#0%{dM#+I(#oA(7m6RX<1iI#B+7 zRQc}HuRE=5l?`7L%+=cMl1Yoha97RAG-yhFfSwL`wLuQbMyWWVSY*#58ltP_gx{@i zg^ga4junTLhvnZKe}sQbDUzmssh}0g&cpbc$UJ@`3{u{`no^he8V8C&lM0x;2x$DU z;MS*05dI6!0ur$Vc${f1Fjj0w=pKiHYT1)zyfVyRS;x>iVaAzZdHgoA`PXK(8&k_S z2k%U;q}g>F@zWY}_9b8c=^8i8CGjxPjHHaCG3Y7jWRx%&hv;4j{D{?q)J>d6Vy~p` zk7ml`Rmrl+l(H@N9`e8bb-V4y1{*B$TBd<8tn-TndCm99_NtcJARl;3xZ7siz^rbv zkB9$b>oWbdps>pb{NAm9|Aqhk_rL#Xj9&x=53F<}8?MzXosxHx@Tcq>Ezjmtplw_K zB3a7|jo%nN_F2Q1^%1dj>8FB=sP%4mBrIL;Pa81&+8 zXr4cL166CLX}NhDuT5}`Ht|^AAQ!i9S?1aAlpw{N2mPkTfuHN*ca+VGn%;HLr^$tt z=Skk!-5~5htSN!$G6~;gsM5%OM>AGJFqWT5Z@O8VHr7F3tVT~d?ZpiHY+eT|r$(c` z7L_=lSOBgM8jQX_poU`09O(#!YV{Ot>k<+s6O1`B6r}OKR+ArWDuJ}KV++tyOj2s{ z-LK^(*-1>1P=QA;8D57%yZ0Iznh2X6@CbyjLNvmomYDJBo^q94JHu8{1o6VyjXCDm{T?i<{Y#)`I+bf+OadRP7mnbX*K(uZx;S2F zd%^jHGAPIW_-%v5*~wv5$OB*`0O^FL8QrwWqS?7y3*ibNp^|oS6;4>{1eT2#DGeJc zpUk7$@x^Q@kW@Cjcvbi*Q3eQ>g=yuq7pgYha?xJ7y>H&{m|&b(XJNl8_y^HgFWW1KmLt+4 z2lN*Z7Hta`oca(3lzu-d{6S8ghLZ(O1$Q$-YzMwGF`0wO`lkKZB?fP2KC3A|@Ho9)RsB$Gu&nAqSMX^lV^C2FuJcs>?D zxA+|1!ze3FS1qj!JI{fjSjR|>onMi#BpUfxA7FKVfASegsPwM;bA`;LDF!a2Os~?y)_#IX|8s(^h zxnMo{fI9amdth|t$NkP+k@go%70ORD&4ph^R-#Rd{F?Q3tGfYi-m@zYS8V|WQg`H# zBj9)3s>$CAwaP_@ImFVoS33@>aPG{%3chWlnN5yjnhSN{5DROVf0+<57|W=$5_Y(4 zBR@~#*$&Q)SQ_zjFqATbe6n`}I)ZTaJ>Fbv{$-^w;}=9_kBA~0P_V@?O~H4IceV;# z&{~W>Y1`XUWK<&fawY{OJj7+IuKD7<_i-_f+qbzW12?qdV%aGk@RFvT=!gbpK9dzl zgt>#h=y-fm%CZtl^EGhk^h3*jnt(0tEcJ$AV;OVxSd=yFlwSd-!6hQVZ*+kIbfK7R zMn&;`hNpWCMfO_F8`rANNvSx&DW{hy;31B6b(L=b_T{^M{gVfaWr_q$DGov<4QCo` zn8I5=OcZ-dN@}XTz5&?-)qOZx&(8Cl0mT4KBbt7_I{GO5N=71SS#av}BxR6+$Wpu{ zrDxHzX5szR5|NGP=@lD>DtZVTC!>_hdr;hIpiGHry+QN|^xl=xW?wphLi_Tly*(-*D=|p0B4kw7^%$mKlIay9gU`flQw9x zNhcbp4QXa4_be0XW;`{V_24mV=wxvNUg7(-S(=c`dVqpa=hA^_o9-%^Ah<5e6wA9B zO`n3h$Z#H$nQ%h+(i24rH3fGl`6zaA5owjP(5;1O3%3zAw54W1X&$^{;rDqGpOnG= z*hgZ-FG|E>4~DQc`LkYQlnht^2cq|dUMdDvrnnay)hM{V_LeM?&&maKiXcTl$NI+m zz*&vdKHTnmYMjO2?YVqAonkxfoQXw zI@+O0eR9M#Es+E!X7+?%C{T+`#&`#v^r&rkWOn9XYn<3ZDC|i8CwobpE2OKO@ z4(dPUP9_Lay99VCtcDS@=c#p-hV1Xz_1FE+Bp8mb0QOKQWWIy$+y*-z-Jpe zE_S@s@S#%?55j8Vv^+Aw9QkMFEEm)8(SU^M5pa(yU#fP$4=5t~R!9Sz!7-n$V_^Pp z?T^$%=LGYp!vsmA6=d{a`4+=ipyMSV@wRf1Ah{vos(Z3ccb!l6hjc4mP?!oN{K*x5KOjlw{$^rCExDmN{win3hxG^It1lC!$aNPwj;Pfwh>5 zshblaNjYw>wzRJydV$bWQfNY0pTog^SE_j24&>-#?1rU-FVaa?8(Q^)_e%T20|UIp zHneYT86BL(Y#mc}L~I>@SO{x(8s|=_+1n`PYa-^n0k`Yq{QOzI@f-jCWi z^n*RyzKOW^oVmTjPUh@U*0-#9caatca{60-i!Zj=PYE&^VQP^V0epj~ZvuqOBia2h}p(gTR8{%v;tVB7Lt`~Qqv3FSl> zD|4bX@rL}X+w5^;$2nJgs7I8>ZeO}|<({2yNk3{L6Uf8H=&Iqtyibk2gkNToccNnKty zzL>hv9mz4W-j02g-m)nYxHSHp#;yL(Fs)p_Bb%79fsdq$L}T;B&O4uJB3v8Rw1Pd) z6xS9yv!8l8>rbRmDiX>1&((zvQ6|5fe@gnlqaj^7^*n zws!^vzkjNb+tR&dRAVp8Ri{42{x`njifwNcc9?>X@GIvK=3$yLCDtLM6epDEo6>N_ zFe|yOCgP%KT(}27to}ZN0)Shfdw9(18X83S*yT+)3Vdr%9;NmVsT&#Apgjmre;=i1 zj}$I4rRta3BdI!lk>_^cDD&%F=~Z`rlLwi*i-C(5?=|-erzO2lO?1$8Ga&$=V;1H! zhO&IFNjgc%*!Oa2+j@QrQP>BIvjOX4JaFkTi7jDAZL?n#D6OgNOnn3pB(lnQTr^`$y72kAbSU$aLjAD(lzgm=ohAO-esu4Mim-%!8izP%26y*|Wj{ zc+V)>=!3bAFI-bXD>#u)B3PZ9k2DRJzO2@*V?whH%l2b=xP~rnPR@ikD8jXZDN#F~ zPIiYC#Xt@2BWzlynxmvw=GPy(;WA_(D!v$rTjaktWCt?usHDy4dx0Gc$BK8T)rv}O zs{}mv##r?qm~l%_QYvWymsFhmW~96OuwO#dJ=V7xdek3U^y1rrA9vM}r5_L~cQX`s zNl8k<%ao(UbN_g7D(&*Fu>PEk%Hwy$PXWK|?^YLZksUzK)6Y~|R(sEf6b6-Z9MGmo zwl)}y3xJnQ4?D%P%lHH*9tg-8p&aUQ=`h&HTCILSj))M3#PLomHChj}+mW#ld{jKR z-GE7ASlV_f&;I53gtd+O^VflEHQ=eC@sPYUi8xD$?UO7RjEhwms~`>2)EpsQ8mS(} zvM{>2(XK}IXm_pbiKvuktDddbuaXyLGN}@oCa4kVDfekMW=AKRx;*8sn<$GP5m%t= z$3!@w54E61hF;CCp1n{PCCVPey84T$CN;r|7=5;&6i~qwNuq??Izp?B3CV7Uvap!k zphxn#6Lg*DjI*438c$bOf48+sjl$c%`B$8Hi1TIaN64}+hyB5+R#saz%<(0k&+Tck zRn_sjcA2-ME*PA93Z%*GZ_zX5KwDoE-6uI#KWQZz)bC6|=#L+pO%v^i<{weQsQ|66 zP4>aH4whXfr#Nom*(jM~^VU^l(nV*FB$*m~`;NwFWjtF~)e}_2Lrp6{MLhF=tcU~a z4N#C(nJK~*x8un~%1CD|4*~AGKAVy*d|89nx7T)V z<{!S{c|Nm#b^?`9E2TI;7;o|{*AXcORHBKIu`0?-%l(rtB6jMgm&?SJ$|(jW9eYiU zKNQ%L!3&=0um|y86=?bsyq-Xdxs2;~>R!Lso+&%8xBk^ch6F*=2SM zsPQ!D!WEOO3@r;4`PzE(A-dEO2Drua_E;k&gvmXePs~$E*GFBD4`bPL)^E zHGU`51PsU1W00>~`-l?4M(uN0xJsX<*6Z#K#2xMq)DDpn-n>*ur2C_g0Dbv_)c$2c zLH1{oI#hL>$@OEqGhm+?kzppn^-J?2H+)DRsMguo+ll@}MaKz1^5hv^zuu;-R)Fd@ z5u;r0PLeGB-fsJhv6);xjvUc$TYguv(Oycj(Lu=hDr7$HEr{tva-Nnq(3LU4qr3ZL z%wd;$-t0D5AbFmG9B@)YGXxC4-_hZ_z1ka_q1z4$N_YSLfJgrccK$C3cK$nM!}7;J zbC2QdB#BUrO|FD&RwiAn#n)ZMnJz@nl9HjA)_!ZSzd|OX6G=bI&uH)>Q_&yT^|4|Yl`{L6kU7URBOd8Igij%YeMdyt zvC19jJj8&*uPu?yqjooZlb)Ds5~4v*KHbsnS&gc4X0|hnhdww5_d{RdXWG6Q*>q8uA~yZu2#PjQ*vyDPk&A2X zNirW4Lw%`Se!R@GG6u+-&O5+{A3c+ktbpAN4j^0c_8B|RK^ zvA)r$;4zsZ;`>M&%`6qFEseC;G36=@l;?^jY3>j~Rm%p*_C${p)e4JBn;nA_&)|b; zpe4fHqEQZ->D4Z-{#SP+K;Pr@6%{|s2T6U2cczT6*YmHVAot^<;6%7~?L}E-ny?og*T5k>q5k*LgP2Lu8ti;=l z4=iHU%(JB>)Ir4H>#xvzZQ8kdsu06G1P2tIKv&TcHW_nc#*Ap^D=e_W><>H zF8MnD;to1cAUTsWaJkWxHra&}BQZ zYNg))D5G4+lyaoE^ru^|MZ}BHF8Pyp*njG;E7u-9Pn2*JfJcA6!#1RIq04N&ozt=c zH;tZFw}G&+zrRu{O$E(5%lA89c=1Y3tf_%^J}B=W>gOy*4+a_84gJ{a0#njjts%65 zo9w#t2iE&SJEW_XGLSNWASCAYR}yRDCd~)3bMB2-=wJQpGdr25bPC)_n?3P-a2Aet zAps)H)_A}tkm3hu)&xrUHm_zbU3_m>QKlIa6zpTtZWx#!I%ap(~Q zZeKKFKHWzSTi_pVIet(^^V=O_q3pum-GQ7=L+A&Y-UX;1^)VAoMXkjN1w7A5uZET| z?OJ=sdv|3%SgC0R@HyQ~hm|y+pKehuosYBYaMTwzE8uOL0oarZTA4kNFOf7{R+cB# z0qvpP{hTAh@{e64lBG@?OllgXLGAZw6Eq#W0*VuXbnNV{h3wtWt{CXd(OBKUne_R} z`3VbYkYe)8*?wJ}YN=)=xs6sFxu>j&#>%VdipYQ_`l5nC{V&zy?~K^>I3~g?7l3u@ z;f=X_R*47=fEDfn7w&FXeV;JnT6-OQ)i62&bv|`^FdH}_8&?EEE}$D8Jxu{spym{O~1tg(v((YA5JUw&dZhi|iv!~vH z2j1tRq{S!IKLIsTFWq~_r{k_&dWDkP*o^O%i61t?jN5C*XJrp%IrB=+1Sq9THb?5~ zO7B?;?@g>$|9t1o6W+_m5gzfuc{0s&cTUcIY)uZk<}a!mfqMI9PEgo4*N~`~3_wK= zAlUBMCxB=?PY^}($C<^hP>CrL=6*64b6tMNsd#?W%*R9rdk}bj0E`bz^_$kz+^Eye zurYy6xQW345fQ1lV!up}IbR^^9mB_*gmxnuW0SI?j9ebq?nP80G3O7HtbsRI*{hh$Voce!oak3_85##T0ZW65z5pNL-HBD*8ypTta0ZU> zvN9g!EKemJ7Cme@=;0Nf74o~z4V_D!R?^i}NrPPKXp;?q_XA4MPnm9CvHu}Ir?XVP z&=8rGe~SKT6(gAxPJVs>EGg$(FA_T&N|8r4bbTP{#neHZ$lz*mxl!t;{`f*SiJ^wy zVMKqR%|p}582^w({)$vVfVue1z`8pr#*-w&74&)ak*g}@Ai1A+5o8?&Kl9jCEP*m+ zv#%emm$|V6D%Z5t-HKv;+m|C!!}O@Jqz0 z7a36BZ5hMdBl*5c;J-g%*QHJp@be;rJLZ zJHoS@R?zam0UjGJ&g?_;2ZZbJ&J}BKCn!=67-7tw^f#d1oUaF#NSIK;&#?^Q^J8fd z^URGd>GpDTr(1$7@50dOKy10-4Z#1VengI15($xf&%b^qF?%==k5y=a#rmFv^9OKH zQC6P=APdL-q*ECauV2e@s#9lN@n_zmBd#wVvA&}QyuOU;By4as-WM@uB%OR$nLi#K z4vv|;+?yjN?{KLrZd{ct?JYbDe}2MrAa&qw4ovOAX-(@s0_I#| z=(b`x^>p4`UCXJFyvE}~;a`us4Y&LLF1clk!U+^=rL zoC~!ncUc{*`H?^D8$xtf+uu1R`}1jSHV(}fG0(*=0=&`T$JH$e4yCM@zhU+@at78L z3d-|ZD-y|KS5Zx0%hsBNL(?Pidr@m7PSK(Q|)we0df0Ya;nfNp+%_< zcZIt1&~&v-75xDTDk-gcw?d##rrkm;v_}G`eFQ+1<~cNniTyrXYD-*axGupmG!>{Sh%I!QBuI0Od^m7Ebz7zW5OK-SA#l>wp4?vR` z87Rg|%pfAL(I*qDqAf@0vY8di7Mz@qdeIIG7qk=*CBO={^(DG=qd7oZ9gSFEOk&l$ zIFI5xuJ_tUfLKSo&G0;55L+Pa{i1~4IVg%g&#)BJ2o}dKzLRCq77jj6!w=RqFB|xK zfNJ7zZ>dh-viZj&7qR6lh2V#c9$5QwUvTE7u({M5e-Hh}6g)VtPNoDrGgM>Q5^*DN zggZHX@k&YTL`f_%;j8*m##9V=?t!LK3pUeSynYOHbknO8x7@ixs6J#$P%T;F=?+w7 zT$soPtGlPWv|p;ts+R=4=8o%k!lPX0Zr53cx-SgU(LRG)NCy<3k6x?xJi&7_jr>w4 zGqg7$7|6WQ(DKr4?@Q5UpW5ZtBu*#brxTBtN~m0+NCS=u$6b2hQ_?4xX)K3#5dcOB zD8Z{mx_-3M5L@+Dte)GT-SWPg3fqt-V>4?fGkf`)Ni%G?900?aY=~?)t~lUq!#dPo=fLax(gyBT`{g;0Ydrue zeT!EdcEvjikhncF<4^Q0kRM3e<%F+@p1IcliiQ3%3wv)YtXzrnu!Cz|5Ap&t*M2;J zBuyig#RyUN-v{fbk3_8J&Cl;X?630_Yv*YBY+?T+Q4&`Bmz&yO#tTgv3M~i5I%|ij z3j_8VK=dKHWj~G^JN5Btmck{b& zBEk*Vee&Ck5JZ2nDkqr@r_la?aU}bnM$i8m!Wor%5F*c~2I1?2YJ$=6lnz+dRptR) ze64@P8XpgW&%R2oqWHMy-lR}!KiNVKk141xn>Q?Uc<{NgsZN>X;YLdnUO-Z>-a&B- zPWPrQqu1@-Jt^=o`I^ee#rzCusxoR#0tSCSfe6Gao-*?v_=J2pDL z&n)W;T(Dx3v`VtoVoB&#w6hrCd|tn^gE(3r<1<6})pzF_q+z(Xy}FK8kn#o1`h%l0 z$@EjaJ)NKZroVCnT^e-Xz2A~FZNhmgQ=e>KrpbaN9$+7&KpW>RPN?8%PalfocHl$i z2jOoHCa}^Y6(_hi>3O-*zt)If1svVyqv@7YRZ-H<*|V>0x<6HXX0NAAmHq1^#{VdN zk|yl2Fi1 zs}fLw+-4Cyl=B5Bn3Si9JU0rH`km9>)2Nw0!6RU-bp0Hgu7^R%#H;&+(1d8|_O%#q zZqYNUE{5gZ!lWoHRzU=yl4ONBLLCl^Tzx$E6h=s&8rrfDabT4YMcFse(nnDZ)$2)Q zdk9%UOjNs|f%dxcdgijyx`D9sSe|&q4{l6v-P3Dq0NXF>n(#_@DxS1h_m&ThB>?p| zS{i#E>x$H!lO`wNML(Bwt<->(=m$U=@=Q+gDTHjdv+^)+k@WaVP$x#M#eUcJmCr5( z4!6G3+ZasDC#KWKF|eEuoN@5o%($#3?bN_01OGL)7%`(n1@QmlVv4t4M#t>2eLXjn`w1Zc7*Zd`4aMlU2-{~ zpVYtuptoL7A?YBZtDjg{;WY*?hVq?R$O_mwpo$|5%NXHjp1nmy(wGPvxsRaCaVRonCl56L z!m%f{1Q1cToBIPE+;2;5y<*bTMO9T#N{FK}*FTc;gy_~sa#UdQEz^4O|N z5~T&BCGUe7AXhh!zI%h0KgcQ@7l4Uc+C@osu8nFHKLfB2cb|#XHbse72~pPUopO?g z)tu^8OK3EFGM@c*Mbqd@R520|ATTd1r?rToEDDEZEAqYPi0f0}_f_KUN)<>;eRtWV zuu9G#&tb$TU-|eN9TLqaIhf!^4u~81Bp^O+3wFUSRN`A^_ceK(e z;IQpy===fza8gu7SK4OJq?oq+?T_J7rTFNt0!NIl!V#J3@1BZT(pjg3=NbLj z4pEjNNIUAMLt1Y(Tl#*|D%>1EDb)kKlM=FrH2E5+OL1z8mR7|lgRyYBU;f7h(oik= zH$QTQudh=gtkz4#zIh|;x9r8*ee28s5qPRsmmw(Z>h2e;M66ex1eCAX4DX@g=-tct zuW;xAo`w{>#-D8vJ2$ir#a=G|SupVvXlKp~s$OXqDl5Wi6Z8JodqMfN8vf`cv>`AO zl)^ooFkkuZ)^a-5&iGzf>II&TEBxT9HB+xPXlCsd{v~oju8=D}MG;C+`wBbH6tcae zIZGv)7eP>q*CKkb0fKcERzsR&Sppg$Mr8SFdfl{68%RQaM3~dylXg7G&=oKj+~0Eu zcoO;$#M`@I(%JP1C-S85FVv>p#fyc1Lz(g9hhn^-MxzFSO4wMoT*N@CsM`#MJmj8!_5;y_s0`JB{?sC`aZtSOd3UwUi5_9MLQAbY1XfK)W7}6tsh7$vpv5D$c+&qMnx9>_8(|PEJoA#ZB6V(|ah7rxc#R$u z6Q7>3N};#rfTx+lYbm!t;n%rZ!CwP5bpReTgOqmPsSL2_*AlXv%8nlK?<($eAO>K+ zNvVZ+;sEoN{c<7ZOZ;Iv3p|<4_pTX7`D+r8eGXx@RNaDwLpOnt5%^A#3VFFTtk2kV zi{_cUBz4uuignyc8tIEVrIz+?{I$)6&h?t-eLVCW931Eh6@0y@?*5kbeoL6}qk)n(U!JcI8I}w_Rscev3Ew`!62gvZUYDwV{B{H6!{=IA{nF4+rLF^H z-RebpT(e%|b~`T~|9^B%vJz#APV3Pp8S3y~OP-U>3Ho?tZ`pmi9n}gMzvFsKV6rn4 zedpOcvEzw!UI)Vi#I(Hb5pg*4{x zvT0TZQKmjLh3muir$C^jsnjo}L{(EFr^JU(OYjW_CfoRT`|5ipXkV?+SExIDYsnQg z3K&g>*W>I@Qq$%@01Cb_7xQH)LR9U`gO02}Fu{Y*7vlJhMrU7b8@mU+d5RK7+N7vwQ z>_`2>%AawZ8)`gqZJFrFS^r0kiDddKfi;vY7-iIp&kZ21VIYz{TAlH|#K5t)f`*&(uR5wd_p|5qyiyGZ(bjxCH}+4aY&#@lpNb-Mn0_ zdWRGrlTBXfTDhEvNg9_OWz^{hfYOMHRst9!vm6|kRLQZ?J*gW1WR8bAgd9rU>uwaS zARhjMX^&+|l2gMhz>p7ZR@c;UWOb&mn-G>oBgr1i-TryhYQ!}dZ7;^LmY?}`5a2h7 zb^9pSQ`lwd%`%i6y~TxTHXTQ63=3Zv9bJKEK$nrP{sSlLgIdo9fcM+%R6 zU+?!7%_s(J*LJS>-31;n=%vV{Jz2{k$5Q}huE+%8UtvJMs-|U9Fs)dhfnG@q;FPEf;~mskX=- zfGg@(r}OeP0BypsR&9m|z^K*hQLhOD4rE4#5=W-yg~Ve4kkni8qeWxU&}#M!TNi{M z!baRd1@Zs1ccxKIW!u^=EiI%(u|&W^kOEOux)P*Nx=;rZlqLd7Kw4=K`5puxp~$niLhHe-f8+^QXTg+uXZcv9G(R0#ty%^K!SPq`GWi^ z=aN&1PSfVq>0WJ9+plwH;nwlH_sT5|;N@{rq2|-utKCp^c&+#~g%^+G!RRmV@5mkzM0T|e0TaxeuOd$VvQs8q`$O}CKXs0OoV0OiY_iGhm| zvMOd?2|Ejq_R6@~e5$FF0sHyu^RjBcjsZO}*`UU%mT)p@b0p8BAR{9!FlOh$8K0uF zo(sFvc%{MA-XVN?S?~~ss~~>x;o)fm?Y?3|`J}Lzm1rD@cSYB3lf#o+^D8`SwQ{a0 z8H^$B)g9}16&%^LYm{ z^YQbe#a6*I*+GYf$A9SG@_uX$1&z8qfe@BiM#3e2P^XOe{g2x#}5H zpinn{4v1iZJJ>LJt8V+|ydknX(977UDQ5DoGSX(%T5>cFR-JT&SvJ4_ zTMxRVYM<)&qNwsQo^1S|OeT}o|a z?fTUe8w4r~-#D?$+MWse?+^`9i!e}wN*J!#Cft!3n~i;89DfNrk?DKE;n38_c^E<*LK&72{JB+S9?YSoLpRi1KNbzO%VK|EW1z54IThwLbc4&4 zB|_uwpuJaBcJ69C@r!AB=^;$xYwK6Zt+#))`6pZmXK^Ls|9AbF#Q{~5pkb=^$#?N# z@pH$6xU$osgDCt&A@)%?h)*8HW*;|u1_3S+l44zxPx%Sp_#XD7ZcEI~snpI>#5upq z*dLox2L2gk{LJb^c zkxt^OLrClIYjXLs&AJU+D_pb-a;5+(5Aa57r80KL>?VNoEGmXp(`r8l`cZ(eW19aJ zY6;+xmd8fj-^4D0D^#=8o#k6cZ5NZ^%`lR|4RnnFRN%@fijGS)|HwD^iP5ycZ*7Q+ zIi>pXdd=4=@0B^26PnY1Ea|sy+F)!FHK+oWi(adLw9?2XB%#^ma6xdeC`E9RgT(>W zp(VYR`JqTaD7LNUOh$aju~bH}aDbB|teRawOm7cc5h0tOxfcmU*30q?cVegFJ`l~3oKc^tyKEBqW0xZ2 z>bFsaslhzY-C8FE5t;<|5u>Iq#(XgWrU(#V1nL~DgfhA;S+H1Q?Ih)%rJv)b^c(k@ zh7;9vaivN5$YND&rLq2Dtc1_q)hgx#yjE9v^LAV2UhR4Z@nUrpFIJM)f$nzs^rzc{ zgLa;`r?uXo%9A1Ko;no`vCnL(%i2d*M0dg%QyGUw3B=Nqh|`Ix;%OAwb`P^O;OH;u zM#|bUYj9aEWOK@vgBh#nS*-p>$bH)4%j;KjIn{9e_0m@t91LH6niD@`TXlo%7+(kI7dv&*d{ft#MIXFMk-`s zZc&b59hnglhT<`_fH54;b>Dt#`)1N0=a1%lwIv7IZ zCQY`+i5kg$=bUiugneJ)TwAKHnBN5;x*F!#y{^oAkF>w|hiv=_P)J{YIWkfpSgv6P zgd#_qs5PTvXca)3+J*(?dzCk{i*wqw{G>bTa4VW047qQU#MJ5r*O0p5cfNc?l!xht zt3PK+>8s*qetU(qYoZH>QMUQ>t4jdy3XPB{Mo6&!8DQW^c`856qA?%FQZ!M|^hfPKbv-~V3f4|## zWaQXBKn_v?B#@3ip{jVzb;3MuxB11%T^a#mEf!=ha|$rR!^W!@)8^unA(3Z@T!HeW zR^qxSPcH621xc8$>=Ct54(&jwIb#bOK4%67%}Qw}LvcD`mLFWv!+qqiQtZ4dYW61gk&UQpkULM>Y>l+iOjldmh38^R(@i)XKD^@^G^@;WlpXs$9Q^UtHmcR#Tm zx~CxgwGE69U!SgzmiLTZo~aUb9Ke(^)|Hrd8Q=hbrc?YGTGp9tTF)rT^m;(@My}u1 zYFKZCOpAG7*QC~B=Bu+0;$KG0OR9k0|LRqI}=e$88?Vs^*1h8Zk~m_G*yyx%KsB{ zn?{s~o?0#~J%jvOV~H0j&cNIdu4kA_#}{Q-n~Iml`_-KNs?SER%)2fV*+rsLi4^2l z_9CQf6R?2c)GP?J2T*i$O`P37RGJbQ>K_c3|FWQXHY0~8ES0y>YvpheezQ$l1dFkp z^ppiuuX{8?lXC1A4Nntpv(AGe7LwodqBo7nTL7>uRRGIE$l$Haq#?BW`+=DJ8cMu)@K*hULI;oNy59VNLeYgKb6|g_6h507=iotO zZ=XT(XSOTAr8w4R_+=;tFb0>#n}Wj@h`fXN(12rWd*WrFMO;3Q;n}<;WEH7oCsZ2Bz=BG14Nlj7~qQe;O(k-`Hun&zoD@0=(@obuiXOmyXc>d^XUuv4| zVBzCZ?&*C#8Tga%P5DbBlGvh+1)ubMqeCVxuOu|)NxVMzr&Hig+?+YTB zaTE`@<*|amwhUzO2l4%;eG@9_WDIAn>&ck{+oh5CqzCTN`kaXf3d!K9s%97bsaKzH z$`P9F6{X*jYANwvz=C0pm`O4L{6Drxa7nyPD^_XuCR3w$LRAz{Uo$- z3{L*G@&Fnv4T_Q;p~EJxJUtIz)9Ly28$RXBoDbAZbiT9e)LUW~fYmY}x?s$KSgkSt zmV5gV*QAn^^`Zrg!x(jE6|J@f@7RskEVQcn(@6g{`bR+h##RO`yRn^GKqp00lYOH^I4r~xob`g|+P#cRCuG>Zaq zoWdM*qTw8dX9y8`oio6<*56!!-7ONv7+w2}KXt(XkFvMrSX4@cw}@_O;qTnM6>sY=+iO zCiR5F$8Hx+?}zUh{hcJ?)a=-$52Fhzg|;}A74=-g$5e`aGrr5D@`Qp4YxV|xBU<*& zF@_)K`GbIx@-i4I4Gdc+e-tNa{S6oIqiWmh#{^A>-a9%ky=-&035bK#14% zJi=`z9yVY%H7$`85c{3eREp$(vtGO+40v+$Y< ztcW4Yr*972r#~3&vAi~E#L0^{>IpbsXEcc(ZTHD|;~djIMUL5yjNcIy%WlGY(ck80io?Y&W@tSn}ktq38 z1Qie{SZV;11QDb{ku(_*uT)tu*D}4TSm{LhF6b-?34UukYNbIQ1ly$Kg75YRU#a#M z|IDuVHQ%`mAnzY7BxoWkX)&G>O2{#ld1PEn7blGsAqprY&6fCIa-Q_#)#}Ob8*06?Lu40zqoZd~d zdp&G)yvuO8dNB#4^ECg^Q9@(HqauPIY;yI2@!hB^ak_n2v^2w!DU#`Q1ypGvzNfOnccz)I8S1rj4}j} zBE}*48W^JSgDI0{>CFeMA*6z`0tfROC_0;-#qi#L5z*a^n8c4Yt<()dlqiD{Z;^0q zdH#t(TsNlcEncRbI8NB$StVydcz}s3U#gBXk~LnTA9Q1A!Klu-(XBQ zA{jf=nXURfla^9e5dw|;(7@Ia`mYD?i%lS7P1|ULW9l1T7PQFL9hhwj9JS~wLP<#| z^Y4qEn09STsv|dAI>9!FT@=TqapxFM(>#C~9`__p0EmV!%s|;AU;)HhQE%$ku1g`} zSbB_?lr?mReJP_;-#I3sZeyeZA;=HViHSUXP}6in669i%BX&m1>&#wK&<(XGkWYbh5R&{ zR&}(Db=8^gtxb59!nOLFWnnd5gC!H?3<+(rXBO>-Kiii!6?PRdz?^ld}&;^18c^uPE@R@6p&{$0gigFKR`amU-^X zbL<4-f?bQ{^=0+{OI51>;X3)h@?qk?r|Eyo + + + +Utils + + + + + + + + + + +

+
+ +
+

Utils

+
+ + + + + + +
+
+
+
+
+ + +
+
+
+
+
+ + +
+
+
+ +
+ +
+ + \ No newline at end of file diff --git a/Doc/js/abldoc-functions.js b/Doc/js/abldoc-functions.js new file mode 100644 index 0000000..f6064fc --- /dev/null +++ b/Doc/js/abldoc-functions.js @@ -0,0 +1,355 @@ + +$(document) + .ready( + function() { + //mark each node with child and parent classes + $('.tree li').each( + function() { + if ($(this).children('ul').length > 0) { + $(this).addClass('parent'); + } else { + $(this).addClass('child'); + + } + $(this).addClass('show'); + var padding = 16 * $(this).parents(".tree li").length; + $(this).children("a").first().css("margin-left", padding); + }); + /*node click listeners*/ + $('.tree li.child > a').click(function() { + $(this).selectNode(); + $(this).updateSlimScroll(); + }); + $('.tree li.parent > a').click(function() { + $(this).parent().toggleClass('active'); + $(this).parent().children('ul').slideToggle('fast'); + $(this).selectNode(); + $(this).updateSlimScroll(); + }); + /*Selects the node, updates the bg color and opens the link in the frame*/ + $.fn.extend({ + selectNode : function() { + curSelection.children("div").first().css("background-color", ""); + curSelection.children("a").first().css('color','#54565B'); + curSelection = $(this).parent(); + $(this).prev().css("background-color", "#54565B"); + $(this).css("color", "white"); + $("#myFrame").attr("src", $(this).attr("href")); + } + + }); + /*toggle all, not used for now*/ + $('#all').click(function() { + + $('.tree li').each(function() { + $(this).toggleClass('active'); + $(this).children('ul').slideToggle('fast'); + + }); + }); + + /* click event for menu icon, toggles the tree view. */ + $(' #toggleLeft ').click(function() { + $(' #treeDiv ').toggle(); + if ($(' #treeDiv ').is(":visible")) { + $('#main').css("left", "275px"); + } else { + $('#main').css("left", "5px"); + } + }); + + /*Selects the previous file*/ + $(' #goLeft ').click( + function() { + var prevSibling = curSelection.prev("li.show"); + if (prevSibling.length != 0) { + if (prevSibling.hasClass("parent")) { + // special case + var curNode = prevSibling.goToPrevNode(); + curNode.parents("li").each( + function() { + $(this).children("a") + .first() + .navigateToNode(); + }); + curNode.children("a").first() + .navigateToNode(); + curNode.children("a").first() + .selectNode(); + } else if (prevSibling.hasClass("child")) { + var curNode = prevSibling; + curNode.children("a").first() + .navigateToNode(); + curNode.children("a").first() + .selectNode(); + } + } else { + // reached end of the child nodes, + // go to parent folder node + var parent = curSelection.closest( + "ul").closest("li.show"); + if (parent.length == 0) { + // reached start, go to the end + var lastParent = $(".tree li.parent.show").last(); + var curNode = lastParent + .goToPrevNode(); + curNode.parents("li").each( + function() { + $(this).children("a") + .first() + .navigateToNode(); + }); + curNode.children("a").first() + .navigateToNode(); + curNode.children("a").first() + .selectNode(); + } else { + var curNode = parent; + curNode.children("a").first() + .navigateToNode(); + curNode.children("a").first() + .selectNode(); + } + } + }); + + /*Selects the next file in the tree view*/ + $(' #goRight ').click( + function() { + if (curSelection.hasClass("parent")) { + if (!curSelection + .hasClass("active")) { + curSelection + .toggleClass('active'); + curSelection.children('ul') + .slideDown('fast'); + } + var child = curSelection.find("li.show") + .first(); + if (child.length == 0) { + // a folder must have children + // this is an unlikely case + } else { + + child.children("a").first() + .navigateToNode(); + child.children("a").first() + .selectNode(); + } + } else if (curSelection + .hasClass("child")) { + var childSibling = curSelection + .next("li.show"); + if (childSibling.length == 0) { + var parSibling = curSelection + .goToNextParent(); + if (typeof parSibling == "undefined" + || parSibling.length == 0) { + // reached end, go to start + var startNode = $( + ".tree li.show").first(); + startNode.children("a") + .first() + .navigateToNode(); + startNode.children("a") + .first() + .selectNode(); + } else { + + parSibling.children("a") + .first() + .navigateToNode(); + parSibling.children("a") + .first() + .selectNode(); + } + } else { + + childSibling.children("a") + .first() + .navigateToNode(); + childSibling.children("a") + .first().selectNode(); + } + } + + }); + /*Recursively finds the next node, + used when previous file link in the toolbar is clicked*/ + $.fn.extend({ + goToNextParent : function() { + var parent = $(this).closest("ul").closest("li.show"); + if (parent.length == 0) { + // hit the end + return parentSibling; + } + // get parents sibling + var parentSibling = parent.next("li.show"); + if (parentSibling.length != 0) { + return parentSibling; + } + return parent.goToNextParent(); + } + + }); + + /*Recursively finds the previous parent, + used when previous file link in the toolbar is clicked*/ + $.fn.extend({ + goToPrevNode : function() { + var lastChild = $(this).children("ul").first() + .children("li.show").last(); + if (lastChild.hasClass("parent")) { + // recursively go thru the folders till child + // node is found + return lastChild.goToPrevNode(); + } else { + + return lastChild; + } + } + + }); + /*Reveals the node*/ + $.fn.extend({ + navigateToNode : function() { + $(this).parent().toggleClass('active'); + $(this).parent().children('ul').slideDown('fast'); + } + + }); + + /*Handles on hover color change of bg and text*/ + $(".tree a").hover(function() { + if (!$(this).parent().is(curSelection)) { + $(this).prev().css({ + "background-color" : "#F0F0F3" + }); + //$(this).prev().addClass("hover-bg"); + $(this).css({ + "color" : "#D3461E" + }); + } + + }, function() { + if (!$(this).parent().is(curSelection)) { + $(this).css({ + "color" : "#54565B" + }); + $(this).prev().css({ + "background-color" : "" + }); + } + + }); + + //reveal the first node of the tree view. + $.fn.extend({ + revealFirstNode : function() { + curSelection = $('.tree li.parent').first(); + if (curSelection.length != 0) { + curSelection.children("a").first().navigateToNode(); + } + } + + }); + + $.fn.extend({ + collapseAllNodes : function() { + $(".tree li.parent").each(function() { + $(this).removeClass('active'); + $(this).children('ul').slideUp('fast'); + }); + } + + }); + /* handles search */ + $("#searchBox").keyup(function(){ + + if($(this).val() == ''){ + $(".tree li").each(function() { + $(this).addClass('show'); + $(this).show(); + }); + $(this).collapseAllNodes(); + $(this).revealFirstNode(); + }else{ + + var searchVal = "^".concat($(this).val()); + //replace all *(wildcards) with [a-zA-Z]* + searchVal = searchVal.replace(/\*/g, "(.)*"); + //replace all ? with [a-zA-Z]? + searchVal = searchVal.replace(/\?/g,"(.)?"); + //escape period from search string + //searchVal = searchVal.replace(/\./g,"\."); + var searchRegExp = new RegExp(searchVal,'i'); + $(".tree li.child").each(function(){ + var nodeText = $(this).children("a").first().text(); + var valid = searchRegExp.test(nodeText); + if(!valid){ + $(this).removeClass('show'); + $(this).hide(); + //will go through all the parents and hides the parent if there are no + // showable child nodes + $(this).parents('li.parent').each(function(){ + var fileNodes = $(this).find('li.show.child'); + if( fileNodes.length == 0 ){ + $(this).hide(); + $(this).removeClass('show'); + } + }); + }else{ + $(this).addClass('show'); + $(this).show(); + $(this).children('a').first().navigateToNode(); + $(this).parents(' li.parent').each(function(){ + $(this).children("a").first().navigateToNode(); + $(this).show(); + $(this).addClass('show'); + }); + } + + }); + } + + + + + + }); + + /*Updates the scroll on each click*/ + $.fn.extend({ + updateSlimScroll : function() { + $("#side").slimscroll({height : 'auto'}); + $("#side").slimscrollH({height : 'auto'}); + $('#side').css('height','98%'); + + } + + }); + + + + //initialise vertical slim scroll + $('#side').slimscroll({ + height : 'auto', + wheelStep : 2, + disableFadeOut : true, + distance : 5 + }); + //initialise horizontal slim scroll + $('#side').slimscrollH({ + height : 'auto', + size : 8, + disableFadeOut : true, + distance : 5 + + }); + //set current selection to first node + var curSelection = $('.tree li.parent').first(); + $(this).revealFirstNode(); + $('#side').css('height','98%'); + + }); + diff --git a/Doc/js/jquery-1.11.2.js b/Doc/js/jquery-1.11.2.js new file mode 100644 index 0000000..1c3aa82 --- /dev/null +++ b/Doc/js/jquery-1.11.2.js @@ -0,0 +1,10346 @@ +/*! + * jQuery JavaScript Library v1.11.2 + * http://jquery.com/ + * + * Includes Sizzle.js + * http://sizzlejs.com/ + * + * Copyright 2005, 2014 jQuery Foundation, Inc. and other contributors + * Released under the MIT license + * http://jquery.org/license + * + * Date: 2014-12-17T15:27Z + */ + +(function( global, factory ) { + + if ( typeof module === "object" && typeof module.exports === "object" ) { + // For CommonJS and CommonJS-like environments where a proper window is present, + // execute the factory and get jQuery + // For environments that do not inherently posses a window with a document + // (such as Node.js), expose a jQuery-making factory as module.exports + // This accentuates the need for the creation of a real window + // e.g. var jQuery = require("jquery")(window); + // See ticket #14549 for more info + module.exports = global.document ? + factory( global, true ) : + function( w ) { + if ( !w.document ) { + throw new Error( "jQuery requires a window with a document" ); + } + return factory( w ); + }; + } else { + factory( global ); + } + +// Pass this if window is not defined yet +}(typeof window !== "undefined" ? window : this, function( window, noGlobal ) { + +// Can't do this because several apps including ASP.NET trace +// the stack via arguments.caller.callee and Firefox dies if +// you try to trace through "use strict" call chains. (#13335) +// Support: Firefox 18+ +// + +var deletedIds = []; + +var slice = deletedIds.slice; + +var concat = deletedIds.concat; + +var push = deletedIds.push; + +var indexOf = deletedIds.indexOf; + +var class2type = {}; + +var toString = class2type.toString; + +var hasOwn = class2type.hasOwnProperty; + +var support = {}; + + + +var + version = "1.11.2", + + // Define a local copy of jQuery + jQuery = function( selector, context ) { + // The jQuery object is actually just the init constructor 'enhanced' + // Need init if jQuery is called (just allow error to be thrown if not included) + return new jQuery.fn.init( selector, context ); + }, + + // Support: Android<4.1, IE<9 + // Make sure we trim BOM and NBSP + rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, + + // Matches dashed string for camelizing + rmsPrefix = /^-ms-/, + rdashAlpha = /-([\da-z])/gi, + + // Used by jQuery.camelCase as callback to replace() + fcamelCase = function( all, letter ) { + return letter.toUpperCase(); + }; + +jQuery.fn = jQuery.prototype = { + // The current version of jQuery being used + jquery: version, + + constructor: jQuery, + + // Start with an empty selector + selector: "", + + // The default length of a jQuery object is 0 + length: 0, + + toArray: function() { + return slice.call( this ); + }, + + // Get the Nth element in the matched element set OR + // Get the whole matched element set as a clean array + get: function( num ) { + return num != null ? + + // Return just the one element from the set + ( num < 0 ? this[ num + this.length ] : this[ num ] ) : + + // Return all the elements in a clean array + slice.call( this ); + }, + + // Take an array of elements and push it onto the stack + // (returning the new matched element set) + pushStack: function( elems ) { + + // Build a new jQuery matched element set + var ret = jQuery.merge( this.constructor(), elems ); + + // Add the old object onto the stack (as a reference) + ret.prevObject = this; + ret.context = this.context; + + // Return the newly-formed element set + return ret; + }, + + // Execute a callback for every element in the matched set. + // (You can seed the arguments with an array of args, but this is + // only used internally.) + each: function( callback, args ) { + return jQuery.each( this, callback, args ); + }, + + map: function( callback ) { + return this.pushStack( jQuery.map(this, function( elem, i ) { + return callback.call( elem, i, elem ); + })); + }, + + slice: function() { + return this.pushStack( slice.apply( this, arguments ) ); + }, + + first: function() { + return this.eq( 0 ); + }, + + last: function() { + return this.eq( -1 ); + }, + + eq: function( i ) { + var len = this.length, + j = +i + ( i < 0 ? len : 0 ); + return this.pushStack( j >= 0 && j < len ? [ this[j] ] : [] ); + }, + + end: function() { + return this.prevObject || this.constructor(null); + }, + + // For internal use only. + // Behaves like an Array's method, not like a jQuery method. + push: push, + sort: deletedIds.sort, + splice: deletedIds.splice +}; + +jQuery.extend = jQuery.fn.extend = function() { + var src, copyIsArray, copy, name, options, clone, + target = arguments[0] || {}, + i = 1, + length = arguments.length, + deep = false; + + // Handle a deep copy situation + if ( typeof target === "boolean" ) { + deep = target; + + // skip the boolean and the target + target = arguments[ i ] || {}; + i++; + } + + // Handle case when target is a string or something (possible in deep copy) + if ( typeof target !== "object" && !jQuery.isFunction(target) ) { + target = {}; + } + + // extend jQuery itself if only one argument is passed + if ( i === length ) { + target = this; + i--; + } + + for ( ; i < length; i++ ) { + // Only deal with non-null/undefined values + if ( (options = arguments[ i ]) != null ) { + // Extend the base object + for ( name in options ) { + src = target[ name ]; + copy = options[ name ]; + + // Prevent never-ending loop + if ( target === copy ) { + continue; + } + + // Recurse if we're merging plain objects or arrays + if ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) { + if ( copyIsArray ) { + copyIsArray = false; + clone = src && jQuery.isArray(src) ? src : []; + + } else { + clone = src && jQuery.isPlainObject(src) ? src : {}; + } + + // Never move original objects, clone them + target[ name ] = jQuery.extend( deep, clone, copy ); + + // Don't bring in undefined values + } else if ( copy !== undefined ) { + target[ name ] = copy; + } + } + } + } + + // Return the modified object + return target; +}; + +jQuery.extend({ + // Unique for each copy of jQuery on the page + expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ), + + // Assume jQuery is ready without the ready module + isReady: true, + + error: function( msg ) { + throw new Error( msg ); + }, + + noop: function() {}, + + // See test/unit/core.js for details concerning isFunction. + // Since version 1.3, DOM methods and functions like alert + // aren't supported. They return false on IE (#2968). + isFunction: function( obj ) { + return jQuery.type(obj) === "function"; + }, + + isArray: Array.isArray || function( obj ) { + return jQuery.type(obj) === "array"; + }, + + isWindow: function( obj ) { + /* jshint eqeqeq: false */ + return obj != null && obj == obj.window; + }, + + isNumeric: function( obj ) { + // parseFloat NaNs numeric-cast false positives (null|true|false|"") + // ...but misinterprets leading-number strings, particularly hex literals ("0x...") + // subtraction forces infinities to NaN + // adding 1 corrects loss of precision from parseFloat (#15100) + return !jQuery.isArray( obj ) && (obj - parseFloat( obj ) + 1) >= 0; + }, + + isEmptyObject: function( obj ) { + var name; + for ( name in obj ) { + return false; + } + return true; + }, + + isPlainObject: function( obj ) { + var key; + + // Must be an Object. + // Because of IE, we also have to check the presence of the constructor property. + // Make sure that DOM nodes and window objects don't pass through, as well + if ( !obj || jQuery.type(obj) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) { + return false; + } + + try { + // Not own constructor property must be Object + if ( obj.constructor && + !hasOwn.call(obj, "constructor") && + !hasOwn.call(obj.constructor.prototype, "isPrototypeOf") ) { + return false; + } + } catch ( e ) { + // IE8,9 Will throw exceptions on certain host objects #9897 + return false; + } + + // Support: IE<9 + // Handle iteration over inherited properties before own properties. + if ( support.ownLast ) { + for ( key in obj ) { + return hasOwn.call( obj, key ); + } + } + + // Own properties are enumerated firstly, so to speed up, + // if last one is own, then all properties are own. + for ( key in obj ) {} + + return key === undefined || hasOwn.call( obj, key ); + }, + + type: function( obj ) { + if ( obj == null ) { + return obj + ""; + } + return typeof obj === "object" || typeof obj === "function" ? + class2type[ toString.call(obj) ] || "object" : + typeof obj; + }, + + // Evaluates a script in a global context + // Workarounds based on findings by Jim Driscoll + // http://weblogs.java.net/blog/driscoll/archive/2009/09/08/eval-javascript-global-context + globalEval: function( data ) { + if ( data && jQuery.trim( data ) ) { + // We use execScript on Internet Explorer + // We use an anonymous function so that context is window + // rather than jQuery in Firefox + ( window.execScript || function( data ) { + window[ "eval" ].call( window, data ); + } )( data ); + } + }, + + // Convert dashed to camelCase; used by the css and data modules + // Microsoft forgot to hump their vendor prefix (#9572) + camelCase: function( string ) { + return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase ); + }, + + nodeName: function( elem, name ) { + return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase(); + }, + + // args is for internal usage only + each: function( obj, callback, args ) { + var value, + i = 0, + length = obj.length, + isArray = isArraylike( obj ); + + if ( args ) { + if ( isArray ) { + for ( ; i < length; i++ ) { + value = callback.apply( obj[ i ], args ); + + if ( value === false ) { + break; + } + } + } else { + for ( i in obj ) { + value = callback.apply( obj[ i ], args ); + + if ( value === false ) { + break; + } + } + } + + // A special, fast, case for the most common use of each + } else { + if ( isArray ) { + for ( ; i < length; i++ ) { + value = callback.call( obj[ i ], i, obj[ i ] ); + + if ( value === false ) { + break; + } + } + } else { + for ( i in obj ) { + value = callback.call( obj[ i ], i, obj[ i ] ); + + if ( value === false ) { + break; + } + } + } + } + + return obj; + }, + + // Support: Android<4.1, IE<9 + trim: function( text ) { + return text == null ? + "" : + ( text + "" ).replace( rtrim, "" ); + }, + + // results is for internal usage only + makeArray: function( arr, results ) { + var ret = results || []; + + if ( arr != null ) { + if ( isArraylike( Object(arr) ) ) { + jQuery.merge( ret, + typeof arr === "string" ? + [ arr ] : arr + ); + } else { + push.call( ret, arr ); + } + } + + return ret; + }, + + inArray: function( elem, arr, i ) { + var len; + + if ( arr ) { + if ( indexOf ) { + return indexOf.call( arr, elem, i ); + } + + len = arr.length; + i = i ? i < 0 ? Math.max( 0, len + i ) : i : 0; + + for ( ; i < len; i++ ) { + // Skip accessing in sparse arrays + if ( i in arr && arr[ i ] === elem ) { + return i; + } + } + } + + return -1; + }, + + merge: function( first, second ) { + var len = +second.length, + j = 0, + i = first.length; + + while ( j < len ) { + first[ i++ ] = second[ j++ ]; + } + + // Support: IE<9 + // Workaround casting of .length to NaN on otherwise arraylike objects (e.g., NodeLists) + if ( len !== len ) { + while ( second[j] !== undefined ) { + first[ i++ ] = second[ j++ ]; + } + } + + first.length = i; + + return first; + }, + + grep: function( elems, callback, invert ) { + var callbackInverse, + matches = [], + i = 0, + length = elems.length, + callbackExpect = !invert; + + // Go through the array, only saving the items + // that pass the validator function + for ( ; i < length; i++ ) { + callbackInverse = !callback( elems[ i ], i ); + if ( callbackInverse !== callbackExpect ) { + matches.push( elems[ i ] ); + } + } + + return matches; + }, + + // arg is for internal usage only + map: function( elems, callback, arg ) { + var value, + i = 0, + length = elems.length, + isArray = isArraylike( elems ), + ret = []; + + // Go through the array, translating each of the items to their new values + if ( isArray ) { + for ( ; i < length; i++ ) { + value = callback( elems[ i ], i, arg ); + + if ( value != null ) { + ret.push( value ); + } + } + + // Go through every key on the object, + } else { + for ( i in elems ) { + value = callback( elems[ i ], i, arg ); + + if ( value != null ) { + ret.push( value ); + } + } + } + + // Flatten any nested arrays + return concat.apply( [], ret ); + }, + + // A global GUID counter for objects + guid: 1, + + // Bind a function to a context, optionally partially applying any + // arguments. + proxy: function( fn, context ) { + var args, proxy, tmp; + + if ( typeof context === "string" ) { + tmp = fn[ context ]; + context = fn; + fn = tmp; + } + + // Quick check to determine if target is callable, in the spec + // this throws a TypeError, but we will just return undefined. + if ( !jQuery.isFunction( fn ) ) { + return undefined; + } + + // Simulated bind + args = slice.call( arguments, 2 ); + proxy = function() { + return fn.apply( context || this, args.concat( slice.call( arguments ) ) ); + }; + + // Set the guid of unique handler to the same of original handler, so it can be removed + proxy.guid = fn.guid = fn.guid || jQuery.guid++; + + return proxy; + }, + + now: function() { + return +( new Date() ); + }, + + // jQuery.support is not used in Core but other projects attach their + // properties to it so it needs to exist. + support: support +}); + +// Populate the class2type map +jQuery.each("Boolean Number String Function Array Date RegExp Object Error".split(" "), function(i, name) { + class2type[ "[object " + name + "]" ] = name.toLowerCase(); +}); + +function isArraylike( obj ) { + var length = obj.length, + type = jQuery.type( obj ); + + if ( type === "function" || jQuery.isWindow( obj ) ) { + return false; + } + + if ( obj.nodeType === 1 && length ) { + return true; + } + + return type === "array" || length === 0 || + typeof length === "number" && length > 0 && ( length - 1 ) in obj; +} +var Sizzle = +/*! + * Sizzle CSS Selector Engine v2.2.0-pre + * http://sizzlejs.com/ + * + * Copyright 2008, 2014 jQuery Foundation, Inc. and other contributors + * Released under the MIT license + * http://jquery.org/license + * + * Date: 2014-12-16 + */ +(function( window ) { + +var i, + support, + Expr, + getText, + isXML, + tokenize, + compile, + select, + outermostContext, + sortInput, + hasDuplicate, + + // Local document vars + setDocument, + document, + docElem, + documentIsHTML, + rbuggyQSA, + rbuggyMatches, + matches, + contains, + + // Instance-specific data + expando = "sizzle" + 1 * new Date(), + preferredDoc = window.document, + dirruns = 0, + done = 0, + classCache = createCache(), + tokenCache = createCache(), + compilerCache = createCache(), + sortOrder = function( a, b ) { + if ( a === b ) { + hasDuplicate = true; + } + return 0; + }, + + // General-purpose constants + MAX_NEGATIVE = 1 << 31, + + // Instance methods + hasOwn = ({}).hasOwnProperty, + arr = [], + pop = arr.pop, + push_native = arr.push, + push = arr.push, + slice = arr.slice, + // Use a stripped-down indexOf as it's faster than native + // http://jsperf.com/thor-indexof-vs-for/5 + indexOf = function( list, elem ) { + var i = 0, + len = list.length; + for ( ; i < len; i++ ) { + if ( list[i] === elem ) { + return i; + } + } + return -1; + }, + + booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped", + + // Regular expressions + + // Whitespace characters http://www.w3.org/TR/css3-selectors/#whitespace + whitespace = "[\\x20\\t\\r\\n\\f]", + // http://www.w3.org/TR/css3-syntax/#characters + characterEncoding = "(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+", + + // Loosely modeled on CSS identifier characters + // An unquoted value should be a CSS identifier http://www.w3.org/TR/css3-selectors/#attribute-selectors + // Proper syntax: http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier + identifier = characterEncoding.replace( "w", "w#" ), + + // Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors + attributes = "\\[" + whitespace + "*(" + characterEncoding + ")(?:" + whitespace + + // Operator (capture 2) + "*([*^$|!~]?=)" + whitespace + + // "Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]" + "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + whitespace + + "*\\]", + + pseudos = ":(" + characterEncoding + ")(?:\\((" + + // To reduce the number of selectors needing tokenize in the preFilter, prefer arguments: + // 1. quoted (capture 3; capture 4 or capture 5) + "('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" + + // 2. simple (capture 6) + "((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" + + // 3. anything else (capture 2) + ".*" + + ")\\)|)", + + // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter + rwhitespace = new RegExp( whitespace + "+", "g" ), + rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g" ), + + rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ), + rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + "*" ), + + rattributeQuotes = new RegExp( "=" + whitespace + "*([^\\]'\"]*?)" + whitespace + "*\\]", "g" ), + + rpseudo = new RegExp( pseudos ), + ridentifier = new RegExp( "^" + identifier + "$" ), + + matchExpr = { + "ID": new RegExp( "^#(" + characterEncoding + ")" ), + "CLASS": new RegExp( "^\\.(" + characterEncoding + ")" ), + "TAG": new RegExp( "^(" + characterEncoding.replace( "w", "w*" ) + ")" ), + "ATTR": new RegExp( "^" + attributes ), + "PSEUDO": new RegExp( "^" + pseudos ), + "CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + whitespace + + "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace + + "*(\\d+)|))" + whitespace + "*\\)|)", "i" ), + "bool": new RegExp( "^(?:" + booleans + ")$", "i" ), + // For use in libraries implementing .is() + // We use this for POS matching in `select` + "needsContext": new RegExp( "^" + whitespace + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + + whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" ) + }, + + rinputs = /^(?:input|select|textarea|button)$/i, + rheader = /^h\d$/i, + + rnative = /^[^{]+\{\s*\[native \w/, + + // Easily-parseable/retrievable ID or TAG or CLASS selectors + rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/, + + rsibling = /[+~]/, + rescape = /'|\\/g, + + // CSS escapes http://www.w3.org/TR/CSS21/syndata.html#escaped-characters + runescape = new RegExp( "\\\\([\\da-f]{1,6}" + whitespace + "?|(" + whitespace + ")|.)", "ig" ), + funescape = function( _, escaped, escapedWhitespace ) { + var high = "0x" + escaped - 0x10000; + // NaN means non-codepoint + // Support: Firefox<24 + // Workaround erroneous numeric interpretation of +"0x" + return high !== high || escapedWhitespace ? + escaped : + high < 0 ? + // BMP codepoint + String.fromCharCode( high + 0x10000 ) : + // Supplemental Plane codepoint (surrogate pair) + String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 ); + }, + + // Used for iframes + // See setDocument() + // Removing the function wrapper causes a "Permission Denied" + // error in IE + unloadHandler = function() { + setDocument(); + }; + +// Optimize for push.apply( _, NodeList ) +try { + push.apply( + (arr = slice.call( preferredDoc.childNodes )), + preferredDoc.childNodes + ); + // Support: Android<4.0 + // Detect silently failing push.apply + arr[ preferredDoc.childNodes.length ].nodeType; +} catch ( e ) { + push = { apply: arr.length ? + + // Leverage slice if possible + function( target, els ) { + push_native.apply( target, slice.call(els) ); + } : + + // Support: IE<9 + // Otherwise append directly + function( target, els ) { + var j = target.length, + i = 0; + // Can't trust NodeList.length + while ( (target[j++] = els[i++]) ) {} + target.length = j - 1; + } + }; +} + +function Sizzle( selector, context, results, seed ) { + var match, elem, m, nodeType, + // QSA vars + i, groups, old, nid, newContext, newSelector; + + if ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) { + setDocument( context ); + } + + context = context || document; + results = results || []; + nodeType = context.nodeType; + + if ( typeof selector !== "string" || !selector || + nodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) { + + return results; + } + + if ( !seed && documentIsHTML ) { + + // Try to shortcut find operations when possible (e.g., not under DocumentFragment) + if ( nodeType !== 11 && (match = rquickExpr.exec( selector )) ) { + // Speed-up: Sizzle("#ID") + if ( (m = match[1]) ) { + if ( nodeType === 9 ) { + elem = context.getElementById( m ); + // Check parentNode to catch when Blackberry 4.6 returns + // nodes that are no longer in the document (jQuery #6963) + if ( elem && elem.parentNode ) { + // Handle the case where IE, Opera, and Webkit return items + // by name instead of ID + if ( elem.id === m ) { + results.push( elem ); + return results; + } + } else { + return results; + } + } else { + // Context is not a document + if ( context.ownerDocument && (elem = context.ownerDocument.getElementById( m )) && + contains( context, elem ) && elem.id === m ) { + results.push( elem ); + return results; + } + } + + // Speed-up: Sizzle("TAG") + } else if ( match[2] ) { + push.apply( results, context.getElementsByTagName( selector ) ); + return results; + + // Speed-up: Sizzle(".CLASS") + } else if ( (m = match[3]) && support.getElementsByClassName ) { + push.apply( results, context.getElementsByClassName( m ) ); + return results; + } + } + + // QSA path + if ( support.qsa && (!rbuggyQSA || !rbuggyQSA.test( selector )) ) { + nid = old = expando; + newContext = context; + newSelector = nodeType !== 1 && selector; + + // qSA works strangely on Element-rooted queries + // We can work around this by specifying an extra ID on the root + // and working up from there (Thanks to Andrew Dupont for the technique) + // IE 8 doesn't work on object elements + if ( nodeType === 1 && context.nodeName.toLowerCase() !== "object" ) { + groups = tokenize( selector ); + + if ( (old = context.getAttribute("id")) ) { + nid = old.replace( rescape, "\\$&" ); + } else { + context.setAttribute( "id", nid ); + } + nid = "[id='" + nid + "'] "; + + i = groups.length; + while ( i-- ) { + groups[i] = nid + toSelector( groups[i] ); + } + newContext = rsibling.test( selector ) && testContext( context.parentNode ) || context; + newSelector = groups.join(","); + } + + if ( newSelector ) { + try { + push.apply( results, + newContext.querySelectorAll( newSelector ) + ); + return results; + } catch(qsaError) { + } finally { + if ( !old ) { + context.removeAttribute("id"); + } + } + } + } + } + + // All others + return select( selector.replace( rtrim, "$1" ), context, results, seed ); +} + +/** + * Create key-value caches of limited size + * @returns {Function(string, Object)} Returns the Object data after storing it on itself with + * property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength) + * deleting the oldest entry + */ +function createCache() { + var keys = []; + + function cache( key, value ) { + // Use (key + " ") to avoid collision with native prototype properties (see Issue #157) + if ( keys.push( key + " " ) > Expr.cacheLength ) { + // Only keep the most recent entries + delete cache[ keys.shift() ]; + } + return (cache[ key + " " ] = value); + } + return cache; +} + +/** + * Mark a function for special use by Sizzle + * @param {Function} fn The function to mark + */ +function markFunction( fn ) { + fn[ expando ] = true; + return fn; +} + +/** + * Support testing using an element + * @param {Function} fn Passed the created div and expects a boolean result + */ +function assert( fn ) { + var div = document.createElement("div"); + + try { + return !!fn( div ); + } catch (e) { + return false; + } finally { + // Remove from its parent by default + if ( div.parentNode ) { + div.parentNode.removeChild( div ); + } + // release memory in IE + div = null; + } +} + +/** + * Adds the same handler for all of the specified attrs + * @param {String} attrs Pipe-separated list of attributes + * @param {Function} handler The method that will be applied + */ +function addHandle( attrs, handler ) { + var arr = attrs.split("|"), + i = attrs.length; + + while ( i-- ) { + Expr.attrHandle[ arr[i] ] = handler; + } +} + +/** + * Checks document order of two siblings + * @param {Element} a + * @param {Element} b + * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b + */ +function siblingCheck( a, b ) { + var cur = b && a, + diff = cur && a.nodeType === 1 && b.nodeType === 1 && + ( ~b.sourceIndex || MAX_NEGATIVE ) - + ( ~a.sourceIndex || MAX_NEGATIVE ); + + // Use IE sourceIndex if available on both nodes + if ( diff ) { + return diff; + } + + // Check if b follows a + if ( cur ) { + while ( (cur = cur.nextSibling) ) { + if ( cur === b ) { + return -1; + } + } + } + + return a ? 1 : -1; +} + +/** + * Returns a function to use in pseudos for input types + * @param {String} type + */ +function createInputPseudo( type ) { + return function( elem ) { + var name = elem.nodeName.toLowerCase(); + return name === "input" && elem.type === type; + }; +} + +/** + * Returns a function to use in pseudos for buttons + * @param {String} type + */ +function createButtonPseudo( type ) { + return function( elem ) { + var name = elem.nodeName.toLowerCase(); + return (name === "input" || name === "button") && elem.type === type; + }; +} + +/** + * Returns a function to use in pseudos for positionals + * @param {Function} fn + */ +function createPositionalPseudo( fn ) { + return markFunction(function( argument ) { + argument = +argument; + return markFunction(function( seed, matches ) { + var j, + matchIndexes = fn( [], seed.length, argument ), + i = matchIndexes.length; + + // Match elements found at the specified indexes + while ( i-- ) { + if ( seed[ (j = matchIndexes[i]) ] ) { + seed[j] = !(matches[j] = seed[j]); + } + } + }); + }); +} + +/** + * Checks a node for validity as a Sizzle context + * @param {Element|Object=} context + * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value + */ +function testContext( context ) { + return context && typeof context.getElementsByTagName !== "undefined" && context; +} + +// Expose support vars for convenience +support = Sizzle.support = {}; + +/** + * Detects XML nodes + * @param {Element|Object} elem An element or a document + * @returns {Boolean} True iff elem is a non-HTML XML node + */ +isXML = Sizzle.isXML = function( elem ) { + // documentElement is verified for cases where it doesn't yet exist + // (such as loading iframes in IE - #4833) + var documentElement = elem && (elem.ownerDocument || elem).documentElement; + return documentElement ? documentElement.nodeName !== "HTML" : false; +}; + +/** + * Sets document-related variables once based on the current document + * @param {Element|Object} [doc] An element or document object to use to set the document + * @returns {Object} Returns the current document + */ +setDocument = Sizzle.setDocument = function( node ) { + var hasCompare, parent, + doc = node ? node.ownerDocument || node : preferredDoc; + + // If no document and documentElement is available, return + if ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) { + return document; + } + + // Set our document + document = doc; + docElem = doc.documentElement; + parent = doc.defaultView; + + // Support: IE>8 + // If iframe document is assigned to "document" variable and if iframe has been reloaded, + // IE will throw "permission denied" error when accessing "document" variable, see jQuery #13936 + // IE6-8 do not support the defaultView property so parent will be undefined + if ( parent && parent !== parent.top ) { + // IE11 does not have attachEvent, so all must suffer + if ( parent.addEventListener ) { + parent.addEventListener( "unload", unloadHandler, false ); + } else if ( parent.attachEvent ) { + parent.attachEvent( "onunload", unloadHandler ); + } + } + + /* Support tests + ---------------------------------------------------------------------- */ + documentIsHTML = !isXML( doc ); + + /* Attributes + ---------------------------------------------------------------------- */ + + // Support: IE<8 + // Verify that getAttribute really returns attributes and not properties + // (excepting IE8 booleans) + support.attributes = assert(function( div ) { + div.className = "i"; + return !div.getAttribute("className"); + }); + + /* getElement(s)By* + ---------------------------------------------------------------------- */ + + // Check if getElementsByTagName("*") returns only elements + support.getElementsByTagName = assert(function( div ) { + div.appendChild( doc.createComment("") ); + return !div.getElementsByTagName("*").length; + }); + + // Support: IE<9 + support.getElementsByClassName = rnative.test( doc.getElementsByClassName ); + + // Support: IE<10 + // Check if getElementById returns elements by name + // The broken getElementById methods don't pick up programatically-set names, + // so use a roundabout getElementsByName test + support.getById = assert(function( div ) { + docElem.appendChild( div ).id = expando; + return !doc.getElementsByName || !doc.getElementsByName( expando ).length; + }); + + // ID find and filter + if ( support.getById ) { + Expr.find["ID"] = function( id, context ) { + if ( typeof context.getElementById !== "undefined" && documentIsHTML ) { + var m = context.getElementById( id ); + // Check parentNode to catch when Blackberry 4.6 returns + // nodes that are no longer in the document #6963 + return m && m.parentNode ? [ m ] : []; + } + }; + Expr.filter["ID"] = function( id ) { + var attrId = id.replace( runescape, funescape ); + return function( elem ) { + return elem.getAttribute("id") === attrId; + }; + }; + } else { + // Support: IE6/7 + // getElementById is not reliable as a find shortcut + delete Expr.find["ID"]; + + Expr.filter["ID"] = function( id ) { + var attrId = id.replace( runescape, funescape ); + return function( elem ) { + var node = typeof elem.getAttributeNode !== "undefined" && elem.getAttributeNode("id"); + return node && node.value === attrId; + }; + }; + } + + // Tag + Expr.find["TAG"] = support.getElementsByTagName ? + function( tag, context ) { + if ( typeof context.getElementsByTagName !== "undefined" ) { + return context.getElementsByTagName( tag ); + + // DocumentFragment nodes don't have gEBTN + } else if ( support.qsa ) { + return context.querySelectorAll( tag ); + } + } : + + function( tag, context ) { + var elem, + tmp = [], + i = 0, + // By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too + results = context.getElementsByTagName( tag ); + + // Filter out possible comments + if ( tag === "*" ) { + while ( (elem = results[i++]) ) { + if ( elem.nodeType === 1 ) { + tmp.push( elem ); + } + } + + return tmp; + } + return results; + }; + + // Class + Expr.find["CLASS"] = support.getElementsByClassName && function( className, context ) { + if ( documentIsHTML ) { + return context.getElementsByClassName( className ); + } + }; + + /* QSA/matchesSelector + ---------------------------------------------------------------------- */ + + // QSA and matchesSelector support + + // matchesSelector(:active) reports false when true (IE9/Opera 11.5) + rbuggyMatches = []; + + // qSa(:focus) reports false when true (Chrome 21) + // We allow this because of a bug in IE8/9 that throws an error + // whenever `document.activeElement` is accessed on an iframe + // So, we allow :focus to pass through QSA all the time to avoid the IE error + // See http://bugs.jquery.com/ticket/13378 + rbuggyQSA = []; + + if ( (support.qsa = rnative.test( doc.querySelectorAll )) ) { + // Build QSA regex + // Regex strategy adopted from Diego Perini + assert(function( div ) { + // Select is set to empty string on purpose + // This is to test IE's treatment of not explicitly + // setting a boolean content attribute, + // since its presence should be enough + // http://bugs.jquery.com/ticket/12359 + docElem.appendChild( div ).innerHTML = "" + + ""; + + // Support: IE8, Opera 11-12.16 + // Nothing should be selected when empty strings follow ^= or $= or *= + // The test attribute must be unknown in Opera but "safe" for WinRT + // http://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section + if ( div.querySelectorAll("[msallowcapture^='']").length ) { + rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" ); + } + + // Support: IE8 + // Boolean attributes and "value" are not treated correctly + if ( !div.querySelectorAll("[selected]").length ) { + rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" ); + } + + // Support: Chrome<29, Android<4.2+, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.7+ + if ( !div.querySelectorAll( "[id~=" + expando + "-]" ).length ) { + rbuggyQSA.push("~="); + } + + // Webkit/Opera - :checked should return selected option elements + // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked + // IE8 throws error here and will not see later tests + if ( !div.querySelectorAll(":checked").length ) { + rbuggyQSA.push(":checked"); + } + + // Support: Safari 8+, iOS 8+ + // https://bugs.webkit.org/show_bug.cgi?id=136851 + // In-page `selector#id sibing-combinator selector` fails + if ( !div.querySelectorAll( "a#" + expando + "+*" ).length ) { + rbuggyQSA.push(".#.+[+~]"); + } + }); + + assert(function( div ) { + // Support: Windows 8 Native Apps + // The type and name attributes are restricted during .innerHTML assignment + var input = doc.createElement("input"); + input.setAttribute( "type", "hidden" ); + div.appendChild( input ).setAttribute( "name", "D" ); + + // Support: IE8 + // Enforce case-sensitivity of name attribute + if ( div.querySelectorAll("[name=d]").length ) { + rbuggyQSA.push( "name" + whitespace + "*[*^$|!~]?=" ); + } + + // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled) + // IE8 throws error here and will not see later tests + if ( !div.querySelectorAll(":enabled").length ) { + rbuggyQSA.push( ":enabled", ":disabled" ); + } + + // Opera 10-11 does not throw on post-comma invalid pseudos + div.querySelectorAll("*,:x"); + rbuggyQSA.push(",.*:"); + }); + } + + if ( (support.matchesSelector = rnative.test( (matches = docElem.matches || + docElem.webkitMatchesSelector || + docElem.mozMatchesSelector || + docElem.oMatchesSelector || + docElem.msMatchesSelector) )) ) { + + assert(function( div ) { + // Check to see if it's possible to do matchesSelector + // on a disconnected node (IE 9) + support.disconnectedMatch = matches.call( div, "div" ); + + // This should fail with an exception + // Gecko does not error, returns false instead + matches.call( div, "[s!='']:x" ); + rbuggyMatches.push( "!=", pseudos ); + }); + } + + rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join("|") ); + rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join("|") ); + + /* Contains + ---------------------------------------------------------------------- */ + hasCompare = rnative.test( docElem.compareDocumentPosition ); + + // Element contains another + // Purposefully does not implement inclusive descendent + // As in, an element does not contain itself + contains = hasCompare || rnative.test( docElem.contains ) ? + function( a, b ) { + var adown = a.nodeType === 9 ? a.documentElement : a, + bup = b && b.parentNode; + return a === bup || !!( bup && bup.nodeType === 1 && ( + adown.contains ? + adown.contains( bup ) : + a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16 + )); + } : + function( a, b ) { + if ( b ) { + while ( (b = b.parentNode) ) { + if ( b === a ) { + return true; + } + } + } + return false; + }; + + /* Sorting + ---------------------------------------------------------------------- */ + + // Document order sorting + sortOrder = hasCompare ? + function( a, b ) { + + // Flag for duplicate removal + if ( a === b ) { + hasDuplicate = true; + return 0; + } + + // Sort on method existence if only one input has compareDocumentPosition + var compare = !a.compareDocumentPosition - !b.compareDocumentPosition; + if ( compare ) { + return compare; + } + + // Calculate position if both inputs belong to the same document + compare = ( a.ownerDocument || a ) === ( b.ownerDocument || b ) ? + a.compareDocumentPosition( b ) : + + // Otherwise we know they are disconnected + 1; + + // Disconnected nodes + if ( compare & 1 || + (!support.sortDetached && b.compareDocumentPosition( a ) === compare) ) { + + // Choose the first element that is related to our preferred document + if ( a === doc || a.ownerDocument === preferredDoc && contains(preferredDoc, a) ) { + return -1; + } + if ( b === doc || b.ownerDocument === preferredDoc && contains(preferredDoc, b) ) { + return 1; + } + + // Maintain original order + return sortInput ? + ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : + 0; + } + + return compare & 4 ? -1 : 1; + } : + function( a, b ) { + // Exit early if the nodes are identical + if ( a === b ) { + hasDuplicate = true; + return 0; + } + + var cur, + i = 0, + aup = a.parentNode, + bup = b.parentNode, + ap = [ a ], + bp = [ b ]; + + // Parentless nodes are either documents or disconnected + if ( !aup || !bup ) { + return a === doc ? -1 : + b === doc ? 1 : + aup ? -1 : + bup ? 1 : + sortInput ? + ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : + 0; + + // If the nodes are siblings, we can do a quick check + } else if ( aup === bup ) { + return siblingCheck( a, b ); + } + + // Otherwise we need full lists of their ancestors for comparison + cur = a; + while ( (cur = cur.parentNode) ) { + ap.unshift( cur ); + } + cur = b; + while ( (cur = cur.parentNode) ) { + bp.unshift( cur ); + } + + // Walk down the tree looking for a discrepancy + while ( ap[i] === bp[i] ) { + i++; + } + + return i ? + // Do a sibling check if the nodes have a common ancestor + siblingCheck( ap[i], bp[i] ) : + + // Otherwise nodes in our document sort first + ap[i] === preferredDoc ? -1 : + bp[i] === preferredDoc ? 1 : + 0; + }; + + return doc; +}; + +Sizzle.matches = function( expr, elements ) { + return Sizzle( expr, null, null, elements ); +}; + +Sizzle.matchesSelector = function( elem, expr ) { + // Set document vars if needed + if ( ( elem.ownerDocument || elem ) !== document ) { + setDocument( elem ); + } + + // Make sure that attribute selectors are quoted + expr = expr.replace( rattributeQuotes, "='$1']" ); + + if ( support.matchesSelector && documentIsHTML && + ( !rbuggyMatches || !rbuggyMatches.test( expr ) ) && + ( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) { + + try { + var ret = matches.call( elem, expr ); + + // IE 9's matchesSelector returns false on disconnected nodes + if ( ret || support.disconnectedMatch || + // As well, disconnected nodes are said to be in a document + // fragment in IE 9 + elem.document && elem.document.nodeType !== 11 ) { + return ret; + } + } catch (e) {} + } + + return Sizzle( expr, document, null, [ elem ] ).length > 0; +}; + +Sizzle.contains = function( context, elem ) { + // Set document vars if needed + if ( ( context.ownerDocument || context ) !== document ) { + setDocument( context ); + } + return contains( context, elem ); +}; + +Sizzle.attr = function( elem, name ) { + // Set document vars if needed + if ( ( elem.ownerDocument || elem ) !== document ) { + setDocument( elem ); + } + + var fn = Expr.attrHandle[ name.toLowerCase() ], + // Don't get fooled by Object.prototype properties (jQuery #13807) + val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ? + fn( elem, name, !documentIsHTML ) : + undefined; + + return val !== undefined ? + val : + support.attributes || !documentIsHTML ? + elem.getAttribute( name ) : + (val = elem.getAttributeNode(name)) && val.specified ? + val.value : + null; +}; + +Sizzle.error = function( msg ) { + throw new Error( "Syntax error, unrecognized expression: " + msg ); +}; + +/** + * Document sorting and removing duplicates + * @param {ArrayLike} results + */ +Sizzle.uniqueSort = function( results ) { + var elem, + duplicates = [], + j = 0, + i = 0; + + // Unless we *know* we can detect duplicates, assume their presence + hasDuplicate = !support.detectDuplicates; + sortInput = !support.sortStable && results.slice( 0 ); + results.sort( sortOrder ); + + if ( hasDuplicate ) { + while ( (elem = results[i++]) ) { + if ( elem === results[ i ] ) { + j = duplicates.push( i ); + } + } + while ( j-- ) { + results.splice( duplicates[ j ], 1 ); + } + } + + // Clear input after sorting to release objects + // See https://github.com/jquery/sizzle/pull/225 + sortInput = null; + + return results; +}; + +/** + * Utility function for retrieving the text value of an array of DOM nodes + * @param {Array|Element} elem + */ +getText = Sizzle.getText = function( elem ) { + var node, + ret = "", + i = 0, + nodeType = elem.nodeType; + + if ( !nodeType ) { + // If no nodeType, this is expected to be an array + while ( (node = elem[i++]) ) { + // Do not traverse comment nodes + ret += getText( node ); + } + } else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) { + // Use textContent for elements + // innerText usage removed for consistency of new lines (jQuery #11153) + if ( typeof elem.textContent === "string" ) { + return elem.textContent; + } else { + // Traverse its children + for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { + ret += getText( elem ); + } + } + } else if ( nodeType === 3 || nodeType === 4 ) { + return elem.nodeValue; + } + // Do not include comment or processing instruction nodes + + return ret; +}; + +Expr = Sizzle.selectors = { + + // Can be adjusted by the user + cacheLength: 50, + + createPseudo: markFunction, + + match: matchExpr, + + attrHandle: {}, + + find: {}, + + relative: { + ">": { dir: "parentNode", first: true }, + " ": { dir: "parentNode" }, + "+": { dir: "previousSibling", first: true }, + "~": { dir: "previousSibling" } + }, + + preFilter: { + "ATTR": function( match ) { + match[1] = match[1].replace( runescape, funescape ); + + // Move the given value to match[3] whether quoted or unquoted + match[3] = ( match[3] || match[4] || match[5] || "" ).replace( runescape, funescape ); + + if ( match[2] === "~=" ) { + match[3] = " " + match[3] + " "; + } + + return match.slice( 0, 4 ); + }, + + "CHILD": function( match ) { + /* matches from matchExpr["CHILD"] + 1 type (only|nth|...) + 2 what (child|of-type) + 3 argument (even|odd|\d*|\d*n([+-]\d+)?|...) + 4 xn-component of xn+y argument ([+-]?\d*n|) + 5 sign of xn-component + 6 x of xn-component + 7 sign of y-component + 8 y of y-component + */ + match[1] = match[1].toLowerCase(); + + if ( match[1].slice( 0, 3 ) === "nth" ) { + // nth-* requires argument + if ( !match[3] ) { + Sizzle.error( match[0] ); + } + + // numeric x and y parameters for Expr.filter.CHILD + // remember that false/true cast respectively to 0/1 + match[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === "even" || match[3] === "odd" ) ); + match[5] = +( ( match[7] + match[8] ) || match[3] === "odd" ); + + // other types prohibit arguments + } else if ( match[3] ) { + Sizzle.error( match[0] ); + } + + return match; + }, + + "PSEUDO": function( match ) { + var excess, + unquoted = !match[6] && match[2]; + + if ( matchExpr["CHILD"].test( match[0] ) ) { + return null; + } + + // Accept quoted arguments as-is + if ( match[3] ) { + match[2] = match[4] || match[5] || ""; + + // Strip excess characters from unquoted arguments + } else if ( unquoted && rpseudo.test( unquoted ) && + // Get excess from tokenize (recursively) + (excess = tokenize( unquoted, true )) && + // advance to the next closing parenthesis + (excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length) ) { + + // excess is a negative index + match[0] = match[0].slice( 0, excess ); + match[2] = unquoted.slice( 0, excess ); + } + + // Return only captures needed by the pseudo filter method (type and argument) + return match.slice( 0, 3 ); + } + }, + + filter: { + + "TAG": function( nodeNameSelector ) { + var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase(); + return nodeNameSelector === "*" ? + function() { return true; } : + function( elem ) { + return elem.nodeName && elem.nodeName.toLowerCase() === nodeName; + }; + }, + + "CLASS": function( className ) { + var pattern = classCache[ className + " " ]; + + return pattern || + (pattern = new RegExp( "(^|" + whitespace + ")" + className + "(" + whitespace + "|$)" )) && + classCache( className, function( elem ) { + return pattern.test( typeof elem.className === "string" && elem.className || typeof elem.getAttribute !== "undefined" && elem.getAttribute("class") || "" ); + }); + }, + + "ATTR": function( name, operator, check ) { + return function( elem ) { + var result = Sizzle.attr( elem, name ); + + if ( result == null ) { + return operator === "!="; + } + if ( !operator ) { + return true; + } + + result += ""; + + return operator === "=" ? result === check : + operator === "!=" ? result !== check : + operator === "^=" ? check && result.indexOf( check ) === 0 : + operator === "*=" ? check && result.indexOf( check ) > -1 : + operator === "$=" ? check && result.slice( -check.length ) === check : + operator === "~=" ? ( " " + result.replace( rwhitespace, " " ) + " " ).indexOf( check ) > -1 : + operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" : + false; + }; + }, + + "CHILD": function( type, what, argument, first, last ) { + var simple = type.slice( 0, 3 ) !== "nth", + forward = type.slice( -4 ) !== "last", + ofType = what === "of-type"; + + return first === 1 && last === 0 ? + + // Shortcut for :nth-*(n) + function( elem ) { + return !!elem.parentNode; + } : + + function( elem, context, xml ) { + var cache, outerCache, node, diff, nodeIndex, start, + dir = simple !== forward ? "nextSibling" : "previousSibling", + parent = elem.parentNode, + name = ofType && elem.nodeName.toLowerCase(), + useCache = !xml && !ofType; + + if ( parent ) { + + // :(first|last|only)-(child|of-type) + if ( simple ) { + while ( dir ) { + node = elem; + while ( (node = node[ dir ]) ) { + if ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) { + return false; + } + } + // Reverse direction for :only-* (if we haven't yet done so) + start = dir = type === "only" && !start && "nextSibling"; + } + return true; + } + + start = [ forward ? parent.firstChild : parent.lastChild ]; + + // non-xml :nth-child(...) stores cache data on `parent` + if ( forward && useCache ) { + // Seek `elem` from a previously-cached index + outerCache = parent[ expando ] || (parent[ expando ] = {}); + cache = outerCache[ type ] || []; + nodeIndex = cache[0] === dirruns && cache[1]; + diff = cache[0] === dirruns && cache[2]; + node = nodeIndex && parent.childNodes[ nodeIndex ]; + + while ( (node = ++nodeIndex && node && node[ dir ] || + + // Fallback to seeking `elem` from the start + (diff = nodeIndex = 0) || start.pop()) ) { + + // When found, cache indexes on `parent` and break + if ( node.nodeType === 1 && ++diff && node === elem ) { + outerCache[ type ] = [ dirruns, nodeIndex, diff ]; + break; + } + } + + // Use previously-cached element index if available + } else if ( useCache && (cache = (elem[ expando ] || (elem[ expando ] = {}))[ type ]) && cache[0] === dirruns ) { + diff = cache[1]; + + // xml :nth-child(...) or :nth-last-child(...) or :nth(-last)?-of-type(...) + } else { + // Use the same loop as above to seek `elem` from the start + while ( (node = ++nodeIndex && node && node[ dir ] || + (diff = nodeIndex = 0) || start.pop()) ) { + + if ( ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) && ++diff ) { + // Cache the index of each encountered element + if ( useCache ) { + (node[ expando ] || (node[ expando ] = {}))[ type ] = [ dirruns, diff ]; + } + + if ( node === elem ) { + break; + } + } + } + } + + // Incorporate the offset, then check against cycle size + diff -= last; + return diff === first || ( diff % first === 0 && diff / first >= 0 ); + } + }; + }, + + "PSEUDO": function( pseudo, argument ) { + // pseudo-class names are case-insensitive + // http://www.w3.org/TR/selectors/#pseudo-classes + // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters + // Remember that setFilters inherits from pseudos + var args, + fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] || + Sizzle.error( "unsupported pseudo: " + pseudo ); + + // The user may use createPseudo to indicate that + // arguments are needed to create the filter function + // just as Sizzle does + if ( fn[ expando ] ) { + return fn( argument ); + } + + // But maintain support for old signatures + if ( fn.length > 1 ) { + args = [ pseudo, pseudo, "", argument ]; + return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ? + markFunction(function( seed, matches ) { + var idx, + matched = fn( seed, argument ), + i = matched.length; + while ( i-- ) { + idx = indexOf( seed, matched[i] ); + seed[ idx ] = !( matches[ idx ] = matched[i] ); + } + }) : + function( elem ) { + return fn( elem, 0, args ); + }; + } + + return fn; + } + }, + + pseudos: { + // Potentially complex pseudos + "not": markFunction(function( selector ) { + // Trim the selector passed to compile + // to avoid treating leading and trailing + // spaces as combinators + var input = [], + results = [], + matcher = compile( selector.replace( rtrim, "$1" ) ); + + return matcher[ expando ] ? + markFunction(function( seed, matches, context, xml ) { + var elem, + unmatched = matcher( seed, null, xml, [] ), + i = seed.length; + + // Match elements unmatched by `matcher` + while ( i-- ) { + if ( (elem = unmatched[i]) ) { + seed[i] = !(matches[i] = elem); + } + } + }) : + function( elem, context, xml ) { + input[0] = elem; + matcher( input, null, xml, results ); + // Don't keep the element (issue #299) + input[0] = null; + return !results.pop(); + }; + }), + + "has": markFunction(function( selector ) { + return function( elem ) { + return Sizzle( selector, elem ).length > 0; + }; + }), + + "contains": markFunction(function( text ) { + text = text.replace( runescape, funescape ); + return function( elem ) { + return ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1; + }; + }), + + // "Whether an element is represented by a :lang() selector + // is based solely on the element's language value + // being equal to the identifier C, + // or beginning with the identifier C immediately followed by "-". + // The matching of C against the element's language value is performed case-insensitively. + // The identifier C does not have to be a valid language name." + // http://www.w3.org/TR/selectors/#lang-pseudo + "lang": markFunction( function( lang ) { + // lang value must be a valid identifier + if ( !ridentifier.test(lang || "") ) { + Sizzle.error( "unsupported lang: " + lang ); + } + lang = lang.replace( runescape, funescape ).toLowerCase(); + return function( elem ) { + var elemLang; + do { + if ( (elemLang = documentIsHTML ? + elem.lang : + elem.getAttribute("xml:lang") || elem.getAttribute("lang")) ) { + + elemLang = elemLang.toLowerCase(); + return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0; + } + } while ( (elem = elem.parentNode) && elem.nodeType === 1 ); + return false; + }; + }), + + // Miscellaneous + "target": function( elem ) { + var hash = window.location && window.location.hash; + return hash && hash.slice( 1 ) === elem.id; + }, + + "root": function( elem ) { + return elem === docElem; + }, + + "focus": function( elem ) { + return elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex); + }, + + // Boolean properties + "enabled": function( elem ) { + return elem.disabled === false; + }, + + "disabled": function( elem ) { + return elem.disabled === true; + }, + + "checked": function( elem ) { + // In CSS3, :checked should return both checked and selected elements + // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked + var nodeName = elem.nodeName.toLowerCase(); + return (nodeName === "input" && !!elem.checked) || (nodeName === "option" && !!elem.selected); + }, + + "selected": function( elem ) { + // Accessing this property makes selected-by-default + // options in Safari work properly + if ( elem.parentNode ) { + elem.parentNode.selectedIndex; + } + + return elem.selected === true; + }, + + // Contents + "empty": function( elem ) { + // http://www.w3.org/TR/selectors/#empty-pseudo + // :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5), + // but not by others (comment: 8; processing instruction: 7; etc.) + // nodeType < 6 works because attributes (2) do not appear as children + for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { + if ( elem.nodeType < 6 ) { + return false; + } + } + return true; + }, + + "parent": function( elem ) { + return !Expr.pseudos["empty"]( elem ); + }, + + // Element/input types + "header": function( elem ) { + return rheader.test( elem.nodeName ); + }, + + "input": function( elem ) { + return rinputs.test( elem.nodeName ); + }, + + "button": function( elem ) { + var name = elem.nodeName.toLowerCase(); + return name === "input" && elem.type === "button" || name === "button"; + }, + + "text": function( elem ) { + var attr; + return elem.nodeName.toLowerCase() === "input" && + elem.type === "text" && + + // Support: IE<8 + // New HTML5 attribute values (e.g., "search") appear with elem.type === "text" + ( (attr = elem.getAttribute("type")) == null || attr.toLowerCase() === "text" ); + }, + + // Position-in-collection + "first": createPositionalPseudo(function() { + return [ 0 ]; + }), + + "last": createPositionalPseudo(function( matchIndexes, length ) { + return [ length - 1 ]; + }), + + "eq": createPositionalPseudo(function( matchIndexes, length, argument ) { + return [ argument < 0 ? argument + length : argument ]; + }), + + "even": createPositionalPseudo(function( matchIndexes, length ) { + var i = 0; + for ( ; i < length; i += 2 ) { + matchIndexes.push( i ); + } + return matchIndexes; + }), + + "odd": createPositionalPseudo(function( matchIndexes, length ) { + var i = 1; + for ( ; i < length; i += 2 ) { + matchIndexes.push( i ); + } + return matchIndexes; + }), + + "lt": createPositionalPseudo(function( matchIndexes, length, argument ) { + var i = argument < 0 ? argument + length : argument; + for ( ; --i >= 0; ) { + matchIndexes.push( i ); + } + return matchIndexes; + }), + + "gt": createPositionalPseudo(function( matchIndexes, length, argument ) { + var i = argument < 0 ? argument + length : argument; + for ( ; ++i < length; ) { + matchIndexes.push( i ); + } + return matchIndexes; + }) + } +}; + +Expr.pseudos["nth"] = Expr.pseudos["eq"]; + +// Add button/input type pseudos +for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) { + Expr.pseudos[ i ] = createInputPseudo( i ); +} +for ( i in { submit: true, reset: true } ) { + Expr.pseudos[ i ] = createButtonPseudo( i ); +} + +// Easy API for creating new setFilters +function setFilters() {} +setFilters.prototype = Expr.filters = Expr.pseudos; +Expr.setFilters = new setFilters(); + +tokenize = Sizzle.tokenize = function( selector, parseOnly ) { + var matched, match, tokens, type, + soFar, groups, preFilters, + cached = tokenCache[ selector + " " ]; + + if ( cached ) { + return parseOnly ? 0 : cached.slice( 0 ); + } + + soFar = selector; + groups = []; + preFilters = Expr.preFilter; + + while ( soFar ) { + + // Comma and first run + if ( !matched || (match = rcomma.exec( soFar )) ) { + if ( match ) { + // Don't consume trailing commas as valid + soFar = soFar.slice( match[0].length ) || soFar; + } + groups.push( (tokens = []) ); + } + + matched = false; + + // Combinators + if ( (match = rcombinators.exec( soFar )) ) { + matched = match.shift(); + tokens.push({ + value: matched, + // Cast descendant combinators to space + type: match[0].replace( rtrim, " " ) + }); + soFar = soFar.slice( matched.length ); + } + + // Filters + for ( type in Expr.filter ) { + if ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] || + (match = preFilters[ type ]( match ))) ) { + matched = match.shift(); + tokens.push({ + value: matched, + type: type, + matches: match + }); + soFar = soFar.slice( matched.length ); + } + } + + if ( !matched ) { + break; + } + } + + // Return the length of the invalid excess + // if we're just parsing + // Otherwise, throw an error or return tokens + return parseOnly ? + soFar.length : + soFar ? + Sizzle.error( selector ) : + // Cache the tokens + tokenCache( selector, groups ).slice( 0 ); +}; + +function toSelector( tokens ) { + var i = 0, + len = tokens.length, + selector = ""; + for ( ; i < len; i++ ) { + selector += tokens[i].value; + } + return selector; +} + +function addCombinator( matcher, combinator, base ) { + var dir = combinator.dir, + checkNonElements = base && dir === "parentNode", + doneName = done++; + + return combinator.first ? + // Check against closest ancestor/preceding element + function( elem, context, xml ) { + while ( (elem = elem[ dir ]) ) { + if ( elem.nodeType === 1 || checkNonElements ) { + return matcher( elem, context, xml ); + } + } + } : + + // Check against all ancestor/preceding elements + function( elem, context, xml ) { + var oldCache, outerCache, + newCache = [ dirruns, doneName ]; + + // We can't set arbitrary data on XML nodes, so they don't benefit from dir caching + if ( xml ) { + while ( (elem = elem[ dir ]) ) { + if ( elem.nodeType === 1 || checkNonElements ) { + if ( matcher( elem, context, xml ) ) { + return true; + } + } + } + } else { + while ( (elem = elem[ dir ]) ) { + if ( elem.nodeType === 1 || checkNonElements ) { + outerCache = elem[ expando ] || (elem[ expando ] = {}); + if ( (oldCache = outerCache[ dir ]) && + oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) { + + // Assign to newCache so results back-propagate to previous elements + return (newCache[ 2 ] = oldCache[ 2 ]); + } else { + // Reuse newcache so results back-propagate to previous elements + outerCache[ dir ] = newCache; + + // A match means we're done; a fail means we have to keep checking + if ( (newCache[ 2 ] = matcher( elem, context, xml )) ) { + return true; + } + } + } + } + } + }; +} + +function elementMatcher( matchers ) { + return matchers.length > 1 ? + function( elem, context, xml ) { + var i = matchers.length; + while ( i-- ) { + if ( !matchers[i]( elem, context, xml ) ) { + return false; + } + } + return true; + } : + matchers[0]; +} + +function multipleContexts( selector, contexts, results ) { + var i = 0, + len = contexts.length; + for ( ; i < len; i++ ) { + Sizzle( selector, contexts[i], results ); + } + return results; +} + +function condense( unmatched, map, filter, context, xml ) { + var elem, + newUnmatched = [], + i = 0, + len = unmatched.length, + mapped = map != null; + + for ( ; i < len; i++ ) { + if ( (elem = unmatched[i]) ) { + if ( !filter || filter( elem, context, xml ) ) { + newUnmatched.push( elem ); + if ( mapped ) { + map.push( i ); + } + } + } + } + + return newUnmatched; +} + +function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) { + if ( postFilter && !postFilter[ expando ] ) { + postFilter = setMatcher( postFilter ); + } + if ( postFinder && !postFinder[ expando ] ) { + postFinder = setMatcher( postFinder, postSelector ); + } + return markFunction(function( seed, results, context, xml ) { + var temp, i, elem, + preMap = [], + postMap = [], + preexisting = results.length, + + // Get initial elements from seed or context + elems = seed || multipleContexts( selector || "*", context.nodeType ? [ context ] : context, [] ), + + // Prefilter to get matcher input, preserving a map for seed-results synchronization + matcherIn = preFilter && ( seed || !selector ) ? + condense( elems, preMap, preFilter, context, xml ) : + elems, + + matcherOut = matcher ? + // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results, + postFinder || ( seed ? preFilter : preexisting || postFilter ) ? + + // ...intermediate processing is necessary + [] : + + // ...otherwise use results directly + results : + matcherIn; + + // Find primary matches + if ( matcher ) { + matcher( matcherIn, matcherOut, context, xml ); + } + + // Apply postFilter + if ( postFilter ) { + temp = condense( matcherOut, postMap ); + postFilter( temp, [], context, xml ); + + // Un-match failing elements by moving them back to matcherIn + i = temp.length; + while ( i-- ) { + if ( (elem = temp[i]) ) { + matcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem); + } + } + } + + if ( seed ) { + if ( postFinder || preFilter ) { + if ( postFinder ) { + // Get the final matcherOut by condensing this intermediate into postFinder contexts + temp = []; + i = matcherOut.length; + while ( i-- ) { + if ( (elem = matcherOut[i]) ) { + // Restore matcherIn since elem is not yet a final match + temp.push( (matcherIn[i] = elem) ); + } + } + postFinder( null, (matcherOut = []), temp, xml ); + } + + // Move matched elements from seed to results to keep them synchronized + i = matcherOut.length; + while ( i-- ) { + if ( (elem = matcherOut[i]) && + (temp = postFinder ? indexOf( seed, elem ) : preMap[i]) > -1 ) { + + seed[temp] = !(results[temp] = elem); + } + } + } + + // Add elements to results, through postFinder if defined + } else { + matcherOut = condense( + matcherOut === results ? + matcherOut.splice( preexisting, matcherOut.length ) : + matcherOut + ); + if ( postFinder ) { + postFinder( null, results, matcherOut, xml ); + } else { + push.apply( results, matcherOut ); + } + } + }); +} + +function matcherFromTokens( tokens ) { + var checkContext, matcher, j, + len = tokens.length, + leadingRelative = Expr.relative[ tokens[0].type ], + implicitRelative = leadingRelative || Expr.relative[" "], + i = leadingRelative ? 1 : 0, + + // The foundational matcher ensures that elements are reachable from top-level context(s) + matchContext = addCombinator( function( elem ) { + return elem === checkContext; + }, implicitRelative, true ), + matchAnyContext = addCombinator( function( elem ) { + return indexOf( checkContext, elem ) > -1; + }, implicitRelative, true ), + matchers = [ function( elem, context, xml ) { + var ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || ( + (checkContext = context).nodeType ? + matchContext( elem, context, xml ) : + matchAnyContext( elem, context, xml ) ); + // Avoid hanging onto element (issue #299) + checkContext = null; + return ret; + } ]; + + for ( ; i < len; i++ ) { + if ( (matcher = Expr.relative[ tokens[i].type ]) ) { + matchers = [ addCombinator(elementMatcher( matchers ), matcher) ]; + } else { + matcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches ); + + // Return special upon seeing a positional matcher + if ( matcher[ expando ] ) { + // Find the next relative operator (if any) for proper handling + j = ++i; + for ( ; j < len; j++ ) { + if ( Expr.relative[ tokens[j].type ] ) { + break; + } + } + return setMatcher( + i > 1 && elementMatcher( matchers ), + i > 1 && toSelector( + // If the preceding token was a descendant combinator, insert an implicit any-element `*` + tokens.slice( 0, i - 1 ).concat({ value: tokens[ i - 2 ].type === " " ? "*" : "" }) + ).replace( rtrim, "$1" ), + matcher, + i < j && matcherFromTokens( tokens.slice( i, j ) ), + j < len && matcherFromTokens( (tokens = tokens.slice( j )) ), + j < len && toSelector( tokens ) + ); + } + matchers.push( matcher ); + } + } + + return elementMatcher( matchers ); +} + +function matcherFromGroupMatchers( elementMatchers, setMatchers ) { + var bySet = setMatchers.length > 0, + byElement = elementMatchers.length > 0, + superMatcher = function( seed, context, xml, results, outermost ) { + var elem, j, matcher, + matchedCount = 0, + i = "0", + unmatched = seed && [], + setMatched = [], + contextBackup = outermostContext, + // We must always have either seed elements or outermost context + elems = seed || byElement && Expr.find["TAG"]( "*", outermost ), + // Use integer dirruns iff this is the outermost matcher + dirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1), + len = elems.length; + + if ( outermost ) { + outermostContext = context !== document && context; + } + + // Add elements passing elementMatchers directly to results + // Keep `i` a string if there are no elements so `matchedCount` will be "00" below + // Support: IE<9, Safari + // Tolerate NodeList properties (IE: "length"; Safari: ) matching elements by id + for ( ; i !== len && (elem = elems[i]) != null; i++ ) { + if ( byElement && elem ) { + j = 0; + while ( (matcher = elementMatchers[j++]) ) { + if ( matcher( elem, context, xml ) ) { + results.push( elem ); + break; + } + } + if ( outermost ) { + dirruns = dirrunsUnique; + } + } + + // Track unmatched elements for set filters + if ( bySet ) { + // They will have gone through all possible matchers + if ( (elem = !matcher && elem) ) { + matchedCount--; + } + + // Lengthen the array for every element, matched or not + if ( seed ) { + unmatched.push( elem ); + } + } + } + + // Apply set filters to unmatched elements + matchedCount += i; + if ( bySet && i !== matchedCount ) { + j = 0; + while ( (matcher = setMatchers[j++]) ) { + matcher( unmatched, setMatched, context, xml ); + } + + if ( seed ) { + // Reintegrate element matches to eliminate the need for sorting + if ( matchedCount > 0 ) { + while ( i-- ) { + if ( !(unmatched[i] || setMatched[i]) ) { + setMatched[i] = pop.call( results ); + } + } + } + + // Discard index placeholder values to get only actual matches + setMatched = condense( setMatched ); + } + + // Add matches to results + push.apply( results, setMatched ); + + // Seedless set matches succeeding multiple successful matchers stipulate sorting + if ( outermost && !seed && setMatched.length > 0 && + ( matchedCount + setMatchers.length ) > 1 ) { + + Sizzle.uniqueSort( results ); + } + } + + // Override manipulation of globals by nested matchers + if ( outermost ) { + dirruns = dirrunsUnique; + outermostContext = contextBackup; + } + + return unmatched; + }; + + return bySet ? + markFunction( superMatcher ) : + superMatcher; +} + +compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) { + var i, + setMatchers = [], + elementMatchers = [], + cached = compilerCache[ selector + " " ]; + + if ( !cached ) { + // Generate a function of recursive functions that can be used to check each element + if ( !match ) { + match = tokenize( selector ); + } + i = match.length; + while ( i-- ) { + cached = matcherFromTokens( match[i] ); + if ( cached[ expando ] ) { + setMatchers.push( cached ); + } else { + elementMatchers.push( cached ); + } + } + + // Cache the compiled function + cached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) ); + + // Save selector and tokenization + cached.selector = selector; + } + return cached; +}; + +/** + * A low-level selection function that works with Sizzle's compiled + * selector functions + * @param {String|Function} selector A selector or a pre-compiled + * selector function built with Sizzle.compile + * @param {Element} context + * @param {Array} [results] + * @param {Array} [seed] A set of elements to match against + */ +select = Sizzle.select = function( selector, context, results, seed ) { + var i, tokens, token, type, find, + compiled = typeof selector === "function" && selector, + match = !seed && tokenize( (selector = compiled.selector || selector) ); + + results = results || []; + + // Try to minimize operations if there is no seed and only one group + if ( match.length === 1 ) { + + // Take a shortcut and set the context if the root selector is an ID + tokens = match[0] = match[0].slice( 0 ); + if ( tokens.length > 2 && (token = tokens[0]).type === "ID" && + support.getById && context.nodeType === 9 && documentIsHTML && + Expr.relative[ tokens[1].type ] ) { + + context = ( Expr.find["ID"]( token.matches[0].replace(runescape, funescape), context ) || [] )[0]; + if ( !context ) { + return results; + + // Precompiled matchers will still verify ancestry, so step up a level + } else if ( compiled ) { + context = context.parentNode; + } + + selector = selector.slice( tokens.shift().value.length ); + } + + // Fetch a seed set for right-to-left matching + i = matchExpr["needsContext"].test( selector ) ? 0 : tokens.length; + while ( i-- ) { + token = tokens[i]; + + // Abort if we hit a combinator + if ( Expr.relative[ (type = token.type) ] ) { + break; + } + if ( (find = Expr.find[ type ]) ) { + // Search, expanding context for leading sibling combinators + if ( (seed = find( + token.matches[0].replace( runescape, funescape ), + rsibling.test( tokens[0].type ) && testContext( context.parentNode ) || context + )) ) { + + // If seed is empty or no tokens remain, we can return early + tokens.splice( i, 1 ); + selector = seed.length && toSelector( tokens ); + if ( !selector ) { + push.apply( results, seed ); + return results; + } + + break; + } + } + } + } + + // Compile and execute a filtering function if one is not provided + // Provide `match` to avoid retokenization if we modified the selector above + ( compiled || compile( selector, match ) )( + seed, + context, + !documentIsHTML, + results, + rsibling.test( selector ) && testContext( context.parentNode ) || context + ); + return results; +}; + +// One-time assignments + +// Sort stability +support.sortStable = expando.split("").sort( sortOrder ).join("") === expando; + +// Support: Chrome 14-35+ +// Always assume duplicates if they aren't passed to the comparison function +support.detectDuplicates = !!hasDuplicate; + +// Initialize against the default document +setDocument(); + +// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27) +// Detached nodes confoundingly follow *each other* +support.sortDetached = assert(function( div1 ) { + // Should return 1, but returns 4 (following) + return div1.compareDocumentPosition( document.createElement("div") ) & 1; +}); + +// Support: IE<8 +// Prevent attribute/property "interpolation" +// http://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx +if ( !assert(function( div ) { + div.innerHTML = ""; + return div.firstChild.getAttribute("href") === "#" ; +}) ) { + addHandle( "type|href|height|width", function( elem, name, isXML ) { + if ( !isXML ) { + return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 ); + } + }); +} + +// Support: IE<9 +// Use defaultValue in place of getAttribute("value") +if ( !support.attributes || !assert(function( div ) { + div.innerHTML = ""; + div.firstChild.setAttribute( "value", "" ); + return div.firstChild.getAttribute( "value" ) === ""; +}) ) { + addHandle( "value", function( elem, name, isXML ) { + if ( !isXML && elem.nodeName.toLowerCase() === "input" ) { + return elem.defaultValue; + } + }); +} + +// Support: IE<9 +// Use getAttributeNode to fetch booleans when getAttribute lies +if ( !assert(function( div ) { + return div.getAttribute("disabled") == null; +}) ) { + addHandle( booleans, function( elem, name, isXML ) { + var val; + if ( !isXML ) { + return elem[ name ] === true ? name.toLowerCase() : + (val = elem.getAttributeNode( name )) && val.specified ? + val.value : + null; + } + }); +} + +return Sizzle; + +})( window ); + + + +jQuery.find = Sizzle; +jQuery.expr = Sizzle.selectors; +jQuery.expr[":"] = jQuery.expr.pseudos; +jQuery.unique = Sizzle.uniqueSort; +jQuery.text = Sizzle.getText; +jQuery.isXMLDoc = Sizzle.isXML; +jQuery.contains = Sizzle.contains; + + + +var rneedsContext = jQuery.expr.match.needsContext; + +var rsingleTag = (/^<(\w+)\s*\/?>(?:<\/\1>|)$/); + + + +var risSimple = /^.[^:#\[\.,]*$/; + +// Implement the identical functionality for filter and not +function winnow( elements, qualifier, not ) { + if ( jQuery.isFunction( qualifier ) ) { + return jQuery.grep( elements, function( elem, i ) { + /* jshint -W018 */ + return !!qualifier.call( elem, i, elem ) !== not; + }); + + } + + if ( qualifier.nodeType ) { + return jQuery.grep( elements, function( elem ) { + return ( elem === qualifier ) !== not; + }); + + } + + if ( typeof qualifier === "string" ) { + if ( risSimple.test( qualifier ) ) { + return jQuery.filter( qualifier, elements, not ); + } + + qualifier = jQuery.filter( qualifier, elements ); + } + + return jQuery.grep( elements, function( elem ) { + return ( jQuery.inArray( elem, qualifier ) >= 0 ) !== not; + }); +} + +jQuery.filter = function( expr, elems, not ) { + var elem = elems[ 0 ]; + + if ( not ) { + expr = ":not(" + expr + ")"; + } + + return elems.length === 1 && elem.nodeType === 1 ? + jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [] : + jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) { + return elem.nodeType === 1; + })); +}; + +jQuery.fn.extend({ + find: function( selector ) { + var i, + ret = [], + self = this, + len = self.length; + + if ( typeof selector !== "string" ) { + return this.pushStack( jQuery( selector ).filter(function() { + for ( i = 0; i < len; i++ ) { + if ( jQuery.contains( self[ i ], this ) ) { + return true; + } + } + }) ); + } + + for ( i = 0; i < len; i++ ) { + jQuery.find( selector, self[ i ], ret ); + } + + // Needed because $( selector, context ) becomes $( context ).find( selector ) + ret = this.pushStack( len > 1 ? jQuery.unique( ret ) : ret ); + ret.selector = this.selector ? this.selector + " " + selector : selector; + return ret; + }, + filter: function( selector ) { + return this.pushStack( winnow(this, selector || [], false) ); + }, + not: function( selector ) { + return this.pushStack( winnow(this, selector || [], true) ); + }, + is: function( selector ) { + return !!winnow( + this, + + // If this is a positional/relative selector, check membership in the returned set + // so $("p:first").is("p:last") won't return true for a doc with two "p". + typeof selector === "string" && rneedsContext.test( selector ) ? + jQuery( selector ) : + selector || [], + false + ).length; + } +}); + + +// Initialize a jQuery object + + +// A central reference to the root jQuery(document) +var rootjQuery, + + // Use the correct document accordingly with window argument (sandbox) + document = window.document, + + // A simple way to check for HTML strings + // Prioritize #id over to avoid XSS via location.hash (#9521) + // Strict HTML recognition (#11290: must start with <) + rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/, + + init = jQuery.fn.init = function( selector, context ) { + var match, elem; + + // HANDLE: $(""), $(null), $(undefined), $(false) + if ( !selector ) { + return this; + } + + // Handle HTML strings + if ( typeof selector === "string" ) { + if ( selector.charAt(0) === "<" && selector.charAt( selector.length - 1 ) === ">" && selector.length >= 3 ) { + // Assume that strings that start and end with <> are HTML and skip the regex check + match = [ null, selector, null ]; + + } else { + match = rquickExpr.exec( selector ); + } + + // Match html or make sure no context is specified for #id + if ( match && (match[1] || !context) ) { + + // HANDLE: $(html) -> $(array) + if ( match[1] ) { + context = context instanceof jQuery ? context[0] : context; + + // scripts is true for back-compat + // Intentionally let the error be thrown if parseHTML is not present + jQuery.merge( this, jQuery.parseHTML( + match[1], + context && context.nodeType ? context.ownerDocument || context : document, + true + ) ); + + // HANDLE: $(html, props) + if ( rsingleTag.test( match[1] ) && jQuery.isPlainObject( context ) ) { + for ( match in context ) { + // Properties of context are called as methods if possible + if ( jQuery.isFunction( this[ match ] ) ) { + this[ match ]( context[ match ] ); + + // ...and otherwise set as attributes + } else { + this.attr( match, context[ match ] ); + } + } + } + + return this; + + // HANDLE: $(#id) + } else { + elem = document.getElementById( match[2] ); + + // Check parentNode to catch when Blackberry 4.6 returns + // nodes that are no longer in the document #6963 + if ( elem && elem.parentNode ) { + // Handle the case where IE and Opera return items + // by name instead of ID + if ( elem.id !== match[2] ) { + return rootjQuery.find( selector ); + } + + // Otherwise, we inject the element directly into the jQuery object + this.length = 1; + this[0] = elem; + } + + this.context = document; + this.selector = selector; + return this; + } + + // HANDLE: $(expr, $(...)) + } else if ( !context || context.jquery ) { + return ( context || rootjQuery ).find( selector ); + + // HANDLE: $(expr, context) + // (which is just equivalent to: $(context).find(expr) + } else { + return this.constructor( context ).find( selector ); + } + + // HANDLE: $(DOMElement) + } else if ( selector.nodeType ) { + this.context = this[0] = selector; + this.length = 1; + return this; + + // HANDLE: $(function) + // Shortcut for document ready + } else if ( jQuery.isFunction( selector ) ) { + return typeof rootjQuery.ready !== "undefined" ? + rootjQuery.ready( selector ) : + // Execute immediately if ready is not present + selector( jQuery ); + } + + if ( selector.selector !== undefined ) { + this.selector = selector.selector; + this.context = selector.context; + } + + return jQuery.makeArray( selector, this ); + }; + +// Give the init function the jQuery prototype for later instantiation +init.prototype = jQuery.fn; + +// Initialize central reference +rootjQuery = jQuery( document ); + + +var rparentsprev = /^(?:parents|prev(?:Until|All))/, + // methods guaranteed to produce a unique set when starting from a unique set + guaranteedUnique = { + children: true, + contents: true, + next: true, + prev: true + }; + +jQuery.extend({ + dir: function( elem, dir, until ) { + var matched = [], + cur = elem[ dir ]; + + while ( cur && cur.nodeType !== 9 && (until === undefined || cur.nodeType !== 1 || !jQuery( cur ).is( until )) ) { + if ( cur.nodeType === 1 ) { + matched.push( cur ); + } + cur = cur[dir]; + } + return matched; + }, + + sibling: function( n, elem ) { + var r = []; + + for ( ; n; n = n.nextSibling ) { + if ( n.nodeType === 1 && n !== elem ) { + r.push( n ); + } + } + + return r; + } +}); + +jQuery.fn.extend({ + has: function( target ) { + var i, + targets = jQuery( target, this ), + len = targets.length; + + return this.filter(function() { + for ( i = 0; i < len; i++ ) { + if ( jQuery.contains( this, targets[i] ) ) { + return true; + } + } + }); + }, + + closest: function( selectors, context ) { + var cur, + i = 0, + l = this.length, + matched = [], + pos = rneedsContext.test( selectors ) || typeof selectors !== "string" ? + jQuery( selectors, context || this.context ) : + 0; + + for ( ; i < l; i++ ) { + for ( cur = this[i]; cur && cur !== context; cur = cur.parentNode ) { + // Always skip document fragments + if ( cur.nodeType < 11 && (pos ? + pos.index(cur) > -1 : + + // Don't pass non-elements to Sizzle + cur.nodeType === 1 && + jQuery.find.matchesSelector(cur, selectors)) ) { + + matched.push( cur ); + break; + } + } + } + + return this.pushStack( matched.length > 1 ? jQuery.unique( matched ) : matched ); + }, + + // Determine the position of an element within + // the matched set of elements + index: function( elem ) { + + // No argument, return index in parent + if ( !elem ) { + return ( this[0] && this[0].parentNode ) ? this.first().prevAll().length : -1; + } + + // index in selector + if ( typeof elem === "string" ) { + return jQuery.inArray( this[0], jQuery( elem ) ); + } + + // Locate the position of the desired element + return jQuery.inArray( + // If it receives a jQuery object, the first element is used + elem.jquery ? elem[0] : elem, this ); + }, + + add: function( selector, context ) { + return this.pushStack( + jQuery.unique( + jQuery.merge( this.get(), jQuery( selector, context ) ) + ) + ); + }, + + addBack: function( selector ) { + return this.add( selector == null ? + this.prevObject : this.prevObject.filter(selector) + ); + } +}); + +function sibling( cur, dir ) { + do { + cur = cur[ dir ]; + } while ( cur && cur.nodeType !== 1 ); + + return cur; +} + +jQuery.each({ + parent: function( elem ) { + var parent = elem.parentNode; + return parent && parent.nodeType !== 11 ? parent : null; + }, + parents: function( elem ) { + return jQuery.dir( elem, "parentNode" ); + }, + parentsUntil: function( elem, i, until ) { + return jQuery.dir( elem, "parentNode", until ); + }, + next: function( elem ) { + return sibling( elem, "nextSibling" ); + }, + prev: function( elem ) { + return sibling( elem, "previousSibling" ); + }, + nextAll: function( elem ) { + return jQuery.dir( elem, "nextSibling" ); + }, + prevAll: function( elem ) { + return jQuery.dir( elem, "previousSibling" ); + }, + nextUntil: function( elem, i, until ) { + return jQuery.dir( elem, "nextSibling", until ); + }, + prevUntil: function( elem, i, until ) { + return jQuery.dir( elem, "previousSibling", until ); + }, + siblings: function( elem ) { + return jQuery.sibling( ( elem.parentNode || {} ).firstChild, elem ); + }, + children: function( elem ) { + return jQuery.sibling( elem.firstChild ); + }, + contents: function( elem ) { + return jQuery.nodeName( elem, "iframe" ) ? + elem.contentDocument || elem.contentWindow.document : + jQuery.merge( [], elem.childNodes ); + } +}, function( name, fn ) { + jQuery.fn[ name ] = function( until, selector ) { + var ret = jQuery.map( this, fn, until ); + + if ( name.slice( -5 ) !== "Until" ) { + selector = until; + } + + if ( selector && typeof selector === "string" ) { + ret = jQuery.filter( selector, ret ); + } + + if ( this.length > 1 ) { + // Remove duplicates + if ( !guaranteedUnique[ name ] ) { + ret = jQuery.unique( ret ); + } + + // Reverse order for parents* and prev-derivatives + if ( rparentsprev.test( name ) ) { + ret = ret.reverse(); + } + } + + return this.pushStack( ret ); + }; +}); +var rnotwhite = (/\S+/g); + + + +// String to Object options format cache +var optionsCache = {}; + +// Convert String-formatted options into Object-formatted ones and store in cache +function createOptions( options ) { + var object = optionsCache[ options ] = {}; + jQuery.each( options.match( rnotwhite ) || [], function( _, flag ) { + object[ flag ] = true; + }); + return object; +} + +/* + * Create a callback list using the following parameters: + * + * options: an optional list of space-separated options that will change how + * the callback list behaves or a more traditional option object + * + * By default a callback list will act like an event callback list and can be + * "fired" multiple times. + * + * Possible options: + * + * once: will ensure the callback list can only be fired once (like a Deferred) + * + * memory: will keep track of previous values and will call any callback added + * after the list has been fired right away with the latest "memorized" + * values (like a Deferred) + * + * unique: will ensure a callback can only be added once (no duplicate in the list) + * + * stopOnFalse: interrupt callings when a callback returns false + * + */ +jQuery.Callbacks = function( options ) { + + // Convert options from String-formatted to Object-formatted if needed + // (we check in cache first) + options = typeof options === "string" ? + ( optionsCache[ options ] || createOptions( options ) ) : + jQuery.extend( {}, options ); + + var // Flag to know if list is currently firing + firing, + // Last fire value (for non-forgettable lists) + memory, + // Flag to know if list was already fired + fired, + // End of the loop when firing + firingLength, + // Index of currently firing callback (modified by remove if needed) + firingIndex, + // First callback to fire (used internally by add and fireWith) + firingStart, + // Actual callback list + list = [], + // Stack of fire calls for repeatable lists + stack = !options.once && [], + // Fire callbacks + fire = function( data ) { + memory = options.memory && data; + fired = true; + firingIndex = firingStart || 0; + firingStart = 0; + firingLength = list.length; + firing = true; + for ( ; list && firingIndex < firingLength; firingIndex++ ) { + if ( list[ firingIndex ].apply( data[ 0 ], data[ 1 ] ) === false && options.stopOnFalse ) { + memory = false; // To prevent further calls using add + break; + } + } + firing = false; + if ( list ) { + if ( stack ) { + if ( stack.length ) { + fire( stack.shift() ); + } + } else if ( memory ) { + list = []; + } else { + self.disable(); + } + } + }, + // Actual Callbacks object + self = { + // Add a callback or a collection of callbacks to the list + add: function() { + if ( list ) { + // First, we save the current length + var start = list.length; + (function add( args ) { + jQuery.each( args, function( _, arg ) { + var type = jQuery.type( arg ); + if ( type === "function" ) { + if ( !options.unique || !self.has( arg ) ) { + list.push( arg ); + } + } else if ( arg && arg.length && type !== "string" ) { + // Inspect recursively + add( arg ); + } + }); + })( arguments ); + // Do we need to add the callbacks to the + // current firing batch? + if ( firing ) { + firingLength = list.length; + // With memory, if we're not firing then + // we should call right away + } else if ( memory ) { + firingStart = start; + fire( memory ); + } + } + return this; + }, + // Remove a callback from the list + remove: function() { + if ( list ) { + jQuery.each( arguments, function( _, arg ) { + var index; + while ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) { + list.splice( index, 1 ); + // Handle firing indexes + if ( firing ) { + if ( index <= firingLength ) { + firingLength--; + } + if ( index <= firingIndex ) { + firingIndex--; + } + } + } + }); + } + return this; + }, + // Check if a given callback is in the list. + // If no argument is given, return whether or not list has callbacks attached. + has: function( fn ) { + return fn ? jQuery.inArray( fn, list ) > -1 : !!( list && list.length ); + }, + // Remove all callbacks from the list + empty: function() { + list = []; + firingLength = 0; + return this; + }, + // Have the list do nothing anymore + disable: function() { + list = stack = memory = undefined; + return this; + }, + // Is it disabled? + disabled: function() { + return !list; + }, + // Lock the list in its current state + lock: function() { + stack = undefined; + if ( !memory ) { + self.disable(); + } + return this; + }, + // Is it locked? + locked: function() { + return !stack; + }, + // Call all callbacks with the given context and arguments + fireWith: function( context, args ) { + if ( list && ( !fired || stack ) ) { + args = args || []; + args = [ context, args.slice ? args.slice() : args ]; + if ( firing ) { + stack.push( args ); + } else { + fire( args ); + } + } + return this; + }, + // Call all the callbacks with the given arguments + fire: function() { + self.fireWith( this, arguments ); + return this; + }, + // To know if the callbacks have already been called at least once + fired: function() { + return !!fired; + } + }; + + return self; +}; + + +jQuery.extend({ + + Deferred: function( func ) { + var tuples = [ + // action, add listener, listener list, final state + [ "resolve", "done", jQuery.Callbacks("once memory"), "resolved" ], + [ "reject", "fail", jQuery.Callbacks("once memory"), "rejected" ], + [ "notify", "progress", jQuery.Callbacks("memory") ] + ], + state = "pending", + promise = { + state: function() { + return state; + }, + always: function() { + deferred.done( arguments ).fail( arguments ); + return this; + }, + then: function( /* fnDone, fnFail, fnProgress */ ) { + var fns = arguments; + return jQuery.Deferred(function( newDefer ) { + jQuery.each( tuples, function( i, tuple ) { + var fn = jQuery.isFunction( fns[ i ] ) && fns[ i ]; + // deferred[ done | fail | progress ] for forwarding actions to newDefer + deferred[ tuple[1] ](function() { + var returned = fn && fn.apply( this, arguments ); + if ( returned && jQuery.isFunction( returned.promise ) ) { + returned.promise() + .done( newDefer.resolve ) + .fail( newDefer.reject ) + .progress( newDefer.notify ); + } else { + newDefer[ tuple[ 0 ] + "With" ]( this === promise ? newDefer.promise() : this, fn ? [ returned ] : arguments ); + } + }); + }); + fns = null; + }).promise(); + }, + // Get a promise for this deferred + // If obj is provided, the promise aspect is added to the object + promise: function( obj ) { + return obj != null ? jQuery.extend( obj, promise ) : promise; + } + }, + deferred = {}; + + // Keep pipe for back-compat + promise.pipe = promise.then; + + // Add list-specific methods + jQuery.each( tuples, function( i, tuple ) { + var list = tuple[ 2 ], + stateString = tuple[ 3 ]; + + // promise[ done | fail | progress ] = list.add + promise[ tuple[1] ] = list.add; + + // Handle state + if ( stateString ) { + list.add(function() { + // state = [ resolved | rejected ] + state = stateString; + + // [ reject_list | resolve_list ].disable; progress_list.lock + }, tuples[ i ^ 1 ][ 2 ].disable, tuples[ 2 ][ 2 ].lock ); + } + + // deferred[ resolve | reject | notify ] + deferred[ tuple[0] ] = function() { + deferred[ tuple[0] + "With" ]( this === deferred ? promise : this, arguments ); + return this; + }; + deferred[ tuple[0] + "With" ] = list.fireWith; + }); + + // Make the deferred a promise + promise.promise( deferred ); + + // Call given func if any + if ( func ) { + func.call( deferred, deferred ); + } + + // All done! + return deferred; + }, + + // Deferred helper + when: function( subordinate /* , ..., subordinateN */ ) { + var i = 0, + resolveValues = slice.call( arguments ), + length = resolveValues.length, + + // the count of uncompleted subordinates + remaining = length !== 1 || ( subordinate && jQuery.isFunction( subordinate.promise ) ) ? length : 0, + + // the master Deferred. If resolveValues consist of only a single Deferred, just use that. + deferred = remaining === 1 ? subordinate : jQuery.Deferred(), + + // Update function for both resolve and progress values + updateFunc = function( i, contexts, values ) { + return function( value ) { + contexts[ i ] = this; + values[ i ] = arguments.length > 1 ? slice.call( arguments ) : value; + if ( values === progressValues ) { + deferred.notifyWith( contexts, values ); + + } else if ( !(--remaining) ) { + deferred.resolveWith( contexts, values ); + } + }; + }, + + progressValues, progressContexts, resolveContexts; + + // add listeners to Deferred subordinates; treat others as resolved + if ( length > 1 ) { + progressValues = new Array( length ); + progressContexts = new Array( length ); + resolveContexts = new Array( length ); + for ( ; i < length; i++ ) { + if ( resolveValues[ i ] && jQuery.isFunction( resolveValues[ i ].promise ) ) { + resolveValues[ i ].promise() + .done( updateFunc( i, resolveContexts, resolveValues ) ) + .fail( deferred.reject ) + .progress( updateFunc( i, progressContexts, progressValues ) ); + } else { + --remaining; + } + } + } + + // if we're not waiting on anything, resolve the master + if ( !remaining ) { + deferred.resolveWith( resolveContexts, resolveValues ); + } + + return deferred.promise(); + } +}); + + +// The deferred used on DOM ready +var readyList; + +jQuery.fn.ready = function( fn ) { + // Add the callback + jQuery.ready.promise().done( fn ); + + return this; +}; + +jQuery.extend({ + // Is the DOM ready to be used? Set to true once it occurs. + isReady: false, + + // A counter to track how many items to wait for before + // the ready event fires. See #6781 + readyWait: 1, + + // Hold (or release) the ready event + holdReady: function( hold ) { + if ( hold ) { + jQuery.readyWait++; + } else { + jQuery.ready( true ); + } + }, + + // Handle when the DOM is ready + ready: function( wait ) { + + // Abort if there are pending holds or we're already ready + if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) { + return; + } + + // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443). + if ( !document.body ) { + return setTimeout( jQuery.ready ); + } + + // Remember that the DOM is ready + jQuery.isReady = true; + + // If a normal DOM Ready event fired, decrement, and wait if need be + if ( wait !== true && --jQuery.readyWait > 0 ) { + return; + } + + // If there are functions bound, to execute + readyList.resolveWith( document, [ jQuery ] ); + + // Trigger any bound ready events + if ( jQuery.fn.triggerHandler ) { + jQuery( document ).triggerHandler( "ready" ); + jQuery( document ).off( "ready" ); + } + } +}); + +/** + * Clean-up method for dom ready events + */ +function detach() { + if ( document.addEventListener ) { + document.removeEventListener( "DOMContentLoaded", completed, false ); + window.removeEventListener( "load", completed, false ); + + } else { + document.detachEvent( "onreadystatechange", completed ); + window.detachEvent( "onload", completed ); + } +} + +/** + * The ready event handler and self cleanup method + */ +function completed() { + // readyState === "complete" is good enough for us to call the dom ready in oldIE + if ( document.addEventListener || event.type === "load" || document.readyState === "complete" ) { + detach(); + jQuery.ready(); + } +} + +jQuery.ready.promise = function( obj ) { + if ( !readyList ) { + + readyList = jQuery.Deferred(); + + // Catch cases where $(document).ready() is called after the browser event has already occurred. + // we once tried to use readyState "interactive" here, but it caused issues like the one + // discovered by ChrisS here: http://bugs.jquery.com/ticket/12282#comment:15 + if ( document.readyState === "complete" ) { + // Handle it asynchronously to allow scripts the opportunity to delay ready + setTimeout( jQuery.ready ); + + // Standards-based browsers support DOMContentLoaded + } else if ( document.addEventListener ) { + // Use the handy event callback + document.addEventListener( "DOMContentLoaded", completed, false ); + + // A fallback to window.onload, that will always work + window.addEventListener( "load", completed, false ); + + // If IE event model is used + } else { + // Ensure firing before onload, maybe late but safe also for iframes + document.attachEvent( "onreadystatechange", completed ); + + // A fallback to window.onload, that will always work + window.attachEvent( "onload", completed ); + + // If IE and not a frame + // continually check to see if the document is ready + var top = false; + + try { + top = window.frameElement == null && document.documentElement; + } catch(e) {} + + if ( top && top.doScroll ) { + (function doScrollCheck() { + if ( !jQuery.isReady ) { + + try { + // Use the trick by Diego Perini + // http://javascript.nwbox.com/IEContentLoaded/ + top.doScroll("left"); + } catch(e) { + return setTimeout( doScrollCheck, 50 ); + } + + // detach all dom ready events + detach(); + + // and execute any waiting functions + jQuery.ready(); + } + })(); + } + } + } + return readyList.promise( obj ); +}; + + +var strundefined = typeof undefined; + + + +// Support: IE<9 +// Iteration over object's inherited properties before its own +var i; +for ( i in jQuery( support ) ) { + break; +} +support.ownLast = i !== "0"; + +// Note: most support tests are defined in their respective modules. +// false until the test is run +support.inlineBlockNeedsLayout = false; + +// Execute ASAP in case we need to set body.style.zoom +jQuery(function() { + // Minified: var a,b,c,d + var val, div, body, container; + + body = document.getElementsByTagName( "body" )[ 0 ]; + if ( !body || !body.style ) { + // Return for frameset docs that don't have a body + return; + } + + // Setup + div = document.createElement( "div" ); + container = document.createElement( "div" ); + container.style.cssText = "position:absolute;border:0;width:0;height:0;top:0;left:-9999px"; + body.appendChild( container ).appendChild( div ); + + if ( typeof div.style.zoom !== strundefined ) { + // Support: IE<8 + // Check if natively block-level elements act like inline-block + // elements when setting their display to 'inline' and giving + // them layout + div.style.cssText = "display:inline;margin:0;border:0;padding:1px;width:1px;zoom:1"; + + support.inlineBlockNeedsLayout = val = div.offsetWidth === 3; + if ( val ) { + // Prevent IE 6 from affecting layout for positioned elements #11048 + // Prevent IE from shrinking the body in IE 7 mode #12869 + // Support: IE<8 + body.style.zoom = 1; + } + } + + body.removeChild( container ); +}); + + + + +(function() { + var div = document.createElement( "div" ); + + // Execute the test only if not already executed in another module. + if (support.deleteExpando == null) { + // Support: IE<9 + support.deleteExpando = true; + try { + delete div.test; + } catch( e ) { + support.deleteExpando = false; + } + } + + // Null elements to avoid leaks in IE. + div = null; +})(); + + +/** + * Determines whether an object can have data + */ +jQuery.acceptData = function( elem ) { + var noData = jQuery.noData[ (elem.nodeName + " ").toLowerCase() ], + nodeType = +elem.nodeType || 1; + + // Do not set data on non-element DOM nodes because it will not be cleared (#8335). + return nodeType !== 1 && nodeType !== 9 ? + false : + + // Nodes accept data unless otherwise specified; rejection can be conditional + !noData || noData !== true && elem.getAttribute("classid") === noData; +}; + + +var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/, + rmultiDash = /([A-Z])/g; + +function dataAttr( elem, key, data ) { + // If nothing was found internally, try to fetch any + // data from the HTML5 data-* attribute + if ( data === undefined && elem.nodeType === 1 ) { + + var name = "data-" + key.replace( rmultiDash, "-$1" ).toLowerCase(); + + data = elem.getAttribute( name ); + + if ( typeof data === "string" ) { + try { + data = data === "true" ? true : + data === "false" ? false : + data === "null" ? null : + // Only convert to a number if it doesn't change the string + +data + "" === data ? +data : + rbrace.test( data ) ? jQuery.parseJSON( data ) : + data; + } catch( e ) {} + + // Make sure we set the data so it isn't changed later + jQuery.data( elem, key, data ); + + } else { + data = undefined; + } + } + + return data; +} + +// checks a cache object for emptiness +function isEmptyDataObject( obj ) { + var name; + for ( name in obj ) { + + // if the public data object is empty, the private is still empty + if ( name === "data" && jQuery.isEmptyObject( obj[name] ) ) { + continue; + } + if ( name !== "toJSON" ) { + return false; + } + } + + return true; +} + +function internalData( elem, name, data, pvt /* Internal Use Only */ ) { + if ( !jQuery.acceptData( elem ) ) { + return; + } + + var ret, thisCache, + internalKey = jQuery.expando, + + // We have to handle DOM nodes and JS objects differently because IE6-7 + // can't GC object references properly across the DOM-JS boundary + isNode = elem.nodeType, + + // Only DOM nodes need the global jQuery cache; JS object data is + // attached directly to the object so GC can occur automatically + cache = isNode ? jQuery.cache : elem, + + // Only defining an ID for JS objects if its cache already exists allows + // the code to shortcut on the same path as a DOM node with no cache + id = isNode ? elem[ internalKey ] : elem[ internalKey ] && internalKey; + + // Avoid doing any more work than we need to when trying to get data on an + // object that has no data at all + if ( (!id || !cache[id] || (!pvt && !cache[id].data)) && data === undefined && typeof name === "string" ) { + return; + } + + if ( !id ) { + // Only DOM nodes need a new unique ID for each element since their data + // ends up in the global cache + if ( isNode ) { + id = elem[ internalKey ] = deletedIds.pop() || jQuery.guid++; + } else { + id = internalKey; + } + } + + if ( !cache[ id ] ) { + // Avoid exposing jQuery metadata on plain JS objects when the object + // is serialized using JSON.stringify + cache[ id ] = isNode ? {} : { toJSON: jQuery.noop }; + } + + // An object can be passed to jQuery.data instead of a key/value pair; this gets + // shallow copied over onto the existing cache + if ( typeof name === "object" || typeof name === "function" ) { + if ( pvt ) { + cache[ id ] = jQuery.extend( cache[ id ], name ); + } else { + cache[ id ].data = jQuery.extend( cache[ id ].data, name ); + } + } + + thisCache = cache[ id ]; + + // jQuery data() is stored in a separate object inside the object's internal data + // cache in order to avoid key collisions between internal data and user-defined + // data. + if ( !pvt ) { + if ( !thisCache.data ) { + thisCache.data = {}; + } + + thisCache = thisCache.data; + } + + if ( data !== undefined ) { + thisCache[ jQuery.camelCase( name ) ] = data; + } + + // Check for both converted-to-camel and non-converted data property names + // If a data property was specified + if ( typeof name === "string" ) { + + // First Try to find as-is property data + ret = thisCache[ name ]; + + // Test for null|undefined property data + if ( ret == null ) { + + // Try to find the camelCased property + ret = thisCache[ jQuery.camelCase( name ) ]; + } + } else { + ret = thisCache; + } + + return ret; +} + +function internalRemoveData( elem, name, pvt ) { + if ( !jQuery.acceptData( elem ) ) { + return; + } + + var thisCache, i, + isNode = elem.nodeType, + + // See jQuery.data for more information + cache = isNode ? jQuery.cache : elem, + id = isNode ? elem[ jQuery.expando ] : jQuery.expando; + + // If there is already no cache entry for this object, there is no + // purpose in continuing + if ( !cache[ id ] ) { + return; + } + + if ( name ) { + + thisCache = pvt ? cache[ id ] : cache[ id ].data; + + if ( thisCache ) { + + // Support array or space separated string names for data keys + if ( !jQuery.isArray( name ) ) { + + // try the string as a key before any manipulation + if ( name in thisCache ) { + name = [ name ]; + } else { + + // split the camel cased version by spaces unless a key with the spaces exists + name = jQuery.camelCase( name ); + if ( name in thisCache ) { + name = [ name ]; + } else { + name = name.split(" "); + } + } + } else { + // If "name" is an array of keys... + // When data is initially created, via ("key", "val") signature, + // keys will be converted to camelCase. + // Since there is no way to tell _how_ a key was added, remove + // both plain key and camelCase key. #12786 + // This will only penalize the array argument path. + name = name.concat( jQuery.map( name, jQuery.camelCase ) ); + } + + i = name.length; + while ( i-- ) { + delete thisCache[ name[i] ]; + } + + // If there is no data left in the cache, we want to continue + // and let the cache object itself get destroyed + if ( pvt ? !isEmptyDataObject(thisCache) : !jQuery.isEmptyObject(thisCache) ) { + return; + } + } + } + + // See jQuery.data for more information + if ( !pvt ) { + delete cache[ id ].data; + + // Don't destroy the parent cache unless the internal data object + // had been the only thing left in it + if ( !isEmptyDataObject( cache[ id ] ) ) { + return; + } + } + + // Destroy the cache + if ( isNode ) { + jQuery.cleanData( [ elem ], true ); + + // Use delete when supported for expandos or `cache` is not a window per isWindow (#10080) + /* jshint eqeqeq: false */ + } else if ( support.deleteExpando || cache != cache.window ) { + /* jshint eqeqeq: true */ + delete cache[ id ]; + + // When all else fails, null + } else { + cache[ id ] = null; + } +} + +jQuery.extend({ + cache: {}, + + // The following elements (space-suffixed to avoid Object.prototype collisions) + // throw uncatchable exceptions if you attempt to set expando properties + noData: { + "applet ": true, + "embed ": true, + // ...but Flash objects (which have this classid) *can* handle expandos + "object ": "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" + }, + + hasData: function( elem ) { + elem = elem.nodeType ? jQuery.cache[ elem[jQuery.expando] ] : elem[ jQuery.expando ]; + return !!elem && !isEmptyDataObject( elem ); + }, + + data: function( elem, name, data ) { + return internalData( elem, name, data ); + }, + + removeData: function( elem, name ) { + return internalRemoveData( elem, name ); + }, + + // For internal use only. + _data: function( elem, name, data ) { + return internalData( elem, name, data, true ); + }, + + _removeData: function( elem, name ) { + return internalRemoveData( elem, name, true ); + } +}); + +jQuery.fn.extend({ + data: function( key, value ) { + var i, name, data, + elem = this[0], + attrs = elem && elem.attributes; + + // Special expections of .data basically thwart jQuery.access, + // so implement the relevant behavior ourselves + + // Gets all values + if ( key === undefined ) { + if ( this.length ) { + data = jQuery.data( elem ); + + if ( elem.nodeType === 1 && !jQuery._data( elem, "parsedAttrs" ) ) { + i = attrs.length; + while ( i-- ) { + + // Support: IE11+ + // The attrs elements can be null (#14894) + if ( attrs[ i ] ) { + name = attrs[ i ].name; + if ( name.indexOf( "data-" ) === 0 ) { + name = jQuery.camelCase( name.slice(5) ); + dataAttr( elem, name, data[ name ] ); + } + } + } + jQuery._data( elem, "parsedAttrs", true ); + } + } + + return data; + } + + // Sets multiple values + if ( typeof key === "object" ) { + return this.each(function() { + jQuery.data( this, key ); + }); + } + + return arguments.length > 1 ? + + // Sets one value + this.each(function() { + jQuery.data( this, key, value ); + }) : + + // Gets one value + // Try to fetch any internally stored data first + elem ? dataAttr( elem, key, jQuery.data( elem, key ) ) : undefined; + }, + + removeData: function( key ) { + return this.each(function() { + jQuery.removeData( this, key ); + }); + } +}); + + +jQuery.extend({ + queue: function( elem, type, data ) { + var queue; + + if ( elem ) { + type = ( type || "fx" ) + "queue"; + queue = jQuery._data( elem, type ); + + // Speed up dequeue by getting out quickly if this is just a lookup + if ( data ) { + if ( !queue || jQuery.isArray(data) ) { + queue = jQuery._data( elem, type, jQuery.makeArray(data) ); + } else { + queue.push( data ); + } + } + return queue || []; + } + }, + + dequeue: function( elem, type ) { + type = type || "fx"; + + var queue = jQuery.queue( elem, type ), + startLength = queue.length, + fn = queue.shift(), + hooks = jQuery._queueHooks( elem, type ), + next = function() { + jQuery.dequeue( elem, type ); + }; + + // If the fx queue is dequeued, always remove the progress sentinel + if ( fn === "inprogress" ) { + fn = queue.shift(); + startLength--; + } + + if ( fn ) { + + // Add a progress sentinel to prevent the fx queue from being + // automatically dequeued + if ( type === "fx" ) { + queue.unshift( "inprogress" ); + } + + // clear up the last queue stop function + delete hooks.stop; + fn.call( elem, next, hooks ); + } + + if ( !startLength && hooks ) { + hooks.empty.fire(); + } + }, + + // not intended for public consumption - generates a queueHooks object, or returns the current one + _queueHooks: function( elem, type ) { + var key = type + "queueHooks"; + return jQuery._data( elem, key ) || jQuery._data( elem, key, { + empty: jQuery.Callbacks("once memory").add(function() { + jQuery._removeData( elem, type + "queue" ); + jQuery._removeData( elem, key ); + }) + }); + } +}); + +jQuery.fn.extend({ + queue: function( type, data ) { + var setter = 2; + + if ( typeof type !== "string" ) { + data = type; + type = "fx"; + setter--; + } + + if ( arguments.length < setter ) { + return jQuery.queue( this[0], type ); + } + + return data === undefined ? + this : + this.each(function() { + var queue = jQuery.queue( this, type, data ); + + // ensure a hooks for this queue + jQuery._queueHooks( this, type ); + + if ( type === "fx" && queue[0] !== "inprogress" ) { + jQuery.dequeue( this, type ); + } + }); + }, + dequeue: function( type ) { + return this.each(function() { + jQuery.dequeue( this, type ); + }); + }, + clearQueue: function( type ) { + return this.queue( type || "fx", [] ); + }, + // Get a promise resolved when queues of a certain type + // are emptied (fx is the type by default) + promise: function( type, obj ) { + var tmp, + count = 1, + defer = jQuery.Deferred(), + elements = this, + i = this.length, + resolve = function() { + if ( !( --count ) ) { + defer.resolveWith( elements, [ elements ] ); + } + }; + + if ( typeof type !== "string" ) { + obj = type; + type = undefined; + } + type = type || "fx"; + + while ( i-- ) { + tmp = jQuery._data( elements[ i ], type + "queueHooks" ); + if ( tmp && tmp.empty ) { + count++; + tmp.empty.add( resolve ); + } + } + resolve(); + return defer.promise( obj ); + } +}); +var pnum = (/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/).source; + +var cssExpand = [ "Top", "Right", "Bottom", "Left" ]; + +var isHidden = function( elem, el ) { + // isHidden might be called from jQuery#filter function; + // in that case, element will be second argument + elem = el || elem; + return jQuery.css( elem, "display" ) === "none" || !jQuery.contains( elem.ownerDocument, elem ); + }; + + + +// Multifunctional method to get and set values of a collection +// The value/s can optionally be executed if it's a function +var access = jQuery.access = function( elems, fn, key, value, chainable, emptyGet, raw ) { + var i = 0, + length = elems.length, + bulk = key == null; + + // Sets many values + if ( jQuery.type( key ) === "object" ) { + chainable = true; + for ( i in key ) { + jQuery.access( elems, fn, i, key[i], true, emptyGet, raw ); + } + + // Sets one value + } else if ( value !== undefined ) { + chainable = true; + + if ( !jQuery.isFunction( value ) ) { + raw = true; + } + + if ( bulk ) { + // Bulk operations run against the entire set + if ( raw ) { + fn.call( elems, value ); + fn = null; + + // ...except when executing function values + } else { + bulk = fn; + fn = function( elem, key, value ) { + return bulk.call( jQuery( elem ), value ); + }; + } + } + + if ( fn ) { + for ( ; i < length; i++ ) { + fn( elems[i], key, raw ? value : value.call( elems[i], i, fn( elems[i], key ) ) ); + } + } + } + + return chainable ? + elems : + + // Gets + bulk ? + fn.call( elems ) : + length ? fn( elems[0], key ) : emptyGet; +}; +var rcheckableType = (/^(?:checkbox|radio)$/i); + + + +(function() { + // Minified: var a,b,c + var input = document.createElement( "input" ), + div = document.createElement( "div" ), + fragment = document.createDocumentFragment(); + + // Setup + div.innerHTML = "
a"; + + // IE strips leading whitespace when .innerHTML is used + support.leadingWhitespace = div.firstChild.nodeType === 3; + + // Make sure that tbody elements aren't automatically inserted + // IE will insert them into empty tables + support.tbody = !div.getElementsByTagName( "tbody" ).length; + + // Make sure that link elements get serialized correctly by innerHTML + // This requires a wrapper element in IE + support.htmlSerialize = !!div.getElementsByTagName( "link" ).length; + + // Makes sure cloning an html5 element does not cause problems + // Where outerHTML is undefined, this still works + support.html5Clone = + document.createElement( "nav" ).cloneNode( true ).outerHTML !== "<:nav>"; + + // Check if a disconnected checkbox will retain its checked + // value of true after appended to the DOM (IE6/7) + input.type = "checkbox"; + input.checked = true; + fragment.appendChild( input ); + support.appendChecked = input.checked; + + // Make sure textarea (and checkbox) defaultValue is properly cloned + // Support: IE6-IE11+ + div.innerHTML = ""; + support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue; + + // #11217 - WebKit loses check when the name is after the checked attribute + fragment.appendChild( div ); + div.innerHTML = ""; + + // Support: Safari 5.1, iOS 5.1, Android 4.x, Android 2.3 + // old WebKit doesn't clone checked state correctly in fragments + support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked; + + // Support: IE<9 + // Opera does not clone events (and typeof div.attachEvent === undefined). + // IE9-10 clones events bound via attachEvent, but they don't trigger with .click() + support.noCloneEvent = true; + if ( div.attachEvent ) { + div.attachEvent( "onclick", function() { + support.noCloneEvent = false; + }); + + div.cloneNode( true ).click(); + } + + // Execute the test only if not already executed in another module. + if (support.deleteExpando == null) { + // Support: IE<9 + support.deleteExpando = true; + try { + delete div.test; + } catch( e ) { + support.deleteExpando = false; + } + } +})(); + + +(function() { + var i, eventName, + div = document.createElement( "div" ); + + // Support: IE<9 (lack submit/change bubble), Firefox 23+ (lack focusin event) + for ( i in { submit: true, change: true, focusin: true }) { + eventName = "on" + i; + + if ( !(support[ i + "Bubbles" ] = eventName in window) ) { + // Beware of CSP restrictions (https://developer.mozilla.org/en/Security/CSP) + div.setAttribute( eventName, "t" ); + support[ i + "Bubbles" ] = div.attributes[ eventName ].expando === false; + } + } + + // Null elements to avoid leaks in IE. + div = null; +})(); + + +var rformElems = /^(?:input|select|textarea)$/i, + rkeyEvent = /^key/, + rmouseEvent = /^(?:mouse|pointer|contextmenu)|click/, + rfocusMorph = /^(?:focusinfocus|focusoutblur)$/, + rtypenamespace = /^([^.]*)(?:\.(.+)|)$/; + +function returnTrue() { + return true; +} + +function returnFalse() { + return false; +} + +function safeActiveElement() { + try { + return document.activeElement; + } catch ( err ) { } +} + +/* + * Helper functions for managing events -- not part of the public interface. + * Props to Dean Edwards' addEvent library for many of the ideas. + */ +jQuery.event = { + + global: {}, + + add: function( elem, types, handler, data, selector ) { + var tmp, events, t, handleObjIn, + special, eventHandle, handleObj, + handlers, type, namespaces, origType, + elemData = jQuery._data( elem ); + + // Don't attach events to noData or text/comment nodes (but allow plain objects) + if ( !elemData ) { + return; + } + + // Caller can pass in an object of custom data in lieu of the handler + if ( handler.handler ) { + handleObjIn = handler; + handler = handleObjIn.handler; + selector = handleObjIn.selector; + } + + // Make sure that the handler has a unique ID, used to find/remove it later + if ( !handler.guid ) { + handler.guid = jQuery.guid++; + } + + // Init the element's event structure and main handler, if this is the first + if ( !(events = elemData.events) ) { + events = elemData.events = {}; + } + if ( !(eventHandle = elemData.handle) ) { + eventHandle = elemData.handle = function( e ) { + // Discard the second event of a jQuery.event.trigger() and + // when an event is called after a page has unloaded + return typeof jQuery !== strundefined && (!e || jQuery.event.triggered !== e.type) ? + jQuery.event.dispatch.apply( eventHandle.elem, arguments ) : + undefined; + }; + // Add elem as a property of the handle fn to prevent a memory leak with IE non-native events + eventHandle.elem = elem; + } + + // Handle multiple events separated by a space + types = ( types || "" ).match( rnotwhite ) || [ "" ]; + t = types.length; + while ( t-- ) { + tmp = rtypenamespace.exec( types[t] ) || []; + type = origType = tmp[1]; + namespaces = ( tmp[2] || "" ).split( "." ).sort(); + + // There *must* be a type, no attaching namespace-only handlers + if ( !type ) { + continue; + } + + // If event changes its type, use the special event handlers for the changed type + special = jQuery.event.special[ type ] || {}; + + // If selector defined, determine special event api type, otherwise given type + type = ( selector ? special.delegateType : special.bindType ) || type; + + // Update special based on newly reset type + special = jQuery.event.special[ type ] || {}; + + // handleObj is passed to all event handlers + handleObj = jQuery.extend({ + type: type, + origType: origType, + data: data, + handler: handler, + guid: handler.guid, + selector: selector, + needsContext: selector && jQuery.expr.match.needsContext.test( selector ), + namespace: namespaces.join(".") + }, handleObjIn ); + + // Init the event handler queue if we're the first + if ( !(handlers = events[ type ]) ) { + handlers = events[ type ] = []; + handlers.delegateCount = 0; + + // Only use addEventListener/attachEvent if the special events handler returns false + if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) { + // Bind the global event handler to the element + if ( elem.addEventListener ) { + elem.addEventListener( type, eventHandle, false ); + + } else if ( elem.attachEvent ) { + elem.attachEvent( "on" + type, eventHandle ); + } + } + } + + if ( special.add ) { + special.add.call( elem, handleObj ); + + if ( !handleObj.handler.guid ) { + handleObj.handler.guid = handler.guid; + } + } + + // Add to the element's handler list, delegates in front + if ( selector ) { + handlers.splice( handlers.delegateCount++, 0, handleObj ); + } else { + handlers.push( handleObj ); + } + + // Keep track of which events have ever been used, for event optimization + jQuery.event.global[ type ] = true; + } + + // Nullify elem to prevent memory leaks in IE + elem = null; + }, + + // Detach an event or set of events from an element + remove: function( elem, types, handler, selector, mappedTypes ) { + var j, handleObj, tmp, + origCount, t, events, + special, handlers, type, + namespaces, origType, + elemData = jQuery.hasData( elem ) && jQuery._data( elem ); + + if ( !elemData || !(events = elemData.events) ) { + return; + } + + // Once for each type.namespace in types; type may be omitted + types = ( types || "" ).match( rnotwhite ) || [ "" ]; + t = types.length; + while ( t-- ) { + tmp = rtypenamespace.exec( types[t] ) || []; + type = origType = tmp[1]; + namespaces = ( tmp[2] || "" ).split( "." ).sort(); + + // Unbind all events (on this namespace, if provided) for the element + if ( !type ) { + for ( type in events ) { + jQuery.event.remove( elem, type + types[ t ], handler, selector, true ); + } + continue; + } + + special = jQuery.event.special[ type ] || {}; + type = ( selector ? special.delegateType : special.bindType ) || type; + handlers = events[ type ] || []; + tmp = tmp[2] && new RegExp( "(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)" ); + + // Remove matching events + origCount = j = handlers.length; + while ( j-- ) { + handleObj = handlers[ j ]; + + if ( ( mappedTypes || origType === handleObj.origType ) && + ( !handler || handler.guid === handleObj.guid ) && + ( !tmp || tmp.test( handleObj.namespace ) ) && + ( !selector || selector === handleObj.selector || selector === "**" && handleObj.selector ) ) { + handlers.splice( j, 1 ); + + if ( handleObj.selector ) { + handlers.delegateCount--; + } + if ( special.remove ) { + special.remove.call( elem, handleObj ); + } + } + } + + // Remove generic event handler if we removed something and no more handlers exist + // (avoids potential for endless recursion during removal of special event handlers) + if ( origCount && !handlers.length ) { + if ( !special.teardown || special.teardown.call( elem, namespaces, elemData.handle ) === false ) { + jQuery.removeEvent( elem, type, elemData.handle ); + } + + delete events[ type ]; + } + } + + // Remove the expando if it's no longer used + if ( jQuery.isEmptyObject( events ) ) { + delete elemData.handle; + + // removeData also checks for emptiness and clears the expando if empty + // so use it instead of delete + jQuery._removeData( elem, "events" ); + } + }, + + trigger: function( event, data, elem, onlyHandlers ) { + var handle, ontype, cur, + bubbleType, special, tmp, i, + eventPath = [ elem || document ], + type = hasOwn.call( event, "type" ) ? event.type : event, + namespaces = hasOwn.call( event, "namespace" ) ? event.namespace.split(".") : []; + + cur = tmp = elem = elem || document; + + // Don't do events on text and comment nodes + if ( elem.nodeType === 3 || elem.nodeType === 8 ) { + return; + } + + // focus/blur morphs to focusin/out; ensure we're not firing them right now + if ( rfocusMorph.test( type + jQuery.event.triggered ) ) { + return; + } + + if ( type.indexOf(".") >= 0 ) { + // Namespaced trigger; create a regexp to match event type in handle() + namespaces = type.split("."); + type = namespaces.shift(); + namespaces.sort(); + } + ontype = type.indexOf(":") < 0 && "on" + type; + + // Caller can pass in a jQuery.Event object, Object, or just an event type string + event = event[ jQuery.expando ] ? + event : + new jQuery.Event( type, typeof event === "object" && event ); + + // Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true) + event.isTrigger = onlyHandlers ? 2 : 3; + event.namespace = namespaces.join("."); + event.namespace_re = event.namespace ? + new RegExp( "(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)" ) : + null; + + // Clean up the event in case it is being reused + event.result = undefined; + if ( !event.target ) { + event.target = elem; + } + + // Clone any incoming data and prepend the event, creating the handler arg list + data = data == null ? + [ event ] : + jQuery.makeArray( data, [ event ] ); + + // Allow special events to draw outside the lines + special = jQuery.event.special[ type ] || {}; + if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) { + return; + } + + // Determine event propagation path in advance, per W3C events spec (#9951) + // Bubble up to document, then to window; watch for a global ownerDocument var (#9724) + if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) { + + bubbleType = special.delegateType || type; + if ( !rfocusMorph.test( bubbleType + type ) ) { + cur = cur.parentNode; + } + for ( ; cur; cur = cur.parentNode ) { + eventPath.push( cur ); + tmp = cur; + } + + // Only add window if we got to document (e.g., not plain obj or detached DOM) + if ( tmp === (elem.ownerDocument || document) ) { + eventPath.push( tmp.defaultView || tmp.parentWindow || window ); + } + } + + // Fire handlers on the event path + i = 0; + while ( (cur = eventPath[i++]) && !event.isPropagationStopped() ) { + + event.type = i > 1 ? + bubbleType : + special.bindType || type; + + // jQuery handler + handle = ( jQuery._data( cur, "events" ) || {} )[ event.type ] && jQuery._data( cur, "handle" ); + if ( handle ) { + handle.apply( cur, data ); + } + + // Native handler + handle = ontype && cur[ ontype ]; + if ( handle && handle.apply && jQuery.acceptData( cur ) ) { + event.result = handle.apply( cur, data ); + if ( event.result === false ) { + event.preventDefault(); + } + } + } + event.type = type; + + // If nobody prevented the default action, do it now + if ( !onlyHandlers && !event.isDefaultPrevented() ) { + + if ( (!special._default || special._default.apply( eventPath.pop(), data ) === false) && + jQuery.acceptData( elem ) ) { + + // Call a native DOM method on the target with the same name name as the event. + // Can't use an .isFunction() check here because IE6/7 fails that test. + // Don't do default actions on window, that's where global variables be (#6170) + if ( ontype && elem[ type ] && !jQuery.isWindow( elem ) ) { + + // Don't re-trigger an onFOO event when we call its FOO() method + tmp = elem[ ontype ]; + + if ( tmp ) { + elem[ ontype ] = null; + } + + // Prevent re-triggering of the same event, since we already bubbled it above + jQuery.event.triggered = type; + try { + elem[ type ](); + } catch ( e ) { + // IE<9 dies on focus/blur to hidden element (#1486,#12518) + // only reproducible on winXP IE8 native, not IE9 in IE8 mode + } + jQuery.event.triggered = undefined; + + if ( tmp ) { + elem[ ontype ] = tmp; + } + } + } + } + + return event.result; + }, + + dispatch: function( event ) { + + // Make a writable jQuery.Event from the native event object + event = jQuery.event.fix( event ); + + var i, ret, handleObj, matched, j, + handlerQueue = [], + args = slice.call( arguments ), + handlers = ( jQuery._data( this, "events" ) || {} )[ event.type ] || [], + special = jQuery.event.special[ event.type ] || {}; + + // Use the fix-ed jQuery.Event rather than the (read-only) native event + args[0] = event; + event.delegateTarget = this; + + // Call the preDispatch hook for the mapped type, and let it bail if desired + if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) { + return; + } + + // Determine handlers + handlerQueue = jQuery.event.handlers.call( this, event, handlers ); + + // Run delegates first; they may want to stop propagation beneath us + i = 0; + while ( (matched = handlerQueue[ i++ ]) && !event.isPropagationStopped() ) { + event.currentTarget = matched.elem; + + j = 0; + while ( (handleObj = matched.handlers[ j++ ]) && !event.isImmediatePropagationStopped() ) { + + // Triggered event must either 1) have no namespace, or + // 2) have namespace(s) a subset or equal to those in the bound event (both can have no namespace). + if ( !event.namespace_re || event.namespace_re.test( handleObj.namespace ) ) { + + event.handleObj = handleObj; + event.data = handleObj.data; + + ret = ( (jQuery.event.special[ handleObj.origType ] || {}).handle || handleObj.handler ) + .apply( matched.elem, args ); + + if ( ret !== undefined ) { + if ( (event.result = ret) === false ) { + event.preventDefault(); + event.stopPropagation(); + } + } + } + } + } + + // Call the postDispatch hook for the mapped type + if ( special.postDispatch ) { + special.postDispatch.call( this, event ); + } + + return event.result; + }, + + handlers: function( event, handlers ) { + var sel, handleObj, matches, i, + handlerQueue = [], + delegateCount = handlers.delegateCount, + cur = event.target; + + // Find delegate handlers + // Black-hole SVG instance trees (#13180) + // Avoid non-left-click bubbling in Firefox (#3861) + if ( delegateCount && cur.nodeType && (!event.button || event.type !== "click") ) { + + /* jshint eqeqeq: false */ + for ( ; cur != this; cur = cur.parentNode || this ) { + /* jshint eqeqeq: true */ + + // Don't check non-elements (#13208) + // Don't process clicks on disabled elements (#6911, #8165, #11382, #11764) + if ( cur.nodeType === 1 && (cur.disabled !== true || event.type !== "click") ) { + matches = []; + for ( i = 0; i < delegateCount; i++ ) { + handleObj = handlers[ i ]; + + // Don't conflict with Object.prototype properties (#13203) + sel = handleObj.selector + " "; + + if ( matches[ sel ] === undefined ) { + matches[ sel ] = handleObj.needsContext ? + jQuery( sel, this ).index( cur ) >= 0 : + jQuery.find( sel, this, null, [ cur ] ).length; + } + if ( matches[ sel ] ) { + matches.push( handleObj ); + } + } + if ( matches.length ) { + handlerQueue.push({ elem: cur, handlers: matches }); + } + } + } + } + + // Add the remaining (directly-bound) handlers + if ( delegateCount < handlers.length ) { + handlerQueue.push({ elem: this, handlers: handlers.slice( delegateCount ) }); + } + + return handlerQueue; + }, + + fix: function( event ) { + if ( event[ jQuery.expando ] ) { + return event; + } + + // Create a writable copy of the event object and normalize some properties + var i, prop, copy, + type = event.type, + originalEvent = event, + fixHook = this.fixHooks[ type ]; + + if ( !fixHook ) { + this.fixHooks[ type ] = fixHook = + rmouseEvent.test( type ) ? this.mouseHooks : + rkeyEvent.test( type ) ? this.keyHooks : + {}; + } + copy = fixHook.props ? this.props.concat( fixHook.props ) : this.props; + + event = new jQuery.Event( originalEvent ); + + i = copy.length; + while ( i-- ) { + prop = copy[ i ]; + event[ prop ] = originalEvent[ prop ]; + } + + // Support: IE<9 + // Fix target property (#1925) + if ( !event.target ) { + event.target = originalEvent.srcElement || document; + } + + // Support: Chrome 23+, Safari? + // Target should not be a text node (#504, #13143) + if ( event.target.nodeType === 3 ) { + event.target = event.target.parentNode; + } + + // Support: IE<9 + // For mouse/key events, metaKey==false if it's undefined (#3368, #11328) + event.metaKey = !!event.metaKey; + + return fixHook.filter ? fixHook.filter( event, originalEvent ) : event; + }, + + // Includes some event props shared by KeyEvent and MouseEvent + props: "altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "), + + fixHooks: {}, + + keyHooks: { + props: "char charCode key keyCode".split(" "), + filter: function( event, original ) { + + // Add which for key events + if ( event.which == null ) { + event.which = original.charCode != null ? original.charCode : original.keyCode; + } + + return event; + } + }, + + mouseHooks: { + props: "button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "), + filter: function( event, original ) { + var body, eventDoc, doc, + button = original.button, + fromElement = original.fromElement; + + // Calculate pageX/Y if missing and clientX/Y available + if ( event.pageX == null && original.clientX != null ) { + eventDoc = event.target.ownerDocument || document; + doc = eventDoc.documentElement; + body = eventDoc.body; + + event.pageX = original.clientX + ( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) - ( doc && doc.clientLeft || body && body.clientLeft || 0 ); + event.pageY = original.clientY + ( doc && doc.scrollTop || body && body.scrollTop || 0 ) - ( doc && doc.clientTop || body && body.clientTop || 0 ); + } + + // Add relatedTarget, if necessary + if ( !event.relatedTarget && fromElement ) { + event.relatedTarget = fromElement === event.target ? original.toElement : fromElement; + } + + // Add which for click: 1 === left; 2 === middle; 3 === right + // Note: button is not normalized, so don't use it + if ( !event.which && button !== undefined ) { + event.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) ); + } + + return event; + } + }, + + special: { + load: { + // Prevent triggered image.load events from bubbling to window.load + noBubble: true + }, + focus: { + // Fire native event if possible so blur/focus sequence is correct + trigger: function() { + if ( this !== safeActiveElement() && this.focus ) { + try { + this.focus(); + return false; + } catch ( e ) { + // Support: IE<9 + // If we error on focus to hidden element (#1486, #12518), + // let .trigger() run the handlers + } + } + }, + delegateType: "focusin" + }, + blur: { + trigger: function() { + if ( this === safeActiveElement() && this.blur ) { + this.blur(); + return false; + } + }, + delegateType: "focusout" + }, + click: { + // For checkbox, fire native event so checked state will be right + trigger: function() { + if ( jQuery.nodeName( this, "input" ) && this.type === "checkbox" && this.click ) { + this.click(); + return false; + } + }, + + // For cross-browser consistency, don't fire native .click() on links + _default: function( event ) { + return jQuery.nodeName( event.target, "a" ); + } + }, + + beforeunload: { + postDispatch: function( event ) { + + // Support: Firefox 20+ + // Firefox doesn't alert if the returnValue field is not set. + if ( event.result !== undefined && event.originalEvent ) { + event.originalEvent.returnValue = event.result; + } + } + } + }, + + simulate: function( type, elem, event, bubble ) { + // Piggyback on a donor event to simulate a different one. + // Fake originalEvent to avoid donor's stopPropagation, but if the + // simulated event prevents default then we do the same on the donor. + var e = jQuery.extend( + new jQuery.Event(), + event, + { + type: type, + isSimulated: true, + originalEvent: {} + } + ); + if ( bubble ) { + jQuery.event.trigger( e, null, elem ); + } else { + jQuery.event.dispatch.call( elem, e ); + } + if ( e.isDefaultPrevented() ) { + event.preventDefault(); + } + } +}; + +jQuery.removeEvent = document.removeEventListener ? + function( elem, type, handle ) { + if ( elem.removeEventListener ) { + elem.removeEventListener( type, handle, false ); + } + } : + function( elem, type, handle ) { + var name = "on" + type; + + if ( elem.detachEvent ) { + + // #8545, #7054, preventing memory leaks for custom events in IE6-8 + // detachEvent needed property on element, by name of that event, to properly expose it to GC + if ( typeof elem[ name ] === strundefined ) { + elem[ name ] = null; + } + + elem.detachEvent( name, handle ); + } + }; + +jQuery.Event = function( src, props ) { + // Allow instantiation without the 'new' keyword + if ( !(this instanceof jQuery.Event) ) { + return new jQuery.Event( src, props ); + } + + // Event object + if ( src && src.type ) { + this.originalEvent = src; + this.type = src.type; + + // Events bubbling up the document may have been marked as prevented + // by a handler lower down the tree; reflect the correct value. + this.isDefaultPrevented = src.defaultPrevented || + src.defaultPrevented === undefined && + // Support: IE < 9, Android < 4.0 + src.returnValue === false ? + returnTrue : + returnFalse; + + // Event type + } else { + this.type = src; + } + + // Put explicitly provided properties onto the event object + if ( props ) { + jQuery.extend( this, props ); + } + + // Create a timestamp if incoming event doesn't have one + this.timeStamp = src && src.timeStamp || jQuery.now(); + + // Mark it as fixed + this[ jQuery.expando ] = true; +}; + +// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding +// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html +jQuery.Event.prototype = { + isDefaultPrevented: returnFalse, + isPropagationStopped: returnFalse, + isImmediatePropagationStopped: returnFalse, + + preventDefault: function() { + var e = this.originalEvent; + + this.isDefaultPrevented = returnTrue; + if ( !e ) { + return; + } + + // If preventDefault exists, run it on the original event + if ( e.preventDefault ) { + e.preventDefault(); + + // Support: IE + // Otherwise set the returnValue property of the original event to false + } else { + e.returnValue = false; + } + }, + stopPropagation: function() { + var e = this.originalEvent; + + this.isPropagationStopped = returnTrue; + if ( !e ) { + return; + } + // If stopPropagation exists, run it on the original event + if ( e.stopPropagation ) { + e.stopPropagation(); + } + + // Support: IE + // Set the cancelBubble property of the original event to true + e.cancelBubble = true; + }, + stopImmediatePropagation: function() { + var e = this.originalEvent; + + this.isImmediatePropagationStopped = returnTrue; + + if ( e && e.stopImmediatePropagation ) { + e.stopImmediatePropagation(); + } + + this.stopPropagation(); + } +}; + +// Create mouseenter/leave events using mouseover/out and event-time checks +jQuery.each({ + mouseenter: "mouseover", + mouseleave: "mouseout", + pointerenter: "pointerover", + pointerleave: "pointerout" +}, function( orig, fix ) { + jQuery.event.special[ orig ] = { + delegateType: fix, + bindType: fix, + + handle: function( event ) { + var ret, + target = this, + related = event.relatedTarget, + handleObj = event.handleObj; + + // For mousenter/leave call the handler if related is outside the target. + // NB: No relatedTarget if the mouse left/entered the browser window + if ( !related || (related !== target && !jQuery.contains( target, related )) ) { + event.type = handleObj.origType; + ret = handleObj.handler.apply( this, arguments ); + event.type = fix; + } + return ret; + } + }; +}); + +// IE submit delegation +if ( !support.submitBubbles ) { + + jQuery.event.special.submit = { + setup: function() { + // Only need this for delegated form submit events + if ( jQuery.nodeName( this, "form" ) ) { + return false; + } + + // Lazy-add a submit handler when a descendant form may potentially be submitted + jQuery.event.add( this, "click._submit keypress._submit", function( e ) { + // Node name check avoids a VML-related crash in IE (#9807) + var elem = e.target, + form = jQuery.nodeName( elem, "input" ) || jQuery.nodeName( elem, "button" ) ? elem.form : undefined; + if ( form && !jQuery._data( form, "submitBubbles" ) ) { + jQuery.event.add( form, "submit._submit", function( event ) { + event._submit_bubble = true; + }); + jQuery._data( form, "submitBubbles", true ); + } + }); + // return undefined since we don't need an event listener + }, + + postDispatch: function( event ) { + // If form was submitted by the user, bubble the event up the tree + if ( event._submit_bubble ) { + delete event._submit_bubble; + if ( this.parentNode && !event.isTrigger ) { + jQuery.event.simulate( "submit", this.parentNode, event, true ); + } + } + }, + + teardown: function() { + // Only need this for delegated form submit events + if ( jQuery.nodeName( this, "form" ) ) { + return false; + } + + // Remove delegated handlers; cleanData eventually reaps submit handlers attached above + jQuery.event.remove( this, "._submit" ); + } + }; +} + +// IE change delegation and checkbox/radio fix +if ( !support.changeBubbles ) { + + jQuery.event.special.change = { + + setup: function() { + + if ( rformElems.test( this.nodeName ) ) { + // IE doesn't fire change on a check/radio until blur; trigger it on click + // after a propertychange. Eat the blur-change in special.change.handle. + // This still fires onchange a second time for check/radio after blur. + if ( this.type === "checkbox" || this.type === "radio" ) { + jQuery.event.add( this, "propertychange._change", function( event ) { + if ( event.originalEvent.propertyName === "checked" ) { + this._just_changed = true; + } + }); + jQuery.event.add( this, "click._change", function( event ) { + if ( this._just_changed && !event.isTrigger ) { + this._just_changed = false; + } + // Allow triggered, simulated change events (#11500) + jQuery.event.simulate( "change", this, event, true ); + }); + } + return false; + } + // Delegated event; lazy-add a change handler on descendant inputs + jQuery.event.add( this, "beforeactivate._change", function( e ) { + var elem = e.target; + + if ( rformElems.test( elem.nodeName ) && !jQuery._data( elem, "changeBubbles" ) ) { + jQuery.event.add( elem, "change._change", function( event ) { + if ( this.parentNode && !event.isSimulated && !event.isTrigger ) { + jQuery.event.simulate( "change", this.parentNode, event, true ); + } + }); + jQuery._data( elem, "changeBubbles", true ); + } + }); + }, + + handle: function( event ) { + var elem = event.target; + + // Swallow native change events from checkbox/radio, we already triggered them above + if ( this !== elem || event.isSimulated || event.isTrigger || (elem.type !== "radio" && elem.type !== "checkbox") ) { + return event.handleObj.handler.apply( this, arguments ); + } + }, + + teardown: function() { + jQuery.event.remove( this, "._change" ); + + return !rformElems.test( this.nodeName ); + } + }; +} + +// Create "bubbling" focus and blur events +if ( !support.focusinBubbles ) { + jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fix ) { + + // Attach a single capturing handler on the document while someone wants focusin/focusout + var handler = function( event ) { + jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ), true ); + }; + + jQuery.event.special[ fix ] = { + setup: function() { + var doc = this.ownerDocument || this, + attaches = jQuery._data( doc, fix ); + + if ( !attaches ) { + doc.addEventListener( orig, handler, true ); + } + jQuery._data( doc, fix, ( attaches || 0 ) + 1 ); + }, + teardown: function() { + var doc = this.ownerDocument || this, + attaches = jQuery._data( doc, fix ) - 1; + + if ( !attaches ) { + doc.removeEventListener( orig, handler, true ); + jQuery._removeData( doc, fix ); + } else { + jQuery._data( doc, fix, attaches ); + } + } + }; + }); +} + +jQuery.fn.extend({ + + on: function( types, selector, data, fn, /*INTERNAL*/ one ) { + var type, origFn; + + // Types can be a map of types/handlers + if ( typeof types === "object" ) { + // ( types-Object, selector, data ) + if ( typeof selector !== "string" ) { + // ( types-Object, data ) + data = data || selector; + selector = undefined; + } + for ( type in types ) { + this.on( type, selector, data, types[ type ], one ); + } + return this; + } + + if ( data == null && fn == null ) { + // ( types, fn ) + fn = selector; + data = selector = undefined; + } else if ( fn == null ) { + if ( typeof selector === "string" ) { + // ( types, selector, fn ) + fn = data; + data = undefined; + } else { + // ( types, data, fn ) + fn = data; + data = selector; + selector = undefined; + } + } + if ( fn === false ) { + fn = returnFalse; + } else if ( !fn ) { + return this; + } + + if ( one === 1 ) { + origFn = fn; + fn = function( event ) { + // Can use an empty set, since event contains the info + jQuery().off( event ); + return origFn.apply( this, arguments ); + }; + // Use same guid so caller can remove using origFn + fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ ); + } + return this.each( function() { + jQuery.event.add( this, types, fn, data, selector ); + }); + }, + one: function( types, selector, data, fn ) { + return this.on( types, selector, data, fn, 1 ); + }, + off: function( types, selector, fn ) { + var handleObj, type; + if ( types && types.preventDefault && types.handleObj ) { + // ( event ) dispatched jQuery.Event + handleObj = types.handleObj; + jQuery( types.delegateTarget ).off( + handleObj.namespace ? handleObj.origType + "." + handleObj.namespace : handleObj.origType, + handleObj.selector, + handleObj.handler + ); + return this; + } + if ( typeof types === "object" ) { + // ( types-object [, selector] ) + for ( type in types ) { + this.off( type, selector, types[ type ] ); + } + return this; + } + if ( selector === false || typeof selector === "function" ) { + // ( types [, fn] ) + fn = selector; + selector = undefined; + } + if ( fn === false ) { + fn = returnFalse; + } + return this.each(function() { + jQuery.event.remove( this, types, fn, selector ); + }); + }, + + trigger: function( type, data ) { + return this.each(function() { + jQuery.event.trigger( type, data, this ); + }); + }, + triggerHandler: function( type, data ) { + var elem = this[0]; + if ( elem ) { + return jQuery.event.trigger( type, data, elem, true ); + } + } +}); + + +function createSafeFragment( document ) { + var list = nodeNames.split( "|" ), + safeFrag = document.createDocumentFragment(); + + if ( safeFrag.createElement ) { + while ( list.length ) { + safeFrag.createElement( + list.pop() + ); + } + } + return safeFrag; +} + +var nodeNames = "abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|" + + "header|hgroup|mark|meter|nav|output|progress|section|summary|time|video", + rinlinejQuery = / jQuery\d+="(?:null|\d+)"/g, + rnoshimcache = new RegExp("<(?:" + nodeNames + ")[\\s/>]", "i"), + rleadingWhitespace = /^\s+/, + rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi, + rtagName = /<([\w:]+)/, + rtbody = /\s*$/g, + + // We have to close these tags to support XHTML (#13200) + wrapMap = { + option: [ 1, "" ], + legend: [ 1, "
", "
" ], + area: [ 1, "", "" ], + param: [ 1, "", "" ], + thead: [ 1, "", "
" ], + tr: [ 2, "", "
" ], + col: [ 2, "", "
" ], + td: [ 3, "", "
" ], + + // IE6-8 can't serialize link, script, style, or any html5 (NoScope) tags, + // unless wrapped in a div with non-breaking characters in front of it. + _default: support.htmlSerialize ? [ 0, "", "" ] : [ 1, "X
", "
" ] + }, + safeFragment = createSafeFragment( document ), + fragmentDiv = safeFragment.appendChild( document.createElement("div") ); + +wrapMap.optgroup = wrapMap.option; +wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; +wrapMap.th = wrapMap.td; + +function getAll( context, tag ) { + var elems, elem, + i = 0, + found = typeof context.getElementsByTagName !== strundefined ? context.getElementsByTagName( tag || "*" ) : + typeof context.querySelectorAll !== strundefined ? context.querySelectorAll( tag || "*" ) : + undefined; + + if ( !found ) { + for ( found = [], elems = context.childNodes || context; (elem = elems[i]) != null; i++ ) { + if ( !tag || jQuery.nodeName( elem, tag ) ) { + found.push( elem ); + } else { + jQuery.merge( found, getAll( elem, tag ) ); + } + } + } + + return tag === undefined || tag && jQuery.nodeName( context, tag ) ? + jQuery.merge( [ context ], found ) : + found; +} + +// Used in buildFragment, fixes the defaultChecked property +function fixDefaultChecked( elem ) { + if ( rcheckableType.test( elem.type ) ) { + elem.defaultChecked = elem.checked; + } +} + +// Support: IE<8 +// Manipulating tables requires a tbody +function manipulationTarget( elem, content ) { + return jQuery.nodeName( elem, "table" ) && + jQuery.nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr" ) ? + + elem.getElementsByTagName("tbody")[0] || + elem.appendChild( elem.ownerDocument.createElement("tbody") ) : + elem; +} + +// Replace/restore the type attribute of script elements for safe DOM manipulation +function disableScript( elem ) { + elem.type = (jQuery.find.attr( elem, "type" ) !== null) + "/" + elem.type; + return elem; +} +function restoreScript( elem ) { + var match = rscriptTypeMasked.exec( elem.type ); + if ( match ) { + elem.type = match[1]; + } else { + elem.removeAttribute("type"); + } + return elem; +} + +// Mark scripts as having already been evaluated +function setGlobalEval( elems, refElements ) { + var elem, + i = 0; + for ( ; (elem = elems[i]) != null; i++ ) { + jQuery._data( elem, "globalEval", !refElements || jQuery._data( refElements[i], "globalEval" ) ); + } +} + +function cloneCopyEvent( src, dest ) { + + if ( dest.nodeType !== 1 || !jQuery.hasData( src ) ) { + return; + } + + var type, i, l, + oldData = jQuery._data( src ), + curData = jQuery._data( dest, oldData ), + events = oldData.events; + + if ( events ) { + delete curData.handle; + curData.events = {}; + + for ( type in events ) { + for ( i = 0, l = events[ type ].length; i < l; i++ ) { + jQuery.event.add( dest, type, events[ type ][ i ] ); + } + } + } + + // make the cloned public data object a copy from the original + if ( curData.data ) { + curData.data = jQuery.extend( {}, curData.data ); + } +} + +function fixCloneNodeIssues( src, dest ) { + var nodeName, e, data; + + // We do not need to do anything for non-Elements + if ( dest.nodeType !== 1 ) { + return; + } + + nodeName = dest.nodeName.toLowerCase(); + + // IE6-8 copies events bound via attachEvent when using cloneNode. + if ( !support.noCloneEvent && dest[ jQuery.expando ] ) { + data = jQuery._data( dest ); + + for ( e in data.events ) { + jQuery.removeEvent( dest, e, data.handle ); + } + + // Event data gets referenced instead of copied if the expando gets copied too + dest.removeAttribute( jQuery.expando ); + } + + // IE blanks contents when cloning scripts, and tries to evaluate newly-set text + if ( nodeName === "script" && dest.text !== src.text ) { + disableScript( dest ).text = src.text; + restoreScript( dest ); + + // IE6-10 improperly clones children of object elements using classid. + // IE10 throws NoModificationAllowedError if parent is null, #12132. + } else if ( nodeName === "object" ) { + if ( dest.parentNode ) { + dest.outerHTML = src.outerHTML; + } + + // This path appears unavoidable for IE9. When cloning an object + // element in IE9, the outerHTML strategy above is not sufficient. + // If the src has innerHTML and the destination does not, + // copy the src.innerHTML into the dest.innerHTML. #10324 + if ( support.html5Clone && ( src.innerHTML && !jQuery.trim(dest.innerHTML) ) ) { + dest.innerHTML = src.innerHTML; + } + + } else if ( nodeName === "input" && rcheckableType.test( src.type ) ) { + // IE6-8 fails to persist the checked state of a cloned checkbox + // or radio button. Worse, IE6-7 fail to give the cloned element + // a checked appearance if the defaultChecked value isn't also set + + dest.defaultChecked = dest.checked = src.checked; + + // IE6-7 get confused and end up setting the value of a cloned + // checkbox/radio button to an empty string instead of "on" + if ( dest.value !== src.value ) { + dest.value = src.value; + } + + // IE6-8 fails to return the selected option to the default selected + // state when cloning options + } else if ( nodeName === "option" ) { + dest.defaultSelected = dest.selected = src.defaultSelected; + + // IE6-8 fails to set the defaultValue to the correct value when + // cloning other types of input fields + } else if ( nodeName === "input" || nodeName === "textarea" ) { + dest.defaultValue = src.defaultValue; + } +} + +jQuery.extend({ + clone: function( elem, dataAndEvents, deepDataAndEvents ) { + var destElements, node, clone, i, srcElements, + inPage = jQuery.contains( elem.ownerDocument, elem ); + + if ( support.html5Clone || jQuery.isXMLDoc(elem) || !rnoshimcache.test( "<" + elem.nodeName + ">" ) ) { + clone = elem.cloneNode( true ); + + // IE<=8 does not properly clone detached, unknown element nodes + } else { + fragmentDiv.innerHTML = elem.outerHTML; + fragmentDiv.removeChild( clone = fragmentDiv.firstChild ); + } + + if ( (!support.noCloneEvent || !support.noCloneChecked) && + (elem.nodeType === 1 || elem.nodeType === 11) && !jQuery.isXMLDoc(elem) ) { + + // We eschew Sizzle here for performance reasons: http://jsperf.com/getall-vs-sizzle/2 + destElements = getAll( clone ); + srcElements = getAll( elem ); + + // Fix all IE cloning issues + for ( i = 0; (node = srcElements[i]) != null; ++i ) { + // Ensure that the destination node is not null; Fixes #9587 + if ( destElements[i] ) { + fixCloneNodeIssues( node, destElements[i] ); + } + } + } + + // Copy the events from the original to the clone + if ( dataAndEvents ) { + if ( deepDataAndEvents ) { + srcElements = srcElements || getAll( elem ); + destElements = destElements || getAll( clone ); + + for ( i = 0; (node = srcElements[i]) != null; i++ ) { + cloneCopyEvent( node, destElements[i] ); + } + } else { + cloneCopyEvent( elem, clone ); + } + } + + // Preserve script evaluation history + destElements = getAll( clone, "script" ); + if ( destElements.length > 0 ) { + setGlobalEval( destElements, !inPage && getAll( elem, "script" ) ); + } + + destElements = srcElements = node = null; + + // Return the cloned set + return clone; + }, + + buildFragment: function( elems, context, scripts, selection ) { + var j, elem, contains, + tmp, tag, tbody, wrap, + l = elems.length, + + // Ensure a safe fragment + safe = createSafeFragment( context ), + + nodes = [], + i = 0; + + for ( ; i < l; i++ ) { + elem = elems[ i ]; + + if ( elem || elem === 0 ) { + + // Add nodes directly + if ( jQuery.type( elem ) === "object" ) { + jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem ); + + // Convert non-html into a text node + } else if ( !rhtml.test( elem ) ) { + nodes.push( context.createTextNode( elem ) ); + + // Convert html into DOM nodes + } else { + tmp = tmp || safe.appendChild( context.createElement("div") ); + + // Deserialize a standard representation + tag = (rtagName.exec( elem ) || [ "", "" ])[ 1 ].toLowerCase(); + wrap = wrapMap[ tag ] || wrapMap._default; + + tmp.innerHTML = wrap[1] + elem.replace( rxhtmlTag, "<$1>" ) + wrap[2]; + + // Descend through wrappers to the right content + j = wrap[0]; + while ( j-- ) { + tmp = tmp.lastChild; + } + + // Manually add leading whitespace removed by IE + if ( !support.leadingWhitespace && rleadingWhitespace.test( elem ) ) { + nodes.push( context.createTextNode( rleadingWhitespace.exec( elem )[0] ) ); + } + + // Remove IE's autoinserted from table fragments + if ( !support.tbody ) { + + // String was a , *may* have spurious + elem = tag === "table" && !rtbody.test( elem ) ? + tmp.firstChild : + + // String was a bare or + wrap[1] === "
" && !rtbody.test( elem ) ? + tmp : + 0; + + j = elem && elem.childNodes.length; + while ( j-- ) { + if ( jQuery.nodeName( (tbody = elem.childNodes[j]), "tbody" ) && !tbody.childNodes.length ) { + elem.removeChild( tbody ); + } + } + } + + jQuery.merge( nodes, tmp.childNodes ); + + // Fix #12392 for WebKit and IE > 9 + tmp.textContent = ""; + + // Fix #12392 for oldIE + while ( tmp.firstChild ) { + tmp.removeChild( tmp.firstChild ); + } + + // Remember the top-level container for proper cleanup + tmp = safe.lastChild; + } + } + } + + // Fix #11356: Clear elements from fragment + if ( tmp ) { + safe.removeChild( tmp ); + } + + // Reset defaultChecked for any radios and checkboxes + // about to be appended to the DOM in IE 6/7 (#8060) + if ( !support.appendChecked ) { + jQuery.grep( getAll( nodes, "input" ), fixDefaultChecked ); + } + + i = 0; + while ( (elem = nodes[ i++ ]) ) { + + // #4087 - If origin and destination elements are the same, and this is + // that element, do not do anything + if ( selection && jQuery.inArray( elem, selection ) !== -1 ) { + continue; + } + + contains = jQuery.contains( elem.ownerDocument, elem ); + + // Append to fragment + tmp = getAll( safe.appendChild( elem ), "script" ); + + // Preserve script evaluation history + if ( contains ) { + setGlobalEval( tmp ); + } + + // Capture executables + if ( scripts ) { + j = 0; + while ( (elem = tmp[ j++ ]) ) { + if ( rscriptType.test( elem.type || "" ) ) { + scripts.push( elem ); + } + } + } + } + + tmp = null; + + return safe; + }, + + cleanData: function( elems, /* internal */ acceptData ) { + var elem, type, id, data, + i = 0, + internalKey = jQuery.expando, + cache = jQuery.cache, + deleteExpando = support.deleteExpando, + special = jQuery.event.special; + + for ( ; (elem = elems[i]) != null; i++ ) { + if ( acceptData || jQuery.acceptData( elem ) ) { + + id = elem[ internalKey ]; + data = id && cache[ id ]; + + if ( data ) { + if ( data.events ) { + for ( type in data.events ) { + if ( special[ type ] ) { + jQuery.event.remove( elem, type ); + + // This is a shortcut to avoid jQuery.event.remove's overhead + } else { + jQuery.removeEvent( elem, type, data.handle ); + } + } + } + + // Remove cache only if it was not already removed by jQuery.event.remove + if ( cache[ id ] ) { + + delete cache[ id ]; + + // IE does not allow us to delete expando properties from nodes, + // nor does it have a removeAttribute function on Document nodes; + // we must handle all of these cases + if ( deleteExpando ) { + delete elem[ internalKey ]; + + } else if ( typeof elem.removeAttribute !== strundefined ) { + elem.removeAttribute( internalKey ); + + } else { + elem[ internalKey ] = null; + } + + deletedIds.push( id ); + } + } + } + } + } +}); + +jQuery.fn.extend({ + text: function( value ) { + return access( this, function( value ) { + return value === undefined ? + jQuery.text( this ) : + this.empty().append( ( this[0] && this[0].ownerDocument || document ).createTextNode( value ) ); + }, null, value, arguments.length ); + }, + + append: function() { + return this.domManip( arguments, function( elem ) { + if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { + var target = manipulationTarget( this, elem ); + target.appendChild( elem ); + } + }); + }, + + prepend: function() { + return this.domManip( arguments, function( elem ) { + if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { + var target = manipulationTarget( this, elem ); + target.insertBefore( elem, target.firstChild ); + } + }); + }, + + before: function() { + return this.domManip( arguments, function( elem ) { + if ( this.parentNode ) { + this.parentNode.insertBefore( elem, this ); + } + }); + }, + + after: function() { + return this.domManip( arguments, function( elem ) { + if ( this.parentNode ) { + this.parentNode.insertBefore( elem, this.nextSibling ); + } + }); + }, + + remove: function( selector, keepData /* Internal Use Only */ ) { + var elem, + elems = selector ? jQuery.filter( selector, this ) : this, + i = 0; + + for ( ; (elem = elems[i]) != null; i++ ) { + + if ( !keepData && elem.nodeType === 1 ) { + jQuery.cleanData( getAll( elem ) ); + } + + if ( elem.parentNode ) { + if ( keepData && jQuery.contains( elem.ownerDocument, elem ) ) { + setGlobalEval( getAll( elem, "script" ) ); + } + elem.parentNode.removeChild( elem ); + } + } + + return this; + }, + + empty: function() { + var elem, + i = 0; + + for ( ; (elem = this[i]) != null; i++ ) { + // Remove element nodes and prevent memory leaks + if ( elem.nodeType === 1 ) { + jQuery.cleanData( getAll( elem, false ) ); + } + + // Remove any remaining nodes + while ( elem.firstChild ) { + elem.removeChild( elem.firstChild ); + } + + // If this is a select, ensure that it displays empty (#12336) + // Support: IE<9 + if ( elem.options && jQuery.nodeName( elem, "select" ) ) { + elem.options.length = 0; + } + } + + return this; + }, + + clone: function( dataAndEvents, deepDataAndEvents ) { + dataAndEvents = dataAndEvents == null ? false : dataAndEvents; + deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents; + + return this.map(function() { + return jQuery.clone( this, dataAndEvents, deepDataAndEvents ); + }); + }, + + html: function( value ) { + return access( this, function( value ) { + var elem = this[ 0 ] || {}, + i = 0, + l = this.length; + + if ( value === undefined ) { + return elem.nodeType === 1 ? + elem.innerHTML.replace( rinlinejQuery, "" ) : + undefined; + } + + // See if we can take a shortcut and just use innerHTML + if ( typeof value === "string" && !rnoInnerhtml.test( value ) && + ( support.htmlSerialize || !rnoshimcache.test( value ) ) && + ( support.leadingWhitespace || !rleadingWhitespace.test( value ) ) && + !wrapMap[ (rtagName.exec( value ) || [ "", "" ])[ 1 ].toLowerCase() ] ) { + + value = value.replace( rxhtmlTag, "<$1>" ); + + try { + for (; i < l; i++ ) { + // Remove element nodes and prevent memory leaks + elem = this[i] || {}; + if ( elem.nodeType === 1 ) { + jQuery.cleanData( getAll( elem, false ) ); + elem.innerHTML = value; + } + } + + elem = 0; + + // If using innerHTML throws an exception, use the fallback method + } catch(e) {} + } + + if ( elem ) { + this.empty().append( value ); + } + }, null, value, arguments.length ); + }, + + replaceWith: function() { + var arg = arguments[ 0 ]; + + // Make the changes, replacing each context element with the new content + this.domManip( arguments, function( elem ) { + arg = this.parentNode; + + jQuery.cleanData( getAll( this ) ); + + if ( arg ) { + arg.replaceChild( elem, this ); + } + }); + + // Force removal if there was no new content (e.g., from empty arguments) + return arg && (arg.length || arg.nodeType) ? this : this.remove(); + }, + + detach: function( selector ) { + return this.remove( selector, true ); + }, + + domManip: function( args, callback ) { + + // Flatten any nested arrays + args = concat.apply( [], args ); + + var first, node, hasScripts, + scripts, doc, fragment, + i = 0, + l = this.length, + set = this, + iNoClone = l - 1, + value = args[0], + isFunction = jQuery.isFunction( value ); + + // We can't cloneNode fragments that contain checked, in WebKit + if ( isFunction || + ( l > 1 && typeof value === "string" && + !support.checkClone && rchecked.test( value ) ) ) { + return this.each(function( index ) { + var self = set.eq( index ); + if ( isFunction ) { + args[0] = value.call( this, index, self.html() ); + } + self.domManip( args, callback ); + }); + } + + if ( l ) { + fragment = jQuery.buildFragment( args, this[ 0 ].ownerDocument, false, this ); + first = fragment.firstChild; + + if ( fragment.childNodes.length === 1 ) { + fragment = first; + } + + if ( first ) { + scripts = jQuery.map( getAll( fragment, "script" ), disableScript ); + hasScripts = scripts.length; + + // Use the original fragment for the last item instead of the first because it can end up + // being emptied incorrectly in certain situations (#8070). + for ( ; i < l; i++ ) { + node = fragment; + + if ( i !== iNoClone ) { + node = jQuery.clone( node, true, true ); + + // Keep references to cloned scripts for later restoration + if ( hasScripts ) { + jQuery.merge( scripts, getAll( node, "script" ) ); + } + } + + callback.call( this[i], node, i ); + } + + if ( hasScripts ) { + doc = scripts[ scripts.length - 1 ].ownerDocument; + + // Reenable scripts + jQuery.map( scripts, restoreScript ); + + // Evaluate executable scripts on first document insertion + for ( i = 0; i < hasScripts; i++ ) { + node = scripts[ i ]; + if ( rscriptType.test( node.type || "" ) && + !jQuery._data( node, "globalEval" ) && jQuery.contains( doc, node ) ) { + + if ( node.src ) { + // Optional AJAX dependency, but won't run scripts if not present + if ( jQuery._evalUrl ) { + jQuery._evalUrl( node.src ); + } + } else { + jQuery.globalEval( ( node.text || node.textContent || node.innerHTML || "" ).replace( rcleanScript, "" ) ); + } + } + } + } + + // Fix #11809: Avoid leaking memory + fragment = first = null; + } + } + + return this; + } +}); + +jQuery.each({ + appendTo: "append", + prependTo: "prepend", + insertBefore: "before", + insertAfter: "after", + replaceAll: "replaceWith" +}, function( name, original ) { + jQuery.fn[ name ] = function( selector ) { + var elems, + i = 0, + ret = [], + insert = jQuery( selector ), + last = insert.length - 1; + + for ( ; i <= last; i++ ) { + elems = i === last ? this : this.clone(true); + jQuery( insert[i] )[ original ]( elems ); + + // Modern browsers can apply jQuery collections as arrays, but oldIE needs a .get() + push.apply( ret, elems.get() ); + } + + return this.pushStack( ret ); + }; +}); + + +var iframe, + elemdisplay = {}; + +/** + * Retrieve the actual display of a element + * @param {String} name nodeName of the element + * @param {Object} doc Document object + */ +// Called only from within defaultDisplay +function actualDisplay( name, doc ) { + var style, + elem = jQuery( doc.createElement( name ) ).appendTo( doc.body ), + + // getDefaultComputedStyle might be reliably used only on attached element + display = window.getDefaultComputedStyle && ( style = window.getDefaultComputedStyle( elem[ 0 ] ) ) ? + + // Use of this method is a temporary fix (more like optmization) until something better comes along, + // since it was removed from specification and supported only in FF + style.display : jQuery.css( elem[ 0 ], "display" ); + + // We don't have any data stored on the element, + // so use "detach" method as fast way to get rid of the element + elem.detach(); + + return display; +} + +/** + * Try to determine the default display value of an element + * @param {String} nodeName + */ +function defaultDisplay( nodeName ) { + var doc = document, + display = elemdisplay[ nodeName ]; + + if ( !display ) { + display = actualDisplay( nodeName, doc ); + + // If the simple way fails, read from inside an iframe + if ( display === "none" || !display ) { + + // Use the already-created iframe if possible + iframe = (iframe || jQuery( "